@agorapulse/ui-components 18.0.42 → 18.0.44

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,78 +1,53 @@
1
- import { apCheck, SymbolComponent, SymbolRegistry } from '@agorapulse/ui-symbol';
2
- import { booleanAttribute, Directive, ElementRef, EventEmitter, forwardRef, inject, Input, Output, Renderer2, ViewContainerRef, } from '@angular/core';
3
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
1
+ import { booleanAttribute, Directive, effect, ElementRef, inject, Input, Renderer2, signal } from '@angular/core';
4
2
  import * as i0 from "@angular/core";
5
- export const AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR = {
6
- provide: NG_VALUE_ACCESSOR,
7
- useExisting: forwardRef(() => CheckboxDirective),
8
- multi: true,
9
- };
10
- /*
11
- Host bindings is important here:
12
- - This provides encapsulation and reactivity regardless of how the directive is used in templates.
13
- - It guarantees that properties like checked, disabled, required, and ARIA attributes always reflect
14
- only the directive's logic, not just consumer bindings.
15
- - So we need to have host bindings for all the properties that we want to control.
16
- - We could also use @HostListener.
17
- */
18
3
  export class CheckboxDirective {
19
- symbolRegistry = inject(SymbolRegistry);
20
4
  elementRef = inject((ElementRef));
21
5
  renderer = inject(Renderer2);
22
- viewContainer = inject(ViewContainerRef);
23
- ariaLabel;
24
- ariaLabelledby;
25
- ariaDescribedby;
26
- disabled = false;
27
- set indeterminate(indeterminate) {
6
+ // State signals
7
+ _checked = signal(false);
8
+ _indeterminate = signal(false);
9
+ // Input signal accessors that work with host bindings
10
+ checked = this._checked.asReadonly();
11
+ indeterminate = this._indeterminate.asReadonly();
12
+ // Input setters with proper aliases for template binding
13
+ // Couldn't be migrated to yet
14
+ set checkedInput(checked) {
15
+ this._checked.set(checked);
16
+ this.updateNativeElementSync();
17
+ }
18
+ set indeterminateInput(indeterminate) {
28
19
  if (indeterminate) {
29
- this._checked = false;
20
+ this._checked.set(false);
30
21
  }
31
- this._indeterminate = indeterminate;
22
+ this._indeterminate.set(indeterminate);
23
+ this.updateNativeElementSync();
24
+ }
25
+ updateNativeElementSync() {
32
26
  const input = this.elementRef.nativeElement;
33
27
  if (input) {
34
- input.indeterminate = indeterminate;
35
- }
36
- // Only update visibility if containers are ready
37
- if (this.checkmarkContainer && this.indeterminateContainer) {
38
- this.updateCheckmarkVisibility();
39
- }
40
- }
41
- get indeterminate() {
42
- return this._indeterminate;
43
- }
44
- set checked(checked) {
45
- this._checked = checked;
46
- // Only update visibility if containers are ready
47
- if (this.checkmarkContainer && this.indeterminateContainer) {
48
- this.updateCheckmarkVisibility();
28
+ input.checked = this.checked();
29
+ input.indeterminate = this.indeterminate();
49
30
  }
50
31
  }
51
- get checked() {
52
- return this._checked;
53
- }
54
- required = false;
55
- set name(name) {
56
- this._name = name;
57
- }
58
- get name() {
59
- return this._name;
60
- }
61
- // eslint-disable-next-line @angular-eslint/no-output-native
62
- change = new EventEmitter();
63
- _checked = false;
64
- _indeterminate = false;
65
- _name = '';
66
- _controlValueAccessorChangeFn = () => { };
67
- _onTouched = () => { };
32
+ // Private properties
68
33
  listeners = [];
69
34
  styleElement;
70
- wrapper;
71
- checkmarkContainer;
72
- indeterminateContainer;
73
- symbolComponent;
35
+ checkmarkSvg;
36
+ indeterminateBar;
37
+ constructor() {
38
+ effect(() => {
39
+ if (this.checkmarkSvg && this.indeterminateBar) {
40
+ this.updateCheckmarkVisibility();
41
+ }
42
+ });
43
+ }
44
+ // Custom SVG content
45
+ checkSvgContent = `
46
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="10" height="10" fill="white">
47
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M14.238 3.337a.92.92 0 0 1 .025 1.301l-7.7 8a.92.92 0 0 1-1.326 0l-3.5-3.636a.92.92 0 1 1 1.326-1.276L5.9 10.674l7.037-7.312a.92.92 0 0 1 1.301-.025Z" />
48
+ </svg>
49
+ `;
74
50
  ngOnInit() {
75
- this.symbolRegistry.registerSymbols([apCheck]);
76
51
  this.createCheckboxStructure();
77
52
  this.setupEventListeners();
78
53
  }
@@ -81,93 +56,65 @@ export class CheckboxDirective {
81
56
  if (this.styleElement && this.styleElement.parentNode) {
82
57
  this.styleElement.parentNode.removeChild(this.styleElement);
83
58
  }
84
- if (this.symbolComponent) {
85
- this.symbolComponent.destroy();
59
+ if (this.checkmarkSvg && this.checkmarkSvg.parentNode) {
60
+ this.checkmarkSvg.parentNode.removeChild(this.checkmarkSvg);
86
61
  }
87
- if (this.checkmarkContainer && this.checkmarkContainer.parentNode) {
88
- this.checkmarkContainer.parentNode.removeChild(this.checkmarkContainer);
89
- }
90
- if (this.indeterminateContainer && this.indeterminateContainer.parentNode) {
91
- this.indeterminateContainer.parentNode.removeChild(this.indeterminateContainer);
92
- }
93
- // Move input back out of wrapper and remove wrapper
94
- if (this.wrapper && this.wrapper.parentNode) {
95
- const input = this.elementRef.nativeElement;
96
- this.renderer.insertBefore(this.wrapper.parentNode, input, this.wrapper);
97
- this.wrapper.parentNode.removeChild(this.wrapper);
62
+ if (this.indeterminateBar && this.indeterminateBar.parentNode) {
63
+ this.indeterminateBar.parentNode.removeChild(this.indeterminateBar);
98
64
  }
99
65
  }
100
66
  createCheckboxStructure() {
101
67
  const input = this.elementRef.nativeElement;
102
68
  const parent = input.parentElement;
103
- // Hot take - Input doesn't need positioning since it will be wrapped
104
- // Make input's parent use inline-flex for alignment
69
+ // Make input's parent use inline-flex for alignment and position relative
105
70
  if (parent) {
106
71
  this.renderer.setStyle(parent, 'display', 'inline-flex');
107
72
  this.renderer.setStyle(parent, 'align-items', 'center');
108
73
  this.renderer.setStyle(parent, 'gap', 'var(--ref-spacing-xxs)');
74
+ this.renderer.setStyle(parent, 'position', 'relative');
109
75
  }
110
76
  this.renderer.addClass(input, 'ap-checkbox-styled');
111
- this.checkmarkContainer = this.createOverlayContainer('ap-checkbox-checkmark');
112
- this.wrapper = this.renderer.createElement('span');
113
- this.renderer.setStyle(this.wrapper, 'position', 'relative');
114
- this.renderer.setStyle(this.wrapper, 'display', 'inline-flex');
115
- this.renderer.setStyle(this.wrapper, 'align-items', 'center');
116
- this.renderer.setStyle(this.wrapper, 'vertical-align', 'middle');
117
- this.renderer.insertBefore(parent, this.wrapper, input);
118
- this.renderer.appendChild(this.wrapper, input);
119
- this.renderer.appendChild(this.wrapper, this.checkmarkContainer);
120
- this.indeterminateContainer = this.createOverlayContainer('ap-checkbox-indeterminate');
121
- this.renderer.appendChild(this.wrapper, this.indeterminateContainer);
122
- this.createCheckmarkSymbol();
77
+ this.createCheckmarkSvg();
123
78
  this.createIndeterminateBar();
124
79
  this.applyCheckboxStyles();
125
80
  this.updateCheckmarkVisibility();
126
81
  }
127
- createOverlayContainer(className) {
128
- const container = this.renderer.createElement('span');
129
- this.renderer.addClass(container, className);
130
- this.renderer.setStyle(container, 'position', 'absolute');
131
- this.renderer.setStyle(container, 'top', '50%');
132
- this.renderer.setStyle(container, 'left', '50%');
133
- this.renderer.setStyle(container, 'transform', 'translate(-50%, -50%)');
134
- this.renderer.setStyle(container, 'width', 'auto');
135
- this.renderer.setStyle(container, 'height', 'auto');
136
- this.renderer.setStyle(container, 'display', 'flex');
137
- this.renderer.setStyle(container, 'justify-content', 'center');
138
- this.renderer.setStyle(container, 'align-items', 'center');
139
- this.renderer.setStyle(container, 'pointer-events', 'none');
140
- this.renderer.setStyle(container, 'opacity', '0');
141
- this.renderer.setStyle(container, 'z-index', '1');
142
- return container;
82
+ createOverlayElement(element) {
83
+ const parent = this.elementRef.nativeElement.parentElement;
84
+ // Apply common positioning styles
85
+ this.renderer.setStyle(element, 'position', 'absolute');
86
+ this.renderer.setStyle(element, 'top', '50%');
87
+ this.renderer.setStyle(element, 'left', '8px'); // Center over 16px checkbox
88
+ this.renderer.setStyle(element, 'transform', 'translate(-50%, -50%)');
89
+ this.renderer.setStyle(element, 'pointer-events', 'none');
90
+ this.renderer.setStyle(element, 'opacity', '0');
91
+ this.renderer.setStyle(element, 'z-index', '1');
92
+ // Append to parent
93
+ this.renderer.appendChild(parent, element);
143
94
  }
144
- createCheckmarkSymbol() {
145
- // Create the symbol component
146
- this.symbolComponent = this.viewContainer.createComponent(SymbolComponent);
147
- // Set inputs using setInput method for signal-based inputs
148
- this.symbolComponent.setInput('symbolId', 'check');
149
- this.symbolComponent.setInput('color', 'white');
150
- this.symbolComponent.setInput('size', 10);
151
- // Append the symbol to our checkmark container
152
- this.renderer.appendChild(this.checkmarkContainer, this.symbolComponent.location.nativeElement);
95
+ createCheckmarkSvg() {
96
+ // Create SVG element from string
97
+ const tempDiv = this.renderer.createElement('div');
98
+ this.renderer.setProperty(tempDiv, 'innerHTML', this.checkSvgContent);
99
+ this.checkmarkSvg = tempDiv.firstElementChild;
100
+ this.createOverlayElement(this.checkmarkSvg);
153
101
  }
154
102
  createIndeterminateBar() {
155
- // Create the indeterminate bar element exactly like the component
156
- const bar = this.renderer.createElement('span');
157
- this.renderer.setStyle(bar, 'height', '1.5px');
158
- this.renderer.setStyle(bar, 'background', 'var(--ref-color-white)');
159
- this.renderer.setStyle(bar, 'width', '8px');
160
- // Append the bar to the indeterminate container
161
- this.renderer.appendChild(this.indeterminateContainer, bar);
103
+ // Create the indeterminate bar element
104
+ this.indeterminateBar = this.renderer.createElement('span');
105
+ this.renderer.setStyle(this.indeterminateBar, 'height', '1.5px');
106
+ this.renderer.setStyle(this.indeterminateBar, 'background', 'var(--ref-color-white)');
107
+ this.renderer.setStyle(this.indeterminateBar, 'width', '8px');
108
+ this.createOverlayElement(this.indeterminateBar);
162
109
  }
163
110
  updateCheckmarkVisibility() {
164
- if (this.checkmarkContainer) {
165
- const opacity = this._checked && !this._indeterminate ? '1' : '0';
166
- this.renderer.setStyle(this.checkmarkContainer, 'opacity', opacity);
111
+ if (this.checkmarkSvg) {
112
+ const opacity = this.checked() && !this.indeterminate() ? '1' : '0';
113
+ this.renderer.setStyle(this.checkmarkSvg, 'opacity', opacity);
167
114
  }
168
- if (this.indeterminateContainer) {
169
- const opacity = this._indeterminate && !this._checked ? '1' : '0';
170
- this.renderer.setStyle(this.indeterminateContainer, 'opacity', opacity);
115
+ if (this.indeterminateBar) {
116
+ const opacity = this.indeterminate() && !this.checked() ? '1' : '0';
117
+ this.renderer.setStyle(this.indeterminateBar, 'opacity', opacity);
171
118
  }
172
119
  }
173
120
  setupEventListeners() {
@@ -183,7 +130,7 @@ export class CheckboxDirective {
183
130
  const labelClickListener = this.renderer.listen(parent, 'click', (event) => {
184
131
  const target = event.target;
185
132
  // If clicking on a label that targets our input, ensure focus
186
- if (target.tagName === 'LABEL' && target.getAttribute('for') === this.name) {
133
+ if (target.tagName === 'LABEL' && target.getAttribute('for') === input.id) {
187
134
  // Small delay to ensure the label click is processed first
188
135
  setTimeout(() => {
189
136
  input.focus();
@@ -194,16 +141,13 @@ export class CheckboxDirective {
194
141
  }
195
142
  }
196
143
  applyCheckboxStyles() {
197
- // Style the input directly without moving DOM elements
198
144
  const styles = `
199
- /* Complete reset and custom styling for our checkbox */
145
+ /* Minimal checkbox styling */
200
146
  input[type="checkbox"].ap-checkbox-styled {
201
- /* Targeted reset of problematic properties */
202
147
  appearance: none !important;
203
148
  -webkit-appearance: none !important;
204
149
  -moz-appearance: none !important;
205
150
 
206
- /* Our custom styling - use !important to override any global styles */
207
151
  display: inline-block !important;
208
152
  width: 16px !important;
209
153
  height: 16px !important;
@@ -214,23 +158,9 @@ export class CheckboxDirective {
214
158
  border: 1px solid var(--ref-color-grey-60);
215
159
  border-radius: var(--sys-border-radius-sm);
216
160
  background: var(--ref-color-white);
217
- background-color: var(--ref-color-white);
218
161
  box-sizing: border-box;
219
- position: relative;
220
162
  cursor: pointer;
221
163
  vertical-align: middle;
222
-
223
- /* Ensure no other styles can interfere */
224
- box-shadow: none;
225
- text-decoration: none;
226
- font: inherit;
227
- color: inherit;
228
- letter-spacing: normal;
229
- word-spacing: normal;
230
- text-transform: none;
231
- text-indent: 0;
232
- text-shadow: none;
233
- text-align: start;
234
164
  }
235
165
 
236
166
  /* Hover state */
@@ -278,7 +208,7 @@ export class CheckboxDirective {
278
208
  background: var(--ref-color-grey-20);
279
209
  }
280
210
 
281
- /* Focus state - only show on hover-capable devices like the component */
211
+ /* Focus state */
282
212
  @media (hover: hover) {
283
213
  input[type="checkbox"].ap-checkbox-styled:focus:not(.disabled) {
284
214
  outline: 3px solid var(--ref-color-electric-blue-100) !important;
@@ -286,8 +216,8 @@ export class CheckboxDirective {
286
216
  }
287
217
  }
288
218
 
289
- /* Label styling - targets labels that follow our wrapper containing styled checkboxes */
290
- span:has(input[type="checkbox"].ap-checkbox-styled) + label {
219
+ /* Label styling */
220
+ input[type="checkbox"].ap-checkbox-styled + label {
291
221
  display: flex;
292
222
  align-items: center;
293
223
  font-family: var(--comp-forms-label-font-family);
@@ -295,25 +225,17 @@ export class CheckboxDirective {
295
225
  font-weight: var(--comp-forms-label-font-weight);
296
226
  line-height: var(--comp-forms-label-line-height);
297
227
  color: var(--comp-forms-label-text-color);
228
+ cursor: pointer;
298
229
  }
299
230
 
300
231
  /* Empty label styling */
301
- span:has(input[type="checkbox"].ap-checkbox-styled) + label:empty {
232
+ input[type="checkbox"].ap-checkbox-styled + label:empty {
302
233
  display: none;
303
234
  }
304
235
 
305
236
  /* Disabled label styling */
306
- span:has(input[type="checkbox"].ap-checkbox-styled:disabled) + label {
237
+ input[type="checkbox"].ap-checkbox-styled:disabled + label {
307
238
  color: var(--ref-color-grey-60);
308
- }
309
-
310
- /* Label hover styling */
311
- span:has(input[type="checkbox"].ap-checkbox-styled) + label:hover:not(.disabled) {
312
- cursor: pointer;
313
- }
314
-
315
- /* Disabled label hover */
316
- span:has(input[type="checkbox"].ap-checkbox-styled:disabled) + label:hover {
317
239
  cursor: default;
318
240
  }
319
241
  `;
@@ -322,121 +244,40 @@ export class CheckboxDirective {
322
244
  this.renderer.appendChild(this.styleElement, this.renderer.createText(styles));
323
245
  this.renderer.appendChild(document.head, this.styleElement);
324
246
  }
325
- onBlur() {
326
- this._onTouched();
327
- }
328
247
  onValueChange() {
329
- if (!this.disabled) {
248
+ if (!this.elementRef.nativeElement.disabled) {
330
249
  const input = this.elementRef.nativeElement;
331
- if (this._indeterminate) {
250
+ if (this.indeterminate()) {
332
251
  // When indeterminate, clicking should go to checked state
333
- this._checked = true;
334
- this._indeterminate = false;
252
+ this._checked.set(true);
253
+ this._indeterminate.set(false);
335
254
  input.checked = true;
336
255
  input.indeterminate = false;
337
256
  }
338
257
  else {
339
258
  // Normal toggle behavior
340
- this._checked = input.checked;
259
+ this._checked.set(input.checked);
341
260
  }
342
- this.updateCheckmarkVisibility();
343
- this.change.emit(this._checked);
344
- this._controlValueAccessorChangeFn(this._checked);
345
261
  }
346
262
  }
347
- // ControlValueAccessor implementation
348
- writeValue(value) {
349
- this._checked = value;
350
- const input = this.elementRef.nativeElement;
351
- input.checked = value;
352
- // Ensure indeterminate state is properly set
353
- input.indeterminate = this._indeterminate;
354
- this.updateCheckmarkVisibility();
355
- }
356
- registerOnChange(fn) {
357
- this._controlValueAccessorChangeFn = fn;
358
- }
359
- registerOnTouched(fn) {
360
- this._onTouched = fn;
361
- }
362
- setDisabledState(isDisabled) {
363
- this.disabled = isDisabled;
364
- const input = this.elementRef.nativeElement;
365
- input.disabled = isDisabled;
366
- }
367
- validate() {
368
- const isNotValid = !this._checked && this.required;
369
- return (isNotValid && {
370
- invalid: true,
371
- });
372
- }
373
263
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CheckboxDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
374
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.9", type: CheckboxDirective, isStandalone: true, selector: "input[type=\"checkbox\"][apCheckbox]", inputs: { ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], ariaDescribedby: ["aria-describedby", "ariaDescribedby"], disabled: ["disabled", "disabled", booleanAttribute], indeterminate: ["indeterminate", "indeterminate", booleanAttribute], checked: "checked", required: ["required", "required", booleanAttribute], name: "name" }, outputs: { change: "change" }, host: { listeners: { "blur": "onBlur()" }, properties: { "disabled": "disabled", "required": "required", "checked": "checked", "attr.aria-label": "ariaLabel", "attr.aria-labelledby": "ariaLabelledby", "attr.aria-describedby": "ariaDescribedby", "attr.data-test": "name", "id": "name" } }, providers: [
375
- AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR,
376
- {
377
- provide: NG_VALIDATORS,
378
- useExisting: CheckboxDirective,
379
- multi: true,
380
- },
381
- ], ngImport: i0 });
264
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.9", type: CheckboxDirective, isStandalone: true, selector: "input[type=\"checkbox\"][apCheckbox]", inputs: { checkedInput: ["checked", "checkedInput"], indeterminateInput: ["indeterminate", "indeterminateInput", booleanAttribute] }, providers: [], ngImport: i0 });
382
265
  }
383
266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CheckboxDirective, decorators: [{
384
267
  type: Directive,
385
268
  args: [{
386
269
  selector: 'input[type="checkbox"][apCheckbox]',
387
270
  standalone: true,
388
- providers: [
389
- AP_CHECKBOX_DIRECTIVE_CONTROL_VALUE_ACCESSOR,
390
- {
391
- provide: NG_VALIDATORS,
392
- useExisting: CheckboxDirective,
393
- multi: true,
394
- },
395
- ],
396
- host: {
397
- '(blur)': 'onBlur()',
398
- '[disabled]': 'disabled',
399
- '[required]': 'required',
400
- '[checked]': 'checked',
401
- '[attr.aria-label]': 'ariaLabel',
402
- '[attr.aria-labelledby]': 'ariaLabelledby',
403
- '[attr.aria-describedby]': 'ariaDescribedby',
404
- '[attr.data-test]': 'name',
405
- '[id]': 'name',
406
- },
271
+ providers: [],
407
272
  }]
408
- }], propDecorators: { ariaLabel: [{
409
- type: Input,
410
- args: ['aria-label']
411
- }], ariaLabelledby: [{
412
- type: Input,
413
- args: ['aria-labelledby']
414
- }], ariaDescribedby: [{
273
+ }], ctorParameters: () => [], propDecorators: { checkedInput: [{
415
274
  type: Input,
416
- args: ['aria-describedby']
417
- }], disabled: [{
275
+ args: ['checked']
276
+ }], indeterminateInput: [{
418
277
  type: Input,
419
278
  args: [{
420
279
  transform: booleanAttribute,
280
+ alias: 'indeterminate',
421
281
  }]
422
- }], indeterminate: [{
423
- type: Input,
424
- args: [{
425
- transform: booleanAttribute,
426
- }]
427
- }], checked: [{
428
- type: Input
429
- }], required: [{
430
- type: Input,
431
- args: [{
432
- transform: booleanAttribute,
433
- }]
434
- }], name: [{
435
- type: Input,
436
- args: [{
437
- required: true,
438
- }]
439
- }], change: [{
440
- type: Output
441
282
  }] } });
442
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL2RpcmVjdGl2ZXMvc3JjL2NoZWNrYm94LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRixPQUFPLEVBQ0gsZ0JBQWdCLEVBRWhCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsZ0JBQWdCLEdBQ25CLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXhGLE1BQU0sQ0FBQyxNQUFNLDRDQUE0QyxHQUFHO0lBQ3hELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztJQUNoRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRjs7Ozs7OztFQU9FO0FBd0JGLE1BQU0sT0FBTyxpQkFBaUI7SUFDVCxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hDLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUE0QixDQUFBLENBQUMsQ0FBQztJQUNsRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLGFBQWEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVyQyxTQUFTLENBQVU7SUFDZCxjQUFjLENBQVU7SUFDdkIsZUFBZSxDQUFVO0lBS3BELFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsSUFHSSxhQUFhLENBQUMsYUFBc0I7UUFDcEMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDNUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNSLEtBQUssQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxpREFBaUQ7UUFDakQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDckMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQ0ksT0FBTyxDQUFDLE9BQWdCO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLGlEQUFpRDtRQUNqRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBS0QsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVqQixJQUdJLElBQUksQ0FBQyxJQUFZO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELDREQUE0RDtJQUN6QyxNQUFNLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7SUFFdkUsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCw2QkFBNkIsR0FBNkIsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ25FLFVBQVUsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFbEMsU0FBUyxHQUFtQixFQUFFLENBQUM7SUFDL0IsWUFBWSxDQUFvQjtJQUNoQyxPQUFPLENBQWU7SUFDdEIsa0JBQWtCLENBQWU7SUFDakMsc0JBQXNCLENBQWU7SUFDckMsZUFBZSxDQUFpQztJQUV4RCxRQUFRO1FBQ0osSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsc0JBQXNCLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxvREFBb0Q7UUFDcEQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDTCxDQUFDO0lBRU8sdUJBQXVCO1FBQzNCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFFbkMscUVBQXFFO1FBRXJFLG9EQUFvRDtRQUNwRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRS9FLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRXZGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFNBQWlCO1FBQzVDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTNFLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUxQywrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsa0VBQWtFO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFNUMsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8seUJBQXlCO1FBQzdCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNMLENBQUM7SUFFTyxtQkFBbUI7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFFNUMsaURBQWlEO1FBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQzlELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXBDLHdEQUF3RDtRQUN4RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ25DLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFpQixFQUFFLEVBQUU7Z0JBQ25GLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO2dCQUMzQyw4REFBOEQ7Z0JBQzlELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3pFLDJEQUEyRDtvQkFDM0QsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDWixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2xCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDVixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLHVEQUF1RDtRQUN2RCxNQUFNLE1BQU0sR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQXlIZCxDQUFDO1FBRUYsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFHRCxNQUFNO1FBQ0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFFNUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLDBEQUEwRDtnQkFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDckIsS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2xDLENBQUM7WUFFRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0wsQ0FBQztJQUdELHNDQUFzQztJQUN0QyxVQUFVLENBQUMsS0FBYztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN0Qiw2Q0FBNkM7UUFDN0MsS0FBSyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUE0QjtRQUN6QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFjO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM1QyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsUUFBUTtRQUNKLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ25ELE9BQU8sQ0FDSCxVQUFVLElBQUk7WUFDVixPQUFPLEVBQUUsSUFBSTtTQUNoQixDQUNKLENBQUM7SUFDTixDQUFDO3VHQWphUSxpQkFBaUI7MkZBQWpCLGlCQUFpQiw4UUFXWCxnQkFBZ0IscURBS2hCLGdCQUFnQiwwREFtQ2hCLGdCQUFnQiw4VkF2RXBCO1lBQ1AsNENBQTRDO1lBQzVDO2dCQUNJLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixXQUFXLEVBQUUsaUJBQWlCO2dCQUM5QixLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0o7OzJGQWFRLGlCQUFpQjtrQkF2QjdCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLG9DQUFvQztvQkFDOUMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFNBQVMsRUFBRTt3QkFDUCw0Q0FBNEM7d0JBQzVDOzRCQUNJLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLG1CQUFtQjs0QkFDOUIsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7b0JBQ0QsSUFBSSxFQUFFO3dCQUNGLFFBQVEsRUFBRSxVQUFVO3dCQUNwQixZQUFZLEVBQUUsVUFBVTt3QkFDeEIsWUFBWSxFQUFFLFVBQVU7d0JBQ3hCLFdBQVcsRUFBRSxTQUFTO3dCQUN0QixtQkFBbUIsRUFBRSxXQUFXO3dCQUNoQyx3QkFBd0IsRUFBRSxnQkFBZ0I7d0JBQzFDLHlCQUF5QixFQUFFLGlCQUFpQjt3QkFDNUMsa0JBQWtCLEVBQUUsTUFBTTt3QkFDMUIsTUFBTSxFQUFFLE1BQU07cUJBQ2pCO2lCQUNKOzhCQU93QixTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBQ08sY0FBYztzQkFBdkMsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBQ0csZUFBZTtzQkFBekMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBS3pCLFFBQVE7c0JBSFAsS0FBSzt1QkFBQzt3QkFDSCxTQUFTLEVBQUUsZ0JBQWdCO3FCQUM5QjtnQkFNRyxhQUFhO3NCQUhoQixLQUFLO3VCQUFDO3dCQUNILFNBQVMsRUFBRSxnQkFBZ0I7cUJBQzlCO2dCQXFCRyxPQUFPO3NCQURWLEtBQUs7Z0JBZ0JOLFFBQVE7c0JBSFAsS0FBSzt1QkFBQzt3QkFDSCxTQUFTLEVBQUUsZ0JBQWdCO3FCQUM5QjtnQkFNRyxJQUFJO3NCQUhQLEtBQUs7dUJBQUM7d0JBQ0gsUUFBUSxFQUFFLElBQUk7cUJBQ2pCO2dCQVNrQixNQUFNO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBDaGVjaywgU3ltYm9sQ29tcG9uZW50LCBTeW1ib2xSZWdpc3RyeSB9IGZyb20gJ0BhZ29yYXB1bHNlL3VpLXN5bWJvbCc7XG5pbXBvcnQge1xuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmV4cG9ydCBjb25zdCBBUF9DSEVDS0JPWF9ESVJFQ1RJVkVfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUiA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDaGVja2JveERpcmVjdGl2ZSksXG4gICAgbXVsdGk6IHRydWUsXG59O1xuXG4vKlxuICAgIEhvc3QgYmluZGluZ3MgaXMgaW1wb3J0YW50IGhlcmU6XG4gICAgLSBUaGlzIHByb3ZpZGVzIGVuY2Fwc3VsYXRpb24gYW5kIHJlYWN0aXZpdHkgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGRpcmVjdGl2ZSBpcyB1c2VkIGluIHRlbXBsYXRlcy5cbiAgICAtIEl0IGd1YXJhbnRlZXMgdGhhdCBwcm9wZXJ0aWVzIGxpa2UgY2hlY2tlZCwgZGlzYWJsZWQsIHJlcXVpcmVkLCBhbmQgQVJJQSBhdHRyaWJ1dGVzIGFsd2F5cyByZWZsZWN0XG4gICAgb25seSB0aGUgZGlyZWN0aXZlJ3MgbG9naWMsIG5vdCBqdXN0IGNvbnN1bWVyIGJpbmRpbmdzLlxuICAgIC0gU28gd2UgbmVlZCB0byBoYXZlIGhvc3QgYmluZGluZ3MgZm9yIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHdlIHdhbnQgdG8gY29udHJvbC5cbiAgICAtIFdlIGNvdWxkIGFsc28gdXNlIEBIb3N0TGlzdGVuZXIuXG4qL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl1bYXBDaGVja2JveF0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIEFQX0NIRUNLQk9YX0RJUkVDVElWRV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IENoZWNrYm94RGlyZWN0aXZlLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCknLFxuICAgICAgICAnW2Rpc2FibGVkXSc6ICdkaXNhYmxlZCcsXG4gICAgICAgICdbcmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAgICAgJ1tjaGVja2VkXSc6ICdjaGVja2VkJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ2FyaWFMYWJlbCcsXG4gICAgICAgICdbYXR0ci5hcmlhLWxhYmVsbGVkYnldJzogJ2FyaWFMYWJlbGxlZGJ5JyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZGVzY3JpYmVkYnldJzogJ2FyaWFEZXNjcmliZWRieScsXG4gICAgICAgICdbYXR0ci5kYXRhLXRlc3RdJzogJ25hbWUnLFxuICAgICAgICAnW2lkXSc6ICduYW1lJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveERpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzeW1ib2xSZWdpc3RyeSA9IGluamVjdChTeW1ib2xSZWdpc3RyeSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXIgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWwnKSBhcmlhTGFiZWw/OiBzdHJpbmc7XG4gICAgQElucHV0KCdhcmlhLWxhYmVsbGVkYnknKSBhcmlhTGFiZWxsZWRieT86IHN0cmluZztcbiAgICBASW5wdXQoJ2FyaWEtZGVzY3JpYmVkYnknKSBhcmlhRGVzY3JpYmVkYnk/OiBzdHJpbmc7XG4gICAgXG4gICAgQElucHV0KHtcbiAgICAgICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICAgIH0pXG4gICAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBcbiAgICBASW5wdXQoe1xuICAgICAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgfSlcbiAgICBzZXQgaW5kZXRlcm1pbmF0ZShpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgICAgaW5wdXQuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSB1cGRhdGUgdmlzaWJpbGl0eSBpZiBjb250YWluZXJzIGFyZSByZWFkeVxuICAgICAgICBpZiAodGhpcy5jaGVja21hcmtDb250YWluZXIgJiYgdGhpcy5pbmRldGVybWluYXRlQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrbWFya1Zpc2liaWxpdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXRlcm1pbmF0ZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBcbiAgICBzZXQgY2hlY2tlZChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrZWQgPSBjaGVja2VkO1xuICAgICAgICAvLyBPbmx5IHVwZGF0ZSB2aXNpYmlsaXR5IGlmIGNvbnRhaW5lcnMgYXJlIHJlYWR5XG4gICAgICAgIGlmICh0aGlzLmNoZWNrbWFya0NvbnRhaW5lciAmJiB0aGlzLmluZGV0ZXJtaW5hdGVDb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2ttYXJrVmlzaWJpbGl0eSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tlZDtcbiAgICB9XG5cbiAgICBASW5wdXQoe1xuICAgICAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgfSlcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgQElucHV0KHtcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSlcbiAgICBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gICAgfVxuICAgIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgIEBPdXRwdXQoKSByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgX2NoZWNrZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfbmFtZSA9ICcnO1xuICAgIHByaXZhdGUgX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIFxuICAgIHByaXZhdGUgbGlzdGVuZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHByaXZhdGUgc3R5bGVFbGVtZW50ITogSFRNTFN0eWxlRWxlbWVudDtcbiAgICBwcml2YXRlIHdyYXBwZXIhOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIGNoZWNrbWFya0NvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgaW5kZXRlcm1pbmF0ZUNvbnRhaW5lciE6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgc3ltYm9sQ29tcG9uZW50PzogQ29tcG9uZW50UmVmPFN5bWJvbENvbXBvbmVudD47XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xSZWdpc3RyeS5yZWdpc3RlclN5bWJvbHMoW2FwQ2hlY2tdKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDaGVja2JveFN0cnVjdHVyZSgpO1xuICAgICAgICB0aGlzLnNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCh1bmxpc3RlbiA9PiB1bmxpc3RlbigpKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50ICYmIHRoaXMuc3R5bGVFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN5bWJvbENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5zeW1ib2xDb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNoZWNrbWFya0NvbnRhaW5lciAmJiB0aGlzLmNoZWNrbWFya0NvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrbWFya0NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY2hlY2ttYXJrQ29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRldGVybWluYXRlQ29udGFpbmVyICYmIHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmluZGV0ZXJtaW5hdGVDb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1vdmUgaW5wdXQgYmFjayBvdXQgb2Ygd3JhcHBlciBhbmQgcmVtb3ZlIHdyYXBwZXJcbiAgICAgICAgaWYgKHRoaXMud3JhcHBlciAmJiB0aGlzLndyYXBwZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMud3JhcHBlci5wYXJlbnROb2RlLCBpbnB1dCwgdGhpcy53cmFwcGVyKTtcbiAgICAgICAgICAgIHRoaXMud3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMud3JhcHBlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrYm94U3RydWN0dXJlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy8gSG90IHRha2UgLSBJbnB1dCBkb2Vzbid0IG5lZWQgcG9zaXRpb25pbmcgc2luY2UgaXQgd2lsbCBiZSB3cmFwcGVkXG4gICAgICAgIFxuICAgICAgICAvLyBNYWtlIGlucHV0J3MgcGFyZW50IHVzZSBpbmxpbmUtZmxleCBmb3IgYWxpZ25tZW50XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAnZGlzcGxheScsICdpbmxpbmUtZmxleCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwYXJlbnQsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAnZ2FwJywgJ3ZhcigtLXJlZi1zcGFjaW5nLXh4cyknKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpbnB1dCwgJ2FwLWNoZWNrYm94LXN0eWxlZCcpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5jaGVja21hcmtDb250YWluZXIgPSB0aGlzLmNyZWF0ZU92ZXJsYXlDb250YWluZXIoJ2FwLWNoZWNrYm94LWNoZWNrbWFyaycpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy53cmFwcGVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLndyYXBwZXIsICdkaXNwbGF5JywgJ2lubGluZS1mbGV4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLCAnYWxpZ24taXRlbXMnLCAnY2VudGVyJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy53cmFwcGVyLCAndmVydGljYWwtYWxpZ24nLCAnbWlkZGxlJyk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnQsIHRoaXMud3JhcHBlciwgaW5wdXQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlciwgaW5wdXQpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIsIHRoaXMuY2hlY2ttYXJrQ29udGFpbmVyKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lciA9IHRoaXMuY3JlYXRlT3ZlcmxheUNvbnRhaW5lcignYXAtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZScpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIsIHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lcik7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNyZWF0ZUNoZWNrbWFya1N5bWJvbCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUluZGV0ZXJtaW5hdGVCYXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYXBwbHlDaGVja2JveFN0eWxlcygpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy51cGRhdGVDaGVja21hcmtWaXNpYmlsaXR5KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5Q29udGFpbmVyKGNsYXNzTmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhjb250YWluZXIsIGNsYXNzTmFtZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICd0b3AnLCAnNTAlJyk7IFxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ2xlZnQnLCAnNTAlJyk7ICAgXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ3dpZHRoJywgJ2F1dG8nKTsgXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnaGVpZ2h0JywgJ2F1dG8nKTsgXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnZGlzcGxheScsICdmbGV4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnanVzdGlmeS1jb250ZW50JywgJ2NlbnRlcicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ2FsaWduLWl0ZW1zJywgJ2NlbnRlcicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGNvbnRhaW5lciwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICdvcGFjaXR5JywgJzAnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICd6LWluZGV4JywgJzEnKTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrbWFya1N5bWJvbCgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBzeW1ib2wgY29tcG9uZW50XG4gICAgICAgIHRoaXMuc3ltYm9sQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChTeW1ib2xDb21wb25lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gU2V0IGlucHV0cyB1c2luZyBzZXRJbnB1dCBtZXRob2QgZm9yIHNpZ25hbC1iYXNlZCBpbnB1dHNcbiAgICAgICAgdGhpcy5zeW1ib2xDb21wb25lbnQuc2V0SW5wdXQoJ3N5bWJvbElkJywgJ2NoZWNrJyk7XG4gICAgICAgIHRoaXMuc3ltYm9sQ29tcG9uZW50LnNldElucHV0KCdjb2xvcicsICd3aGl0ZScpO1xuICAgICAgICB0aGlzLnN5bWJvbENvbXBvbmVudC5zZXRJbnB1dCgnc2l6ZScsIDEwKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgc3ltYm9sIHRvIG91ciBjaGVja21hcmsgY29udGFpbmVyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5jaGVja21hcmtDb250YWluZXIsIHRoaXMuc3ltYm9sQ29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlSW5kZXRlcm1pbmF0ZUJhcigpOiB2b2lkIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbmRldGVybWluYXRlIGJhciBlbGVtZW50IGV4YWN0bHkgbGlrZSB0aGUgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGJhciA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJhciwgJ2hlaWdodCcsICcxLjVweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJhciwgJ2JhY2tncm91bmQnLCAndmFyKC0tcmVmLWNvbG9yLXdoaXRlKScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGJhciwgJ3dpZHRoJywgJzhweCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBiYXIgdG8gdGhlIGluZGV0ZXJtaW5hdGUgY29udGFpbmVyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5pbmRldGVybWluYXRlQ29udGFpbmVyLCBiYXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ2hlY2ttYXJrVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2ttYXJrQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zdCBvcGFjaXR5ID0gdGhpcy5fY2hlY2tlZCAmJiAhdGhpcy5faW5kZXRlcm1pbmF0ZSA/ICcxJyA6ICcwJztcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5jaGVja21hcmtDb250YWluZXIsICdvcGFjaXR5Jywgb3BhY2l0eSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc3Qgb3BhY2l0eSA9IHRoaXMuX2luZGV0ZXJtaW5hdGUgJiYgIXRoaXMuX2NoZWNrZWQgPyAnMScgOiAnMCc7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW5kZXRlcm1pbmF0ZUNvbnRhaW5lciwgJ29wYWNpdHknLCBvcGFjaXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIElucHV0IGNoYW5nZSBsaXN0ZW5lciAobmF0aXZlIGNoZWNrYm94IGNoYW5nZSlcbiAgICAgICAgY29uc3QgY2hhbmdlTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihpbnB1dCwgJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChjaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIFxuICAgICAgICAvLyBMaXN0ZW4gZm9yIGxhYmVsIGNsaWNrcyB0byBlbnN1cmUgZm9jdXMgaXMgbWFpbnRhaW5lZFxuICAgICAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbENsaWNrTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihwYXJlbnQsICdjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvLyBJZiBjbGlja2luZyBvbiBhIGxhYmVsIHRoYXQgdGFyZ2V0cyBvdXIgaW5wdXQsIGVuc3VyZSBmb2N1c1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0xBQkVMJyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKCdmb3InKSA9PT0gdGhpcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSB0aGUgbGFiZWwgY2xpY2sgaXMgcHJvY2Vzc2VkIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxhYmVsQ2xpY2tMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5Q2hlY2tib3hTdHlsZXMoKTogdm9pZCB7XG4gICAgICAgIC8vIFN0eWxlIHRoZSBpbnB1dCBkaXJlY3RseSB3aXRob3V0IG1vdmluZyBET00gZWxlbWVudHNcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gYFxuICAgICAgICAgICAgLyogQ29tcGxldGUgcmVzZXQgYW5kIGN1c3RvbSBzdHlsaW5nIGZvciBvdXIgY2hlY2tib3ggKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQge1xuICAgICAgICAgICAgICAgIC8qIFRhcmdldGVkIHJlc2V0IG9mIHByb2JsZW1hdGljIHByb3BlcnRpZXMgKi9cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLyogT3VyIGN1c3RvbSBzdHlsaW5nIC0gdXNlICFpbXBvcnRhbnQgdG8gb3ZlcnJpZGUgYW55IGdsb2JhbCBzdHlsZXMgKi9cbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1pbi13aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDE2cHggIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcmVmLWNvbG9yLWdyZXktNjApO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXN5cy1ib3JkZXItcmFkaXVzLXNtKTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWYtY29sb3Itd2hpdGUpO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJlZi1jb2xvci13aGl0ZSk7XG4gICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLyogRW5zdXJlIG5vIG90aGVyIHN0eWxlcyBjYW4gaW50ZXJmZXJlICovXG4gICAgICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgICAgICAgICAgZm9udDogaW5oZXJpdDtcbiAgICAgICAgICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgICAgICAgICBsZXR0ZXItc3BhY2luZzogbm9ybWFsO1xuICAgICAgICAgICAgICAgIHdvcmQtc3BhY2luZzogbm9ybWFsO1xuICAgICAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICAgICAgICAgIHRleHQtaW5kZW50OiAwO1xuICAgICAgICAgICAgICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IHN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBIb3ZlciBzdGF0ZSAqL1xuICAgICAgICAgICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmFwLWNoZWNrYm94LXN0eWxlZDpob3ZlciB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS04MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEFjdGl2ZS9wcmVzc2VkIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmFjdGl2ZSB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS0xMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBDaGVja2VkIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmNoZWNrZWQge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZWxlY3RyaWMtYmx1ZS0xMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBDaGVja2VkIGhvdmVyIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmNoZWNrZWQ6aG92ZXIge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTgwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIENoZWNrZWQgYWN0aXZlL3ByZXNzZWQgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6Y2hlY2tlZDphY3RpdmUge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTYwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEluZGV0ZXJtaW5hdGUgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6aW5kZXRlcm1pbmF0ZSB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtMTAwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIERpc2FibGVkIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmRpc2FibGVkIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1ncmV5LTIwKTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWYtY29sb3ItZ3JleS0xMCk7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmRpc2FibGVkOmNoZWNrZWQge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1ncmV5LTIwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogRm9jdXMgc3RhdGUgLSBvbmx5IHNob3cgb24gaG92ZXItY2FwYWJsZSBkZXZpY2VzIGxpa2UgdGhlIGNvbXBvbmVudCAqL1xuICAgICAgICAgICAgQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmZvY3VzOm5vdCguZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogM3B4IHNvbGlkIHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCkgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogTGFiZWwgc3R5bGluZyAtIHRhcmdldHMgbGFiZWxzIHRoYXQgZm9sbG93IG91ciB3cmFwcGVyIGNvbnRhaW5pbmcgc3R5bGVkIGNoZWNrYm94ZXMgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQpICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBmb250LWZhbWlseTogdmFyKC0tY29tcC1mb3Jtcy1sYWJlbC1mb250LWZhbWlseSk7XG4gICAgICAgICAgICAgICAgZm9udC1zaXplOiB2YXIoLS1jb21wLWZvcm1zLWxhYmVsLXNpemUpO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1jb21wLWZvcm1zLWxhYmVsLWZvbnQtd2VpZ2h0KTtcbiAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogdmFyKC0tY29tcC1mb3Jtcy1sYWJlbC1saW5lLWhlaWdodCk7XG4gICAgICAgICAgICAgICAgY29sb3I6IHZhcigtLWNvbXAtZm9ybXMtbGFiZWwtdGV4dC1jb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEVtcHR5IGxhYmVsIHN0eWxpbmcgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQpICsgbGFiZWw6ZW1wdHkge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIERpc2FibGVkIGxhYmVsIHN0eWxpbmcgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6ZGlzYWJsZWQpICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS02MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIExhYmVsIGhvdmVyIHN0eWxpbmcgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQpICsgbGFiZWw6aG92ZXI6bm90KC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogRGlzYWJsZWQgbGFiZWwgaG92ZXIgKi9cbiAgICAgICAgICAgIHNwYW46aGFzKGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6ZGlzYWJsZWQpICsgbGFiZWw6aG92ZXIge1xuICAgICAgICAgICAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBhbmQgYXBwZW5kIHN0eWxlIGVsZW1lbnRcbiAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChzdHlsZXMpKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCB0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgfVxuXG5cbiAgICBvbkJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25WYWx1ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gaW5kZXRlcm1pbmF0ZSwgY2xpY2tpbmcgc2hvdWxkIGdvIHRvIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaW5wdXQuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOb3JtYWwgdG9nZ2xlIGJlaGF2aW9yXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2ttYXJrVmlzaWJpbGl0eSgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9jaGVja2VkKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy5fY2hlY2tlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jaGVja2VkID0gdmFsdWU7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlucHV0LmNoZWNrZWQgPSB2YWx1ZTtcbiAgICAgICAgLy8gRW5zdXJlIGluZGV0ZXJtaW5hdGUgc3RhdGUgaXMgcHJvcGVybHkgc2V0XG4gICAgICAgIGlucHV0LmluZGV0ZXJtaW5hdGUgPSB0aGlzLl9pbmRldGVybWluYXRlO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrbWFya1Zpc2liaWxpdHkoKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgICBjb25zdCBpc05vdFZhbGlkID0gIXRoaXMuX2NoZWNrZWQgJiYgdGhpcy5yZXF1aXJlZDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzTm90VmFsaWQgJiYge1xuICAgICAgICAgICAgICAgIGludmFsaWQ6IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxufSJdfQ==
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy91aS1jb21wb25lbnRzL2RpcmVjdGl2ZXMvc3JjL2NoZWNrYm94LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDVCxNQUFNLGVBQWUsQ0FBQzs7QUFPdkIsTUFBTSxPQUFPLGlCQUFpQjtJQUNULFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQSxVQUE0QixDQUFBLENBQUMsQ0FBQztJQUNsRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLGdCQUFnQjtJQUNSLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2QyxzREFBc0Q7SUFDdEQsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDckMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFakQseURBQXlEO0lBQ3pELDhCQUE4QjtJQUM5QixJQUNJLFlBQVksQ0FBQyxPQUFnQjtRQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFJSSxrQkFBa0IsQ0FBQyxhQUFzQjtRQUN6QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FB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QUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQzt1R0F0U1EsaUJBQWlCOzJGQUFqQixpQkFBaUIseUxBcUJYLGdCQUFnQixnQkF2QnBCLEVBQUU7OzJGQUVKLGlCQUFpQjtrQkFMN0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0NBQW9DO29CQUM5QyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsU0FBUyxFQUFFLEVBQUU7aUJBQ2hCO3dEQWdCTyxZQUFZO3NCQURmLEtBQUs7dUJBQUMsU0FBUztnQkFVWixrQkFBa0I7c0JBSnJCLEtBQUs7dUJBQUM7d0JBQ0gsU0FBUyxFQUFFLGdCQUFnQjt3QkFDM0IsS0FBSyxFQUFFLGVBQWU7cUJBQ3pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIERpcmVjdGl2ZSxcbiAgICBlZmZlY3QsXG4gICAgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lucHV0W3R5cGU9XCJjaGVja2JveFwiXVthcENoZWNrYm94XScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBwcm92aWRlcnM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gICAgLy8gU3RhdGUgc2lnbmFsc1xuICAgIHByaXZhdGUgX2NoZWNrZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByaXZhdGUgX2luZGV0ZXJtaW5hdGUgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLy8gSW5wdXQgc2lnbmFsIGFjY2Vzc29ycyB0aGF0IHdvcmsgd2l0aCBob3N0IGJpbmRpbmdzXG4gICAgY2hlY2tlZCA9IHRoaXMuX2NoZWNrZWQuYXNSZWFkb25seSgpO1xuICAgIGluZGV0ZXJtaW5hdGUgPSB0aGlzLl9pbmRldGVybWluYXRlLmFzUmVhZG9ubHkoKTtcblxuICAgIC8vIElucHV0IHNldHRlcnMgd2l0aCBwcm9wZXIgYWxpYXNlcyBmb3IgdGVtcGxhdGUgYmluZGluZ1xuICAgIC8vIENvdWxkbid0IGJlIG1pZ3JhdGVkIHRvIHlldFxuICAgIEBJbnB1dCgnY2hlY2tlZCcpXG4gICAgc2V0IGNoZWNrZWRJbnB1dChjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrZWQuc2V0KGNoZWNrZWQpO1xuICAgICAgICB0aGlzLnVwZGF0ZU5hdGl2ZUVsZW1lbnRTeW5jKCk7XG4gICAgfVxuXG4gICAgQElucHV0KHtcbiAgICAgICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICAgICAgICBhbGlhczogJ2luZGV0ZXJtaW5hdGUnLFxuICAgIH0pXG4gICAgc2V0IGluZGV0ZXJtaW5hdGVJbnB1dChpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChpbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2VkLnNldChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZS5zZXQoaW5kZXRlcm1pbmF0ZSk7XG4gICAgICAgIHRoaXMudXBkYXRlTmF0aXZlRWxlbWVudFN5bmMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU5hdGl2ZUVsZW1lbnRTeW5jKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSB0aGlzLmNoZWNrZWQoKTtcbiAgICAgICAgICAgIGlucHV0LmluZGV0ZXJtaW5hdGUgPSB0aGlzLmluZGV0ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByaXZhdGUgcHJvcGVydGllc1xuICAgIHByaXZhdGUgbGlzdGVuZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICAgIHByaXZhdGUgc3R5bGVFbGVtZW50ITogSFRNTFN0eWxlRWxlbWVudDtcbiAgICBwcml2YXRlIGNoZWNrbWFya1N2ZyE6IFNWR0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSBpbmRldGVybWluYXRlQmFyITogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrbWFya1N2ZyAmJiB0aGlzLmluZGV0ZXJtaW5hdGVCYXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrbWFya1Zpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3VzdG9tIFNWRyBjb250ZW50XG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGVja1N2Z0NvbnRlbnQgPSBgXG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xNC4yMzggMy4zMzdhLjkyLjkyIDAgMCAxIC4wMjUgMS4zMDFsLTcuNyA4YS45Mi45MiAwIDAgMS0xLjMyNiAwbC0zLjUtMy42MzZhLjkyLjkyIDAgMSAxIDEuMzI2LTEuMjc2TDUuOSAxMC42NzRsNy4wMzctNy4zMTJhLjkyLjkyIDAgMCAxIDEuMzAxLS4wMjVaXCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgYDtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoZWNrYm94U3RydWN0dXJlKCk7XG4gICAgICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKHVubGlzdGVuID0+IHVubGlzdGVuKCkpO1xuICAgICAgICBpZiAodGhpcy5zdHlsZUVsZW1lbnQgJiYgdGhpcy5zdHlsZUVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hlY2ttYXJrU3ZnICYmIHRoaXMuY2hlY2ttYXJrU3ZnLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2ttYXJrU3ZnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5jaGVja21hcmtTdmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGVCYXIgJiYgdGhpcy5pbmRldGVybWluYXRlQmFyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuaW5kZXRlcm1pbmF0ZUJhcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoZWNrYm94U3RydWN0dXJlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIE1ha2UgaW5wdXQncyBwYXJlbnQgdXNlIGlubGluZS1mbGV4IGZvciBhbGlnbm1lbnQgYW5kIHBvc2l0aW9uIHJlbGF0aXZlXG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAnZGlzcGxheScsICdpbmxpbmUtZmxleCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwYXJlbnQsICdhbGlnbi1pdGVtcycsICdjZW50ZXInKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAnZ2FwJywgJ3ZhcigtLXJlZi1zcGFjaW5nLXh4cyknKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocGFyZW50LCAncG9zaXRpb24nLCAncmVsYXRpdmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaW5wdXQsICdhcC1jaGVja2JveC1zdHlsZWQnKTtcblxuICAgICAgICB0aGlzLmNyZWF0ZUNoZWNrbWFya1N2ZygpO1xuICAgICAgICB0aGlzLmNyZWF0ZUluZGV0ZXJtaW5hdGVCYXIoKTtcblxuICAgICAgICB0aGlzLmFwcGx5Q2hlY2tib3hTdHlsZXMoKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNoZWNrbWFya1Zpc2liaWxpdHkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZU92ZXJsYXlFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEFwcGx5IGNvbW1vbiBwb3NpdGlvbmluZyBzdHlsZXNcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAndG9wJywgJzUwJScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdsZWZ0JywgJzhweCcpOyAvLyBDZW50ZXIgb3ZlciAxNnB4IGNoZWNrYm94XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZWxlbWVudCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnQsICdvcGFjaXR5JywgJzAnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnei1pbmRleCcsICcxJyk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHBhcmVudCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDaGVja21hcmtTdmcoKTogdm9pZCB7XG4gICAgICAgIC8vIENyZWF0ZSBTVkcgZWxlbWVudCBmcm9tIHN0cmluZ1xuICAgICAgICBjb25zdCB0ZW1wRGl2ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0ZW1wRGl2LCAnaW5uZXJIVE1MJywgdGhpcy5jaGVja1N2Z0NvbnRlbnQpO1xuICAgICAgICB0aGlzLmNoZWNrbWFya1N2ZyA9IHRlbXBEaXYuZmlyc3RFbGVtZW50Q2hpbGQgYXMgU1ZHRWxlbWVudDtcblxuICAgICAgICB0aGlzLmNyZWF0ZU92ZXJsYXlFbGVtZW50KHRoaXMuY2hlY2ttYXJrU3ZnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUluZGV0ZXJtaW5hdGVCYXIoKTogdm9pZCB7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5kZXRlcm1pbmF0ZSBiYXIgZWxlbWVudFxuICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVCYXIgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmluZGV0ZXJtaW5hdGVCYXIsICdoZWlnaHQnLCAnMS41cHgnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmluZGV0ZXJtaW5hdGVCYXIsICdiYWNrZ3JvdW5kJywgJ3ZhcigtLXJlZi1jb2xvci13aGl0ZSknKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmluZGV0ZXJtaW5hdGVCYXIsICd3aWR0aCcsICc4cHgnKTtcblxuICAgICAgICB0aGlzLmNyZWF0ZU92ZXJsYXlFbGVtZW50KHRoaXMuaW5kZXRlcm1pbmF0ZUJhcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGVja21hcmtWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jaGVja21hcmtTdmcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wYWNpdHkgPSB0aGlzLmNoZWNrZWQoKSAmJiAhdGhpcy5pbmRldGVybWluYXRlKCkgPyAnMScgOiAnMCc7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY2hlY2ttYXJrU3ZnLCAnb3BhY2l0eScsIG9wYWNpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGVCYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wYWNpdHkgPSB0aGlzLmluZGV0ZXJtaW5hdGUoKSAmJiAhdGhpcy5jaGVja2VkKCkgPyAnMScgOiAnMCc7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW5kZXRlcm1pbmF0ZUJhciwgJ29wYWNpdHknLCBvcGFjaXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyBJbnB1dCBjaGFuZ2UgbGlzdGVuZXIgKG5hdGl2ZSBjaGVja2JveCBjaGFuZ2UpXG4gICAgICAgIGNvbnN0IGNoYW5nZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oaW5wdXQsICdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goY2hhbmdlTGlzdGVuZXIpO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgbGFiZWwgY2xpY2tzIHRvIGVuc3VyZSBmb2N1cyBpcyBtYWludGFpbmVkXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGlucHV0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ2xpY2tMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHBhcmVudCwgJ2NsaWNrJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIC8vIElmIGNsaWNraW5nIG9uIGEgbGFiZWwgdGhhdCB0YXJnZXRzIG91ciBpbnB1dCwgZW5zdXJlIGZvY3VzXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnTEFCRUwnICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2ZvcicpID09PSBpbnB1dC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTbWFsbCBkZWxheSB0byBlbnN1cmUgdGhlIGxhYmVsIGNsaWNrIGlzIHByb2Nlc3NlZCBmaXJzdFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsYWJlbENsaWNrTGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseUNoZWNrYm94U3R5bGVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBgXG4gICAgICAgICAgICAvKiBNaW5pbWFsIGNoZWNrYm94IHN0eWxpbmcgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQge1xuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1pbi13aWR0aDogMTZweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDE2cHggIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcmVmLWNvbG9yLWdyZXktNjApO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXN5cy1ib3JkZXItcmFkaXVzLXNtKTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWYtY29sb3Itd2hpdGUpO1xuICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIEhvdmVyIHN0YXRlICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmhvdmVyIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1ncmV5LTgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogQWN0aXZlL3ByZXNzZWQgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6YWN0aXZlIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1ncmV5LTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIENoZWNrZWQgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6Y2hlY2tlZCB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtMTAwKTtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qIENoZWNrZWQgaG92ZXIgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6Y2hlY2tlZDpob3ZlciB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtODApO1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogQ2hlY2tlZCBhY3RpdmUvcHJlc3NlZCBzdGF0ZSAqL1xuICAgICAgICAgICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmFwLWNoZWNrYm94LXN0eWxlZDpjaGVja2VkOmFjdGl2ZSB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtNjApO1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogSW5kZXRlcm1pbmF0ZSBzdGF0ZSAqL1xuICAgICAgICAgICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmFwLWNoZWNrYm94LXN0eWxlZDppbmRldGVybWluYXRlIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yZWYtY29sb3ItZWxlY3RyaWMtYmx1ZS0xMDApO1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcmVmLWNvbG9yLWVsZWN0cmljLWJsdWUtMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogRGlzYWJsZWQgc3RhdGUgKi9cbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6ZGlzYWJsZWQge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcmVmLWNvbG9yLWdyZXktMjApO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJlZi1jb2xvci1ncmV5LTEwKTtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXS5hcC1jaGVja2JveC1zdHlsZWQ6ZGlzYWJsZWQ6Y2hlY2tlZCB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcmVmLWNvbG9yLWdyZXktMjApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBGb2N1cyBzdGF0ZSAqL1xuICAgICAgICAgICAgQG1lZGlhIChob3ZlcjogaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmZvY3VzOm5vdCguZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogM3B4IHNvbGlkIHZhcigtLXJlZi1jb2xvci1lbGVjdHJpYy1ibHVlLTEwMCkgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogTGFiZWwgc3R5bGluZyAqL1xuICAgICAgICAgICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmFwLWNoZWNrYm94LXN0eWxlZCArIGxhYmVsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWNvbXAtZm9ybXMtbGFiZWwtZm9udC1mYW1pbHkpO1xuICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tY29tcC1mb3Jtcy1sYWJlbC1zaXplKTtcbiAgICAgICAgICAgICAgICBmb250LXdlaWdodDogdmFyKC0tY29tcC1mb3Jtcy1sYWJlbC1mb250LXdlaWdodCk7XG4gICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IHZhcigtLWNvbXAtZm9ybXMtbGFiZWwtbGluZS1oZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1jb21wLWZvcm1zLWxhYmVsLXRleHQtY29sb3IpO1xuICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLyogRW1wdHkgbGFiZWwgc3R5bGluZyAqL1xuICAgICAgICAgICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLmFwLWNoZWNrYm94LXN0eWxlZCArIGxhYmVsOmVtcHR5IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKiBEaXNhYmxlZCBsYWJlbCBzdHlsaW5nICovXG4gICAgICAgICAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0uYXAtY2hlY2tib3gtc3R5bGVkOmRpc2FibGVkICsgbGFiZWwge1xuICAgICAgICAgICAgICAgIGNvbG9yOiB2YXIoLS1yZWYtY29sb3ItZ3JleS02MCk7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICBgO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbmQgYXBwZW5kIHN0eWxlIGVsZW1lbnRcbiAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChzdHlsZXMpKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCB0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblZhbHVlQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRldGVybWluYXRlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIGluZGV0ZXJtaW5hdGUsIGNsaWNraW5nIHNob3VsZCBnbyB0byBjaGVja2VkIHN0YXRlXG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZS5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlucHV0LmluZGV0ZXJtaW5hdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm9ybWFsIHRvZ2dsZSBiZWhhdmlvclxuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrZWQuc2V0KGlucHV0LmNoZWNrZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19