ngx-mask 13.2.0-test → 13.2.1

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,13 +1,19 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
- import { Directive, EventEmitter, HostListener, Input, Output, inject, forwardRef, } from '@angular/core';
2
+ import { Directive, EventEmitter, HostListener, Input, Output, forwardRef, Inject, } from '@angular/core';
3
3
  import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from '@angular/forms';
4
4
  import { NGX_MASK_CONFIG, timeMasks, withoutValidation } from './ngx-mask.config';
5
5
  import { NgxMaskService } from './ngx-mask.service';
6
6
  import * as i0 from "@angular/core";
7
+ import * as i1 from "./ngx-mask.service";
7
8
  // tslint:disable deprecation
8
9
  // tslint:disable no-input-rename
9
10
  export class NgxMaskDirective {
10
- constructor() {
11
+ constructor(
12
+ // tslint:disable-next-line
13
+ document, _config, _maskService) {
14
+ this.document = document;
15
+ this._config = _config;
16
+ this._maskService = _maskService;
11
17
  // eslint-disable-next-line @angular-eslint/no-input-rename
12
18
  this.maskExpression = '';
13
19
  this.specialCharacters = [];
@@ -40,9 +46,6 @@ export class NgxMaskDirective {
40
46
  this._justPasted = false;
41
47
  /**For IME composition event */
42
48
  this._isComposing = false;
43
- this.document = inject(DOCUMENT);
44
- this._maskService = inject(NgxMaskService, { self: true });
45
- this._config = inject(NGX_MASK_CONFIG);
46
49
  // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any
47
50
  this.onChange = (_) => { };
48
51
  // eslint-disable-next-line @typescript-eslint/no-empty-function
@@ -59,13 +62,13 @@ export class NgxMaskDirective {
59
62
  this._maskService.allowNegativeNumbers = allowNegativeNumbers.currentValue;
60
63
  if (this._maskService.allowNegativeNumbers) {
61
64
  this._maskService.specialCharacters =
62
- this._maskService.specialCharacters.filter((c) => c !== "-" /* MaskExpression.MINUS */);
65
+ this._maskService.specialCharacters.filter((c) => c !== "-" /* MINUS */);
63
66
  }
64
67
  }
65
68
  if (maskExpression.currentValue &&
66
- maskExpression.currentValue.split("||" /* MaskExpression.OR */).length > 1) {
69
+ maskExpression.currentValue.split("||" /* OR */).length > 1) {
67
70
  this._maskExpressionArray = maskExpression.currentValue
68
- .split("||" /* MaskExpression.OR */)
71
+ .split("||" /* OR */)
69
72
  .sort((a, b) => {
70
73
  return a.length - b.length;
71
74
  });
@@ -73,7 +76,7 @@ export class NgxMaskDirective {
73
76
  }
74
77
  else {
75
78
  this._maskExpressionArray = [];
76
- this._maskValue = maskExpression.currentValue || "" /* MaskExpression.EMPTY_STRING */;
79
+ this._maskValue = maskExpression.currentValue || "" /* EMPTY_STRING */;
77
80
  this._maskService.maskExpression = this._maskValue;
78
81
  }
79
82
  }
@@ -162,7 +165,7 @@ export class NgxMaskDirective {
162
165
  if (this._maskService.cpfCnpjError) {
163
166
  return this._createValidationError(value);
164
167
  }
165
- if (this._maskValue.startsWith("separator" /* MaskExpression.SEPARATOR */)) {
168
+ if (this._maskValue.startsWith("separator" /* SEPARATOR */)) {
166
169
  return null;
167
170
  }
168
171
  if (withoutValidation.includes(this._maskValue)) {
@@ -176,16 +179,16 @@ export class NgxMaskDirective {
176
179
  }
177
180
  if (value && value.toString().length >= 1) {
178
181
  let counterOfOpt = 0;
179
- if (this._maskValue.startsWith("percent" /* MaskExpression.PERCENT */)) {
182
+ if (this._maskValue.startsWith("percent" /* PERCENT */)) {
180
183
  return null;
181
184
  }
182
185
  for (const key in this._maskService.patterns) {
183
186
  if (this._maskService.patterns[key]?.optional) {
184
187
  if (this._maskValue.indexOf(key) !== this._maskValue.lastIndexOf(key)) {
185
188
  const opt = this._maskValue
186
- .split("" /* MaskExpression.EMPTY_STRING */)
189
+ .split("" /* EMPTY_STRING */)
187
190
  .filter((i) => i === key)
188
- .join("" /* MaskExpression.EMPTY_STRING */);
191
+ .join("" /* EMPTY_STRING */);
189
192
  counterOfOpt += opt.length;
190
193
  }
191
194
  else if (this._maskValue.indexOf(key) !== -1) {
@@ -200,25 +203,25 @@ export class NgxMaskDirective {
200
203
  }
201
204
  }
202
205
  }
203
- if (this._maskValue.indexOf("{" /* MaskExpression.CURLY_BRACKETS_LEFT */) === 1 &&
206
+ if (this._maskValue.indexOf("{" /* CURLY_BRACKETS_LEFT */) === 1 &&
204
207
  value.toString().length ===
205
208
  this._maskValue.length +
206
- Number((this._maskValue.split("{" /* MaskExpression.CURLY_BRACKETS_LEFT */)[1] ??
207
- "" /* MaskExpression.EMPTY_STRING */).split("}" /* MaskExpression.CURLY_BRACKETS_RIGHT */)[0]) -
209
+ Number((this._maskValue.split("{" /* CURLY_BRACKETS_LEFT */)[1] ??
210
+ "" /* EMPTY_STRING */).split("}" /* CURLY_BRACKETS_RIGHT */)[0]) -
208
211
  4) {
209
212
  return null;
210
213
  }
211
- else if ((this._maskValue.indexOf("*" /* MaskExpression.SYMBOL_STAR */) > 1 &&
214
+ else if ((this._maskValue.indexOf("*" /* SYMBOL_STAR */) > 1 &&
212
215
  value.toString().length <
213
- this._maskValue.indexOf("*" /* MaskExpression.SYMBOL_STAR */)) ||
214
- (this._maskValue.indexOf("?" /* MaskExpression.SYMBOL_QUESTION */) > 1 &&
216
+ this._maskValue.indexOf("*" /* SYMBOL_STAR */)) ||
217
+ (this._maskValue.indexOf("?" /* SYMBOL_QUESTION */) > 1 &&
215
218
  value.toString().length <
216
- this._maskValue.indexOf("?" /* MaskExpression.SYMBOL_QUESTION */)) ||
217
- this._maskValue.indexOf("{" /* MaskExpression.CURLY_BRACKETS_LEFT */) === 1) {
219
+ this._maskValue.indexOf("?" /* SYMBOL_QUESTION */)) ||
220
+ this._maskValue.indexOf("{" /* CURLY_BRACKETS_LEFT */) === 1) {
218
221
  return this._createValidationError(value);
219
222
  }
220
- if (this._maskValue.indexOf("*" /* MaskExpression.SYMBOL_STAR */) === -1 ||
221
- this._maskValue.indexOf("?" /* MaskExpression.SYMBOL_QUESTION */) === -1) {
223
+ if (this._maskValue.indexOf("*" /* SYMBOL_STAR */) === -1 ||
224
+ this._maskValue.indexOf("?" /* SYMBOL_QUESTION */) === -1) {
222
225
  // eslint-disable-next-line no-param-reassign
223
226
  value = typeof value === 'number' ? String(value) : value;
224
227
  const array = this._maskValue.split('*');
@@ -257,8 +260,8 @@ export class NgxMaskDirective {
257
260
  }
258
261
  }
259
262
  }
260
- if (this._maskValue.indexOf("*" /* MaskExpression.SYMBOL_STAR */) === 1 ||
261
- this._maskValue.indexOf("?" /* MaskExpression.SYMBOL_QUESTION */) === 1) {
263
+ if (this._maskValue.indexOf("*" /* SYMBOL_STAR */) === 1 ||
264
+ this._maskValue.indexOf("?" /* SYMBOL_QUESTION */) === 1) {
262
265
  return null;
263
266
  }
264
267
  }
@@ -273,9 +276,9 @@ export class NgxMaskDirective {
273
276
  }
274
277
  onModelChange(value) {
275
278
  // on form reset we need to update the actualValue
276
- if ((value === "" /* MaskExpression.EMPTY_STRING */ || value === null || value === undefined) &&
279
+ if ((value === "" /* EMPTY_STRING */ || value === null || value === undefined) &&
277
280
  this._maskService.actualValue) {
278
- this._maskService.actualValue = this._maskService.getActualValue("" /* MaskExpression.EMPTY_STRING */);
281
+ this._maskService.actualValue = this._maskService.getActualValue("" /* EMPTY_STRING */);
279
282
  }
280
283
  }
281
284
  onInput(e) {
@@ -302,13 +305,13 @@ export class NgxMaskDirective {
302
305
  const inputSymbol = el.value.slice(position - 1, position);
303
306
  const prefixLength = this.prefix.length;
304
307
  const checkSymbols = this._maskService._checkSymbolMask(inputSymbol, this._maskService.maskExpression[position - 1 - prefixLength] ??
305
- "" /* MaskExpression.EMPTY_STRING */);
308
+ "" /* EMPTY_STRING */);
306
309
  const checkSpecialCharacter = this._maskService._checkSymbolMask(inputSymbol, this._maskService.maskExpression[position + 1 - prefixLength] ??
307
- "" /* MaskExpression.EMPTY_STRING */);
310
+ "" /* EMPTY_STRING */);
308
311
  const selectRangeBackspace = this._maskService.selStart === this._maskService.selEnd;
309
312
  const selStart = Number(this._maskService.selStart) - prefixLength ?? '';
310
313
  const selEnd = Number(this._maskService.selEnd) - prefixLength ?? '';
311
- if (this._code === "Backspace" /* MaskExpression.BACKSPACE */) {
314
+ if (this._code === "Backspace" /* BACKSPACE */) {
312
315
  if (!selectRangeBackspace) {
313
316
  if (this._maskService.selStart === prefixLength) {
314
317
  this._maskService.actualValue =
@@ -356,7 +359,7 @@ export class NgxMaskDirective {
356
359
  }
357
360
  }
358
361
  }
359
- if (this._code !== "Backspace" /* MaskExpression.BACKSPACE */) {
362
+ if (this._code !== "Backspace" /* BACKSPACE */) {
360
363
  if (!checkSymbols && !checkSpecialCharacter && selectRangeBackspace) {
361
364
  position = Number(el.selectionStart) - 1;
362
365
  }
@@ -384,12 +387,12 @@ export class NgxMaskDirective {
384
387
  }
385
388
  let caretShift = 0;
386
389
  let backspaceShift = false;
387
- if (this._code === "Delete" /* MaskExpression.DELETE */ && "separator" /* MaskExpression.SEPARATOR */) {
390
+ if (this._code === "Delete" /* DELETE */ && "separator" /* SEPARATOR */) {
388
391
  this._maskService.deletedSpecialCharacter = true;
389
392
  }
390
393
  if (this._inputValue.length >= this._maskService.maskExpression.length - 1 &&
391
- this._code !== "Backspace" /* MaskExpression.BACKSPACE */ &&
392
- this._maskService.maskExpression === "d0/M0/0000" /* MaskExpression.DAYS_MONTHS_YEARS */ &&
394
+ this._code !== "Backspace" /* BACKSPACE */ &&
395
+ this._maskService.maskExpression === "d0/M0/0000" /* DAYS_MONTHS_YEARS */ &&
393
396
  position < 10) {
394
397
  const inputSymbol = this._inputValue.slice(position - 1, position);
395
398
  el.value =
@@ -397,17 +400,17 @@ export class NgxMaskDirective {
397
400
  inputSymbol +
398
401
  this._inputValue.slice(position + 1);
399
402
  }
400
- if (this._maskService.maskExpression === "Hh:m0:s0" /* MaskExpression.HOURS_MINUTES_SECONDS */ &&
403
+ if (this._maskService.maskExpression === "Hh:m0:s0" /* HOURS_MINUTES_SECONDS */ &&
401
404
  this.apm) {
402
- if (this._justPasted && el.value.slice(0, 2) === "00" /* MaskExpression.DOUBLE_ZERO */) {
405
+ if (this._justPasted && el.value.slice(0, 2) === "00" /* DOUBLE_ZERO */) {
403
406
  el.value = el.value.slice(1, 2) + el.value.slice(2, el.value.length);
404
407
  }
405
408
  el.value =
406
- el.value === "00" /* MaskExpression.DOUBLE_ZERO */
407
- ? "0" /* MaskExpression.NUMBER_ZERO */
409
+ el.value === "00" /* DOUBLE_ZERO */
410
+ ? "0" /* NUMBER_ZERO */
408
411
  : el.value;
409
412
  }
410
- this._maskService.applyValueChanges(position, this._justPasted, this._code === "Backspace" /* MaskExpression.BACKSPACE */ || this._code === "Delete" /* MaskExpression.DELETE */, (shift, _backspaceShift) => {
413
+ this._maskService.applyValueChanges(position, this._justPasted, this._code === "Backspace" /* BACKSPACE */ || this._code === "Delete" /* DELETE */, (shift, _backspaceShift) => {
411
414
  this._justPasted = false;
412
415
  caretShift = shift;
413
416
  backspaceShift = _backspaceShift;
@@ -418,7 +421,7 @@ export class NgxMaskDirective {
418
421
  }
419
422
  // update position after applyValueChanges to prevent cursor on wrong position when it has an array of maskExpression
420
423
  if (this._maskExpressionArray.length) {
421
- if (this._code === "Backspace" /* MaskExpression.BACKSPACE */) {
424
+ if (this._code === "Backspace" /* BACKSPACE */) {
422
425
  position = this.specialCharacters.includes(this._inputValue.slice(position - 1, position))
423
426
  ? position - 1
424
427
  : position;
@@ -435,7 +438,7 @@ export class NgxMaskDirective {
435
438
  let positionToApply = this._position
436
439
  ? this._inputValue.length + position + caretShift
437
440
  : position +
438
- (this._code === "Backspace" /* MaskExpression.BACKSPACE */ && !backspaceShift ? 0 : caretShift);
441
+ (this._code === "Backspace" /* BACKSPACE */ && !backspaceShift ? 0 : caretShift);
439
442
  if (positionToApply > this._getActualInputLength()) {
440
443
  positionToApply = this._getActualInputLength();
441
444
  }
@@ -450,7 +453,7 @@ export class NgxMaskDirective {
450
453
  }
451
454
  }
452
455
  else {
453
- this._maskService.applyValueChanges(el.value.length, this._justPasted, this._code === "Backspace" /* MaskExpression.BACKSPACE */ || this._code === "Delete" /* MaskExpression.DELETE */);
456
+ this._maskService.applyValueChanges(el.value.length, this._justPasted, this._code === "Backspace" /* BACKSPACE */ || this._code === "Delete" /* DELETE */);
454
457
  }
455
458
  }
456
459
  // IME starts
@@ -474,11 +477,11 @@ export class NgxMaskDirective {
474
477
  const decimalPart = el.value.split(this.decimalMarker)[1];
475
478
  el.value = el.value.includes(this.decimalMarker)
476
479
  ? el.value +
477
- "0" /* MaskExpression.NUMBER_ZERO */.repeat(precision - decimalPart.length) +
480
+ "0" /* NUMBER_ZERO */.repeat(precision - decimalPart.length) +
478
481
  this.suffix
479
482
  : el.value +
480
483
  this.decimalMarker +
481
- "0" /* MaskExpression.NUMBER_ZERO */.repeat(precision) +
484
+ "0" /* NUMBER_ZERO */.repeat(precision) +
482
485
  this.suffix;
483
486
  this._maskService.actualValue = el.value;
484
487
  }
@@ -555,16 +558,16 @@ export class NgxMaskDirective {
555
558
  this._inputValue = el.value;
556
559
  this._setMask();
557
560
  if (el.type !== 'number') {
558
- if (e.key === "ArrowUp" /* MaskExpression.ARROW_UP */) {
561
+ if (e.key === "ArrowUp" /* ARROW_UP */) {
559
562
  e.preventDefault();
560
563
  }
561
- if (e.key === "ArrowLeft" /* MaskExpression.ARROW_LEFT */ ||
562
- e.key === "Backspace" /* MaskExpression.BACKSPACE */ ||
563
- e.key === "Delete" /* MaskExpression.DELETE */) {
564
- if (e.key === "Backspace" /* MaskExpression.BACKSPACE */ && el.value.length === 0) {
564
+ if (e.key === "ArrowLeft" /* ARROW_LEFT */ ||
565
+ e.key === "Backspace" /* BACKSPACE */ ||
566
+ e.key === "Delete" /* DELETE */) {
567
+ if (e.key === "Backspace" /* BACKSPACE */ && el.value.length === 0) {
565
568
  el.selectionStart = el.selectionEnd;
566
569
  }
567
- if (e.key === "Backspace" /* MaskExpression.BACKSPACE */ && el.selectionStart !== 0) {
570
+ if (e.key === "Backspace" /* BACKSPACE */ && el.selectionStart !== 0) {
568
571
  // If specialChars is false, (shouldn't ever happen) then set to the defaults
569
572
  this.specialCharacters = this.specialCharacters?.length
570
573
  ? this.specialCharacters
@@ -577,7 +580,7 @@ export class NgxMaskDirective {
577
580
  if (this._inputValue.length !== el.selectionStart &&
578
581
  el.selectionStart !== 1) {
579
582
  while (this.specialCharacters.includes((this._inputValue[el.selectionStart - 1] ??
580
- "" /* MaskExpression.EMPTY_STRING */).toString()) &&
583
+ "" /* EMPTY_STRING */).toString()) &&
581
584
  ((this.prefix.length >= 1 &&
582
585
  el.selectionStart > this.prefix.length) ||
583
586
  this.prefix.length === 0)) {
@@ -593,7 +596,7 @@ export class NgxMaskDirective {
593
596
  e.preventDefault();
594
597
  }
595
598
  const cursorStart = el.selectionStart;
596
- if (e.key === "Backspace" /* MaskExpression.BACKSPACE */ &&
599
+ if (e.key === "Backspace" /* BACKSPACE */ &&
597
600
  !el.readOnly &&
598
601
  cursorStart === 0 &&
599
602
  el.selectionEnd === el.value.length &&
@@ -639,7 +642,7 @@ export class NgxMaskDirective {
639
642
  // eslint-disable-next-line no-param-reassign
640
643
  let inputValue = controlValue;
641
644
  if (typeof inputValue === 'number' ||
642
- this._maskValue.startsWith("separator" /* MaskExpression.SEPARATOR */)) {
645
+ this._maskValue.startsWith("separator" /* SEPARATOR */)) {
643
646
  // eslint-disable-next-line no-param-reassign
644
647
  inputValue = String(inputValue);
645
648
  const localeDecimalMarker = this._maskService.currentLocaleDecimalMarker();
@@ -657,13 +660,13 @@ export class NgxMaskDirective {
657
660
  // eslint-disable-next-line no-param-reassign
658
661
  inputValue = this._maskService._checkPrecision(this._maskService.maskExpression, inputValue);
659
662
  }
660
- if (this._maskService.decimalMarker === "," /* MaskExpression.COMMA */) {
663
+ if (this._maskService.decimalMarker === "," /* COMMA */) {
661
664
  // eslint-disable-next-line no-param-reassign
662
665
  inputValue = inputValue
663
666
  .toString()
664
- .replace("." /* MaskExpression.DOT */, "," /* MaskExpression.COMMA */);
667
+ .replace("." /* DOT */, "," /* COMMA */);
665
668
  }
666
- if (this.maskExpression?.startsWith("separator" /* MaskExpression.SEPARATOR */) && this.leadZero) {
669
+ if (this.maskExpression?.startsWith("separator" /* SEPARATOR */) && this.leadZero) {
667
670
  requestAnimationFrame(() => {
668
671
  this._maskService.applyMask(inputValue?.toString() ?? '', this._maskService.maskExpression);
669
672
  });
@@ -734,7 +737,7 @@ export class NgxMaskDirective {
734
737
  }
735
738
  _validateTime(value) {
736
739
  const rowMaskLen = this._maskValue
737
- .split("" /* MaskExpression.EMPTY_STRING */)
740
+ .split("" /* EMPTY_STRING */)
738
741
  .filter((s) => s !== ':').length;
739
742
  if (!value) {
740
743
  return null; // Don't validate empty values to allow for optional form control
@@ -760,35 +763,35 @@ export class NgxMaskDirective {
760
763
  _setMask() {
761
764
  this._maskExpressionArray.some((mask) => {
762
765
  const specialChart = mask
763
- .split("" /* MaskExpression.EMPTY_STRING */)
766
+ .split("" /* EMPTY_STRING */)
764
767
  .some((char) => this._maskService.specialCharacters.includes(char));
765
- if ((specialChart && this._inputValue && !mask.includes("S" /* MaskExpression.LETTER_S */)) ||
766
- mask.includes("{" /* MaskExpression.CURLY_BRACKETS_LEFT */)) {
768
+ if ((specialChart && this._inputValue && !mask.includes("S" /* LETTER_S */)) ||
769
+ mask.includes("{" /* CURLY_BRACKETS_LEFT */)) {
767
770
  const test = this._maskService.removeMask(this._inputValue)?.length <=
768
771
  this._maskService.removeMask(mask)?.length;
769
772
  if (test) {
770
773
  this._maskValue =
771
774
  this.maskExpression =
772
775
  this._maskService.maskExpression =
773
- mask.includes("{" /* MaskExpression.CURLY_BRACKETS_LEFT */)
776
+ mask.includes("{" /* CURLY_BRACKETS_LEFT */)
774
777
  ? this._maskService._repeatPatternSymbols(mask)
775
778
  : mask;
776
779
  return test;
777
780
  }
778
781
  else {
779
782
  const expression = this._maskExpressionArray[this._maskExpressionArray.length - 1] ??
780
- "" /* MaskExpression.EMPTY_STRING */;
783
+ "" /* EMPTY_STRING */;
781
784
  this._maskValue =
782
785
  this.maskExpression =
783
786
  this._maskService.maskExpression =
784
- expression.includes("{" /* MaskExpression.CURLY_BRACKETS_LEFT */)
787
+ expression.includes("{" /* CURLY_BRACKETS_LEFT */)
785
788
  ? this._maskService._repeatPatternSymbols(expression)
786
789
  : expression;
787
790
  }
788
791
  }
789
792
  else {
790
793
  const check = this._inputValue
791
- ?.split("" /* MaskExpression.EMPTY_STRING */)
794
+ ?.split("" /* EMPTY_STRING */)
792
795
  .every((character, index) => {
793
796
  const indexMask = mask.charAt(index);
794
797
  return this._maskService._checkSymbolMask(character, indexMask);
@@ -801,8 +804,8 @@ export class NgxMaskDirective {
801
804
  });
802
805
  }
803
806
  }
804
- NgxMaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: NgxMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
805
- NgxMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.8", type: NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: { maskExpression: ["mask", "maskExpression"], specialCharacters: "specialCharacters", patterns: "patterns", prefix: "prefix", suffix: "suffix", thousandSeparator: "thousandSeparator", decimalMarker: "decimalMarker", dropSpecialCharacters: "dropSpecialCharacters", hiddenInput: "hiddenInput", showMaskTyped: "showMaskTyped", placeHolderCharacter: "placeHolderCharacter", shownMaskExpression: "shownMaskExpression", showTemplate: "showTemplate", clearIfNotMatch: "clearIfNotMatch", validation: "validation", separatorLimit: "separatorLimit", allowNegativeNumbers: "allowNegativeNumbers", leadZeroDateTime: "leadZeroDateTime", leadZero: "leadZero", triggerOnMaskChange: "triggerOnMaskChange", apm: "apm", inputTransformFn: "inputTransformFn", outputTransformFn: "outputTransformFn", keepCharacterPositions: "keepCharacterPositions" }, outputs: { maskFilled: "maskFilled" }, host: { listeners: { "paste": "onPaste()", "ngModelChange": "onModelChange($event)", "input": "onInput($event)", "compositionstart": "onCompositionStart($event)", "compositionend": "onCompositionEnd($event)", "blur": "onBlur($event)", "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, providers: [
807
+ NgxMaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: NgxMaskDirective, deps: [{ token: DOCUMENT }, { token: NGX_MASK_CONFIG }, { token: i1.NgxMaskService }], target: i0.ɵɵFactoryTarget.Directive });
808
+ NgxMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.12", type: NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: { maskExpression: ["mask", "maskExpression"], specialCharacters: "specialCharacters", patterns: "patterns", prefix: "prefix", suffix: "suffix", thousandSeparator: "thousandSeparator", decimalMarker: "decimalMarker", dropSpecialCharacters: "dropSpecialCharacters", hiddenInput: "hiddenInput", showMaskTyped: "showMaskTyped", placeHolderCharacter: "placeHolderCharacter", shownMaskExpression: "shownMaskExpression", showTemplate: "showTemplate", clearIfNotMatch: "clearIfNotMatch", validation: "validation", separatorLimit: "separatorLimit", allowNegativeNumbers: "allowNegativeNumbers", leadZeroDateTime: "leadZeroDateTime", leadZero: "leadZero", triggerOnMaskChange: "triggerOnMaskChange", apm: "apm", inputTransformFn: "inputTransformFn", outputTransformFn: "outputTransformFn", keepCharacterPositions: "keepCharacterPositions" }, outputs: { maskFilled: "maskFilled" }, host: { listeners: { "paste": "onPaste()", "ngModelChange": "onModelChange($event)", "input": "onInput($event)", "compositionstart": "onCompositionStart($event)", "compositionend": "onCompositionEnd($event)", "blur": "onBlur($event)", "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, providers: [
806
809
  {
807
810
  provide: NG_VALUE_ACCESSOR,
808
811
  useExisting: forwardRef(() => NgxMaskDirective),
@@ -814,8 +817,8 @@ NgxMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", versi
814
817
  multi: true,
815
818
  },
816
819
  NgxMaskService,
817
- ], usesOnChanges: true, ngImport: i0 });
818
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: NgxMaskDirective, decorators: [{
820
+ ], exportAs: ["mask", "ngxMask"], usesOnChanges: true, ngImport: i0 });
821
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: NgxMaskDirective, decorators: [{
819
822
  type: Directive,
820
823
  args: [{
821
824
  selector: 'input[mask], textarea[mask]',
@@ -832,8 +835,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
832
835
  },
833
836
  NgxMaskService,
834
837
  ],
838
+ exportAs: 'mask,ngxMask',
835
839
  }]
836
- }], propDecorators: { maskExpression: [{
840
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
841
+ type: Inject,
842
+ args: [DOCUMENT]
843
+ }] }, { type: undefined, decorators: [{
844
+ type: Inject,
845
+ args: [NGX_MASK_CONFIG]
846
+ }] }, { type: i1.NgxMaskService }]; }, propDecorators: { maskExpression: [{
837
847
  type: Input,
838
848
  args: ['mask']
839
849
  }], specialCharacters: [{
@@ -909,4 +919,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
909
919
  type: HostListener,
910
920
  args: ['keydown', ['$event']]
911
921
  }] } });
912
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc2stbGliL3NyYy9saWIvbmd4LW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixNQUFNLEVBQ04sVUFBVSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHSCxhQUFhLEVBQ2IsaUJBQWlCLEdBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFXLGVBQWUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBR3BELDZCQUE2QjtBQUM3QixpQ0FBaUM7QUFpQmpDLE1BQU0sT0FBTyxnQkFBZ0I7SUFoQjdCO1FBaUJJLDJEQUEyRDtRQUNyQyxtQkFBYyxHQUE4QixFQUFFLENBQUM7UUFFckQsc0JBQWlCLEdBQWlDLEVBQUUsQ0FBQztRQUVyRCxhQUFRLEdBQXdCLEVBQUUsQ0FBQztRQUVuQyxXQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUUvQixXQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUUvQixzQkFBaUIsR0FBaUMsR0FBRyxDQUFDO1FBRXRELGtCQUFhLEdBQTZCLEdBQUcsQ0FBQztRQUU5QywwQkFBcUIsR0FBNEMsSUFBSSxDQUFDO1FBRXRFLGdCQUFXLEdBQWtDLElBQUksQ0FBQztRQUVsRCxrQkFBYSxHQUFvQyxJQUFJLENBQUM7UUFFdEQseUJBQW9CLEdBQTJDLElBQUksQ0FBQztRQUVwRSx3QkFBbUIsR0FBMEMsSUFBSSxDQUFDO1FBRWxFLGlCQUFZLEdBQW1DLElBQUks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c0JBQXZCLEtBQUs7Z0JBRVUsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQUVVLEdBQUc7c0JBQWxCLEtBQUs7Z0JBRVUsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUVVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFFVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBRVcsVUFBVTtzQkFBMUIsTUFBTTtnQkEwU0EsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU87Z0JBTWQsYUFBYTtzQkFEbkIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBY2xDLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa08xQixrQkFBa0I7c0JBRHhCLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBT3JDLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFRbkMsTUFBTTtzQkFEWixZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFnQ3pCLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBbUUxQixTQUFTO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgaW5qZWN0LFxuICAgIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3JtQ29udHJvbCxcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEN1c3RvbUtleWJvYXJkRXZlbnQgfSBmcm9tICcuL2N1c3RvbS1rZXlib2FyZC1ldmVudCc7XG5pbXBvcnQgeyBJQ29uZmlnLCBOR1hfTUFTS19DT05GSUcsIHRpbWVNYXNrcywgd2l0aG91dFZhbGlkYXRpb24gfSBmcm9tICcuL25neC1tYXNrLmNvbmZpZyc7XG5pbXBvcnQgeyBOZ3hNYXNrU2VydmljZSB9IGZyb20gJy4vbmd4LW1hc2suc2VydmljZSc7XG5pbXBvcnQgeyBNYXNrRXhwcmVzc2lvbiB9IGZyb20gJy4vbmd4LW1hc2stZXhwcmVzc2lvbi5lbnVtJztcblxuLy8gdHNsaW50OmRpc2FibGUgZGVwcmVjYXRpb25cbi8vIHRzbGludDpkaXNhYmxlIG5vLWlucHV0LXJlbmFtZVxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFttYXNrXSwgdGV4dGFyZWFbbWFza10nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neE1hc2tEaXJlY3RpdmUpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hNYXNrRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBOZ3hNYXNrU2VydmljZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgVmFsaWRhdG9yIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICAgIEBJbnB1dCgnbWFzaycpIHB1YmxpYyBtYXNrRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCA9ICcnO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNwZWNpYWxDaGFyYWN0ZXJzOiBJQ29uZmlnWydzcGVjaWFsQ2hhcmFjdGVycyddID0gW107XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgcGF0dGVybnM6IElDb25maWdbJ3BhdHRlcm5zJ10gPSB7fTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmVmaXg6IElDb25maWdbJ3ByZWZpeCddID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc3VmZml4OiBJQ29uZmlnWydzdWZmaXgnXSA9ICcnO1xuXG4gICAgQElucHV0KCkgcHVibGljIHRob3VzYW5kU2VwYXJhdG9yOiBJQ29uZmlnWyd0aG91c2FuZFNlcGFyYXRvciddID0gJyAnO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxNYXJrZXI6IElDb25maWdbJ2RlY2ltYWxNYXJrZXInXSA9ICcuJztcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wU3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ2Ryb3BTcGVjaWFsQ2hhcmFjdGVycyddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaGlkZGVuSW5wdXQ6IElDb25maWdbJ2hpZGRlbklucHV0J10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93TWFza1R5cGVkOiBJQ29uZmlnWydzaG93TWFza1R5cGVkJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZUhvbGRlckNoYXJhY3RlcjogSUNvbmZpZ1sncGxhY2VIb2xkZXJDaGFyYWN0ZXInXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNob3duTWFza0V4cHJlc3Npb246IElDb25maWdbJ3Nob3duTWFza0V4cHJlc3Npb24nXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNob3dUZW1wbGF0ZTogSUNvbmZpZ1snc2hvd1RlbXBsYXRlJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBjbGVhcklmTm90TWF0Y2g6IElDb25maWdbJ2NsZWFySWZOb3RNYXRjaCddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGlvbjogSUNvbmZpZ1sndmFsaWRhdGlvbiddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2VwYXJhdG9yTGltaXQ6IElDb25maWdbJ3NlcGFyYXRvckxpbWl0J10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd05lZ2F0aXZlTnVtYmVyczogSUNvbmZpZ1snYWxsb3dOZWdhdGl2ZU51bWJlcnMnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGxlYWRaZXJvRGF0ZVRpbWU6IElDb25maWdbJ2xlYWRaZXJvRGF0ZVRpbWUnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGxlYWRaZXJvOiBJQ29uZmlnWydsZWFkWmVybyddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdHJpZ2dlck9uTWFza0NoYW5nZTogSUNvbmZpZ1sndHJpZ2dlck9uTWFza0NoYW5nZSddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgYXBtOiBJQ29uZmlnWydhcG0nXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGlucHV0VHJhbnNmb3JtRm46IElDb25maWdbJ2lucHV0VHJhbnNmb3JtRm4nXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIG91dHB1dFRyYW5zZm9ybUZuOiBJQ29uZmlnWydvdXRwdXRUcmFuc2Zvcm1GbiddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMga2VlcENoYXJhY3RlclBvc2l0aW9uczogSUNvbmZpZ1sna2VlcENoYXJhY3RlclBvc2l0aW9ucyddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIG1hc2tGaWxsZWQ6IElDb25maWdbJ21hc2tGaWxsZWQnXSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgX21hc2tWYWx1ZSA9ICcnO1xuXG4gICAgcHJpdmF0ZSBfaW5wdXRWYWx1ZSE6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2NvZGUhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9tYXNrRXhwcmVzc2lvbkFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfanVzdFBhc3RlZCA9IGZhbHNlO1xuXG4gICAgLyoqRm9yIElNRSBjb21wb3NpdGlvbiBldmVudCAqL1xuICAgIHByaXZhdGUgX2lzQ29tcG9zaW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAgIHB1YmxpYyBfbWFza1NlcnZpY2UgPSBpbmplY3QoTmd4TWFza1NlcnZpY2UsIHsgc2VsZjogdHJ1ZSB9KTtcblxuICAgIHByb3RlY3RlZCBfY29uZmlnID0gaW5qZWN0PElDb25maWc+KE5HWF9NQVNLX0NPTkZJRyk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHVibGljIG9uVG91Y2ggPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLFxuICAgICAgICAgICAgc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHN1ZmZpeCxcbiAgICAgICAgICAgIHRob3VzYW5kU2VwYXJhdG9yLFxuICAgICAgICAgICAgZGVjaW1hbE1hcmtlcixcbiAgICAgICAgICAgIGRyb3BTcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgICAgICAgIGhpZGRlbklucHV0LFxuICAgICAgICAgICAgc2hvd01hc2tUeXBlZCxcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyQ2hhcmFjdGVyLFxuICAgICAgICAgICAgc2hvd25NYXNrRXhwcmVzc2lvbixcbiAgICAgICAgICAgIHNob3dUZW1wbGF0ZSxcbiAgICAgICAgICAgIGNsZWFySWZOb3RNYXRjaCxcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBzZXBhcmF0b3JMaW1pdCxcbiAgICAgICAgICAgIGFsbG93TmVnYXRpdmVOdW1iZXJzLFxuICAgICAgICAgICAgbGVhZFplcm9EYXRlVGltZSxcbiAgICAgICAgICAgIGxlYWRaZXJvLFxuICAgICAgICAgICAgdHJpZ2dlck9uTWFza0NoYW5nZSxcbiAgICAgICAgICAgIGFwbSxcbiAgICAgICAgICAgIGlucHV0VHJhbnNmb3JtRm4sXG4gICAgICAgICAgICBvdXRwdXRUcmFuc2Zvcm1GbixcbiAgICAgICAgICAgIGtlZXBDaGFyYWN0ZXJQb3NpdGlvbnMsXG4gICAgICAgIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAobWFza0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUgIT09IG1hc2tFeHByZXNzaW9uLnByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhbWFza0V4cHJlc3Npb24uZmlyc3RDaGFuZ2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxvd05lZ2F0aXZlTnVtYmVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFsbG93TmVnYXRpdmVOdW1iZXJzID0gYWxsb3dOZWdhdGl2ZU51bWJlcnMuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5hbGxvd05lZ2F0aXZlTnVtYmVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycyA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGM6IHN0cmluZykgPT4gYyAhPT0gTWFza0V4cHJlc3Npb24uTUlOVVNcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZS5zcGxpdChNYXNrRXhwcmVzc2lvbi5PUikubGVuZ3RoID4gMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheSA9IG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoTWFza0V4cHJlc3Npb24uT1IpXG4gICAgICAgICAgICAgICAgICAgIC5zb3J0KChhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldE1hc2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheSA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZSA9IG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZSB8fCBNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkc7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPSB0aGlzLl9tYXNrVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIXNwZWNpYWxDaGFyYWN0ZXJzLmN1cnJlbnRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShzcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycyA9IHNwZWNpYWxDaGFyYWN0ZXJzLmN1cnJlbnRWYWx1ZSB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG92ZXJ3cml0ZSB0aGUgbWFzayBhdmFpbGFibGUgcGF0dGVybnMgaWYgYSBwYXR0ZXJuIGhhcyBhY3R1YWxseSBiZWVuIHBhc3NlZCBpblxuICAgICAgICBpZiAocGF0dGVybnMgJiYgcGF0dGVybnMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wYXR0ZXJucyA9IHBhdHRlcm5zLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXBtICYmIGFwbS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwbSA9IGFwbS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ID0gcHJlZml4LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VmZml4KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zdWZmaXggPSBzdWZmaXguY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aG91c2FuZFNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UudGhvdXNhbmRTZXBhcmF0b3IgPSB0aG91c2FuZFNlcGFyYXRvci5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY2ltYWxNYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmRlY2ltYWxNYXJrZXIgPSBkZWNpbWFsTWFya2VyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJvcFNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kcm9wU3BlY2lhbENoYXJhY3RlcnMgPSBkcm9wU3BlY2lhbENoYXJhY3RlcnMuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWRkZW5JbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuaGlkZGVuSW5wdXQgPSBoaWRkZW5JbnB1dC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3dNYXNrVHlwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrVHlwZWQgPSBzaG93TWFza1R5cGVkLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGxhY2VIb2xkZXJDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnBsYWNlSG9sZGVyQ2hhcmFjdGVyID0gcGxhY2VIb2xkZXJDaGFyYWN0ZXIuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG93bk1hc2tFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zaG93bk1hc2tFeHByZXNzaW9uID0gc2hvd25NYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2hvd1RlbXBsYXRlID0gc2hvd1RlbXBsYXRlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYXJJZk5vdE1hdGNoKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2ggPSBjbGVhcklmTm90TWF0Y2guY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS52YWxpZGF0aW9uID0gdmFsaWRhdGlvbi5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zZXBhcmF0b3JMaW1pdCA9IHNlcGFyYXRvckxpbWl0LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubGVhZFplcm9EYXRlVGltZSA9IGxlYWRaZXJvRGF0ZVRpbWUuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkWmVybykge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubGVhZFplcm8gPSBsZWFkWmVyby5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJPbk1hc2tDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnRyaWdnZXJPbk1hc2tDaGFuZ2UgPSB0cmlnZ2VyT25NYXNrQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXRUcmFuc2Zvcm1Gbikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuaW5wdXRUcmFuc2Zvcm1GbiA9IGlucHV0VHJhbnNmb3JtRm4uY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRwdXRUcmFuc2Zvcm1Gbikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uub3V0cHV0VHJhbnNmb3JtRm4gPSBvdXRwdXRUcmFuc2Zvcm1Gbi5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtlZXBDaGFyYWN0ZXJQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmtlZXBDaGFyYWN0ZXJQb3NpdGlvbnMgPSBrZWVwQ2hhcmFjdGVyUG9zaXRpb25zLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHBseU1hc2soKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIHB1YmxpYyB2YWxpZGF0ZSh7IHZhbHVlIH06IEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuX21hc2tTZXJ2aWNlLnZhbGlkYXRpb24gfHwgIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLmlwRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5jcGZDbnBqRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrVmFsdWUuc3RhcnRzV2l0aChNYXNrRXhwcmVzc2lvbi5TRVBBUkFUT1IpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2l0aG91dFZhbGlkYXRpb24uaW5jbHVkZXModGhpcy5fbWFza1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLmNsZWFySWZOb3RNYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVNYXNrcy5pbmNsdWRlcyh0aGlzLl9tYXNrVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVUaW1lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgbGV0IGNvdW50ZXJPZk9wdCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlLnN0YXJ0c1dpdGgoTWFza0V4cHJlc3Npb24uUEVSQ0VOVCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX21hc2tTZXJ2aWNlLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLnBhdHRlcm5zW2tleV0/Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihrZXkpICE9PSB0aGlzLl9tYXNrVmFsdWUubGFzdEluZGV4T2Yoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0OiBzdHJpbmcgPSB0aGlzLl9tYXNrVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGk6IHN0cmluZykgPT4gaSA9PT0ga2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklORyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2ZPcHQgKz0gb3B0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mT3B0Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2Yoa2V5KSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKGtleSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlck9mT3B0ID09PSB0aGlzLl9tYXNrVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5DVVJMWV9CUkFDS0VUU19MRUZUKSA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID09PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5zcGxpdChNYXNrRXhwcmVzc2lvbi5DVVJMWV9CUkFDS0VUU19MRUZUKVsxXSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnNwbGl0KE1hc2tFeHByZXNzaW9uLkNVUkxZX0JSQUNLRVRTX1JJR0hUKVswXVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICA0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKE1hc2tFeHByZXNzaW9uLlNZTUJPTF9TVEFSKSA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoTWFza0V4cHJlc3Npb24uU1lNQk9MX1NUQVIpKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5TWU1CT0xfUVVFU1RJT04pID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5TWU1CT0xfUVVFU1RJT04pKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKE1hc2tFeHByZXNzaW9uLkNVUkxZX0JSQUNLRVRTX0xFRlQpID09PSAxXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5TWU1CT0xfU1RBUikgPT09IC0xIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoTWFza0V4cHJlc3Npb24uU1lNQk9MX1FVRVNUSU9OKSA9PT0gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IFN0cmluZyh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMuX21hc2tWYWx1ZS5zcGxpdCgnKicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdGhpcy5fbWFza1NlcnZpY2UuZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuY2hlY2tEcm9wU3BlY2lhbENoYXJBbW91bnQodGhpcy5fbWFza1ZhbHVlKSAtXG4gICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mT3B0XG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5wcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9tYXNrVmFsdWUubGVuZ3RoICsgdGhpcy5wcmVmaXgubGVuZ3RoIC0gY291bnRlck9mT3B0XG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCAtIGNvdW50ZXJPZk9wdDtcblxuICAgICAgICAgICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXhBcnJheSA9IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXhBcnJheSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMobGFzdEluZGV4QXJyYXlbMF0gYXMgc3RyaW5nKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nKHZhbHVlKS5pbmNsdWRlcyhsYXN0SW5kZXhBcnJheVswXSA/PyAnJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmRyb3BTcGVjaWFsQ2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwZWNpYWwgPSB2YWx1ZS5zcGxpdChsYXN0SW5kZXhBcnJheVswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lhbFtzcGVjaWFsLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gbGFzdEluZGV4QXJyYXkubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICgobGFzdEluZGV4QXJyYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleEFycmF5WzBdIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxhc3RJbmRleEFycmF5IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZHJvcFNwZWNpYWxDaGFyYWN0ZXJzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubGVuZ3RoID49IGxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKE1hc2tFeHByZXNzaW9uLlNZTUJPTF9TVEFSKSA9PT0gMSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKE1hc2tFeHByZXNzaW9uLlNZTUJPTF9RVUVTVElPTikgPT09IDFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrRmlsbGVkLmVtaXQoKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJylcbiAgICBwdWJsaWMgb25QYXN0ZSgpIHtcbiAgICAgICAgdGhpcy5fanVzdFBhc3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uTW9kZWxDaGFuZ2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gb24gZm9ybSByZXNldCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYWN0dWFsVmFsdWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHZhbHVlID09PSBNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkcgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUgPSB0aGlzLl9tYXNrU2VydmljZS5nZXRBY3R1YWxWYWx1ZShcbiAgICAgICAgICAgICAgICBNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uSW5wdXQoZTogQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBJZiBJTUUgaXMgY29tcG9zaW5nIHRleHQsIHdlIHdhaXQgZm9yIHRoZSBjb21wb3NlZCB0ZXh0LlxuICAgICAgICBpZiAodGhpcy5faXNDb21wb3NpbmcpIHJldHVybjtcblxuICAgICAgICBjb25zdCBlbDogSFRNTElucHV0RWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkVmFsdWUgPSB0aGlzLl9tYXNrU2VydmljZS5pbnB1dFRyYW5zZm9ybUZuKGVsLnZhbHVlKTtcbiAgICAgICAgaWYgKGVsLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkVmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGVsLnZhbHVlID0gdHJhbnNmb3JtZWRWYWx1ZS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldE1hc2soKTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoZWwudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uOiBudW1iZXIgPVxuICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSArIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd01hc2tUeXBlZCAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmtlZXBDaGFyYWN0ZXJQb3NpdGlvbnMgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucGxhY2VIb2xkZXJDaGFyYWN0ZXIubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0U3ltYm9sID0gZWwudmFsdWUuc2xpY2UocG9zaXRpb24gLSAxLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeExlbmd0aCA9IHRoaXMucHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tTeW1ib2xzOiBib29sZWFuID0gdGhpcy5fbWFza1NlcnZpY2UuX2NoZWNrU3ltYm9sTWFzayhcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb25bcG9zaXRpb24gLSAxIC0gcHJlZml4TGVuZ3RoXSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklOR1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja1NwZWNpYWxDaGFyYWN0ZXI6IGJvb2xlYW4gPSB0aGlzLl9tYXNrU2VydmljZS5fY2hlY2tTeW1ib2xNYXNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbltwb3NpdGlvbiArIDEgLSBwcmVmaXhMZW5ndGhdID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdFJhbmdlQmFja3NwYWNlOiBib29sZWFuID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNlbFN0YXJ0ID09PSB0aGlzLl9tYXNrU2VydmljZS5zZWxFbmQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbFN0YXJ0ID0gTnVtYmVyKHRoaXMuX21hc2tTZXJ2aWNlLnNlbFN0YXJ0KSAtIHByZWZpeExlbmd0aCA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsRW5kID0gTnVtYmVyKHRoaXMuX21hc2tTZXJ2aWNlLnNlbEVuZCkgLSBwcmVmaXhMZW5ndGggPz8gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RSYW5nZUJhY2tzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5zZWxTdGFydCA9PT0gcHJlZml4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duLnNsaWNlKDAsIHNlbEVuZCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5zcGxpdCh0aGlzLnByZWZpeCkuam9pbignJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2VsU3RhcnQgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duLmxlbmd0aCArIHByZWZpeExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duLnNsaWNlKHNlbFN0YXJ0LCBzZWxFbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQodGhpcy5wcmVmaXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIHNlbFN0YXJ0KSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93bi5zbGljZShzZWxTdGFydCwgc2VsRW5kKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxFbmQgKyBwcmVmaXhMZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd24ubGVuZ3RoICsgcHJlZml4TGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIC0gdGhpcy5wcmVmaXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gKyAxIC0gdGhpcy5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0UmFuZ2VCYWNrc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxTdGFydCA9PT0gMSAmJiB0aGlzLnByZWZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wbGFjZUhvbGRlckNoYXJhY3RlciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCh0aGlzLnByZWZpeClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQodGhpcy5zdWZmaXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VmZml4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0MSA9IGVsLnZhbHVlLnN1YnN0cmluZygwLCBwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQyID0gZWwudmFsdWUuc3Vic3RyaW5nKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEgKyB0aGlzLl9tYXNrU2VydmljZS5wbGFjZUhvbGRlckNoYXJhY3RlciArIHBhcnQyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29kZSAhPT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrU3ltYm9scyAmJiAhY2hlY2tTcGVjaWFsQ2hhcmFjdGVyICYmIHNlbGVjdFJhbmdlQmFja3NwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBOdW1iZXIoZWwuc2VsZWN0aW9uU3RhcnQpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3BlY2lhbENoYXJhY3RlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUuc2xpY2UocG9zaXRpb24gKyAxLCBwb3NpdGlvbiArIDIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZS5zbGljZSgwLCBwb3NpdGlvbiAtIDEpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN5bWJvbCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlLnNsaWNlKHBvc2l0aW9uICsgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrU3ltYm9scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUuc2xpY2UoMCwgcG9zaXRpb24gLSAxKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3ltYm9sICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShwb3NpdGlvbiArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQodGhpcy5zdWZmaXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBjYXJldFNoaWZ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgYmFja3NwYWNlU2hpZnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29kZSA9PT0gTWFza0V4cHJlc3Npb24uREVMRVRFICYmIE1hc2tFeHByZXNzaW9uLlNFUEFSQVRPUikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kZWxldGVkU3BlY2lhbENoYXJhY3RlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggPj0gdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24ubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2RlICE9PSBNYXNrRXhwcmVzc2lvbi5CQUNLU1BBQ0UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPT09IE1hc2tFeHByZXNzaW9uLkRBWVNfTU9OVEhTX1lFQVJTICYmXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIDwgMTBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRTeW1ib2wgPSB0aGlzLl9pbnB1dFZhbHVlLnNsaWNlKHBvc2l0aW9uIC0gMSwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLnNsaWNlKDAsIHBvc2l0aW9uIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTeW1ib2wgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5zbGljZShwb3NpdGlvbiArIDEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPT09IE1hc2tFeHByZXNzaW9uLkhPVVJTX01JTlVURVNfU0VDT05EUyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwbVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fanVzdFBhc3RlZCAmJiBlbC52YWx1ZS5zbGljZSgwLCAyKSA9PT0gTWFza0V4cHJlc3Npb24uRE9VQkxFX1pFUk8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlID0gZWwudmFsdWUuc2xpY2UoMSwgMikgKyBlbC52YWx1ZS5zbGljZSgyLCBlbC52YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlID09PSBNYXNrRXhwcmVzc2lvbi5ET1VCTEVfWkVST1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTWFza0V4cHJlc3Npb24uTlVNQkVSX1pFUk9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5VmFsdWVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fanVzdFBhc3RlZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29kZSA9PT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFIHx8IHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkRFTEVURSxcbiAgICAgICAgICAgICAgICAgICAgKHNoaWZ0OiBudW1iZXIsIF9iYWNrc3BhY2VTaGlmdDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fanVzdFBhc3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FyZXRTaGlmdCA9IHNoaWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFja3NwYWNlU2hpZnQgPSBfYmFja3NwYWNlU2hpZnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIG9ubHkgc2V0IHRoZSBzZWxlY3Rpb24gaWYgdGhlIGVsZW1lbnQgaXMgYWN0aXZlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKSAhPT0gZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwb3NpdGlvbiBhZnRlciBhcHBseVZhbHVlQ2hhbmdlcyB0byBwcmV2ZW50IGN1cnNvciBvbiB3cm9uZyBwb3NpdGlvbiB3aGVuIGl0IGhhcyBhbiBhcnJheSBvZiBtYXNrRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29kZSA9PT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5zbGljZShwb3NpdGlvbiAtIDEsIHBvc2l0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcG9zaXRpb24gLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICsgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPT09IDEgJiYgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggPT09IDEgPyBudWxsIDogdGhpcy5fcG9zaXRpb247XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uVG9BcHBseTogbnVtYmVyID0gdGhpcy5fcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCArIHBvc2l0aW9uICsgY2FyZXRTaGlmdFxuICAgICAgICAgICAgICAgICAgICA6IHBvc2l0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fY29kZSA9PT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFICYmICFiYWNrc3BhY2VTaGlmdCA/IDAgOiBjYXJldFNoaWZ0KTtcblxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvblRvQXBwbHkgPiB0aGlzLl9nZXRBY3R1YWxJbnB1dExlbmd0aCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9BcHBseSA9IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvblRvQXBwbHkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9BcHBseSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHBvc2l0aW9uVG9BcHBseSwgcG9zaXRpb25Ub0FwcGx5KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgJ05neC1tYXNrIHdyaXRlVmFsdWUgd29yayB3aXRoIHN0cmluZyB8IG51bWJlciwgeW91ciBjdXJyZW50IHZhbHVlOicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5VmFsdWVDaGFuZ2VzKFxuICAgICAgICAgICAgICAgIGVsLnZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB0aGlzLl9qdXN0UGFzdGVkLFxuICAgICAgICAgICAgICAgIHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSB8fCB0aGlzLl9jb2RlID09PSBNYXNrRXhwcmVzc2lvbi5ERUxFVEVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJTUUgc3RhcnRzXG4gICAgQEhvc3RMaXN0ZW5lcignY29tcG9zaXRpb25zdGFydCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQ29tcG9zaXRpb25TdGFydCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXNDb21wb3NpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIElNRSBjb21wbGV0ZXNcbiAgICBASG9zdExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQ29tcG9zaXRpb25FbmQoZTogQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9qdXN0UGFzdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vbklucHV0KGUpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkJsdXIoZTogQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBlbDogSFRNTElucHV0RWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAodGhpcy5sZWFkWmVybyAmJiBlbC52YWx1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiB0aGlzLmRlY2ltYWxNYXJrZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFza0V4cHJlc3Npb24gPSB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVjaXNpb24gPSBOdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb24ubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAocHJlY2lzaW9uID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZSA9IHRoaXMuc3VmZml4ID8gZWwudmFsdWUuc3BsaXQodGhpcy5zdWZmaXgpLmpvaW4oJycpIDogZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY2ltYWxQYXJ0ID0gZWwudmFsdWUuc3BsaXQodGhpcy5kZWNpbWFsTWFya2VyKVsxXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlID0gZWwudmFsdWUuaW5jbHVkZXModGhpcy5kZWNpbWFsTWFya2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBlbC52YWx1ZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2tFeHByZXNzaW9uLk5VTUJFUl9aRVJPLnJlcGVhdChwcmVjaXNpb24gLSBkZWNpbWFsUGFydC5sZW5ndGgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZWwudmFsdWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY2ltYWxNYXJrZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrRXhwcmVzc2lvbi5OVU1CRVJfWkVSTy5yZXBlYXQocHJlY2lzaW9uKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VmZml4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmNsZWFySWZOb3RNYXRjaEZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblRvdWNoKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNsaWNrKGU6IE1vdXNlRXZlbnQgfCBDdXN0b21LZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCBwb3NTdGFydCA9IDA7XG4gICAgICAgIGNvbnN0IHBvc0VuZCA9IDA7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ICE9PSBudWxsICYmXG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9PT0gZWwuc2VsZWN0aW9uRW5kICYmXG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA+IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggJiZcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgKGUgYXMgYW55KS5rZXlDb2RlICE9PSAzOFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza1R5cGVkICYmICF0aGlzLmtlZXBDaGFyYWN0ZXJQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgc2hvd2luZyB0aGUgbWFzayBpbiB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93biA9IHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrSW5JbnB1dCgpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ICsgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd24gPT09IGVsLnZhbHVlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCBPTkxZIGNvbnRhaW5zIHRoZSBtYXNrLCBzbyBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydFxuICAgICAgICAgICAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShwb3NTdGFydCwgcG9zRW5kKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgY29udGFpbnMgc29tZSBjaGFyYWN0ZXJzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnNlbGVjdGlvblN0YXJ0ID4gdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBjbGlja2VkIGJleW9uZCBvdXIgdmFsdWUncyBsZW5ndGgsIHBvc2l0aW9uIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiBvdXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dFZhbHVlOiBzdHJpbmcgfCBudWxsID1cbiAgICAgICAgICAgIGVsICYmXG4gICAgICAgICAgICAoZWwudmFsdWUgPT09IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ICsgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd25cbiAgICAgICAgICAgICAgICA6IGVsLnZhbHVlKTtcblxuICAgICAgICAvKiogRml4IG9mIGN1cnNvciBwb3NpdGlvbiBqdW1waW5nIHRvIGVuZCBpbiBtb3N0IGJyb3dzZXJzIG5vIG1hdHRlciB3aGVyZSBjdXJzb3IgaXMgaW5zZXJ0ZWQgb25Gb2N1cyAqL1xuICAgICAgICBpZiAoZWwgJiYgZWwudmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgICAgICAgICAgZWwudmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIGZpeCBvZiBjdXJzb3IgcG9zaXRpb24gd2l0aCBwcmVmaXggd2hlbiBtb3VzZSBjbGljayBvY2N1ciAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbCAmJlxuICAgICAgICAgICAgZWwudHlwZSAhPT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICgoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSB8fCAoZWwuc2VsZWN0aW9uRW5kIGFzIG51bWJlcikpIDw9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvKiogc2VsZWN0IG9ubHkgaW5zZXJ0ZWQgdGV4dCAqL1xuICAgICAgICBpZiAoZWwgJiYgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpID4gdGhpcy5fZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gdGhpcy5fZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5RG93bihlOiBDdXN0b21LZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgIC8vIFVzZXIgZmluYWxpemUgdGhlaXIgY2hvaWNlIGZyb20gSU1FIGNvbXBvc2l0aW9uLCBzbyB0cmlnZ2VyIG9uSW5wdXQoKSBmb3IgdGhlIGNvbXBvc2VkIHRleHQuXG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHRoaXMub25Db21wb3NpdGlvbkVuZChlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvZGUgPSBlLmNvZGUgPyBlLmNvZGUgOiBlLmtleTtcbiAgICAgICAgY29uc3QgZWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gZWwudmFsdWU7XG4gICAgICAgIHRoaXMuX3NldE1hc2soKTtcblxuICAgICAgICBpZiAoZWwudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gTWFza0V4cHJlc3Npb24uQVJST1dfVVApIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZS5rZXkgPT09IE1hc2tFeHByZXNzaW9uLkFSUk9XX0xFRlQgfHxcbiAgICAgICAgICAgICAgICBlLmtleSA9PT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFIHx8XG4gICAgICAgICAgICAgICAgZS5rZXkgPT09IE1hc2tFeHByZXNzaW9uLkRFTEVURVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSBNYXNrRXhwcmVzc2lvbi5CQUNLU1BBQ0UgJiYgZWwudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gZWwuc2VsZWN0aW9uRW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSAmJiAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBzcGVjaWFsQ2hhcnMgaXMgZmFsc2UsIChzaG91bGRuJ3QgZXZlciBoYXBwZW4pIHRoZW4gc2V0IHRvIHRoZSBkZWZhdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzID0gdGhpcy5zcGVjaWFsQ2hhcmFjdGVycz8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc3BlY2lhbENoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fY29uZmlnLnNwZWNpYWxDaGFyYWN0ZXJzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWZpeC5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSA8PSB0aGlzLnByZWZpeC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSh0aGlzLnByZWZpeC5sZW5ndGgsIGVsLnNlbGVjdGlvbkVuZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggIT09IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgIT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlWyhlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpIC0gMV0gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodGhpcy5wcmVmaXgubGVuZ3RoID49IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpID4gdGhpcy5wcmVmaXgubGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXgubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2VsZWN0aW9uT25EZWxldGlvbihlbCk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpIDw9IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpIDw9IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJzb3JTdGFydDogbnVtYmVyIHwgbnVsbCA9IGVsLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZS5rZXkgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSAmJlxuICAgICAgICAgICAgICAgICAgICAhZWwucmVhZE9ubHkgJiZcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yU3RhcnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID09PSBlbC52YWx1ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUubGVuZ3RoICE9PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ID8gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5TWFzayhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgISF0aGlzLnN1ZmZpeCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc3VmZml4Lmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAtIHRoaXMuc3VmZml4Lmxlbmd0aCA8IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggLSB0aGlzLnN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgKGUuY29kZSA9PT0gJ0tleUEnICYmIGUuY3RybEtleSkgfHxcbiAgICAgICAgICAgICAgICAoZS5jb2RlID09PSAnS2V5QScgJiYgZS5tZXRhS2V5KSAvLyBDbWQgKyBBIChNYWMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0aGlzLl9nZXRBY3R1YWxJbnB1dExlbmd0aCgpKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zZWxTdGFydCA9IGVsLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2VsRW5kID0gZWwuc2VsZWN0aW9uRW5kO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEl0IHdyaXRlcyB0aGUgdmFsdWUgaW4gdGhlIGlucHV0ICovXG4gICAgLy8gcHVibGljIGFzeW5jIHdyaXRlVmFsdWUoY29udHJvbFZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcHVibGljIGFzeW5jIHdyaXRlVmFsdWUoXG4gICAgICAgIGNvbnRyb2xWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyOyBkaXNhYmxlPzogYm9vbGVhbiB9XG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udHJvbFZhbHVlID09PSAnb2JqZWN0JyAmJiBjb250cm9sVmFsdWUgIT09IG51bGwgJiYgJ3ZhbHVlJyBpbiBjb250cm9sVmFsdWUpIHtcbiAgICAgICAgICAgIGlmICgnZGlzYWJsZScgaW4gY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNhYmxlZFN0YXRlKEJvb2xlYW4oY29udHJvbFZhbHVlLmRpc2FibGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgY29udHJvbFZhbHVlID0gY29udHJvbFZhbHVlLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBjb250cm9sVmFsdWUgPSB0aGlzLmlucHV0VHJhbnNmb3JtRm5cbiAgICAgICAgICAgICAgICA/IHRoaXMuaW5wdXRUcmFuc2Zvcm1Gbihjb250cm9sVmFsdWUpXG4gICAgICAgICAgICAgICAgOiBjb250cm9sVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGNvbnRyb2xWYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGVvZiBjb250cm9sVmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICBjb250cm9sVmFsdWUgPT09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGxldCBpbnB1dFZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gY29udHJvbFZhbHVlO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiBpbnB1dFZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5zdGFydHNXaXRoKE1hc2tFeHByZXNzaW9uLlNFUEFSQVRPUilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSBTdHJpbmcoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxlRGVjaW1hbE1hcmtlciA9IHRoaXMuX21hc2tTZXJ2aWNlLmN1cnJlbnRMb2NhbGVEZWNpbWFsTWFya2VyKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX21hc2tTZXJ2aWNlLmRlY2ltYWxNYXJrZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmRlY2ltYWxNYXJrZXIgIT09IGxvY2FsZURlY2ltYWxNYXJrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVEZWNpbWFsTWFya2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmRlY2ltYWxNYXJrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlucHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubGVhZFplcm8gJiZcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcFNwZWNpYWxDaGFyYWN0ZXJzICE9PSBmYWxzZVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IHRoaXMuX21hc2tTZXJ2aWNlLl9jaGVja1ByZWNpc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLmRlY2ltYWxNYXJrZXIgPT09IE1hc2tFeHByZXNzaW9uLkNPTU1BKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKE1hc2tFeHByZXNzaW9uLkRPVCwgTWFza0V4cHJlc3Npb24uQ09NTUEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXNrRXhwcmVzc2lvbj8uc3RhcnRzV2l0aChNYXNrRXhwcmVzc2lvbi5TRVBBUkFUT1IpICYmIHRoaXMubGVhZFplcm8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5TWFzayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlPy50b1N0cmluZygpID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuaXNOdW1iZXJWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5wdXRWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUgPSBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fc2V0TWFzaygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChpbnB1dFZhbHVlICYmIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAodGhpcy5fbWFza1NlcnZpY2UucHJlZml4IHx8IHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrVHlwZWQpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBzZXJ2aWNlIHdlIGtub3cgd2UgYXJlIHdyaXRpbmcgdmFsdWUgc28gdGhhdCB0cmlnZ2VyaW5nIG9uQ2hhbmdlIGZ1bmN0aW9uIHdvbid0IGhhcHBlbiBkdXJpbmcgYXBwbHlNYXNrXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuaW5wdXRUcmFuc2Zvcm1GbiAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLl9tYXNrU2VydmljZS53cml0aW5nVmFsdWUgPSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbXG4gICAgICAgICAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5TWFzayhpbnB1dFZhbHVlLCB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiksXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIHNlcnZpY2Uga25vdyB3ZSd2ZSBmaW5pc2hlZCB3cml0aW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuaW5wdXRUcmFuc2Zvcm1GbiAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICA/ICh0aGlzLl9tYXNrU2VydmljZS53cml0aW5nVmFsdWUgPSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZm9ybUVsZW1lbnRQcm9wZXJ0eSA9IFsndmFsdWUnLCBpbnB1dFZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUgPSBpbnB1dFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICdOZ3gtbWFzayB3cml0ZVZhbHVlIHdvcmsgd2l0aCBzdHJpbmcgfCBudW1iZXIsIHlvdXIgY3VycmVudCB2YWx1ZTonLFxuICAgICAgICAgICAgICAgIHR5cGVvZiBjb250cm9sVmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogdHlwZW9mIHRoaXMub25DaGFuZ2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiB0eXBlb2YgdGhpcy5vblRvdWNoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEFjdGl2ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50T3JTaGFkb3dSb290ID0gdGhpcy5kb2N1bWVudCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdEVsID0gZG9jdW1lbnQ/LmFjdGl2ZUVsZW1lbnQ/LnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmICghc2hhZG93Um9vdEVsPy5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRBY3RpdmVFbGVtZW50KHNoYWRvd1Jvb3RFbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tTZWxlY3Rpb25PbkRlbGV0aW9uKGVsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5taW4oXG4gICAgICAgICAgICBNYXRoLm1heCh0aGlzLnByZWZpeC5sZW5ndGgsIGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlciksXG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAtIHRoaXMuc3VmZml4Lmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICBlbC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHRoaXMucHJlZml4Lmxlbmd0aCwgZWwuc2VsZWN0aW9uRW5kIGFzIG51bWJlciksXG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAtIHRoaXMuc3VmZml4Lmxlbmd0aFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBJdCBkaXNhYmxlcyB0aGUgaW5wdXQgZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZm9ybUVsZW1lbnRQcm9wZXJ0eSA9IFsnZGlzYWJsZWQnLCBpc0Rpc2FibGVkXTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByaXZhdGUgX2FwcGx5TWFzaygpOiBhbnkge1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9IHRoaXMuX21hc2tTZXJ2aWNlLl9yZXBlYXRQYXR0ZXJuU3ltYm9scyhcbiAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZSB8fCAnJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gW1xuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5TWFzayh0aGlzLl9pbnB1dFZhbHVlLCB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVUaW1lKHZhbHVlOiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJvd01hc2tMZW46IG51bWJlciA9IHRoaXMuX21hc2tWYWx1ZVxuICAgICAgICAgICAgLnNwbGl0KE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklORylcbiAgICAgICAgICAgIC5maWx0ZXIoKHM6IHN0cmluZykgPT4gcyAhPT0gJzonKS5sZW5ndGg7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBEb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgZm9yIG9wdGlvbmFsIGZvcm0gY29udHJvbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKCsodmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gPz8gLTEpID09PSAwICYmIHZhbHVlLmxlbmd0aCA8IHJvd01hc2tMZW4pIHx8XG4gICAgICAgICAgICB2YWx1ZS5sZW5ndGggPD0gcm93TWFza0xlbiAtIDJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEFjdHVhbElucHV0TGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUubGVuZ3RoIHx8XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGggKyB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfY3JlYXRlVmFsaWRhdGlvbkVycm9yKGFjdHVhbFZhbHVlOiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hc2s6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZE1hc2s6IHRoaXMuX21hc2tWYWx1ZSxcbiAgICAgICAgICAgICAgICBhY3R1YWxWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0TWFzaygpIHtcbiAgICAgICAgdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheS5zb21lKChtYXNrKTogYm9vbGVhbiB8IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3BlY2lhbENoYXJ0OiBib29sZWFuID0gbWFza1xuICAgICAgICAgICAgICAgIC5zcGxpdChNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkcpXG4gICAgICAgICAgICAgICAgLnNvbWUoKGNoYXIpID0+IHRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGNoYXIpKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoc3BlY2lhbENoYXJ0ICYmIHRoaXMuX2lucHV0VmFsdWUgJiYgIW1hc2suaW5jbHVkZXMoTWFza0V4cHJlc3Npb24uTEVUVEVSX1MpKSB8fFxuICAgICAgICAgICAgICAgIG1hc2suaW5jbHVkZXMoTWFza0V4cHJlc3Npb24uQ1VSTFlfQlJBQ0tFVFNfTEVGVClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3QgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5yZW1vdmVNYXNrKHRoaXMuX2lucHV0VmFsdWUpPy5sZW5ndGggPD1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucmVtb3ZlTWFzayhtYXNrKT8ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrLmluY2x1ZGVzKE1hc2tFeHByZXNzaW9uLkNVUkxZX0JSQUNLRVRTX0xFRlQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fbWFza1NlcnZpY2UuX3JlcGVhdFBhdHRlcm5TeW1ib2xzKG1hc2spXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWFzaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5W3RoaXMuX21hc2tFeHByZXNzaW9uQXJyYXkubGVuZ3RoIC0gMV0gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklORztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFza0V4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uaW5jbHVkZXMoTWFza0V4cHJlc3Npb24uQ1VSTFlfQlJBQ0tFVFNfTEVGVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9tYXNrU2VydmljZS5fcmVwZWF0UGF0dGVyblN5bWJvbHMoZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2s6IGJvb2xlYW4gPSB0aGlzLl9pbnB1dFZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8uc3BsaXQoTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HKVxuICAgICAgICAgICAgICAgICAgICAuZXZlcnkoKGNoYXJhY3RlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4TWFzayA9IG1hc2suY2hhckF0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXNrU2VydmljZS5fY2hlY2tTeW1ib2xNYXNrKGNoYXJhY3RlciwgaW5kZXhNYXNrKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZSA9IHRoaXMubWFza0V4cHJlc3Npb24gPSB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9IG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
922
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc2stbGliL3NyYy9saWIvbmd4LW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixVQUFVLEVBQ1YsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHSCxhQUFhLEVBQ2IsaUJBQWlCLEdBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEIsT0FBTyxFQUFXLGVBQWUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVNwRCw2QkFBNkI7QUFDN0IsaUNBQWlDO0FBa0JqQyxNQUFNLE9BQU8sZ0JBQWdCO0lBbUV6QjtJQUNJLDJCQUEyQjtJQUNELFFBQWEsRUFDSixPQUFnQixFQUM1QyxZQUE0QjtRQUZULGFBQVEsR0FBUixRQUFRLENBQUs7UUFDSixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQzVDLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQXRFdkMsMkRBQTJEO1FBQ3JDLG1CQUFjLEdBQThCLEVBQUUsQ0FBQztRQUVyRCxzQkFBaUIsR0FBaUMsRUFBRSxDQUFDO1FBRXJELGFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBRW5DLFdBQU0sR0FBc0IsRUFBRSxDQUFDO1FBRS9CLFdBQU0sR0FBc0IsRUFBRSxDQUFDO1FBRS9CLHNCQUFpQixHQUFpQyxHQUFHLENBQUM7UUFFdEQsa0JBQWEsR0FBNkIsR0FBRyxDQUFDO1FBRTlDLDBCQUFxQixHQUE0QyxJQUFJLENBQUM7UUFFdEUsZ0JBQVcs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Z0JBRVUsb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUVVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFFVSxRQUFRO3NCQUF2QixLQUFLO2dCQUVVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFFVSxHQUFHO3NCQUFsQixLQUFLO2dCQUVVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFFVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBRVUsc0JBQXNCO3NCQUFyQyxLQUFLO2dCQUVXLFVBQVU7c0JBQTFCLE1BQU07Z0JBMlNBLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPO2dCQU1kLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWNsQyxPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWtPMUIsa0JBQWtCO3NCQUR4QixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU9yQyxnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUW5DLE1BQU07c0JBRFosWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBZ0N6QixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1FMUIsU0FBUztzQkFEZixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybUNvbnRyb2wsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDdXN0b21LZXlib2FyZEV2ZW50IH0gZnJvbSAnLi9jdXN0b20ta2V5Ym9hcmQtZXZlbnQnO1xuaW1wb3J0IHsgSUNvbmZpZywgTkdYX01BU0tfQ09ORklHLCB0aW1lTWFza3MsIHdpdGhvdXRWYWxpZGF0aW9uIH0gZnJvbSAnLi9uZ3gtbWFzay5jb25maWcnO1xuaW1wb3J0IHsgTmd4TWFza1NlcnZpY2UgfSBmcm9tICcuL25neC1tYXNrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFza0V4cHJlc3Npb24gfSBmcm9tICcuL25neC1tYXNrLWV4cHJlc3Npb24uZW51bSc7XG5cbmludGVyZmFjZSBJT25DaGFnZSB7XG4gICAgKF86IGFueSk6IHZvaWRcbn1cbmludGVyZmFjZSBJT25Ub3VjaCB7XG4gICAgKCk6IHZvaWRcbn1cbi8vIHRzbGludDpkaXNhYmxlIGRlcHJlY2F0aW9uXG4vLyB0c2xpbnQ6ZGlzYWJsZSBuby1pbnB1dC1yZW5hbWVcbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbbWFza10sIHRleHRhcmVhW21hc2tdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hNYXNrRGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4TWFza0RpcmVjdGl2ZSksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgTmd4TWFza1NlcnZpY2UsXG4gICAgXSxcbiAgICBleHBvcnRBczogJ21hc2ssbmd4TWFzaycsXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBWYWxpZGF0b3Ige1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gICAgQElucHV0KCdtYXNrJykgcHVibGljIG1hc2tFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ3NwZWNpYWxDaGFyYWN0ZXJzJ10gPSBbXTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBwYXR0ZXJuczogSUNvbmZpZ1sncGF0dGVybnMnXSA9IHt9O1xuXG4gICAgQElucHV0KCkgcHVibGljIHByZWZpeDogSUNvbmZpZ1sncHJlZml4J10gPSAnJztcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzdWZmaXg6IElDb25maWdbJ3N1ZmZpeCddID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3I6IElDb25maWdbJ3Rob3VzYW5kU2VwYXJhdG9yJ10gPSAnICc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZGVjaW1hbE1hcmtlcjogSUNvbmZpZ1snZGVjaW1hbE1hcmtlciddID0gJy4nO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRyb3BTcGVjaWFsQ2hhcmFjdGVyczogSUNvbmZpZ1snZHJvcFNwZWNpYWxDaGFyYWN0ZXJzJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWRkZW5JbnB1dDogSUNvbmZpZ1snaGlkZGVuSW5wdXQnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNob3dNYXNrVHlwZWQ6IElDb25maWdbJ3Nob3dNYXNrVHlwZWQnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlSG9sZGVyQ2hhcmFjdGVyOiBJQ29uZmlnWydwbGFjZUhvbGRlckNoYXJhY3RlciddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd25NYXNrRXhwcmVzc2lvbjogSUNvbmZpZ1snc2hvd25NYXNrRXhwcmVzc2lvbiddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1RlbXBsYXRlOiBJQ29uZmlnWydzaG93VGVtcGxhdGUnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGNsZWFySWZOb3RNYXRjaDogSUNvbmZpZ1snY2xlYXJJZk5vdE1hdGNoJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWxpZGF0aW9uOiBJQ29uZmlnWyd2YWxpZGF0aW9uJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZXBhcmF0b3JMaW1pdDogSUNvbmZpZ1snc2VwYXJhdG9yTGltaXQnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGFsbG93TmVnYXRpdmVOdW1iZXJzOiBJQ29uZmlnWydhbGxvd05lZ2F0aXZlTnVtYmVycyddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgbGVhZFplcm9EYXRlVGltZTogSUNvbmZpZ1snbGVhZFplcm9EYXRlVGltZSddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgbGVhZFplcm86IElDb25maWdbJ2xlYWRaZXJvJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cmlnZ2VyT25NYXNrQ2hhbmdlOiBJQ29uZmlnWyd0cmlnZ2VyT25NYXNrQ2hhbmdlJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBhcG06IElDb25maWdbJ2FwbSddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRUcmFuc2Zvcm1GbjogSUNvbmZpZ1snaW5wdXRUcmFuc2Zvcm1GbiddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgb3V0cHV0VHJhbnNmb3JtRm46IElDb25maWdbJ291dHB1dFRyYW5zZm9ybUZuJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBrZWVwQ2hhcmFjdGVyUG9zaXRpb25zOiBJQ29uZmlnWydrZWVwQ2hhcmFjdGVyUG9zaXRpb25zJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbWFza0ZpbGxlZDogSUNvbmZpZ1snbWFza0ZpbGxlZCddID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHJpdmF0ZSBfbWFza1ZhbHVlID0gJyc7XG5cbiAgICBwcml2YXRlIF9pbnB1dFZhbHVlITogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBfcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfY29kZSE6IHN0cmluZztcblxuICAgIHByaXZhdGUgX21hc2tFeHByZXNzaW9uQXJyYXk6IHN0cmluZ1tdID0gW107XG5cbiAgICBwcml2YXRlIF9qdXN0UGFzdGVkID0gZmFsc2U7XG5cbiAgICAvKipGb3IgSU1FIGNvbXBvc2l0aW9uIGV2ZW50ICovXG4gICAgcHJpdmF0ZSBfaXNDb21wb3NpbmcgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgQEluamVjdChOR1hfTUFTS19DT05GSUcpIHByb3RlY3RlZCBfY29uZmlnOiBJQ29uZmlnLFxuICAgICAgICBwdWJsaWMgX21hc2tTZXJ2aWNlOiBOZ3hNYXNrU2VydmljZVxuICAgICkge31cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24sIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwdWJsaWMgb25DaGFuZ2U6IElPbkNoYWdlID0gKF86IGFueSkgPT4ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHVibGljIG9uVG91Y2g6IElPblRvdWNoID0gKCkgPT4ge307XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBtYXNrRXhwcmVzc2lvbixcbiAgICAgICAgICAgIHNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgICAgICAgcGF0dGVybnMsXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgICBzdWZmaXgsXG4gICAgICAgICAgICB0aG91c2FuZFNlcGFyYXRvcixcbiAgICAgICAgICAgIGRlY2ltYWxNYXJrZXIsXG4gICAgICAgICAgICBkcm9wU3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICAgICAgICBoaWRkZW5JbnB1dCxcbiAgICAgICAgICAgIHNob3dNYXNrVHlwZWQsXG4gICAgICAgICAgICBwbGFjZUhvbGRlckNoYXJhY3RlcixcbiAgICAgICAgICAgIHNob3duTWFza0V4cHJlc3Npb24sXG4gICAgICAgICAgICBzaG93VGVtcGxhdGUsXG4gICAgICAgICAgICBjbGVhcklmTm90TWF0Y2gsXG4gICAgICAgICAgICB2YWxpZGF0aW9uLFxuICAgICAgICAgICAgc2VwYXJhdG9yTGltaXQsXG4gICAgICAgICAgICBhbGxvd05lZ2F0aXZlTnVtYmVycyxcbiAgICAgICAgICAgIGxlYWRaZXJvRGF0ZVRpbWUsXG4gICAgICAgICAgICBsZWFkWmVybyxcbiAgICAgICAgICAgIHRyaWdnZXJPbk1hc2tDaGFuZ2UsXG4gICAgICAgICAgICBhcG0sXG4gICAgICAgICAgICBpbnB1dFRyYW5zZm9ybUZuLFxuICAgICAgICAgICAgb3V0cHV0VHJhbnNmb3JtRm4sXG4gICAgICAgICAgICBrZWVwQ2hhcmFjdGVyUG9zaXRpb25zLFxuICAgICAgICB9ID0gY2hhbmdlcztcbiAgICAgICAgaWYgKG1hc2tFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbWFza0V4cHJlc3Npb24uY3VycmVudFZhbHVlICE9PSBtYXNrRXhwcmVzc2lvbi5wcmV2aW91c1ZhbHVlICYmXG4gICAgICAgICAgICAgICAgIW1hc2tFeHByZXNzaW9uLmZpcnN0Q2hhbmdlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsb3dOZWdhdGl2ZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hbGxvd05lZ2F0aXZlTnVtYmVycyA9IGFsbG93TmVnYXRpdmVOdW1iZXJzLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2UuYWxsb3dOZWdhdGl2ZU51bWJlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjOiBzdHJpbmcpID0+IGMgIT09IE1hc2tFeHByZXNzaW9uLk1JTlVTXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUgJiZcbiAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUuc3BsaXQoTWFza0V4cHJlc3Npb24uT1IpLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXkgPSBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLnNwbGl0KE1hc2tFeHByZXNzaW9uLk9SKVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRNYXNrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUgPSBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUgfHwgTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID0gdGhpcy5fbWFza1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaWFsQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgaWYgKCFzcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkoc3BlY2lhbENoYXJhY3RlcnMuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBzcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWUgfHwgW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBvdmVyd3JpdGUgdGhlIG1hc2sgYXZhaWxhYmxlIHBhdHRlcm5zIGlmIGEgcGF0dGVybiBoYXMgYWN0dWFsbHkgYmVlbiBwYXNzZWQgaW5cbiAgICAgICAgaWYgKHBhdHRlcm5zICYmIHBhdHRlcm5zLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucGF0dGVybnMgPSBwYXR0ZXJucy5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFwbSAmJiBhcG0uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcG0gPSBhcG0uY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCA9IHByZWZpeC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1ZmZpeCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3VmZml4ID0gc3VmZml4LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhvdXNhbmRTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnRob3VzYW5kU2VwYXJhdG9yID0gdGhvdXNhbmRTZXBhcmF0b3IuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpbWFsTWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyID0gZGVjaW1hbE1hcmtlci5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRyb3BTcGVjaWFsQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZHJvcFNwZWNpYWxDaGFyYWN0ZXJzID0gZHJvcFNwZWNpYWxDaGFyYWN0ZXJzLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGlkZGVuSW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmhpZGRlbklucHV0ID0gaGlkZGVuSW5wdXQuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG93TWFza1R5cGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza1R5cGVkID0gc2hvd01hc2tUeXBlZC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlSG9sZGVyQ2hhcmFjdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wbGFjZUhvbGRlckNoYXJhY3RlciA9IHBsYWNlSG9sZGVyQ2hhcmFjdGVyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvd25NYXNrRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2hvd25NYXNrRXhwcmVzc2lvbiA9IHNob3duTWFza0V4cHJlc3Npb24uY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNob3dUZW1wbGF0ZSA9IHNob3dUZW1wbGF0ZS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsZWFySWZOb3RNYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuY2xlYXJJZk5vdE1hdGNoID0gY2xlYXJJZk5vdE1hdGNoLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UudmFsaWRhdGlvbiA9IHZhbGlkYXRpb24uY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JMaW1pdCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2VwYXJhdG9yTGltaXQgPSBzZXBhcmF0b3JMaW1pdC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlYWRaZXJvRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmxlYWRaZXJvRGF0ZVRpbWUgPSBsZWFkWmVyb0RhdGVUaW1lLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZFplcm8pIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmxlYWRaZXJvID0gbGVhZFplcm8uY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyT25NYXNrQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS50cmlnZ2VyT25NYXNrQ2hhbmdlID0gdHJpZ2dlck9uTWFza0NoYW5nZS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlucHV0VHJhbnNmb3JtRm4pIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmlucHV0VHJhbnNmb3JtRm4gPSBpbnB1dFRyYW5zZm9ybUZuLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0cHV0VHJhbnNmb3JtRm4pIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm91dHB1dFRyYW5zZm9ybUZuID0gb3V0cHV0VHJhbnNmb3JtRm4uY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZWVwQ2hhcmFjdGVyUG9zaXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5rZWVwQ2hhcmFjdGVyUG9zaXRpb25zID0ga2VlcENoYXJhY3RlclBvc2l0aW9ucy5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXBwbHlNYXNrKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICBwdWJsaWMgdmFsaWRhdGUoeyB2YWx1ZSB9OiBGb3JtQ29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXNrU2VydmljZS52YWxpZGF0aW9uIHx8ICF0aGlzLl9tYXNrVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5pcEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2UuY3BmQ25wakVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlLnN0YXJ0c1dpdGgoTWFza0V4cHJlc3Npb24uU0VQQVJBVE9SKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpdGhvdXRWYWxpZGF0aW9uLmluY2x1ZGVzKHRoaXMuX21hc2tWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lTWFza3MuaW5jbHVkZXModGhpcy5fbWFza1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlVGltZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGxldCBjb3VudGVyT2ZPcHQgPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tWYWx1ZS5zdGFydHNXaXRoKE1hc2tFeHByZXNzaW9uLlBFUkNFTlQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9tYXNrU2VydmljZS5wYXR0ZXJucykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5wYXR0ZXJuc1trZXldPy5vcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2Yoa2V5KSAhPT0gdGhpcy5fbWFza1ZhbHVlLmxhc3RJbmRleE9mKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdDogc3RyaW5nID0gdGhpcy5fbWFza1ZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklORylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpOiBzdHJpbmcpID0+IGkgPT09IGtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbihNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mT3B0ICs9IG9wdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZk9wdCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKGtleSkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+PSB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihrZXkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJPZk9wdCA9PT0gdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoTWFza0V4cHJlc3Npb24uQ1VSTFlfQlJBQ0tFVFNfTEVGVCkgPT09IDEgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA9PT1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuc3BsaXQoTWFza0V4cHJlc3Npb24uQ1VSTFlfQlJBQ0tFVFNfTEVGVClbMV0gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zcGxpdChNYXNrRXhwcmVzc2lvbi5DVVJMWV9CUkFDS0VUU19SSUdIVClbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5TWU1CT0xfU1RBUikgPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoIDxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKE1hc2tFeHByZXNzaW9uLlNZTUJPTF9TVEFSKSkgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoTWFza0V4cHJlc3Npb24uU1lNQk9MX1FVRVNUSU9OKSA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoTWFza0V4cHJlc3Npb24uU1lNQk9MX1FVRVNUSU9OKSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5DVVJMWV9CUkFDS0VUU19MRUZUKSA9PT0gMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoTWFza0V4cHJlc3Npb24uU1lNQk9MX1NUQVIpID09PSAtMSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKE1hc2tFeHByZXNzaW9uLlNZTUJPTF9RVUVTVElPTikgPT09IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBTdHJpbmcodmFsdWUpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLl9tYXNrVmFsdWUuc3BsaXQoJyonKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IHRoaXMuX21hc2tTZXJ2aWNlLmRyb3BTcGVjaWFsQ2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX21hc2tWYWx1ZS5sZW5ndGggLVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmNoZWNrRHJvcFNwZWNpYWxDaGFyQW1vdW50KHRoaXMuX21hc2tWYWx1ZSkgLVxuICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZk9wdFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMucHJlZml4XG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCArIHRoaXMucHJlZml4Lmxlbmd0aCAtIGNvdW50ZXJPZk9wdFxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX21hc2tWYWx1ZS5sZW5ndGggLSBjb3VudGVyT2ZPcHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdEluZGV4QXJyYXkgPSBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4QXJyYXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKGxhc3RJbmRleEFycmF5WzBdIGFzIHN0cmluZykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyh2YWx1ZSkuaW5jbHVkZXMobGFzdEluZGV4QXJyYXlbMF0gPz8gJycpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5kcm9wU3BlY2lhbENoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjaWFsID0gdmFsdWUuc3BsaXQobGFzdEluZGV4QXJyYXlbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpYWxbc3BlY2lhbC5sZW5ndGggLSAxXS5sZW5ndGggPT09IGxhc3RJbmRleEFycmF5Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoKGxhc3RJbmRleEFycmF5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXhBcnJheVswXSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFsYXN0SW5kZXhBcnJheSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmRyb3BTcGVjaWFsQ2hhcmFjdGVycykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA+PSBsZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5TWU1CT0xfU1RBUikgPT09IDEgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihNYXNrRXhwcmVzc2lvbi5TWU1CT0xfUVVFU1RJT04pID09PSAxXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubWFza0ZpbGxlZC5lbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScpXG4gICAgcHVibGljIG9uUGFzdGUoKSB7XG4gICAgICAgIHRoaXMuX2p1c3RQYXN0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ25nTW9kZWxDaGFuZ2UnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbk1vZGVsQ2hhbmdlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIG9uIGZvcm0gcmVzZXQgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFjdHVhbFZhbHVlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh2YWx1ZSA9PT0gTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID0gdGhpcy5fbWFza1NlcnZpY2UuZ2V0QWN0dWFsVmFsdWUoXG4gICAgICAgICAgICAgICAgTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbklucHV0KGU6IEN1c3RvbUtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gSWYgSU1FIGlzIGNvbXBvc2luZyB0ZXh0LCB3ZSB3YWl0IGZvciB0aGUgY29tcG9zZWQgdGV4dC5cbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gdGhpcy5fbWFza1NlcnZpY2UuaW5wdXRUcmFuc2Zvcm1GbihlbC52YWx1ZSk7XG4gICAgICAgIGlmIChlbC50eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm1lZFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBlbC52YWx1ZSA9IHRyYW5zZm9ybWVkVmFsdWUudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUgPSBlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRNYXNrKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbjogbnVtYmVyID1cbiAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgKyB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dNYXNrVHlwZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5rZWVwQ2hhcmFjdGVyUG9zaXRpb25zICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnBsYWNlSG9sZGVyQ2hhcmFjdGVyLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dFN5bWJvbCA9IGVsLnZhbHVlLnNsaWNlKHBvc2l0aW9uIC0gMSwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmVmaXhMZW5ndGggPSB0aGlzLnByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrU3ltYm9sczogYm9vbGVhbiA9IHRoaXMuX21hc2tTZXJ2aWNlLl9jaGVja1N5bWJvbE1hc2soXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uW3Bvc2l0aW9uIC0gMSAtIHByZWZpeExlbmd0aF0gPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkdcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tTcGVjaWFsQ2hhcmFjdGVyOiBib29sZWFuID0gdGhpcy5fbWFza1NlcnZpY2UuX2NoZWNrU3ltYm9sTWFzayhcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb25bcG9zaXRpb24gKyAxIC0gcHJlZml4TGVuZ3RoXSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklOR1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RSYW5nZUJhY2tzcGFjZTogYm9vbGVhbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zZWxTdGFydCA9PT0gdGhpcy5fbWFza1NlcnZpY2Uuc2VsRW5kO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxTdGFydCA9IE51bWJlcih0aGlzLl9tYXNrU2VydmljZS5zZWxTdGFydCkgLSBwcmVmaXhMZW5ndGggPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbEVuZCA9IE51bWJlcih0aGlzLl9tYXNrU2VydmljZS5zZWxFbmQpIC0gcHJlZml4TGVuZ3RoID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb2RlID09PSBNYXNrRXhwcmVzc2lvbi5CQUNLU1BBQ0UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0UmFuZ2VCYWNrc3BhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2Uuc2VsU3RhcnQgPT09IHByZWZpeExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93bi5zbGljZSgwLCBzZWxFbmQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUuc3BsaXQodGhpcy5wcmVmaXgpLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNlbFN0YXJ0ID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93bi5sZW5ndGggKyBwcmVmaXhMZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93bi5zbGljZShzZWxTdGFydCwgc2VsRW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KHRoaXMucHJlZml4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCBzZWxTdGFydCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd24uc2xpY2Uoc2VsU3RhcnQsIHNlbEVuZCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsRW5kICsgcHJlZml4TGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duLmxlbmd0aCArIHByZWZpeExlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24uc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiAtIHRoaXMucHJlZml4Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uICsgMSAtIHRoaXMucHJlZml4Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdFJhbmdlQmFja3NwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsU3RhcnQgPT09IDEgJiYgdGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucGxhY2VIb2xkZXJDaGFyYWN0ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQodGhpcy5wcmVmaXgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KHRoaXMuc3VmZml4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydDEgPSBlbC52YWx1ZS5zdWJzdHJpbmcoMCwgcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0MiA9IGVsLnZhbHVlLnN1YnN0cmluZyhwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxICsgdGhpcy5fbWFza1NlcnZpY2UucGxhY2VIb2xkZXJDaGFyYWN0ZXIgKyBwYXJ0MjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvZGUgIT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1N5bWJvbHMgJiYgIWNoZWNrU3BlY2lhbENoYXJhY3RlciAmJiBzZWxlY3RSYW5nZUJhY2tzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gTnVtYmVyKGVsLnNlbGVjdGlvblN0YXJ0KSAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZS5zbGljZShwb3NpdGlvbiwgcG9zaXRpb24gKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NwZWNpYWxDaGFyYWN0ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlLnNsaWNlKHBvc2l0aW9uICsgMSwgcG9zaXRpb24gKyAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUuc2xpY2UoMCwgcG9zaXRpb24gLSAxKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDEpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTeW1ib2wgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZS5zbGljZShwb3NpdGlvbiArIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja1N5bWJvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlLnNsaWNlKDAsIHBvc2l0aW9uIC0gMSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN5bWJvbCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UocG9zaXRpb24gKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KHRoaXMuc3VmZml4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWZmaXg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY2FyZXRTaGlmdCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGJhY2tzcGFjZVNoaWZ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkRFTEVURSAmJiBNYXNrRXhwcmVzc2lvbi5TRVBBUkFUT1IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZGVsZXRlZFNwZWNpYWxDaGFyYWN0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoID49IHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29kZSAhPT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID09PSBNYXNrRXhwcmVzc2lvbi5EQVlTX01PTlRIU19ZRUFSUyAmJlxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA8IDEwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0U3ltYm9sID0gdGhpcy5faW5wdXRWYWx1ZS5zbGljZShwb3NpdGlvbiAtIDEsIHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5zbGljZSgwLCBwb3NpdGlvbiAtIDEpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3ltYm9sICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUuc2xpY2UocG9zaXRpb24gKyAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID09PSBNYXNrRXhwcmVzc2lvbi5IT1VSU19NSU5VVEVTX1NFQ09ORFMgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG1cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2p1c3RQYXN0ZWQgJiYgZWwudmFsdWUuc2xpY2UoMCwgMikgPT09IE1hc2tFeHByZXNzaW9uLkRPVUJMRV9aRVJPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZSA9IGVsLnZhbHVlLnNsaWNlKDEsIDIpICsgZWwudmFsdWUuc2xpY2UoMiwgZWwudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZSA9PT0gTWFza0V4cHJlc3Npb24uRE9VQkxFX1pFUk9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1hc2tFeHByZXNzaW9uLk5VTUJFUl9aRVJPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseVZhbHVlQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2p1c3RQYXN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSB8fCB0aGlzLl9jb2RlID09PSBNYXNrRXhwcmVzc2lvbi5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgIChzaGlmdDogbnVtYmVyLCBfYmFja3NwYWNlU2hpZnQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2p1c3RQYXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmV0U2hpZnQgPSBzaGlmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tzcGFjZVNoaWZ0ID0gX2JhY2tzcGFjZVNoaWZ0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCB0aGUgc2VsZWN0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGFjdGl2ZVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZXRBY3RpdmVFbGVtZW50KCkgIT09IGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb24gYWZ0ZXIgYXBwbHlWYWx1ZUNoYW5nZXMgdG8gcHJldmVudCBjdXJzb3Igb24gd3JvbmcgcG9zaXRpb24gd2hlbiBpdCBoYXMgYW4gYXJyYXkgb2YgbWFza0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFza0V4cHJlc3Npb25BcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUuc2xpY2UocG9zaXRpb24gLSAxLCBwb3NpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBvc2l0aW9uIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSArIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID09PSAxICYmIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoID09PSAxID8gbnVsbCA6IHRoaXMuX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvblRvQXBwbHk6IG51bWJlciA9IHRoaXMuX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggKyBwb3NpdGlvbiArIGNhcmV0U2hpZnRcbiAgICAgICAgICAgICAgICAgICAgOiBwb3NpdGlvbiArXG4gICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX2NvZGUgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSAmJiAhYmFja3NwYWNlU2hpZnQgPyAwIDogY2FyZXRTaGlmdCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25Ub0FwcGx5ID4gdGhpcy5fZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvQXBwbHkgPSB0aGlzLl9nZXRBY3R1YWxJbnB1dExlbmd0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25Ub0FwcGx5IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvQXBwbHkgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShwb3NpdGlvblRvQXBwbHksIHBvc2l0aW9uVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdOZ3gtbWFzayB3cml0ZVZhbHVlIHdvcmsgd2l0aCBzdHJpbmcgfCBudW1iZXIsIHlvdXIgY3VycmVudCB2YWx1ZTonLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdHJhbnNmb3JtZWRWYWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseVZhbHVlQ2hhbmdlcyhcbiAgICAgICAgICAgICAgICBlbC52YWx1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdGhpcy5fanVzdFBhc3RlZCxcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2RlID09PSBNYXNrRXhwcmVzc2lvbi5CQUNLU1BBQ0UgfHwgdGhpcy5fY29kZSA9PT0gTWFza0V4cHJlc3Npb24uREVMRVRFXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSU1FIHN0YXJ0c1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NvbXBvc2l0aW9uc3RhcnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNvbXBvc2l0aW9uU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJTUUgY29tcGxldGVzXG4gICAgQEhvc3RMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNvbXBvc2l0aW9uRW5kKGU6IEN1c3RvbUtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fanVzdFBhc3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub25JbnB1dChlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25CbHVyKGU6IEN1c3RvbUtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm8gJiYgZWwudmFsdWUubGVuZ3RoID4gMCAmJiB0eXBlb2YgdGhpcy5kZWNpbWFsTWFya2VyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hc2tFeHByZXNzaW9uID0gdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlY2lzaW9uID0gTnVtYmVyKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbi5zbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbi5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHByZWNpc2lvbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwudmFsdWUgPSB0aGlzLnN1ZmZpeCA/IGVsLnZhbHVlLnNwbGl0KHRoaXMuc3VmZml4KS5qb2luKCcnKSA6IGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNpbWFsUGFydCA9IGVsLnZhbHVlLnNwbGl0KHRoaXMuZGVjaW1hbE1hcmtlcilbMV0gYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBlbC52YWx1ZSA9IGVsLnZhbHVlLmluY2x1ZGVzKHRoaXMuZGVjaW1hbE1hcmtlcilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZWwudmFsdWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrRXhwcmVzc2lvbi5OVU1CRVJfWkVSTy5yZXBlYXQocHJlY2lzaW9uIC0gZGVjaW1hbFBhcnQubGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VmZml4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IGVsLnZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsTWFya2VyICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza0V4cHJlc3Npb24uTlVNQkVSX1pFUk8ucmVwZWF0KHByZWNpc2lvbikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUgPSBlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2hGbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Ub3VjaCgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhlOiBNb3VzZUV2ZW50IHwgQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsOiBIVE1MSW5wdXRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgcG9zU3RhcnQgPSAwO1xuICAgICAgICBjb25zdCBwb3NFbmQgPSAwO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsICE9PSBudWxsICYmXG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPT09IGVsLnNlbGVjdGlvbkVuZCAmJlxuICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPiB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoICYmXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIChlIGFzIGFueSkua2V5Q29kZSAhPT0gMzhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2Uuc2hvd01hc2tUeXBlZCAmJiAhdGhpcy5rZWVwQ2hhcmFjdGVyUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYXJlIHNob3dpbmcgdGhlIG1hc2sgaW4gdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd24gPSB0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza0luSW5wdXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCArIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duID09PSBlbC52YWx1ZVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgT05MWSBjb250YWlucyB0aGUgbWFzaywgc28gcG9zaXRpb24gdGhlIGN1cnNvciBhdCB0aGUgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UocG9zU3RhcnQsIHBvc0VuZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IGNvbnRhaW5zIHNvbWUgY2hhcmFjdGVycyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5zZWxlY3Rpb25TdGFydCA+IHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXIgY2xpY2tlZCBiZXlvbmQgb3VyIHZhbHVlJ3MgbGVuZ3RoLCBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0IHRoZSBlbmQgb2Ygb3VyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9XG4gICAgICAgICAgICBlbCAmJlxuICAgICAgICAgICAgKGVsLnZhbHVlID09PSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXhcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCArIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duXG4gICAgICAgICAgICAgICAgOiBlbC52YWx1ZSk7XG5cbiAgICAgICAgLyoqIEZpeCBvZiBjdXJzb3IgcG9zaXRpb24ganVtcGluZyB0byBlbmQgaW4gbW9zdCBicm93c2VycyBubyBtYXR0ZXIgd2hlcmUgY3Vyc29yIGlzIGluc2VydGVkIG9uRm9jdXMgKi9cbiAgICAgICAgaWYgKGVsICYmIGVsLnZhbHVlICE9PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgIGVsLnZhbHVlID0gbmV4dFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBmaXggb2YgY3Vyc29yIHBvc2l0aW9uIHdpdGggcHJlZml4IHdoZW4gbW91c2UgY2xpY2sgb2NjdXIgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwgJiZcbiAgICAgICAgICAgIGVsLnR5cGUgIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICAoKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgfHwgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpKSA8PVxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLyoqIHNlbGVjdCBvbmx5IGluc2VydGVkIHRleHQgKi9cbiAgICAgICAgaWYgKGVsICYmIChlbC5zZWxlY3Rpb25FbmQgYXMgbnVtYmVyKSA+IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleURvd24oZTogQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICAvLyBVc2VyIGZpbmFsaXplIHRoZWlyIGNob2ljZSBmcm9tIElNRSBjb21wb3NpdGlvbiwgc28gdHJpZ2dlciBvbklucHV0KCkgZm9yIHRoZSBjb21wb3NlZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB0aGlzLm9uQ29tcG9zaXRpb25FbmQoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb2RlID0gZS5jb2RlID8gZS5jb2RlIDogZS5rZXk7XG4gICAgICAgIGNvbnN0IGVsOiBIVE1MSW5wdXRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgdGhpcy5faW5wdXRWYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgICB0aGlzLl9zZXRNYXNrKCk7XG5cbiAgICAgICAgaWYgKGVsLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09IE1hc2tFeHByZXNzaW9uLkFSUk9XX1VQKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGUua2V5ID09PSBNYXNrRXhwcmVzc2lvbi5BUlJPV19MRUZUIHx8XG4gICAgICAgICAgICAgICAgZS5rZXkgPT09IE1hc2tFeHByZXNzaW9uLkJBQ0tTUEFDRSB8fFxuICAgICAgICAgICAgICAgIGUua2V5ID09PSBNYXNrRXhwcmVzc2lvbi5ERUxFVEVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gTWFza0V4cHJlc3Npb24uQkFDS1NQQUNFICYmIGVsLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IGVsLnNlbGVjdGlvbkVuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSBNYXNrRXhwcmVzc2lvbi5CQUNLU1BBQ0UgJiYgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3BlY2lhbENoYXJzIGlzIGZhbHNlLCAoc2hvdWxkbid0IGV2ZXIgaGFwcGVuKSB0aGVuIHNldCB0byB0aGUgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyA9IHRoaXMuc3BlY2lhbENoYXJhY3RlcnM/Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2NvbmZpZy5zcGVjaWFsQ2hhcmFjdGVycztcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXgubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgPD0gdGhpcy5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5wcmVmaXgubGVuZ3RoLCBlbC5zZWxlY3Rpb25FbmQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoICE9PSAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICE9PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZVsoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAtIDFdID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRoaXMucHJlZml4Lmxlbmd0aCA+PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSA+IHRoaXMucHJlZml4Lmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZml4Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAtIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1NlbGVjdGlvbk9uRGVsZXRpb24oZWwpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSA8PSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25FbmQgYXMgbnVtYmVyKSA8PSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY3Vyc29yU3RhcnQ6IG51bWJlciB8IG51bGwgPSBlbC5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGUua2V5ID09PSBNYXNrRXhwcmVzc2lvbi5CQUNLU1BBQ0UgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVsLnJlYWRPbmx5ICYmXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvclN0YXJ0ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9PT0gZWwudmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgIGVsLnZhbHVlLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCA/IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseU1hc2soXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEhdGhpcy5zdWZmaXggJiZcbiAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeC5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggLSB0aGlzLnN1ZmZpeC5sZW5ndGggPCAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoIC0gdGhpcy5zdWZmaXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIChlLmNvZGUgPT09ICdLZXlBJyAmJiBlLmN0cmxLZXkpIHx8XG4gICAgICAgICAgICAgICAgKGUuY29kZSA9PT0gJ0tleUEnICYmIGUubWV0YUtleSkgLy8gQ21kICsgQSAoTWFjKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGhpcy5fZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKSk7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2VsU3RhcnQgPSBlbC5zZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNlbEVuZCA9IGVsLnNlbGVjdGlvbkVuZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBJdCB3cml0ZXMgdGhlIHZhbHVlIGluIHRoZSBpbnB1dCAqL1xuICAgIC8vIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKGNvbnRyb2xWYWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHB1YmxpYyBhc3luYyB3cml0ZVZhbHVlKFxuICAgICAgICBjb250cm9sVmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHsgdmFsdWU6IHN0cmluZyB8IG51bWJlcjsgZGlzYWJsZT86IGJvb2xlYW4gfVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnRyb2xWYWx1ZSA9PT0gJ29iamVjdCcgJiYgY29udHJvbFZhbHVlICE9PSBudWxsICYmICd2YWx1ZScgaW4gY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoJ2Rpc2FibGUnIGluIGNvbnRyb2xWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzYWJsZWRTdGF0ZShCb29sZWFuKGNvbnRyb2xWYWx1ZS5kaXNhYmxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGNvbnRyb2xWYWx1ZSA9IGNvbnRyb2xWYWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgY29udHJvbFZhbHVlID0gdGhpcy5pbnB1dFRyYW5zZm9ybUZuXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlucHV0VHJhbnNmb3JtRm4oY29udHJvbFZhbHVlKVxuICAgICAgICAgICAgICAgIDogY29udHJvbFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBjb250cm9sVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlb2YgY29udHJvbFZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgY29udHJvbFZhbHVlID09PSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBsZXQgaW5wdXRWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IGNvbnRyb2xWYWx1ZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgaW5wdXRWYWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuc3RhcnRzV2l0aChNYXNrRXhwcmVzc2lvbi5TRVBBUkFUT1IpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gU3RyaW5nKGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZURlY2ltYWxNYXJrZXIgPSB0aGlzLl9tYXNrU2VydmljZS5jdXJyZW50TG9jYWxlRGVjaW1hbE1hcmtlcigpO1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyICE9PSBsb2NhbGVEZWNpbWFsTWFya2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRGVjaW1hbE1hcmtlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmxlYWRaZXJvICYmXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXNrRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3BTcGVjaWFsQ2hhcmFjdGVycyAhPT0gZmFsc2VcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9tYXNrU2VydmljZS5fY2hlY2tQcmVjaXNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyID09PSBNYXNrRXhwcmVzc2lvbi5DT01NQSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShNYXNrRXhwcmVzc2lvbi5ET1QsIE1hc2tFeHByZXNzaW9uLkNPTU1BKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFza0V4cHJlc3Npb24/LnN0YXJ0c1dpdGgoTWFza0V4cHJlc3Npb24uU0VQQVJBVE9SKSAmJiB0aGlzLmxlYWRaZXJvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseU1hc2soXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZT8udG9TdHJpbmcoKSA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmlzTnVtYmVyVmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NldE1hc2soKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoaW5wdXRWYWx1ZSAmJiB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbikgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCB8fCB0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza1R5cGVkKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIExldCB0aGUgc2VydmljZSB3ZSBrbm93IHdlIGFyZSB3cml0aW5nIHZhbHVlIHNvIHRoYXQgdHJpZ2dlcmluZyBvbkNoYW5nZSBmdW5jdGlvbiB3b24ndCBoYXBwZW4gZHVyaW5nIGFwcGx5TWFza1xuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLmlucHV0VHJhbnNmb3JtRm4gIT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fbWFza1NlcnZpY2Uud3JpdGluZ1ZhbHVlID0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gW1xuICAgICAgICAgICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseU1hc2soaW5wdXRWYWx1ZSwgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24pLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgLy8gTGV0IHRoZSBzZXJ2aWNlIGtub3cgd2UndmUgZmluaXNoZWQgd3JpdGluZyB2YWx1ZVxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLmlucHV0VHJhbnNmb3JtRm4gIT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5fbWFza1NlcnZpY2Uud3JpdGluZ1ZhbHVlID0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbJ3ZhbHVlJywgaW5wdXRWYWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAnTmd4LW1hc2sgd3JpdGVWYWx1ZSB3b3JrIHdpdGggc3RyaW5nIHwgbnVtYmVyLCB5b3VyIGN1cnJlbnQgdmFsdWU6JyxcbiAgICAgICAgICAgICAgICB0eXBlb2YgY29udHJvbFZhbHVlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IElPbkNoYWdlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogSU9uVG91Y2gpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoID0gZm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aXZlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnRPclNoYWRvd1Jvb3QgPSB0aGlzLmRvY3VtZW50KTogRWxlbWVudCB8IG51bGwge1xuICAgICAgICBjb25zdCBzaGFkb3dSb290RWwgPSBkb2N1bWVudD8uYWN0aXZlRWxlbWVudD8uc2hhZG93Um9vdDtcbiAgICAgICAgaWYgKCFzaGFkb3dSb290RWw/LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoc2hhZG93Um9vdEVsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjaGVja1NlbGVjdGlvbk9uRGVsZXRpb24oZWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHRoaXMucHJlZml4Lmxlbmd0aCwgZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSxcbiAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoIC0gdGhpcy5zdWZmaXgubGVuZ3RoXG4gICAgICAgICk7XG4gICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKFxuICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5wcmVmaXgubGVuZ3RoLCBlbC5zZWxlY3Rpb25FbmQgYXMgbnVtYmVyKSxcbiAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoIC0gdGhpcy5zdWZmaXgubGVuZ3RoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEl0IGRpc2FibGVzIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gWydkaXNhYmxlZCcsIGlzRGlzYWJsZWRdO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJpdmF0ZSBfYXBwbHlNYXNrKCk6IGFueSB7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID0gdGhpcy5fbWFza1NlcnZpY2UuX3JlcGVhdFBhdHRlcm5TeW1ib2xzKFxuICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlIHx8ICcnXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYXBwbHlNYXNrKHRoaXMuX2lucHV0VmFsdWUsIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWxpZGF0ZVRpbWUodmFsdWU6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgcm93TWFza0xlbjogbnVtYmVyID0gdGhpcy5fbWFza1ZhbHVlXG4gICAgICAgICAgICAuc3BsaXQoTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HKVxuICAgICAgICAgICAgLmZpbHRlcigoczogc3RyaW5nKSA9PiBzICE9PSAnOicpLmxlbmd0aDtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIERvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBmb3Igb3B0aW9uYWwgZm9ybSBjb250cm9sXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoKyh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSA/PyAtMSkgPT09IDAgJiYgdmFsdWUubGVuZ3RoIDwgcm93TWFza0xlbikgfHxcbiAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA8PSByb3dNYXNrTGVuIC0gMlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCArIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVWYWxpZGF0aW9uRXJyb3IoYWN0dWFsVmFsdWU6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFzazoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkTWFzazogdGhpcy5fbWFza1ZhbHVlLFxuICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRNYXNrKCkge1xuICAgICAgICB0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5LnNvbWUoKG1hc2spOiBib29sZWFuIHwgdm9pZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzcGVjaWFsQ2hhcnQ6IGJvb2xlYW4gPSBtYXNrXG4gICAgICAgICAgICAgICAgLnNwbGl0KE1hc2tFeHByZXNzaW9uLkVNUFRZX1NUUklORylcbiAgICAgICAgICAgICAgICAuc29tZSgoY2hhcikgPT4gdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoY2hhcikpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChzcGVjaWFsQ2hhcnQgJiYgdGhpcy5faW5wdXRWYWx1ZSAmJiAhbWFzay5pbmNsdWRlcyhNYXNrRXhwcmVzc2lvbi5MRVRURVJfUykpIHx8XG4gICAgICAgICAgICAgICAgbWFzay5pbmNsdWRlcyhNYXNrRXhwcmVzc2lvbi5DVVJMWV9CUkFDS0VUU19MRUZUKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnJlbW92ZU1hc2sodGhpcy5faW5wdXRWYWx1ZSk/Lmxlbmd0aCA8PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5yZW1vdmVNYXNrKG1hc2spPy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFza0V4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2suaW5jbHVkZXMoTWFza0V4cHJlc3Npb24uQ1VSTFlfQlJBQ0tFVFNfTEVGVClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLl9tYXNrU2VydmljZS5fcmVwZWF0UGF0dGVyblN5bWJvbHMobWFzaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXlbdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheS5sZW5ndGggLSAxXSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgTWFza0V4cHJlc3Npb24uRU1QVFlfU1RSSU5HO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXNrRXhwcmVzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5pbmNsdWRlcyhNYXNrRXhwcmVzc2lvbi5DVVJMWV9CUkFDS0VUU19MRUZUKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX21hc2tTZXJ2aWNlLl9yZXBlYXRQYXR0ZXJuU3ltYm9scyhleHByZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVjazogYm9vbGVhbiA9IHRoaXMuX2lucHV0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgPy5zcGxpdChNYXNrRXhwcmVzc2lvbi5FTVBUWV9TVFJJTkcpXG4gICAgICAgICAgICAgICAgICAgIC5ldmVyeSgoY2hhcmFjdGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhNYXNrID0gbWFzay5jaGFyQXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hc2tTZXJ2aWNlLl9jaGVja1N5bWJvbE1hc2soY2hhcmFjdGVyLCBpbmRleE1hc2spO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlID0gdGhpcy5tYXNrRXhwcmVzc2lvbiA9IHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID0gbWFzaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19