@metamask/snaps-execution-environments 0.34.0-flask.1 → 0.34.1-flask.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.
@@ -14822,7 +14822,7 @@ var Buffer=require("safe-buffer").Buffer,MD5=require("md5.js");function EVP_Byte
14822
14822
  };
14823
14823
  }
14824
14824
  }
14825
- }, {package:"ts-jest>fast-json-stable-stringify",file:"../../node_modules/fast-json-stable-stringify/index.js",}],
14825
+ }, {package:"@metamask/snaps-utils>fast-json-stable-stringify",file:"../../node_modules/fast-json-stable-stringify/index.js",}],
14826
14826
  [193, {}, function(){
14827
14827
  with (this.scopeTerminator) {
14828
14828
  with (this.globalThis) {
@@ -16313,7 +16313,7 @@ const ANY=Symbol("SemVer ANY");class Comparator{static get ANY(){return ANY}cons
16313
16313
  };
16314
16314
  }
16315
16315
  }
16316
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/classes/comparator.js",}],
16316
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/classes/comparator.js",}],
16317
16317
  [296, {"../internal/constants":323,"../internal/debug":324,"../internal/parse-options":326,"../internal/re":327,"./comparator":295,"./semver":297,"lru-cache":328}, function(){
16318
16318
  with (this.scopeTerminator) {
16319
16319
  with (this.globalThis) {
@@ -16327,7 +16327,7 @@ class Range{constructor(e,r){if(r=parseOptions(r),e instanceof Range)return e.lo
16327
16327
  };
16328
16328
  }
16329
16329
  }
16330
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/classes/range.js",}],
16330
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/classes/range.js",}],
16331
16331
  [297, {"../internal/constants":323,"../internal/debug":324,"../internal/identifiers":325,"../internal/parse-options":326,"../internal/re":327}, function(){
16332
16332
  with (this.scopeTerminator) {
16333
16333
  with (this.globalThis) {
@@ -16341,7 +16341,7 @@ const debug=require("../internal/debug"),{MAX_LENGTH:MAX_LENGTH,MAX_SAFE_INTEGER
16341
16341
  };
16342
16342
  }
16343
16343
  }
16344
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/classes/semver.js",}],
16344
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/classes/semver.js",}],
16345
16345
  [298, {"./parse":314}, function(){
16346
16346
  with (this.scopeTerminator) {
16347
16347
  with (this.globalThis) {
@@ -16355,7 +16355,7 @@ const parse=require("./parse"),clean=(e,r)=>{const n=parse(e.trim().replace(/^[=
16355
16355
  };
16356
16356
  }
16357
16357
  }
16358
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/clean.js",}],
16358
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/clean.js",}],
16359
16359
  [299, {"./eq":305,"./gt":306,"./gte":307,"./lt":309,"./lte":310,"./neq":313}, function(){
16360
16360
  with (this.scopeTerminator) {
16361
16361
  with (this.globalThis) {
@@ -16369,7 +16369,7 @@ const eq=require("./eq"),neq=require("./neq"),gt=require("./gt"),gte=require("./
16369
16369
  };
16370
16370
  }
16371
16371
  }
16372
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/cmp.js",}],
16372
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/cmp.js",}],
16373
16373
  [300, {"../classes/semver":297,"../internal/re":327,"./parse":314}, function(){
16374
16374
  with (this.scopeTerminator) {
16375
16375
  with (this.globalThis) {
@@ -16383,7 +16383,7 @@ const SemVer=require("../classes/semver"),parse=require("./parse"),{re:re,t:t}=r
16383
16383
  };
16384
16384
  }
16385
16385
  }
16386
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/coerce.js",}],
16386
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/coerce.js",}],
16387
16387
  [301, {"../classes/semver":297}, function(){
16388
16388
  with (this.scopeTerminator) {
16389
16389
  with (this.globalThis) {
@@ -16397,7 +16397,7 @@ const SemVer=require("../classes/semver"),compareBuild=(e,r,m)=>{const o=new Sem
16397
16397
  };
16398
16398
  }
16399
16399
  }
16400
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/compare-build.js",}],
16400
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/compare-build.js",}],
16401
16401
  [302, {"./compare":303}, function(){
16402
16402
  with (this.scopeTerminator) {
16403
16403
  with (this.globalThis) {
@@ -16411,7 +16411,7 @@ const compare=require("./compare"),compareLoose=(o,e)=>compare(o,e,!0);module.ex
16411
16411
  };
16412
16412
  }
16413
16413
  }
16414
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/compare-loose.js",}],
16414
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/compare-loose.js",}],
16415
16415
  [303, {"../classes/semver":297}, function(){
16416
16416
  with (this.scopeTerminator) {
16417
16417
  with (this.globalThis) {
@@ -16425,7 +16425,7 @@ const SemVer=require("../classes/semver"),compare=(e,r,m)=>new SemVer(e,m).compa
16425
16425
  };
16426
16426
  }
16427
16427
  }
16428
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/compare.js",}],
16428
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/compare.js",}],
16429
16429
  [304, {"./parse.js":314}, function(){
16430
16430
  with (this.scopeTerminator) {
16431
16431
  with (this.globalThis) {
@@ -16439,7 +16439,7 @@ const parse=require("./parse.js"),diff=(r,e)=>{const a=parse(r,null,!0),o=parse(
16439
16439
  };
16440
16440
  }
16441
16441
  }
16442
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/diff.js",}],
16442
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/diff.js",}],
16443
16443
  [305, {"./compare":303}, function(){
16444
16444
  with (this.scopeTerminator) {
16445
16445
  with (this.globalThis) {
@@ -16453,7 +16453,7 @@ const compare=require("./compare"),eq=(e,o,r)=>0===compare(e,o,r);module.exports
16453
16453
  };
16454
16454
  }
16455
16455
  }
16456
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/eq.js",}],
16456
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/eq.js",}],
16457
16457
  [306, {"./compare":303}, function(){
16458
16458
  with (this.scopeTerminator) {
16459
16459
  with (this.globalThis) {
@@ -16467,7 +16467,7 @@ const compare=require("./compare"),gt=(e,o,r)=>compare(e,o,r)>0;module.exports=g
16467
16467
  };
16468
16468
  }
16469
16469
  }
16470
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/gt.js",}],
16470
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/gt.js",}],
16471
16471
  [307, {"./compare":303}, function(){
16472
16472
  with (this.scopeTerminator) {
16473
16473
  with (this.globalThis) {
@@ -16481,7 +16481,7 @@ const compare=require("./compare"),gte=(e,o,r)=>compare(e,o,r)>=0;module.exports
16481
16481
  };
16482
16482
  }
16483
16483
  }
16484
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/gte.js",}],
16484
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/gte.js",}],
16485
16485
  [308, {"../classes/semver":297}, function(){
16486
16486
  with (this.scopeTerminator) {
16487
16487
  with (this.globalThis) {
@@ -16495,7 +16495,7 @@ const SemVer=require("../classes/semver"),inc=(e,r,n,s,i)=>{"string"==typeof n&&
16495
16495
  };
16496
16496
  }
16497
16497
  }
16498
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/inc.js",}],
16498
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/inc.js",}],
16499
16499
  [309, {"./compare":303}, function(){
16500
16500
  with (this.scopeTerminator) {
16501
16501
  with (this.globalThis) {
@@ -16509,7 +16509,7 @@ const compare=require("./compare"),lt=(e,o,r)=>compare(e,o,r)<0;module.exports=l
16509
16509
  };
16510
16510
  }
16511
16511
  }
16512
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/lt.js",}],
16512
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/lt.js",}],
16513
16513
  [310, {"./compare":303}, function(){
16514
16514
  with (this.scopeTerminator) {
16515
16515
  with (this.globalThis) {
@@ -16523,7 +16523,7 @@ const compare=require("./compare"),lte=(e,o,r)=>compare(e,o,r)<=0;module.exports
16523
16523
  };
16524
16524
  }
16525
16525
  }
16526
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/lte.js",}],
16526
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/lte.js",}],
16527
16527
  [311, {"../classes/semver":297}, function(){
16528
16528
  with (this.scopeTerminator) {
16529
16529
  with (this.globalThis) {
@@ -16537,7 +16537,7 @@ const SemVer=require("../classes/semver"),major=(e,r)=>new SemVer(e,r).major;mod
16537
16537
  };
16538
16538
  }
16539
16539
  }
16540
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/major.js",}],
16540
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/major.js",}],
16541
16541
  [312, {"../classes/semver":297}, function(){
16542
16542
  with (this.scopeTerminator) {
16543
16543
  with (this.globalThis) {
@@ -16551,7 +16551,7 @@ const SemVer=require("../classes/semver"),minor=(e,r)=>new SemVer(e,r).minor;mod
16551
16551
  };
16552
16552
  }
16553
16553
  }
16554
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/minor.js",}],
16554
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/minor.js",}],
16555
16555
  [313, {"./compare":303}, function(){
16556
16556
  with (this.scopeTerminator) {
16557
16557
  with (this.globalThis) {
@@ -16565,7 +16565,7 @@ const compare=require("./compare"),neq=(e,o,r)=>0!==compare(e,o,r);module.export
16565
16565
  };
16566
16566
  }
16567
16567
  }
16568
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/neq.js",}],
16568
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/neq.js",}],
16569
16569
  [314, {"../classes/semver":297}, function(){
16570
16570
  with (this.scopeTerminator) {
16571
16571
  with (this.globalThis) {
@@ -16579,7 +16579,7 @@ const SemVer=require("../classes/semver"),parse=(e,r,s=!1)=>{if(e instanceof Sem
16579
16579
  };
16580
16580
  }
16581
16581
  }
16582
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/parse.js",}],
16582
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/parse.js",}],
16583
16583
  [315, {"../classes/semver":297}, function(){
16584
16584
  with (this.scopeTerminator) {
16585
16585
  with (this.globalThis) {
@@ -16593,7 +16593,7 @@ const SemVer=require("../classes/semver"),patch=(e,r)=>new SemVer(e,r).patch;mod
16593
16593
  };
16594
16594
  }
16595
16595
  }
16596
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/patch.js",}],
16596
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/patch.js",}],
16597
16597
  [316, {"./parse":314}, function(){
16598
16598
  with (this.scopeTerminator) {
16599
16599
  with (this.globalThis) {
@@ -16607,7 +16607,7 @@ const parse=require("./parse"),prerelease=(e,r)=>{const s=parse(e,r);return s&&s
16607
16607
  };
16608
16608
  }
16609
16609
  }
16610
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/prerelease.js",}],
16610
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/prerelease.js",}],
16611
16611
  [317, {"./compare":303}, function(){
16612
16612
  with (this.scopeTerminator) {
16613
16613
  with (this.globalThis) {
@@ -16621,7 +16621,7 @@ const compare=require("./compare"),rcompare=(r,e,o)=>compare(e,r,o);module.expor
16621
16621
  };
16622
16622
  }
16623
16623
  }
16624
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/rcompare.js",}],
16624
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/rcompare.js",}],
16625
16625
  [318, {"./compare-build":301}, function(){
16626
16626
  with (this.scopeTerminator) {
16627
16627
  with (this.globalThis) {
@@ -16635,7 +16635,7 @@ const compareBuild=require("./compare-build"),rsort=(r,o)=>r.sort(((r,e)=>compar
16635
16635
  };
16636
16636
  }
16637
16637
  }
16638
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/rsort.js",}],
16638
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/rsort.js",}],
16639
16639
  [319, {"../classes/range":296}, function(){
16640
16640
  with (this.scopeTerminator) {
16641
16641
  with (this.globalThis) {
@@ -16649,7 +16649,7 @@ const Range=require("../classes/range"),satisfies=(e,s,t)=>{try{s=new Range(s,t)
16649
16649
  };
16650
16650
  }
16651
16651
  }
16652
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/satisfies.js",}],
16652
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/satisfies.js",}],
16653
16653
  [320, {"./compare-build":301}, function(){
16654
16654
  with (this.scopeTerminator) {
16655
16655
  with (this.globalThis) {
@@ -16663,7 +16663,7 @@ const compareBuild=require("./compare-build"),sort=(o,r)=>o.sort(((o,e)=>compare
16663
16663
  };
16664
16664
  }
16665
16665
  }
16666
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/sort.js",}],
16666
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/sort.js",}],
16667
16667
  [321, {"./parse":314}, function(){
16668
16668
  with (this.scopeTerminator) {
16669
16669
  with (this.globalThis) {
@@ -16677,7 +16677,7 @@ const parse=require("./parse"),valid=(e,r)=>{const s=parse(e,r);return s?s.versi
16677
16677
  };
16678
16678
  }
16679
16679
  }
16680
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/functions/valid.js",}],
16680
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/valid.js",}],
16681
16681
  [322, {"./classes/comparator":295,"./classes/range":296,"./classes/semver":297,"./functions/clean":298,"./functions/cmp":299,"./functions/coerce":300,"./functions/compare":303,"./functions/compare-build":301,"./functions/compare-loose":302,"./functions/diff":304,"./functions/eq":305,"./functions/gt":306,"./functions/gte":307,"./functions/inc":308,"./functions/lt":309,"./functions/lte":310,"./functions/major":311,"./functions/minor":312,"./functions/neq":313,"./functions/parse":314,"./functions/patch":315,"./functions/prerelease":316,"./functions/rcompare":317,"./functions/rsort":318,"./functions/satisfies":319,"./functions/sort":320,"./functions/valid":321,"./internal/constants":323,"./internal/identifiers":325,"./internal/re":327,"./ranges/gtr":329,"./ranges/intersects":330,"./ranges/ltr":331,"./ranges/max-satisfying":332,"./ranges/min-satisfying":333,"./ranges/min-version":334,"./ranges/outside":335,"./ranges/simplify":336,"./ranges/subset":337,"./ranges/to-comparators":338,"./ranges/valid":339}, function(){
16682
16682
  with (this.scopeTerminator) {
16683
16683
  with (this.globalThis) {
@@ -16691,7 +16691,7 @@ const internalRe=require("./internal/re"),constants=require("./internal/constant
16691
16691
  };
16692
16692
  }
16693
16693
  }
16694
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/index.js",}],
16694
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/index.js",}],
16695
16695
  [323, {}, function(){
16696
16696
  with (this.scopeTerminator) {
16697
16697
  with (this.globalThis) {
@@ -16705,7 +16705,7 @@ const SEMVER_SPEC_VERSION="2.0.0",MAX_LENGTH=256,MAX_SAFE_INTEGER=Number.MAX_SAF
16705
16705
  };
16706
16706
  }
16707
16707
  }
16708
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/internal/constants.js",}],
16708
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/constants.js",}],
16709
16709
  [324, {"_process":266}, function(){
16710
16710
  with (this.scopeTerminator) {
16711
16711
  with (this.globalThis) {
@@ -16721,7 +16721,7 @@ const debug="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bse
16721
16721
  };
16722
16722
  }
16723
16723
  }
16724
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/internal/debug.js",}],
16724
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/debug.js",}],
16725
16725
  [325, {}, function(){
16726
16726
  with (this.scopeTerminator) {
16727
16727
  with (this.globalThis) {
@@ -16735,7 +16735,7 @@ const numeric=/^[0-9]+$/,compareIdentifiers=(e,r)=>{const i=numeric.test(e),t=nu
16735
16735
  };
16736
16736
  }
16737
16737
  }
16738
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/internal/identifiers.js",}],
16738
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/identifiers.js",}],
16739
16739
  [326, {}, function(){
16740
16740
  with (this.scopeTerminator) {
16741
16741
  with (this.globalThis) {
@@ -16749,7 +16749,7 @@ const looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOpt
16749
16749
  };
16750
16750
  }
16751
16751
  }
16752
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/internal/parse-options.js",}],
16752
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/parse-options.js",}],
16753
16753
  [327, {"./constants":323,"./debug":324}, function(){
16754
16754
  with (this.scopeTerminator) {
16755
16755
  with (this.globalThis) {
@@ -16763,7 +16763,7 @@ const{MAX_SAFE_COMPONENT_LENGTH:MAX_SAFE_COMPONENT_LENGTH}=require("./constants"
16763
16763
  };
16764
16764
  }
16765
16765
  }
16766
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/internal/re.js",}],
16766
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/re.js",}],
16767
16767
  [328, {"yallist":357}, function(){
16768
16768
  with (this.scopeTerminator) {
16769
16769
  with (this.globalThis) {
@@ -16777,7 +16777,7 @@ const{MAX_SAFE_COMPONENT_LENGTH:MAX_SAFE_COMPONENT_LENGTH}=require("./constants"
16777
16777
  };
16778
16778
  }
16779
16779
  }
16780
- }, {package:"ts-jest>semver>lru-cache",file:"../../node_modules/semver/node_modules/lru-cache/index.js",}],
16780
+ }, {package:"@metamask/utils>semver>lru-cache",file:"../../node_modules/semver/node_modules/lru-cache/index.js",}],
16781
16781
  [329, {"./outside":335}, function(){
16782
16782
  with (this.scopeTerminator) {
16783
16783
  with (this.globalThis) {
@@ -16791,7 +16791,7 @@ const outside=require("./outside"),gtr=(e,t,o)=>outside(e,t,">",o);module.export
16791
16791
  };
16792
16792
  }
16793
16793
  }
16794
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/gtr.js",}],
16794
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/gtr.js",}],
16795
16795
  [330, {"../classes/range":296}, function(){
16796
16796
  with (this.scopeTerminator) {
16797
16797
  with (this.globalThis) {
@@ -16805,7 +16805,7 @@ const Range=require("../classes/range"),intersects=(e,s,n)=>(e=new Range(e,n),s=
16805
16805
  };
16806
16806
  }
16807
16807
  }
16808
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/intersects.js",}],
16808
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/intersects.js",}],
16809
16809
  [331, {"./outside":335}, function(){
16810
16810
  with (this.scopeTerminator) {
16811
16811
  with (this.globalThis) {
@@ -16819,7 +16819,7 @@ const outside=require("./outside"),ltr=(e,t,o)=>outside(e,t,"<",o);module.export
16819
16819
  };
16820
16820
  }
16821
16821
  }
16822
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/ltr.js",}],
16822
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/ltr.js",}],
16823
16823
  [332, {"../classes/range":296,"../classes/semver":297}, function(){
16824
16824
  with (this.scopeTerminator) {
16825
16825
  with (this.globalThis) {
@@ -16833,7 +16833,7 @@ const SemVer=require("../classes/semver"),Range=require("../classes/range"),maxS
16833
16833
  };
16834
16834
  }
16835
16835
  }
16836
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/max-satisfying.js",}],
16836
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/max-satisfying.js",}],
16837
16837
  [333, {"../classes/range":296,"../classes/semver":297}, function(){
16838
16838
  with (this.scopeTerminator) {
16839
16839
  with (this.globalThis) {
@@ -16847,7 +16847,7 @@ const SemVer=require("../classes/semver"),Range=require("../classes/range"),minS
16847
16847
  };
16848
16848
  }
16849
16849
  }
16850
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/min-satisfying.js",}],
16850
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/min-satisfying.js",}],
16851
16851
  [334, {"../classes/range":296,"../classes/semver":297,"../functions/gt":306}, function(){
16852
16852
  with (this.scopeTerminator) {
16853
16853
  with (this.globalThis) {
@@ -16861,7 +16861,7 @@ const SemVer=require("../classes/semver"),Range=require("../classes/range"),gt=r
16861
16861
  };
16862
16862
  }
16863
16863
  }
16864
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/min-version.js",}],
16864
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/min-version.js",}],
16865
16865
  [335, {"../classes/comparator":295,"../classes/range":296,"../classes/semver":297,"../functions/gt":306,"../functions/gte":307,"../functions/lt":309,"../functions/lte":310,"../functions/satisfies":319}, function(){
16866
16866
  with (this.scopeTerminator) {
16867
16867
  with (this.globalThis) {
@@ -16875,7 +16875,7 @@ const SemVer=require("../classes/semver"),Comparator=require("../classes/compara
16875
16875
  };
16876
16876
  }
16877
16877
  }
16878
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/outside.js",}],
16878
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/outside.js",}],
16879
16879
  [336, {"../functions/compare.js":303,"../functions/satisfies.js":319}, function(){
16880
16880
  with (this.scopeTerminator) {
16881
16881
  with (this.globalThis) {
@@ -16889,7 +16889,7 @@ const satisfies=require("../functions/satisfies.js"),compare=require("../functio
16889
16889
  };
16890
16890
  }
16891
16891
  }
16892
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/simplify.js",}],
16892
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/simplify.js",}],
16893
16893
  [337, {"../classes/comparator.js":295,"../classes/range.js":296,"../functions/compare.js":303,"../functions/satisfies.js":319}, function(){
16894
16894
  with (this.scopeTerminator) {
16895
16895
  with (this.globalThis) {
@@ -16903,7 +16903,7 @@ const Range=require("../classes/range.js"),Comparator=require("../classes/compar
16903
16903
  };
16904
16904
  }
16905
16905
  }
16906
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/subset.js",}],
16906
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/subset.js",}],
16907
16907
  [338, {"../classes/range":296}, function(){
16908
16908
  with (this.scopeTerminator) {
16909
16909
  with (this.globalThis) {
@@ -16917,7 +16917,7 @@ const Range=require("../classes/range"),toComparators=(a,e)=>new Range(a,e).set.
16917
16917
  };
16918
16918
  }
16919
16919
  }
16920
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/to-comparators.js",}],
16920
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/to-comparators.js",}],
16921
16921
  [339, {"../classes/range":296}, function(){
16922
16922
  with (this.scopeTerminator) {
16923
16923
  with (this.globalThis) {
@@ -16931,7 +16931,7 @@ const Range=require("../classes/range"),validRange=(e,n)=>{try{return new Range(
16931
16931
  };
16932
16932
  }
16933
16933
  }
16934
- }, {package:"ts-jest>semver",file:"../../node_modules/semver/ranges/valid.js",}],
16934
+ }, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/valid.js",}],
16935
16935
  [340, {"safe-buffer":293}, function(){
16936
16936
  with (this.scopeTerminator) {
16937
16937
  with (this.globalThis) {
@@ -17171,7 +17171,7 @@ function wrappy(n,r){if(n&&r)return wrappy(n)(r);if("function"!=typeof n)throw n
17171
17171
  };
17172
17172
  }
17173
17173
  }
17174
- }, {package:"ts-jest>semver>lru-cache>yallist",file:"../../node_modules/yallist/iterator.js",}],
17174
+ }, {package:"@metamask/utils>semver>lru-cache>yallist",file:"../../node_modules/yallist/iterator.js",}],
17175
17175
  [357, {"./iterator.js":356}, function(){
17176
17176
  with (this.scopeTerminator) {
17177
17177
  with (this.globalThis) {
@@ -17185,7 +17185,7 @@ function wrappy(n,r){if(n&&r)return wrappy(n)(r);if("function"!=typeof n)throw n
17185
17185
  };
17186
17186
  }
17187
17187
  }
17188
- }, {package:"ts-jest>semver>lru-cache>yallist",file:"../../node_modules/yallist/yallist.js",}],
17188
+ }, {package:"@metamask/utils>semver>lru-cache>yallist",file:"../../node_modules/yallist/yallist.js",}],
17189
17189
  [358, {"../logging":379,"../openrpc.json":380,"./../../../snaps-utils/src/index.browser":392,"./commands":359,"./endowments":364,"./globalEvents":371,"./keyring":373,"./sortParams":376,"./utils":377,"./validation":378,"@metamask/providers":57,"@metamask/utils":74,"eth-rpc-errors":187,"json-rpc-engine":230,"superstruct":351}, function(){
17190
17190
  with (this.scopeTerminator) {
17191
17191
  with (this.globalThis) {
@@ -18068,5 +18068,5 @@ module.exports={
18068
18068
  };
18069
18069
  }
18070
18070
  }
18071
- }, {package:"external:../snaps-utils/src/virtual-file/index.browser.ts",file:"../snaps-utils/src/virtual-file/index.browser.ts",}]],[382],{"resources":{"@metamask/object-multiplex":{"globals":{"console.warn":true},"packages":{"@metamask/object-multiplex>readable-stream":true,"pump>end-of-stream":true,"pump>once":true}},"@metamask/object-multiplex>readable-stream":{"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true,"@metamask/object-multiplex>readable-stream>string_decoder":true,"browserify>browser-resolve":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"browserify>timers-browserify":true,"process":true}},"@metamask/object-multiplex>readable-stream>safe-buffer":{"packages":{"browserify>buffer":true}},"@metamask/object-multiplex>readable-stream>string_decoder":{"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true}},"@metamask/post-message-stream":{"globals":{"MessageEvent.prototype":true,"WorkerGlobalScope":true,"addEventListener":true,"browser":true,"chrome":true,"location.origin":true,"postMessage":true,"removeEventListener":true},"packages":{"@metamask/post-message-stream>@metamask/utils":true,"@metamask/post-message-stream>readable-stream":true}},"@metamask/post-message-stream>@metamask/utils":{"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"browserify>buffer":true,"eslint>debug":true,"superstruct":true,"ts-jest>semver":true}},"@metamask/post-message-stream>readable-stream":{"packages":{"@metamask/post-message-stream>readable-stream>process-nextick-args":true,"@metamask/post-message-stream>readable-stream>safe-buffer":true,"@metamask/post-message-stream>readable-stream>string_decoder":true,"browserify>browser-resolve":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>util-deprecate":true,"browserify>timers-browserify":true,"process":true}},"@metamask/post-message-stream>readable-stream>process-nextick-args":{"packages":{"process":true}},"@metamask/post-message-stream>readable-stream>safe-buffer":{"packages":{"browserify>buffer":true}},"@metamask/post-message-stream>readable-stream>string_decoder":{"packages":{"@metamask/post-message-stream>readable-stream>safe-buffer":true}},"@metamask/providers":{"globals":{"Event":true,"addEventListener":true,"chrome.runtime.connect":true,"console":true,"dispatchEvent":true,"document.createElement":true,"document.readyState":true,"ethereum":"write","location.hostname":true,"removeEventListener":true,"web3":true},"packages":{"@metamask/object-multiplex":true,"@metamask/providers>@metamask/safe-event-emitter":true,"@metamask/providers>detect-browser":true,"@metamask/providers>extension-port-stream":true,"@metamask/providers>fast-deep-equal":true,"@metamask/providers>is-stream":true,"@metamask/providers>json-rpc-middleware-stream":true,"eth-rpc-errors":true,"json-rpc-engine":true,"pump":true}},"@metamask/providers>@metamask/safe-event-emitter":{"globals":{"setTimeout":true},"packages":{"browserify>events":true}},"@metamask/providers>detect-browser":{"globals":{"document":true,"navigator":true},"packages":{"process":true}},"@metamask/providers>extension-port-stream":{"packages":{"browserify>buffer":true,"stream-browserify":true}},"@metamask/providers>json-rpc-middleware-stream":{"globals":{"console.warn":true,"setTimeout":true},"packages":{"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream":true}},"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":{"globals":{"setTimeout":true},"packages":{"browserify>events":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream":{"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":true,"browserify>browser-resolve":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"browserify>timers-browserify":true,"process":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":{"packages":{"browserify>buffer":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":{"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true}},"@metamask/rpc-methods>@noble/hashes":{"globals":{"TextEncoder":true,"crypto":true}},"@metamask/snaps-utils>@scure/base":{"globals":{"TextDecoder":true,"TextEncoder":true}},"@metamask/snaps-utils>cron-parser":{"packages":{"@metamask/snaps-utils>cron-parser>luxon":true,"browserify>browser-resolve":true}},"@metamask/snaps-utils>cron-parser>luxon":{"globals":{"Intl":true}},"@metamask/snaps-utils>is-svg":{"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser":true}},"@metamask/snaps-utils>is-svg>fast-xml-parser":{"globals":{"entityName":true,"val":true},"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser>strnum":true}},"@metamask/snaps-utils>rfdc":{"packages":{"browserify>buffer":true}},"@metamask/snaps-utils>validate-npm-package-name":{"packages":{"@metamask/snaps-utils>validate-npm-package-name>builtins":true}},"@metamask/snaps-utils>validate-npm-package-name>builtins":{"packages":{"process":true,"ts-jest>semver":true}},"@metamask/utils":{"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"browserify>buffer":true,"eslint>debug":true,"superstruct":true,"ts-jest>semver":true}},"@wdio/cli>inquirer>external-editor>iconv-lite>safer-buffer":{"packages":{"browserify>buffer":true,"process":true}},"browserify>browser-pack>safe-buffer":{"packages":{"browserify>buffer":true}},"browserify>buffer":{"globals":{"console":true},"packages":{"buffer>base64-js":true,"buffer>ieee754":true}},"browserify>crypto-browserify":{"packages":{"browserify>crypto-browserify>browserify-cipher":true,"browserify>crypto-browserify>browserify-sign":true,"browserify>crypto-browserify>create-ecdh":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>create-hmac":true,"browserify>crypto-browserify>diffie-hellman":true,"browserify>crypto-browserify>pbkdf2":true,"browserify>crypto-browserify>public-encrypt":true,"browserify>crypto-browserify>randombytes":true,"browserify>crypto-browserify>randomfill":true}},"browserify>crypto-browserify>browserify-cipher":{"packages":{"browserify>crypto-browserify>browserify-cipher>browserify-aes":true,"browserify>crypto-browserify>browserify-cipher>browserify-des":true,"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":true}},"browserify>crypto-browserify>browserify-cipher>browserify-aes":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>buffer":true,"browserify>crypto-browserify>browserify-cipher>browserify-aes>buffer-xor":true,"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":true,"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>browserify-cipher>browserify-aes>buffer-xor":{"packages":{"browserify>buffer":true}},"browserify>crypto-browserify>browserify-cipher>browserify-des":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>browserify-cipher>browserify-des>des.js":true,"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>browserify-cipher>browserify-des>des.js":{"packages":{"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>inherits":true}},"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-hash>md5.js":true}},"browserify>crypto-browserify>browserify-sign":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>browserify-sign>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>create-hmac":true,"browserify>crypto-browserify>public-encrypt>browserify-rsa":true,"browserify>crypto-browserify>public-encrypt>parse-asn1":true,"browserify>inherits":true,"stream-browserify>readable-stream":true}},"browserify>crypto-browserify>browserify-sign>bn.js":{"globals":{"Buffer":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>create-ecdh":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic":true}},"browserify>crypto-browserify>create-ecdh>bn.js":{"globals":{"Buffer":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>create-ecdh>elliptic":{"packages":{"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>brorand":true,"browserify>crypto-browserify>create-ecdh>elliptic>hash.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>hmac-drbg":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-crypto-utils":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-ecdh>elliptic>brorand":{"globals":{"crypto":true,"msCrypto":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>create-ecdh>elliptic>hash.js":{"packages":{"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-ecdh>elliptic>hmac-drbg":{"packages":{"browserify>crypto-browserify>create-ecdh>elliptic>hash.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-crypto-utils":true}},"browserify>crypto-browserify>create-hash":{"packages":{"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>crypto-browserify>create-hash>md5.js":true,"browserify>crypto-browserify>pbkdf2>ripemd160":true,"browserify>crypto-browserify>pbkdf2>sha.js":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-hash>cipher-base":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>inherits":true,"browserify>string_decoder":true,"stream-browserify":true}},"browserify>crypto-browserify>create-hash>md5.js":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>pbkdf2>ripemd160>hash-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-hmac":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>crypto-browserify>pbkdf2>ripemd160":true,"browserify>crypto-browserify>pbkdf2>sha.js":true,"browserify>inherits":true}},"browserify>crypto-browserify>diffie-hellman":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>diffie-hellman>miller-rabin":true,"browserify>crypto-browserify>randombytes":true}},"browserify>crypto-browserify>diffie-hellman>miller-rabin":{"packages":{"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>brorand":true}},"browserify>crypto-browserify>pbkdf2":{"globals":{"crypto":true,"process":true},"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>pbkdf2>ripemd160":true,"browserify>crypto-browserify>pbkdf2>sha.js":true,"process":true}},"browserify>crypto-browserify>pbkdf2>ripemd160":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>pbkdf2>ripemd160>hash-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>pbkdf2>ripemd160>hash-base":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>inherits":true,"stream-browserify>readable-stream":true}},"browserify>crypto-browserify>pbkdf2>sha.js":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>inherits":true}},"browserify>crypto-browserify>public-encrypt":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>public-encrypt>browserify-rsa":true,"browserify>crypto-browserify>public-encrypt>parse-asn1":true,"browserify>crypto-browserify>randombytes":true}},"browserify>crypto-browserify>public-encrypt>browserify-rsa":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>public-encrypt>browserify-rsa>bn.js":true,"browserify>crypto-browserify>randombytes":true}},"browserify>crypto-browserify>public-encrypt>browserify-rsa>bn.js":{"globals":{"Buffer":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>public-encrypt>parse-asn1":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>browserify-cipher>browserify-aes":true,"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":true,"browserify>crypto-browserify>pbkdf2":true,"browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js":true}},"browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js":{"packages":{"@wdio/cli>inquirer>external-editor>iconv-lite>safer-buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>inherits":true}},"browserify>crypto-browserify>randombytes":{"globals":{"crypto":true,"msCrypto":true},"packages":{"browserify>browser-pack>safe-buffer":true,"process":true}},"browserify>crypto-browserify>randomfill":{"globals":{"crypto":true,"msCrypto":true},"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>randombytes":true,"process":true}},"browserify>events":{"globals":{"console":true}},"browserify>readable-stream>core-util-is":{"packages":{"browserify>insert-module-globals>is-buffer":true}},"browserify>readable-stream>process-nextick-args":{"packages":{"process":true}},"browserify>readable-stream>util-deprecate":{"globals":{"console.trace":true,"console.warn":true,"localStorage":true}},"browserify>string_decoder":{"packages":{"browserify>browser-pack>safe-buffer":true}},"browserify>timers-browserify":{"globals":{"clearInterval":true,"clearTimeout":true,"setInterval":true,"setTimeout":true},"packages":{"process":true}},"eslint>debug":{"globals":{"console":true,"document":true,"localStorage":true,"navigator":true,"process":true},"packages":{"eslint>debug>ms":true,"process":true}},"eth-rpc-errors":{"packages":{"eth-rpc-errors>fast-safe-stringify":true}},"external:../snaps-utils/src/checksum.ts":{"packages":{"@metamask/rpc-methods>@noble/hashes":true,"@metamask/utils":true,"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"external:../snaps-utils/src/cronjob.ts":{"packages":{"@metamask/snaps-utils>cron-parser":true,"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/deep-clone.ts":{"packages":{"@metamask/snaps-utils>rfdc":true}},"external:../snaps-utils/src/icon.ts":{"builtin":{"buffer":true},"packages":{"@metamask/snaps-utils>is-svg":true,"@metamask/utils":true,"browserify>buffer":true}},"external:../snaps-utils/src/index.browser.ts":{"packages":{"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/deep-clone.ts":true,"external:../snaps-utils/src/default-endowments.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/handlers.ts":true,"external:../snaps-utils/src/iframe.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/logging.ts":true,"external:../snaps-utils/src/manifest/index.browser.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/notification.ts":true,"external:../snaps-utils/src/path.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"external:../snaps-utils/src/validation.ts":true,"external:../snaps-utils/src/versions.ts":true,"external:../snaps-utils/src/virtual-file/index.browser.ts":true}},"external:../snaps-utils/src/json-rpc.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/logging.ts":{"globals":{"console":true},"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/manifest/index.browser.ts":{"packages":{"external:../snaps-utils/src/manifest/validation.ts":true}},"external:../snaps-utils/src/manifest/validation.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true}},"external:../snaps-utils/src/namespace.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/notification.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/namespace.ts":true,"superstruct":true}},"external:../snaps-utils/src/path.ts":{"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/snaps.ts":{"packages":{"@metamask/snaps-utils>@scure/base":true,"@metamask/snaps-utils>validate-npm-package-name":true,"@metamask/utils":true,"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true,"ts-jest>fast-json-stable-stringify":true}},"external:../snaps-utils/src/types.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/validation.ts":{"packages":{"external:../snaps-utils/src/icon.ts":true,"external:../snaps-utils/src/manifest/validation.ts":true,"external:../snaps-utils/src/snaps.ts":true}},"external:../snaps-utils/src/versions.ts":{"packages":{"@metamask/utils":true,"superstruct":true,"ts-jest>semver":true}},"external:../snaps-utils/src/virtual-file/VirtualFile.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/deep-clone.ts":true}},"external:../snaps-utils/src/virtual-file/index.browser.ts":{"packages":{"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"json-rpc-engine":{"packages":{"eth-rpc-errors":true,"json-rpc-engine>@metamask/safe-event-emitter":true}},"json-rpc-engine>@metamask/safe-event-emitter":{"globals":{"setTimeout":true},"packages":{"browserify>events":true}},"process":{"globals":{"clearTimeout":true,"setTimeout":true}},"pump":{"packages":{"browserify>browser-resolve":true,"process":true,"pump>end-of-stream":true,"pump>once":true}},"pump>end-of-stream":{"packages":{"process":true,"pump>once":true}},"pump>once":{"packages":{"pump>once>wrappy":true}},"stream-browserify":{"packages":{"browserify>events":true,"browserify>inherits":true,"stream-browserify>readable-stream":true}},"stream-browserify>readable-stream":{"packages":{"browserify>browser-resolve":true,"browserify>buffer":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>util-deprecate":true,"browserify>string_decoder":true,"process":true}},"ts-jest>semver":{"globals":{"console.error":true},"packages":{"process":true,"ts-jest>semver>lru-cache":true}},"ts-jest>semver>lru-cache":{"packages":{"ts-jest>semver>lru-cache>yallist":true}}}})
18071
+ }, {package:"external:../snaps-utils/src/virtual-file/index.browser.ts",file:"../snaps-utils/src/virtual-file/index.browser.ts",}]],[382],{"resources":{"@metamask/object-multiplex":{"globals":{"console.warn":true},"packages":{"@metamask/object-multiplex>readable-stream":true,"pump>end-of-stream":true,"pump>once":true}},"@metamask/object-multiplex>readable-stream":{"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true,"@metamask/object-multiplex>readable-stream>string_decoder":true,"browserify>browser-resolve":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"browserify>timers-browserify":true,"process":true}},"@metamask/object-multiplex>readable-stream>safe-buffer":{"packages":{"browserify>buffer":true}},"@metamask/object-multiplex>readable-stream>string_decoder":{"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true}},"@metamask/post-message-stream":{"globals":{"MessageEvent.prototype":true,"WorkerGlobalScope":true,"addEventListener":true,"browser":true,"chrome":true,"location.origin":true,"postMessage":true,"removeEventListener":true},"packages":{"@metamask/post-message-stream>@metamask/utils":true,"@metamask/post-message-stream>readable-stream":true}},"@metamask/post-message-stream>@metamask/utils":{"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"@metamask/utils>semver":true,"browserify>buffer":true,"eslint>debug":true,"superstruct":true}},"@metamask/post-message-stream>readable-stream":{"packages":{"@metamask/post-message-stream>readable-stream>process-nextick-args":true,"@metamask/post-message-stream>readable-stream>safe-buffer":true,"@metamask/post-message-stream>readable-stream>string_decoder":true,"browserify>browser-resolve":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>util-deprecate":true,"browserify>timers-browserify":true,"process":true}},"@metamask/post-message-stream>readable-stream>process-nextick-args":{"packages":{"process":true}},"@metamask/post-message-stream>readable-stream>safe-buffer":{"packages":{"browserify>buffer":true}},"@metamask/post-message-stream>readable-stream>string_decoder":{"packages":{"@metamask/post-message-stream>readable-stream>safe-buffer":true}},"@metamask/providers":{"globals":{"Event":true,"addEventListener":true,"chrome.runtime.connect":true,"console":true,"dispatchEvent":true,"document.createElement":true,"document.readyState":true,"ethereum":"write","location.hostname":true,"removeEventListener":true,"web3":true},"packages":{"@metamask/object-multiplex":true,"@metamask/providers>@metamask/safe-event-emitter":true,"@metamask/providers>detect-browser":true,"@metamask/providers>extension-port-stream":true,"@metamask/providers>fast-deep-equal":true,"@metamask/providers>is-stream":true,"@metamask/providers>json-rpc-middleware-stream":true,"eth-rpc-errors":true,"json-rpc-engine":true,"pump":true}},"@metamask/providers>@metamask/safe-event-emitter":{"globals":{"setTimeout":true},"packages":{"browserify>events":true}},"@metamask/providers>detect-browser":{"globals":{"document":true,"navigator":true},"packages":{"process":true}},"@metamask/providers>extension-port-stream":{"packages":{"browserify>buffer":true,"stream-browserify":true}},"@metamask/providers>json-rpc-middleware-stream":{"globals":{"console.warn":true,"setTimeout":true},"packages":{"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream":true}},"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":{"globals":{"setTimeout":true},"packages":{"browserify>events":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream":{"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":true,"browserify>browser-resolve":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"browserify>timers-browserify":true,"process":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":{"packages":{"browserify>buffer":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":{"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true}},"@metamask/rpc-methods>@noble/hashes":{"globals":{"TextEncoder":true,"crypto":true}},"@metamask/snaps-utils>@scure/base":{"globals":{"TextDecoder":true,"TextEncoder":true}},"@metamask/snaps-utils>cron-parser":{"packages":{"@metamask/snaps-utils>cron-parser>luxon":true,"browserify>browser-resolve":true}},"@metamask/snaps-utils>cron-parser>luxon":{"globals":{"Intl":true}},"@metamask/snaps-utils>is-svg":{"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser":true}},"@metamask/snaps-utils>is-svg>fast-xml-parser":{"globals":{"entityName":true,"val":true},"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser>strnum":true}},"@metamask/snaps-utils>rfdc":{"packages":{"browserify>buffer":true}},"@metamask/snaps-utils>validate-npm-package-name":{"packages":{"@metamask/snaps-utils>validate-npm-package-name>builtins":true}},"@metamask/snaps-utils>validate-npm-package-name>builtins":{"packages":{"@metamask/utils>semver":true,"process":true}},"@metamask/utils":{"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"@metamask/utils>semver":true,"browserify>buffer":true,"eslint>debug":true,"superstruct":true}},"@metamask/utils>semver":{"globals":{"console.error":true},"packages":{"@metamask/utils>semver>lru-cache":true,"process":true}},"@metamask/utils>semver>lru-cache":{"packages":{"@metamask/utils>semver>lru-cache>yallist":true}},"@wdio/cli>inquirer>external-editor>iconv-lite>safer-buffer":{"packages":{"browserify>buffer":true,"process":true}},"browserify>browser-pack>safe-buffer":{"packages":{"browserify>buffer":true}},"browserify>buffer":{"globals":{"console":true},"packages":{"buffer>base64-js":true,"buffer>ieee754":true}},"browserify>crypto-browserify":{"packages":{"browserify>crypto-browserify>browserify-cipher":true,"browserify>crypto-browserify>browserify-sign":true,"browserify>crypto-browserify>create-ecdh":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>create-hmac":true,"browserify>crypto-browserify>diffie-hellman":true,"browserify>crypto-browserify>pbkdf2":true,"browserify>crypto-browserify>public-encrypt":true,"browserify>crypto-browserify>randombytes":true,"browserify>crypto-browserify>randomfill":true}},"browserify>crypto-browserify>browserify-cipher":{"packages":{"browserify>crypto-browserify>browserify-cipher>browserify-aes":true,"browserify>crypto-browserify>browserify-cipher>browserify-des":true,"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":true}},"browserify>crypto-browserify>browserify-cipher>browserify-aes":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>buffer":true,"browserify>crypto-browserify>browserify-cipher>browserify-aes>buffer-xor":true,"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":true,"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>browserify-cipher>browserify-aes>buffer-xor":{"packages":{"browserify>buffer":true}},"browserify>crypto-browserify>browserify-cipher>browserify-des":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>browserify-cipher>browserify-des>des.js":true,"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>browserify-cipher>browserify-des>des.js":{"packages":{"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>inherits":true}},"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-hash>md5.js":true}},"browserify>crypto-browserify>browserify-sign":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>browserify-sign>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>create-hmac":true,"browserify>crypto-browserify>public-encrypt>browserify-rsa":true,"browserify>crypto-browserify>public-encrypt>parse-asn1":true,"browserify>inherits":true,"stream-browserify>readable-stream":true}},"browserify>crypto-browserify>browserify-sign>bn.js":{"globals":{"Buffer":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>create-ecdh":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic":true}},"browserify>crypto-browserify>create-ecdh>bn.js":{"globals":{"Buffer":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>create-ecdh>elliptic":{"packages":{"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>brorand":true,"browserify>crypto-browserify>create-ecdh>elliptic>hash.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>hmac-drbg":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-crypto-utils":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-ecdh>elliptic>brorand":{"globals":{"crypto":true,"msCrypto":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>create-ecdh>elliptic>hash.js":{"packages":{"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-ecdh>elliptic>hmac-drbg":{"packages":{"browserify>crypto-browserify>create-ecdh>elliptic>hash.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-crypto-utils":true}},"browserify>crypto-browserify>create-hash":{"packages":{"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>crypto-browserify>create-hash>md5.js":true,"browserify>crypto-browserify>pbkdf2>ripemd160":true,"browserify>crypto-browserify>pbkdf2>sha.js":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-hash>cipher-base":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>inherits":true,"browserify>string_decoder":true,"stream-browserify":true}},"browserify>crypto-browserify>create-hash>md5.js":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>pbkdf2>ripemd160>hash-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>create-hmac":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>create-hash>cipher-base":true,"browserify>crypto-browserify>pbkdf2>ripemd160":true,"browserify>crypto-browserify>pbkdf2>sha.js":true,"browserify>inherits":true}},"browserify>crypto-browserify>diffie-hellman":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>diffie-hellman>miller-rabin":true,"browserify>crypto-browserify>randombytes":true}},"browserify>crypto-browserify>diffie-hellman>miller-rabin":{"packages":{"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>brorand":true}},"browserify>crypto-browserify>pbkdf2":{"globals":{"crypto":true,"process":true},"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>pbkdf2>ripemd160":true,"browserify>crypto-browserify>pbkdf2>sha.js":true,"process":true}},"browserify>crypto-browserify>pbkdf2>ripemd160":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>pbkdf2>ripemd160>hash-base":true,"browserify>inherits":true}},"browserify>crypto-browserify>pbkdf2>ripemd160>hash-base":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>inherits":true,"stream-browserify>readable-stream":true}},"browserify>crypto-browserify>pbkdf2>sha.js":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>inherits":true}},"browserify>crypto-browserify>public-encrypt":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-hash":true,"browserify>crypto-browserify>public-encrypt>browserify-rsa":true,"browserify>crypto-browserify>public-encrypt>parse-asn1":true,"browserify>crypto-browserify>randombytes":true}},"browserify>crypto-browserify>public-encrypt>browserify-rsa":{"packages":{"browserify>buffer":true,"browserify>crypto-browserify>public-encrypt>browserify-rsa>bn.js":true,"browserify>crypto-browserify>randombytes":true}},"browserify>crypto-browserify>public-encrypt>browserify-rsa>bn.js":{"globals":{"Buffer":true},"packages":{"browserify>browser-resolve":true}},"browserify>crypto-browserify>public-encrypt>parse-asn1":{"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>browserify-cipher>browserify-aes":true,"browserify>crypto-browserify>browserify-cipher>evp_bytestokey":true,"browserify>crypto-browserify>pbkdf2":true,"browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js":true}},"browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js":{"packages":{"@wdio/cli>inquirer>external-editor>iconv-lite>safer-buffer":true,"browserify>crypto-browserify>create-ecdh>bn.js":true,"browserify>crypto-browserify>create-ecdh>elliptic>minimalistic-assert":true,"browserify>inherits":true}},"browserify>crypto-browserify>randombytes":{"globals":{"crypto":true,"msCrypto":true},"packages":{"browserify>browser-pack>safe-buffer":true,"process":true}},"browserify>crypto-browserify>randomfill":{"globals":{"crypto":true,"msCrypto":true},"packages":{"browserify>browser-pack>safe-buffer":true,"browserify>crypto-browserify>randombytes":true,"process":true}},"browserify>events":{"globals":{"console":true}},"browserify>readable-stream>core-util-is":{"packages":{"browserify>insert-module-globals>is-buffer":true}},"browserify>readable-stream>process-nextick-args":{"packages":{"process":true}},"browserify>readable-stream>util-deprecate":{"globals":{"console.trace":true,"console.warn":true,"localStorage":true}},"browserify>string_decoder":{"packages":{"browserify>browser-pack>safe-buffer":true}},"browserify>timers-browserify":{"globals":{"clearInterval":true,"clearTimeout":true,"setInterval":true,"setTimeout":true},"packages":{"process":true}},"eslint>debug":{"globals":{"console":true,"document":true,"localStorage":true,"navigator":true,"process":true},"packages":{"eslint>debug>ms":true,"process":true}},"eth-rpc-errors":{"packages":{"eth-rpc-errors>fast-safe-stringify":true}},"external:../snaps-utils/src/checksum.ts":{"packages":{"@metamask/rpc-methods>@noble/hashes":true,"@metamask/utils":true,"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"external:../snaps-utils/src/cronjob.ts":{"packages":{"@metamask/snaps-utils>cron-parser":true,"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/deep-clone.ts":{"packages":{"@metamask/snaps-utils>rfdc":true}},"external:../snaps-utils/src/icon.ts":{"builtin":{"buffer":true},"packages":{"@metamask/snaps-utils>is-svg":true,"@metamask/utils":true,"browserify>buffer":true}},"external:../snaps-utils/src/index.browser.ts":{"packages":{"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/deep-clone.ts":true,"external:../snaps-utils/src/default-endowments.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/handlers.ts":true,"external:../snaps-utils/src/iframe.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/logging.ts":true,"external:../snaps-utils/src/manifest/index.browser.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/notification.ts":true,"external:../snaps-utils/src/path.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"external:../snaps-utils/src/validation.ts":true,"external:../snaps-utils/src/versions.ts":true,"external:../snaps-utils/src/virtual-file/index.browser.ts":true}},"external:../snaps-utils/src/json-rpc.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/logging.ts":{"globals":{"console":true},"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/manifest/index.browser.ts":{"packages":{"external:../snaps-utils/src/manifest/validation.ts":true}},"external:../snaps-utils/src/manifest/validation.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true}},"external:../snaps-utils/src/namespace.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/notification.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/namespace.ts":true,"superstruct":true}},"external:../snaps-utils/src/path.ts":{"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/snaps.ts":{"packages":{"@metamask/snaps-utils>@scure/base":true,"@metamask/snaps-utils>fast-json-stable-stringify":true,"@metamask/snaps-utils>validate-npm-package-name":true,"@metamask/utils":true,"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true}},"external:../snaps-utils/src/types.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/validation.ts":{"packages":{"external:../snaps-utils/src/icon.ts":true,"external:../snaps-utils/src/manifest/validation.ts":true,"external:../snaps-utils/src/snaps.ts":true}},"external:../snaps-utils/src/versions.ts":{"packages":{"@metamask/utils":true,"@metamask/utils>semver":true,"superstruct":true}},"external:../snaps-utils/src/virtual-file/VirtualFile.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/deep-clone.ts":true}},"external:../snaps-utils/src/virtual-file/index.browser.ts":{"packages":{"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"json-rpc-engine":{"packages":{"eth-rpc-errors":true,"json-rpc-engine>@metamask/safe-event-emitter":true}},"json-rpc-engine>@metamask/safe-event-emitter":{"globals":{"setTimeout":true},"packages":{"browserify>events":true}},"process":{"globals":{"clearTimeout":true,"setTimeout":true}},"pump":{"packages":{"browserify>browser-resolve":true,"process":true,"pump>end-of-stream":true,"pump>once":true}},"pump>end-of-stream":{"packages":{"process":true,"pump>once":true}},"pump>once":{"packages":{"pump>once>wrappy":true}},"stream-browserify":{"packages":{"browserify>events":true,"browserify>inherits":true,"stream-browserify>readable-stream":true}},"stream-browserify>readable-stream":{"packages":{"browserify>browser-resolve":true,"browserify>buffer":true,"browserify>events":true,"browserify>inherits":true,"browserify>readable-stream>util-deprecate":true,"browserify>string_decoder":true,"process":true}}}})
18072
18072
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9AbGF2YW1vYXQvbGF2YXBhY2svc3JjL19wcmVsdWRlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24oKSB7XG4gIC8vIHRoaXMgcnVudGltZSB0ZW1wbGF0ZSBjb2RlIGlzIGRlc3RpbmVkIHRvIHdyYXAgTGF2YU1vYXQgZW50aXJlbHksXG4gIC8vIHRoZXJlZm9yZSB0aGlzIGlzIG91ciB3YXkgb2YgY2FwdHVyaW5nIGFjY2VzcyB0byBiYXNpYyBBUElzIExhdmFNb2F0XG4gIC8vIHVzZXMgdG8gc3RpbGwgYmUgYWNjZXNzaWJsZSBvbmx5IHRvIExhdmFNb2F0IGFmdGVyIHNjdXR0bGluZyBvY2N1cnNcbiAgY29uc3Qge1xuICAgIFJlZ0V4cCxcbiAgICBSZWZsZWN0LFxuICAgIE9iamVjdCxcbiAgICBFcnJvcixcbiAgICBBcnJheSxcbiAgICBTZXQsXG4gICAgTWF0aCxcbiAgICBEYXRlLFxuICAgIGNvbnNvbGUsXG4gIH0gPSBnbG9iYWxUaGlzXG5cbiAgY29uc3QgbW9kdWxlUmVnaXN0cnkgPSBuZXcgTWFwKClcbiAgY29uc3QgbGF2YW1vYXRQb2xpY3kgPSB7IHJlc291cmNlczoge30gfVxuICBjb25zdCBkZWJ1Z01vZGUgPSBmYWxzZVxuICBjb25zdCBzdGF0c01vZGUgPSBmYWxzZVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGtlcm5lbFxuICBjb25zdCByZXBvcnRTdGF0c0hvb2sgPSBzdGF0c01vZGUgPyAoZnVuY3Rpb24gbWFrZUluaXRTdGF0c0hvb2sgKHsgb25TdGF0c1JlYWR5IH0pIHtcbiAgbGV0IHN0YXRNb2R1bGVTdGFjayA9IFtdXG4gIHJldHVybiByZXBvcnRTdGF0c0hvb2tcblxuICBmdW5jdGlvbiByZXBvcnRTdGF0c0hvb2sgKGV2ZW50LCBtb2R1bGVJZCkge1xuICAgIGlmIChldmVudCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgLy8gcmVjb3JkIHN0YXJ0XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAvLyBjb25zb2xlLmxvZyhgbG9hZGVkIG1vZHVsZSAke21vZHVsZUlkfWApXG4gICAgICBjb25zdCBzdGF0UmVjb3JkID0ge1xuICAgICAgICAnbmFtZSc6IG1vZHVsZUlkLFxuICAgICAgICAndmFsdWUnOiBudWxsLFxuICAgICAgICAnY2hpbGRyZW4nOiBbXSxcbiAgICAgICAgJ3N0YXJ0VGltZSc6IHN0YXJ0VGltZSxcbiAgICAgICAgJ2VuZFRpbWUnOiBudWxsLFxuICAgICAgfVxuICAgICAgLy8gYWRkIGFzIGNoaWxkIHRvIGN1cnJlbnRcbiAgICAgIGlmIChzdGF0TW9kdWxlU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdCA9IHN0YXRNb2R1bGVTdGFja1tzdGF0TW9kdWxlU3RhY2subGVuZ3RoIC0gMV1cbiAgICAgICAgY3VycmVudFN0YXQuY2hpbGRyZW4ucHVzaChzdGF0UmVjb3JkKVxuICAgICAgfVxuICAgICAgLy8gc2V0IGFzIGN1cnJlbnRcbiAgICAgIHN0YXRNb2R1bGVTdGFjay5wdXNoKHN0YXRSZWNvcmQpXG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2VuZCcpIHtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCBjdXJyZW50U3RhdCA9IHN0YXRNb2R1bGVTdGFja1tzdGF0TW9kdWxlU3RhY2subGVuZ3RoIC0gMV1cbiAgICAgIC8vIHNhbml0eSBjaGVjaywgc2hvdWxkIG9ubHkgZ2V0IGFuIGVuZCBmb3IgdGhlIGN1cnJlbnQgdG9wIG9mIHN0YWNrXG4gICAgICBpZiAoY3VycmVudFN0YXQubmFtZSAhPT0gbW9kdWxlSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgc3RhdHMgaG9vayBtaXNhbGlnbmVkIFwiJHtjdXJyZW50U3RhdC5uYW1lfVwiLCBcIiR7bW9kdWxlSWR9XCIgJHtzdGF0TW9kdWxlU3RhY2subWFwKGUgPT4gZS5uYW1lKS5qb2luKCl9YClcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRTdGF0LmVuZFRpbWUgPSBlbmRUaW1lXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBjdXJyZW50U3RhdC5zdGFydFRpbWVcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZVxuICAgICAgY3VycmVudFN0YXQudmFsdWUgPSBkdXJhdGlvblxuICAgICAgLy8gY29uc29sZS5sb2coYGxvYWRlZCBtb2R1bGUgJHttb2R1bGVJZH0gaW4gJHtkdXJhdGlvbn1tc2ApXG4gICAgICAvLyBjaGVjayBpZiB0b3RhbGx5IGRvbmVcbiAgICAgIGlmIChzdGF0TW9kdWxlU3RhY2subGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0LnZlcnNpb24gPSAxXG4gICAgICAgIG9uU3RhdHNSZWFkeShjdXJyZW50U3RhdClcbiAgICAgIH1cbiAgICAgIHN0YXRNb2R1bGVTdGFjay5wb3AoKVxuICAgIH1cbiAgfVxuXG59KSh7IG9uU3RhdHNSZWFkeSB9KSA6ICgpID0+IHt9XG4gIGNvbnN0IGNyZWF0ZUtlcm5lbCA9IC8vIExhdmFNb2F0IFByZWx1ZGVcbihmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjcmVhdGVLZXJuZWxcblxuICBmdW5jdGlvbiBjcmVhdGVLZXJuZWwgKHtcbiAgICBsYXZhbW9hdENvbmZpZyxcbiAgICBsb2FkTW9kdWxlRGF0YSxcbiAgICBnZXRSZWxhdGl2ZU1vZHVsZUlkLFxuICAgIHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MsXG4gICAgZ2V0RXh0ZXJuYWxDb21wYXJ0bWVudCxcbiAgICBnbG9iYWxUaGlzUmVmcyxcbiAgICBydW5XaXRoUHJlY29tcGlsZWRNb2R1bGVzLFxuICAgIHJlcG9ydFN0YXRzSG9vayxcbiAgfSkge1xuICAgIC8vIGRlYnVnIG9wdGlvbnMgYXJlIGhhcmQtY29kZWQgYXQgYnVpbGQgdGltZVxuICAgIGNvbnN0IHtcbiAgICAgIGRlYnVnTW9kZSxcbiAgICB9ID0ge1wiZGVidWdNb2RlXCI6ZmFsc2V9XG4gICAgLy8gc2VjdXJpdHkgb3B0aW9ucyBhcmUgaGFyZC1jb2RlZCBhdCBidWlsZCB0aW1lXG4gICAgY29uc3Qge1xuICAgICAgc2N1dHRsZUdsb2JhbFRoaXMsXG4gICAgICBzY3V0dGxlR2xvYmFsVGhpc0V4Y2VwdGlvbnMsXG4gICAgfSA9IHtcInNjdXR0bGVHbG9iYWxUaGlzXCI6dHJ1ZSxcInNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9uc1wiOltcInBvc3RNZXNzYWdlXCIsXCJyZW1vdmVFdmVudExpc3RlbmVyXCIsXCJpc1NlY3VyZUNvbnRleHRcIl19XG5cbiAgICAvLyBpZGVudGlmeSB0aGUgZ2xvYmFsUmVmXG4gICAgY29uc3QgZ2xvYmFsUmVmID0gKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJykgPyBnbG9iYWxUaGlzIDogKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykgPyBzZWxmIDogKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSA/IGdsb2JhbCA6IHVuZGVmaW5lZFxuICAgIGlmICghZ2xvYmFsUmVmKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhdmFtb2F0IC0gdW5hYmxlIHRvIGlkZW50aWZ5IGdsb2JhbFJlZicpXG4gICAgfVxuXG4gICAgLy8gcG9seWZpbGwgZ2xvYmFsVGhpc1xuICAgIGlmIChnbG9iYWxSZWYgJiYgIWdsb2JhbFJlZi5nbG9iYWxUaGlzKSB7XG4gICAgICBnbG9iYWxSZWYuZ2xvYmFsVGhpcyA9IGdsb2JhbFJlZlxuICAgIH1cblxuICAgIC8vIGNyZWF0ZSB0aGUgU0VTIHJvb3RSZWFsbVxuICAgIC8vIFwidGVtcGxhdGVSZXF1aXJlXCIgY2FsbHMgYXJlIGlubGluZWQgaW4gXCJnZW5lcmF0ZUtlcm5lbFwiXG4gICAgLy8gbG9hZC1iZWFyaW5nIHNlbWktY29sb24sIGRvIG5vdCByZW1vdmVcbiAgICA7Ly8gZGVmaW5lIHNlc1xuKGZ1bmN0aW9uKCl7XG4gIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFJlZlxuICBjb25zdCBleHBvcnRzID0ge31cbiAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzIH1cbiAgOyhmdW5jdGlvbigpe1xuLy8gU1RBUlQgb2YgaW5qZWN0ZWQgY29kZSBmcm9tIHNlc1xuJ3VzZSBzdHJpY3QnO1xuKCgpID0+IHtcbiAgY29uc3QgZnVuY3RvcnMgPSBbXG4vLyA9PT0gZnVuY3RvcnNbMF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cblxuLyoqXG4gKiBjb21tb25zLmpzXG4gKiBEZWNsYXJlIHNob3J0aGFuZCBmdW5jdGlvbnMuIFNoYXJpbmcgdGhlc2UgZGVjbGFyYXRpb25zIGFjcm9zcyBtb2R1bGVzXG4gKiBpbXByb3ZlcyBvbiBjb25zaXN0ZW5jeSBhbmQgbWluaWZpY2F0aW9uLiBVbnVzZWQgZGVjbGFyYXRpb25zIGFyZVxuICogZHJvcHBlZCBieSB0aGUgdHJlZSBzaGFraW5nIHByb2Nlc3MuXG4gKlxuICogV2UgY2FwdHVyZSB0aGVzZSwgbm90IGp1c3QgZm9yIGJyZXZpdHksIGJ1dCBmb3Igc2VjdXJpdHkuIElmIGFueSBjb2RlXG4gKiBtb2RpZmllcyBPYmplY3QgdG8gY2hhbmdlIHdoYXQgJ2Fzc2lnbicgcG9pbnRzIHRvLCB0aGUgQ29tcGFydG1lbnQgc2hpbVxuICogd291bGQgYmUgY29ycnVwdGVkLlxuICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgZ2xvYmFsVGhpcyBhcyB0aGUgbG9jYWwgbmFtZSBzaW5jZSBpdCB3b3VsZCBjYXB0dXJlIHRoZVxuLy8gbGV4aWNhbCBuYW1lLlxuY29uc3QgdW5pdmVyc2FsVGhpcz0gIGdsb2JhbFRoaXM7JGjigI1fb25jZS51bml2ZXJzYWxUaGlzKHVuaXZlcnNhbFRoaXMpO1xuXG5cbmNvbnN0ICAgICAgICB7XG4gIEFycmF5LFxuICBEYXRlLFxuICBGaW5hbGl6YXRpb25SZWdpc3RyeSxcbiAgRmxvYXQzMkFycmF5LFxuICBKU09OLFxuICBNYXAsXG4gIE1hdGgsXG4gIE51bWJlcixcbiAgT2JqZWN0LFxuICBQcm9taXNlLFxuICBQcm94eSxcbiAgUmVmbGVjdCxcbiAgUmVnRXhwOiBGRVJBTF9SRUdfRVhQLFxuICBTZXQsXG4gIFN0cmluZyxcbiAgV2Vha01hcCxcbiAgV2Vha1NldH09XG4gICAgZ2xvYmFsVGhpczskaOKAjV9vbmNlLkFycmF5KEFycmF5KTskaOKAjV9vbmNlLkRhdGUoRGF0ZSk7JGjigI1fb25jZS5GaW5hbGl6YXRpb25SZWdpc3RyeShGaW5hbGl6YXRpb25SZWdpc3RyeSk7JGjigI1fb25jZS5GbG9hdDMyQXJyYXkoRmxvYXQzMkFycmF5KTskaOKAjV9vbmNlLkpTT04oSlNPTik7JGjigI1fb25jZS5NYXAoTWFwKTskaOKAjV9vbmNlLk1hdGgoTWF0aCk7JGjigI1fb25jZS5OdW1iZXIoTnVtYmVyKTskaOKAjV9vbmNlLk9iamVjdChPYmplY3QpOyRo4oCNX29uY2UuUHJvbWlzZShQcm9taXNlKTskaOKAjV9vbmNlLlByb3h5KFByb3h5KTskaOKAjV9vbmNlLlJlZmxlY3QoUmVmbGVjdCk7JGjigI1fb25jZS5GRVJBTF9SRUdfRVhQKEZFUkFMX1JFR19FWFApOyRo4oCNX29uY2UuU2V0KFNldCk7JGjigI1fb25jZS5TdHJpbmcoU3RyaW5nKTskaOKAjV9vbmNlLldlYWtNYXAoV2Vha01hcCk7JGjigI1fb25jZS5XZWFrU2V0KFdlYWtTZXQpO1xuXG5jb25zdCAgICAgICAge1xuICAvLyBUaGUgZmVyYWwgRXJyb3IgY29uc3RydWN0b3IgaXMgc2FmZSBmb3IgaW50ZXJuYWwgdXNlLCBidXQgbXVzdCBub3QgYmVcbiAgLy8gcmV2ZWFsZWQgdG8gcG9zdC1sb2NrZG93biBjb2RlIGluIGFueSBjb21wYXJ0bWVudCBpbmNsdWRpbmcgdGhlIHN0YXJ0XG4gIC8vIGNvbXBhcnRtZW50IHNpbmNlIGluIFY4IGF0IGxlYXN0IGl0IGJlYXJzIHN0YWNrIGluc3BlY3Rpb24gY2FwYWJpbGl0aWVzLlxuICBFcnJvcjogRkVSQUxfRVJST1IsXG4gIFJhbmdlRXJyb3IsXG4gIFJlZmVyZW5jZUVycm9yLFxuICBTeW50YXhFcnJvcixcbiAgVHlwZUVycm9yfT1cbiAgICBnbG9iYWxUaGlzOyRo4oCNX29uY2UuRkVSQUxfRVJST1IoRkVSQUxfRVJST1IpOyRo4oCNX29uY2UuUmFuZ2VFcnJvcihSYW5nZUVycm9yKTskaOKAjV9vbmNlLlJlZmVyZW5jZUVycm9yKFJlZmVyZW5jZUVycm9yKTskaOKAjV9vbmNlLlN5bnRheEVycm9yKFN5bnRheEVycm9yKTskaOKAjV9vbmNlLlR5cGVFcnJvcihUeXBlRXJyb3IpO1xuXG5jb25zdCAgICAgICAge1xuICBhc3NpZ24sXG4gIGNyZWF0ZSxcbiAgZGVmaW5lUHJvcGVydGllcyxcbiAgZW50cmllcyxcbiAgZnJlZXplLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGdldE93blByb3BlcnR5TmFtZXMsXG4gIGdldFByb3RvdHlwZU9mLFxuICBpcyxcbiAgaXNFeHRlbnNpYmxlLFxuICBrZXlzLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgc2VhbCxcbiAgcHJldmVudEV4dGVuc2lvbnMsXG4gIHNldFByb3RvdHlwZU9mLFxuICB2YWx1ZXMsXG4gIGZyb21FbnRyaWVzfT1cbiAgICBPYmplY3Q7JGjigI1fb25jZS5hc3NpZ24oYXNzaWduKTskaOKAjV9vbmNlLmNyZWF0ZShjcmVhdGUpOyRo4oCNX29uY2UuZGVmaW5lUHJvcGVydGllcyhkZWZpbmVQcm9wZXJ0aWVzKTskaOKAjV9vbmNlLmVudHJpZXMoZW50cmllcyk7JGjigI1fb25jZS5mcmVlemUoZnJlZXplKTskaOKAjV9vbmNlLmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpOyRo4oCNX29uY2UuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKTskaOKAjV9vbmNlLmdldE93blByb3BlcnR5TmFtZXMoZ2V0T3duUHJvcGVydHlOYW1lcyk7JGjigI1fb25jZS5nZXRQcm90b3R5cGVPZihnZXRQcm90b3R5cGVPZik7JGjigI1fb25jZS5pcyhpcyk7JGjigI1fb25jZS5pc0V4dGVuc2libGUoaXNFeHRlbnNpYmxlKTskaOKAjV9vbmNlLmtleXMoa2V5cyk7JGjigI1fb25jZS5vYmplY3RQcm90b3R5cGUob2JqZWN0UHJvdG90eXBlKTskaOKAjV9vbmNlLnNlYWwoc2VhbCk7JGjigI1fb25jZS5wcmV2ZW50RXh0ZW5zaW9ucyhwcmV2ZW50RXh0ZW5zaW9ucyk7JGjigI1fb25jZS5zZXRQcm90b3R5cGVPZihzZXRQcm90b3R5cGVPZik7JGjigI1fb25jZS52YWx1ZXModmFsdWVzKTskaOKAjV9vbmNlLmZyb21FbnRyaWVzKGZyb21FbnRyaWVzKTtcblxuY29uc3QgICAgICAgIHtcbiAgc3BlY2llczogc3BlY2llc1N5bWJvbCxcbiAgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sLFxuICBpdGVyYXRvcjogaXRlcmF0b3JTeW1ib2wsXG4gIG1hdGNoQWxsOiBtYXRjaEFsbFN5bWJvbCxcbiAgdW5zY29wYWJsZXM6IHVuc2NvcGFibGVzU3ltYm9sLFxuICBrZXlGb3I6IHN5bWJvbEtleUZvcixcbiAgZm9yOiBzeW1ib2xGb3J9PVxuICAgIFN5bWJvbDskaOKAjV9vbmNlLnNwZWNpZXNTeW1ib2woc3BlY2llc1N5bWJvbCk7JGjigI1fb25jZS50b1N0cmluZ1RhZ1N5bWJvbCh0b1N0cmluZ1RhZ1N5bWJvbCk7JGjigI1fb25jZS5pdGVyYXRvclN5bWJvbChpdGVyYXRvclN5bWJvbCk7JGjigI1fb25jZS5tYXRjaEFsbFN5bWJvbChtYXRjaEFsbFN5bWJvbCk7JGjigI1fb25jZS51bnNjb3BhYmxlc1N5bWJvbCh1bnNjb3BhYmxlc1N5bWJvbCk7JGjigI1fb25jZS5zeW1ib2xLZXlGb3Ioc3ltYm9sS2V5Rm9yKTskaOKAjV9vbmNlLnN5bWJvbEZvcihzeW1ib2xGb3IpO1xuXG5jb25zdCAgICAgICAgeyBpc0ludGVnZXJ9PSAgIE51bWJlcjskaOKAjV9vbmNlLmlzSW50ZWdlcihpc0ludGVnZXIpO1xuXG5jb25zdCAgICAgICAgeyBzdHJpbmdpZnk6IHN0cmluZ2lmeUpzb259PSAgIEpTT047XG5cbi8vIE5lZWRlZCBvbmx5IGZvciB0aGUgU2FmYXJpIGJ1ZyB3b3JrYXJvdW5kIGJlbG93XG4kaOKAjV9vbmNlLnN0cmluZ2lmeUpzb24oc3RyaW5naWZ5SnNvbik7Y29uc3R7ZGVmaW5lUHJvcGVydHk6b3JpZ2luYWxEZWZpbmVQcm9wZXJ0eX09T2JqZWN0O1xuXG5jb25zdCAgICAgICAgZGVmaW5lUHJvcGVydHk9ICAob2JqZWN0LCBwcm9wLCBkZXNjcmlwdG9yKT0+ICB7XG4gIC8vIFdlIHVzZWQgdG8gZG8gdGhlIGZvbGxvd2luZywgdW50aWwgd2UgaGFkIHRvIHJlb3BlbiBTYWZhcmkgYnVnXG4gIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjI1MzgjYzE3XG4gIC8vIE9uY2UgdGhpcyBpcyBmaXhlZCwgd2UgbWF5IHJlc3RvcmUgaXQuXG4gIC8vIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBhbGxvd2VkIHRvIGZhaWwgc2lsZW50bHkgc28gd2UgdXNlXG4gIC8vIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGluc3RlYWQuXG4gIC8vIHJldHVybiBkZWZpbmVQcm9wZXJ0aWVzKG9iamVjdCwgeyBbcHJvcF06IGRlc2NyaXB0b3IgfSk7XG5cbiAgLy8gSW5zdGVhZCwgdG8gd29ya2Fyb3VuZCB0aGUgU2FmYXJpIGJ1Z1xuICBjb25zdCByZXN1bHQ9ICBvcmlnaW5hbERlZmluZVByb3BlcnR5KG9iamVjdCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gIGlmKCByZXN1bHQhPT0gIG9iamVjdCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICBgUGxlYXNlIHJlcG9ydCB0aGF0IHRoZSBvcmlnaW5hbCBkZWZpbmVQcm9wZXJ0eSBzaWxlbnRseSBmYWlsZWQgdG8gc2V0ICR7c3RyaW5naWZ5SnNvbihcbiAgICAgICAgU3RyaW5nKHByb3ApKVxuICAgICAgICB9LiAoU0VTX0RFRklORV9QUk9QRVJUWV9GQUlMRURfU0lMRU5UTFkpYCk7XG5cbiAgIH1cbiAgcmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuZGVmaW5lUHJvcGVydHkoZGVmaW5lUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAge1xuICBhcHBseSxcbiAgY29uc3RydWN0LFxuICBnZXQ6IHJlZmxlY3RHZXQsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogcmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgaGFzOiByZWZsZWN0SGFzLFxuICBpc0V4dGVuc2libGU6IHJlZmxlY3RJc0V4dGVuc2libGUsXG4gIG93bktleXMsXG4gIHByZXZlbnRFeHRlbnNpb25zOiByZWZsZWN0UHJldmVudEV4dGVuc2lvbnMsXG4gIHNldDogcmVmbGVjdFNldH09XG4gICAgUmVmbGVjdDskaOKAjV9vbmNlLmFwcGx5KGFwcGx5KTskaOKAjV9vbmNlLmNvbnN0cnVjdChjb25zdHJ1Y3QpOyRo4oCNX29uY2UucmVmbGVjdEdldChyZWZsZWN0R2V0KTskaOKAjV9vbmNlLnJlZmxlY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcik7JGjigI1fb25jZS5yZWZsZWN0SGFzKHJlZmxlY3RIYXMpOyRo4oCNX29uY2UucmVmbGVjdElzRXh0ZW5zaWJsZShyZWZsZWN0SXNFeHRlbnNpYmxlKTskaOKAjV9vbmNlLm93bktleXMob3duS2V5cyk7JGjigI1fb25jZS5yZWZsZWN0UHJldmVudEV4dGVuc2lvbnMocmVmbGVjdFByZXZlbnRFeHRlbnNpb25zKTskaOKAjV9vbmNlLnJlZmxlY3RTZXQocmVmbGVjdFNldCk7XG5cbmNvbnN0ICAgICAgICB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGV9PSAgIEFycmF5OyRo4oCNX29uY2UuaXNBcnJheShpc0FycmF5KTskaOKAjV9vbmNlLmFycmF5UHJvdG90eXBlKGFycmF5UHJvdG90eXBlKTtcbmNvbnN0ICAgICAgICB7IHByb3RvdHlwZTogbWFwUHJvdG90eXBlfT0gICBNYXA7JGjigI1fb25jZS5tYXBQcm90b3R5cGUobWFwUHJvdG90eXBlKTtcbmNvbnN0ICAgICAgICB7IHJldm9jYWJsZTogcHJveHlSZXZvY2FibGV9PSAgIFByb3h5OyRo4oCNX29uY2UucHJveHlSZXZvY2FibGUocHJveHlSZXZvY2FibGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiByZWdleHBQcm90b3R5cGV9PSAgIFJlZ0V4cDskaOKAjV9vbmNlLnJlZ2V4cFByb3RvdHlwZShyZWdleHBQcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiBzZXRQcm90b3R5cGV9PSAgIFNldDskaOKAjV9vbmNlLnNldFByb3RvdHlwZShzZXRQcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiBzdHJpbmdQcm90b3R5cGV9PSAgIFN0cmluZzskaOKAjV9vbmNlLnN0cmluZ1Byb3RvdHlwZShzdHJpbmdQcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiB3ZWFrbWFwUHJvdG90eXBlfT0gICBXZWFrTWFwOyRo4oCNX29uY2Uud2Vha21hcFByb3RvdHlwZSh3ZWFrbWFwUHJvdG90eXBlKTtcbmNvbnN0ICAgICAgICB7IHByb3RvdHlwZTogd2Vha3NldFByb3RvdHlwZX09ICAgV2Vha1NldDskaOKAjV9vbmNlLndlYWtzZXRQcm90b3R5cGUod2Vha3NldFByb3RvdHlwZSk7XG5jb25zdCAgICAgICAgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlfT0gICBGdW5jdGlvbjskaOKAjV9vbmNlLmZ1bmN0aW9uUHJvdG90eXBlKGZ1bmN0aW9uUHJvdG90eXBlKTtcbmNvbnN0ICAgICAgICB7IHByb3RvdHlwZTogcHJvbWlzZVByb3RvdHlwZX09ICAgUHJvbWlzZTskaOKAjV9vbmNlLnByb21pc2VQcm90b3R5cGUocHJvbWlzZVByb3RvdHlwZSk7XG5cbmNvbnN0ICAgICAgICB0eXBlZEFycmF5UHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpOyRo4oCNX29uY2UudHlwZWRBcnJheVByb3RvdHlwZSh0eXBlZEFycmF5UHJvdG90eXBlKTtcblxuY29uc3QgeyBiaW5kfT0gICBmdW5jdGlvblByb3RvdHlwZTtcbi8qKlxuICogdW5jdXJyeVRoaXMoKVxuICogRXF1aXZhbGVudCBvZjogZm4gPT4gKHRoaXNBcmcsIC4uLmFyZ3MpID0+IGFwcGx5KGZuLCB0aGlzQXJnLCBhcmdzKVxuICpcbiAqIFNlZSB0aG9zZSByZWZlcmVuY2UgZm9yIGEgY29tcGxldGUgZXhwbGFuYXRpb246XG4gKiBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1jb252ZW50aW9uczpzYWZlX21ldGFfcHJvZ3JhbW1pbmdcbiAqIHdoaWNoIG9ubHkgbGl2ZXMgYXRcbiAqIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwODA1MjI1NzEwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWNvbnZlbnRpb25zOnNhZmVfbWV0YV9wcm9ncmFtbWluZ1xuICpcbiAqIEB0eXBlIHs8RiBleHRlbmRzICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KGZuOiBGKSA9PiAoKHRoaXNBcmc6IFRoaXNQYXJhbWV0ZXJUeXBlPEY+LCAuLi5hcmdzOiBQYXJhbWV0ZXJzPEY+KSA9PiBSZXR1cm5UeXBlPEY+KX1cbiAqL1xuY29uc3QgICAgICAgIHVuY3VycnlUaGlzPSAgYmluZC5iaW5kKGJpbmQuY2FsbCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuJGjigI1fb25jZS51bmN1cnJ5VGhpcyh1bmN1cnJ5VGhpcyk7XG5jb25zdCAgICAgICAgb2JqZWN0SGFzT3duUHJvcGVydHk9ICB1bmN1cnJ5VGhpcyhvYmplY3RQcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuLy9cbiRo4oCNX29uY2Uub2JqZWN0SGFzT3duUHJvcGVydHkob2JqZWN0SGFzT3duUHJvcGVydHkpO2NvbnN0IGFycmF5RmlsdGVyPXVuY3VycnlUaGlzKGFycmF5UHJvdG90eXBlLmZpbHRlcik7JGjigI1fb25jZS5hcnJheUZpbHRlcihhcnJheUZpbHRlcik7XG5jb25zdCAgICAgICAgYXJyYXlGb3JFYWNoPSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUuZm9yRWFjaCk7JGjigI1fb25jZS5hcnJheUZvckVhY2goYXJyYXlGb3JFYWNoKTtcbmNvbnN0ICAgICAgICBhcnJheUluY2x1ZGVzPSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUuaW5jbHVkZXMpOyRo4oCNX29uY2UuYXJyYXlJbmNsdWRlcyhhcnJheUluY2x1ZGVzKTtcbmNvbnN0ICAgICAgICBhcnJheUpvaW49ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5qb2luKTtcbi8qKiBAdHlwZSB7PFQsIFU+KHRoaXNBcmc6IHJlYWRvbmx5IFRbXSwgY2FsbGJhY2tmbjogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBVLCB0aGlzQXJnPzogYW55KSA9PiBVW119ICovJGjigI1fb25jZS5hcnJheUpvaW4oYXJyYXlKb2luKTtcbmNvbnN0ICAgICAgICBhcnJheU1hcD0gIHVuY3VycnlUaGlzKGFycmF5UHJvdG90eXBlLm1hcCk7JGjigI1fb25jZS5hcnJheU1hcChhcnJheU1hcCk7XG5jb25zdCAgICAgICAgYXJyYXlQb3A9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5wb3ApO1xuLyoqIEB0eXBlIHs8VD4odGhpc0FyZzogVFtdLCAuLi5pdGVtczogVFtdKSA9PiBudW1iZXJ9ICovJGjigI1fb25jZS5hcnJheVBvcChhcnJheVBvcCk7XG5jb25zdCAgICAgICAgYXJyYXlQdXNoPSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUucHVzaCk7JGjigI1fb25jZS5hcnJheVB1c2goYXJyYXlQdXNoKTtcbmNvbnN0ICAgICAgICBhcnJheVNsaWNlPSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUuc2xpY2UpOyRo4oCNX29uY2UuYXJyYXlTbGljZShhcnJheVNsaWNlKTtcbmNvbnN0ICAgICAgICBhcnJheVNvbWU9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5zb21lKTskaOKAjV9vbmNlLmFycmF5U29tZShhcnJheVNvbWUpO1xuY29uc3QgICAgICAgIGFycmF5U29ydD0gIHVuY3VycnlUaGlzKGFycmF5UHJvdG90eXBlLnNvcnQpOyRo4oCNX29uY2UuYXJyYXlTb3J0KGFycmF5U29ydCk7XG5jb25zdCAgICAgICAgaXRlcmF0ZUFycmF5PSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdKTtcbi8vXG4kaOKAjV9vbmNlLml0ZXJhdGVBcnJheShpdGVyYXRlQXJyYXkpO2NvbnN0IG1hcFNldD11bmN1cnJ5VGhpcyhtYXBQcm90b3R5cGUuc2V0KTskaOKAjV9vbmNlLm1hcFNldChtYXBTZXQpO1xuY29uc3QgICAgICAgIG1hcEdldD0gIHVuY3VycnlUaGlzKG1hcFByb3RvdHlwZS5nZXQpOyRo4oCNX29uY2UubWFwR2V0KG1hcEdldCk7XG5jb25zdCAgICAgICAgbWFwSGFzPSAgdW5jdXJyeVRoaXMobWFwUHJvdG90eXBlLmhhcyk7JGjigI1fb25jZS5tYXBIYXMobWFwSGFzKTtcbmNvbnN0ICAgICAgICBtYXBEZWxldGU9ICB1bmN1cnJ5VGhpcyhtYXBQcm90b3R5cGUuZGVsZXRlKTskaOKAjV9vbmNlLm1hcERlbGV0ZShtYXBEZWxldGUpO1xuY29uc3QgICAgICAgIG1hcEVudHJpZXM9ICB1bmN1cnJ5VGhpcyhtYXBQcm90b3R5cGUuZW50cmllcyk7JGjigI1fb25jZS5tYXBFbnRyaWVzKG1hcEVudHJpZXMpO1xuY29uc3QgICAgICAgIGl0ZXJhdGVNYXA9ICB1bmN1cnJ5VGhpcyhtYXBQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdKTtcbi8vXG4kaOKAjV9vbmNlLml0ZXJhdGVNYXAoaXRlcmF0ZU1hcCk7Y29uc3Qgc2V0QWRkPXVuY3VycnlUaGlzKHNldFByb3RvdHlwZS5hZGQpOyRo4oCNX29uY2Uuc2V0QWRkKHNldEFkZCk7XG5jb25zdCAgICAgICAgc2V0RGVsZXRlPSAgdW5jdXJyeVRoaXMoc2V0UHJvdG90eXBlLmRlbGV0ZSk7JGjigI1fb25jZS5zZXREZWxldGUoc2V0RGVsZXRlKTtcbmNvbnN0ICAgICAgICBzZXRGb3JFYWNoPSAgdW5jdXJyeVRoaXMoc2V0UHJvdG90eXBlLmZvckVhY2gpOyRo4oCNX29uY2Uuc2V0Rm9yRWFjaChzZXRGb3JFYWNoKTtcbmNvbnN0ICAgICAgICBzZXRIYXM9ICB1bmN1cnJ5VGhpcyhzZXRQcm90b3R5cGUuaGFzKTskaOKAjV9vbmNlLnNldEhhcyhzZXRIYXMpO1xuY29uc3QgICAgICAgIGl0ZXJhdGVTZXQ9ICB1bmN1cnJ5VGhpcyhzZXRQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdKTtcbi8vXG4kaOKAjV9vbmNlLml0ZXJhdGVTZXQoaXRlcmF0ZVNldCk7Y29uc3QgcmVnZXhwVGVzdD11bmN1cnJ5VGhpcyhyZWdleHBQcm90b3R5cGUudGVzdCk7JGjigI1fb25jZS5yZWdleHBUZXN0KHJlZ2V4cFRlc3QpO1xuY29uc3QgICAgICAgIHJlZ2V4cEV4ZWM9ICB1bmN1cnJ5VGhpcyhyZWdleHBQcm90b3R5cGUuZXhlYyk7JGjigI1fb25jZS5yZWdleHBFeGVjKHJlZ2V4cEV4ZWMpO1xuY29uc3QgICAgICAgIG1hdGNoQWxsUmVnRXhwPSAgdW5jdXJyeVRoaXMocmVnZXhwUHJvdG90eXBlW21hdGNoQWxsU3ltYm9sXSk7XG4vL1xuJGjigI1fb25jZS5tYXRjaEFsbFJlZ0V4cChtYXRjaEFsbFJlZ0V4cCk7Y29uc3Qgc3RyaW5nRW5kc1dpdGg9dW5jdXJyeVRoaXMoc3RyaW5nUHJvdG90eXBlLmVuZHNXaXRoKTskaOKAjV9vbmNlLnN0cmluZ0VuZHNXaXRoKHN0cmluZ0VuZHNXaXRoKTtcbmNvbnN0ICAgICAgICBzdHJpbmdJbmNsdWRlcz0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5pbmNsdWRlcyk7JGjigI1fb25jZS5zdHJpbmdJbmNsdWRlcyhzdHJpbmdJbmNsdWRlcyk7XG5jb25zdCAgICAgICAgc3RyaW5nSW5kZXhPZj0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5pbmRleE9mKTskaOKAjV9vbmNlLnN0cmluZ0luZGV4T2Yoc3RyaW5nSW5kZXhPZik7XG5jb25zdCAgICAgICAgc3RyaW5nTWF0Y2g9ICB1bmN1cnJ5VGhpcyhzdHJpbmdQcm90b3R5cGUubWF0Y2gpO1xuLyoqXG4gKiBAdHlwZSB7XG4gKiAgICgodGhpc0FyZzogc3RyaW5nLCBzZWFyY2hWYWx1ZTogeyBbU3ltYm9sLnJlcGxhY2VdKHN0cmluZzogc3RyaW5nLCByZXBsYWNlVmFsdWU6IHN0cmluZyk6IHN0cmluZzsgfSwgcmVwbGFjZVZhbHVlOiBzdHJpbmcpID0+IHN0cmluZykgfFxuICogICAoKHRoaXNBcmc6IHN0cmluZywgc2VhcmNoVmFsdWU6IHsgW1N5bWJvbC5yZXBsYWNlXShzdHJpbmc6IHN0cmluZywgcmVwbGFjZXI6IChzdWJzdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHN0cmluZyk6IHN0cmluZzsgfSwgcmVwbGFjZXI6IChzdWJzdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pID0+IHN0cmluZykgPT4gc3RyaW5nKVxuICogfVxuICovJGjigI1fb25jZS5zdHJpbmdNYXRjaChzdHJpbmdNYXRjaCk7XG5jb25zdCAgICAgICAgc3RyaW5nUmVwbGFjZT0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5yZXBsYWNlKTskaOKAjV9vbmNlLnN0cmluZ1JlcGxhY2Uoc3RyaW5nUmVwbGFjZSk7XG5jb25zdCAgICAgICAgc3RyaW5nU2VhcmNoPSAgdW5jdXJyeVRoaXMoc3RyaW5nUHJvdG90eXBlLnNlYXJjaCk7JGjigI1fb25jZS5zdHJpbmdTZWFyY2goc3RyaW5nU2VhcmNoKTtcbmNvbnN0ICAgICAgICBzdHJpbmdTbGljZT0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5zbGljZSk7XG4vKiogQHR5cGUgeyh0aGlzQXJnOiBzdHJpbmcsIHNwbGl0dGVyOiBzdHJpbmcgfCBSZWdFeHAgfCB7IFtTeW1ib2wuc3BsaXRdKHN0cmluZzogc3RyaW5nLCBsaW1pdD86IG51bWJlcik6IHN0cmluZ1tdOyB9LCBsaW1pdD86IG51bWJlcikgPT4gc3RyaW5nW119ICovJGjigI1fb25jZS5zdHJpbmdTbGljZShzdHJpbmdTbGljZSk7XG5jb25zdCAgICAgICAgc3RyaW5nU3BsaXQ9ICB1bmN1cnJ5VGhpcyhzdHJpbmdQcm90b3R5cGUuc3BsaXQpOyRo4oCNX29uY2Uuc3RyaW5nU3BsaXQoc3RyaW5nU3BsaXQpO1xuY29uc3QgICAgICAgIHN0cmluZ1N0YXJ0c1dpdGg9ICB1bmN1cnJ5VGhpcyhzdHJpbmdQcm90b3R5cGUuc3RhcnRzV2l0aCk7JGjigI1fb25jZS5zdHJpbmdTdGFydHNXaXRoKHN0cmluZ1N0YXJ0c1dpdGgpO1xuY29uc3QgICAgICAgIGl0ZXJhdGVTdHJpbmc9ICB1bmN1cnJ5VGhpcyhzdHJpbmdQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdKTtcbi8vXG4kaOKAjV9vbmNlLml0ZXJhdGVTdHJpbmcoaXRlcmF0ZVN0cmluZyk7Y29uc3Qgd2Vha21hcERlbGV0ZT11bmN1cnJ5VGhpcyh3ZWFrbWFwUHJvdG90eXBlLmRlbGV0ZSk7XG4vKiogQHR5cGUgezxLLCBWPih0aGlzQXJnOiBXZWFrTWFwPEssIFY+LCAuLi5hcmdzOiBQYXJhbWV0ZXJzPFdlYWtNYXA8SyxWPlsnZ2V0J10+KSA9PiBSZXR1cm5UeXBlPFdlYWtNYXA8SyxWPlsnZ2V0J10+fSAqLyRo4oCNX29uY2Uud2Vha21hcERlbGV0ZSh3ZWFrbWFwRGVsZXRlKTtcbmNvbnN0ICAgICAgICB3ZWFrbWFwR2V0PSAgdW5jdXJyeVRoaXMod2Vha21hcFByb3RvdHlwZS5nZXQpOyRo4oCNX29uY2Uud2Vha21hcEdldCh3ZWFrbWFwR2V0KTtcbmNvbnN0ICAgICAgICB3ZWFrbWFwSGFzPSAgdW5jdXJyeVRoaXMod2Vha21hcFByb3RvdHlwZS5oYXMpOyRo4oCNX29uY2Uud2Vha21hcEhhcyh3ZWFrbWFwSGFzKTtcbmNvbnN0ICAgICAgICB3ZWFrbWFwU2V0PSAgdW5jdXJyeVRoaXMod2Vha21hcFByb3RvdHlwZS5zZXQpO1xuLy9cbiRo4oCNX29uY2Uud2Vha21hcFNldCh3ZWFrbWFwU2V0KTtjb25zdCB3ZWFrc2V0QWRkPXVuY3VycnlUaGlzKHdlYWtzZXRQcm90b3R5cGUuYWRkKTskaOKAjV9vbmNlLndlYWtzZXRBZGQod2Vha3NldEFkZCk7XG5jb25zdCAgICAgICAgd2Vha3NldEdldD0gIHVuY3VycnlUaGlzKHdlYWtzZXRQcm90b3R5cGUuZ2V0KTskaOKAjV9vbmNlLndlYWtzZXRHZXQod2Vha3NldEdldCk7XG5jb25zdCAgICAgICAgd2Vha3NldEhhcz0gIHVuY3VycnlUaGlzKHdlYWtzZXRQcm90b3R5cGUuaGFzKTtcbi8vXG4kaOKAjV9vbmNlLndlYWtzZXRIYXMod2Vha3NldEhhcyk7Y29uc3QgZnVuY3Rpb25Ub1N0cmluZz11bmN1cnJ5VGhpcyhmdW5jdGlvblByb3RvdHlwZS50b1N0cmluZyk7XG4vL1xuJGjigI1fb25jZS5mdW5jdGlvblRvU3RyaW5nKGZ1bmN0aW9uVG9TdHJpbmcpO2NvbnN0e2FsbH09UHJvbWlzZTtcbmNvbnN0ICAgICAgICBwcm9taXNlQWxsPSAgKHByb21pc2VzKT0+YXBwbHkoYWxsLCBQcm9taXNlLCBbcHJvbWlzZXNdKTskaOKAjV9vbmNlLnByb21pc2VBbGwocHJvbWlzZUFsbCk7XG5jb25zdCAgICAgICAgcHJvbWlzZUNhdGNoPSAgdW5jdXJyeVRoaXMocHJvbWlzZVByb3RvdHlwZS5jYXRjaCk7XG4vKiogQHR5cGUgezxULCBUUmVzdWx0MSA9IFQsIFRSZXN1bHQyID0gbmV2ZXI+KHRoaXNBcmc6IFQsIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgdW5kZWZpbmVkIHwgbnVsbCwgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IHVuZGVmaW5lZCB8IG51bGwpID0+IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj59ICovJGjigI1fb25jZS5wcm9taXNlQ2F0Y2gocHJvbWlzZUNhdGNoKTtcbmNvbnN0ICAgICAgICBwcm9taXNlVGhlbj0gIHVuY3VycnlUaGlzKHByb21pc2VQcm90b3R5cGUudGhlbik7XG4vL1xuJGjigI1fb25jZS5wcm9taXNlVGhlbihwcm9taXNlVGhlbik7Y29uc3QgZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3Rlcj1cbiAgRmluYWxpemF0aW9uUmVnaXN0cnkmJiAgdW5jdXJyeVRoaXMoRmluYWxpemF0aW9uUmVnaXN0cnkucHJvdG90eXBlLnJlZ2lzdGVyKTskaOKAjV9vbmNlLmZpbmFsaXphdGlvblJlZ2lzdHJ5UmVnaXN0ZXIoZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3Rlcik7XG5jb25zdCAgICAgICAgZmluYWxpemF0aW9uUmVnaXN0cnlVbnJlZ2lzdGVyPVxuICBGaW5hbGl6YXRpb25SZWdpc3RyeSYmXG4gIHVuY3VycnlUaGlzKEZpbmFsaXphdGlvblJlZ2lzdHJ5LnByb3RvdHlwZS51bnJlZ2lzdGVyKTtcblxuLyoqXG4gKiBnZXRDb25zdHJ1Y3Rvck9mKClcbiAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZnJvbSBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovJGjigI1fb25jZS5maW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXIoZmluYWxpemF0aW9uUmVnaXN0cnlVbnJlZ2lzdGVyKTtcbmNvbnN0ICAgICAgICBnZXRDb25zdHJ1Y3Rvck9mPSAgKGZuKT0+XG4gIHJlZmxlY3RHZXQoZ2V0UHJvdG90eXBlT2YoZm4pLCAnY29uc3RydWN0b3InKTtcblxuLyoqXG4gKiBpbW11dGFibGVPYmplY3RcbiAqIEFuIGltbXV0YWJsZSAoZnJvemVuKSBlbXB0eSBvYmplY3QgdGhhdCBpcyBzYWZlIHRvIHNoYXJlLlxuICovJGjigI1fb25jZS5nZXRDb25zdHJ1Y3Rvck9mKGdldENvbnN0cnVjdG9yT2YpO1xuY29uc3QgICAgICAgIGltbXV0YWJsZU9iamVjdD0gIGZyZWV6ZShjcmVhdGUobnVsbCkpO1xuXG4vKipcbiAqIGlzT2JqZWN0IHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gKiBUb2RheSwgdGhpcyBpcyBlcXVpdmFsZW50IHRvOlxuICpcbiAqICAgY29uc3QgaXNPYmplY3QgPSB2YWx1ZSA9PiB7XG4gKiAgICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gKiAgICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAqICAgICByZXR1cm4gdHlwZSA9PT0gJ29iamVjdCcgfHwgdHlwZSA9PT0gJ2Z1bmN0aW9uJztcbiAqICAgfTtcbiAqXG4gKiBCdXQgdGhpcyBpcyBub3Qgc2FmZSBpbiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBldm9sdXRpb24gb2YgdGhlIGxhbmd1YWdlLCBmb3JcbiAqIGV4YW1wbGUgbmV3IHR5cGVzIG9yIHNlbWFudGljcyBvZiByZWNvcmRzIGFuZCB0dXBsZXMuXG4gKiBXZSB1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkZXNwaXRlIHRoZSB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uIGltcGxpZWQgYnlcbiAqIGF0dGVtcHRpbmcgdG8gYm94IGEgcHJpbWl0aXZlLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICovJGjigI1fb25jZS5pbW11dGFibGVPYmplY3QoaW1tdXRhYmxlT2JqZWN0KTtcbmNvbnN0ICAgICAgICBpc09iamVjdD0gICh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT0gIHZhbHVlO1xuXG4vKipcbiAqIGlzRXJyb3IgdGVzdHMgd2hldGhlciBhbiBvYmplY3QgaW5oZXJpdHMgZnJvbSB0aGUgaW50cmluc2ljXG4gKiBgRXJyb3IucHJvdG90eXBlYC5cbiAqIFdlIGNhcHR1cmUgdGhlIG9yaWdpbmFsIGVycm9yIGNvbnN0cnVjdG9yIGFzIEZFUkFMX0VSUk9SIHRvIHByb3ZpZGUgYSBjbGVhclxuICogc2lnbmFsIGZvciByZXZpZXdlcnMgdGhhdCB3ZSBhcmUgaGFuZGxpbmcgYW4gb2JqZWN0IHdpdGggZXhjZXNzIGF1dGhvcml0eSxcbiAqIGxpa2Ugc3RhY2sgdHJhY2UgaW5zcGVjdGlvbiwgdGhhdCB3ZSBhcmUgY2FyZWZ1bGx5IGhpZGluZyBmcm9tIGNsaWVudCBjb2RlLlxuICogQ2hlY2tpbmcgaW5zdGFuY2VvZiBoYXBwZW5zIHRvIGJlIHNhZmUsIGJ1dCB0byBhdm9pZCB1dHRlcmluZyBGRVJBTF9FUlJPUlxuICogZm9yIHN1Y2ggYSB0cml2aWFsIGNhc2Ugb3V0c2lkZSBjb21tb25zLmpzLCB3ZSBwcm92aWRlIGEgdXRpbGl0eSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqLyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuY29uc3QgICAgICAgIGlzRXJyb3I9ICAodmFsdWUpPT52YWx1ZSBpbnN0YW5jZW9mIEZFUkFMX0VSUk9SO1xuXG4vLyBUaGUgb3JpZ2luYWwgdW5zYWZlIHVudGFtZWQgZXZhbCBmdW5jdGlvbiwgd2hpY2ggbXVzdCBub3QgZXNjYXBlLlxuLy8gU2FtcGxlIGF0IG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lLCB3aGljaCBpcyBiZWZvcmUgbG9ja2Rvd24gY2FuXG4vLyByZXBhaXIgaXQuICBVc2UgaXQgb25seSB0byBidWlsZCBwb3dlcmxlc3MgYWJzdHJhY3Rpb25zLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV2YWxcbiRo4oCNX29uY2UuaXNFcnJvcihpc0Vycm9yKTtjb25zdCBGRVJBTF9FVkFMPWV2YWw7XG5cbi8vIFRoZSBvcmlnaW5hbCB1bnNhZmUgdW50YW1lZCBGdW5jdGlvbiBjb25zdHJ1Y3Rvciwgd2hpY2ggbXVzdCBub3QgZXNjYXBlLlxuLy8gU2FtcGxlIGF0IG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lLCB3aGljaCBpcyBiZWZvcmUgbG9ja2Rvd24gY2FuXG4vLyByZXBhaXIgaXQuICBVc2UgaXQgb25seSB0byBidWlsZCBwb3dlcmxlc3MgYWJzdHJhY3Rpb25zLlxuJGjigI1fb25jZS5GRVJBTF9FVkFMKEZFUkFMX0VWQUwpO2NvbnN0IEZFUkFMX0ZVTkNUSU9OPUZ1bmN0aW9uOyRo4oCNX29uY2UuRkVSQUxfRlVOQ1RJT04oRkVSQUxfRlVOQ1RJT04pO1xuXG5jb25zdCAgICAgICAgbm9FdmFsRXZhbHVhdGU9ICAoKT0+ICB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ0Nhbm5vdCBldmFsIHdpdGggZXZhbFRhbWluZyBzZXQgdG8gXCJub0V2YWxcIiAoU0VTX05PX0VWQUwpJyk7XG5cbiB9OyRo4oCNX29uY2Uubm9FdmFsRXZhbHVhdGUobm9FdmFsRXZhbHVhdGUpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1sxXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQHR5cGVkZWYge3JlYWRvbmx5IGFueVtdfSBMb2dBcmdzXG4gKlxuICogVGhpcyBpcyBhbiBhcnJheSBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGFyZ3VtZW50cyBvZiBhIGNvbnNvbGVcbiAqIGxldmVsIG1lc3NhZ2UgKmFmdGVyKiB0aGUgZm9ybWF0IHN0cmluZyBhcmd1bWVudC4gSXQgaXMgdGhlIHJlc3VsdCBvZlxuICogYSBgZGV0YWlsc2AgdGVtcGxhdGUgc3RyaW5nIGFuZCBjb25zaXN0cyBvZiBhbHRlcm5hdGluZyBsaXRlcmFsIHN0cmluZ3NcbiAqIGFuZCBzdWJzdGl0dXRpb24gdmFsdWVzLCBzdGFydGluZyB3aXRoIGEgbGl0ZXJhbCBzdHJpbmcuIEF0IGxlYXN0IHRoYXRcbiAqIGZpcnN0IGxpdGVyYWwgc3RyaW5nIGlzIGFsd2F5cyBwcmVzZW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE5vdGVDYWxsYmFja1xuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0xvZ0FyZ3N9IG5vdGVMb2dBcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRTdGFja1N0cmluZ1xuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nZ2VkRXJyb3JIYW5kbGVyXG4gKlxuICogVXNlZCB0byBwYXJhbWV0ZXJpemUgYG1ha2VDYXVzYWxDb25zb2xlYCB0byBnaXZlIGl0IGFjY2VzcyB0byBwb3RlbnRpYWxseVxuICogaGlkZGVuIGluZm9ybWF0aW9uIHRvIGF1Z21lbnQgdGhlIGxvZ2dpbmcgb2YgZXJyb3JzLlxuICpcbiAqIEBwcm9wZXJ0eSB7R2V0U3RhY2tTdHJpbmd9IGdldFN0YWNrU3RyaW5nXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogRXJyb3IpID0+IHN0cmluZ30gdGFnRXJyb3JcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gcmVzZXRFcnJvclRhZ051bSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHlcbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gKExvZ0FyZ3MgfCB1bmRlZmluZWQpfSBnZXRNZXNzYWdlTG9nQXJnc1xuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiAoTG9nQXJncyB8IHVuZGVmaW5lZCl9IHRha2VNZXNzYWdlTG9nQXJnc1xuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yLCBjYWxsYmFjaz86IE5vdGVDYWxsYmFjaykgPT4gTG9nQXJnc1tdIH0gdGFrZU5vdGVMb2dBcmdzQXJyYXlcbiAqL1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtyZWFkb25seSBbc3RyaW5nLCAuLi5hbnlbXV19IExvZ1JlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nZ2luZ0NvbnNvbGVLaXRcbiAqIEBwcm9wZXJ0eSB7VmlydHVhbENvbnNvbGV9IGxvZ2dpbmdDb25zb2xlXG4gKiBAcHJvcGVydHkgeygpID0+IHJlYWRvbmx5IExvZ1JlY29yZFtdfSB0YWtlTG9nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYWtlTG9nZ2luZ0NvbnNvbGVLaXRPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW49fSBzaG91bGRSZXNldEZvckRlYnVnZ2luZ1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VMb2dnaW5nQ29uc29sZUtpdFxuICpcbiAqIEEgbG9nZ2luZyBjb25zb2xlIGp1c3QgYWNjdW11bGF0ZXMgdGhlIGNvbnRlbnRzIG9mIGFsbCB3aGl0ZWxpc3RlZCBjYWxscyxcbiAqIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBjYWxsZXJzIG9mIGB0YWtlTG9nKClgLiBDYWxsaW5nIGB0YWtlTG9nKClgXG4gKiBjb25zdW1lcyB0aGVzZSwgc28gbGF0ZXIgY2FsbHMgdG8gYHRha2VMb2coKWAgd2lsbCBvbmx5IHByb3ZpZGUgYSBsb2cgb2ZcbiAqIGNhbGxzIHRoYXQgaGF2ZSBoYXBwZW5lZCBzaW5jZSB0aGVuLlxuICpcbiAqIEBwYXJhbSB7TG9nZ2VkRXJyb3JIYW5kbGVyfSBsb2dnZWRFcnJvckhhbmRsZXJcbiAqIEBwYXJhbSB7TWFrZUxvZ2dpbmdDb25zb2xlS2l0T3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtMb2dnaW5nQ29uc29sZUtpdH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IE5PVEU6ICdFUlJPUl9OT1RFOicsIE1FU1NBR0U6ICdFUlJPUl9NRVNTQUdFOicgfX0gRXJyb3JJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7RXJyb3JJbmZvW2tleW9mIEVycm9ySW5mb119IEVycm9ySW5mb0tpbmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQ2F1c2FsQ29uc29sZVxuICpcbiAqIE1ha2VzIGEgY2F1c2FsIGNvbnNvbGUgd3JhcHBlciBvZiBhIGBiYXNlQ29uc29sZWAsIHdoZXJlIHRoZSBjYXVzYWwgY29uc29sZVxuICogY2FsbHMgbWV0aG9kcyBvZiB0aGUgYGxvZ2dlZEVycm9ySGFuZGxlcmAgdG8gY3VzdG9taXplIGhvdyBpdCBoYW5kbGVzIGxvZ2dlZFxuICogZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7VmlydHVhbENvbnNvbGV9IGJhc2VDb25zb2xlXG4gKiBAcGFyYW0ge0xvZ2dlZEVycm9ySGFuZGxlcn0gbG9nZ2VkRXJyb3JIYW5kbGVyXG4gKiBAcmV0dXJucyB7VmlydHVhbENvbnNvbGV9XG4gKi9cbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMl0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBTZXQsU3RyaW5nLGFycmF5Sm9pbixhcnJheVNsaWNlLGZyZWV6ZSxpcyxpc0Vycm9yLHNldEFkZCxzZXRIYXMsc3RyaW5nSW5jbHVkZXMsc3RyaW5nU3RhcnRzV2l0aCxzdHJpbmdpZnlKc29uLHRvU3RyaW5nVGFnU3ltYm9sOyRo4oCNX2ltcG9ydHMoW1tcIi4uL2NvbW1vbnMuanNcIiwgW1tcIlNldFwiLCBbJGjigI1fYSA9PiAoU2V0ID0gJGjigI1fYSldXSxbXCJTdHJpbmdcIiwgWyRo4oCNX2EgPT4gKFN0cmluZyA9ICRo4oCNX2EpXV0sW1wiYXJyYXlKb2luXCIsIFskaOKAjV9hID0+IChhcnJheUpvaW4gPSAkaOKAjV9hKV1dLFtcImFycmF5U2xpY2VcIiwgWyRo4oCNX2EgPT4gKGFycmF5U2xpY2UgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJpc1wiLCBbJGjigI1fYSA9PiAoaXMgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3IgPSAkaOKAjV9hKV1dLFtcInNldEFkZFwiLCBbJGjigI1fYSA9PiAoc2V0QWRkID0gJGjigI1fYSldXSxbXCJzZXRIYXNcIiwgWyRo4oCNX2EgPT4gKHNldEhhcyA9ICRo4oCNX2EpXV0sW1wic3RyaW5nSW5jbHVkZXNcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ0luY2x1ZGVzID0gJGjigI1fYSldXSxbXCJzdHJpbmdTdGFydHNXaXRoXCIsIFskaOKAjV9hID0+IChzdHJpbmdTdGFydHNXaXRoID0gJGjigI1fYSldXSxbXCJzdHJpbmdpZnlKc29uXCIsIFskaOKAjV9hID0+IChzdHJpbmdpZnlKc29uID0gJGjigI1fYSldXSxbXCJ0b1N0cmluZ1RhZ1N5bWJvbFwiLCBbJGjigI1fYSA9PiAodG9TdHJpbmdUYWdTeW1ib2wgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEpvaW5zIEVuZ2xpc2ggdGVybXMgd2l0aCBjb21tYXMgYW5kIGFuIG9wdGlvbmFsIGNvbmp1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7KHN0cmluZyB8IFN0cmluZ2FibGVQYXlsb2FkKVtdfSB0ZXJtc1xuICogQHBhcmFtIHtcImFuZFwiIHwgXCJvclwifSBjb25qdW5jdGlvblxuICovXG5jb25zdCAgICAgICAgZW5Kb2luPSAgKHRlcm1zLCBjb25qdW5jdGlvbik9PiAge1xuICBpZiggdGVybXMubGVuZ3RoPT09ICAwKSB7XG4gICAgcmV0dXJuICcobm9uZSknO1xuICAgfWVsc2UgaWYoIHRlcm1zLmxlbmd0aD09PSAgMSkge1xuICAgIHJldHVybiB0ZXJtc1swXTtcbiAgIH1lbHNlIGlmKCB0ZXJtcy5sZW5ndGg9PT0gIDIpIHtcbiAgICBjb25zdCBbZmlyc3QsIHNlY29uZF09ICB0ZXJtcztcbiAgICByZXR1cm4gIGAke2ZpcnN0fSAke2Nvbmp1bmN0aW9ufSAke3NlY29uZH1gO1xuICAgfWVsc2Uge1xuICAgIHJldHVybiAgYCR7YXJyYXlKb2luKGFycmF5U2xpY2UodGVybXMsMCwgLTEpLCAnLCAnKSB9LCAke2Nvbmp1bmN0aW9ufSAke1xuICAgICAgdGVybXNbdGVybXMubGVuZ3RoLSAgMV1cbiAgICAgfWA7XG4gICB9XG4gfTtcblxuLyoqXG4gKiBQcmVwZW5kIHRoZSBjb3JyZWN0IGluZGVmaW5pdGUgYXJ0aWNsZSBvbnRvIGEgbm91biwgdHlwaWNhbGx5IGEgdHlwZW9mXG4gKiByZXN1bHQsIGUuZy4sIFwiYW4gb2JqZWN0XCIgdnMuIFwiYSBudW1iZXJcIlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5vdW4gdG8gcHJlcGVuZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5vdW4gcHJlcGVuZGVkIHdpdGggYS9hblxuICovJGjigI1fb25jZS5lbkpvaW4oZW5Kb2luKTtcbmNvbnN0IGFuPSAgKHN0cik9PntcbiAgc3RyPSAgIGAke3N0cn1gO1xuICBpZiggc3RyLmxlbmd0aD49ICAxJiYgIHN0cmluZ0luY2x1ZGVzKCdhZWlvdUFFSU9VJywgc3RyWzBdKSkge1xuICAgIHJldHVybiAgYGFuICR7c3RyfWA7XG4gICB9XG4gIHJldHVybiAgYGEgJHtzdHJ9YDtcbiB9OyRo4oCNX29uY2UuYW4oYW4pO1xuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIExpa2UgYEpTT04uc3RyaW5naWZ5YCBidXQgZG9lcyBub3QgYmxvdyB1cCBpZiBnaXZlbiBhIGN5Y2xlIG9yIGEgYmlnaW50LlxuICogVGhpcyBpcyBub3RcbiAqIGludGVuZGVkIHRvIGJlIGEgc2VyaWFsaXphdGlvbiB0byBzdXBwb3J0IGFueSB1c2VmdWwgdW5zZXJpYWxpemF0aW9uLFxuICogb3IgYW55IHByb2dyYW1tYXRpYyB1c2Ugb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuIFRoZSBzdHJpbmcgaXMgaW50ZW5kZWRcbiAqICpvbmx5KiBmb3Igc2hvd2luZyBhIGh1bWFuIHVuZGVyIGJlbmlnbiBjb25kaXRpb25zLCBpbiBvcmRlciB0byBiZVxuICogaW5mb3JtYXRpdmUgZW5vdWdoIGZvciBzb21lXG4gKiBsb2dnaW5nIHB1cnBvc2VzLiBBcyBzdWNoLCB0aGlzIGBiZXN0RWZmb3J0U3RyaW5naWZ5YCBoYXMgYW5cbiAqIGltcHJlY2lzZSBzcGVjaWZpY2F0aW9uIGFuZCBtYXkgY2hhbmdlIG92ZXIgdGltZS5cbiAqXG4gKiBUaGUgY3VycmVudCBgYmVzdEVmZm9ydFN0cmluZ2lmeWAgcG9zc2libHkgZW1pdHMgdG9vIG1hbnkgXCJzZWVuXCJcbiAqIG1hcmtpbmdzOiBOb3Qgb25seSBmb3IgY3ljbGVzLCBidXQgYWxzbyBmb3IgcmVwZWF0ZWQgc3VidHJlZXMgYnlcbiAqIG9iamVjdCBpZGVudGl0eS5cbiAqXG4gKiBBcyBhIGJlc3QgZWZmb3J0IG9ubHkgZm9yIGRpYWdub3N0aWMgaW50ZXJwcmV0YXRpb24gYnkgaHVtYW5zLFxuICogYGJlc3RFZmZvcnRTdHJpbmdpZnlgIGFsc28gdHVybnMgdmFyaW91cyBjYXNlcyB0aGF0IG5vcm1hbFxuICogYEpTT04uc3RyaW5naWZ5YCBza2lwcyBvciBlcnJvcnMgb24sIGxpa2UgYHVuZGVmaW5lZGAgb3IgYmlnaW50cyxcbiAqIGludG8gc3RyaW5ncyB0aGF0IGNvbnZleSB0aGVpciBtZWFuaW5nLiBUbyBkaXN0aW5ndWlzaCB0aGlzIGZyb21cbiAqIHN0cmluZ3MgaW4gdGhlIGlucHV0LCB0aGVzZSBzeW50aGVzaXplZCBzdHJpbmdzIGFsd2F5cyBiZWdpbiBhbmRcbiAqIGVuZCB3aXRoIHNxdWFyZSBicmFja2V0cy4gVG8gZGlzdGluZ3Vpc2ggdGhvc2Ugc3RyaW5ncyBmcm9tIGFuXG4gKiBpbnB1dCBzdHJpbmcgd2l0aCBzcXVhcmUgYnJhY2tldHMsIGFuZCBpbnB1dCBzdHJpbmcgdGhhdCBzdGFydHNcbiAqIHdpdGggYW4gb3BlbiBzcXVhcmUgYnJhY2tldCBgW2AgaXMgaXRzZWxmIHBsYWNlZCBpbiBzcXVhcmUgYnJhY2tldHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHBheWxvYWRcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpPX0gc3BhY2VzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBiZXN0RWZmb3J0U3RyaW5naWZ5PSAgKHBheWxvYWQsIHNwYWNlcz0gIHVuZGVmaW5lZCk9PiAge1xuICBjb25zdCBzZWVuU2V0PSAgbmV3IFNldCgpO1xuICBjb25zdCByZXBsYWNlcj0gIChfLCB2YWwpPT4gIHtcbiAgICBzd2l0Y2goIHR5cGVvZiB2YWwpe1xuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiggdmFsPT09ICBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICB9XG4gICAgICAgIGlmKCBzZXRIYXMoc2VlblNldCwgdmFsKSkge1xuICAgICAgICAgIHJldHVybiAnW1NlZW5dJztcbiAgICAgICAgIH1cbiAgICAgICAgc2V0QWRkKHNlZW5TZXQsIHZhbCk7XG4gICAgICAgIGlmKCBpc0Vycm9yKHZhbCkpIHtcbiAgICAgICAgICByZXR1cm4gIGBbJHt2YWwubmFtZX06ICR7dmFsLm1lc3NhZ2V9XWA7XG4gICAgICAgICB9XG4gICAgICAgIGlmKCB0b1N0cmluZ1RhZ1N5bWJvbCBpbiB2YWwpIHtcbiAgICAgICAgICAvLyBGb3IgdGhlIGJ1aWx0LWlucyB0aGF0IGhhdmUgb3IgaW5oZXJpdCBhIGBTeW1ib2wudG9TdHJpbmdUYWdgLW5hbWVkXG4gICAgICAgICAgLy8gcHJvcGVydHksIG1vc3Qgb2YgdGhlbSBpbmhlcml0IHRoZSBkZWZhdWx0IGB0b1N0cmluZ2AgbWV0aG9kLFxuICAgICAgICAgIC8vIHdoaWNoIHdpbGwgcHJpbnQgaW4gYSBzaW1pbGFyIG1hbm5lcjogYFwiW29iamVjdCBGb29dXCJgIHZzXG4gICAgICAgICAgLy8gYFwiW0Zvb11cImAuIFRoZSBleGNlcHRpb25zIGFyZVxuICAgICAgICAgIC8vICAgICogYFN5bWJvbC5wcm90b3R5cGVgLCBgQmlnSW50LnByb3RvdHlwZWAsIGBTdHJpbmcucHJvdG90eXBlYFxuICAgICAgICAgIC8vICAgICAgd2hpY2ggZG9uJ3QgbWF0dGVyIHRvIHVzIHNpbmNlIHdlIGhhbmRsZSBwcmltaXRpdmVzXG4gICAgICAgICAgLy8gICAgICBzZXBhcmF0ZWx5IGFuZCB3ZSBkb24ndCBjYXJlIGFib3V0IHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHMuXG4gICAgICAgICAgLy8gICAgKiBUT0RPXG4gICAgICAgICAgLy8gICAgICBgRGF0ZS5wcm90b3R5cGVgLCBgVHlwZWRBcnJheS5wcm90b3R5cGVgLlxuICAgICAgICAgIC8vICAgICAgSG1tbSwgd2UgcHJvYmFibHkgc2hvdWxkIG1ha2Ugc3BlY2lhbCBjYXNlcyBmb3IgdGhlc2UuIFdlJ3JlXG4gICAgICAgICAgLy8gICAgICBub3QgdXNpbmcgdGhlc2UgeWV0LCBzbyBpdCdzIG5vdCB1cmdlbnQuIEJ1dCBvdGhlcnMgd2lsbCBydW5cbiAgICAgICAgICAvLyAgICAgIGludG8gdGhlc2UuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBPbmNlICMyMDE4IGlzIGNsb3NlZCwgdGhlIG9ubHkgb2JqZWN0cyBpbiBvdXIgY29kZSB0aGF0IGhhdmUgb3JcbiAgICAgICAgICAvLyBpbmhlcml0IGEgYFN5bWJvbC50b1N0cmluZ1RhZ2AtbmFtZWQgcHJvcGVydHkgYXJlIHJlbW90YWJsZXNcbiAgICAgICAgICAvLyBvciB0aGVpciByZW1vdGUgcHJlc2VuY2VzLlxuICAgICAgICAgIC8vIFRoaXMgcHJpbnRpbmcgd2lsbCBkbyBhIGdvb2Qgam9iIGZvciB0aGVzZSB3aXRob3V0XG4gICAgICAgICAgLy8gdmlvbGF0aW5nIGFic3RyYWN0aW9uIGxheWVyaW5nLiBUaGlzIGJlaGF2aW9yIG1ha2VzIHNlbnNlXG4gICAgICAgICAgLy8gcHVyZWx5IGluIHRlcm1zIG9mIEphdmFTY3JpcHQgY29uY2VwdHMuIFRoYXQncyBzb21lIG9mIHRoZVxuICAgICAgICAgIC8vIG1vdGl2YXRpb24gZm9yIGNob29zaW5nIHRoYXQgcmVwcmVzZW50YXRpb24gb2YgcmVtb3RhYmxlc1xuICAgICAgICAgIC8vIGFuZCB0aGVpciByZW1vdGUgcHJlc2VuY2VzIGluIHRoZSBmaXJzdCBwbGFjZS5cbiAgICAgICAgICByZXR1cm4gIGBbJHt2YWxbdG9TdHJpbmdUYWdTeW1ib2xdfV1gO1xuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgIH1cbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICByZXR1cm4gIGBbRnVuY3Rpb24gJHt2YWwubmFtZXx8ICc8YW5vbj4nIH1dYDtcbiAgICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmKCBzdHJpbmdTdGFydHNXaXRoKHZhbCwgJ1snKSkge1xuICAgICAgICAgIHJldHVybiAgYFske3ZhbH1dYDtcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gIGBbJHtTdHJpbmcodmFsKX1dYDtcbiAgICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiAgYFske3ZhbH1uXWA7XG4gICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICBpZiggaXModmFsLCBOYU4pKSB7XG4gICAgICAgICAgcmV0dXJuICdbTmFOXSc7XG4gICAgICAgICB9ZWxzZSBpZiggdmFsPT09ICBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnW0luZmluaXR5XSc7XG4gICAgICAgICB9ZWxzZSBpZiggdmFsPT09ICAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJ1stSW5maW5pdHldJztcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgfX1cblxuICAgfTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RyaW5naWZ5SnNvbihwYXlsb2FkLCByZXBsYWNlciwgc3BhY2VzKTtcbiAgIH1jYXRjaCggX2Vycikge1xuICAgIC8vIERvbid0IGRvIGFueXRoaW5nIG1vcmUgZmFuY3kgaGVyZSBpZiB0aGVyZSBpcyBhbnlcbiAgICAvLyBjaGFuY2UgdGhhdCBtaWdodCB0aHJvdywgdW5sZXNzIHlvdSBzdXJyb3VuZCB0aGF0XG4gICAgLy8gd2l0aCBhbm90aGVyIHRyeS1jYXRjaC1yZWNvdmVyeS4gRm9yIGV4YW1wbGUsXG4gICAgLy8gdGhlIGNhdWdodCB0aGluZyBtaWdodCBiZSBhIHByb3h5IG9yIG90aGVyIGV4b3RpY1xuICAgIC8vIG9iamVjdCByYXRoZXIgdGhhbiBhbiBlcnJvci4gVGhlIHByb3h5IG1pZ2h0IHRocm93XG4gICAgLy8gd2hlbmV2ZXIgaXQgaXMgcG9zc2libGUgZm9yIGl0IHRvLlxuICAgIHJldHVybiAnW1NvbWV0aGluZyB0aGF0IGZhaWxlZCB0byBzdHJpbmdpZnldJztcbiAgIH1cbiB9OyRo4oCNX29uY2UuYmVzdEVmZm9ydFN0cmluZ2lmeShiZXN0RWZmb3J0U3RyaW5naWZ5KTtcbmZyZWV6ZShiZXN0RWZmb3J0U3RyaW5naWZ5KTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbM10gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBjYWxsYmFjayBCYXNlQXNzZXJ0XG4gKiBUaGUgYGFzc2VydGAgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nPX0gZXJyb3JOYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGgganVzdCB0eXBlIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvciBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8vIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi5cbi8vIFRoZXJlIG1heSBldmVudHVhbGx5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBidXQgdGhleSBicmVhayB3aXRoXG4vLyBUeXBlc2NyaXB0IDQuMC5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZCb29sZWFuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Jvb2xlYW4nfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYm9vbGVhbn1cbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mRnVuY3Rpb25cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnZnVuY3Rpb24nfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZPYmplY3RcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnb2JqZWN0J30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFJlY29yZDxhbnksIGFueT4gfCBudWxsfVxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTdHJpbmdcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3RyaW5nJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlVuZGVmaW5lZFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geyd1bmRlZmluZWQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogVGhlIGBhc3NlcnQudHlwZW9mYCBtZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7QXNzZXJ0VHlwZW9mQmlnaW50ICYgQXNzZXJ0VHlwZW9mQm9vbGVhbiAmIEFzc2VydFR5cGVvZkZ1bmN0aW9uICYgQXNzZXJ0VHlwZW9mTnVtYmVyICYgQXNzZXJ0VHlwZW9mT2JqZWN0ICYgQXNzZXJ0VHlwZW9mU3RyaW5nICYgQXNzZXJ0VHlwZW9mU3ltYm9sICYgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkfSBBc3NlcnRUeXBlb2ZcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRTdHJpbmdcbiAqIFRoZSBgYXNzZXJ0LnN0cmluZ2AgbWV0aG9kLlxuICpcbiAqIGBhc3NlcnQuc3RyaW5nKHYpYCBpcyBlcXVpdmFsZW50IHRvIGBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKWAuIFdlXG4gKiBzcGVjaWFsIGNhc2UgdGhpcyBvbmUgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuXG4gKlxuICogQXNzZXJ0IGFuIGV4cGVjdGVkIHR5cGVvZiByZXN1bHQuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW4gVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZW9mXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Tm90ZVxuICogVGhlIGBhc3NlcnQubm90ZWAgbWV0aG9kLlxuICpcbiAqIEFubm90YXRlIHRoaXMgZXJyb3Igd2l0aCB0aGVzZSBkZXRhaWxzLCBwb3RlbnRpYWxseSB0byBiZSB1c2VkIGJ5IGFuXG4gKiBhdWdtZW50ZWQgY29uc29sZSwgbGlrZSB0aGUgY2F1c2FsIGNvbnNvbGUgb2YgYGNvbnNvbGUuanNgLCB0b1xuICogcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggbG9nZ2VkIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHBhcmFtIHtEZXRhaWxzfSBkZXRhaWxzTm90ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGRldGFpbHNgLi4uYCB0ZW1wbGF0ZSBsaXRlcmFsLCBlbmNsb3NlIHRoYXQgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25cbiAqIGluIGEgY2FsbCB0byBgcXVvdGVgLiBUaGlzIHN0YXRlcyB0aGF0IHRoZSBhcmd1bWVudCBzaG91bGQgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCksIGluIHRoZSBlcnJvciBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB0aGUgZXhhbXBsZSBpbiB0aGUgYGRldGFpbHNgIGNvbW1lbnQsIHNheSBpbnN0ZWFkIHRoYXQgdGhlXG4gKiBjb2xvciB0aGUgc2t5IGlzIHN1cHBvc2VkIHRvIGJlIGlzIGFsc28gY29tcHV0ZWQuIFNheSB0aGF0IHdlIHN0aWxsIGRvbid0XG4gKiB3YW50IHRvIHJldmVhbCB0aGUgc2t5J3MgYWN0dWFsIGNvbG9yLCBidXQgd2UgZG8gd2FudCB0aGUgdGhyb3duIGVycm9yJ3NcbiAqIG1lc3NhZ2UgdG8gcmV2ZWFsIHdoYXQgY29sb3IgdGhlIHNreSB3YXMgc3VwcG9zZWQgdG8gYmU6XG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiAvLyBUT0RPIFVwZGF0ZSBTRVMtc2hpbSB0byBuZXcgY29udmVudGlvbiwgd2hlcmUgYGRldGFpbHNgIGlzXG4gKiAvLyByZW5hbWVkIHRvIGBYYCByYXRoZXIgdGhhbiBgZGAuXG4gKiBUaGUgbm9ybWFsIGNvbnZlbnRpb24gaXMgdG8gbG9jYWxseSByZW5hbWUgYHF1b3RlYCB0byBgcWAgYW5kXG4gKiBgZGV0YWlsc2AgdG8gYGRgXG4gKiBgYGBqc1xuICogY29uc3QgeyBkZXRhaWxzOiBkLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuICogYGBgXG4gKiBzbyB0aGUgYWJvdmUgZXhhbXBsZSB3b3VsZCB0aGVuIGJlXG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBkYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGNvbG9yKX1gLFxuICogKTtcbiAqIGBgYFxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRRdW90ZVxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFdoYXQgdG8gZGVjbGFzc2lmeVxuICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBzcGFjZXNcbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2U9fSBvcHRSYWlzZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5yZWRhY3RlZFxuICogQHJldHVybnMge0Fzc2VydH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gRGV0YWlsc1Rva2VufSBEZXRhaWxzVGFnXG4gKlxuICogVXNlIHRoZSBgZGV0YWlsc2AgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBjcmVhdGVcbiAqIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBUaGUgYXNzZXJ0aW9uIGZ1bmN0aW9ucyB0YWtlIHN1Y2ggbWVzc2FnZXNcbiAqIGFzIG9wdGlvbmFsIGFyZ3VtZW50czpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogVGhlIGRldGFpbHMgdGVtcGxhdGUgdGFnIHJldHVybnMgYSBgRGV0YWlsc1Rva2VuYCBvYmplY3QgdGhhdCBjYW4gcHJpbnRcbiAqIGl0c2VsZiB3aXRoIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBpbiB0d28gd2F5cy5cbiAqIEl0IHdpbGwgcmVwb3J0IHRoZSByZWFsIGRldGFpbHMgdG9cbiAqIHRoZSBjb25zb2xlIGJ1dCBpbmNsdWRlIG9ubHkgdGhlIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLlxuICpcbiAqIFRoZSBgcmF3YCBtZW1iZXIgb2YgYSBgdGVtcGxhdGVgIGlzIGlnbm9yZWQsIHNvIGEgc2ltcGxlXG4gKiBgc3RyaW5nW11gIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gbmV2ZXJ9IEZhaWxUYWdcbiAqIFRoZSBgRmFpbGAgdGFtcGxhdGUgdGFnIHN1cHBvcnRzIHJlcGxhY2luZyBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aXRoIHBhdHRlcm5zIGxpa2VcbiAqIGBgYGpzXG4gKiBjb25kIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICpcbiAqIEhvd2V2ZXIsIGR1ZSB0byBbd2Vha25lc3MgaW4gY3VycmVudFxuICogVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiksIHRoZSBgfHxgXG4gKiBwYXR0ZXJucyBhcmUgbm90IGFzIHBvd2VyZnVsIGFzIHRoZSBgYXNzZXJ0KC4uLilgIGNhbGwgYXQgZW5hYmxpbmcgc3RhdGljXG4gKiByZWFzb25pbmcuIE9mIHRoZSBgfHxgLCBhZ2FpbiBkdWUgdG8gd2Vha25lc3NlcyBpbiBjdXJyZW50IFR5cGVTY3JpcHQsXG4gKiB0aGVcbiAqIGBgYGpzXG4gKiBjb25kIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYFxuICogYGBgXG4gKiBwYXR0ZXJuIGlzIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGVcbiAqIGBgYGpzXG4gKiBjb25kIHx8IGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIGF0IGVuYWJsaW5nIHN0YXRpYyByZXNvbmluZy4gRGVzcGl0ZSB0aGVzZSBwcm9ibGVtcywgd2UgZG8gbm90IHdhbnQgdG9cbiAqIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZCwgWGAuLi5jb21wbGFpbnQuLi5gKVxuICogYGBgXG4gKiBzdHlsZSBiZWNhdXNlIG9mIHRoZSBzdWJzdGFudGlhbCBvdmVyaGVhZCBpblxuICogZXZhbHVhdGluZyB0aGUgYFhgIHRlbXBsYXRlIGluIHRoZSB0eXBpY2FsIGB0cnVlYCBjYXNlIHdoZXJlIGl0IGlzIG5vdFxuICogbmVlZGVkLiBBbmQgd2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHRvIHRoZVxuICogYGBganNcbiAqIGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYClgXG4gKiBgYGBcbiAqIGJlY2F1c2Ugb2YgdGhlIHZlcmJvc2l0eSBhbmQgbG9zcyBvZiByZWFkYWJpbGl0eS4gSW5zdGVhZCwgdW50aWwvdW5sZXNzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUxNDI2IGlzIGZpeGVkLCBmb3IgdGhvc2VcbiAqIG5ldy1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiAgIH1cbiAqIGBgYFxuICogb3IsIGlmIG5lZWRlZCxcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZCkge1xuICogICAgIC8vIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkXG4gKiAgICAgdGhyb3cgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIFRoaXMgYXZvaWQgdGhlIFR5cGVTY3JpcHQgYnVncyB0aGF0IGNhdXNlIHRoZSBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcsXG4gKiBidXQgd2l0aCBubyBsb3NzIG9mIGVmZmljaWVuY3kgYW5kIGxpdHRsZSBsb3NzIG9mIHJlYWRhYmlsaXR5LlxuICovXG5cbi8qKlxuICogYXNzZXJ0IHRoYXQgZXhwciBpcyB0cnV0aHksIHdpdGggYW4gb3B0aW9uYWwgZGV0YWlscyB0byBkZXNjcmliZVxuICogdGhlIGFzc2VydGlvbi4gSXQgaXMgYSB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGV4cHIsIGRldGFpbHNgLi4uLmApO2BcbiAqIGBgYFxuICpcbiAqIFRoZSBsaXRlcmFsIHBvcnRpb25zIG9mIHRoZSB0ZW1wbGF0ZSBhcmUgYXNzdW1lZCBub24tc2Vuc2l0aXZlLCBhc1xuICogYXJlIHRoZSBgdHlwZW9mYCB0eXBlcyBvZiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy4gVGhlc2UgYXJlXG4gKiBhc3NlbWJsZWQgaW50byB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UuIFRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlXG4gKiBzdWJzdGl0dXRpb24gdmFsdWVzIGFyZSBhc3N1bWVkIHNlbnNpdGl2ZSwgdG8gYmUgcmV2ZWFsZWQgdG9cbiAqIHRoZSBjb25zb2xlIG9ubHkuIFdlIGFzc3VtZSBvbmx5IHRoZSB2aXJ0dWFsIHBsYXRmb3JtJ3Mgb3duZXIgY2FuIHJlYWRcbiAqIHdoYXQgaXMgd3JpdHRlbiB0byB0aGUgY29uc29sZSwgd2hlcmUgdGhlIG93bmVyIGlzIGluIGEgcHJpdmlsZWdlZFxuICogcG9zaXRpb24gb3ZlciBjb21wdXRhdGlvbiBydW5uaW5nIG9uIHRoYXQgcGxhdGZvcm0uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYgeyBCYXNlQXNzZXJ0ICYge1xuICogICB0eXBlb2Y6IEFzc2VydFR5cGVvZixcbiAqICAgZXJyb3I6IEFzc2VydE1ha2VFcnJvcixcbiAqICAgZmFpbDogQXNzZXJ0RmFpbCxcbiAqICAgZXF1YWw6IEFzc2VydEVxdWFsLFxuICogICBzdHJpbmc6IEFzc2VydFN0cmluZyxcbiAqICAgbm90ZTogQXNzZXJ0Tm90ZSxcbiAqICAgZGV0YWlsczogRGV0YWlsc1RhZyxcbiAqICAgRmFpbDogRmFpbFRhZyxcbiAqICAgcXVvdGU6IEFzc2VydFF1b3RlLFxuICogICBtYWtlQXNzZXJ0OiBNYWtlQXNzZXJ0LFxuICogfSB9IEFzc2VydFxuICovXG5cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVmlydHVhbENvbnNvbGVcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnZGVidWcnXX0gZGVidWdcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnbG9nJ119IGxvZ1xuICogQHByb3BlcnR5IHtDb25zb2xlWydpbmZvJ119IGluZm9cbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnd2FybiddfSB3YXJuXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2Vycm9yJ119IGVycm9yXG4gKlxuICogQHByb3BlcnR5IHtDb25zb2xlWyd0cmFjZSddfSB0cmFjZVxuICogQHByb3BlcnR5IHtDb25zb2xlWydkaXJ4bWwnXX0gZGlyeG1sXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2dyb3VwJ119IGdyb3VwXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2dyb3VwQ29sbGFwc2VkJ119IGdyb3VwQ29sbGFwc2VkXG4gKlxuICogQHByb3BlcnR5IHtDb25zb2xlWydhc3NlcnQnXX0gYXNzZXJ0XG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3RpbWVMb2cnXX0gdGltZUxvZ1xuICpcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnY2xlYXInXX0gY2xlYXJcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnY291bnQnXX0gY291bnRcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnY291bnRSZXNldCddfSBjb3VudFJlc2V0XG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2RpciddfSBkaXJcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnZ3JvdXBFbmQnXX0gZ3JvdXBFbmRcbiAqXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3RhYmxlJ119IHRhYmxlXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3RpbWUnXX0gdGltZVxuICogQHByb3BlcnR5IHtDb25zb2xlWyd0aW1lRW5kJ119IHRpbWVFbmRcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsndGltZVN0YW1wJ119IHRpbWVTdGFtcFxuICovXG5cbi8qIFRoaXMgaXMgZGVsaWJlcmF0ZWx5ICpub3QqIEpTRG9jLCBpdCBpcyBhIHJlZ3VsYXIgY29tbWVudC5cbiAqXG4gKiBUT0RPOiBXZSdkIGxpa2UgdG8gYWRkIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyB0byB0aGUgYWJvdmVcbiAqIFZpcnR1YWxDb25zb2xlLCBidXQgdGhleSBjdXJyZW50bHkgY2F1c2UgY29uZmxpY3RzIHdoZXJlXG4gKiBzb21lIFR5cGVzY3JpcHQgaW1wbGVtZW50YXRpb25zIGRvbid0IGhhdmUgdGhlc2UgcHJvcGVydGllc1xuICogb24gdGhlIENvbnNvbGUgdHlwZS5cbiAqXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3Byb2ZpbGUnXX0gcHJvZmlsZVxuICogQHByb3BlcnR5IHtDb25zb2xlWydwcm9maWxlRW5kJ119IHByb2ZpbGVFbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnZGVidWcnIHwgJ2xvZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InfSBMb2dTZXZlcml0eVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uc29sZUZpbHRlclxuICogQHByb3BlcnR5IHsoc2V2ZXJpdHk6IExvZ1NldmVyaXR5KSA9PiBib29sZWFufSBjYW5Mb2dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBGaWx0ZXJDb25zb2xlXG4gKiBAcGFyYW0ge1ZpcnR1YWxDb25zb2xlfSBiYXNlQ29uc29sZVxuICogQHBhcmFtIHtDb25zb2xlRmlsdGVyfSBmaWx0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gdG9waWNcbiAqIEByZXR1cm5zIHtWaXJ0dWFsQ29uc29sZX1cbiAqL1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s0XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFJhbmdlRXJyb3IsVHlwZUVycm9yLFdlYWtNYXAsYXJyYXlKb2luLGFycmF5TWFwLGFycmF5UG9wLGFycmF5UHVzaCxhc3NpZ24sZnJlZXplLGdsb2JhbFRoaXMsaXMsaXNFcnJvcixzdHJpbmdJbmRleE9mLHN0cmluZ1JlcGxhY2Usc3RyaW5nU2xpY2Usc3RyaW5nU3RhcnRzV2l0aCx3ZWFrbWFwRGVsZXRlLHdlYWttYXBHZXQsd2Vha21hcEhhcyx3ZWFrbWFwU2V0LGFuLGJlc3RFZmZvcnRTdHJpbmdpZnk7JGjigI1faW1wb3J0cyhbW1wiLi4vY29tbW9ucy5qc1wiLCBbW1wiUmFuZ2VFcnJvclwiLCBbJGjigI1fYSA9PiAoUmFuZ2VFcnJvciA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIldlYWtNYXBcIiwgWyRo4oCNX2EgPT4gKFdlYWtNYXAgPSAkaOKAjV9hKV1dLFtcImFycmF5Sm9pblwiLCBbJGjigI1fYSA9PiAoYXJyYXlKb2luID0gJGjigI1fYSldXSxbXCJhcnJheU1hcFwiLCBbJGjigI1fYSA9PiAoYXJyYXlNYXAgPSAkaOKAjV9hKV1dLFtcImFycmF5UG9wXCIsIFskaOKAjV9hID0+IChhcnJheVBvcCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQdXNoXCIsIFskaOKAjV9hID0+IChhcnJheVB1c2ggPSAkaOKAjV9hKV1dLFtcImFzc2lnblwiLCBbJGjigI1fYSA9PiAoYXNzaWduID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wiZ2xvYmFsVGhpc1wiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVGhpcyA9ICRo4oCNX2EpXV0sW1wiaXNcIiwgWyRo4oCNX2EgPT4gKGlzID0gJGjigI1fYSldXSxbXCJpc0Vycm9yXCIsIFskaOKAjV9hID0+IChpc0Vycm9yID0gJGjigI1fYSldXSxbXCJzdHJpbmdJbmRleE9mXCIsIFskaOKAjV9hID0+IChzdHJpbmdJbmRleE9mID0gJGjigI1fYSldXSxbXCJzdHJpbmdSZXBsYWNlXCIsIFskaOKAjV9hID0+IChzdHJpbmdSZXBsYWNlID0gJGjigI1fYSldXSxbXCJzdHJpbmdTbGljZVwiLCBbJGjigI1fYSA9PiAoc3RyaW5nU2xpY2UgPSAkaOKAjV9hKV1dLFtcInN0cmluZ1N0YXJ0c1dpdGhcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1N0YXJ0c1dpdGggPSAkaOKAjV9hKV1dLFtcIndlYWttYXBEZWxldGVcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBEZWxldGUgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBIYXNcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBIYXMgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBTZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdHJpbmdpZnktdXRpbHMuanNcIiwgW1tcImFuXCIsIFskaOKAjV9hID0+IChhbiA9ICRo4oCNX2EpXV0sW1wiYmVzdEVmZm9ydFN0cmluZ2lmeVwiLCBbJGjigI1fYSA9PiAoYmVzdEVmZm9ydFN0cmluZ2lmeSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIEZvciBvdXIgaW50ZXJuYWwgZGVidWdnaW5nIHB1cnBvc2VzLCB1bmNvbW1lbnRcbi8vIGNvbnN0IGludGVybmFsRGVidWdDb25zb2xlID0gY29uc29sZTtcblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPFN0cmluZ2FibGVQYXlsb2FkLCBhbnk+fSAqL1xuY29uc3QgZGVjbGFzc2lmaWVycz0gIG5ldyBXZWFrTWFwKCk7XG5cbi8qKiBAdHlwZSB7QXNzZXJ0UXVvdGV9ICovXG5jb25zdCBxdW90ZT0gIChwYXlsb2FkLCBzcGFjZXM9ICB1bmRlZmluZWQpPT4gIHtcbiAgY29uc3QgcmVzdWx0PSAgZnJlZXplKHtcbiAgICB0b1N0cmluZzogZnJlZXplKCgpPT4gIGJlc3RFZmZvcnRTdHJpbmdpZnkocGF5bG9hZCwgc3BhY2VzKSl9KTtcblxuICB3ZWFrbWFwU2V0KGRlY2xhc3NpZmllcnMsIHJlc3VsdCwgcGF5bG9hZCk7XG4gIHJldHVybiByZXN1bHQ7XG4gfTtcbmZyZWV6ZShxdW90ZSk7XG5cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSGlkZGVuRGV0YWlsc1xuICpcbiAqIENhcHR1cmVzIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgc3RyaW5nIHRhZy5cbiAqXG4gKiBAcHJvcGVydHkge1RlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW119IHRlbXBsYXRlXG4gKiBAcHJvcGVydHkge2FueVtdfSBhcmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxEZXRhaWxzVG9rZW4sIEhpZGRlbkRldGFpbHM+fVxuICpcbiAqIE1hcHMgZnJvbSBhIGRldGFpbHMgdG9rZW4gd2hpY2ggYSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCByZXR1cm5lZFxuICogdG8gYSByZWNvcmQgb2YgdGhlIGNvbnRlbnRzIG9mIHRoYXQgdGVtcGxhdGUgbGl0ZXJhbCBleHByZXNzaW9uLlxuICovXG5jb25zdCBoaWRkZW5EZXRhaWxzTWFwPSAgbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0hpZGRlbkRldGFpbHN9IGhpZGRlbkRldGFpbHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldE1lc3NhZ2VTdHJpbmc9ICAoeyB0ZW1wbGF0ZSwgYXJnc30pPT4gICB7XG4gIGNvbnN0IHBhcnRzPSAgW3RlbXBsYXRlWzBdXTtcbiAgZm9yKCBsZXQgaT0gIDA7IGk8ICBhcmdzLmxlbmd0aDsgaSs9ICAxKSB7XG4gICAgY29uc3QgYXJnPSAgYXJnc1tpXTtcbiAgICBsZXQgYXJnU3RyO1xuICAgIGlmKCB3ZWFrbWFwSGFzKGRlY2xhc3NpZmllcnMsIGFyZykpIHtcbiAgICAgIGFyZ1N0cj0gICBgJHthcmd9YDtcbiAgICAgfWVsc2UgaWYoIGlzRXJyb3IoYXJnKSkge1xuICAgICAgYXJnU3RyPSAgIGAoJHthbihhcmcubmFtZSl9KWA7XG4gICAgIH1lbHNlIHtcbiAgICAgIGFyZ1N0cj0gICBgKCR7YW4odHlwZW9mIGFyZyl9KWA7XG4gICAgIH1cbiAgICBhcnJheVB1c2gocGFydHMsIGFyZ1N0ciwgdGVtcGxhdGVbaSsgIDFdKTtcbiAgIH1cbiAgcmV0dXJuIGFycmF5Sm9pbihwYXJ0cywgJycpO1xuIH07XG5cbi8qKlxuICogR2l2ZSBkZXRhaWxzVG9rZW5zIGEgdG9TdHJpbmcgYmVoYXZpb3IuIFRvIG1pbmltaXplIHRoZSBvdmVyaGVhZCBvZlxuICogY3JlYXRpbmcgbmV3IGRldGFpbHNUb2tlbnMsIHdlIGRvIHRoaXMgd2l0aCBhblxuICogaW5oZXJpdGVkIGB0aGlzYCBzZW5zaXRpdmUgYHRvU3RyaW5nYCBtZXRob2QsIGV2ZW4gdGhvdWdoIHdlIG5vcm1hbGx5XG4gKiBhdm9pZCBgdGhpc2Agc2Vuc2l0aXZpdHkuIFRvIHByb3RlY3QgdGhlIG1ldGhvZCBmcm9tIGluYXBwcm9wcmlhdGVcbiAqIGB0aGlzYCBhcHBsaWNhdGlvbiwgaXQgZG9lcyBzb21ldGhpbmcgaW50ZXJlc3Rpbmcgb25seSBmb3Igb2JqZWN0c1xuICogcmVnaXN0ZXJlZCBpbiBgcmVkYWN0ZWREZXRhaWxzYCwgd2hpY2ggc2hvdWxkIGJlIGV4YWN0bHkgdGhlIGRldGFpbHNUb2tlbnMuXG4gKlxuICogVGhlIHByaW50aW5nIGJlaGF2aW9yIG11c3Qgbm90IHJldmVhbCBhbnl0aGluZyByZWRhY3RlZCwgc28gd2UganVzdCB1c2VcbiAqIHRoZSBzYW1lIGBnZXRNZXNzYWdlU3RyaW5nYCB3ZSB1c2UgdG8gY29uc3RydWN0IHRoZSByZWRhY3RlZCBtZXNzYWdlXG4gKiBzdHJpbmcgZm9yIGEgdGhyb3duIGFzc2VydGlvbiBlcnJvci5cbiAqL1xuY29uc3QgRGV0YWlsc1Rva2VuUHJvdG89ICBmcmVlemUoe1xuICB0b1N0cmluZygpIHtcbiAgICBjb25zdCBoaWRkZW5EZXRhaWxzPSAgd2Vha21hcEdldChoaWRkZW5EZXRhaWxzTWFwLCB0aGlzKTtcbiAgICBpZiggaGlkZGVuRGV0YWlscz09PSAgdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gJ1tOb3QgYSBEZXRhaWxzVG9rZW5dJztcbiAgICAgfVxuICAgIHJldHVybiBnZXRNZXNzYWdlU3RyaW5nKGhpZGRlbkRldGFpbHMpO1xuICAgfX0pO1xuXG5mcmVlemUoRGV0YWlsc1Rva2VuUHJvdG8udG9TdHJpbmcpO1xuXG4vKipcbiAqIE5vcm1hbGx5IHRoaXMgaXMgdGhlIGZ1bmN0aW9uIGV4cG9ydGVkIGFzIGBhc3NlcnQuZGV0YWlsc2AgYW5kIG9mdGVuXG4gKiBzcGVsbGVkIGBkYC4gSG93ZXZlciwgaWYgdGhlIGB7ZXJyb3JUYW1pbmc6ICd1bnNhZmUnfWAgb3B0aW9uIGlzIGdpdmVuIHRvXG4gKiBgbG9ja2Rvd25gLCB0aGVuIGB1bnJlZGFjdGVkRGV0YWlsc2AgaXMgdXNlZCBpbnN0ZWFkLlxuICpcbiAqIFRoZXJlIGFyZSBzb21lIHVuY29uZGl0aW9uYWwgdXNlcyBvZiBgcmVkYWN0ZWREZXRhaWxzYCBpbiB0aGlzIG1vZHVsZS4gQWxsXG4gKiBvZiB0aGVtIHNob3VsZCBiZSB1c2VzIHdoZXJlIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIGhhcyBubyByZWRhY3RlZFxuICogc3Vic3RpdHV0aW9uIHZhbHVlcy4gSW4gdGhvc2UgY2FzZXMsIHRoZSB0d28gYXJlIGVxdWl2YWxlbnQuXG4gKlxuICogQHR5cGUge0RldGFpbHNUYWd9XG4gKi9cbmNvbnN0IHJlZGFjdGVkRGV0YWlscz0gICh0ZW1wbGF0ZSwgLi4uYXJncyk9PiAge1xuICAvLyBLZWVwIGluIG1pbmQgdGhhdCB0aGUgdmFzdCBtYWpvcml0eSBvZiBjYWxscyB0byBgZGV0YWlsc2AgY3JlYXRlc1xuICAvLyBhIGRldGFpbHMgdG9rZW4gdGhhdCBpcyBuZXZlciB1c2VkLCBzbyB0aGlzIHBhdGggbXVzdCByZW1haW4gYXMgZmFzdCBhc1xuICAvLyBwb3NzaWJsZS4gSGVuY2Ugd2Ugc3RvcmUgd2hhdCB3ZSd2ZSBnb3Qgd2l0aCBsaXR0bGUgcHJvY2Vzc2luZywgcG9zdHBvbmluZ1xuICAvLyBhbGwgdGhlIHdvcmsgdG8gaGFwcGVuIG9ubHkgaWYgbmVlZGVkLCBmb3IgZXhhbXBsZSwgaWYgYW4gYXNzZXJ0aW9uIGZhaWxzLlxuICBjb25zdCBkZXRhaWxzVG9rZW49ICBmcmVlemUoeyBfX3Byb3RvX186IERldGFpbHNUb2tlblByb3RvfSk7XG4gIHdlYWttYXBTZXQoaGlkZGVuRGV0YWlsc01hcCwgZGV0YWlsc1Rva2VuLCB7IHRlbXBsYXRlLCBhcmdzfSk7XG4gIHJldHVybiBkZXRhaWxzVG9rZW47XG4gfTtcbmZyZWV6ZShyZWRhY3RlZERldGFpbHMpO1xuXG4vKipcbiAqIGB1bnJlZGFjdGVkRGV0YWlsc2AgaXMgbGlrZSBgZGV0YWlsc2AgZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgcmVkYWN0XG4gKiBhbnl0aGluZy4gSXQgYWN0cyBsaWtlIGBkZXRhaWxzYCB3b3VsZCBhY3QgaWYgYWxsIHN1YnN0aXR1dGlvbiB2YWx1ZXNcbiAqIHdlcmUgd3JhcHBlZCB3aXRoIHRoZSBgcXVvdGVgIGZ1bmN0aW9uIGFib3ZlICh0aGUgZnVuY3Rpb24gbm9ybWFsbHlcbiAqIHNwZWxsZWQgYHFgKS4gSWYgdGhlIGB7ZXJyb3JUYW1pbmc6ICd1bnNhZmUnfWAgb3B0aW9uIGlzIGdpdmVuIHRvXG4gKiBgbG9ja2Rvd25gLCB0aGVuIHRoZSBsb2NrZG93bi1zaGltIGFycmFuZ2VzIGZvciB0aGUgZ2xvYmFsIGBhc3NlcnRgIHRvIGJlXG4gKiBvbmUgd2hvc2UgYGRldGFpbHNgIHByb3BlcnR5IGlzIGB1bnJlZGFjdGVkRGV0YWlsc2AuXG4gKiBUaGlzIHNldHRpbmcgb3B0aW1pemVzIHRoZSBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgZXhwZXJpZW5jZSBhdCB0aGUgcHJpY2VcbiAqIG9mIHNhZmV0eS4gYHVucmVkYWN0ZWREZXRhaWxzYCBhbHNvIHNhY3JpZmljZXMgdGhlIHNwZWVkIG9mIGBkZXRhaWxzYCxcbiAqIHdoaWNoIGlzIHVzdWFsbHkgZmluZSBpbiBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcuXG4gKlxuICogQHR5cGUge0RldGFpbHNUYWd9XG4gKi9cbmNvbnN0IHVucmVkYWN0ZWREZXRhaWxzPSAgKHRlbXBsYXRlLCAuLi5hcmdzKT0+ICB7XG4gIGFyZ3M9ICBhcnJheU1hcChhcmdzLCAoYXJnKT0+XG4gICAgd2Vha21hcEhhcyhkZWNsYXNzaWZpZXJzLCBhcmcpPyAgYXJnOiAgcXVvdGUoYXJnKSk7XG5cbiAgcmV0dXJuIHJlZGFjdGVkRGV0YWlscyh0ZW1wbGF0ZSwgLi4uYXJncyk7XG4gfTskaOKAjV9vbmNlLnVucmVkYWN0ZWREZXRhaWxzKHVucmVkYWN0ZWREZXRhaWxzKTtcbmZyZWV6ZSh1bnJlZGFjdGVkRGV0YWlscyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0hpZGRlbkRldGFpbHN9IGhpZGRlbkRldGFpbHNcbiAqIEByZXR1cm5zIHtMb2dBcmdzfVxuICovXG5jb25zdCBnZXRMb2dBcmdzPSAgKHsgdGVtcGxhdGUsIGFyZ3N9KT0+ICAge1xuICBjb25zdCBsb2dBcmdzPSAgW3RlbXBsYXRlWzBdXTtcbiAgZm9yKCBsZXQgaT0gIDA7IGk8ICBhcmdzLmxlbmd0aDsgaSs9ICAxKSB7XG4gICAgbGV0IGFyZz0gIGFyZ3NbaV07XG4gICAgaWYoIHdlYWttYXBIYXMoZGVjbGFzc2lmaWVycywgYXJnKSkge1xuICAgICAgYXJnPSAgd2Vha21hcEdldChkZWNsYXNzaWZpZXJzLCBhcmcpO1xuICAgICB9XG4gICAgLy8gUmVtb3ZlIHRoZSBleHRyYSBzcGFjZXMgKHNpbmNlIGNvbnNvbGUuZXJyb3IgcHV0cyB0aGVtXG4gICAgLy8gYmV0d2VlbiBlYWNoIGNhdXNlKS5cbiAgICBjb25zdCBwcmlvcldpdGhvdXRTcGFjZT0gIHN0cmluZ1JlcGxhY2UoYXJyYXlQb3AobG9nQXJncyl8fCAgJycsIC8gJC8sICcnKTtcbiAgICBpZiggcHJpb3JXaXRob3V0U3BhY2UhPT0gICcnKSB7XG4gICAgICBhcnJheVB1c2gobG9nQXJncywgcHJpb3JXaXRob3V0U3BhY2UpO1xuICAgICB9XG4gICAgY29uc3QgbmV4dFdpdGhvdXRTcGFjZT0gIHN0cmluZ1JlcGxhY2UodGVtcGxhdGVbaSsgIDFdLCAvXiAvLCAnJyk7XG4gICAgYXJyYXlQdXNoKGxvZ0FyZ3MsIGFyZywgbmV4dFdpdGhvdXRTcGFjZSk7XG4gICB9XG4gIGlmKCBsb2dBcmdzW2xvZ0FyZ3MubGVuZ3RoLSAgMV09PT0gICcnKSB7XG4gICAgYXJyYXlQb3AobG9nQXJncyk7XG4gICB9XG4gIHJldHVybiBsb2dBcmdzO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8RXJyb3IsIExvZ0FyZ3M+fVxuICpcbiAqIE1hcHMgZnJvbSBhbiBlcnJvciBvYmplY3QgdG8gdGhlIGxvZyBhcmdzIHRoYXQgYXJlIGEgbW9yZSBpbmZvcm1hdGl2ZVxuICogYWx0ZXJuYXRpdmUgbWVzc2FnZSBmb3IgdGhhdCBlcnJvci4gV2hlbiBsb2dnaW5nIHRoZSBlcnJvciwgdGhlc2VcbiAqIGxvZyBhcmdzIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8gYGVycm9yLm1lc3NhZ2VgLlxuICovXG5jb25zdCBoaWRkZW5NZXNzYWdlTG9nQXJncz0gIG5ldyBXZWFrTWFwKCk7XG5cbi8vIFNvIGVhY2ggZXJyb3IgdGFnIHdpbGwgYmUgdW5pcXVlLlxubGV0IGVycm9yVGFnTnVtPSAgMDtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxFcnJvciwgc3RyaW5nPn1cbiAqL1xuY29uc3QgZXJyb3JUYWdzPSAgbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0RXJyb3JOYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCB0YWdFcnJvcj0gIChlcnIsIG9wdEVycm9yTmFtZT0gIGVyci5uYW1lKT0+ICB7XG4gIGxldCBlcnJvclRhZz0gIHdlYWttYXBHZXQoZXJyb3JUYWdzLCBlcnIpO1xuICBpZiggZXJyb3JUYWchPT0gIHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlcnJvclRhZztcbiAgIH1cbiAgZXJyb3JUYWdOdW0rPSAgMTtcbiAgZXJyb3JUYWc9ICAgYCR7b3B0RXJyb3JOYW1lfSMke2Vycm9yVGFnTnVtfWA7XG4gIHdlYWttYXBTZXQoZXJyb3JUYWdzLCBlcnIsIGVycm9yVGFnKTtcbiAgcmV0dXJuIGVycm9yVGFnO1xuIH07XG5cbi8qKlxuICogQHR5cGUge0Fzc2VydE1ha2VFcnJvcn1cbiAqL1xuY29uc3QgbWFrZUVycm9yPSAgKFxuICBvcHREZXRhaWxzPSAgcmVkYWN0ZWREZXRhaWxzIGBBc3NlcnQgZmFpbGVkYCxcbiAgRXJyb3JDb25zdHJ1Y3Rvcj0gIGdsb2JhbFRoaXMuRXJyb3IsXG4gIHsgZXJyb3JOYW1lPSAgdW5kZWZpbmVkfT0gICB7fSk9PlxuICAgICB7XG4gIGlmKCB0eXBlb2Ygb3B0RGV0YWlscz09PSAgJ3N0cmluZycpIHtcbiAgICAvLyBJZiBpdCBpcyBhIHN0cmluZywgdXNlIGl0IGFzIHRoZSBsaXRlcmFsIHBhcnQgb2YgdGhlIHRlbXBsYXRlIHNvXG4gICAgLy8gaXQgZG9lc24ndCBnZXQgcXVvdGVkLlxuICAgIG9wdERldGFpbHM9ICByZWRhY3RlZERldGFpbHMoW29wdERldGFpbHNdKTtcbiAgIH1cbiAgY29uc3QgaGlkZGVuRGV0YWlscz0gIHdlYWttYXBHZXQoaGlkZGVuRGV0YWlsc01hcCwgb3B0RGV0YWlscyk7XG4gIGlmKCBoaWRkZW5EZXRhaWxzPT09ICB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIGRldGFpbHMgJHtxdW90ZShvcHREZXRhaWxzKX1gKTtcbiAgIH1cbiAgY29uc3QgbWVzc2FnZVN0cmluZz0gIGdldE1lc3NhZ2VTdHJpbmcoaGlkZGVuRGV0YWlscyk7XG4gIGNvbnN0IGVycm9yPSAgbmV3IEVycm9yQ29uc3RydWN0b3IobWVzc2FnZVN0cmluZyk7XG4gIHdlYWttYXBTZXQoaGlkZGVuTWVzc2FnZUxvZ0FyZ3MsIGVycm9yLCBnZXRMb2dBcmdzKGhpZGRlbkRldGFpbHMpKTtcbiAgaWYoIGVycm9yTmFtZSE9PSAgdW5kZWZpbmVkKSB7XG4gICAgdGFnRXJyb3IoZXJyb3IsIGVycm9yTmFtZSk7XG4gICB9XG4gIC8vIFRoZSBuZXh0IGxpbmUgaXMgYSBwYXJ0aWN1bGFybHkgZnJ1aXRmdWwgcGxhY2UgdG8gcHV0IGEgYnJlYWtwb2ludC5cbiAgcmV0dXJuIGVycm9yO1xuIH07XG5mcmVlemUobWFrZUVycm9yKTtcblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxFcnJvciwgTG9nQXJnc1tdPn1cbiAqXG4gKiBNYXBzIGZyb20gYW4gZXJyb3IgdG8gYW4gYXJyYXkgb2YgbG9nIGFyZ3MsIHdoZXJlIGVhY2ggbG9nIGFyZ3MgaXNcbiAqIHJlbWVtYmVyZWQgYXMgYW4gYW5ub3RhdGlvbiBvbiB0aGF0IGVycm9yLiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSxcbiAqIHRvIGtlZXAgdHJhY2sgb2YgYWRkaXRpb25hbCBjYXVzZXMgb2YgdGhlIGVycm9yLiBUaGUgZWxlbWVudHMgb2YgYW55XG4gKiBsb2cgYXJncyBtYXkgaW5jbHVkZSBlcnJvcnMgd2hpY2ggYXJlIGFzc29jaWF0ZWQgd2l0aCBmdXJ0aGVyIGFubm90YXRpb25zLlxuICogQW4gYXVnbWVudGVkIGNvbnNvbGUsIGxpa2UgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgY291bGRcbiAqIHRoZW4gcmV0cmlldmUgdGhlIGdyYXBoIG9mIHN1Y2ggYW5ub3RhdGlvbnMuXG4gKi9cbmNvbnN0IGhpZGRlbk5vdGVMb2dBcmdzQXJyYXlzPSAgbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxFcnJvciwgTm90ZUNhbGxiYWNrW10+fVxuICpcbiAqIEFuIGF1Z21lbnRlZCBjb25zb2xlIHdpbGwgbm9ybWFsbHkgb25seSB0YWtlIHRoZSBoaWRkZW4gbm90ZUFyZ3MgYXJyYXkgb25jZSxcbiAqIHdoZW4gaXQgbG9ncyB0aGUgZXJyb3IgYmVpbmcgYW5ub3RhdGVkLiBPbmNlIHRoYXQgaGFwcGVucywgZnVydGhlclxuICogYW5ub3RhdGlvbnMgb2YgdGhhdCBlcnJvciBzaG91bGQgZ28gdG8gdGhlIGNvbnNvbGUgaW1tZWRpYXRlbHkuIFdlIGFycmFuZ2VcbiAqIHRoYXQgYnkgYWNjZXB0aW5nIGEgbm90ZS1jYWxsYmFjayBmdW5jdGlvbiBmcm9tIHRoZSBjb25zb2xlIGFzIGFuIG9wdGlvbmFsXG4gKiBwYXJ0IG9mIHRoYXQgdGFraW5nIG9wZXJhdGlvbi4gTm9ybWFsbHkgdGhlcmUgd2lsbCBvbmx5IGJlIGF0IG1vc3Qgb25lXG4gKiBjYWxsYmFjayBwZXIgZXJyb3IsIGJ1dCB0aGF0IGRlcGVuZHMgb24gY29uc29sZSBiZWhhdmlvciB3aGljaCB3ZSBzaG91bGQgbm90XG4gKiBhc3N1bWUuIFdlIG1ha2UgdGhpcyBhbiBhcnJheSBvZiBjYWxsYmFja3Mgc28gbXVsdGlwbGUgcmVnaXN0cmF0aW9uc1xuICogYXJlIGluZGVwZW5kZW50LlxuICovXG5jb25zdCBoaWRkZW5Ob3RlQ2FsbGJhY2tBcnJheXM9ICBuZXcgV2Vha01hcCgpO1xuXG4vKiogQHR5cGUge0Fzc2VydE5vdGV9ICovXG5jb25zdCBub3RlPSAgKGVycm9yLCBkZXRhaWxzTm90ZSk9PiAge1xuICBpZiggdHlwZW9mIGRldGFpbHNOb3RlPT09ICAnc3RyaW5nJykge1xuICAgIC8vIElmIGl0IGlzIGEgc3RyaW5nLCB1c2UgaXQgYXMgdGhlIGxpdGVyYWwgcGFydCBvZiB0aGUgdGVtcGxhdGUgc29cbiAgICAvLyBpdCBkb2Vzbid0IGdldCBxdW90ZWQuXG4gICAgZGV0YWlsc05vdGU9ICByZWRhY3RlZERldGFpbHMoW2RldGFpbHNOb3RlXSk7XG4gICB9XG4gIGNvbnN0IGhpZGRlbkRldGFpbHM9ICB3ZWFrbWFwR2V0KGhpZGRlbkRldGFpbHNNYXAsIGRldGFpbHNOb3RlKTtcbiAgaWYoIGhpZGRlbkRldGFpbHM9PT0gIHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgZGV0YWlscyAke3F1b3RlKGRldGFpbHNOb3RlKX1gKTtcbiAgIH1cbiAgY29uc3QgbG9nQXJncz0gIGdldExvZ0FyZ3MoaGlkZGVuRGV0YWlscyk7XG4gIGNvbnN0IGNhbGxiYWNrcz0gIHdlYWttYXBHZXQoaGlkZGVuTm90ZUNhbGxiYWNrQXJyYXlzLCBlcnJvcik7XG4gIGlmKCBjYWxsYmFja3MhPT0gIHVuZGVmaW5lZCkge1xuICAgIGZvciggY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG4gICAgICBjYWxsYmFjayhlcnJvciwgbG9nQXJncyk7XG4gICAgIH1cbiAgIH1lbHNlIHtcbiAgICBjb25zdCBsb2dBcmdzQXJyYXk9ICB3ZWFrbWFwR2V0KGhpZGRlbk5vdGVMb2dBcmdzQXJyYXlzLCBlcnJvcik7XG4gICAgaWYoIGxvZ0FyZ3NBcnJheSE9PSAgdW5kZWZpbmVkKSB7XG4gICAgICBhcnJheVB1c2gobG9nQXJnc0FycmF5LCBsb2dBcmdzKTtcbiAgICAgfWVsc2Uge1xuICAgICAgd2Vha21hcFNldChoaWRkZW5Ob3RlTG9nQXJnc0FycmF5cywgZXJyb3IsIFtsb2dBcmdzXSk7XG4gICAgIH1cbiAgIH1cbiB9O1xuZnJlZXplKG5vdGUpO1xuXG4vKipcbiAqIFRoZSB1bnByaXZpbGVnZWQgZm9ybSB0aGF0IGp1c3QgdXNlcyB0aGUgZGUgZmFjdG8gYGVycm9yLnN0YWNrYCBwcm9wZXJ0eS5cbiAqIFRoZSBzdGFydCBjb21wYXJ0bWVudCBub3JtYWxseSBoYXMgYSBwcml2aWxlZ2VkIGBnbG9iYWxUaGlzLmdldFN0YWNrU3RyaW5nYFxuICogd2hpY2ggc2hvdWxkIGJlIHByZWZlcnJlZCBpZiBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWZhdWx0R2V0U3RhY2tTdHJpbmc9ICAoZXJyb3IpPT57XG4gIGlmKCAhKCdzdGFjaydpbiAgZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICAgfVxuICBjb25zdCBzdGFja1N0cmluZz0gICBgJHtlcnJvci5zdGFja31gO1xuICBjb25zdCBwb3M9ICBzdHJpbmdJbmRleE9mKHN0YWNrU3RyaW5nLCAnXFxuJyk7XG4gIGlmKCBzdHJpbmdTdGFydHNXaXRoKHN0YWNrU3RyaW5nLCAnICcpfHwgIHBvcz09PSAgLTEpIHtcbiAgICByZXR1cm4gc3RhY2tTdHJpbmc7XG4gICB9XG4gIHJldHVybiBzdHJpbmdTbGljZShzdGFja1N0cmluZywgcG9zKyAgMSk7IC8vIGV4Y2x1ZGUgdGhlIGluaXRpYWwgbmV3bGluZVxuIH07XG5cbi8qKiBAdHlwZSB7TG9nZ2VkRXJyb3JIYW5kbGVyfSAqL1xuY29uc3QgbG9nZ2VkRXJyb3JIYW5kbGVyPSAge1xuICBnZXRTdGFja1N0cmluZzogZ2xvYmFsVGhpcy5nZXRTdGFja1N0cmluZ3x8ICBkZWZhdWx0R2V0U3RhY2tTdHJpbmcsXG4gIHRhZ0Vycm9yOiAoZXJyb3IpPT50YWdFcnJvcihlcnJvciksXG4gIHJlc2V0RXJyb3JUYWdOdW06ICgpPT4gIHtcbiAgICBlcnJvclRhZ051bT0gIDA7XG4gICB9LFxuICBnZXRNZXNzYWdlTG9nQXJnczogKGVycm9yKT0+d2Vha21hcEdldChoaWRkZW5NZXNzYWdlTG9nQXJncywgZXJyb3IpLFxuICB0YWtlTWVzc2FnZUxvZ0FyZ3M6IChlcnJvcik9PntcbiAgICBjb25zdCByZXN1bHQ9ICB3ZWFrbWFwR2V0KGhpZGRlbk1lc3NhZ2VMb2dBcmdzLCBlcnJvcik7XG4gICAgd2Vha21hcERlbGV0ZShoaWRkZW5NZXNzYWdlTG9nQXJncywgZXJyb3IpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gICB9LFxuICB0YWtlTm90ZUxvZ0FyZ3NBcnJheTogKGVycm9yLCBjYWxsYmFjayk9PiAge1xuICAgIGNvbnN0IHJlc3VsdD0gIHdlYWttYXBHZXQoaGlkZGVuTm90ZUxvZ0FyZ3NBcnJheXMsIGVycm9yKTtcbiAgICB3ZWFrbWFwRGVsZXRlKGhpZGRlbk5vdGVMb2dBcmdzQXJyYXlzLCBlcnJvcik7XG4gICAgaWYoIGNhbGxiYWNrIT09ICB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcz0gIHdlYWttYXBHZXQoaGlkZGVuTm90ZUNhbGxiYWNrQXJyYXlzLCBlcnJvcik7XG4gICAgICBpZiggY2FsbGJhY2tzKSB7XG4gICAgICAgIGFycmF5UHVzaChjYWxsYmFja3MsIGNhbGxiYWNrKTtcbiAgICAgICB9ZWxzZSB7XG4gICAgICAgIHdlYWttYXBTZXQoaGlkZGVuTm90ZUNhbGxiYWNrQXJyYXlzLCBlcnJvciwgW2NhbGxiYWNrXSk7XG4gICAgICAgfVxuICAgICB9XG4gICAgcmV0dXJuIHJlc3VsdHx8ICBbXTtcbiAgIH19OyRo4oCNX29uY2UubG9nZ2VkRXJyb3JIYW5kbGVyKGxvZ2dlZEVycm9ySGFuZGxlcik7XG5cbmZyZWV6ZShsb2dnZWRFcnJvckhhbmRsZXIpO1xuXG5cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQHR5cGUge01ha2VBc3NlcnR9XG4gKi9cbmNvbnN0IG1ha2VBc3NlcnQ9ICAob3B0UmFpc2U9ICB1bmRlZmluZWQsIHVucmVkYWN0ZWQ9ICBmYWxzZSk9PiAge1xuICBjb25zdCBkZXRhaWxzPSAgdW5yZWRhY3RlZD8gIHVucmVkYWN0ZWREZXRhaWxzOiAgcmVkYWN0ZWREZXRhaWxzO1xuICAvKiogQHR5cGUge0Fzc2VydEZhaWx9ICovXG4gIGNvbnN0IGZhaWw9ICAoXG4gICAgb3B0RGV0YWlscz0gIGRldGFpbHMgYEFzc2VydCBmYWlsZWRgLFxuICAgIEVycm9yQ29uc3RydWN0b3I9ICBnbG9iYWxUaGlzLkVycm9yKT0+XG4gICAgICAge1xuICAgIGNvbnN0IHJlYXNvbj0gIG1ha2VFcnJvcihvcHREZXRhaWxzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgICBpZiggb3B0UmFpc2UhPT0gIHVuZGVmaW5lZCkge1xuICAgICAgb3B0UmFpc2UocmVhc29uKTtcbiAgICAgfVxuICAgIHRocm93IHJlYXNvbjtcbiAgIH07XG4gIGZyZWV6ZShmYWlsKTtcblxuICAvKiogQHR5cGUge0ZhaWxUYWd9ICovXG4gIGNvbnN0IEZhaWw9ICAodGVtcGxhdGUsIC4uLmFyZ3MpPT4gIGZhaWwoZGV0YWlscyh0ZW1wbGF0ZSwgLi4uYXJncykpO1xuXG4gIC8vIERvbid0IGZyZWV6ZSBvciBleHBvcnQgYGJhc2VBc3NlcnRgIHVudGlsIHdlIGFkZCBtZXRob2RzLlxuICAvLyBUT0RPIElmIEkgY2hhbmdlIHRoaXMgZnJvbSBhIGBmdW5jdGlvbmAgZnVuY3Rpb24gdG8gYW4gYXJyb3dcbiAgLy8gZnVuY3Rpb24sIEkgc2VlbSB0byBnZXQgdHlwZSBlcnJvcnMgZnJvbSBUeXBlU2NyaXB0LiBXaHk/XG4gIC8qKiBAdHlwZSB7QmFzZUFzc2VydH0gKi9cbiAgZnVuY3Rpb24gYmFzZUFzc2VydChcbiAgICBmbGFnLFxuICAgIG9wdERldGFpbHM9ICBkZXRhaWxzIGBDaGVjayBmYWlsZWRgLFxuICAgIEVycm9yQ29uc3RydWN0b3I9ICBnbG9iYWxUaGlzLkVycm9yKVxuICAgIHtcbiAgICBpZiggIWZsYWcpIHtcbiAgICAgIHRocm93IGZhaWwob3B0RGV0YWlscywgRXJyb3JDb25zdHJ1Y3Rvcik7XG4gICAgIH1cbiAgIH1cblxuICAvKiogQHR5cGUge0Fzc2VydEVxdWFsfSAqL1xuICBjb25zdCBlcXVhbD0gIChcbiAgICBhY3R1YWwsXG4gICAgZXhwZWN0ZWQsXG4gICAgb3B0RGV0YWlscz0gIGRldGFpbHMgYEV4cGVjdGVkICR7YWN0dWFsfSBpcyBzYW1lIGFzICR7ZXhwZWN0ZWR9YCxcbiAgICBFcnJvckNvbnN0cnVjdG9yPSAgUmFuZ2VFcnJvcik9PlxuICAgICAgIHtcbiAgICBiYXNlQXNzZXJ0KGlzKGFjdHVhbCwgZXhwZWN0ZWQpLCBvcHREZXRhaWxzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgIH07XG4gIGZyZWV6ZShlcXVhbCk7XG5cbiAgLyoqIEB0eXBlIHtBc3NlcnRUeXBlb2Z9ICovXG4gIGNvbnN0IGFzc2VydFR5cGVvZj0gIChzcGVjaW1lbiwgdHlwZW5hbWUsIG9wdERldGFpbHMpPT4gIHtcbiAgICBiYXNlQXNzZXJ0KFxuICAgICAgdHlwZW9mIHR5cGVuYW1lPT09ICAnc3RyaW5nJyxcbiAgICAgIGRldGFpbHMgYCR7cXVvdGUodHlwZW5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbiAgICBpZiggb3B0RGV0YWlscz09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAvLyBMaWtlXG4gICAgICAvLyBgYGBqc1xuICAgICAgLy8gb3B0RGV0YWlscyA9IGRldGFpbHNgJHtzcGVjaW1lbn0gbXVzdCBiZSAke3F1b3RlKGFuKHR5cGVuYW1lKSl9YDtcbiAgICAgIC8vIGBgYFxuICAgICAgLy8gZXhjZXB0IGl0IHB1dHMgdGhlIHR5cGVuYW1lIGludG8gdGhlIGxpdGVyYWwgcGFydCBvZiB0aGUgdGVtcGxhdGVcbiAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgZ2V0IHF1b3RlZC5cbiAgICAgIG9wdERldGFpbHM9ICBkZXRhaWxzKFsnJywgIGAgbXVzdCBiZSAke2FuKHR5cGVuYW1lKX1gXSxzcGVjaW1lbik7XG4gICAgIH1cbiAgICBlcXVhbCh0eXBlb2Ygc3BlY2ltZW4sIHR5cGVuYW1lLCBvcHREZXRhaWxzLCBUeXBlRXJyb3IpO1xuICAgfTtcbiAgZnJlZXplKGFzc2VydFR5cGVvZik7XG5cbiAgLyoqIEB0eXBlIHtBc3NlcnRTdHJpbmd9ICovXG4gIGNvbnN0IGFzc2VydFN0cmluZz0gIChzcGVjaW1lbiwgb3B0RGV0YWlscyk9PlxuICAgIGFzc2VydFR5cGVvZihzcGVjaW1lbiwgJ3N0cmluZycsIG9wdERldGFpbHMpO1xuXG4gIC8vIE5vdGUgdGhhdCBcImFzc2VydCA9PT0gYmFzZUFzc2VydFwiXG4gIC8qKiBAdHlwZSB7QXNzZXJ0fSAqL1xuICBjb25zdCBhc3NlcnQ9ICBhc3NpZ24oYmFzZUFzc2VydCwge1xuICAgIGVycm9yOiBtYWtlRXJyb3IsXG4gICAgZmFpbCxcbiAgICBlcXVhbCxcbiAgICB0eXBlb2Y6IGFzc2VydFR5cGVvZixcbiAgICBzdHJpbmc6IGFzc2VydFN0cmluZyxcbiAgICBub3RlLFxuICAgIGRldGFpbHMsXG4gICAgRmFpbCxcbiAgICBxdW90ZSxcbiAgICBtYWtlQXNzZXJ0fSk7XG5cbiAgcmV0dXJuIGZyZWV6ZShhc3NlcnQpO1xuIH07JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuZnJlZXplKG1ha2VBc3NlcnQpO1xuXG5cbi8qKiBAdHlwZSB7QXNzZXJ0fSAqL1xuY29uc3QgYXNzZXJ0PSAgbWFrZUFzc2VydCgpOyRo4oCNX29uY2UuYXNzZXJ0KGFzc2VydCk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzVdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfRVZBTCxjcmVhdGUsZGVmaW5lUHJvcGVydGllcyxmcmVlemUsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiRkVSQUxfRVZBTFwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRVZBTCA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgeyBGYWlsfT0gICBhc3NlcnQ7XG5cbi8vIFdlIGF0dGVtcHQgdG8gZnJ1c3RyYXRlIHN0YWNrIGJ1bXBpbmcgYXR0YWNrcyBvbiB0aGUgc2FmZSBldmFsdWF0b3Jcbi8vIChgbWFrZS1zYWZlLWV2YWx1YXRvci5qc2ApLlxuLy8gQSBzdGFjayBidW1waW5nIGF0dGFjayBmb3JjZXMgYW4gQVBJIGNhbGwgdG8gdGhyb3cgYSBzdGFjayBvdmVyZmxvd1xuLy8gYFJhbmdlRXJyb3JgIGF0IGFuIGlub3Bwb3J0dW5lIHRpbWUuXG4vLyBUaGUgYXR0YWNrZXIgYXJyYW5nZXMgZm9yIHRoZSBzdGFjayB0byBiZSBzdWZmaWNpZW50bHkgZGVlcCB0aGF0IHRoZSBBUElcbi8vIGNvbnN1bWVzIGV4YWN0bHkgZW5vdWdoIHN0YWNrIGZyYW1lcyB0byB0aHJvdyBhbiBleGNlcHRpb24uXG4vL1xuLy8gRm9yIHRoZSBzYWZlIGV2YWx1YXRvciwgYW4gZXhjZXB0aW9uIHRocm93biBiZXR3ZWVuIGFkZGluZyBhbmQgdGhlbiBkZWxldGluZ1xuLy8gYGV2YWxgIG9uIGBldmFsU2NvcGVgIGNvdWxkIGxlYWsgdGhlIHJlYWwgYGV2YWxgIHRvIGFuIGF0dGFja2VyJ3MgbGV4aWNhbFxuLy8gc2NvcGUuXG4vLyBUaGlzIHdvdWxkIGJlIHN1ZmZpY2llbnRseSBkaXNhc3Ryb3VzIHRoYXQgd2UgZ3VhcmQgYWdhaW5zdCBpdCB0d2ljZS5cbi8vIEZpcnN0LCB3ZSBkZWxldGUgYGV2YWxgIGZyb20gYGV2YWxTY29wZWAgaW1tZWRpYXRlbHkgYmVmb3JlIHJlbmRlcmluZyBpdCB0b1xuLy8gdGhlIGd1ZXN0IHByb2dyYW0ncyBsZXhpY2FsIHNjb3BlLlxuLy9cbi8vIElmIHRoZSBhdHRhY2tlciBtYW5hZ2VzIHRvIGFycmFuZ2UgZm9yIGBldmFsYCB0byB0aHJvdyBhbiBleGNlcHRpb24gYWZ0ZXIgd2Vcbi8vIGNhbGwgYGFsbG93TmV4dEV2YWxUb0JlVW5zYWZlYCBidXQgYmVmb3JlIHRoZSBndWVzdCBwcm9ncmFtIGFjY2Vzc2VzIGBldmFsYCxcbi8vIGl0IHdvdWxkIGJlIGFibGUgdG8gYWNjZXNzIGBldmFsYCBvbmNlIG1vcmUgaW4gaXRzIG93biBjb2RlLlxuLy8gQWx0aG91Z2ggdGhleSBjb3VsZCBkbyBubyBoYXJtIHdpdGggYSBkaXJlY3QgYGV2YWxgLCB0aGV5IHdvdWxkIGJlIGFibGUgdG9cbi8vIGVzY2FwZSB0byB0aGUgdHJ1ZSBnbG9iYWwgc2NvcGUgd2l0aCBhbiBpbmRpcmVjdCBgZXZhbGAuXG4vL1xuLy8gICBwcmVwYXJlU3RhY2soZGVwdGgsICgpID0+IHtcbi8vICAgICAoZXZhbCkoJycpO1xuLy8gICB9KTtcbi8vICAgY29uc3QgdW5zYWZlRXZhbCA9IChldmFsKTtcbi8vICAgY29uc3Qgc2FmZUV2YWwgPSAoZXZhbCk7XG4vLyAgIGNvbnN0IHJlYWxHbG9iYWwgPSB1bnNhZmVFdmFsKCdnbG9iYWxUaGlzJyk7XG4vL1xuLy8gVG8gcHJvdGVjdCBhZ2FpbnN0IHRoYXQgY2FzZSwgd2UgYWxzbyBkZWxldGUgYGV2YWxgIGZyb20gdGhlIGBldmFsU2NvcGVgIGluXG4vLyBhIGBmaW5hbGx5YCBibG9jayBzdXJyb3VuZGluZyB0aGUgY2FsbCB0byB0aGUgc2FmZSBldmFsdWF0b3IuXG4vLyBUaGUgb25seSB3YXkgdG8gcmVhY2ggdGhpcyBjYXNlIGlzIGlmIGBldmFsYCByZW1haW5zIG9uIGBldmFsU2NvcGVgIGR1ZSB0b1xuLy8gYW4gYXR0YWNrLCBzbyB3ZSBhc3N1bWUgdGhhdCBhdHRhY2sgd291bGQgaGF2ZSBoYXZlIGludmFsaWRlZCBvdXIgaXNvbGF0aW9uXG4vLyBhbmQgcmV2b2tlIGFsbCBmdXR1cmUgYWNjZXNzIHRvIHRoZSBldmFsdWF0b3IuXG4vL1xuLy8gVG8gZGVmZWF0IGEgc3RhY2sgYnVtcGluZyBhdHRhY2ssIHdlIG11c3QgdXNlIGZld2VyIHN0YWNrIGZyYW1lcyB0byByZWNvdmVyXG4vLyBpbiB0aGF0IGBmaW5hbGx5YCBibG9jayB0aGFuIHdlIHVzZWQgaW4gdGhlIGB0cnlgIGJsb2NrLlxuLy8gV2UgaGF2ZSBubyByZWxpYWJsZSBndWFyYW50ZWVzIGFib3V0IGhvdyBtYW55IHN0YWNrIGZyYW1lcyBhIGJsb2NrIG9mXG4vLyBKYXZhU2NyaXB0IHdpbGwgY29uc3VtZS5cbi8vIEZ1bmN0aW9uIGlubGluaW5nLCB0YWlsLWNhbGwgb3B0aW1pemF0aW9uLCB2YXJpYXRpb25zIGluIHRoZSBzaXplIG9mIGEgc3RhY2tcbi8vIGZyYW1lLCBhbmQgYmxvY2sgc2NvcGVzIG1heSBhZmZlY3QgdGhlIGRlcHRoIG9mIHRoZSBzdGFjay5cbi8vIFRoZSBvbmx5IG51bWJlciBvZiBhY2NlcHRhYmxlIHN0YWNrIGZyYW1lcyB0byB1c2UgaW4gdGhlIGZpbmFsbHkgYmxvY2sgaXNcbi8vIHplcm8uXG4vLyBXZSBvbmx5IHVzZSBwcm9wZXJ0eSBhc3NpZ25tZW50IGFuZCBkZWxldGlvbiBpbiB0aGUgc2FmZSBldmFsdWF0b3Inc1xuLy8gYGZpbmFsbHlgIGJsb2NrLlxuLy8gV2UgdXNlIGBkZWxldGUgZXZhbFNjb3BlLmV2YWxgIHRvIHdpdGhob2xkIHRoZSBldmFsdWF0b3IuXG4vLyBXZSBhc3NpZ24gYW4gZW52ZWxvcGUgb2JqZWN0IG92ZXIgYGV2YWxTY29wZUtpdC5yZXZva2VkYCB0byByZXZva2UgdGhlXG4vLyBldmFsdWF0b3IuXG4vL1xuLy8gVGhpcyBpcyB3aHkgd2Ugc3VwcGx5IGEgbWVhbmluZ2Z1bGx5IG5hbWVkIGZ1bmN0aW9uIGZvclxuLy8gYGFsbG93TmV4dEV2YWxUb0JlVW5zYWZlYCBidXQgZG8gbm90IHByb3ZpZGUgYSBjb3JyZXNwb25kaW5nXG4vLyBgcmV2b2tlQWNjZXNzVG9VbnNhZmVFdmFsYCBvciBldmVuIHNpbXBseSBgcmV2b2tlYC5cbi8vIFRoZXNlIHJlY292ZXJ5IHJvdXRpbmVzIGFyZSBleHByZXNzZWQgaW5saW5lIGluIHRoZSBzYWZlIGV2YWx1YXRvci5cblxuY29uc3QgICAgICAgIG1ha2VFdmFsU2NvcGVLaXQ9ICAoKT0+ICB7XG4gIGNvbnN0IGV2YWxTY29wZT0gIGNyZWF0ZShudWxsKTtcbiAgY29uc3Qgb25lVGltZUV2YWxQcm9wZXJ0aWVzPSAgZnJlZXplKHtcbiAgICBldmFsOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGRlbGV0ZSBldmFsU2NvcGUuZXZhbDtcbiAgICAgICAgcmV0dXJuIEZFUkFMX0VWQUw7XG4gICAgICAgfSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cblxuICBjb25zdCBldmFsU2NvcGVLaXQ9ICB7XG4gICAgZXZhbFNjb3BlLFxuICAgIGFsbG93TmV4dEV2YWxUb0JlVW5zYWZlKCkge1xuICAgICAgaWYoIGV2YWxTY29wZUtpdC5yZXZva2VkIT09ICBudWxsKSB7XG4gICAgICAgIEZhaWwgYGEgaGFuZGxlciBkaWQgbm90IHJlc2V0IGFsbG93TmV4dEV2YWxUb0JlVW5zYWZlICR7dGhpcy5yZXZva2VkLmVycn1gO1xuICAgICAgIH1cbiAgICAgIC8vIEFsbG93IG5leHQgcmVmZXJlbmNlIHRvIGV2YWwgcHJvZHVjZSB0aGUgdW5zYWZlIEZFUkFMX0VWQUwuXG4gICAgICAvLyBXZSBhdm9pZCBkZWZpbmVQcm9wZXJ0eSBiZWNhdXNlIGl0IGNvbnN1bWVzIGFuIGV4dHJhIHN0YWNrIGZyYW1lIHRhbWluZ1xuICAgICAgLy8gaXRzIHJldHVybiB2YWx1ZS5cbiAgICAgIGRlZmluZVByb3BlcnRpZXMoZXZhbFNjb3BlLCBvbmVUaW1lRXZhbFByb3BlcnRpZXMpO1xuICAgICB9LFxuICAgIHJldm9rZWQ6IG51bGx9O1xuXG5cbiAgcmV0dXJuIGV2YWxTY29wZUtpdDtcbiB9OyRo4oCNX29uY2UubWFrZUV2YWxTY29wZUtpdChtYWtlRXZhbFNjb3BlS2l0KTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbNl0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhcnJheUZpbHRlcixhcnJheUluY2x1ZGVzLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixnZXRPd25Qcm9wZXJ0eU5hbWVzLG9iamVjdEhhc093blByb3BlcnR5LHJlZ2V4cFRlc3Q7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJhcnJheUZpbHRlclwiLCBbJGjigI1fYSA9PiAoYXJyYXlGaWx0ZXIgPSAkaOKAjV9hKV1dLFtcImFycmF5SW5jbHVkZXNcIiwgWyRo4oCNX2EgPT4gKGFycmF5SW5jbHVkZXMgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eU5hbWVzID0gJGjigI1fYSldXSxbXCJvYmplY3RIYXNPd25Qcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAob2JqZWN0SGFzT3duUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcInJlZ2V4cFRlc3RcIiwgWyRo4oCNX2EgPT4gKHJlZ2V4cFRlc3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIGtleXdvcmRzXG4gKiBJbiBKYXZhU2NyaXB0IHlvdSBjYW5ub3QgdXNlIHRoZXNlIHJlc2VydmVkIHdvcmRzIGFzIHZhcmlhYmxlcy5cbiAqIFNlZSAxMS42LjEgSWRlbnRpZmllciBOYW1lc1xuICovXG5jb25zdCBrZXl3b3Jkcz0gIFtcbiAgLy8gMTEuNi4yLjEgS2V5d29yZHNcbiAgJ2F3YWl0JyxcbiAgJ2JyZWFrJyxcbiAgJ2Nhc2UnLFxuICAnY2F0Y2gnLFxuICAnY2xhc3MnLFxuICAnY29uc3QnLFxuICAnY29udGludWUnLFxuICAnZGVidWdnZXInLFxuICAnZGVmYXVsdCcsXG4gICdkZWxldGUnLFxuICAnZG8nLFxuICAnZWxzZScsXG4gICdleHBvcnQnLFxuICAnZXh0ZW5kcycsXG4gICdmaW5hbGx5JyxcbiAgJ2ZvcicsXG4gICdmdW5jdGlvbicsXG4gICdpZicsXG4gICdpbXBvcnQnLFxuICAnaW4nLFxuICAnaW5zdGFuY2VvZicsXG4gICduZXcnLFxuICAncmV0dXJuJyxcbiAgJ3N1cGVyJyxcbiAgJ3N3aXRjaCcsXG4gICd0aGlzJyxcbiAgJ3Rocm93JyxcbiAgJ3RyeScsXG4gICd0eXBlb2YnLFxuICAndmFyJyxcbiAgJ3ZvaWQnLFxuICAnd2hpbGUnLFxuICAnd2l0aCcsXG4gICd5aWVsZCcsXG5cbiAgLy8gQWxzbyByZXNlcnZlZCB3aGVuIHBhcnNpbmcgc3RyaWN0IG1vZGUgY29kZVxuICAnbGV0JyxcbiAgJ3N0YXRpYycsXG5cbiAgLy8gMTEuNi4yLjIgRnV0dXJlIFJlc2VydmVkIFdvcmRzXG4gICdlbnVtJyxcblxuICAvLyBBbHNvIHJlc2VydmVkIHdoZW4gcGFyc2luZyBzdHJpY3QgbW9kZSBjb2RlXG4gICdpbXBsZW1lbnRzJyxcbiAgJ3BhY2thZ2UnLFxuICAncHJvdGVjdGVkJyxcbiAgJ2ludGVyZmFjZScsXG4gICdwcml2YXRlJyxcbiAgJ3B1YmxpYycsXG5cbiAgLy8gUmVzZXJ2ZWQgYnV0IG5vdCBtZW50aW9uZWQgaW4gc3BlY3NcbiAgJ2F3YWl0JyxcblxuICAnbnVsbCcsXG4gICd0cnVlJyxcbiAgJ2ZhbHNlJyxcblxuICAndGhpcycsXG4gICdhcmd1bWVudHMnXTtcblxuXG4vKipcbiAqIGlkZW50aWZpZXJQYXR0ZXJuXG4gKiBTaW1wbGlmaWVkIHZhbGlkYXRpb24gb2YgaWRlbnRpZmllciBuYW1lczogbWF5IG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWNcbiAqIGNoYXJhY3RlcnMgKG9yIFwiJFwiIG9yIFwiX1wiKSwgYW5kIG1heSBub3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LiBUaGlzIGlzIHNhZmVcbiAqIGFuZCBkb2VzIG5vdCByZWR1Y2VzIHRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBzaGltLiBUaGUgbW90aXZhdGlvbiBmb3JcbiAqIHRoaXMgbGltaXRhdGlvbiB3YXMgdG8gZGVjcmVhc2UgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIGltcGxlbWVudGF0aW9uLFxuICogYW5kIHRvIG1haW50YWluIGEgcmVzb25hYmxlIGxldmVsIG9mIHBlcmZvcm1hbmNlLlxuICogTm90ZTogXFx3IGlzIGVxdWl2YWxlbnQgW2EtekEtWl8wLTldXG4gKiBTZWUgMTEuNi4xIElkZW50aWZpZXIgTmFtZXNcbiAqL1xuY29uc3QgaWRlbnRpZmllclBhdHRlcm49ICAvXlthLXpBLVpfJF1bXFx3JF0qJC87XG5cbi8qKlxuICogaXNWYWxpZElkZW50aWZpZXJOYW1lKClcbiAqIFdoYXQgdmFyaWFibGUgbmFtZXMgbWlnaHQgaXQgYnJpbmcgaW50byBzY29wZT8gVGhlc2UgaW5jbHVkZSBhbGxcbiAqIHByb3BlcnR5IG5hbWVzIHdoaWNoIGNhbiBiZSB2YXJpYWJsZSBuYW1lcywgaW5jbHVkaW5nIHRoZSBuYW1lc1xuICogb2YgaW5oZXJpdGVkIHByb3BlcnRpZXMuIEl0IGV4Y2x1ZGVzIHN5bWJvbHMgYW5kIG5hbWVzIHdoaWNoIGFyZVxuICoga2V5d29yZHMuIFdlIGRyb3Agc3ltYm9scyBzYWZlbHkuIEN1cnJlbnRseSwgdGhpcyBzaGltIHJlZnVzZXNcbiAqIHNlcnZpY2UgaWYgYW55IG9mIHRoZSBuYW1lcyBhcmUga2V5d29yZHMgb3Iga2V5d29yZC1saWtlLiBUaGlzIGlzXG4gKiBzYWZlIGFuZCBvbmx5IHByZXZlbnQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmNvbnN0ICAgICAgICBpc1ZhbGlkSWRlbnRpZmllck5hbWU9ICAobmFtZSk9PntcbiAgLy8gRW5zdXJlIHdlIGhhdmUgYSB2YWxpZCBpZGVudGlmaWVyLiBXZSB1c2UgcmVnZXhwVGVzdCByYXRoZXIgdGhhblxuICAvLyAvLi4vLnRlc3QoKSB0byBndWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIFJlZ0V4cCBoYXMgYmVlbiBwb2lzb25lZC5cbiAgcmV0dXJuKFxuICAgIG5hbWUhPT0gICdldmFsJyYmXG4gICAgIWFycmF5SW5jbHVkZXMoa2V5d29yZHMsIG5hbWUpJiZcbiAgICByZWdleHBUZXN0KGlkZW50aWZpZXJQYXR0ZXJuLCBuYW1lKSk7XG5cbiB9O1xuXG4vKlxuICogaXNJbW11dGFibGVEYXRhUHJvcGVydHlcbiAqLyRo4oCNX29uY2UuaXNWYWxpZElkZW50aWZpZXJOYW1lKGlzVmFsaWRJZGVudGlmaWVyTmFtZSk7XG5cbmZ1bmN0aW9uIGlzSW1tdXRhYmxlRGF0YVByb3BlcnR5KG9iaiwgbmFtZSkge1xuICBjb25zdCBkZXNjPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7XG4gIHJldHVybihcbiAgICAvL1xuICAgIC8vIFRoZSBnZXR0ZXJzIHdpbGwgbm90IGhhdmUgLndyaXRhYmxlLCBkb24ndCBsZXQgdGhlIGZhbHN5bmVzcyBvZlxuICAgIC8vICd1bmRlZmluZWQnIHRyaWNrIHVzOiB0ZXN0IHdpdGggPT09IGZhbHNlLCBub3QgISAuIEhvd2V2ZXIgZGVzY3JpcHRvcnNcbiAgICAvLyBpbmhlcml0IGZyb20gdGhlIChwb3RlbnRpYWxseSBwb2lzb25lZCkgZ2xvYmFsIG9iamVjdCwgc28gd2UgbWlnaHQgc2VlXG4gICAgLy8gZXh0cmEgcHJvcGVydGllcyB3aGljaCB3ZXJlbid0IHJlYWxseSB0aGVyZS4gQWNjZXNzb3IgcHJvcGVydGllcyBoYXZlXG4gICAgLy8gJ2dldC9zZXQvZW51bWVyYWJsZS9jb25maWd1cmFibGUnLCB3aGlsZSBkYXRhIHByb3BlcnRpZXMgaGF2ZVxuICAgIC8vICd2YWx1ZS93cml0YWJsZS9lbnVtZXJhYmxlL2NvbmZpZ3VyYWJsZScuXG4gICAgZGVzYy5jb25maWd1cmFibGU9PT0gIGZhbHNlJiZcbiAgICBkZXNjLndyaXRhYmxlPT09ICBmYWxzZSYmXG4gICAgLy9cbiAgICAvLyBDaGVja3MgZm9yIGRhdGEgcHJvcGVydGllcyBiZWNhdXNlIHRoZXkncmUgdGhlIG9ubHkgb25lcyB3ZSBjYW5cbiAgICAvLyBvcHRpbWl6ZSAoYWNjZXNzb3JzIGFyZSBtb3N0IGxpa2VseSBub24tY29uc3RhbnQpLiBEZXNjcmlwdG9ycyBjYW4ndFxuICAgIC8vIGNhbid0IGhhdmUgYWNjZXNzb3JzIGFuZCB2YWx1ZSBwcm9wZXJ0aWVzIGF0IHRoZSBzYW1lIHRpbWUsIHRoZXJlZm9yZVxuICAgIC8vIHRoaXMgY2hlY2sgaXMgc3VmZmljaWVudC4gVXNpbmcgZXhwbGljaXQgb3duIHByb3BlcnR5IGRlYWwgd2l0aCB0aGVcbiAgICAvLyBjYXNlIHdoZXJlIE9iamVjdC5wcm90b3R5cGUgaGFzIGJlZW4gcG9pc29uZWQuXG4gICAgb2JqZWN0SGFzT3duUHJvcGVydHkoZGVzYywgJ3ZhbHVlJykpO1xuXG4gfVxuXG4vKipcbiAqIGdldFNjb3BlQ29uc3RhbnRzKClcbiAqIFdoYXQgdmFyaWFibGUgbmFtZXMgbWlnaHQgaXQgYnJpbmcgaW50byBzY29wZT8gVGhlc2UgaW5jbHVkZSBhbGxcbiAqIHByb3BlcnR5IG5hbWVzIHdoaWNoIGNhbiBiZSB2YXJpYWJsZSBuYW1lcywgaW5jbHVkaW5nIHRoZSBuYW1lc1xuICogb2YgaW5oZXJpdGVkIHByb3BlcnRpZXMuIEl0IGV4Y2x1ZGVzIHN5bWJvbHMgYW5kIG5hbWVzIHdoaWNoIGFyZVxuICoga2V5d29yZHMuIFdlIGRyb3Agc3ltYm9scyBzYWZlbHkuIEN1cnJlbnRseSwgdGhpcyBzaGltIHJlZnVzZXNcbiAqIHNlcnZpY2UgaWYgYW55IG9mIHRoZSBuYW1lcyBhcmUga2V5d29yZHMgb3Iga2V5d29yZC1saWtlLiBUaGlzIGlzXG4gKiBzYWZlIGFuZCBvbmx5IHByZXZlbnQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbG9iYWxPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGVMZXhpY2Fsc1xuICovXG5jb25zdCAgICAgICAgZ2V0U2NvcGVDb25zdGFudHM9ICAoZ2xvYmFsT2JqZWN0LCBtb2R1bGVMZXhpY2Fscz0gIHt9KT0+ICB7XG4gIC8vIGdldE93blByb3BlcnR5TmFtZXMoKSBkb2VzIGlnbm9yZSBTeW1ib2xzIHNvIHdlIGRvbid0IG5lZWQgdG9cbiAgLy8gZmlsdGVyIHRoZW0gb3V0LlxuICBjb25zdCBnbG9iYWxPYmplY3ROYW1lcz0gIGdldE93blByb3BlcnR5TmFtZXMoZ2xvYmFsT2JqZWN0KTtcbiAgY29uc3QgbW9kdWxlTGV4aWNhbE5hbWVzPSAgZ2V0T3duUHJvcGVydHlOYW1lcyhtb2R1bGVMZXhpY2Fscyk7XG5cbiAgLy8gQ29sbGVjdCBhbGwgdmFsaWQgJiBpbW11dGFibGUgaWRlbnRpZmllcnMgZnJvbSB0aGUgZW5kb3dtZW50cy5cbiAgY29uc3QgbW9kdWxlTGV4aWNhbENvbnN0YW50cz0gIGFycmF5RmlsdGVyKFxuICAgIG1vZHVsZUxleGljYWxOYW1lcyxcbiAgICAobmFtZSk9PlxuICAgICAgaXNWYWxpZElkZW50aWZpZXJOYW1lKG5hbWUpJiZcbiAgICAgIGlzSW1tdXRhYmxlRGF0YVByb3BlcnR5KG1vZHVsZUxleGljYWxzLCBuYW1lKSk7XG5cblxuICAvLyBDb2xsZWN0IGFsbCB2YWxpZCAmIGltbXV0YWJsZSBpZGVudGlmaWVycyBmcm9tIHRoZSBnbG9iYWwgdGhhdFxuICAvLyBhcmUgYWxzbyBub3QgcHJlc2VudCBpbiB0aGUgZW5kb3dtZW50cyAoaW1tdXRhYmxlIG9yIG5vdCkuXG4gIGNvbnN0IGdsb2JhbE9iamVjdENvbnN0YW50cz0gIGFycmF5RmlsdGVyKFxuICAgIGdsb2JhbE9iamVjdE5hbWVzLFxuICAgIChuYW1lKT0+XG4gICAgICAvLyBDYW4ndCBkZWZpbmUgYSBjb25zdGFudDogaXQgd291bGQgcHJldmVudCBhXG4gICAgICAvLyBsb29rdXAgb24gdGhlIGVuZG93bWVudHMuXG4gICAgICAhYXJyYXlJbmNsdWRlcyhtb2R1bGVMZXhpY2FsTmFtZXMsIG5hbWUpJiZcbiAgICAgIGlzVmFsaWRJZGVudGlmaWVyTmFtZShuYW1lKSYmXG4gICAgICBpc0ltbXV0YWJsZURhdGFQcm9wZXJ0eShnbG9iYWxPYmplY3QsIG5hbWUpKTtcblxuXG4gIHJldHVybiB7XG4gICAgZ2xvYmFsT2JqZWN0Q29uc3RhbnRzLFxuICAgIG1vZHVsZUxleGljYWxDb25zdGFudHN9O1xuXG4gfTskaOKAjV9vbmNlLmdldFNjb3BlQ29uc3RhbnRzKGdldFNjb3BlQ29uc3RhbnRzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbN10gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9GVU5DVElPTixhcnJheUpvaW4sYXBwbHksZ2V0U2NvcGVDb25zdGFudHM7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9GVU5DVElPTlwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRlVOQ1RJT04gPSAkaOKAjV9hKV1dLFtcImFycmF5Sm9pblwiLCBbJGjigI1fYSA9PiAoYXJyYXlKb2luID0gJGjigI1fYSldXSxbXCJhcHBseVwiLCBbJGjigI1fYSA9PiAoYXBwbHkgPSAkaOKAjV9hKV1dXV0sW1wiLi9zY29wZS1jb25zdGFudHMuanNcIiwgW1tcImdldFNjb3BlQ29uc3RhbnRzXCIsIFskaOKAjV9hID0+IChnZXRTY29wZUNvbnN0YW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIGJ1aWxkT3B0aW1pemVyKClcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGlkZW50aWZpZXJzLCB0aGUgb3B0aW1pemVyIHJldHVybnMgYSBgY29uc3RgIGRlY2xhcmF0aW9uXG4gKiBkZXN0cnVjdHVyaW5nIGB0aGlzLiR7bmFtZX1gLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29uc3RhbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiBidWlsZE9wdGltaXplcihjb25zdGFudHMsIG5hbWUpIHtcbiAgLy8gTm8gbmVlZCB0byBidWlsZCBhbiBvcHRpbWl6ZXIgd2hlbiB0aGVyZSBhcmUgbm8gY29uc3RhbnRzLlxuICBpZiggY29uc3RhbnRzLmxlbmd0aD09PSAgMCkgcmV0dXJuICcnO1xuICAvLyBVc2UgJ3RoaXMnIHRvIGF2b2lkIGdvaW5nIHRocm91Z2ggdGhlIHNjb3BlIHByb3h5LCB3aGljaCBpcyB1bm5lY2Vzc2FyeVxuICAvLyBzaW5jZSB0aGUgb3B0aW1pemVyIG9ubHkgbmVlZHMgcmVmZXJlbmNlcyB0byB0aGUgc2FmZSBnbG9iYWwuXG4gIC8vIERlc3RydWN0dXJlIHRoZSBjb25zdGFudHMgZnJvbSB0aGUgdGFyZ2V0IHNjb3BlIG9iamVjdC5cbiAgcmV0dXJuICBgY29uc3QgeyR7YXJyYXlKb2luKGNvbnN0YW50cywnLCcpIH19ID0gdGhpcy4ke25hbWV9O2A7XG4gfVxuXG4vKipcbiAqIG1ha2VFdmFsdWF0ZSgpXG4gKiBDcmVhdGUgYW4gJ2V2YWx1YXRlJyBmdW5jdGlvbiB3aXRoIHRoZSBjb3JyZWN0IG9wdGltaXplciBpbnNlcnRlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQuZXZhbFNjb3BlXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dC5tb2R1bGVMZXhpY2Fsc1xuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQuZ2xvYmFsT2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dC5zY29wZVRlcm1pbmF0b3JcbiAqL1xuY29uc3QgICAgICAgIG1ha2VFdmFsdWF0ZT0gIChjb250ZXh0KT0+e1xuICBjb25zdCB7IGdsb2JhbE9iamVjdENvbnN0YW50cywgbW9kdWxlTGV4aWNhbENvbnN0YW50c309ICAgZ2V0U2NvcGVDb25zdGFudHMoXG4gICAgY29udGV4dC5nbG9iYWxPYmplY3QsXG4gICAgY29udGV4dC5tb2R1bGVMZXhpY2Fscyk7XG5cbiAgY29uc3QgZ2xvYmFsT2JqZWN0T3B0aW1pemVyPSAgYnVpbGRPcHRpbWl6ZXIoXG4gICAgZ2xvYmFsT2JqZWN0Q29uc3RhbnRzLFxuICAgICdnbG9iYWxPYmplY3QnKTtcblxuICBjb25zdCBtb2R1bGVMZXhpY2FsT3B0aW1pemVyPSAgYnVpbGRPcHRpbWl6ZXIoXG4gICAgbW9kdWxlTGV4aWNhbENvbnN0YW50cyxcbiAgICAnbW9kdWxlTGV4aWNhbHMnKTtcblxuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGluIHNsb3BweSBtb2RlLCBzbyB0aGF0IHdlIGNhbiB1c2UgJ3dpdGgnLiBJdCByZXR1cm5zXG4gIC8vIGEgZnVuY3Rpb24gaW4gc3RyaWN0IG1vZGUgdGhhdCBldmFsdWF0ZXMgdGhlIHByb3ZpZGVkIGNvZGUgdXNpbmcgZGlyZWN0XG4gIC8vIGV2YWwsIGFuZCB0aHVzIGluIHN0cmljdCBtb2RlIGluIHRoZSBzYW1lIHNjb3BlLiBXZSBtdXN0IGJlIHZlcnkgY2FyZWZ1bFxuICAvLyB0byBub3QgY3JlYXRlIG5ldyBuYW1lcyBpbiB0aGlzIHNjb3BlXG5cbiAgLy8gMTogd2UgdXNlIG11bHRpcGxlIG5lc3RlZCAnd2l0aCcgdG8gY2F0Y2ggYWxsIGZyZWUgdmFyaWFibGUgbmFtZXMuIFRoZVxuICAvLyBgdGhpc2AgdmFsdWUgb2YgdGhlIG91dGVyIHNsb3BweSBmdW5jdGlvbiBob2xkcyB0aGUgZGlmZmVyZW50IHNjb3BlXG4gIC8vIGxheWVycywgZnJvbSBpbm5lciB0byBvdXRlcjpcbiAgLy8gICAgYSkgYGV2YWxTY29wZWAgd2hpY2ggbXVzdCByZWxlYXNlIHRoZSBgRkVSQUxfRVZBTGAgYXMgJ2V2YWwnIG9uY2UgZm9yXG4gIC8vICAgICAgIGV2ZXJ5IGludm9jYXRpb24gb2YgdGhlIGlubmVyIGBldmFsdWF0ZWAgZnVuY3Rpb24gaW4gb3JkZXIgdG9cbiAgLy8gICAgICAgdHJpZ2dlciBkaXJlY3QgZXZhbC4gVGhlIGRpcmVjdCBldmFsIHNlbWFudGljcyBpcyB3aGF0IGFsbG93cyB0aGVcbiAgLy8gICAgICAgZXZhbHVhdGVkIGNvZGUgdG8gbG9va3VwIGZyZWUgdmFyaWFibGUgbmFtZXMgb24gdGhlIG90aGVyIHNjb3BlXG4gIC8vICAgICAgIG9iamVjdHMgYW5kIG5vdCBpbiBnbG9iYWwgc2NvcGUuXG4gIC8vICAgIGIpIGBtb2R1bGVMZXhpY2Fsc2Agd2hpY2ggcHJvdmlkZSBhIHdheSB0byBpbnRyb2R1Y2UgZnJlZSB2YXJpYWJsZXNcbiAgLy8gICAgICAgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUgZ2xvYmFsT2JqZWN0LlxuICAvLyAgICBjKSBgZ2xvYmFsT2JqZWN0YCBpcyB0aGUgZ2xvYmFsIHNjb3BlIG9iamVjdCBvZiB0aGUgZXZhbHVhdG9yLCBha2EgdGhlXG4gIC8vICAgICAgIENvbXBhcnRtZW50J3MgYGdsb2JhbFRoaXNgLlxuICAvLyAgICBkKSBgc2NvcGVUZXJtaW5hdG9yYCBpcyBhIHByb3h5IG9iamVjdCB3aGljaCBwcmV2ZW50cyBmcmVlIHZhcmlhYmxlXG4gIC8vICAgICAgIGxvb2t1cHMgdG8gZXNjYXBlIHRvIHRoZSBzdGFydCBjb21wYXJ0bWVudCdzIGdsb2JhbCBvYmplY3QuXG4gIC8vIDI6IGBvcHRpbWl6ZXJgcyBjYXRjaCBjb25zdGFudCB2YXJpYWJsZSBuYW1lcyBmb3Igc3BlZWQuXG4gIC8vIDM6IFRoZSBpbm5lciBzdHJpY3QgYGV2YWx1YXRlYCBmdW5jdGlvbiBzaG91bGQgYmUgcGFzc2VkIHR3byBwYXJhbWV0ZXJzOlxuICAvLyAgICBhKSBpdHMgYXJndW1lbnRzWzBdIGlzIHRoZSBzb3VyY2UgdG8gYmUgZGlyZWN0bHkgZXZhbHVhdGVkLlxuICAvLyAgICBiKSBpdHMgJ3RoaXMnIGlzIHRoZSB0aGlzIGJpbmRpbmcgc2VlbiBieSB0aGUgY29kZSBiZWluZ1xuICAvLyAgICAgICBkaXJlY3RseSBldmFsdWF0ZWQgKHRoZSBnbG9iYWxPYmplY3QpLlxuXG4gIC8vIE5vdGVzOlxuICAvLyAtIFRoZSBgb3B0aW1pemVyYCBzdHJpbmdzIG9ubHkgbG9va3VwIHZhbHVlcyBvbiB0aGUgYGdsb2JhbE9iamVjdGAgYW5kXG4gIC8vICAgYG1vZHVsZUxleGljYWxzYCBvYmplY3RzIGJ5IGNvbnN0cnVjdC4gS2V5d29yZHMgbGlrZSAnZnVuY3Rpb24nIGFyZVxuICAvLyAgIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIHZhcmlhYmxlLCBzbyB0aGV5IGFyZSBleGNsdWRlZCBmcm9tIHRoZVxuICAvLyAgIG9wdGltaXplci4gRnVydGhlcm1vcmUgdG8gcHJldmVudCBzaGFkb3dpbmcgJ2V2YWwnLCB3aGlsZSBhIHZhbGlkXG4gIC8vICAgaWRlbnRpZmllciwgdGhhdCBuYW1lIGlzIGFsc28gZXhwbGljaXRseSBleGNsdWRlZC5cbiAgLy8gLSB3aGVuICdldmFsJyBpcyBsb29rZWQgdXAgaW4gdGhlIGBldmFsU2NvcGVgLCB0aGUgcG93ZXJmdWwgdW5zYWZlIGV2YWxcbiAgLy8gICBpbnRyaW5zaWMgaXMgcmV0dXJuZWQgYWZ0ZXIgYXV0b21hdGljYWxseSByZW1vdmluZyBpdCBmcm9tIHRoZVxuICAvLyAgIGBldmFsU2NvcGVgLiBBbnkgZnVydGhlciByZWZlcmVuY2UgdG8gJ2V2YWwnIGluIHRoZSBldmFsdWF0ZSBzdHJpbmcgd2lsbFxuICAvLyAgIGdldCB0aGUgdGFtZWQgZXZhbHVhdG9yIGZyb20gdGhlIGBnbG9iYWxPYmplY3RgLCBpZiBhbnkuXG5cbiAgLy8gVE9ETyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzgxNlxuICAvLyBUaGUgb3B0aW1pemVyIGN1cnJlbnRseSBydW5zIHVuZGVyIHNsb3BweSBtb2RlLCBhbmQgYWx0aG91Z2ggd2UgZG91YnQgdGhhdFxuICAvLyB0aGVyZSBpcyBhbnkgdnVsbmVyYWJpbGl0eSBpbnRyb2R1Y2VkIGp1c3QgYnkgcnVubmluZyB0aGUgb3B0aW1pemVyXG4gIC8vIHNsb3BweSwgd2UgYXJlIG11Y2ggbW9yZSBjb25maWRlbnQgaW4gdGhlIHNlbWFudGljcyBvZiBzdHJpY3QgbW9kZS5cbiAgLy8gVGhlIGBldmFsdWF0ZWAgZnVuY3Rpb24gY2FuIGJlIGFuZCBpcyByZXVzZWQgYWNyb3NzIG11bHRpcGxlIGV2YWx1YXRpb25zLlxuICAvLyBTaW5jZSB0aGUgb3B0aW1pemVyIHNob3VsZCBub3QgYmUgcmUtZXZhbHVhdGVkIGV2ZXJ5IHRpbWUsIGl0IGNhbm5vdCBiZVxuICAvLyBpbnNpZGUgdGhlIGBldmFsdWF0ZWAgY2xvc3VyZS4gV2hpbGUgd2UgY291bGQgcG90ZW50aWFsbHkgbmVzdCBhblxuICAvLyBpbnRlcm1lZGlhdGUgbGF5ZXIgb2YgYCgpID0+IHsndXNlIHN0cmljdCc7ICR7b3B0aW1pemVyc307IC4uLmAsIGl0XG4gIC8vIGRvZXNuJ3Qgc2VlbSB3b3J0aCB0aGUgb3ZlcmhlYWQgYW5kIGNvbXBsZXhpdHkuXG4gIGNvbnN0IGV2YWx1YXRlRmFjdG9yeT0gIEZFUkFMX0ZVTkNUSU9OKCBgXG4gICAgd2l0aCAodGhpcy5zY29wZVRlcm1pbmF0b3IpIHtcbiAgICAgIHdpdGggKHRoaXMuZ2xvYmFsT2JqZWN0KSB7XG4gICAgICAgIHdpdGggKHRoaXMubW9kdWxlTGV4aWNhbHMpIHtcbiAgICAgICAgICB3aXRoICh0aGlzLmV2YWxTY29wZSkge1xuICAgICAgICAgICAgJHtnbG9iYWxPYmplY3RPcHRpbWl6ZXIgfVxuICAgICAgICAgICAgJHttb2R1bGVMZXhpY2FsT3B0aW1pemVyIH1cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgICByZXR1cm4gZXZhbChhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIGApO1xuXG4gIHJldHVybiBhcHBseShldmFsdWF0ZUZhY3RvcnksIGNvbnRleHQsIFtdKTtcbiB9OyRo4oCNX29uY2UubWFrZUV2YWx1YXRlKG1ha2VFdmFsdWF0ZSk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzhdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUHJveHksU3RyaW5nLFR5cGVFcnJvcixSZWZlcmVuY2VFcnJvcixjcmVhdGUsZnJlZXplLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsZ2xvYmFsVGhpcyxpbW11dGFibGVPYmplY3QsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiUHJveHlcIiwgWyRo4oCNX2EgPT4gKFByb3h5ID0gJGjigI1fYSldXSxbXCJTdHJpbmdcIiwgWyRo4oCNX2EgPT4gKFN0cmluZyA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIlJlZmVyZW5jZUVycm9yXCIsIFskaOKAjV9hID0+IChSZWZlcmVuY2VFcnJvciA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gJGjigI1fYSldXSxbXCJnbG9iYWxUaGlzXCIsIFskaOKAjV9hID0+IChnbG9iYWxUaGlzID0gJGjigI1fYSldXSxbXCJpbW11dGFibGVPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGltbXV0YWJsZU9iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuLyoqXG4gKiBhbHdheXNUaHJvd0hhbmRsZXJcbiAqIFRoaXMgaXMgYW4gb2JqZWN0IHRoYXQgdGhyb3dzIGlmIGFueSBwcm9wZXJ0eSBpcyBjYWxsZWQuIEl0J3MgdXNlZCBhc1xuICogYSBwcm94eSBoYW5kbGVyIHdoaWNoIHRocm93cyBvbiBhbnkgdHJhcCBjYWxsZWQuXG4gKiBJdCdzIG1hZGUgZnJvbSBhIHByb3h5IHdpdGggYSBnZXQgdHJhcCB0aGF0IHRocm93cy4gSXQncyBzYWZlIHRvXG4gKiBjcmVhdGUgb25lIGFuZCBzaGFyZSBpdCBiZXR3ZWVuIGFsbCBQcm94eSBoYW5kbGVycy5cbiAqL1xuY29uc3QgICAgICAgIGFsd2F5c1Rocm93SGFuZGxlcj0gIG5ldyBQcm94eShcbiAgaW1tdXRhYmxlT2JqZWN0LFxuICBmcmVlemUoe1xuICAgIGdldChfc2hhZG93LCBwcm9wKSB7XG4gICAgICBGYWlsIGBQbGVhc2UgcmVwb3J0IHVuZXhwZWN0ZWQgc2NvcGUgaGFuZGxlciB0cmFwOiAke3EoU3RyaW5nKHByb3ApKX1gO1xuICAgICB9fSkpO1xuXG5cblxuLypcbiAqIHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllc1xuICogc2NvcGVUZXJtaW5hdG9ySGFuZGxlciBtYW5hZ2VzIGEgc3RyaWN0U2NvcGVUZXJtaW5hdG9yIFByb3h5IHdoaWNoIHNlcnZlcyBhc1xuICogdGhlIGZpbmFsIHNjb3BlIGJvdW5kYXJ5IHRoYXQgd2lsbCBhbHdheXMgcmV0dXJuIFwidW5kZWZpbmVkXCIgaW4gb3JkZXJcbiAqIHRvIHByZXZlbnQgYWNjZXNzIHRvIFwic3RhcnQgY29tcGFydG1lbnQgZ2xvYmFsc1wiLlxuICovJGjigI1fb25jZS5hbHdheXNUaHJvd0hhbmRsZXIoYWx3YXlzVGhyb3dIYW5kbGVyKTtcbmNvbnN0IHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllcz0gIHtcbiAgZ2V0KF9zaGFkb3csIF9wcm9wKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgIH0sXG5cbiAgc2V0KF9zaGFkb3csIHByb3AsIF92YWx1ZSkge1xuICAgIC8vIFdlIHNob3VsZCBvbmx5IGhpdCB0aGlzIGlmIHRoZSBoYXMoKSBob29rIHJldHVybmVkIHRydWUgbWF0Y2hlcyB0aGUgdjhcbiAgICAvLyBSZWZlcmVuY2VFcnJvciBtZXNzYWdlIFwiVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IHh5eiBpcyBub3QgZGVmaW5lZFwiXG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCBgJHtTdHJpbmcocHJvcCl9IGlzIG5vdCBkZWZpbmVkYCk7XG4gICB9LFxuXG4gIGhhcyhfc2hhZG93LCBwcm9wKSB7XG4gICAgLy8gd2UgbXVzdCBhdCBsZWFzdCByZXR1cm4gdHJ1ZSBmb3IgYWxsIHByb3BlcnRpZXMgb24gdGhlIHJlYWxtIGdsb2JhbFRoaXNcbiAgICByZXR1cm4gcHJvcCBpbiBnbG9iYWxUaGlzO1xuICAgfSxcblxuICAvLyBub3RlOiB0aGlzIGlzIGxpa2VseSBhIGJ1ZyBvZiBzYWZhcmlcbiAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTUzNFxuICBnZXRQcm90b3R5cGVPZigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgIH0sXG5cbiAgLy8gQ2hpcCBoYXMgc2VlbiB0aGlzIGhhcHBlbiBzaW5nbGUgc3RlcHBpbmcgdW5kZXIgdGhlIENocm9tZS92OCBkZWJ1Z2dlci5cbiAgLy8gVE9ETyByZWNvcmQgaG93IHRvIHJlbGlhYmx5IHJlcHJvZHVjZSwgYW5kIHRvIHRlc3QgaWYgdGhpcyBmaXggaGVscHMuXG4gIC8vIFRPRE8gcmVwb3J0IGFzIGJ1ZyB0byB2OCBvciBDaHJvbWUsIGFuZCByZWNvcmQgaXNzdWUgbGluayBoZXJlLlxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3RhcmdldCwgcHJvcCkge1xuICAgIC8vIENvZXJjZSB3aXRoIGBTdHJpbmdgIGluIGNhc2UgcHJvcCBpcyBhIHN5bWJvbC5cbiAgICBjb25zdCBxdW90ZWRQcm9wPSAgcShTdHJpbmcocHJvcCkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgIGBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgdHJhcCBvbiBzY29wZVRlcm1pbmF0b3JIYW5kbGVyIGZvciAke3F1b3RlZFByb3B9YCxcbiAgICAgIG5ldyBUeXBlRXJyb3IoKS5zdGFjayk7XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgfX07XG5cblxuLy8gVGhlIHNjb3BlIGhhbmRsZXIncyBwcm90b3R5cGUgaXMgYSBwcm94eSB0aGF0IHRocm93cyBpZiBhbnkgdHJhcCBvdGhlclxuLy8gdGhhbiBnZXQvc2V0L2hhcyBhcmUgcnVuIChsaWtlIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGFwcGx5LFxuLy8gZ2V0UHJvdG90eXBlT2YpLlxuY29uc3QgICAgICAgIHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXI9ICBmcmVlemUoXG4gIGNyZWF0ZShcbiAgICBhbHdheXNUaHJvd0hhbmRsZXIsXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzY29wZVByb3h5SGFuZGxlclByb3BlcnRpZXMpKSk7JGjigI1fb25jZS5zdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyKHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIpO1xuXG5cblxuY29uc3QgICAgICAgIHN0cmljdFNjb3BlVGVybWluYXRvcj0gIG5ldyBQcm94eShcbiAgaW1tdXRhYmxlT2JqZWN0LFxuICBzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyKTskaOKAjV9vbmNlLnN0cmljdFNjb3BlVGVybWluYXRvcihzdHJpY3RTY29wZVRlcm1pbmF0b3IpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s5XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFByb3h5LGNyZWF0ZSxmcmVlemUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxpbW11dGFibGVPYmplY3QscmVmbGVjdFNldCxzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyLGFsd2F5c1Rocm93SGFuZGxlcjskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIlByb3h5XCIsIFskaOKAjV9hID0+IChQcm94eSA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gJGjigI1fYSldXSxbXCJpbW11dGFibGVPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGltbXV0YWJsZU9iamVjdCA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdFNldFwiLCBbJGjigI1fYSA9PiAocmVmbGVjdFNldCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0cmljdC1zY29wZS10ZXJtaW5hdG9yLmpzXCIsIFtbXCJzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyXCIsIFskaOKAjV9hID0+IChzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyID0gJGjigI1fYSldXSxbXCJhbHdheXNUaHJvd0hhbmRsZXJcIiwgWyRo4oCNX2EgPT4gKGFsd2F5c1Rocm93SGFuZGxlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcbiAqIGNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3IoKVxuICogc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlciBtYW5hZ2VzIGEgc2NvcGVUZXJtaW5hdG9yIFByb3h5IHdoaWNoIHNlcnZlcyBhc1xuICogdGhlIGZpbmFsIHNjb3BlIGJvdW5kYXJ5IHRoYXQgd2lsbCBhbHdheXMgcmV0dXJuIFwidW5kZWZpbmVkXCIgaW4gb3JkZXJcbiAqIHRvIHByZXZlbnQgYWNjZXNzIHRvIFwic3RhcnQgY29tcGFydG1lbnQgZ2xvYmFsc1wiLiBXaGVuIFwic2xvcHB5R2xvYmFsc01vZGVcIlxuICogaXMgdHJ1ZSwgdGhlIFByb3h5IHdpbGwgcGVyZm9ybSBzZXRzIG9uIHRoZSBcImdsb2JhbE9iamVjdFwiLlxuICovXG5jb25zdCAgICAgICAgY3JlYXRlU2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcj0gIChnbG9iYWxPYmplY3QpPT57XG4gIGNvbnN0IHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllcz0gIHtcbiAgICAvLyBpbmhlcml0IHNjb3BlVGVybWluYXRvciBiZWhhdmlvclxuICAgIC4uLnN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIsXG5cbiAgICAvLyBSZWRpcmVjdCBzZXQgcHJvcGVydGllcyB0byB0aGUgZ2xvYmFsT2JqZWN0LlxuICAgIHNldChfc2hhZG93LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHJlZmxlY3RTZXQoZ2xvYmFsT2JqZWN0LCBwcm9wLCB2YWx1ZSk7XG4gICAgIH0sXG5cbiAgICAvLyBBbHdheXMgY2xhaW0gdG8gaGF2ZSBhIHBvdGVudGlhbCBwcm9wZXJ0eSBpbiBvcmRlciB0byBiZSB0aGUgcmVjaXBpZW50IG9mIGEgc2V0XG4gICAgaGFzKF9zaGFkb3csIF9wcm9wKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgfX07XG5cblxuICAvLyBUaGUgc2NvcGUgaGFuZGxlcidzIHByb3RvdHlwZSBpcyBhIHByb3h5IHRoYXQgdGhyb3dzIGlmIGFueSB0cmFwIG90aGVyXG4gIC8vIHRoYW4gZ2V0L3NldC9oYXMgYXJlIHJ1biAobGlrZSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBhcHBseSxcbiAgLy8gZ2V0UHJvdG90eXBlT2YpLlxuICBjb25zdCBzbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9ySGFuZGxlcj0gIGZyZWV6ZShcbiAgICBjcmVhdGUoXG4gICAgICBhbHdheXNUaHJvd0hhbmRsZXIsXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllcykpKTtcblxuXG5cbiAgY29uc3Qgc2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcj0gIG5ldyBQcm94eShcbiAgICBpbW11dGFibGVPYmplY3QsXG4gICAgc2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvckhhbmRsZXIpO1xuXG5cbiAgcmV0dXJuIHNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3I7XG4gfTskaOKAjV9vbmNlLmNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3IoY3JlYXRlU2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzEwXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZFUkFMX1JFR19FWFAscmVnZXhwRXhlYyxzdHJpbmdTbGljZTskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIkZFUkFMX1JFR19FWFBcIiwgWyRo4oCNX2EgPT4gKEZFUkFMX1JFR19FWFAgPSAkaOKAjV9hKV1dLFtcInJlZ2V4cEV4ZWNcIiwgWyRo4oCNX2EgPT4gKHJlZ2V4cEV4ZWMgPSAkaOKAjV9hKV1dLFtcInN0cmluZ1NsaWNlXCIsIFskaOKAjV9hID0+IChzdHJpbmdTbGljZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vLyBDYXB0dXJlcyBhIGtleSBhbmQgdmFsdWUgb2YgdGhlIGZvcm0gI2tleT12YWx1ZSBvciBAa2V5PXZhbHVlXG5jb25zdCBzb3VyY2VNZXRhRW50cnlSZWdFeHA9XG4gICdcXFxccypbQCNdXFxcXHMqKFthLXpBLVpdW2EtekEtWjAtOV0qKVxcXFxzKj1cXFxccyooW15cXFxcc1xcXFwqXSopJztcbi8vIENhcHR1cmVzIGVpdGhlciBhIG9uZS1saW5lIG9yIG11bHRpLWxpbmUgY29tbWVudCBjb250YWluaW5nXG4vLyBvbmUgI2tleT12YWx1ZSBvciBAa2V5PXZhbHVlLlxuLy8gUHJvZHVjZXMgdHdvIHBhaXJzIG9mIGNhcHR1cmUgZ3JvdXBzLCBidXQgdGhlIGluaXRpYWwgdHdvIG1heSBiZSB1bmRlZmluZWQuXG4vLyBPbiBhY2NvdW50IG9mIHRoZSBtZWNoYW5pY3Mgb2YgcmVndWxhciBleHByZXNzaW9ucywgc2Nhbm5pbmcgZnJvbSB0aGUgZW5kXG4vLyBkb2VzIG5vdCBhbGxvdyB1cyB0byBjYXB0dXJlIGV2ZXJ5IHBhaXIsIHNvIGdldFNvdXJjZVVSTCBtdXN0IGNhcHR1cmUgYW5kXG4vLyB0cmltIHVudGlsIHRoZXJlIGFyZSBubyBtYXRjaGluZyBjb21tZW50cy5cbmNvbnN0IHNvdXJjZU1ldGFFbnRyaWVzUmVnRXhwPSAgbmV3IEZFUkFMX1JFR19FWFAoXG4gICBgKD86XFxcXHMqLy8ke3NvdXJjZU1ldGFFbnRyeVJlZ0V4cH18L1xcXFwqJHtzb3VyY2VNZXRhRW50cnlSZWdFeHB9XFxcXHMqXFxcXCovKVxcXFxzKiRgKTtcblxuXG5jb25zdCAgICAgICAgZ2V0U291cmNlVVJMPSAgKHNyYyk9PntcbiAgbGV0IHNvdXJjZVVSTD0gICc8dW5rbm93bj4nO1xuXG4gIC8vIE91ciByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgbGFzdCBvbmUgb3IgdHdvIGNvbW1lbnRzIHdpdGgga2V5IHZhbHVlXG4gIC8vIHBhaXJzIGF0IHRoZSBlbmQgb2YgdGhlIHNvdXJjZSwgYXZvaWRpbmcgYSBzY2FuIG92ZXIgdGhlIGVudGlyZSBsZW5ndGggb2ZcbiAgLy8gdGhlIHN0cmluZywgYnV0IGF0IHRoZSBleHBlbnNlIG9mIGJlaW5nIGFibGUgdG8gY2FwdHVyZSBhbGwgdGhlIChrZXksXG4gIC8vIHZhbHVlKSBwYWlyIG1ldGEgY29tbWVudHMgYXQgdGhlIGVuZCBvZiB0aGUgc291cmNlLCB3aGljaCBtYXkgaW5jbHVkZVxuICAvLyBzb3VyY2VNYXBVUkwgaW4gYWRkaXRpb24gdG8gc291cmNlVVJMLlxuICAvLyBTbywgd2Ugc3VibGltYXRlIHRoZSBjb21tZW50cyBvdXQgb2YgdGhlIHNvdXJjZSB1bnRpbCBubyBzb3VyY2Ugb3Igbm9cbiAgLy8gY29tbWVudHMgcmVtYWluLlxuICB3aGlsZSggc3JjLmxlbmd0aD4gIDApIHtcbiAgICBjb25zdCBtYXRjaD0gIHJlZ2V4cEV4ZWMoc291cmNlTWV0YUVudHJpZXNSZWdFeHAsIHNyYyk7XG4gICAgaWYoIG1hdGNoPT09ICBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICAgfVxuICAgIHNyYz0gIHN0cmluZ1NsaWNlKHNyYywgMCwgc3JjLmxlbmd0aC0gIG1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAvLyBXZSBza2lwICQwIHNpbmNlIGl0IGNvbnRhaW5zIHRoZSBlbnRpcmUgbWF0Y2guXG4gICAgLy8gVGhlIG1hdGNoIGNvbnRhaW5zIGZvdXIgY2FwdHVyZSBncm91cHMsXG4gICAgLy8gdHdvIChrZXksIHZhbHVlKSBwYWlycywgdGhlIGZpcnN0IG9mIHdoaWNoXG4gICAgLy8gbWF5IGJlIHVuZGVmaW5lZC5cbiAgICAvLyBPbiB0aGUgb2ZmLWNoYW5jZSBzb21lb25lIHB1dCB0d28gc291cmNlVVJMIGNvbW1lbnRzIGluIHRoZWlyIGNvZGUgd2l0aFxuICAgIC8vIGRpZmZlcmVudCBjb21tZW50aW5nIGNvbnZlbnRpb25zLCB0aGUgbGF0dGVyIGhhcyBwcmVjZWRlbmNlLlxuICAgIGlmKCBtYXRjaFszXT09PSAgJ3NvdXJjZVVSTCcpIHtcbiAgICAgIHNvdXJjZVVSTD0gIG1hdGNoWzRdO1xuICAgICB9ZWxzZSBpZiggbWF0Y2hbMV09PT0gICdzb3VyY2VVUkwnKSB7XG4gICAgICBzb3VyY2VVUkw9ICBtYXRjaFsyXTtcbiAgICAgfVxuICAgfVxuXG4gIHJldHVybiBzb3VyY2VVUkw7XG4gfTskaOKAjV9vbmNlLmdldFNvdXJjZVVSTChnZXRTb3VyY2VVUkwpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1sxMV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9SRUdfRVhQLFN5bnRheEVycm9yLHN0cmluZ1JlcGxhY2Usc3RyaW5nU2VhcmNoLHN0cmluZ1NsaWNlLHN0cmluZ1NwbGl0LGdldFNvdXJjZVVSTDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIkZFUkFMX1JFR19FWFBcIiwgWyRo4oCNX2EgPT4gKEZFUkFMX1JFR19FWFAgPSAkaOKAjV9hKV1dLFtcIlN5bnRheEVycm9yXCIsIFskaOKAjV9hID0+IChTeW50YXhFcnJvciA9ICRo4oCNX2EpXV0sW1wic3RyaW5nUmVwbGFjZVwiLCBbJGjigI1fYSA9PiAoc3RyaW5nUmVwbGFjZSA9ICRo4oCNX2EpXV0sW1wic3RyaW5nU2VhcmNoXCIsIFskaOKAjV9hID0+IChzdHJpbmdTZWFyY2ggPSAkaOKAjV9hKV1dLFtcInN0cmluZ1NsaWNlXCIsIFskaOKAjV9hID0+IChzdHJpbmdTbGljZSA9ICRo4oCNX2EpXV0sW1wic3RyaW5nU3BsaXRcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1NwbGl0ID0gJGjigI1fYSldXV1dLFtcIi4vZ2V0LXNvdXJjZS11cmwuanNcIiwgW1tcImdldFNvdXJjZVVSTFwiLCBbJGjigI1fYSA9PiAoZ2V0U291cmNlVVJMID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBGaW5kIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgdGhlIGdpdmVuIHBhdHRlcm4gYW5kIHJldHVyblxuICogdGhlIGxvY2F0aW9uIGFzIHRoZSBhcHByb3hpbWF0ZSBsaW5lIG51bWJlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcGF0dGVyblxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0TGluZU51bWJlcihzcmMsIHBhdHRlcm4pIHtcbiAgY29uc3QgaW5kZXg9ICBzdHJpbmdTZWFyY2goc3JjLCBwYXR0ZXJuKTtcbiAgaWYoIGluZGV4PCAgMCkge1xuICAgIHJldHVybiAtMTtcbiAgIH1cblxuICAvLyBUaGUgaW1wb3J0UGF0dGVybiBpbmNpZGVudGFsbHkgY2FwdHVyZXMgYW4gaW5pdGlhbCBcXG4gaW5cbiAgLy8gYW4gYXR0ZW1wdCB0byByZWplY3QgYSAuIHByZWZpeCwgc28gd2UgbmVlZCB0byBvZmZzZXRcbiAgLy8gdGhlIGxpbmUgbnVtYmVyIGluIHRoYXQgY2FzZS5cbiAgY29uc3QgYWRqdXN0bWVudD0gIHNyY1tpbmRleF09PT0gICdcXG4nPyAgMTogIDA7XG5cbiAgcmV0dXJuIHN0cmluZ1NwbGl0KHN0cmluZ1NsaWNlKHNyYywgMCwgaW5kZXgpLCAnXFxuJykubGVuZ3RoKyAgYWRqdXN0bWVudDtcbiB9XG5cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmNvbnN0IGh0bWxDb21tZW50UGF0dGVybj0gIG5ldyBGRVJBTF9SRUdfRVhQKCBgKD86JHsnPCd9IS0tfC0tJHsnPid9KWAsJ2cnKTtcblxuLyoqXG4gKiBDb25zZXJ2YXRpdmVseSByZWplY3QgdGhlIHNvdXJjZSB0ZXh0IGlmIGl0IG1heSBjb250YWluIHRleHQgdGhhdCBzb21lXG4gKiBKYXZhU2NyaXB0IHBhcnNlcnMgbWF5IHRyZWF0IGFzIGFuIGh0bWwtbGlrZSBjb21tZW50LiBUbyByZWplY3Qgd2l0aG91dFxuICogcGFyc2luZywgYHJlamVjdEh0bWxDb21tZW50c2Agd2lsbCBhbHNvIHJlamVjdCBzb21lIG90aGVyIHRleHQgYXMgd2VsbC5cbiAqXG4gKiBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzkuMC9pbmRleC5odG1sI3NlYy1odG1sLWxpa2UtY29tbWVudHNcbiAqIGV4cGxhaW5zIHRoYXQgSmF2YVNjcmlwdCBwYXJzZXJzIG1heSBvciBtYXkgbm90IHJlY29nbml6ZSBodG1sXG4gKiBjb21tZW50IHRva2VucyBcIjxcIiBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIiEtLVwiIGFuZCBcIi0tXCJcbiAqIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiPlwiIGluIG5vbi1tb2R1bGUgc291cmNlIHRleHQsIGFuZCB0cmVhdFxuICogdGhlbSBhcyBhIGtpbmQgb2YgbGluZSBjb21tZW50LiBTaW5jZSBvdGhlcndpc2UgYm90aCBvZiB0aGVzZSBjYW5cbiAqIGFwcGVhciBpbiBub3JtYWwgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSBhcyBhIHNlcXVlbmNlIG9mIG9wZXJhdG9ycyxcbiAqIHdlIGhhdmUgdGhlIHRlcnJpZnlpbmcgcG9zc2liaWxpdHkgb2YgdGhlIHNhbWUgc291cmNlIGNvZGUgcGFyc2luZ1xuICogb25lIHdheSBvbiBvbmUgY29ycmVjdCBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uLCBhbmQgYW5vdGhlciB3YXlcbiAqIG9uIGFub3RoZXIuXG4gKlxuICogVGhpcyBzaGltIHRha2VzIHRoZSBjb25zZXJ2YXRpdmUgc3RyYXRlZ3kgb2YganVzdCByZWplY3Rpbmcgc291cmNlXG4gKiB0ZXh0IHRoYXQgY29udGFpbnMgdGhlc2Ugc3RyaW5ncyBhbnl3aGVyZS4gTm90ZSB0aGF0IHRoaXMgdmVyeVxuICogc291cmNlIGZpbGUgaXMgd3JpdHRlbiBzdHJhbmdlbHkgdG8gYXZvaWQgbWVudGlvbmluZyB0aGVzZVxuICogY2hhcmFjdGVyIHN0cmluZ3MgZXhwbGljaXRseS5cbiAqXG4gKiBXZSBkbyBub3Qgd3JpdGUgdGhlIHJlZ2V4cCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXksIHNvIHRoYXQgYW5cbiAqIGFwcGFyZW5udCBodG1sIGNvbW1lbnQgZG9lcyBub3QgYXBwZWFyIGluIHRoaXMgZmlsZS4gVGh1cywgd2UgYXZvaWRcbiAqIHJlamVjdGlvbiBieSB0aGUgb3Zlcmx5IGVhZ2VyIHJlamVjdERhbmdlcm91c1NvdXJjZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHJlamVjdEh0bWxDb21tZW50cz0gIChzcmMpPT57XG4gIGNvbnN0IGxpbmVOdW1iZXI9ICBnZXRMaW5lTnVtYmVyKHNyYywgaHRtbENvbW1lbnRQYXR0ZXJuKTtcbiAgaWYoIGxpbmVOdW1iZXI8ICAwKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgIH1cbiAgY29uc3QgbmFtZT0gIGdldFNvdXJjZVVSTChzcmMpO1xuICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgIGBQb3NzaWJsZSBIVE1MIGNvbW1lbnQgcmVqZWN0ZWQgYXQgJHtuYW1lfToke2xpbmVOdW1iZXJ9LiAoU0VTX0hUTUxfQ09NTUVOVF9SRUpFQ1RFRClgKTtcblxuIH07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgdHJhbnNmb3JtIHRvIHBsYWNlIGFoZWFkIG9mIGByZWplY3RIdG1sQ29tbWVudHNgIHRvIGV2YWRlICp0aGF0KlxuICogcmVqZWN0aW9uLiBIb3dldmVyLCBpdCBtYXkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLlxuICpcbiAqIFRoaXMgZXZhc2lvbiByZXBsYWNlcyBlYWNoIGFsbGVnZWQgaHRtbCBjb21tZW50IHdpdGggdGhlIHNwYWNlLXNlcGFyYXRlZFxuICogSmF2YVNjcmlwdCBvcGVyYXRvciBzZXF1ZW5jZSB0aGF0IGl0IG1heSBtZWFuLCBhc3N1bWluZyB0aGF0IGl0IGFwcGVhcnNcbiAqIG91dHNpZGUgb2YgYSBjb21tZW50IG9yIGxpdGVyYWwgc3RyaW5nLCBpbiBzb3VyY2UgY29kZSB3aGVyZSB0aGUgSlNcbiAqIHBhcnNlciBtYWtlcyBubyBzcGVjaWFsIGNhc2UgZm9yIGh0bWwgY29tbWVudHMgKGxpa2UgbW9kdWxlIHNvdXJjZSBjb2RlKS5cbiAqIEluIHRoYXQgY2FzZSwgdGhpcyBldmFzaW9uIHByZXNlcnZlcyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSwgdGhvdWdoIGl0XG4gKiBkb2VzIGNoYW5nZSB0aGUgc291Y2UgY29sdW1uIG51bWJlcnMgb24gZWFjaCBlZmZlY3RlZCBsaW5lLlxuICpcbiAqIElmIHRoZSBodG1sIGNvbW1lbnQgYXBwZWFyZWQgaW4gYSBsaXRlcmFsIChhIHN0cmluZyBsaXRlcmFsLCByZWdleHAgbGl0ZXJhbCxcbiAqIG9yIGEgdGVtcGxhdGUgbGl0ZXJhbCksIHRoZW4gdGhpcyBldmFzaW9uIHdpbGwgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZVxuICogcHJvZ3JhbSBieSBjaGFuZ2luZyB0aGUgdGV4dCBvZiB0aGF0IGxpdGVyYWwuXG4gKlxuICogSWYgdGhlIGh0bWwgY29tbWVudCBhcHBlYXJlZCBpbiBhIEphdmFTY3JpcHQgY29tbWVudCwgdGhlbiB0aGlzIGV2YXNpb24gZG9lc1xuICogbm90IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSBiZWNhdXNlIGl0IG9ubHkgY2hhbmdlcyB0aGUgY29udGVudHMgb2ZcbiAqIHRob3NlIGNvbW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi8kaOKAjV9vbmNlLnJlamVjdEh0bWxDb21tZW50cyhyZWplY3RIdG1sQ29tbWVudHMpO1xuY29uc3QgICAgICAgIGV2YWRlSHRtbENvbW1lbnRUZXN0PSAgKHNyYyk9PntcbiAgY29uc3QgcmVwbGFjZUZuPSAgKG1hdGNoKT0+IG1hdGNoWzBdPT09ICAnPCc/ICAnPCAhIC0tJzogICctLSA+JztcbiAgcmV0dXJuIHN0cmluZ1JlcGxhY2Uoc3JjLCBodG1sQ29tbWVudFBhdHRlcm4sIHJlcGxhY2VGbik7XG4gfTtcblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiRo4oCNX29uY2UuZXZhZGVIdG1sQ29tbWVudFRlc3QoZXZhZGVIdG1sQ29tbWVudFRlc3QpO1xuY29uc3QgaW1wb3J0UGF0dGVybj0gIG5ldyBGRVJBTF9SRUdfRVhQKFxuICAnKF58W14uXSlcXFxcYmltcG9ydChcXFxccyooPzpcXFxcKHwvWy8qXSkpJyxcbiAgJ2cnKTtcblxuXG4vKipcbiAqIENvbnNlcnZhdGl2ZWx5IHJlamVjdCB0aGUgc291cmNlIHRleHQgaWYgaXQgbWF5IGNvbnRhaW4gYSBkeW5hbWljXG4gKiBpbXBvcnQgZXhwcmVzc2lvbi4gVG8gcmVqZWN0IHdpdGhvdXQgcGFyc2luZywgYHJlamVjdEltcG9ydEV4cHJlc3Npb25zYCB3aWxsXG4gKiBhbHNvIHJlamVjdCBzb21lIG90aGVyIHRleHQgYXMgd2VsbC5cbiAqXG4gKiBUaGUgcHJvcG9zZWQgZHluYW1pYyBpbXBvcnQgZXhwcmVzc2lvbiBpcyB0aGUgb25seSBzeW50YXggY3VycmVudGx5XG4gKiBwcm9wb3NlZCwgdGhhdCBjYW4gYXBwZWFyIGluIG5vbi1tb2R1bGUgSmF2YVNjcmlwdCBjb2RlLCB0aGF0XG4gKiBlbmFibGVzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG91dHNpZGUgd29ybGQgdGhhdCBjYW5ub3QgYmVcbiAqIHN1cHByZXNzZWQgb3IgaW50ZXJjZXB0ZWQgd2l0aG91dCBwYXJzaW5nIGFuZCByZXdyaXRpbmcuIEluc3RlYWQsXG4gKiB0aGlzIHNoaW0gY29uc2VydmF0aXZlbHkgcmVqZWN0cyBhbnkgc291cmNlIHRleHQgdGhhdCBzZWVtcyB0b1xuICogY29udGFpbiBzdWNoIGFuIGV4cHJlc3Npb24uIFRvIGRvIHRoaXMgc2FmZWx5IHdpdGhvdXQgcGFyc2luZywgd2VcbiAqIG11c3QgYWxzbyByZWplY3Qgc29tZSB2YWxpZCBwcm9ncmFtcywgaS5lLiwgdGhvc2UgY29udGFpbmluZ1xuICogYXBwYXJlbnQgaW1wb3J0IGV4cHJlc3Npb25zIGluIGxpdGVyYWwgc3RyaW5ncyBvciBjb21tZW50cy5cbiAqXG4gKiBUaGUgY3VycmVudCBjb25zZXJ2YXRpdmUgcnVsZSBsb29rcyBmb3IgdGhlIGlkZW50aWZpZXIgXCJpbXBvcnRcIlxuICogZm9sbG93ZWQgYnkgZWl0aGVyIGFuIG9wZW4gcGFyZW4gb3Igc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSB0aGVcbiAqIGJlZ2lubmluZyBvZiBhIGNvbW1lbnQuIFdlIGFzc3VtZSB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHdvcnJ5XG4gKiBhYm91dCBodG1sIGNvbW1lbnQgc3ludGF4IGJlY2F1c2UgdGhhdCB3YXMgYWxyZWFkeSByZWplY3RlZCBieVxuICogcmVqZWN0SHRtbENvbW1lbnRzLlxuICpcbiAqIHRoaXMgXFxzICptdXN0KiBtYXRjaCBhbGwga2luZHMgb2Ygc3ludGF4LWRlZmluZWQgd2hpdGVzcGFjZS4gSWYgZS5nLlxuICogVSsyMDI4IChMSU5FIFNFUEFSQVRPUikgb3IgVSsyMDI5IChQQVJBR1JBUEggU0VQQVJBVE9SKSBpcyB0cmVhdGVkIGFzXG4gKiB3aGl0ZXNwYWNlIGJ5IHRoZSBwYXJzZXIsIGJ1dCBub3QgbWF0Y2hlZCBieSAvXFxzLywgdGhlbiB0aGlzIHdvdWxkIGFkbWl0XG4gKiBhbiBhdHRhY2sgbGlrZTogaW1wb3J0XFx1MjAyOCgncG93ZXIuanMnKSAuIFdlJ3JlIHRyeWluZyB0byBkaXN0aW5ndWlzaFxuICogc29tZXRoaW5nIGxpa2UgdGhhdCBmcm9tIHNvbWV0aGluZyBsaWtlIGltcG9ydG5vdHJlYWxseSgncG93ZXIuanMnKSB3aGljaFxuICogaXMgcGVyZmVjdGx5IHNhZmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHJlamVjdEltcG9ydEV4cHJlc3Npb25zPSAgKHNyYyk9PntcbiAgY29uc3QgbGluZU51bWJlcj0gIGdldExpbmVOdW1iZXIoc3JjLCBpbXBvcnRQYXR0ZXJuKTtcbiAgaWYoIGxpbmVOdW1iZXI8ICAwKSB7XG4gICAgcmV0dXJuIHNyYztcbiAgIH1cbiAgY29uc3QgbmFtZT0gIGdldFNvdXJjZVVSTChzcmMpO1xuICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgIGBQb3NzaWJsZSBpbXBvcnQgZXhwcmVzc2lvbiByZWplY3RlZCBhdCAke25hbWV9OiR7bGluZU51bWJlcn0uIChTRVNfSU1QT1JUX1JFSkVDVEVEKWApO1xuXG4gfTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCB0cmFuc2Zvcm0gdG8gcGxhY2UgYWhlYWQgb2YgYHJlamVjdEltcG9ydEV4cHJlc3Npb25zYCB0byBldmFkZVxuICogKnRoYXQqIHJlamVjdGlvbi4gSG93ZXZlciwgaXQgbWF5IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS5cbiAqXG4gKiBUaGlzIGV2YXNpb24gcmVwbGFjZXMgZWFjaCBzdXNwaWNpb3VzIGBpbXBvcnRgIGlkZW50aWZpZXIgd2l0aCBgX19pbXBvcnRfX2AuXG4gKiBJZiB0aGUgYWxsZWdlZCBpbXBvcnQgZXhwcmVzc2lvbiBhcHBlYXJzIGluIGEgSmF2YVNjcmlwdCBjb21tZW50LCB0aGlzXG4gKiBldmFzaW9uIHdpbGwgbm90IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4gSWYgaXQgYXBwZWFycyBpbiBhXG4gKiBsaXRlcmFsIChzdHJpbmcgbGl0ZXJhbCwgcmVnZXhwIGxpdGVyYWwsIG9yIGEgdGVtcGxhdGUgbGl0ZXJhbCksIHRoZW4gdGhpc1xuICogZXZhc2lvbiB3aWxsIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhhdCBsaXRlcmFsLiBJZiBpdCBhcHBlYXJzIGFzIGNvZGVcbiAqIHdoZXJlIGl0IHdvdWxkIGJlIHBhcnNlZCBhcyBhbiBleHByZXNzaW9uLCB0aGVuIGl0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBjaGFuZ2VcbiAqIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLCBkZXBlbmRpbmcgb24gdGhlIGJpbmRpbmcsIGlmIGFueSwgb2YgdGhlIGxleGljYWxcbiAqIHZhcmlhYmxlIGBfX2ltcG9ydF9fYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjigI1fb25jZS5yZWplY3RJbXBvcnRFeHByZXNzaW9ucyhyZWplY3RJbXBvcnRFeHByZXNzaW9ucyk7XG5jb25zdCAgICAgICAgZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdD0gIChzcmMpPT57XG4gIGNvbnN0IHJlcGxhY2VGbj0gIChfLCBwMSwgcDIpPT4gICBgJHtwMX1fX2ltcG9ydF9fJHtwMn1gO1xuICByZXR1cm4gc3RyaW5nUmVwbGFjZShzcmMsIGltcG9ydFBhdHRlcm4sIHJlcGxhY2VGbik7XG4gfTtcblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiRo4oCNX29uY2UuZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdChldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0KTtcbmNvbnN0IHNvbWVEaXJlY3RFdmFsUGF0dGVybj0gIG5ldyBGRVJBTF9SRUdfRVhQKFxuICAnKF58W14uXSlcXFxcYmV2YWwoXFxcXHMqXFxcXCgpJyxcbiAgJ2cnKTtcblxuXG4vKipcbiAqIEhldXJpc3RpY2FsbHkgcmVqZWN0IHNvbWUgdGV4dCB0aGF0IHNlZW1zIHRvIGNvbnRhaW4gYSBkaXJlY3QgZXZhbFxuICogZXhwcmVzc2lvbiwgd2l0aCBib3RoIGZhbHNlIHBvc2l0aXZlcyBhbmQgZmFsc2UgbmVnYXZpdmVzLiBUbyByZWplY3Qgd2l0aG91dFxuICogcGFyc2luZywgYHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnNgIG1heSB3aWxsIGFsc28gcmVqZWN0IHNvbWUgb3RoZXJcbiAqIHRleHQgYXMgd2VsbC4gSXQgbWF5IGFsc28gYWNjZXB0IHNvdXJjZSB0ZXh0IHRoYXQgY29udGFpbnMgYSBkaXJlY3QgZXZhbFxuICogd3JpdHRlbiBvZGRseSwgc3VjaCBhcyBgKGV2YWwpKHNyYylgLiBUaGlzIGZhbHNlIG5lZ2F0aXZlIGlzIG5vdCBhIHNlY3VyaXR5XG4gKiB2dWxuZXJhYmlsaXR5LiBSYXRoZXIgaXQgaXMgYSBjb21wYXQgaGF6YXJkIGJlY2F1c2UgaXQgd2lsbCBleGVjdXRlIGFzXG4gKiBhbiBpbmRpcmVjdCBldmFsIHVuZGVyIHRoZSBTRVMtc2hpbSBidXQgYXMgYSBkaXJlY3QgZXZhbCBvbiBwbGF0Zm9ybXMgdGhhdFxuICogc3VwcG9ydCBTRVMgZGlyZWN0bHkgKGxpa2UgWFMpLlxuICpcbiAqIFRoZSBzaGltIGNhbm5vdCBjb3JyZWN0bHkgZW11bGF0ZSBhIGRpcmVjdCBldmFsIGFzIGV4cGxhaW5lZCBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9yZWFsbXMtc2hpbS9pc3N1ZXMvMTJcbiAqIElmIHdlIGRpZCBub3QgcmVqZWN0IGRpcmVjdCBldmFsIHN5bnRheCwgd2Ugd291bGRcbiAqIGFjY2lkZW50YWxseSBldmFsdWF0ZSB0aGVzZSB3aXRoIGFuIGVtdWxhdGlvbiBvZiBpbmRpcmVjdCBldmFsLiBUb1xuICogcHJldmVudCBmdXR1cmUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcywgaW4gc2hpZnRpbmcgZnJvbSB1c2Ugb2YgdGhlXG4gKiBzaGltIHRvIGdlbnVpbmUgcGxhdGZvcm0gc3VwcG9ydCBmb3IgdGhlIHByb3Bvc2FsLCB3ZSBzaG91bGRcbiAqIGluc3RlYWQgc3RhdGljYWxseSByZWplY3QgY29kZSB0aGF0IHNlZW1zIHRvIGNvbnRhaW4gYSBkaXJlY3QgZXZhbFxuICogZXhwcmVzc2lvbi5cbiAqXG4gKiBBcyB3aXRoIHRoZSBkeW5hbWljIGltcG9ydCBleHByZXNzaW9uLCB0byBhdm9pZCBhIGZ1bGwgcGFyc2UsIHdlIGRvXG4gKiB0aGlzIGFwcHJveGltYXRlbHkgd2l0aCBhIHJlZ2V4cCwgdGhhdCB3aWxsIGFsc28gcmVqZWN0IHN0cmluZ3NcbiAqIHRoYXQgYXBwZWFyIHNhZmVseSBpbiBjb21tZW50cyBvciBzdHJpbmdzLiBVbmxpa2UgZHluYW1pYyBpbXBvcnQsXG4gKiBpZiB3ZSBtaXNzIHNvbWUsIHRoaXMgb25seSBjcmVhdGVzIGZ1dHVyZSBjb21wYXQgcHJvYmxlbXMsIG5vdFxuICogc2VjdXJpdHkgcHJvYmxlbXMuIFRodXMsIHdlIGFyZSBvbmx5IHRyeWluZyB0byBjYXRjaCBpbm5vY2VudFxuICogb2NjdXJyZW5jZXMsIG5vdCBtYWxpY2lvdXMgb25lLiBJbiBwYXJ0aWN1bGFyLCBgKGV2YWwpKC4uLilgIGlzXG4gKiBkaXJlY3QgZXZhbCBzeW50YXggdGhhdCB3b3VsZCBub3QgYmUgY2F1Z2h0IGJ5IHRoZSBmb2xsb3dpbmcgcmVnZXhwLlxuICpcbiAqIEV4cG9ydGVkIGZvciB1bml0IHRlc3RzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICByZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zPSAgKHNyYyk9PntcbiAgY29uc3QgbGluZU51bWJlcj0gIGdldExpbmVOdW1iZXIoc3JjLCBzb21lRGlyZWN0RXZhbFBhdHRlcm4pO1xuICBpZiggbGluZU51bWJlcjwgIDApIHtcbiAgICByZXR1cm4gc3JjO1xuICAgfVxuICBjb25zdCBuYW1lPSAgZ2V0U291cmNlVVJMKHNyYyk7XG4gIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgYFBvc3NpYmxlIGRpcmVjdCBldmFsIGV4cHJlc3Npb24gcmVqZWN0ZWQgYXQgJHtuYW1lfToke2xpbmVOdW1iZXJ9LiAoU0VTX0VWQUxfUkVKRUNURUQpYCk7XG5cbiB9O1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEEgdHJhbnNmb3JtIHRoYXQgYnVuZGxlcyB0b2dldGhlciB0aGUgdHJhbnNmb3JtcyB0aGF0IG11c3QgdW5jb25kaXRpb25hbGx5XG4gKiBoYXBwZW4gbGFzdCBpbiBvcmRlciB0byBlbnN1cmUgc2FmZSBldmFsdWF0aW9uIHdpdGhvdXQgcGFyc2luZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjigI1fb25jZS5yZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zKHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnMpO1xuY29uc3QgICAgICAgIG1hbmRhdG9yeVRyYW5zZm9ybXM9ICAoc291cmNlKT0+e1xuICBzb3VyY2U9ICByZWplY3RIdG1sQ29tbWVudHMoc291cmNlKTtcbiAgc291cmNlPSAgcmVqZWN0SW1wb3J0RXhwcmVzc2lvbnMoc291cmNlKTtcbiAgcmV0dXJuIHNvdXJjZTtcbiB9O1xuXG4vKipcbiAqIFN0YXJ0aW5nIHdpdGggYHNvdXJjZWAsIGFwcGx5IGVhY2ggdHJhbnNmb3JtIHRvIHRoZSByZXN1bHQgb2YgdGhlXG4gKiBwcmV2aW91cyBvbmUsIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IHRyYW5zZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7KChzdHI6IHN0cmluZykgPT4gc3RyaW5nKVtdfSB0cmFuc2Zvcm1zXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjigI1fb25jZS5tYW5kYXRvcnlUcmFuc2Zvcm1zKG1hbmRhdG9yeVRyYW5zZm9ybXMpO1xuY29uc3QgICAgICAgIGFwcGx5VHJhbnNmb3Jtcz0gIChzb3VyY2UsIHRyYW5zZm9ybXMpPT4gIHtcbiAgZm9yKCBjb25zdCB0cmFuc2Zvcm0gb2YgdHJhbnNmb3Jtcykge1xuICAgIHNvdXJjZT0gIHRyYW5zZm9ybShzb3VyY2UpO1xuICAgfVxuICByZXR1cm4gc291cmNlO1xuIH07JGjigI1fb25jZS5hcHBseVRyYW5zZm9ybXMoYXBwbHlUcmFuc2Zvcm1zKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTJdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXBwbHksZnJlZXplLHN0cmljdFNjb3BlVGVybWluYXRvcixjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yLG1ha2VFdmFsU2NvcGVLaXQsYXBwbHlUcmFuc2Zvcm1zLG1hbmRhdG9yeVRyYW5zZm9ybXMsbWFrZUV2YWx1YXRlLGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcImFwcGx5XCIsIFskaOKAjV9hID0+IChhcHBseSA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdHJpY3Qtc2NvcGUtdGVybWluYXRvci5qc1wiLCBbW1wic3RyaWN0U2NvcGVUZXJtaW5hdG9yXCIsIFskaOKAjV9hID0+IChzdHJpY3RTY29wZVRlcm1pbmF0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9zbG9wcHktZ2xvYmFscy1zY29wZS10ZXJtaW5hdG9yLmpzXCIsIFtbXCJjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yXCIsIFskaOKAjV9hID0+IChjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yID0gJGjigI1fYSldXV1dLFtcIi4vZXZhbC1zY29wZS5qc1wiLCBbW1wibWFrZUV2YWxTY29wZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZUV2YWxTY29wZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3RyYW5zZm9ybXMuanNcIiwgW1tcImFwcGx5VHJhbnNmb3Jtc1wiLCBbJGjigI1fYSA9PiAoYXBwbHlUcmFuc2Zvcm1zID0gJGjigI1fYSldXSxbXCJtYW5kYXRvcnlUcmFuc2Zvcm1zXCIsIFskaOKAjV9hID0+IChtYW5kYXRvcnlUcmFuc2Zvcm1zID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZS1ldmFsdWF0ZS5qc1wiLCBbW1wibWFrZUV2YWx1YXRlXCIsIFskaOKAjV9hID0+IChtYWtlRXZhbHVhdGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbH09ICAgYXNzZXJ0O1xuXG4vKipcbiAqIG1ha2VTYWZlRXZhbHVhdG9yKClcbiAqIEJ1aWxkIHRoZSBsb3ctbGV2ZWwgb3BlcmF0aW9uIHVzZWQgYnkgYWxsIGV2YWx1YXRvcnM6XG4gKiBldmFsKCksIEZ1bmN0aW9uKCksIENvbXBhcnRtZW50LnByb3RvdHlwZS5ldmFsdWF0ZSgpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5nbG9iYWxPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5tb2R1bGVMZXhpY2Fsc11cbiAqIEBwYXJhbSB7QXJyYXk8VHJhbnNmb3JtPn0gW29wdGlvbnMuZ2xvYmFsVHJhbnNmb3Jtc11cbiAqIEBwYXJhbSB7Ym9vbH0gW29wdGlvbnMuc2xvcHB5R2xvYmFsc01vZGVdXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2FmZUV2YWx1YXRvcj0gICh7XG4gIGdsb2JhbE9iamVjdCxcbiAgbW9kdWxlTGV4aWNhbHM9ICB7fSxcbiAgZ2xvYmFsVHJhbnNmb3Jtcz0gIFtdLFxuICBzbG9wcHlHbG9iYWxzTW9kZT0gIGZhbHNlfT1cbiAgICB7fSk9PiAge1xuICBjb25zdCBzY29wZVRlcm1pbmF0b3I9ICBzbG9wcHlHbG9iYWxzTW9kZT9cbiAgICAgIGNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3IoZ2xvYmFsT2JqZWN0KTpcbiAgICAgIHN0cmljdFNjb3BlVGVybWluYXRvcjtcbiAgY29uc3QgZXZhbFNjb3BlS2l0PSAgbWFrZUV2YWxTY29wZUtpdCgpO1xuICBjb25zdCB7IGV2YWxTY29wZX09ICAgZXZhbFNjb3BlS2l0O1xuXG4gIGNvbnN0IGV2YWx1YXRlQ29udGV4dD0gIGZyZWV6ZSh7XG4gICAgZXZhbFNjb3BlLFxuICAgIG1vZHVsZUxleGljYWxzLFxuICAgIGdsb2JhbE9iamVjdCxcbiAgICBzY29wZVRlcm1pbmF0b3J9KTtcblxuXG4gIC8vIERlZmVyIGNyZWF0aW5nIHRoZSBhY3R1YWwgZXZhbHVhdG9yIHRvIGZpcnN0IHVzZS5cbiAgLy8gQ3JlYXRpbmcgYSBjb21wYXJ0bWVudCBzaG91bGQgYmUgcG9zc2libGUgaW4gbm8tZXZhbCBlbnZpcm9ubWVudHNcbiAgLy8gSXQgYWxzbyBhbGxvd3MgbW9yZSBnbG9iYWwgY29uc3RhbnRzIHRvIGJlIGNhcHR1cmVkIGJ5IHRoZSBvcHRpbWl6ZXJcbiAgbGV0IGV2YWx1YXRlO1xuICBjb25zdCBwcm92aWRlRXZhbHVhdGU9ICAoKT0+ICB7XG4gICAgaWYoICFldmFsdWF0ZSkge1xuICAgICAgZXZhbHVhdGU9ICBtYWtlRXZhbHVhdGUoZXZhbHVhdGVDb250ZXh0KTtcbiAgICAgfVxuICAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7QXJyYXk8VHJhbnNmb3JtPn0gW29wdGlvbnMubG9jYWxUcmFuc2Zvcm1zXVxuICAgKi9cbiAgY29uc3Qgc2FmZUV2YWx1YXRlPSAgKHNvdXJjZSwgeyBsb2NhbFRyYW5zZm9ybXM9ICBbXX09ICAge30pPT4gIHtcbiAgICBwcm92aWRlRXZhbHVhdGUoKTtcblxuICAgIC8vIEV4ZWN1dGUgdGhlIG1hbmRhdG9yeSB0cmFuc2Zvcm1zIGxhc3QgdG8gZW5zdXJlIHRoYXQgYW55IHJld3JpdHRlbiBjb2RlXG4gICAgLy8gbWVldHMgdGhvc2UgbWFuZGF0b3J5IHJlcXVpcmVtZW50cy5cbiAgICBzb3VyY2U9ICBhcHBseVRyYW5zZm9ybXMoc291cmNlLCBbXG4gICAgICAuLi5sb2NhbFRyYW5zZm9ybXMsXG4gICAgICAuLi5nbG9iYWxUcmFuc2Zvcm1zLFxuICAgICAgbWFuZGF0b3J5VHJhbnNmb3Jtc10pO1xuXG5cbiAgICBsZXQgZXJyO1xuICAgIHRyeSB7XG4gICAgICAvLyBBbGxvdyBuZXh0IHJlZmVyZW5jZSB0byBldmFsIHByb2R1Y2UgdGhlIHVuc2FmZSBGRVJBTF9FVkFMLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGV2YWxTY29wZUtpdC5hbGxvd05leHRFdmFsVG9CZVVuc2FmZSgpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBcInRoaXNcIiByZXNvbHZlcyB0byB0aGUgc2FmZSBnbG9iYWwuXG4gICAgICByZXR1cm4gYXBwbHkoZXZhbHVhdGUsIGdsb2JhbE9iamVjdCwgW3NvdXJjZV0pO1xuICAgICB9Y2F0Y2goIGUpIHtcbiAgICAgIC8vIHN0YXNoIHRoZSBjaGlsZC1jb2RlIGVycm9yIGluIGhvcGVzIG9mIGRlYnVnZ2luZyB0aGUgaW50ZXJuYWwgZmFpbHVyZVxuICAgICAgZXJyPSAgZTtcbiAgICAgIHRocm93IGU7XG4gICAgIH1maW5hbGx5IHtcbiAgICAgIGNvbnN0IHVuc2FmZUV2YWxXYXNTdGlsbEV4cG9zZWQ9KCAnZXZhbCdpbiAgZXZhbFNjb3BlKTtcbiAgICAgIGRlbGV0ZSBldmFsU2NvcGUuZXZhbDtcbiAgICAgIGlmKCB1bnNhZmVFdmFsV2FzU3RpbGxFeHBvc2VkKSB7XG4gICAgICAgIC8vIEJhcnJpbmcgYSBkZWZlY3QgaW4gdGhlIFNFUyBzaGltLCB0aGUgZXZhbFNjb3BlIHNob3VsZCBhbGxvdyB0aGVcbiAgICAgICAgLy8gcG93ZXJmdWwsIHVuc2FmZSAgYGV2YWxgIHRvIGJlIHVzZWQgYnkgYGV2YWx1YXRlYCBleGFjdGx5IG9uY2UsIGFzIHRoZVxuICAgICAgICAvLyB2ZXJ5IGZpcnN0IG5hbWUgdGhhdCBpdCBhdHRlbXB0cyB0byBhY2Nlc3MgZnJvbSB0aGUgbGV4aWNhbCBzY29wZS5cbiAgICAgICAgLy8gQSBkZWZlY3QgaW4gdGhlIFNFUyBzaGltIGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBhZnRlciB3ZSBzZXRcbiAgICAgICAgLy8gYGV2YWxTY29wZS5ldmFsYCBhbmQgYmVmb3JlIGBldmFsdWF0ZWAgY2FsbHMgYGV2YWxgIGludGVybmFsbHkuXG4gICAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBTRVMgaXMgdmVyeSBicm9rZW4uXG4gICAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGlzIG9uZSB3aGVyZSB0aGlzIHZhdCBpcyBub3cgaG9wZWxlc3NseSBjb25mdXNlZCwgYW5kXG4gICAgICAgIC8vIHRoZSB2YXQgYXMgYSB3aG9sZSBzaG91bGQgYmUgYWJvcnRlZC5cbiAgICAgICAgLy8gTm8gZnVydGhlciBjb2RlIHNob3VsZCBydW4uXG4gICAgICAgIC8vIEFsbCBpbW1lZGlhdGVseSByZWFjaGFibGUgc3RhdGUgc2hvdWxkIGJlIGFiYW5kb25lZC5cbiAgICAgICAgLy8gSG93ZXZlciwgdGhhdCBpcyBub3QgeWV0IHBvc3NpYmxlLCBzbyB3ZSBhdCBsZWFzdCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAgLy8gdmFyaWFibGUgcmVzb2x1dGlvbiB2aWEgdGhlIHNjb3BlSGFuZGxlciwgYW5kIHRocm93IGFuIGVycm9yIHdpdGhcbiAgICAgICAgLy8gZGlhZ25vc3RpYyBpbmZvIGluY2x1ZGluZyB0aGUgdGhyb3duIGVycm9yIGlmIGFueSBmcm9tIGV2YWx1YXRpbmcgdGhlXG4gICAgICAgIC8vIHNvdXJjZSBjb2RlLlxuICAgICAgICBldmFsU2NvcGVLaXQucmV2b2tlZD0gIHsgZXJyfTtcbiAgICAgICAgLy8gVE9ETyBBIEdPT0QgUExBQ0UgVE8gUEFOSUMoKSwgaS5lLiwga2lsbCB0aGUgdmF0IGluY2FybmF0aW9uLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9TRVMtc2hpbS9pc3N1ZXMvNDkwXG4gICAgICAgIEZhaWwgYGhhbmRsZXIgZGlkIG5vdCByZXNldCBhbGxvd05leHRFdmFsVG9CZVVuc2FmZSAke2Vycn1gO1xuICAgICAgIH1cbiAgICAgfVxuICAgfTtcblxuICByZXR1cm4geyBzYWZlRXZhbHVhdGV9O1xuIH07JGjigI1fb25jZS5tYWtlU2FmZUV2YWx1YXRvcihtYWtlU2FmZUV2YWx1YXRvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzEzXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFR5cGVFcnJvcixhcnJheVB1c2gsY3JlYXRlLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsZXZhZGVIdG1sQ29tbWVudFRlc3QsZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdCxyZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zLG1ha2VTYWZlRXZhbHVhdG9yOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFycmF5UHVzaFwiLCBbJGjigI1fYSA9PiAoYXJyYXlQdXNoID0gJGjigI1fYSldXSxbXCJjcmVhdGVcIiwgWyRo4oCNX2EgPT4gKGNyZWF0ZSA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc1wiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9ICRo4oCNX2EpXV1dXSxbXCIuL3RyYW5zZm9ybXMuanNcIiwgW1tcImV2YWRlSHRtbENvbW1lbnRUZXN0XCIsIFskaOKAjV9hID0+IChldmFkZUh0bWxDb21tZW50VGVzdCA9ICRo4oCNX2EpXV0sW1wiZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdFwiLCBbJGjigI1fYSA9PiAoZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdCA9ICRo4oCNX2EpXV0sW1wicmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9uc1wiLCBbJGjigI1fYSA9PiAocmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9ucyA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2Utc2FmZS1ldmFsdWF0b3IuanNcIiwgW1tcIm1ha2VTYWZlRXZhbHVhdG9yXCIsIFskaOKAjV9hID0+IChtYWtlU2FmZUV2YWx1YXRvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCAgICAgICAgcHJvdmlkZUNvbXBhcnRtZW50RXZhbHVhdG9yPSAgKGNvbXBhcnRtZW50RmllbGRzLCBvcHRpb25zKT0+ICB7XG4gIGNvbnN0IHtcbiAgICBzbG9wcHlHbG9iYWxzTW9kZT0gIGZhbHNlLFxuICAgIF9fbW9kdWxlU2hpbUxleGljYWxzX189ICB1bmRlZmluZWR9PVxuICAgICAgb3B0aW9ucztcblxuICBsZXQgc2FmZUV2YWx1YXRlO1xuXG4gIGlmKCBfX21vZHVsZVNoaW1MZXhpY2Fsc19fPT09ICB1bmRlZmluZWQmJiAgIXNsb3BweUdsb2JhbHNNb2RlKSB7XG4gICAgKHsgc2FmZUV2YWx1YXRlfT0gICBjb21wYXJ0bWVudEZpZWxkcyk7XG4gICB9ZWxzZSB7XG4gICAgLy8gVGhlIHNjb3BlIHByb3h5IG9yIGdsb2JhbCBsZXhpY2FscyBhcmUgZGlmZmVyZW50IGZyb20gdGhlXG4gICAgLy8gc2hhcmVkIGV2YWx1YXRvciBzbyB3ZSBuZWVkIHRvIGJ1aWxkIGEgbmV3IG9uZVxuXG4gICAgbGV0IHsgZ2xvYmFsVHJhbnNmb3Jtc309ICAgY29tcGFydG1lbnRGaWVsZHM7XG4gICAgY29uc3QgeyBnbG9iYWxPYmplY3R9PSAgIGNvbXBhcnRtZW50RmllbGRzO1xuXG4gICAgbGV0IG1vZHVsZUxleGljYWxzO1xuICAgIGlmKCBfX21vZHVsZVNoaW1MZXhpY2Fsc19fIT09ICB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdoZW4gdXNpbmcgYGV2YWx1YXRlYCBmb3IgRVNNIG1vZHVsZXMsIGFzIHNob3VsZCBvbmx5IG9jY3VyIGZyb20gdGhlXG4gICAgICAvLyBtb2R1bGUtc2hpbSdzIG1vZHVsZS1pbnN0YW5jZS5qcywgd2UgZG8gbm90IHJldmVhbCB0aGUgU0VTLXNoaW0nc1xuICAgICAgLy8gbW9kdWxlLXRvLXByb2dyYW0gdHJhbnNsYXRpb24sIGFzIHRoaXMgaXMgbm90IHN0YW5kYXJkaXphYmxlIGJlaGF2aW9yLlxuICAgICAgLy8gSG93ZXZlciwgdGhlIGBsb2NhbFRyYW5zZm9ybXNgIHdpbGwgY29tZSBmcm9tIHRoZSBgX19zaGltVHJhbnNmb3Jtc19fYFxuICAgICAgLy8gQ29tcGFydG1lbnQgb3B0aW9uIGluIHRoaXMgY2FzZSwgd2hpY2ggaXMgYSBub24tc3RhbmRhcmRpemFibGUgZXNjYXBlXG4gICAgICAvLyBoYXRjaCBzbyBwcm9ncmFtcyBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBTRVMtc2hpbVxuICAgICAgLy8gaW1wbGVtZW50YXRpb24gbWF5IG9wdC1pbiB0byB1c2UgdGhlIHNhbWUgdHJhbnNmb3JtcyBmb3IgYGV2YWx1YXRlYFxuICAgICAgLy8gYW5kIGBpbXBvcnRgLCBhdCB0aGUgZXhwZW5zZSBvZiBiZWluZyB0aWdodGx5IGNvdXBsZWQgdG8gU0VTLXNoaW0uXG4gICAgICBnbG9iYWxUcmFuc2Zvcm1zPSAgdW5kZWZpbmVkO1xuXG4gICAgICBtb2R1bGVMZXhpY2Fscz0gIGNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhfX21vZHVsZVNoaW1MZXhpY2Fsc19fKSk7XG5cbiAgICAgfVxuXG4gICAgKHsgc2FmZUV2YWx1YXRlfT0gICBtYWtlU2FmZUV2YWx1YXRvcih7XG4gICAgICBnbG9iYWxPYmplY3QsXG4gICAgICBtb2R1bGVMZXhpY2FscyxcbiAgICAgIGdsb2JhbFRyYW5zZm9ybXMsXG4gICAgICBzbG9wcHlHbG9iYWxzTW9kZX0pKTtcblxuICAgfVxuXG4gIHJldHVybiB7IHNhZmVFdmFsdWF0ZX07XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvcihwcm92aWRlQ29tcGFydG1lbnRFdmFsdWF0b3IpO1xuXG5jb25zdCAgICAgICAgY29tcGFydG1lbnRFdmFsdWF0ZT0gIChjb21wYXJ0bWVudEZpZWxkcywgc291cmNlLCBvcHRpb25zKT0+ICB7XG4gIC8vIFBlcmZvcm0gdGhpcyBjaGVjayBmaXJzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzYW5pdGl6aW5nLlxuICAvLyBUT0RPIE1heWJlIHJlbGF4IHN0cmluZyBjaGVjayBhbmQgY29lcmNlIGluc3RlYWQ6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWR5bmFtaWMtY29kZS1icmFuZC1jaGVja3NcbiAgaWYoIHR5cGVvZiBzb3VyY2UhPT0gICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlyc3QgYXJndW1lbnQgb2YgZXZhbHVhdGUoKSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICB9XG5cbiAgLy8gRXh0cmFjdCBvcHRpb25zLCBhbmQgc2hhbGxvdy1jbG9uZSB0cmFuc2Zvcm1zLlxuICBjb25zdCB7XG4gICAgdHJhbnNmb3Jtcz0gIFtdLFxuICAgIF9fZXZhZGVIdG1sQ29tbWVudFRlc3RfXz0gIGZhbHNlLFxuICAgIF9fZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdF9fPSAgZmFsc2UsXG4gICAgX19yZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zX189ICB0cnVlICAvLyBOb3RlIGRlZmF1bHQgb25cbn09ICAgIG9wdGlvbnM7XG4gIGNvbnN0IGxvY2FsVHJhbnNmb3Jtcz0gIFsuLi50cmFuc2Zvcm1zXTtcbiAgaWYoIF9fZXZhZGVIdG1sQ29tbWVudFRlc3RfXz09PSAgdHJ1ZSkge1xuICAgIGFycmF5UHVzaChsb2NhbFRyYW5zZm9ybXMsIGV2YWRlSHRtbENvbW1lbnRUZXN0KTtcbiAgIH1cbiAgaWYoIF9fZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdF9fPT09ICB0cnVlKSB7XG4gICAgYXJyYXlQdXNoKGxvY2FsVHJhbnNmb3JtcywgZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdCk7XG4gICB9XG4gIGlmKCBfX3JlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnNfXz09PSAgdHJ1ZSkge1xuICAgIGFycmF5UHVzaChsb2NhbFRyYW5zZm9ybXMsIHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnMpO1xuICAgfVxuXG4gIGNvbnN0IHsgc2FmZUV2YWx1YXRlfT0gICBwcm92aWRlQ29tcGFydG1lbnRFdmFsdWF0b3IoXG4gICAgY29tcGFydG1lbnRGaWVsZHMsXG4gICAgb3B0aW9ucyk7XG5cblxuICByZXR1cm4gc2FmZUV2YWx1YXRlKHNvdXJjZSwge1xuICAgIGxvY2FsVHJhbnNmb3Jtc30pO1xuXG4gfTskaOKAjV9vbmNlLmNvbXBhcnRtZW50RXZhbHVhdGUoY29tcGFydG1lbnRFdmFsdWF0ZSk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzE0XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBtYWtlRXZhbEZ1bmN0aW9uKClcbiAqIEEgc2FmZSB2ZXJzaW9uIG9mIHRoZSBuYXRpdmUgZXZhbCBmdW5jdGlvbiB3aGljaCByZWxpZXMgb25cbiAqIHRoZSBzYWZldHkgb2Ygc2FmZUV2YWx1YXRlIGZvciBjb25maW5lbWVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzYWZlRXZhbHVhdGVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VFdmFsRnVuY3Rpb249ICAoc2FmZUV2YWx1YXRlKT0+e1xuICAvLyBXZSB1c2UgdGhlIHRoZSBjb25jaXNlIG1ldGhvZCBzeW50YXggdG8gY3JlYXRlIGFuIGV2YWwgd2l0aG91dCBhXG4gIC8vIFtbQ29uc3RydWN0XV0gYmVoYXZpb3IgKHN1Y2ggdGhhdCB0aGUgaW52b2NhdGlvbiBcIm5ldyBldmFsKClcIiB0aHJvd3NcbiAgLy8gVHlwZUVycm9yOiBldmFsIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpLCBidXQgd2hpY2ggc3RpbGwgYWNjZXB0cyBhXG4gIC8vICd0aGlzJyBiaW5kaW5nLlxuICBjb25zdCBuZXdFdmFsPSAge1xuICAgIGV2YWwoc291cmNlKSB7XG4gICAgICBpZiggdHlwZW9mIHNvdXJjZSE9PSAgJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXMgcGVyIHRoZSBydW50aW1lIHNlbWFudGljIG9mIFBlcmZvcm1FdmFsIFtFQ01BU2NyaXB0IDE4LjIuMS4xXTpcbiAgICAgICAgLy8gSWYgVHlwZShzb3VyY2UpIGlzIG5vdCBTdHJpbmcsIHJldHVybiBzb3VyY2UuXG4gICAgICAgIC8vIFRPRE8gUmVjZW50IHByb3Bvc2FscyBmcm9tIE1pa2UgU2FtdWVsIG1heSBjaGFuZ2UgdGhpcyBub24tc3RyaW5nXG4gICAgICAgIC8vIHJ1bGUuIFRyYWNrLlxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgIH1cbiAgICAgIHJldHVybiBzYWZlRXZhbHVhdGUoc291cmNlKTtcbiAgICAgfX0uXG4gICAgZXZhbDtcblxuICByZXR1cm4gbmV3RXZhbDtcbiB9OyRo4oCNX29uY2UubWFrZUV2YWxGdW5jdGlvbihtYWtlRXZhbEZ1bmN0aW9uKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTVdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfRlVOQ1RJT04sYXJyYXlKb2luLGFycmF5UG9wLGRlZmluZVByb3BlcnRpZXMsZ2V0UHJvdG90eXBlT2YsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiRkVSQUxfRlVOQ1RJT05cIiwgWyRo4oCNX2EgPT4gKEZFUkFMX0ZVTkNUSU9OID0gJGjigI1fYSldXSxbXCJhcnJheUpvaW5cIiwgWyRo4oCNX2EgPT4gKGFycmF5Sm9pbiA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQb3BcIiwgWyRo4oCNX2EgPT4gKGFycmF5UG9wID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJnZXRQcm90b3R5cGVPZlwiLCBbJGjigI1fYSA9PiAoZ2V0UHJvdG90eXBlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBGYWlsfT0gICBhc3NlcnQ7XG5cbi8qXG4gKiBtYWtlRnVuY3Rpb25Db25zdHJ1Y3RvcigpXG4gKiBBIHNhZmUgdmVyc2lvbiBvZiB0aGUgbmF0aXZlIEZ1bmN0aW9uIHdoaWNoIHJlbGllcyBvblxuICogdGhlIHNhZmV0eSBvZiBzYWZlRXZhbHVhdGUgZm9yIGNvbmZpbmVtZW50LlxuICovXG5jb25zdCAgICAgICAgbWFrZUZ1bmN0aW9uQ29uc3RydWN0b3I9ICAoc2FmZUV2YWx1YXRlKT0+e1xuICAvLyBEZWZpbmUgYW4gdW51c2VkIHBhcmFtZXRlciB0byBlbnN1cmUgRnVuY3Rpb24ubGVuZ3RoID09PSAxXG4gIGNvbnN0IG5ld0Z1bmN0aW9uPSAgZnVuY3Rpb24gRnVuY3Rpb24oX2JvZHkpIHtcbiAgICAvLyBTYW5pdGl6ZSBhbGwgcGFyYW1ldGVycyBhdCB0aGUgZW50cnkgcG9pbnQuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgIGNvbnN0IGJvZHlUZXh0PSAgIGAke2FycmF5UG9wKGFyZ3VtZW50cyl8fCAnJyB9YDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgY29uc3QgcGFyYW1ldGVycz0gICBgJHthcnJheUpvaW4oYXJndW1lbnRzLCcsJykgfWA7XG5cbiAgICAvLyBBcmUgcGFyYW1ldGVycyBhbmQgYm9keVRleHQgdmFsaWQgY29kZSwgb3IgaXMgc29tZW9uZVxuICAgIC8vIGF0dGVtcHRpbmcgYW4gaW5qZWN0aW9uIGF0dGFjaz8gVGhpcyB3aWxsIHRocm93IGEgU3ludGF4RXJyb3IgaWY6XG4gICAgLy8gLSBwYXJhbWV0ZXJzIGRvZXNuJ3QgcGFyc2UgYXMgcGFyYW1ldGVyc1xuICAgIC8vIC0gYm9keVRleHQgZG9lc24ndCBwYXJzZSBhcyBhIGZ1bmN0aW9uIGJvZHlcbiAgICAvLyAtIGVpdGhlciBjb250YWluIGEgY2FsbCB0byBzdXBlcigpIG9yIHJlZmVyZW5jZXMgYSBzdXBlciBwcm9wZXJ0eS5cbiAgICAvL1xuICAgIC8vIEl0IHNlZW1zIHRoYXQgWFMgbWF5IHN0aWxsIGJlIHZ1bG5lcmFibGUgdG8gdGhlIGF0dGFjayBleHBsYWluZWQgYXRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9lY21hMjYyL3B1bGwvMjM3NCNpc3N1ZWNvbW1lbnQtODEzNzY5NzEwXG4gICAgLy8gd2hlcmUgYG5ldyBGdW5jdGlvbignLyonLCAnKi8gKSB7JylgIHdvdWxkIGluY29ycmVjdGx5IHZhbGlkYXRlLlxuICAgIC8vIEJlZm9yZSB3ZSB3b3JyaWVkIGFib3V0IHRoaXMsIHdlIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIGFuZCBib2R5VGV4dFxuICAgIC8vIHRvZ2V0aGVyIGluIG9uZSBjYWxsXG4gICAgLy8gYGBganNcbiAgICAvLyBuZXcgRkVSQUxfRlVOQ1RJT04ocGFyYW1ldGVycywgYm9keVRlc3QpO1xuICAgIC8vIGBgYFxuICAgIC8vIEhvd2V2ZXIsIHRoaXMgY2hlY2sgaXMgdnVsbmVyYWJsZSB0byB0aGF0IGJ1Zy4gQXNpZGUgZnJvbSB0aGF0IGNhc2UsXG4gICAgLy8gYWxsIGVuZ2luZXMgZG8gc2VlbSB0byB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycywgdGFrZW4gYnkgdGhlbXNlbHZlcyxcbiAgICAvLyBjb3JyZWN0bHkuIEFuZCBhbGwgZW5naW5lcyBkbyBzZWVtIHRvIHZhbGlkYXRlIHRoZSBib2R5VGV4dCwgdGFrZW5cbiAgICAvLyBieSBpdHNlbGYgY29ycmVjdGx5LiBTbyB3aXRoIHRoZSBmb2xsb3dpbmcgdHdvIGNoZWNrcywgU0VTIGJ1aWxkcyBhXG4gICAgLy8gY29ycmVjdCBzYWZlIGBGdW5jdGlvbmAgY29uc3RydWN0b3IgYnkgY29tcG9zaW5nIHR3byBjYWxscyB0byBhblxuICAgIC8vIG9yaWdpbmFsIHVuc2FmZSBgRnVuY3Rpb25gIGNvbnN0cnVjdG9yIHRoYXQgbWF5IHN1ZmZlciBmcm9tIHRoaXMgYnVnXG4gICAgLy8gYnV0IGlzIG90aGVyd2lzZSBjb3JyZWN0bHkgdmFsaWRhdGluZy5cbiAgICAvL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICBuZXcgRkVSQUxfRlVOQ1RJT04ocGFyYW1ldGVycywgJycpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXdcbiAgICBuZXcgRkVSQUxfRlVOQ1RJT04oYm9keVRleHQpO1xuXG4gICAgLy8gU2FmZSB0byBiZSBjb21iaW5lZC4gRGVmZWF0IHBvdGVudGlhbCB0cmFpbGluZyBjb21tZW50cy5cbiAgICAvLyBUT0RPOiBzaW5jZSB3ZSBjcmVhdGUgYW4gYW5vbnltb3VzIGZ1bmN0aW9uLCB0aGUgJ3RoaXMnIHZhbHVlXG4gICAgLy8gaXNuJ3QgYm91bmQgdG8gdGhlIGdsb2JhbCBvYmplY3QgYXMgcGVyIHNwZWNzLCBidXQgc2V0IGFzIHVuZGVmaW5lZC5cbiAgICBjb25zdCBzcmM9ICAgYChmdW5jdGlvbiBhbm9ueW1vdXMoJHtwYXJhbWV0ZXJzfVxcbikge1xcbiR7Ym9keVRleHR9XFxufSlgO1xuICAgIHJldHVybiBzYWZlRXZhbHVhdGUoc3JjKTtcbiAgIH07XG5cbiAgZGVmaW5lUHJvcGVydGllcyhuZXdGdW5jdGlvbiwge1xuICAgIC8vIEVuc3VyZSB0aGF0IGFueSBmdW5jdGlvbiBjcmVhdGVkIGluIGFueSBldmFsdWF0b3IgaW4gYSByZWFsbSBpcyBhblxuICAgIC8vIGluc3RhbmNlIG9mIEZ1bmN0aW9uIGluIGFueSBldmFsdWF0b3Igb2YgdGhlIHNhbWUgcmVhbG0uXG4gICAgcHJvdG90eXBlOiB7XG4gICAgICB2YWx1ZTogRkVSQUxfRlVOQ1RJT04ucHJvdG90eXBlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlfX0pO1xuXG5cblxuICAvLyBBc3NlcnQgaWRlbnRpdHkgb2YgRnVuY3Rpb24uX19wcm90b19fIGFjY3Jvc3MgYWxsIGNvbXBhcnRtZW50c1xuICBnZXRQcm90b3R5cGVPZihGRVJBTF9GVU5DVElPTik9PT0gIEZFUkFMX0ZVTkNUSU9OLnByb3RvdHlwZXx8XG4gICAgRmFpbCBgRnVuY3Rpb24gcHJvdG90eXBlIGlzIHRoZSBzYW1lIGFjY3Jvc3MgY29tcGFydG1lbnRzYDtcbiAgZ2V0UHJvdG90eXBlT2YobmV3RnVuY3Rpb24pPT09ICBGRVJBTF9GVU5DVElPTi5wcm90b3R5cGV8fFxuICAgIEZhaWwgYEZ1bmN0aW9uIGNvbnN0cnVjdG9yIHByb3RvdHlwZSBpcyB0aGUgc2FtZSBhY2Nyb3NzIGNvbXBhcnRtZW50c2A7XG5cbiAgcmV0dXJuIG5ld0Z1bmN0aW9uO1xuIH07JGjigI1fb25jZS5tYWtlRnVuY3Rpb25Db25zdHJ1Y3RvcihtYWtlRnVuY3Rpb25Db25zdHJ1Y3Rvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzE2XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzICovXG4vKipcbiAqIEBmaWxlIEV4cG9ydHMge0Bjb2RlIHdoaXRlbGlzdH0sIGEgcmVjdXJzaXZlbHkgZGVmaW5lZFxuICogSlNPTiByZWNvcmQgZW51bWVyYXRpbmcgYWxsIGludHJpbnNpY3MgYW5kIHRoZWlyIHByb3BlcnRpZXNcbiAqIGFjY29yZGluZyB0byBFQ01BIHNwZWNzLlxuICpcbiAqIEBhdXRob3IgSkYgUGFyYWRpc1xuICogQGF1dGhvciBNYXJrIFMuIE1pbGxlclxuICovXG5cbi8qIGVzbGludCBtYXgtbGluZXM6IDAgKi9cblxuLyoqXG4gKiBjb25zdGFudFByb3BlcnRpZXNcbiAqIG5vbi1jb25maWd1cmFibGUsIG5vbi13cml0YWJsZSBkYXRhIHByb3BlcnRpZXMgb2YgYWxsIGdsb2JhbCBvYmplY3RzLlxuICogTXVzdCBiZSBwb3dlcmxlc3MuXG4gKiBNYXBzIGZyb20gcHJvcGVydHkgbmFtZSB0byB0aGUgYWN0dWFsIHZhbHVlXG4gKi9cbmNvbnN0ICAgICAgICBjb25zdGFudFByb3BlcnRpZXM9ICB7XG4gIC8vICoqKiBWYWx1ZSBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgSW5maW5pdHksXG4gIE5hTixcbiAgdW5kZWZpbmVkfTtcblxuXG4vKipcbiAqIHVuaXZlcnNhbFByb3BlcnR5TmFtZXNcbiAqIFByb3BlcnRpZXMgb2YgYWxsIGdsb2JhbCBvYmplY3RzLlxuICogTXVzdCBiZSBwb3dlcmxlc3MuXG4gKiBNYXBzIGZyb20gcHJvcGVydHkgbmFtZSB0byB0aGUgaW50cmluc2ljIG5hbWUgaW4gdGhlIHdoaXRlbGlzdC5cbiAqLyRo4oCNX29uY2UuY29uc3RhbnRQcm9wZXJ0aWVzKGNvbnN0YW50UHJvcGVydGllcyk7XG5jb25zdCAgICAgICAgdW5pdmVyc2FsUHJvcGVydHlOYW1lcz0gIHtcbiAgLy8gKioqIEZ1bmN0aW9uIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBpc0Zpbml0ZTogJ2lzRmluaXRlJyxcbiAgaXNOYU46ICdpc05hTicsXG4gIHBhcnNlRmxvYXQ6ICdwYXJzZUZsb2F0JyxcbiAgcGFyc2VJbnQ6ICdwYXJzZUludCcsXG5cbiAgZGVjb2RlVVJJOiAnZGVjb2RlVVJJJyxcbiAgZGVjb2RlVVJJQ29tcG9uZW50OiAnZGVjb2RlVVJJQ29tcG9uZW50JyxcbiAgZW5jb2RlVVJJOiAnZW5jb2RlVVJJJyxcbiAgZW5jb2RlVVJJQ29tcG9uZW50OiAnZW5jb2RlVVJJQ29tcG9uZW50JyxcblxuICAvLyAqKiogQ29uc3RydWN0b3IgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIEFycmF5OiAnQXJyYXknLFxuICBBcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyxcbiAgQmlnSW50OiAnQmlnSW50JyxcbiAgQmlnSW50NjRBcnJheTogJ0JpZ0ludDY0QXJyYXknLFxuICBCaWdVaW50NjRBcnJheTogJ0JpZ1VpbnQ2NEFycmF5JyxcbiAgQm9vbGVhbjogJ0Jvb2xlYW4nLFxuICBEYXRhVmlldzogJ0RhdGFWaWV3JyxcbiAgRXZhbEVycm9yOiAnRXZhbEVycm9yJyxcbiAgRmxvYXQzMkFycmF5OiAnRmxvYXQzMkFycmF5JyxcbiAgRmxvYXQ2NEFycmF5OiAnRmxvYXQ2NEFycmF5JyxcbiAgSW50OEFycmF5OiAnSW50OEFycmF5JyxcbiAgSW50MTZBcnJheTogJ0ludDE2QXJyYXknLFxuICBJbnQzMkFycmF5OiAnSW50MzJBcnJheScsXG4gIE1hcDogJ01hcCcsXG4gIE51bWJlcjogJ051bWJlcicsXG4gIE9iamVjdDogJ09iamVjdCcsXG4gIFByb21pc2U6ICdQcm9taXNlJyxcbiAgUHJveHk6ICdQcm94eScsXG4gIFJhbmdlRXJyb3I6ICdSYW5nZUVycm9yJyxcbiAgUmVmZXJlbmNlRXJyb3I6ICdSZWZlcmVuY2VFcnJvcicsXG4gIFNldDogJ1NldCcsXG4gIFN0cmluZzogJ1N0cmluZycsXG4gIFN5bWJvbDogJ1N5bWJvbCcsXG4gIFN5bnRheEVycm9yOiAnU3ludGF4RXJyb3InLFxuICBUeXBlRXJyb3I6ICdUeXBlRXJyb3InLFxuICBVaW50OEFycmF5OiAnVWludDhBcnJheScsXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiAnVWludDhDbGFtcGVkQXJyYXknLFxuICBVaW50MTZBcnJheTogJ1VpbnQxNkFycmF5JyxcbiAgVWludDMyQXJyYXk6ICdVaW50MzJBcnJheScsXG4gIFVSSUVycm9yOiAnVVJJRXJyb3InLFxuICBXZWFrTWFwOiAnV2Vha01hcCcsXG4gIFdlYWtTZXQ6ICdXZWFrU2V0JyxcblxuICAvLyAqKiogT3RoZXIgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIEpTT046ICdKU09OJyxcbiAgUmVmbGVjdDogJ1JlZmxlY3QnLFxuXG4gIC8vICoqKiBBbm5leCBCXG5cbiAgZXNjYXBlOiAnZXNjYXBlJyxcbiAgdW5lc2NhcGU6ICd1bmVzY2FwZScsXG5cbiAgLy8gRVNOZXh0XG5cbiAgbG9ja2Rvd246ICdsb2NrZG93bicsXG4gIGhhcmRlbjogJ2hhcmRlbicsXG4gIEhhbmRsZWRQcm9taXNlOiAnSGFuZGxlZFByb21pc2UnICAvLyBUT0RPOiBVbnRpbCBQcm9taXNlLmRlbGVnYXRlIChzZWUgYmVsb3cpLlxufTtcblxuLyoqXG4gKiBpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lc1xuICogVGhvc2UgZm91bmQgb25seSBvbiB0aGUgaW5pdGlhbCBnbG9iYWwsIGkuZS4sIHRoZSBnbG9iYWwgb2YgdGhlXG4gKiBzdGFydCBjb21wYXJ0bWVudCwgYXMgd2VsbCBhcyBhbnkgY29tcGFydG1lbnRzIGNyZWF0ZWQgYmVmb3JlIGxvY2tkb3duLlxuICogVGhlc2UgbWF5IHByb3ZpZGUgbXVjaCBvZiB0aGUgcG93ZXIgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsLlxuICogTWFwcyBmcm9tIHByb3BlcnR5IG5hbWUgdG8gdGhlIGludHJpbnNpYyBuYW1lIGluIHRoZSB3aGl0ZWxpc3QuXG4gKi8kaOKAjV9vbmNlLnVuaXZlcnNhbFByb3BlcnR5TmFtZXModW5pdmVyc2FsUHJvcGVydHlOYW1lcyk7XG5jb25zdCAgICAgICAgaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXM9ICB7XG4gIC8vICoqKiBDb25zdHJ1Y3RvciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgRGF0ZTogJyVJbml0aWFsRGF0ZSUnLFxuICBFcnJvcjogJyVJbml0aWFsRXJyb3IlJyxcbiAgUmVnRXhwOiAnJUluaXRpYWxSZWdFeHAlJyxcblxuICAvLyAqKiogT3RoZXIgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIE1hdGg6ICclSW5pdGlhbE1hdGglJyxcblxuICAvLyBFU05leHRcblxuICAvLyBGcm9tIEVycm9yLXN0YWNrIHByb3Bvc2FsXG4gIC8vIE9ubHkgb24gaW5pdGlhbCBnbG9iYWwuIE5vIGNvcnJlc3BvbmRpbmdcbiAgLy8gcG93ZXJsZXNzIGZvcm0gZm9yIG90aGVyIGdsb2JhbHMuXG4gIGdldFN0YWNrU3RyaW5nOiAnJUluaXRpYWxHZXRTdGFja1N0cmluZyUnXG5cbiAgLy8gVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2lzc3Vlcy81NTFcbiAgLy8gTmVlZCBpbml0aWFsIFdlYWtSZWYgYW5kIEZpbmFsaXphdGlvbkdyb3VwIGluXG4gIC8vIHN0YXJ0IGNvbXBhcnRtZW50IG9ubHkuXG59O1xuXG4vKipcbiAqIHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXNcbiAqIFRob3NlIGZvdW5kIG9ubHkgb24gdGhlIGdsb2JhbHMgb2YgbmV3IGNvbXBhcnRtZW50cyBjcmVhdGVkIGFmdGVyIGxvY2tkb3duLFxuICogd2hpY2ggbXVzdCB0aGVyZWZvcmUgYmUgcG93ZXJsZXNzLlxuICogTWFwcyBmcm9tIHByb3BlcnR5IG5hbWUgdG8gdGhlIGludHJpbnNpYyBuYW1lIGluIHRoZSB3aGl0ZWxpc3QuXG4gKi8kaOKAjV9vbmNlLmluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzKGluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzKTtcbmNvbnN0ICAgICAgICBzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzPSAge1xuICAvLyAqKiogQ29uc3RydWN0b3IgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIERhdGU6ICclU2hhcmVkRGF0ZSUnLFxuICBFcnJvcjogJyVTaGFyZWRFcnJvciUnLFxuICBSZWdFeHA6ICclU2hhcmVkUmVnRXhwJScsXG5cbiAgLy8gKioqIE90aGVyIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBNYXRoOiAnJVNoYXJlZE1hdGglJ307XG5cblxuLyoqXG4gKiB1bmlxdWVHbG9iYWxQcm9wZXJ0eU5hbWVzXG4gKiBUaG9zZSBtYWRlIHNlcGFyYXRlbHkgZm9yIGVhY2ggZ2xvYmFsLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgZ2xvYmFsXG4gKiBvZiB0aGUgc3RhcnQgY29tcGFydG1lbnQuXG4gKiBNYXBzIGZyb20gcHJvcGVydHkgbmFtZSB0byB0aGUgaW50cmluc2ljIG5hbWUgaW4gdGhlIHdoaXRlbGlzdFxuICogKHdoaWNoIGlzIGN1cnJlbnRseSBhbHdheXMgdGhlIHNhbWUpLlxuICovJGjigI1fb25jZS5zaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzKHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMpO1xuY29uc3QgICAgICAgIHVuaXF1ZUdsb2JhbFByb3BlcnR5TmFtZXM9ICB7XG4gIC8vICoqKiBWYWx1ZSBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgZ2xvYmFsVGhpczogJyVVbmlxdWVHbG9iYWxUaGlzJScsXG5cbiAgLy8gKioqIEZ1bmN0aW9uIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBldmFsOiAnJVVuaXF1ZUV2YWwlJyxcblxuICAvLyAqKiogQ29uc3RydWN0b3IgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIEZ1bmN0aW9uOiAnJVVuaXF1ZUZ1bmN0aW9uJScsXG5cbiAgLy8gKioqIE90aGVyIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICAvLyBFU05leHRcblxuICBDb21wYXJ0bWVudDogJyVVbmlxdWVDb21wYXJ0bWVudCUnXG4gIC8vIEFjY29yZGluZyB0byBjdXJyZW50IGFncmVlbWVudHMsIGV2ZW50dWFsbHkgdGhlIFJlYWxtIGNvbnN0cnVjdG9yIHRvby5cbiAgLy8gJ1JlYWxtJyxcbn07XG5cbi8vIEFsbCB0aGUgXCJzdWJjbGFzc2VzXCIgb2YgRXJyb3IuIFRoZXNlIGFyZSBjb2xsZWN0aXZlbHkgcmVwcmVzZW50ZWQgaW4gdGhlXG4vLyBFQ01BU2NyaXB0IHNwZWMgYnkgdGhlIG1ldGEgdmFyaWFibGUgTmF0aXZlRXJyb3IuXG4vLyBUT0RPIEFkZCBBZ2dyZWdhdGVFcnJvciBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2lzc3Vlcy81NTBcbiRo4oCNX29uY2UudW5pcXVlR2xvYmFsUHJvcGVydHlOYW1lcyh1bmlxdWVHbG9iYWxQcm9wZXJ0eU5hbWVzKTtjb25zdCBOYXRpdmVFcnJvcnM9W1xuICBFdmFsRXJyb3IsXG4gIFJhbmdlRXJyb3IsXG4gIFJlZmVyZW5jZUVycm9yLFxuICBTeW50YXhFcnJvcixcbiAgVHlwZUVycm9yLFxuICBVUklFcnJvcl07XG5cblxuLyoqXG4gKiA8cD5FYWNoIEpTT04gcmVjb3JkIGVudW1lcmF0ZXMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIG9uXG4gKiAgICBzb21lIGNvcnJlc3BvbmRpbmcgaW50cmluc2ljIG9iamVjdC5cbiAqXG4gKiA8cD5BbGwgcmVjb3JkcyBhcmUgbWFkZSBvZiBrZXktdmFsdWUgcGFpcnMgd2hlcmUgdGhlIGtleVxuICogICAgaXMgdGhlIHByb3BlcnR5IHRvIHByb2Nlc3MsIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGFzc29jaWF0ZWRcbiAqICAgIGRpc3Bvc2l0aW9ucyBhLmsuYS4gdGhlIFwicGVybWl0XCIuIFRob3NlIHBlcm1pdHMgY2FuIGJlOlxuICogPHVsPlxuICogPGxpPlRoZSBib29sZWFuIHZhbHVlIFwiZmFsc2VcIiwgaW4gd2hpY2ggY2FzZSB0aGlzIHByb3BlcnR5IGlzXG4gKiAgICAgYmxhY2tsaXN0ZWQgYW5kIHNpbXBseSByZW1vdmVkLiBQcm9wZXJ0aWVzIG5vdCBtZW50aW9uZWRcbiAqICAgICBhcmUgYWxzbyBjb25zaWRlcmVkIGJsYWNrbGlzdGVkIGFuZCBhcmUgcmVtb3ZlZC5cbiAqIDxsaT5BIHN0cmluZyB2YWx1ZSBlcXVhbCB0byBhIHByaW1pdGl2ZSAoXCJudW1iZXJcIiwgXCJzdHJpbmdcIiwgZXRjKSxcbiAqICAgICBpbiB3aGljaCBjYXNlIHRoZSBwcm9wZXJ0eSBpcyB3aGl0ZWxpc3RlZCBpZiBpdHMgdmFsdWUgcHJvcGVydHlcbiAqICAgICBpcyB0eXBlb2YgdGhlIGdpdmVuIHR5cGUuIEZvciBleGFtcGxlLCB7QGNvZGUgXCJJbmZpbml0eVwifSBsZWFkcyB0b1xuICogICAgIFwibnVtYmVyXCIgYW5kIHByb3BlcnR5IHZhbHVlcyB0aGF0IGZhaWwge0Bjb2RlIHR5cGVvZiBcIm51bWJlclwifS5cbiAqICAgICBhcmUgcmVtb3ZlZC5cbiAqIDxsaT5BIHN0cmluZyB2YWx1ZSBlcXVhbCB0byBhbiBpbnRpbnNpYyBuYW1lIChcIk9iamVjdFByb3RvdHlwZVwiLFxuICogICAgIFwiQXJyYXlcIiwgZXRjKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydHkgd2hpdGVsaXN0ZWQgaWYgaXRzXG4gKiAgICAgdmFsdWUgcHJvcGVydHkgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25maW5nXG4gKiAgICAgaW50cmluc2ljcy4gRm9yIGV4YW1wbGUsIHtAY29kZSBNYXAucHJvdG90eXBlfSBsZWFkcyB0b1xuICogICAgIFwiTWFwUHJvdG90eXBlXCIgYW5kIHRoZSBwcm9wZXJ0eSBpcyByZW1vdmVkIGlmIGl0cyB2YWx1ZSBpc1xuICogICAgIG5vdCBlcXVhbCB0byAlTWFwUHJvdG90eXBlJVxuICogPGxpPkFub3RoZXIgcmVjb3JkLCBpbiB3aGljaCBjYXNlIHRoaXMgcHJvcGVydHkgaXMgc2ltcGx5XG4gKiAgICAgd2hpdGVsaXN0ZWQgYW5kIHRoYXQgbmV4dCByZWNvcmQgcmVwcmVzZW50cyB0aGUgZGlzcG9zaXRpb24gb2ZcbiAqICAgICB0aGUgb2JqZWN0IHdoaWNoIGlzIGl0cyB2YWx1ZS4gRm9yIGV4YW1wbGUsIHtAY29kZSBcIk9iamVjdFwifVxuICogICAgIGxlYWRzIHRvIGFub3RoZXIgcmVjb3JkIGV4cGxhaW5pbmcgd2hhdCBwcm9wZXJ0aWVzIHtAY29kZVxuICogICAgIFwiT2JqZWN0XCJ9IG1heSBoYXZlIGFuZCBob3cgZWFjaCBzdWNoIHByb3BlcnR5IHNob3VsZCBiZSB0cmVhdGVkLlxuICpcbiAqIDxwPk5vdGVzOlxuICogPGxpPlwiW1tQcm90b11dXCIgaXMgdXNlZCB0byByZWZlciB0byB0aGUgXCJbW1Byb3RvdHlwZV1dXCIgaW50ZXJuYWxcbiAqICAgICBzbG90LCB3aGljaCBzYXlzIHdoaWNoIG9iamVjdCB0aGlzIG9iamVjdCBpbmhlcml0cyBmcm9tLlxuICogPGxpPlwiLS1wcm90by0tXCIgaXMgdXNlZCB0byByZWZlciB0byB0aGUgXCJfX3Byb3RvX19cIiBwcm9wZXJ0eSBuYW1lLFxuICogICAgIHdoaWNoIGlzIHRoZSBuYW1lIG9mIGFuIGFjY2Vzc29yIHByb3BlcnR5IG9uIE9iamVjdC5wcm90b3R5cGUuXG4gKiAgICAgSW4gcHJhY3RpY2UsIGl0IGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBbW1Byb3RvXV0gaW50ZXJuYWwgc2xvdCxcbiAqICAgICBidXQgaXMgZGlzdGluY3QgZnJvbSB0aGUgaW50ZXJuYWwgc2xvdCBpdHNlbGYuIFdlIHVzZVxuICogICAgIFwiLS1wcm90by0tXCIgcmF0aGVyIHRoYW4gXCJfX3Byb3RvX19cIiBiZWxvdyBiZWNhdXNlIFwiX19wcm90b19fXCJcbiAqICAgICBpbiBhbiBvYmplY3QgbGl0ZXJhbCBpcyBzcGVjaWFsIHN5bnRheCByYXRoZXIgdGhhbiBhIG5vcm1hbFxuICogICAgIHByb3BlcnR5IGRlZmluaXRpb24uXG4gKiA8bGk+XCJPYmplY3RQcm90b3R5cGVcIiBpcyB0aGUgZGVmYXVsdCBcIltbUHJvdG9dXVwiICh3aGVuIG5vdCBzcGVjaWZpZWQpLlxuICogPGxpPkNvbnN0YW50cyBcImZuXCIgYW5kIFwiZ2V0dGVyXCIgYXJlIHVzZWQgdG8ga2VlcCB0aGUgc3RydWN0dXJlIERSWS5cbiAqIDxsaT5TeW1ib2wgcHJvcGVydGllcyBhcmUgbGlzdGVkIGFzIGZvbGxvdzpcbiAqICAgICA8bGk+V2VsbC1rbm93biBzeW1ib2xzIHVzZSB0aGUgXCJAQG5hbWVcIiBmb3JtLlxuICogICAgIDxsaT5SZWdpc3RlcmVkIHN5bWJvbHMgdXNlIHRoZSBcIlJlZ2lzdGVyZWRTeW1ib2woa2V5KVwiIGZvcm0uXG4gKiAgICAgPGxpPlVuaXF1ZSBzeW1ib2xzIHVzZSB0aGUgXCJVbmlxdWVTeW1ib2woZGVzY3JpcHRpb24pXCIgZm9ybS5cbiAqL1xuXG4vLyBGdW5jdGlvbiBJbnN0YW5jZXNcbiRo4oCNX29uY2UuTmF0aXZlRXJyb3JzKE5hdGl2ZUVycm9ycyk7Y29uc3QgRnVuY3Rpb25JbnN0YW5jZT17XG4gICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gIGxlbmd0aDogJ251bWJlcicsXG4gIG5hbWU6ICdzdHJpbmcnXG4gIC8vIERvIG5vdCBzcGVjaWZ5IFwicHJvdG90eXBlXCIgaGVyZSwgc2luY2Ugb25seSBGdW5jdGlvbiBpbnN0YW5jZXMgdGhhdCBjYW5cbiAgLy8gYmUgdXNlZCBhcyBhIGNvbnN0cnVjdG9yIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkuIEZvciBjb25zdHJ1Y3RvcnMsXG4gIC8vIHNpbmNlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIGFyZSBpbnN0YW5jZS1zcGVjaWZpYywgd2UgZGVmaW5lIGl0IHRoZXJlLlxufTtcblxuLy8gQXN5bmNGdW5jdGlvbiBJbnN0YW5jZXNcbiRo4oCNX29uY2UuRnVuY3Rpb25JbnN0YW5jZShGdW5jdGlvbkluc3RhbmNlKTtjb25zdCBBc3luY0Z1bmN0aW9uSW5zdGFuY2U9e1xuICAvLyBUaGlzIHByb3BlcnR5IGlzIG5vdCBtZW50aW9uZWQgaW4gRUNNQSAyNjIsIGJ1dCBpcyBwcmVzZW50IGluIFY4IGFuZFxuICAvLyBuZWNlc3NhcnkgZm9yIGxvY2tkb3duIHRvIHN1Y2NlZWQuXG4gICdbW1Byb3RvXV0nOiAnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJ307XG5cblxuLy8gQWxpYXNlc1xuY29uc3QgZm49ICBGdW5jdGlvbkluc3RhbmNlO1xuY29uc3QgYXN5bmNGbj0gIEFzeW5jRnVuY3Rpb25JbnN0YW5jZTtcblxuY29uc3QgZ2V0dGVyPSAge1xuICBnZXQ6IGZuLFxuICBzZXQ6ICd1bmRlZmluZWQnfTtcblxuXG4vLyBQb3NzaWJsZSBidXQgbm90IGVuY291bnRlcmVkIGluIHRoZSBzcGVjc1xuLy8gZXhwb3J0IGNvbnN0IHNldHRlciA9IHtcbi8vICAgZ2V0OiAndW5kZWZpbmVkJyxcbi8vICAgc2V0OiBmbixcbi8vIH07XG5cbmNvbnN0IGFjY2Vzc29yPSAge1xuICBnZXQ6IGZuLFxuICBzZXQ6IGZufTtcblxuXG5jb25zdCAgICAgICAgaXNBY2Nlc3NvclBlcm1pdD0gIChwZXJtaXQpPT57XG4gIHJldHVybiBwZXJtaXQ9PT0gIGdldHRlcnx8ICBwZXJtaXQ9PT0gIGFjY2Vzc29yO1xuIH07XG5cbi8vIE5hdGl2ZUVycm9yIE9iamVjdCBTdHJ1Y3R1cmVcbiRo4oCNX29uY2UuaXNBY2Nlc3NvclBlcm1pdChpc0FjY2Vzc29yUGVybWl0KTtmdW5jdGlvbiBOYXRpdmVFcnJvcihwcm90b3R5cGUpe1xuICByZXR1cm4ge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIE5hdGl2ZUVycm9yIENvbnN0cnVjdG9yc1xuICAgICdbW1Byb3RvXV0nOiAnJVNoYXJlZEVycm9yJScsXG5cbiAgICAvLyBOYXRpdmVFcnJvci5wcm90b3R5cGVcbiAgICBwcm90b3R5cGV9O1xuXG4gfVxuXG5mdW5jdGlvbiBOYXRpdmVFcnJvclByb3RvdHlwZShjb25zdHJ1Y3Rvcikge1xuICByZXR1cm4ge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIE5hdGl2ZUVycm9yIFByb3RvdHlwZSBPYmplY3RzXG4gICAgJ1tbUHJvdG9dXSc6ICclRXJyb3JQcm90b3R5cGUlJyxcbiAgICBjb25zdHJ1Y3RvcixcbiAgICBtZXNzYWdlOiAnc3RyaW5nJyxcbiAgICBuYW1lOiAnc3RyaW5nJyxcbiAgICAvLyBSZWR1bmRhbnRseSBwcmVzZW50IG9ubHkgb24gdjguIFNhZmUgdG8gcmVtb3ZlLlxuICAgIHRvU3RyaW5nOiBmYWxzZSxcbiAgICAvLyBTdXBlcmZsdW91c2x5IHByZXNlbnQgaW4gc29tZSB2ZXJzaW9ucyBvZiBWOC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9ub3Rlcy9ibG9iL21hc3Rlci9tZWV0aW5ncy8yMDIxLTEwL29jdC0yNi5tZCM6fjp0ZXh0PUhvd2V2ZXIlMkMlMjBDaHJvbWUlMjA5MyxhbmQlMjBub2RlJTIwMTYuMTEuXG4gICAgY2F1c2U6IGZhbHNlfTtcblxuIH1cblxuLy8gVGhlIFR5cGVkQXJyYXkgQ29uc3RydWN0b3JzXG5mdW5jdGlvbiBUeXBlZEFycmF5KHByb3RvdHlwZSkge1xuICByZXR1cm4ge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFR5cGVkQXJyYXkgQ29uc3RydWN0b3JzXG4gICAgJ1tbUHJvdG9dXSc6ICclVHlwZWRBcnJheSUnLFxuICAgIEJZVEVTX1BFUl9FTEVNRU5UOiAnbnVtYmVyJyxcbiAgICBwcm90b3R5cGV9O1xuXG4gfVxuXG5mdW5jdGlvbiBUeXBlZEFycmF5UHJvdG90eXBlKGNvbnN0cnVjdG9yKSB7XG4gIHJldHVybiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgVHlwZWRBcnJheSBQcm90b3R5cGUgT2JqZWN0c1xuICAgICdbW1Byb3RvXV0nOiAnJVR5cGVkQXJyYXlQcm90b3R5cGUlJyxcbiAgICBCWVRFU19QRVJfRUxFTUVOVDogJ251bWJlcicsXG4gICAgY29uc3RydWN0b3J9O1xuXG4gfVxuXG4vLyBXaXRob3V0IE1hdGgucmFuZG9tXG5jb25zdCBTaGFyZWRNYXRoPSAge1xuICBFOiAnbnVtYmVyJyxcbiAgTE4xMDogJ251bWJlcicsXG4gIExOMjogJ251bWJlcicsXG4gIExPRzEwRTogJ251bWJlcicsXG4gIExPRzJFOiAnbnVtYmVyJyxcbiAgUEk6ICdudW1iZXInLFxuICBTUVJUMV8yOiAnbnVtYmVyJyxcbiAgU1FSVDI6ICdudW1iZXInLFxuICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnLFxuICBhYnM6IGZuLFxuICBhY29zOiBmbixcbiAgYWNvc2g6IGZuLFxuICBhc2luOiBmbixcbiAgYXNpbmg6IGZuLFxuICBhdGFuOiBmbixcbiAgYXRhbmg6IGZuLFxuICBhdGFuMjogZm4sXG4gIGNicnQ6IGZuLFxuICBjZWlsOiBmbixcbiAgY2x6MzI6IGZuLFxuICBjb3M6IGZuLFxuICBjb3NoOiBmbixcbiAgZXhwOiBmbixcbiAgZXhwbTE6IGZuLFxuICBmbG9vcjogZm4sXG4gIGZyb3VuZDogZm4sXG4gIGh5cG90OiBmbixcbiAgaW11bDogZm4sXG4gIGxvZzogZm4sXG4gIGxvZzFwOiBmbixcbiAgbG9nMTA6IGZuLFxuICBsb2cyOiBmbixcbiAgbWF4OiBmbixcbiAgbWluOiBmbixcbiAgcG93OiBmbixcbiAgcm91bmQ6IGZuLFxuICBzaWduOiBmbixcbiAgc2luOiBmbixcbiAgc2luaDogZm4sXG4gIHNxcnQ6IGZuLFxuICB0YW46IGZuLFxuICB0YW5oOiBmbixcbiAgdHJ1bmM6IGZuLFxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICBpZGl2OiBmYWxzZSxcbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgaWRpdm1vZDogZmFsc2UsXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gIGltb2Q6IGZhbHNlLFxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICBpbXVsZGl2OiBmYWxzZSxcbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgaXJlbTogZmFsc2UsXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gIG1vZDogZmFsc2V9O1xuXG5cbmNvbnN0ICAgICAgICB3aGl0ZWxpc3Q9ICB7XG4gIC8vIEVDTUEgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjJcblxuICAvLyBUaGUgaW50cmluc2ljcyBvYmplY3QgaGFzIG5vIHByb3RvdHlwZSB0byBhdm9pZCBjb25mbGljdHMuXG4gICdbW1Byb3RvXV0nOiBudWxsLFxuXG4gIC8vICVUaHJvd1R5cGVFcnJvciVcbiAgJyVUaHJvd1R5cGVFcnJvciUnOiBmbixcblxuICAvLyAqKiogVGhlIEdsb2JhbCBPYmplY3RcblxuICAvLyAqKiogVmFsdWUgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuICBJbmZpbml0eTogJ251bWJlcicsXG4gIE5hTjogJ251bWJlcicsXG4gIHVuZGVmaW5lZDogJ3VuZGVmaW5lZCcsXG5cbiAgLy8gKioqIEZ1bmN0aW9uIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICAvLyBldmFsXG4gICclVW5pcXVlRXZhbCUnOiBmbixcbiAgaXNGaW5pdGU6IGZuLFxuICBpc05hTjogZm4sXG4gIHBhcnNlRmxvYXQ6IGZuLFxuICBwYXJzZUludDogZm4sXG4gIGRlY29kZVVSSTogZm4sXG4gIGRlY29kZVVSSUNvbXBvbmVudDogZm4sXG4gIGVuY29kZVVSSTogZm4sXG4gIGVuY29kZVVSSUNvbXBvbmVudDogZm4sXG5cbiAgLy8gKioqIEZ1bmRhbWVudGFsIE9iamVjdHNcblxuICBPYmplY3Q6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBPYmplY3QgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGFzc2lnbjogZm4sXG4gICAgY3JlYXRlOiBmbixcbiAgICBkZWZpbmVQcm9wZXJ0aWVzOiBmbixcbiAgICBkZWZpbmVQcm9wZXJ0eTogZm4sXG4gICAgZW50cmllczogZm4sXG4gICAgZnJlZXplOiBmbixcbiAgICBmcm9tRW50cmllczogZm4sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6IGZuLFxuICAgIGdldFByb3RvdHlwZU9mOiBmbixcbiAgICBoYXNPd246IGZuLFxuICAgIGlzOiBmbixcbiAgICBpc0V4dGVuc2libGU6IGZuLFxuICAgIGlzRnJvemVuOiBmbixcbiAgICBpc1NlYWxlZDogZm4sXG4gICAga2V5czogZm4sXG4gICAgcHJldmVudEV4dGVuc2lvbnM6IGZuLFxuICAgIHByb3RvdHlwZTogJyVPYmplY3RQcm90b3R5cGUlJyxcbiAgICBzZWFsOiBmbixcbiAgICBzZXRQcm90b3R5cGVPZjogZm4sXG4gICAgdmFsdWVzOiBmbn0sXG5cblxuICAnJU9iamVjdFByb3RvdHlwZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgT2JqZWN0IFByb3RvdHlwZSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogbnVsbCxcbiAgICBjb25zdHJ1Y3RvcjogJ09iamVjdCcsXG4gICAgaGFzT3duUHJvcGVydHk6IGZuLFxuICAgIGlzUHJvdG90eXBlT2Y6IGZuLFxuICAgIHByb3BlcnR5SXNFbnVtZXJhYmxlOiBmbixcbiAgICB0b0xvY2FsZVN0cmluZzogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHZhbHVlT2Y6IGZuLFxuXG4gICAgLy8gQW5uZXggQjogQWRkaXRpb25hbCBQcm9wZXJ0aWVzIG9mIHRoZSBPYmplY3QucHJvdG90eXBlIE9iamVjdFxuXG4gICAgLy8gU2VlIG5vdGUgaW4gaGVhZGVyIGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gW1tQcm90b11dIGFuZCAtLXByb3RvLS1cbiAgICAvLyBzcGVjaWFsIG5vdGF0aW9ucy5cbiAgICAnLS1wcm90by0tJzogYWNjZXNzb3IsXG4gICAgX19kZWZpbmVHZXR0ZXJfXzogZm4sXG4gICAgX19kZWZpbmVTZXR0ZXJfXzogZm4sXG4gICAgX19sb29rdXBHZXR0ZXJfXzogZm4sXG4gICAgX19sb29rdXBTZXR0ZXJfXzogZm59LFxuXG5cbiAgJyVVbmlxdWVGdW5jdGlvbiUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgRnVuY3Rpb24gQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVGdW5jdGlvblByb3RvdHlwZSUnfSxcblxuXG4gICclSW5lcnRGdW5jdGlvbiUnOiB7XG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclRnVuY3Rpb25Qcm90b3R5cGUlJ30sXG5cblxuICAnJUZ1bmN0aW9uUHJvdG90eXBlJSc6IHtcbiAgICBhcHBseTogZm4sXG4gICAgYmluZDogZm4sXG4gICAgY2FsbDogZm4sXG4gICAgY29uc3RydWN0b3I6ICclSW5lcnRGdW5jdGlvbiUnLFxuICAgIHRvU3RyaW5nOiBmbixcbiAgICAnQEBoYXNJbnN0YW5jZSc6IGZuLFxuICAgIC8vIHByb3Bvc2VkIGJ1dCBub3QgeWV0IHN0ZCB5ZXQuIFRvIGJlIHJlbW92ZWQgaWYgdGhlcmVcbiAgICBjYWxsZXI6IGZhbHNlLFxuICAgIC8vIHByb3Bvc2VkIGJ1dCBub3QgeWV0IHN0ZCB5ZXQuIFRvIGJlIHJlbW92ZWQgaWYgdGhlcmVcbiAgICBhcmd1bWVudHM6IGZhbHNlfSxcblxuXG4gIEJvb2xlYW46IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBCb29sZWFuIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclQm9vbGVhblByb3RvdHlwZSUnfSxcblxuXG4gICclQm9vbGVhblByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6ICdCb29sZWFuJyxcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdmFsdWVPZjogZm59LFxuXG5cbiAgU3ltYm9sOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgU3ltYm9sIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBhc3luY0l0ZXJhdG9yOiAnc3ltYm9sJyxcbiAgICBmb3I6IGZuLFxuICAgIGhhc0luc3RhbmNlOiAnc3ltYm9sJyxcbiAgICBpc0NvbmNhdFNwcmVhZGFibGU6ICdzeW1ib2wnLFxuICAgIGl0ZXJhdG9yOiAnc3ltYm9sJyxcbiAgICBrZXlGb3I6IGZuLFxuICAgIG1hdGNoOiAnc3ltYm9sJyxcbiAgICBtYXRjaEFsbDogJ3N5bWJvbCcsXG4gICAgcHJvdG90eXBlOiAnJVN5bWJvbFByb3RvdHlwZSUnLFxuICAgIHJlcGxhY2U6ICdzeW1ib2wnLFxuICAgIHNlYXJjaDogJ3N5bWJvbCcsXG4gICAgc3BlY2llczogJ3N5bWJvbCcsXG4gICAgc3BsaXQ6ICdzeW1ib2wnLFxuICAgIHRvUHJpbWl0aXZlOiAnc3ltYm9sJyxcbiAgICB0b1N0cmluZ1RhZzogJ3N5bWJvbCcsXG4gICAgdW5zY29wYWJsZXM6ICdzeW1ib2wnfSxcblxuXG4gICclU3ltYm9sUHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBTeW1ib2wgUHJvdG90eXBlIE9iamVjdFxuICAgIGNvbnN0cnVjdG9yOiAnU3ltYm9sJyxcbiAgICBkZXNjcmlwdGlvbjogZ2V0dGVyLFxuICAgIHRvU3RyaW5nOiBmbixcbiAgICB2YWx1ZU9mOiBmbixcbiAgICAnQEB0b1ByaW1pdGl2ZSc6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgJyVJbml0aWFsRXJyb3IlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEVycm9yIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclRXJyb3JQcm90b3R5cGUlJyxcbiAgICAvLyBOb24gc3RhbmRhcmQsIHY4IG9ubHksIHVzZWQgYnkgdGFwXG4gICAgY2FwdHVyZVN0YWNrVHJhY2U6IGZuLFxuICAgIC8vIE5vbiBzdGFuZGFyZCwgdjggb25seSwgdXNlZCBieSB0YXAsIHRhbWVkIHRvIGFjY2Vzc29yXG4gICAgc3RhY2tUcmFjZUxpbWl0OiBhY2Nlc3NvcixcbiAgICAvLyBOb24gc3RhbmRhcmQsIHY4IG9ubHksIHVzZWQgYnkgc2V2ZXJhbCwgdGFtZWQgdG8gYWNjZXNzb3JcbiAgICBwcmVwYXJlU3RhY2tUcmFjZTogYWNjZXNzb3J9LFxuXG5cbiAgJyVTaGFyZWRFcnJvciUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgRXJyb3IgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVFcnJvclByb3RvdHlwZSUnLFxuICAgIC8vIE5vbiBzdGFuZGFyZCwgdjggb25seSwgdXNlZCBieSB0YXBcbiAgICBjYXB0dXJlU3RhY2tUcmFjZTogZm4sXG4gICAgLy8gTm9uIHN0YW5kYXJkLCB2OCBvbmx5LCB1c2VkIGJ5IHRhcCwgdGFtZWQgdG8gYWNjZXNzb3JcbiAgICBzdGFja1RyYWNlTGltaXQ6IGFjY2Vzc29yLFxuICAgIC8vIE5vbiBzdGFuZGFyZCwgdjggb25seSwgdXNlZCBieSBzZXZlcmFsLCB0YW1lZCB0byBhY2Nlc3NvclxuICAgIHByZXBhcmVTdGFja1RyYWNlOiBhY2Nlc3Nvcn0sXG5cblxuICAnJUVycm9yUHJvdG90eXBlJSc6IHtcbiAgICBjb25zdHJ1Y3RvcjogJyVTaGFyZWRFcnJvciUnLFxuICAgIG1lc3NhZ2U6ICdzdHJpbmcnLFxuICAgIG5hbWU6ICdzdHJpbmcnLFxuICAgIHRvU3RyaW5nOiBmbixcbiAgICAvLyBwcm9wb3NlZCBkZS1mYWN0bywgYXNzdW1lZCBUT0RPXG4gICAgLy8gU2VlbiBvbiBGRiBOaWdodGx5IDg4LjBhMVxuICAgIGF0OiBmYWxzZSxcbiAgICAvLyBTZWVuIG9uIEZGIGFuZCBYU1xuICAgIHN0YWNrOiBhY2Nlc3NvcixcbiAgICAvLyBTdXBlcmZsdW91c2x5IHByZXNlbnQgaW4gc29tZSB2ZXJzaW9ucyBvZiBWOC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9ub3Rlcy9ibG9iL21hc3Rlci9tZWV0aW5ncy8yMDIxLTEwL29jdC0yNi5tZCM6fjp0ZXh0PUhvd2V2ZXIlMkMlMjBDaHJvbWUlMjA5MyxhbmQlMjBub2RlJTIwMTYuMTEuXG4gICAgY2F1c2U6IGZhbHNlfSxcblxuXG4gIC8vIE5hdGl2ZUVycm9yXG5cbiAgRXZhbEVycm9yOiBOYXRpdmVFcnJvcignJUV2YWxFcnJvclByb3RvdHlwZSUnKSxcbiAgUmFuZ2VFcnJvcjogTmF0aXZlRXJyb3IoJyVSYW5nZUVycm9yUHJvdG90eXBlJScpLFxuICBSZWZlcmVuY2VFcnJvcjogTmF0aXZlRXJyb3IoJyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnKSxcbiAgU3ludGF4RXJyb3I6IE5hdGl2ZUVycm9yKCclU3ludGF4RXJyb3JQcm90b3R5cGUlJyksXG4gIFR5cGVFcnJvcjogTmF0aXZlRXJyb3IoJyVUeXBlRXJyb3JQcm90b3R5cGUlJyksXG4gIFVSSUVycm9yOiBOYXRpdmVFcnJvcignJVVSSUVycm9yUHJvdG90eXBlJScpLFxuXG4gICclRXZhbEVycm9yUHJvdG90eXBlJSc6IE5hdGl2ZUVycm9yUHJvdG90eXBlKCdFdmFsRXJyb3InKSxcbiAgJyVSYW5nZUVycm9yUHJvdG90eXBlJSc6IE5hdGl2ZUVycm9yUHJvdG90eXBlKCdSYW5nZUVycm9yJyksXG4gICclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzogTmF0aXZlRXJyb3JQcm90b3R5cGUoJ1JlZmVyZW5jZUVycm9yJyksXG4gICclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogTmF0aXZlRXJyb3JQcm90b3R5cGUoJ1N5bnRheEVycm9yJyksXG4gICclVHlwZUVycm9yUHJvdG90eXBlJSc6IE5hdGl2ZUVycm9yUHJvdG90eXBlKCdUeXBlRXJyb3InKSxcbiAgJyVVUklFcnJvclByb3RvdHlwZSUnOiBOYXRpdmVFcnJvclByb3RvdHlwZSgnVVJJRXJyb3InKSxcblxuICAvLyAqKiogTnVtYmVycyBhbmQgRGF0ZXNcblxuICBOdW1iZXI6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBOdW1iZXIgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIEVQU0lMT046ICdudW1iZXInLFxuICAgIGlzRmluaXRlOiBmbixcbiAgICBpc0ludGVnZXI6IGZuLFxuICAgIGlzTmFOOiBmbixcbiAgICBpc1NhZmVJbnRlZ2VyOiBmbixcbiAgICBNQVhfU0FGRV9JTlRFR0VSOiAnbnVtYmVyJyxcbiAgICBNQVhfVkFMVUU6ICdudW1iZXInLFxuICAgIE1JTl9TQUZFX0lOVEVHRVI6ICdudW1iZXInLFxuICAgIE1JTl9WQUxVRTogJ251bWJlcicsXG4gICAgTmFOOiAnbnVtYmVyJyxcbiAgICBORUdBVElWRV9JTkZJTklUWTogJ251bWJlcicsXG4gICAgcGFyc2VGbG9hdDogZm4sXG4gICAgcGFyc2VJbnQ6IGZuLFxuICAgIFBPU0lUSVZFX0lORklOSVRZOiAnbnVtYmVyJyxcbiAgICBwcm90b3R5cGU6ICclTnVtYmVyUHJvdG90eXBlJSd9LFxuXG5cbiAgJyVOdW1iZXJQcm90b3R5cGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIE51bWJlciBQcm90b3R5cGUgT2JqZWN0XG4gICAgY29uc3RydWN0b3I6ICdOdW1iZXInLFxuICAgIHRvRXhwb25lbnRpYWw6IGZuLFxuICAgIHRvRml4ZWQ6IGZuLFxuICAgIHRvTG9jYWxlU3RyaW5nOiBmbixcbiAgICB0b1ByZWNpc2lvbjogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHZhbHVlT2Y6IGZufSxcblxuXG4gIEJpZ0ludDoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEJpZ0ludCBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgYXNJbnROOiBmbixcbiAgICBhc1VpbnROOiBmbixcbiAgICBwcm90b3R5cGU6ICclQmlnSW50UHJvdG90eXBlJScsXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgICBiaXRMZW5ndGg6IGZhbHNlLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gICAgZnJvbUFycmF5QnVmZmVyOiBmYWxzZX0sXG5cblxuICAnJUJpZ0ludFByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6ICdCaWdJbnQnLFxuICAgIHRvTG9jYWxlU3RyaW5nOiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdmFsdWVPZjogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAnJUluaXRpYWxNYXRoJSc6IHtcbiAgICAuLi5TaGFyZWRNYXRoLFxuICAgIC8vIHJhbmRvbSBpcyBzdGFuZGFyZCBidXQgb21pdHRlZCBmcm9tIFNoYXJlZE1hdGhcbiAgICByYW5kb206IGZufSxcblxuXG4gICclU2hhcmVkTWF0aCUnOiBTaGFyZWRNYXRoLFxuXG4gICclSW5pdGlhbERhdGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIERhdGUgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIG5vdzogZm4sXG4gICAgcGFyc2U6IGZuLFxuICAgIHByb3RvdHlwZTogJyVEYXRlUHJvdG90eXBlJScsXG4gICAgVVRDOiBmbn0sXG5cblxuICAnJVNoYXJlZERhdGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIERhdGUgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIG5vdzogZm4sXG4gICAgcGFyc2U6IGZuLFxuICAgIHByb3RvdHlwZTogJyVEYXRlUHJvdG90eXBlJScsXG4gICAgVVRDOiBmbn0sXG5cblxuICAnJURhdGVQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiAnJVNoYXJlZERhdGUlJyxcbiAgICBnZXREYXRlOiBmbixcbiAgICBnZXREYXk6IGZuLFxuICAgIGdldEZ1bGxZZWFyOiBmbixcbiAgICBnZXRIb3VyczogZm4sXG4gICAgZ2V0TWlsbGlzZWNvbmRzOiBmbixcbiAgICBnZXRNaW51dGVzOiBmbixcbiAgICBnZXRNb250aDogZm4sXG4gICAgZ2V0U2Vjb25kczogZm4sXG4gICAgZ2V0VGltZTogZm4sXG4gICAgZ2V0VGltZXpvbmVPZmZzZXQ6IGZuLFxuICAgIGdldFVUQ0RhdGU6IGZuLFxuICAgIGdldFVUQ0RheTogZm4sXG4gICAgZ2V0VVRDRnVsbFllYXI6IGZuLFxuICAgIGdldFVUQ0hvdXJzOiBmbixcbiAgICBnZXRVVENNaWxsaXNlY29uZHM6IGZuLFxuICAgIGdldFVUQ01pbnV0ZXM6IGZuLFxuICAgIGdldFVUQ01vbnRoOiBmbixcbiAgICBnZXRVVENTZWNvbmRzOiBmbixcbiAgICBzZXREYXRlOiBmbixcbiAgICBzZXRGdWxsWWVhcjogZm4sXG4gICAgc2V0SG91cnM6IGZuLFxuICAgIHNldE1pbGxpc2Vjb25kczogZm4sXG4gICAgc2V0TWludXRlczogZm4sXG4gICAgc2V0TW9udGg6IGZuLFxuICAgIHNldFNlY29uZHM6IGZuLFxuICAgIHNldFRpbWU6IGZuLFxuICAgIHNldFVUQ0RhdGU6IGZuLFxuICAgIHNldFVUQ0Z1bGxZZWFyOiBmbixcbiAgICBzZXRVVENIb3VyczogZm4sXG4gICAgc2V0VVRDTWlsbGlzZWNvbmRzOiBmbixcbiAgICBzZXRVVENNaW51dGVzOiBmbixcbiAgICBzZXRVVENNb250aDogZm4sXG4gICAgc2V0VVRDU2Vjb25kczogZm4sXG4gICAgdG9EYXRlU3RyaW5nOiBmbixcbiAgICB0b0lTT1N0cmluZzogZm4sXG4gICAgdG9KU09OOiBmbixcbiAgICB0b0xvY2FsZURhdGVTdHJpbmc6IGZuLFxuICAgIHRvTG9jYWxlU3RyaW5nOiBmbixcbiAgICB0b0xvY2FsZVRpbWVTdHJpbmc6IGZuLFxuICAgIHRvU3RyaW5nOiBmbixcbiAgICB0b1RpbWVTdHJpbmc6IGZuLFxuICAgIHRvVVRDU3RyaW5nOiBmbixcbiAgICB2YWx1ZU9mOiBmbixcbiAgICAnQEB0b1ByaW1pdGl2ZSc6IGZuLFxuXG4gICAgLy8gQW5uZXggQjogQWRkaXRpb25hbCBQcm9wZXJ0aWVzIG9mIHRoZSBEYXRlLnByb3RvdHlwZSBPYmplY3RcbiAgICBnZXRZZWFyOiBmbixcbiAgICBzZXRZZWFyOiBmbixcbiAgICB0b0dNVFN0cmluZzogZm59LFxuXG5cbiAgLy8gVGV4dCBQcm9jZXNzaW5nXG5cbiAgU3RyaW5nOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgU3RyaW5nIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBmcm9tQ2hhckNvZGU6IGZuLFxuICAgIGZyb21Db2RlUG9pbnQ6IGZuLFxuICAgIHByb3RvdHlwZTogJyVTdHJpbmdQcm90b3R5cGUlJyxcbiAgICByYXc6IGZuLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gICAgZnJvbUFycmF5QnVmZmVyOiBmYWxzZX0sXG5cblxuICAnJVN0cmluZ1Byb3RvdHlwZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgU3RyaW5nIFByb3RvdHlwZSBPYmplY3RcbiAgICBsZW5ndGg6ICdudW1iZXInLFxuICAgIGF0OiBmbixcbiAgICBjaGFyQXQ6IGZuLFxuICAgIGNoYXJDb2RlQXQ6IGZuLFxuICAgIGNvZGVQb2ludEF0OiBmbixcbiAgICBjb25jYXQ6IGZuLFxuICAgIGNvbnN0cnVjdG9yOiAnU3RyaW5nJyxcbiAgICBlbmRzV2l0aDogZm4sXG4gICAgaW5jbHVkZXM6IGZuLFxuICAgIGluZGV4T2Y6IGZuLFxuICAgIGxhc3RJbmRleE9mOiBmbixcbiAgICBsb2NhbGVDb21wYXJlOiBmbixcbiAgICBtYXRjaDogZm4sXG4gICAgbWF0Y2hBbGw6IGZuLFxuICAgIG5vcm1hbGl6ZTogZm4sXG4gICAgcGFkRW5kOiBmbixcbiAgICBwYWRTdGFydDogZm4sXG4gICAgcmVwZWF0OiBmbixcbiAgICByZXBsYWNlOiBmbixcbiAgICByZXBsYWNlQWxsOiBmbiwgLy8gRVMyMDIxXG4gICAgc2VhcmNoOiBmbixcbiAgICBzbGljZTogZm4sXG4gICAgc3BsaXQ6IGZuLFxuICAgIHN0YXJ0c1dpdGg6IGZuLFxuICAgIHN1YnN0cmluZzogZm4sXG4gICAgdG9Mb2NhbGVMb3dlckNhc2U6IGZuLFxuICAgIHRvTG9jYWxlVXBwZXJDYXNlOiBmbixcbiAgICB0b0xvd2VyQ2FzZTogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHRvVXBwZXJDYXNlOiBmbixcbiAgICB0cmltOiBmbixcbiAgICB0cmltRW5kOiBmbixcbiAgICB0cmltU3RhcnQ6IGZuLFxuICAgIHZhbHVlT2Y6IGZuLFxuICAgICdAQGl0ZXJhdG9yJzogZm4sXG5cbiAgICAvLyBBbm5leCBCOiBBZGRpdGlvbmFsIFByb3BlcnRpZXMgb2YgdGhlIFN0cmluZy5wcm90b3R5cGUgT2JqZWN0XG4gICAgc3Vic3RyOiBmbixcbiAgICBhbmNob3I6IGZuLFxuICAgIGJpZzogZm4sXG4gICAgYmxpbms6IGZuLFxuICAgIGJvbGQ6IGZuLFxuICAgIGZpeGVkOiBmbixcbiAgICBmb250Y29sb3I6IGZuLFxuICAgIGZvbnRzaXplOiBmbixcbiAgICBpdGFsaWNzOiBmbixcbiAgICBsaW5rOiBmbixcbiAgICBzbWFsbDogZm4sXG4gICAgc3RyaWtlOiBmbixcbiAgICBzdWI6IGZuLFxuICAgIHN1cDogZm4sXG4gICAgdHJpbUxlZnQ6IGZuLFxuICAgIHRyaW1SaWdodDogZm4sXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgICBjb21wYXJlOiBmYWxzZX0sXG5cblxuICAnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICAnW1tQcm90b11dJzogJyVJdGVyYXRvclByb3RvdHlwZSUnLFxuICAgIG5leHQ6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgJyVJbml0aWFsUmVnRXhwJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBSZWdFeHAgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVSZWdFeHBQcm90b3R5cGUlJyxcbiAgICAnQEBzcGVjaWVzJzogZ2V0dGVyLFxuXG4gICAgLy8gVGhlIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJlZ2V4cC1sZWdhY3ktZmVhdHVyZXNcbiAgICAvLyBhcmUgYWxsIG9wdGlvbmFsLCB1bnNhZmUsIGFuZCBvbWl0dGVkXG4gICAgaW5wdXQ6IGZhbHNlLFxuICAgICRfOiBmYWxzZSxcbiAgICBsYXN0TWF0Y2g6IGZhbHNlLFxuICAgICckJic6IGZhbHNlLFxuICAgIGxhc3RQYXJlbjogZmFsc2UsXG4gICAgJyQrJzogZmFsc2UsXG4gICAgbGVmdENvbnRleHQ6IGZhbHNlLFxuICAgICckYCc6IGZhbHNlLFxuICAgIHJpZ2h0Q29udGV4dDogZmFsc2UsXG4gICAgXCIkJ1wiOiBmYWxzZSxcbiAgICAkMTogZmFsc2UsXG4gICAgJDI6IGZhbHNlLFxuICAgICQzOiBmYWxzZSxcbiAgICAkNDogZmFsc2UsXG4gICAgJDU6IGZhbHNlLFxuICAgICQ2OiBmYWxzZSxcbiAgICAkNzogZmFsc2UsXG4gICAgJDg6IGZhbHNlLFxuICAgICQ5OiBmYWxzZX0sXG5cblxuICAnJVNoYXJlZFJlZ0V4cCUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgUmVnRXhwIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclUmVnRXhwUHJvdG90eXBlJScsXG4gICAgJ0BAc3BlY2llcyc6IGdldHRlcn0sXG5cblxuICAnJVJlZ0V4cFByb3RvdHlwZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgUmVnRXhwIFByb3RvdHlwZSBPYmplY3RcbiAgICBjb25zdHJ1Y3RvcjogJyVTaGFyZWRSZWdFeHAlJyxcbiAgICBleGVjOiBmbixcbiAgICBkb3RBbGw6IGdldHRlcixcbiAgICBmbGFnczogZ2V0dGVyLFxuICAgIGdsb2JhbDogZ2V0dGVyLFxuICAgIGlnbm9yZUNhc2U6IGdldHRlcixcbiAgICAnQEBtYXRjaCc6IGZuLFxuICAgICdAQG1hdGNoQWxsJzogZm4sXG4gICAgbXVsdGlsaW5lOiBnZXR0ZXIsXG4gICAgJ0BAcmVwbGFjZSc6IGZuLFxuICAgICdAQHNlYXJjaCc6IGZuLFxuICAgIHNvdXJjZTogZ2V0dGVyLFxuICAgICdAQHNwbGl0JzogZm4sXG4gICAgc3RpY2t5OiBnZXR0ZXIsXG4gICAgdGVzdDogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHVuaWNvZGU6IGdldHRlcixcblxuICAgIC8vIEFubmV4IEI6IEFkZGl0aW9uYWwgUHJvcGVydGllcyBvZiB0aGUgUmVnRXhwLnByb3RvdHlwZSBPYmplY3RcbiAgICBjb21waWxlOiBmYWxzZSwgLy8gVU5TQUZFIGFuZCBzdXBwcmVzc2VkLlxuICAgIC8vIFNlZW4gb24gRkYgTmlnaHRseSA4OC4wYTEsIENocm9tZSBDYW5hcnkgOTEuMC40NDQ2LjAsXG4gICAgLy8gU2FmYXJpIFRlY2ggUHJldmlldyBSZWxlYXNlIDEyMiAoU2FmYXJpIDE0LjIsIFdlYktpdCAxNjYxMi4xLjYuMilcbiAgICBoYXNJbmRpY2VzOiBmYWxzZX0sXG5cblxuICAnJVJlZ0V4cFN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICAvLyBUaGUgJVJlZ0V4cFN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVJdGVyYXRvclByb3RvdHlwZSUnLFxuICAgIG5leHQ6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgLy8gSW5kZXhlZCBDb2xsZWN0aW9uc1xuXG4gIEFycmF5OiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQXJyYXkgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGZyb206IGZuLFxuICAgIGlzQXJyYXk6IGZuLFxuICAgIG9mOiBmbixcbiAgICBwcm90b3R5cGU6ICclQXJyYXlQcm90b3R5cGUlJyxcbiAgICAnQEBzcGVjaWVzJzogZ2V0dGVyLFxuXG4gICAgLy8gU3RhZ2UgMzpcbiAgICAvLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtcmVsYXRpdmUtaW5kZXhpbmctbWV0aG9kL1xuICAgIGF0OiBmbn0sXG5cblxuICAnJUFycmF5UHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBBcnJheSBQcm90b3R5cGUgT2JqZWN0XG4gICAgYXQ6IGZuLFxuICAgIGxlbmd0aDogJ251bWJlcicsXG4gICAgY29uY2F0OiBmbixcbiAgICBjb25zdHJ1Y3RvcjogJ0FycmF5JyxcbiAgICBjb3B5V2l0aGluOiBmbixcbiAgICBlbnRyaWVzOiBmbixcbiAgICBldmVyeTogZm4sXG4gICAgZmlsbDogZm4sXG4gICAgZmlsdGVyOiBmbixcbiAgICBmaW5kOiBmbixcbiAgICBmaW5kSW5kZXg6IGZuLFxuICAgIGZsYXQ6IGZuLFxuICAgIGZsYXRNYXA6IGZuLFxuICAgIGZvckVhY2g6IGZuLFxuICAgIGluY2x1ZGVzOiBmbixcbiAgICBpbmRleE9mOiBmbixcbiAgICBqb2luOiBmbixcbiAgICBrZXlzOiBmbixcbiAgICBsYXN0SW5kZXhPZjogZm4sXG4gICAgbWFwOiBmbixcbiAgICBwb3A6IGZuLFxuICAgIHB1c2g6IGZuLFxuICAgIHJlZHVjZTogZm4sXG4gICAgcmVkdWNlUmlnaHQ6IGZuLFxuICAgIHJldmVyc2U6IGZuLFxuICAgIHNoaWZ0OiBmbixcbiAgICBzbGljZTogZm4sXG4gICAgc29tZTogZm4sXG4gICAgc29ydDogZm4sXG4gICAgc3BsaWNlOiBmbixcbiAgICB0b0xvY2FsZVN0cmluZzogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHVuc2hpZnQ6IGZuLFxuICAgIHZhbHVlczogZm4sXG4gICAgJ0BAaXRlcmF0b3InOiBmbixcbiAgICAnQEB1bnNjb3BhYmxlcyc6IHtcbiAgICAgICdbW1Byb3RvXV0nOiBudWxsLFxuICAgICAgY29weVdpdGhpbjogJ2Jvb2xlYW4nLFxuICAgICAgZW50cmllczogJ2Jvb2xlYW4nLFxuICAgICAgZmlsbDogJ2Jvb2xlYW4nLFxuICAgICAgZmluZDogJ2Jvb2xlYW4nLFxuICAgICAgZmluZEluZGV4OiAnYm9vbGVhbicsXG4gICAgICBmbGF0OiAnYm9vbGVhbicsXG4gICAgICBmbGF0TWFwOiAnYm9vbGVhbicsXG4gICAgICBpbmNsdWRlczogJ2Jvb2xlYW4nLFxuICAgICAga2V5czogJ2Jvb2xlYW4nLFxuICAgICAgdmFsdWVzOiAnYm9vbGVhbicsXG4gICAgICAvLyBGYWlsZWQgdGMzOSBwcm9wb3NhbFxuICAgICAgLy8gU2VlbiBvbiBGRiBOaWdodGx5IDg4LjBhMVxuICAgICAgYXQ6IGZhbHNlLFxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbmQtZnJvbS1sYXN0XG4gICAgICBmaW5kTGFzdDogJ2Jvb2xlYW4nLFxuICAgICAgZmluZExhc3RJbmRleDogJ2Jvb2xlYW4nfSxcblxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICAgIGZpbmRMYXN0OiBmbixcbiAgICBmaW5kTGFzdEluZGV4OiBmbn0sXG5cblxuICAnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzoge1xuICAgIC8vIFRoZSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclSXRlcmF0b3JQcm90b3R5cGUlJyxcbiAgICBuZXh0OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIC8vICoqKiBUeXBlZEFycmF5IE9iamVjdHNcblxuICAnJVR5cGVkQXJyYXklJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlICVUeXBlZEFycmF5JSBJbnRyaW5zaWMgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBmcm9tOiBmbixcbiAgICBvZjogZm4sXG4gICAgcHJvdG90eXBlOiAnJVR5cGVkQXJyYXlQcm90b3R5cGUlJyxcbiAgICAnQEBzcGVjaWVzJzogZ2V0dGVyfSxcblxuXG4gICclVHlwZWRBcnJheVByb3RvdHlwZSUnOiB7XG4gICAgYXQ6IGZuLFxuICAgIGJ1ZmZlcjogZ2V0dGVyLFxuICAgIGJ5dGVMZW5ndGg6IGdldHRlcixcbiAgICBieXRlT2Zmc2V0OiBnZXR0ZXIsXG4gICAgY29uc3RydWN0b3I6ICclVHlwZWRBcnJheSUnLFxuICAgIGNvcHlXaXRoaW46IGZuLFxuICAgIGVudHJpZXM6IGZuLFxuICAgIGV2ZXJ5OiBmbixcbiAgICBmaWxsOiBmbixcbiAgICBmaWx0ZXI6IGZuLFxuICAgIGZpbmQ6IGZuLFxuICAgIGZpbmRJbmRleDogZm4sXG4gICAgZm9yRWFjaDogZm4sXG4gICAgaW5jbHVkZXM6IGZuLFxuICAgIGluZGV4T2Y6IGZuLFxuICAgIGpvaW46IGZuLFxuICAgIGtleXM6IGZuLFxuICAgIGxhc3RJbmRleE9mOiBmbixcbiAgICBsZW5ndGg6IGdldHRlcixcbiAgICBtYXA6IGZuLFxuICAgIHJlZHVjZTogZm4sXG4gICAgcmVkdWNlUmlnaHQ6IGZuLFxuICAgIHJldmVyc2U6IGZuLFxuICAgIHNldDogZm4sXG4gICAgc2xpY2U6IGZuLFxuICAgIHNvbWU6IGZuLFxuICAgIHNvcnQ6IGZuLFxuICAgIHN1YmFycmF5OiBmbixcbiAgICB0b0xvY2FsZVN0cmluZzogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHZhbHVlczogZm4sXG4gICAgJ0BAaXRlcmF0b3InOiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6IGdldHRlcixcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmluZC1mcm9tLWxhc3RcbiAgICBmaW5kTGFzdDogZm4sXG4gICAgZmluZExhc3RJbmRleDogZm59LFxuXG5cbiAgLy8gVGhlIFR5cGVkQXJyYXkgQ29uc3RydWN0b3JzXG5cbiAgQmlnSW50NjRBcnJheTogVHlwZWRBcnJheSgnJUJpZ0ludDY0QXJyYXlQcm90b3R5cGUlJyksXG4gIEJpZ1VpbnQ2NEFycmF5OiBUeXBlZEFycmF5KCclQmlnVWludDY0QXJyYXlQcm90b3R5cGUlJyksXG4gIEZsb2F0MzJBcnJheTogVHlwZWRBcnJheSgnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnKSxcbiAgRmxvYXQ2NEFycmF5OiBUeXBlZEFycmF5KCclRmxvYXQ2NEFycmF5UHJvdG90eXBlJScpLFxuICBJbnQxNkFycmF5OiBUeXBlZEFycmF5KCclSW50MTZBcnJheVByb3RvdHlwZSUnKSxcbiAgSW50MzJBcnJheTogVHlwZWRBcnJheSgnJUludDMyQXJyYXlQcm90b3R5cGUlJyksXG4gIEludDhBcnJheTogVHlwZWRBcnJheSgnJUludDhBcnJheVByb3RvdHlwZSUnKSxcbiAgVWludDE2QXJyYXk6IFR5cGVkQXJyYXkoJyVVaW50MTZBcnJheVByb3RvdHlwZSUnKSxcbiAgVWludDMyQXJyYXk6IFR5cGVkQXJyYXkoJyVVaW50MzJBcnJheVByb3RvdHlwZSUnKSxcbiAgVWludDhBcnJheTogVHlwZWRBcnJheSgnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJyksXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiBUeXBlZEFycmF5KCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJyksXG5cbiAgJyVCaWdJbnQ2NEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ0JpZ0ludDY0QXJyYXknKSxcbiAgJyVCaWdVaW50NjRBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdCaWdVaW50NjRBcnJheScpLFxuICAnJUZsb2F0MzJBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdGbG9hdDMyQXJyYXknKSxcbiAgJyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheVByb3RvdHlwZSgnRmxvYXQ2NEFycmF5JyksXG4gICclSW50MTZBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdJbnQxNkFycmF5JyksXG4gICclSW50MzJBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdJbnQzMkFycmF5JyksXG4gICclSW50OEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ0ludDhBcnJheScpLFxuICAnJVVpbnQxNkFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ1VpbnQxNkFycmF5JyksXG4gICclVWludDMyQXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheVByb3RvdHlwZSgnVWludDMyQXJyYXknKSxcbiAgJyVVaW50OEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ1VpbnQ4QXJyYXknKSxcbiAgJyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdVaW50OENsYW1wZWRBcnJheScpLFxuXG4gIC8vICoqKiBLZXllZCBDb2xsZWN0aW9uc1xuXG4gIE1hcDoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIE1hcCBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgJ0BAc3BlY2llcyc6IGdldHRlcixcbiAgICBwcm90b3R5cGU6ICclTWFwUHJvdG90eXBlJSd9LFxuXG5cbiAgJyVNYXBQcm90b3R5cGUlJzoge1xuICAgIGNsZWFyOiBmbixcbiAgICBjb25zdHJ1Y3RvcjogJ01hcCcsXG4gICAgZGVsZXRlOiBmbixcbiAgICBlbnRyaWVzOiBmbixcbiAgICBmb3JFYWNoOiBmbixcbiAgICBnZXQ6IGZuLFxuICAgIGhhczogZm4sXG4gICAga2V5czogZm4sXG4gICAgc2V0OiBmbixcbiAgICBzaXplOiBnZXR0ZXIsXG4gICAgdmFsdWVzOiBmbixcbiAgICAnQEBpdGVyYXRvcic6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgJyVNYXBJdGVyYXRvclByb3RvdHlwZSUnOiB7XG4gICAgLy8gVGhlICVNYXBJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclSXRlcmF0b3JQcm90b3R5cGUlJyxcbiAgICBuZXh0OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIFNldDoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFNldCBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcHJvdG90eXBlOiAnJVNldFByb3RvdHlwZSUnLFxuICAgICdAQHNwZWNpZXMnOiBnZXR0ZXJ9LFxuXG5cbiAgJyVTZXRQcm90b3R5cGUlJzoge1xuICAgIGFkZDogZm4sXG4gICAgY2xlYXI6IGZuLFxuICAgIGNvbnN0cnVjdG9yOiAnU2V0JyxcbiAgICBkZWxldGU6IGZuLFxuICAgIGVudHJpZXM6IGZuLFxuICAgIGZvckVhY2g6IGZuLFxuICAgIGhhczogZm4sXG4gICAga2V5czogZm4sXG4gICAgc2l6ZTogZ2V0dGVyLFxuICAgIHZhbHVlczogZm4sXG4gICAgJ0BAaXRlcmF0b3InOiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gICclU2V0SXRlcmF0b3JQcm90b3R5cGUlJzoge1xuICAgIC8vIFRoZSAlU2V0SXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuICAgICdbW1Byb3RvXV0nOiAnJUl0ZXJhdG9yUHJvdG90eXBlJScsXG4gICAgbmV4dDogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICBXZWFrTWFwOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgV2Vha01hcCBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcHJvdG90eXBlOiAnJVdlYWtNYXBQcm90b3R5cGUlJ30sXG5cblxuICAnJVdlYWtNYXBQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiAnV2Vha01hcCcsXG4gICAgZGVsZXRlOiBmbixcbiAgICBnZXQ6IGZuLFxuICAgIGhhczogZm4sXG4gICAgc2V0OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIFdlYWtTZXQ6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBXZWFrU2V0IENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclV2Vha1NldFByb3RvdHlwZSUnfSxcblxuXG4gICclV2Vha1NldFByb3RvdHlwZSUnOiB7XG4gICAgYWRkOiBmbixcbiAgICBjb25zdHJ1Y3RvcjogJ1dlYWtTZXQnLFxuICAgIGRlbGV0ZTogZm4sXG4gICAgaGFzOiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIC8vICoqKiBTdHJ1Y3R1cmVkIERhdGFcblxuICBBcnJheUJ1ZmZlcjoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEFycmF5QnVmZmVyIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBpc1ZpZXc6IGZuLFxuICAgIHByb3RvdHlwZTogJyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnLFxuICAgICdAQHNwZWNpZXMnOiBnZXR0ZXIsXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgICBmcm9tU3RyaW5nOiBmYWxzZSxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICAgIGZyb21CaWdJbnQ6IGZhbHNlfSxcblxuXG4gICclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzoge1xuICAgIGJ5dGVMZW5ndGg6IGdldHRlcixcbiAgICBjb25zdHJ1Y3RvcjogJ0FycmF5QnVmZmVyJyxcbiAgICBzbGljZTogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJyxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICAgIGNvbmNhdDogZmFsc2UsXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXJlc2l6YWJsZWFycmF5YnVmZmVyXG4gICAgdHJhbnNmZXI6IGZuLFxuICAgIHJlc2l6ZTogZm4sXG4gICAgcmVzaXphYmxlOiBnZXR0ZXIsXG4gICAgbWF4Qnl0ZUxlbmd0aDogZ2V0dGVyfSxcblxuXG4gIC8vIFNoYXJlZEFycmF5QnVmZmVyIE9iamVjdHNcbiAgU2hhcmVkQXJyYXlCdWZmZXI6IGZhbHNlLCAvLyBVTlNBRkUgYW5kIHB1cnBvc2VseSBzdXBwcmVzc2VkLlxuICAnJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSc6IGZhbHNlLCAvLyBVTlNBRkUgYW5kIHB1cnBvc2VseSBzdXBwcmVzc2VkLlxuXG4gIERhdGFWaWV3OiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgRGF0YVZpZXcgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIEJZVEVTX1BFUl9FTEVNRU5UOiAnbnVtYmVyJywgLy8gTm9uIHN0ZCBidXQgdW5kZWxldGFibGUgb24gU2FmYXJpLlxuICAgIHByb3RvdHlwZTogJyVEYXRhVmlld1Byb3RvdHlwZSUnfSxcblxuXG4gICclRGF0YVZpZXdQcm90b3R5cGUlJzoge1xuICAgIGJ1ZmZlcjogZ2V0dGVyLFxuICAgIGJ5dGVMZW5ndGg6IGdldHRlcixcbiAgICBieXRlT2Zmc2V0OiBnZXR0ZXIsXG4gICAgY29uc3RydWN0b3I6ICdEYXRhVmlldycsXG4gICAgZ2V0QmlnSW50NjQ6IGZuLFxuICAgIGdldEJpZ1VpbnQ2NDogZm4sXG4gICAgZ2V0RmxvYXQzMjogZm4sXG4gICAgZ2V0RmxvYXQ2NDogZm4sXG4gICAgZ2V0SW50ODogZm4sXG4gICAgZ2V0SW50MTY6IGZuLFxuICAgIGdldEludDMyOiBmbixcbiAgICBnZXRVaW50ODogZm4sXG4gICAgZ2V0VWludDE2OiBmbixcbiAgICBnZXRVaW50MzI6IGZuLFxuICAgIHNldEJpZ0ludDY0OiBmbixcbiAgICBzZXRCaWdVaW50NjQ6IGZuLFxuICAgIHNldEZsb2F0MzI6IGZuLFxuICAgIHNldEZsb2F0NjQ6IGZuLFxuICAgIHNldEludDg6IGZuLFxuICAgIHNldEludDE2OiBmbixcbiAgICBzZXRJbnQzMjogZm4sXG4gICAgc2V0VWludDg6IGZuLFxuICAgIHNldFVpbnQxNjogZm4sXG4gICAgc2V0VWludDMyOiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIC8vIEF0b21pY3NcbiAgQXRvbWljczogZmFsc2UsIC8vIFVOU0FGRSBhbmQgc3VwcHJlc3NlZC5cblxuICBKU09OOiB7XG4gICAgcGFyc2U6IGZuLFxuICAgIHN0cmluZ2lmeTogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAvLyAqKiogQ29udHJvbCBBYnN0cmFjdGlvbiBPYmplY3RzXG5cbiAgJyVJdGVyYXRvclByb3RvdHlwZSUnOiB7XG4gICAgLy8gVGhlICVJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG4gICAgJ0BAaXRlcmF0b3InOiBmbn0sXG5cblxuICAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJzoge1xuICAgIC8vIFRoZSAlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG4gICAgJ0BAYXN5bmNJdGVyYXRvcic6IGZufSxcblxuXG4gICclSW5lcnRHZW5lcmF0b3JGdW5jdGlvbiUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgR2VuZXJhdG9yRnVuY3Rpb24gQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVJbmVydEZ1bmN0aW9uJScsXG4gICAgcHJvdG90eXBlOiAnJUdlbmVyYXRvciUnfSxcblxuXG4gICclR2VuZXJhdG9yJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmF0b3JGdW5jdGlvbiBQcm90b3R5cGUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBjb25zdHJ1Y3RvcjogJyVJbmVydEdlbmVyYXRvckZ1bmN0aW9uJScsXG4gICAgcHJvdG90eXBlOiAnJUdlbmVyYXRvclByb3RvdHlwZSUnLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgJyVJbmVydEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24gQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVJbmVydEZ1bmN0aW9uJScsXG4gICAgcHJvdG90eXBlOiAnJUFzeW5jR2VuZXJhdG9yJSd9LFxuXG5cbiAgJyVBc3luY0dlbmVyYXRvciUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiBQcm90b3R5cGUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBjb25zdHJ1Y3RvcjogJyVJbmVydEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJyxcbiAgICBwcm90b3R5cGU6ICclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJyxcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gICclR2VuZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmF0b3IgUHJvdG90eXBlIE9iamVjdFxuICAgICdbW1Byb3RvXV0nOiAnJUl0ZXJhdG9yUHJvdG90eXBlJScsXG4gICAgY29uc3RydWN0b3I6ICclR2VuZXJhdG9yJScsXG4gICAgbmV4dDogZm4sXG4gICAgcmV0dXJuOiBmbixcbiAgICB0aHJvdzogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBBc3luY0dlbmVyYXRvciBQcm90b3R5cGUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnLFxuICAgIGNvbnN0cnVjdG9yOiAnJUFzeW5jR2VuZXJhdG9yJScsXG4gICAgbmV4dDogZm4sXG4gICAgcmV0dXJuOiBmbixcbiAgICB0aHJvdzogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAvLyBUT0RPOiBUbyBiZSByZXBsYWNlZCB3aXRoIFByb21pc2UuZGVsZWdhdGVcbiAgLy9cbiAgLy8gVGhlIEhhbmRsZWRQcm9taXNlIGdsb2JhbCB2YXJpYWJsZSBzaGltbWVkIGJ5IGBAYWdvcmljL2V2ZW50dWFsLXNlbmQvc2hpbWBcbiAgLy8gaW1wbGVtZW50cyBhbiBpbml0aWFsIHZlcnNpb24gb2YgdGhlIGV2ZW50dWFsIHNlbmQgc3BlY2lmaWNhdGlvbiBhdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZXZlbnR1YWwtc2VuZFxuICAvL1xuICAvLyBXZSB3aWxsIGxpa2VseSBjaGFuZ2UgdGhpcyB0byBhZGQgYSBwcm9wZXJ0eSB0byBQcm9taXNlIGNhbGxlZFxuICAvLyBQcm9taXNlLmRlbGVnYXRlIGFuZCBwdXQgc3RhdGljIG1ldGhvZHMgb24gaXQsIHdoaWNoIHdpbGwgbmVjZXNzaXRhdGVcbiAgLy8gYW5vdGhlciB3aGl0ZWxpc3QgY2hhbmdlIHRvIHVwZGF0ZSB0byB0aGUgY3VycmVudCBwcm9wb3NlZCBzdGFuZGFyZC5cbiAgSGFuZGxlZFByb21pc2U6IHtcbiAgICAnW1tQcm90b11dJzogJ1Byb21pc2UnLFxuICAgIGFwcGx5RnVuY3Rpb246IGZuLFxuICAgIGFwcGx5RnVuY3Rpb25TZW5kT25seTogZm4sXG4gICAgYXBwbHlNZXRob2Q6IGZuLFxuICAgIGFwcGx5TWV0aG9kU2VuZE9ubHk6IGZuLFxuICAgIGdldDogZm4sXG4gICAgZ2V0U2VuZE9ubHk6IGZuLFxuICAgIHByb3RvdHlwZTogJyVQcm9taXNlUHJvdG90eXBlJScsXG4gICAgcmVzb2x2ZTogZm59LFxuXG5cbiAgUHJvbWlzZToge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFByb21pc2UgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGFsbDogZm4sXG4gICAgYWxsU2V0dGxlZDogZm4sXG4gICAgLy8gVG8gdHJhbnNpdGlvbiBmcm9tIGBmYWxzZWAgdG8gYGZuYCBvbmNlIHdlIGFsc28gaGF2ZSBgQWdncmVnYXRlRXJyb3JgXG4gICAgLy8gVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2lzc3Vlcy81NTBcbiAgICBhbnk6IGZhbHNlLCAvLyBFUzIwMjFcbiAgICBwcm90b3R5cGU6ICclUHJvbWlzZVByb3RvdHlwZSUnLFxuICAgIHJhY2U6IGZuLFxuICAgIHJlamVjdDogZm4sXG4gICAgcmVzb2x2ZTogZm4sXG4gICAgJ0BAc3BlY2llcyc6IGdldHRlcn0sXG5cblxuICAnJVByb21pc2VQcm90b3R5cGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFByb21pc2UgUHJvdG90eXBlIE9iamVjdFxuICAgIGNhdGNoOiBmbixcbiAgICBjb25zdHJ1Y3RvcjogJ1Byb21pc2UnLFxuICAgIGZpbmFsbHk6IGZuLFxuICAgIHRoZW46IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZycsXG4gICAgLy8gTm9uLXN0YW5kYXJkLCB1c2VkIGluIG5vZGUgdG8gcHJldmVudCBhc3luY19ob29rcyBmcm9tIGJyZWFraW5nXG4gICAgJ1VuaXF1ZVN5bWJvbChhc3luY19pZF9zeW1ib2wpJzogYWNjZXNzb3IsXG4gICAgJ1VuaXF1ZVN5bWJvbCh0cmlnZ2VyX2FzeW5jX2lkX3N5bWJvbCknOiBhY2Nlc3NvcixcbiAgICAnVW5pcXVlU3ltYm9sKGRlc3Ryb3llZCknOiBhY2Nlc3Nvcn0sXG5cblxuICAnJUluZXJ0QXN5bmNGdW5jdGlvbiUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQXN5bmNGdW5jdGlvbiBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUluZXJ0RnVuY3Rpb24lJyxcbiAgICBwcm90b3R5cGU6ICclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnfSxcblxuXG4gICclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQXN5bmNGdW5jdGlvbiBQcm90b3R5cGUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBjb25zdHJ1Y3RvcjogJyVJbmVydEFzeW5jRnVuY3Rpb24lJyxcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIC8vIFJlZmxlY3Rpb25cblxuICBSZWZsZWN0OiB7XG4gICAgLy8gVGhlIFJlZmxlY3QgT2JqZWN0XG4gICAgLy8gTm90IGEgZnVuY3Rpb24gb2JqZWN0LlxuICAgIGFwcGx5OiBmbixcbiAgICBjb25zdHJ1Y3Q6IGZuLFxuICAgIGRlZmluZVByb3BlcnR5OiBmbixcbiAgICBkZWxldGVQcm9wZXJ0eTogZm4sXG4gICAgZ2V0OiBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZuLFxuICAgIGdldFByb3RvdHlwZU9mOiBmbixcbiAgICBoYXM6IGZuLFxuICAgIGlzRXh0ZW5zaWJsZTogZm4sXG4gICAgb3duS2V5czogZm4sXG4gICAgcHJldmVudEV4dGVuc2lvbnM6IGZuLFxuICAgIHNldDogZm4sXG4gICAgc2V0UHJvdG90eXBlT2Y6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgUHJveHk6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBQcm94eSBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcmV2b2NhYmxlOiBmbn0sXG5cblxuICAvLyBBcHBlbmRpeCBCXG5cbiAgLy8gQW5uZXggQjogQWRkaXRpb25hbCBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgZXNjYXBlOiBmbixcbiAgdW5lc2NhcGU6IGZuLFxuXG4gIC8vIFByb3Bvc2VkXG5cbiAgJyVVbmlxdWVDb21wYXJ0bWVudCUnOiB7XG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclQ29tcGFydG1lbnRQcm90b3R5cGUlJyxcbiAgICB0b1N0cmluZzogZm59LFxuXG5cbiAgJyVJbmVydENvbXBhcnRtZW50JSc6IHtcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVDb21wYXJ0bWVudFByb3RvdHlwZSUnLFxuICAgIHRvU3RyaW5nOiBmbn0sXG5cblxuICAnJUNvbXBhcnRtZW50UHJvdG90eXBlJSc6IHtcbiAgICBjb25zdHJ1Y3RvcjogJyVJbmVydENvbXBhcnRtZW50JScsXG4gICAgZXZhbHVhdGU6IGZuLFxuICAgIGdsb2JhbFRoaXM6IGdldHRlcixcbiAgICBuYW1lOiBnZXR0ZXIsXG4gICAgLy8gU2hvdWxkIHRoaXMgYmUgcHJvcG9zZWQ/XG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIGltcG9ydDogYXN5bmNGbixcbiAgICBsb2FkOiBhc3luY0ZuLFxuICAgIGltcG9ydE5vdzogZm4sXG4gICAgbW9kdWxlOiBmbn0sXG5cblxuICBsb2NrZG93bjogZm4sXG4gIGhhcmRlbjogZm4sXG5cbiAgJyVJbml0aWFsR2V0U3RhY2tTdHJpbmclJzogZm59OyRo4oCNX29uY2Uud2hpdGVsaXN0KHdoaXRlbGlzdCk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzE3XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFR5cGVFcnJvcixhc3NpZ24sY3JlYXRlLGRlZmluZVByb3BlcnR5LGVudHJpZXMsZnJlZXplLG9iamVjdEhhc093blByb3BlcnR5LHVuc2NvcGFibGVzU3ltYm9sLG1ha2VFdmFsRnVuY3Rpb24sbWFrZUZ1bmN0aW9uQ29uc3RydWN0b3IsY29uc3RhbnRQcm9wZXJ0aWVzLHVuaXZlcnNhbFByb3BlcnR5TmFtZXM7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiYXNzaWduXCIsIFskaOKAjV9hID0+IChhc3NpZ24gPSAkaOKAjV9hKV1dLFtcImNyZWF0ZVwiLCBbJGjigI1fYSA9PiAoY3JlYXRlID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJvYmplY3RIYXNPd25Qcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAob2JqZWN0SGFzT3duUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcInVuc2NvcGFibGVzU3ltYm9sXCIsIFskaOKAjV9hID0+ICh1bnNjb3BhYmxlc1N5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2UtZXZhbC1mdW5jdGlvbi5qc1wiLCBbW1wibWFrZUV2YWxGdW5jdGlvblwiLCBbJGjigI1fYSA9PiAobWFrZUV2YWxGdW5jdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2UtZnVuY3Rpb24tY29uc3RydWN0b3IuanNcIiwgW1tcIm1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChtYWtlRnVuY3Rpb25Db25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3doaXRlbGlzdC5qc1wiLCBbW1wiY29uc3RhbnRQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChjb25zdGFudFByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcInVuaXZlcnNhbFByb3BlcnR5TmFtZXNcIiwgWyRo4oCNX2EgPT4gKHVuaXZlcnNhbFByb3BlcnR5TmFtZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBUaGUgaG9zdCdzIG9yZGluYXJ5IGdsb2JhbCBvYmplY3QgaXMgbm90IHByb3ZpZGVkIGJ5IGEgYHdpdGhgIGJsb2NrLCBzb1xuICogYXNzaWduaW5nIHRvIFN5bWJvbC51bnNjb3BhYmxlcyBoYXMgbm8gZWZmZWN0LlxuICogU2luY2UgdGhpcyBzaGltIHVzZXMgYHdpdGhgIGJsb2NrcyB0byBjcmVhdGUgYSBjb25maW5lZCBsZXhpY2FsIHNjb3BlIGZvclxuICogZ3Vlc3QgcHJvZ3JhbXMsIHdlIGNhbm5vdCBlbXVsYXRlIHRoZSBwcm9wZXIgYmVoYXZpb3IuXG4gKiBXaXRoIHRoaXMgc2hpbSwgYXNzaWduaW5nIFN5bWJvbC51bnNjb3BhYmxlcyBjYXVzZXMgdGhlIGdpdmVuIGxleGljYWxcbiAqIG5hbWVzIHRvIGZhbGwgdGhyb3VnaCB0byB0aGUgdGVybWluYWwgc2NvcGUgcHJveHkuXG4gKiBCdXQsIHdlIGNhbiBpbnN0YWxsIHRoaXMgc2V0dGVyIHRvIHByZXZlbnQgYSBwcm9ncmFtIGZyb20gcHJvY2VkaW5nIG9uXG4gKiB0aGlzIGZhbHNlIGFzc3VtcHRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGdsb2JhbE9iamVjdFxuICovXG5jb25zdCAgICAgICAgc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXM9ICAoZ2xvYmFsT2JqZWN0KT0+e1xuICBkZWZpbmVQcm9wZXJ0eShcbiAgICBnbG9iYWxPYmplY3QsXG4gICAgdW5zY29wYWJsZXNTeW1ib2wsXG4gICAgZnJlZXplKFxuICAgICAgYXNzaWduKGNyZWF0ZShudWxsKSwge1xuICAgICAgICBzZXQ6IGZyZWV6ZSgoKT0+ICB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICBgQ2Fubm90IHNldCBTeW1ib2wudW5zY29wYWJsZXMgb2YgYSBDb21wYXJ0bWVudCdzIGdsb2JhbFRoaXNgKTtcblxuICAgICAgICAgfSksXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfSkpKTtcblxuXG5cbiB9O1xuXG4vKipcbiAqIHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcygpXG4gKiBJbml0aWFsaXplcyBhIG5ldyBnbG9iYWwgb2JqZWN0IHVzaW5nIGEgcHJvY2VzcyBzaW1pbGFyIHRvIEVDTUEgc3BlY2lmaWNhdGlvbnNcbiAqIChTZXREZWZhdWx0R2xvYmFsQmluZGluZ3MpLiBUaGlzIHByb2Nlc3MgaXMgc3BsaXQgYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZFxuICogYHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZ2xvYmFsT2JqZWN0XG4gKi8kaOKAjV9vbmNlLnNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzKHNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzKTtcbmNvbnN0ICAgICAgICBzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXM9ICAoZ2xvYmFsT2JqZWN0KT0+e1xuICBmb3IoIGNvbnN0IFtuYW1lLCBjb25zdGFudF1vZiAgZW50cmllcyhjb25zdGFudFByb3BlcnRpZXMpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsT2JqZWN0LCBuYW1lLCB7XG4gICAgICB2YWx1ZTogY29uc3RhbnQsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcblxuICAgfVxuIH07XG5cbi8qKlxuICogc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXMoKVxuICogQ3JlYXRlIG5ldyBnbG9iYWwgb2JqZWN0IHVzaW5nIGEgcHJvY2VzcyBzaW1pbGFyIHRvIEVDTUEgc3BlY2lmaWNhdGlvbnNcbiAqIChwb3J0aW9ucyBvZiBTZXRSZWFsbUdsb2JhbE9iamVjdCBhbmQgU2V0RGVmYXVsdEdsb2JhbEJpbmRpbmdzKS5cbiAqIGBuZXdHbG9iYWxQcm9wZXJ0eU5hbWVzYCBzaG91bGQgYmUgZWl0aGVyIGBpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lc2Agb3JcbiAqIGBzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZ2xvYmFsT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW0xXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW0xLmludHJpbnNpY3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbTEubmV3R2xvYmFsUHJvcGVydHlOYW1lc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW0xLm1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyhPYmplY3QpID0+IHZvaWR9IHBhcmFtMS5tYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvblxuICovJGjigI1fb25jZS5zZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXMoc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzKTtcbmNvbnN0ICAgICAgICBzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcz0gIChcbiAgZ2xvYmFsT2JqZWN0LFxuICB7XG4gICAgaW50cmluc2ljcyxcbiAgICBuZXdHbG9iYWxQcm9wZXJ0eU5hbWVzLFxuICAgIG1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yLFxuICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9ufSk9PlxuXG4gICAgIHtcbiAgZm9yKCBjb25zdCBbbmFtZSwgaW50cmluc2ljTmFtZV1vZiAgZW50cmllcyh1bml2ZXJzYWxQcm9wZXJ0eU5hbWVzKSkge1xuICAgIGlmKCBvYmplY3RIYXNPd25Qcm9wZXJ0eShpbnRyaW5zaWNzLCBpbnRyaW5zaWNOYW1lKSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsT2JqZWN0LCBuYW1lLCB7XG4gICAgICAgIHZhbHVlOiBpbnRyaW5zaWNzW2ludHJpbnNpY05hbWVdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xuXG4gICAgIH1cbiAgIH1cblxuICBmb3IoIGNvbnN0IFtuYW1lLCBpbnRyaW5zaWNOYW1lXW9mICBlbnRyaWVzKG5ld0dsb2JhbFByb3BlcnR5TmFtZXMpKSB7XG4gICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KGludHJpbnNpY3MsIGludHJpbnNpY05hbWUpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsIG5hbWUsIHtcbiAgICAgICAgdmFsdWU6IGludHJpbnNpY3NbaW50cmluc2ljTmFtZV0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSk7XG5cbiAgICAgfVxuICAgfVxuXG4gIGNvbnN0IHBlckNvbXBhcnRtZW50R2xvYmFscz0gIHtcbiAgICBnbG9iYWxUaGlzOiBnbG9iYWxPYmplY3R9O1xuXG5cbiAgcGVyQ29tcGFydG1lbnRHbG9iYWxzLkNvbXBhcnRtZW50PSAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IoXG4gICAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IsXG4gICAgaW50cmluc2ljcyxcbiAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbik7XG5cblxuICAvLyBUT0RPIFRoZXNlIHNob3VsZCBzdGlsbCBiZSB0YW1lZCBhY2NvcmRpbmcgdG8gdGhlIHdoaXRlbGlzdCBiZWZvcmVcbiAgLy8gYmVpbmcgbWFkZSBhdmFpbGFibGUuXG4gIGZvciggY29uc3QgW25hbWUsIHZhbHVlXW9mICBlbnRyaWVzKHBlckNvbXBhcnRtZW50R2xvYmFscykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsIG5hbWUsIHtcbiAgICAgIHZhbHVlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xuXG4gICAgaWYoIHR5cGVvZiB2YWx1ZT09PSAgJ2Z1bmN0aW9uJykge1xuICAgICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24odmFsdWUpO1xuICAgICB9XG4gICB9XG4gfTtcblxuLyoqXG4gKiBzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzKClcbiAqIFNldCB0aGUgZXZhbCBhbmQgdGhlIEZ1bmN0aW9uIGV2YWx1YXRvciBvbiB0aGUgZ2xvYmFsIG9iamVjdCB3aXRoIGdpdmVuIGV2YWxUYW1pbmcgcG9saWN5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbG9iYWxPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV2YWx1YXRvclxuICogQHBhcmFtIHsoT2JqZWN0KSA9PiB2b2lkfSBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvblxuICovJGjigI1fb25jZS5zZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcyhzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcyk7XG5jb25zdCAgICAgICAgc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9ycz0gIChcbiAgZ2xvYmFsT2JqZWN0LFxuICBldmFsdWF0b3IsXG4gIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKT0+XG4gICAgIHtcbiAge1xuICAgIGNvbnN0IGY9ICBtYWtlRXZhbEZ1bmN0aW9uKGV2YWx1YXRvcik7XG4gICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24oZik7XG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsT2JqZWN0LCAnZXZhbCcsIHtcbiAgICAgIHZhbHVlOiBmLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xuXG4gICB9XG4gIHtcbiAgICBjb25zdCBmPSAgbWFrZUZ1bmN0aW9uQ29uc3RydWN0b3IoZXZhbHVhdG9yKTtcbiAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbihmKTtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsICdGdW5jdGlvbicsIHtcbiAgICAgIHZhbHVlOiBmLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xuXG4gICB9XG4gfTskaOKAjV9vbmNlLnNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMoc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9ycyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzE4XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFJlZmVyZW5jZUVycm9yLFR5cGVFcnJvcixNYXAsU2V0LGFycmF5Sm9pbixhcnJheU1hcCxhcnJheVB1c2gsY3JlYXRlLGZyZWV6ZSxtYXBHZXQsbWFwSGFzLG1hcFNldCxzZXRBZGQscHJvbWlzZUNhdGNoLHByb21pc2VUaGVuLHZhbHVlcyx3ZWFrbWFwR2V0LGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIlJlZmVyZW5jZUVycm9yXCIsIFskaOKAjV9hID0+IChSZWZlcmVuY2VFcnJvciA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIk1hcFwiLCBbJGjigI1fYSA9PiAoTWFwID0gJGjigI1fYSldXSxbXCJTZXRcIiwgWyRo4oCNX2EgPT4gKFNldCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlKb2luXCIsIFskaOKAjV9hID0+IChhcnJheUpvaW4gPSAkaOKAjV9hKV1dLFtcImFycmF5TWFwXCIsIFskaOKAjV9hID0+IChhcnJheU1hcCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQdXNoXCIsIFskaOKAjV9hID0+IChhcnJheVB1c2ggPSAkaOKAjV9hKV1dLFtcImNyZWF0ZVwiLCBbJGjigI1fYSA9PiAoY3JlYXRlID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wibWFwR2V0XCIsIFskaOKAjV9hID0+IChtYXBHZXQgPSAkaOKAjV9hKV1dLFtcIm1hcEhhc1wiLCBbJGjigI1fYSA9PiAobWFwSGFzID0gJGjigI1fYSldXSxbXCJtYXBTZXRcIiwgWyRo4oCNX2EgPT4gKG1hcFNldCA9ICRo4oCNX2EpXV0sW1wic2V0QWRkXCIsIFskaOKAjV9hID0+IChzZXRBZGQgPSAkaOKAjV9hKV1dLFtcInByb21pc2VDYXRjaFwiLCBbJGjigI1fYSA9PiAocHJvbWlzZUNhdGNoID0gJGjigI1fYSldXSxbXCJwcm9taXNlVGhlblwiLCBbJGjigI1fYSA9PiAocHJvbWlzZVRoZW4gPSAkaOKAjV9hKV1dLFtcInZhbHVlc1wiLCBbJGjigI1fYSA9PiAodmFsdWVzID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwR2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwR2V0ID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IEZhaWwsIGRldGFpbHM6IGQsIHF1b3RlOiBxfT0gICBhc3NlcnQ7XG5cbmNvbnN0IG5vb3A9ICAoKT0+ICB7IH07XG5cbi8vIGBtYWtlQWxpYXNgIGNvbnN0cnVjdHMgY29tcGFydG1lbnQgc3BlY2lmaWVyIHR1cGxlcyBmb3IgdGhlIGBhbGlhc2VzYFxuLy8gcHJpdmF0ZSBmaWVsZCBvZiBjb21wYXJ0bWVudHMuXG4vLyBUaGVzZSBhbGlhc2VzIGFsbG93IGEgY29tcGFydG1lbnQgdG8gYWxpYXMgYW4gaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciB0byBhXG4vLyBtb2R1bGUgc3BlY2lmaWVyIGluIGFuIGV4dGVybmFsIGNvbXBhcnRtZW50LCBhbmQgYWxzbyB0byBjcmVhdGUgaW50ZXJuYWxcbi8vIGFsaWFzZXMuXG4vLyBCb3RoIGFyZSBmYWNpbGl0YXRlZCBieSB0aGUgbW9kdWxlTWFwIENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG9wdGlvbi5cbmNvbnN0ICAgICAgICBtYWtlQWxpYXM9ICAoY29tcGFydG1lbnQsIHNwZWNpZmllcik9PlxuICBmcmVlemUoe1xuICAgIGNvbXBhcnRtZW50LFxuICAgIHNwZWNpZmllcn0pO1xuXG5cbi8vIGByZXNvbHZlQWxsYCBwcmUtY29tcHV0ZXMgcmVzb2x1dGlvbnMgb2YgYWxsIGltcG9ydHMgd2l0aGluIHRoZSBjb21wYXJ0bWVudFxuLy8gaW4gd2hpY2ggYSBtb2R1bGUgd2FzIGxvYWRlZC5cbiRo4oCNX29uY2UubWFrZUFsaWFzKG1ha2VBbGlhcyk7Y29uc3QgcmVzb2x2ZUFsbD0oaW1wb3J0cyxyZXNvbHZlSG9vayxmdWxsUmVmZXJyZXJTcGVjaWZpZXIpPT57XG4gIGNvbnN0IHJlc29sdmVkSW1wb3J0cz0gIGNyZWF0ZShudWxsKTtcbiAgZm9yKCBjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgaW1wb3J0cykge1xuICAgIGNvbnN0IGZ1bGxTcGVjaWZpZXI9ICByZXNvbHZlSG9vayhpbXBvcnRTcGVjaWZpZXIsIGZ1bGxSZWZlcnJlclNwZWNpZmllcik7XG4gICAgcmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl09ICBmdWxsU3BlY2lmaWVyO1xuICAgfVxuICByZXR1cm4gZnJlZXplKHJlc29sdmVkSW1wb3J0cyk7XG4gfTtcblxuY29uc3QgbG9hZFJlY29yZD0gIGFzeW5jKFxuICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIGNvbXBhcnRtZW50LFxuICBtb2R1bGVTcGVjaWZpZXIsXG4gIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgcGVuZGluZ0pvYnMsXG4gIG1vZHVsZUxvYWRzLFxuICBlcnJvcnMsXG4gIGltcG9ydE1ldGEpPT5cbiAgICAge1xuICBjb25zdCB7IHJlc29sdmVIb29rLCBtb2R1bGVSZWNvcmRzfT0gICB3ZWFrbWFwR2V0KFxuICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICBjb21wYXJ0bWVudCk7XG5cblxuICAvLyByZXNvbHZlIGFsbCBpbXBvcnRzIHJlbGF0aXZlIHRvIHRoaXMgcmVmZXJyZXIgbW9kdWxlLlxuICBjb25zdCByZXNvbHZlZEltcG9ydHM9ICByZXNvbHZlQWxsKFxuICAgIHN0YXRpY01vZHVsZVJlY29yZC5pbXBvcnRzLFxuICAgIHJlc29sdmVIb29rLFxuICAgIG1vZHVsZVNwZWNpZmllcik7XG5cbiAgY29uc3QgbW9kdWxlUmVjb3JkPSAgZnJlZXplKHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBzdGF0aWNNb2R1bGVSZWNvcmQsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHJlc29sdmVkSW1wb3J0cyxcbiAgICBpbXBvcnRNZXRhfSk7XG5cblxuICAvLyBFbnF1ZXVlIGpvYnMgdG8gbG9hZCB0aGlzIG1vZHVsZSdzIHNoYWxsb3cgZGVwZW5kZW5jaWVzLlxuICBmb3IoIGNvbnN0IGZ1bGxTcGVjaWZpZXIgb2YgdmFsdWVzKHJlc29sdmVkSW1wb3J0cykpIHtcbiAgICAvLyBCZWhvbGQ6IHJlY3Vyc2lvbi5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBjb25zdCBkZXBlbmRlbmN5TG9hZGVkPSAgbWVtb2l6ZWRMb2FkV2l0aEVycm9yQW5ub3RhdGlvbihcbiAgICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICAgIGZ1bGxTcGVjaWZpZXIsXG4gICAgICBwZW5kaW5nSm9icyxcbiAgICAgIG1vZHVsZUxvYWRzLFxuICAgICAgZXJyb3JzKTtcblxuICAgIHNldEFkZChcbiAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgcHJvbWlzZVRoZW4oZGVwZW5kZW5jeUxvYWRlZCwgbm9vcCwgKGVycm9yKT0+e1xuICAgICAgICBhcnJheVB1c2goZXJyb3JzLCBlcnJvcik7XG4gICAgICAgfSkpO1xuXG4gICB9XG5cbiAgLy8gTWVtb2l6ZS5cbiAgbWFwU2V0KG1vZHVsZVJlY29yZHMsIG1vZHVsZVNwZWNpZmllciwgbW9kdWxlUmVjb3JkKTtcbiAgcmV0dXJuIG1vZHVsZVJlY29yZDtcbiB9O1xuXG5jb25zdCBsb2FkV2l0aG91dEVycm9yQW5ub3RhdGlvbj0gIGFzeW5jKFxuICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIGNvbXBhcnRtZW50LFxuICBtb2R1bGVTcGVjaWZpZXIsXG4gIHBlbmRpbmdKb2JzLFxuICBtb2R1bGVMb2FkcyxcbiAgZXJyb3JzKT0+XG4gICAgIHtcbiAgY29uc3QgeyBpbXBvcnRIb29rLCBtb2R1bGVNYXAsIG1vZHVsZU1hcEhvb2ssIG1vZHVsZVJlY29yZHN9PSAgIHdlYWttYXBHZXQoXG4gICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgIGNvbXBhcnRtZW50KTtcblxuXG4gIC8vIEZvbGxvdyBtb2R1bGVNYXAsIG9yIG1vZHVsZU1hcEhvb2sgaWYgcHJlc2VudC5cbiAgbGV0IGFsaWFzTmFtZXNwYWNlPSAgbW9kdWxlTWFwW21vZHVsZVNwZWNpZmllcl07XG4gIGlmKCBhbGlhc05hbWVzcGFjZT09PSAgdW5kZWZpbmVkJiYgIG1vZHVsZU1hcEhvb2shPT0gIHVuZGVmaW5lZCkge1xuICAgIGFsaWFzTmFtZXNwYWNlPSAgbW9kdWxlTWFwSG9vayhtb2R1bGVTcGVjaWZpZXIpO1xuICAgfVxuICBpZiggdHlwZW9mIGFsaWFzTmFtZXNwYWNlPT09ICAnc3RyaW5nJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBkIGBDYW5ub3QgbWFwIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gdG8gJHtxKFxuICAgICAgICBhbGlhc05hbWVzcGFjZSlcbiAgICAgICAgfSBpbiBwYXJlbnQgY29tcGFydG1lbnQsIG5vdCB5ZXQgaW1wbGVtZW50ZWRgLFxuICAgICAgVHlwZUVycm9yKTtcblxuICAgfWVsc2UgaWYoIGFsaWFzTmFtZXNwYWNlIT09ICB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhbGlhcz0gIHdlYWttYXBHZXQobW9kdWxlQWxpYXNlcywgYWxpYXNOYW1lc3BhY2UpO1xuICAgIGlmKCBhbGlhcz09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIGQgYENhbm5vdCBtYXAgbW9kdWxlICR7cShcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIpXG4gICAgICAgICAgfSBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBub3QgYSBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UsIG9yIGlzIGZyb20gYW5vdGhlciByZWFsbWAsXG4gICAgICAgIFJlZmVyZW5jZUVycm9yKTtcblxuICAgICB9XG4gICAgLy8gQmVob2xkOiByZWN1cnNpb24uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgY29uc3QgYWxpYXNSZWNvcmQ9ICBhd2FpdCBtZW1vaXplZExvYWRXaXRoRXJyb3JBbm5vdGF0aW9uKFxuICAgICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIGFsaWFzLmNvbXBhcnRtZW50LFxuICAgICAgYWxpYXMuc3BlY2lmaWVyLFxuICAgICAgcGVuZGluZ0pvYnMsXG4gICAgICBtb2R1bGVMb2FkcyxcbiAgICAgIGVycm9ycyk7XG5cbiAgICBtYXBTZXQobW9kdWxlUmVjb3JkcywgbW9kdWxlU3BlY2lmaWVyLCBhbGlhc1JlY29yZCk7XG4gICAgcmV0dXJuIGFsaWFzUmVjb3JkO1xuICAgfVxuXG4gIGlmKCBtYXBIYXMobW9kdWxlUmVjb3JkcywgbW9kdWxlU3BlY2lmaWVyKSkge1xuICAgIHJldHVybiBtYXBHZXQobW9kdWxlUmVjb3JkcywgbW9kdWxlU3BlY2lmaWVyKTtcbiAgIH1cblxuICBjb25zdCBzdGF0aWNNb2R1bGVSZWNvcmQ9ICBhd2FpdCBpbXBvcnRIb29rKG1vZHVsZVNwZWNpZmllcik7XG5cbiAgaWYoIHN0YXRpY01vZHVsZVJlY29yZD09PSAgbnVsbHx8ICB0eXBlb2Ygc3RhdGljTW9kdWxlUmVjb3JkIT09ICAnb2JqZWN0Jykge1xuICAgIEZhaWwgYGltcG9ydEhvb2sgbXVzdCByZXR1cm4gYSBwcm9taXNlIGZvciBhbiBvYmplY3QsIGZvciBtb2R1bGUgJHtxKFxuICAgICAgbW9kdWxlU3BlY2lmaWVyKVxuICAgICAgfSBpbiBjb21wYXJ0bWVudCAke3EoY29tcGFydG1lbnQubmFtZSl9YDtcbiAgIH1cblxuICBpZiggc3RhdGljTW9kdWxlUmVjb3JkLnJlY29yZCE9PSAgdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tcGFydG1lbnQ6IGFsaWFzQ29tcGFydG1lbnQ9ICBjb21wYXJ0bWVudCxcbiAgICAgIHNwZWNpZmllcjogYWxpYXNTcGVjaWZpZXI9ICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICByZWNvcmQ6IGFsaWFzTW9kdWxlUmVjb3JkLFxuICAgICAgaW1wb3J0TWV0YX09XG4gICAgICAgIHN0YXRpY01vZHVsZVJlY29yZDtcblxuICAgIGNvbnN0IGFsaWFzUmVjb3JkPSAgYXdhaXQgbG9hZFJlY29yZChcbiAgICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgICBhbGlhc0NvbXBhcnRtZW50LFxuICAgICAgYWxpYXNTcGVjaWZpZXIsXG4gICAgICBhbGlhc01vZHVsZVJlY29yZCxcbiAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgbW9kdWxlTG9hZHMsXG4gICAgICBlcnJvcnMsXG4gICAgICBpbXBvcnRNZXRhKTtcblxuICAgIG1hcFNldChtb2R1bGVSZWNvcmRzLCBtb2R1bGVTcGVjaWZpZXIsIGFsaWFzUmVjb3JkKTtcbiAgICByZXR1cm4gYWxpYXNSZWNvcmQ7XG4gICB9XG5cbiAgcmV0dXJuIGxvYWRSZWNvcmQoXG4gICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgY29tcGFydG1lbnQsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgICBwZW5kaW5nSm9icyxcbiAgICBtb2R1bGVMb2FkcyxcbiAgICBlcnJvcnMpO1xuXG4gfTtcblxuY29uc3QgbWVtb2l6ZWRMb2FkV2l0aEVycm9yQW5ub3RhdGlvbj0gIGFzeW5jKFxuICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIGNvbXBhcnRtZW50LFxuICBtb2R1bGVTcGVjaWZpZXIsXG4gIHBlbmRpbmdKb2JzLFxuICBtb2R1bGVMb2FkcyxcbiAgZXJyb3JzKT0+XG4gICAgIHtcbiAgY29uc3QgeyBuYW1lOiBjb21wYXJ0bWVudE5hbWV9PSAgIHdlYWttYXBHZXQoXG4gICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgIGNvbXBhcnRtZW50KTtcblxuXG4gIC8vIFByZXZlbnQgZGF0YS1sb2NrIGZyb20gcmVjdXJzaW9uIGludG8gYnJhbmNoZXMgdmlzaXRlZCBpbiBkZXBlbmRlbnQgbG9hZHMuXG4gIGxldCBjb21wYXJ0bWVudExvYWRpbmc9ICBtYXBHZXQobW9kdWxlTG9hZHMsIGNvbXBhcnRtZW50KTtcbiAgaWYoIGNvbXBhcnRtZW50TG9hZGluZz09PSAgdW5kZWZpbmVkKSB7XG4gICAgY29tcGFydG1lbnRMb2FkaW5nPSAgbmV3IE1hcCgpO1xuICAgIG1hcFNldChtb2R1bGVMb2FkcywgY29tcGFydG1lbnQsIGNvbXBhcnRtZW50TG9hZGluZyk7XG4gICB9XG4gIGxldCBtb2R1bGVMb2FkaW5nPSAgbWFwR2V0KGNvbXBhcnRtZW50TG9hZGluZywgbW9kdWxlU3BlY2lmaWVyKTtcbiAgaWYoIG1vZHVsZUxvYWRpbmchPT0gIHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtb2R1bGVMb2FkaW5nO1xuICAgfVxuXG4gIG1vZHVsZUxvYWRpbmc9ICBwcm9taXNlQ2F0Y2goXG4gICAgbG9hZFdpdGhvdXRFcnJvckFubm90YXRpb24oXG4gICAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgICBtb2R1bGVBbGlhc2VzLFxuICAgICAgY29tcGFydG1lbnQsXG4gICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwZW5kaW5nSm9icyxcbiAgICAgIG1vZHVsZUxvYWRzLFxuICAgICAgZXJyb3JzKSxcblxuICAgIChlcnJvcik9PntcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBhc3NlcnQubm90ZShcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGQgYCR7ZXJyb3IubWVzc2FnZX0sIGxvYWRpbmcgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICBjb21wYXJ0bWVudE5hbWUpXG4gICAgICAgICAgfWApO1xuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICAgfSk7XG5cblxuICBtYXBTZXQoY29tcGFydG1lbnRMb2FkaW5nLCBtb2R1bGVTcGVjaWZpZXIsIG1vZHVsZUxvYWRpbmcpO1xuXG4gIHJldHVybiBtb2R1bGVMb2FkaW5nO1xuIH07XG5cbi8qXG4gKiBgbG9hZGAgYXN5bmNocm9ub3VzbHkgZ2F0aGVycyB0aGUgYFN0YXRpY01vZHVsZVJlY29yZGBzIGZvciBhIG1vZHVsZSBhbmQgaXRzXG4gKiB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcy5cbiAqIFRoZSBtb2R1bGUgcmVjb3JkcyByZWZlciB0byBlYWNoIG90aGVyIGJ5IGEgcmVmZXJlbmNlIHRvIHRoZSBkZXBlbmRlbmN5J3NcbiAqIGNvbXBhcnRtZW50IGFuZCB0aGUgc3BlY2lmaWVyIG9mIHRoZSBtb2R1bGUgd2l0aGluIGl0cyBvd24gY29tcGFydG1lbnQuXG4gKiBUaGlzIGdyYXBoIGlzIHRoZW4gcmVhZHkgdG8gYmUgc3luY2hyb25vdXNseSBsaW5rZWQgYW5kIGV4ZWN1dGVkLlxuICovXG5jb25zdCAgICAgICAgbG9hZD0gIGFzeW5jKFxuICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIGNvbXBhcnRtZW50LFxuICBtb2R1bGVTcGVjaWZpZXIpPT5cbiAgICAge1xuICBjb25zdCB7IG5hbWU6IGNvbXBhcnRtZW50TmFtZX09ICAgd2Vha21hcEdldChcbiAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgY29tcGFydG1lbnQpO1xuXG5cbiAgLyoqIEB0eXBlIHtTZXQ8UHJvbWlzZTx1bmRlZmluZWQ+Pn0gKi9cbiAgY29uc3QgcGVuZGluZ0pvYnM9ICBuZXcgU2V0KCk7XG4gIC8qKiBAdHlwZSB7TWFwPE9iamVjdCwgTWFwPHN0cmluZywgUHJvbWlzZTxSZWNvcmQ+Pn0gKi9cbiAgY29uc3QgbW9kdWxlTG9hZHM9ICBuZXcgTWFwKCk7XG4gIC8qKiBAdHlwZSB7QXJyYXk8RXJyb3I+fSAqL1xuICBjb25zdCBlcnJvcnM9ICBbXTtcblxuICBjb25zdCBkZXBlbmRlbmN5TG9hZGVkPSAgbWVtb2l6ZWRMb2FkV2l0aEVycm9yQW5ub3RhdGlvbihcbiAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgbW9kdWxlQWxpYXNlcyxcbiAgICBjb21wYXJ0bWVudCxcbiAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgcGVuZGluZ0pvYnMsXG4gICAgbW9kdWxlTG9hZHMsXG4gICAgZXJyb3JzKTtcblxuICBzZXRBZGQoXG4gICAgcGVuZGluZ0pvYnMsXG4gICAgcHJvbWlzZVRoZW4oZGVwZW5kZW5jeUxvYWRlZCwgbm9vcCwgKGVycm9yKT0+e1xuICAgICAgYXJyYXlQdXNoKGVycm9ycywgZXJyb3IpO1xuICAgICB9KSk7XG5cblxuICAvLyBEcmFpbiBwZW5kaW5nIGpvYnMgcXVldWUuXG4gIC8vIEVhY2ggam9iIGlzIGEgcHJvbWlzZSBmb3IgdW5kZWZpbmVkLCByZWdhcmRsZXNzIG9mIHN1Y2Nlc3Mgb3IgZmFpbHVyZS5cbiAgLy8gQmVmb3JlIHdlIGFkZCBhIGpvYiB0byB0aGUgcXVldWUsIHdlIGNhdGNoIGFueSBlcnJvciBhbmQgcHVzaCBpdCBpbnRvIHRoZVxuICAvLyBgZXJyb3JzYCBhY2N1bXVsYXRvci5cbiAgZm9yKCBjb25zdCBqb2Igb2YgcGVuZGluZ0pvYnMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgIGF3YWl0IGpvYjtcbiAgIH1cblxuICAvLyBUaHJvdyBhbiBhZ2dyZWdhdGUgZXJyb3IgaWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzLlxuICBpZiggZXJyb3JzLmxlbmd0aD4gIDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgIGBGYWlsZWQgdG8gbG9hZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxuICAgICAgICBjb21wYXJ0bWVudE5hbWUpXG4gICAgICAgIH0gKCR7ZXJyb3JzLmxlbmd0aH0gdW5kZXJseWluZyBmYWlsdXJlczogJHthcnJheUpvaW4oXG4gICAgICAgIGFycmF5TWFwKGVycm9ycywgKGVycm9yKT0+ZXJyb3IubWVzc2FnZSksXG4gICAgICAgICcsICcpXG4gICAgICAgIH1gKTtcblxuICAgfVxuIH07JGjigI1fb25jZS5sb2FkKGxvYWQpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1sxOV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlQWxpYXMsUHJveHksVHlwZUVycm9yLGNyZWF0ZSxmcmVlemUsbWFwR2V0LG1hcEhhcyxtYXBTZXQsb3duS2V5cyxyZWZsZWN0R2V0LHJlZmxlY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IscmVmbGVjdEhhcyxyZWZsZWN0SXNFeHRlbnNpYmxlLHJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9ucyx3ZWFrbWFwU2V0LGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCIuL21vZHVsZS1sb2FkLmpzXCIsIFtbXCJtYWtlQWxpYXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VBbGlhcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbW1vbnMuanNcIiwgW1tcIlByb3h5XCIsIFskaOKAjV9hID0+IChQcm94eSA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImNyZWF0ZVwiLCBbJGjigI1fYSA9PiAoY3JlYXRlID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wibWFwR2V0XCIsIFskaOKAjV9hID0+IChtYXBHZXQgPSAkaOKAjV9hKV1dLFtcIm1hcEhhc1wiLCBbJGjigI1fYSA9PiAobWFwSGFzID0gJGjigI1fYSldXSxbXCJtYXBTZXRcIiwgWyRo4oCNX2EgPT4gKG1hcFNldCA9ICRo4oCNX2EpXV0sW1wib3duS2V5c1wiLCBbJGjigI1fYSA9PiAob3duS2V5cyA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdEdldFwiLCBbJGjigI1fYSA9PiAocmVmbGVjdEdldCA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAocmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdEhhc1wiLCBbJGjigI1fYSA9PiAocmVmbGVjdEhhcyA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdElzRXh0ZW5zaWJsZVwiLCBbJGjigI1fYSA9PiAocmVmbGVjdElzRXh0ZW5zaWJsZSA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdFByZXZlbnRFeHRlbnNpb25zXCIsIFskaOKAjV9hID0+IChyZWZsZWN0UHJldmVudEV4dGVuc2lvbnMgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBTZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IHF1b3RlOiBxfT0gICBhc3NlcnQ7XG5cbi8vIGBkZWZlckV4cG9ydHNgIGNyZWF0ZXMgYSBtb2R1bGUncyBleHBvcnRzIHByb3h5LCBwcm94aWVkIGV4cG9ydHMsIGFuZFxuLy8gYWN0aXZhdG9yLlxuLy8gQSBgQ29tcGFydG1lbnRgIGNhbiBjcmVhdGUgYSBtb2R1bGUgZm9yIGFueSBtb2R1bGUgc3BlY2lmaWVyLCByZWdhcmRsZXNzIG9mXG4vLyB3aGV0aGVyIGl0IGlzIGxvYWRhYmxlIG9yIGV4ZWN1dGFibGUsIGFuZCB1c2UgdGhhdCBvYmplY3QgYXMgYSB0b2tlbiB0aGF0XG4vLyBjYW4gYmUgZmVkIGludG8gYW5vdGhlciBjb21wYXJ0bWVudCdzIG1vZHVsZSBtYXAuXG4vLyBPbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgbW9kdWxlIGhhcyBiZWVuIGFuYWx5emVkIGlzIGl0IHBvc3NpYmxlIGZvciB0aGVcbi8vIG1vZHVsZSBuYW1lc3BhY2UgcHJveHkgdG8gYmVoYXZlIHByb3Blcmx5LCBzbyBpdCB0aHJvd3MgZXhjZXB0aW9ucyB1bnRpbFxuLy8gYWZ0ZXIgdGhlIGNvbXBhcnRtZW50IGhhcyBiZWd1biBleGVjdXRpbmcgdGhlIG1vZHVsZS5cbi8vIFRoZSBtb2R1bGUgaW5zdGFuY2UgbXVzdCBmcmVlemUgdGhlIHByb3hpZWQgZXhwb3J0cyBhbmQgYWN0aXZhdGUgdGhlIGV4cG9ydHNcbi8vIHByb3h5IGJlZm9yZSBleGVjdXRpbmcgdGhlIG1vZHVsZS5cbi8vXG4vLyBUaGUgbW9kdWxlIGV4cG9ydHMgcHJveHkncyBiZWhhdmlvciBkaWZmZXJzIGZyb20gdGhlIEVDTUFTY3JpcHQgMjYyXG4vLyBzcGVjaWZpY2F0aW9uIGZvciBcIm1vZHVsZSBuYW1lc3BhY2UgZXhvdGljIG9iamVjdHNcIiBvbmx5IGluIHRoYXQgYWNjb3JkaW5nXG4vLyB0byB0aGUgc3BlY2lmaWNhdGlvbiB2YWx1ZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBoYXZlIGEgbm9uLXdyaXRhYmxlIFwidmFsdWVcIlxuLy8gYW5kIHRoaXMgaW1wbGVtZW50YXRpb24gbW9kZWxzIGFsbCBwcm9wZXJ0aWVzIHdpdGggYWNjZXNzb3JzLlxuLy9cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbW9kdWxlLW5hbWVzcGFjZS1leG90aWMtb2JqZWN0c1xuLy9cbmNvbnN0ICAgICAgICBkZWZlckV4cG9ydHM9ICAoKT0+ICB7XG4gIGxldCBhY3RpdmU9ICBmYWxzZTtcbiAgY29uc3QgcHJveGllZEV4cG9ydHM9ICBjcmVhdGUobnVsbCk7XG4gIHJldHVybiBmcmVlemUoe1xuICAgIGFjdGl2YXRlKCkge1xuICAgICAgYWN0aXZlPSAgdHJ1ZTtcbiAgICAgfSxcbiAgICBwcm94aWVkRXhwb3J0cyxcbiAgICBleHBvcnRzUHJveHk6IG5ldyBQcm94eShwcm94aWVkRXhwb3J0cywge1xuICAgICAgZ2V0KF90YXJnZXQsIG5hbWUsIHJlY2VpdmVyKSB7XG4gICAgICAgIGlmKCAhYWN0aXZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICBgQ2Fubm90IGdldCBwcm9wZXJ0eSAke3EoXG4gICAgICAgICAgICAgIG5hbWUpXG4gICAgICAgICAgICAgIH0gb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlLCB0aGUgbW9kdWxlIGhhcyBub3QgeWV0IGJlZ3VuIHRvIGV4ZWN1dGVgKTtcblxuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmbGVjdEdldChwcm94aWVkRXhwb3J0cywgbmFtZSwgcmVjZWl2ZXIpO1xuICAgICAgIH0sXG4gICAgICBzZXQoX3RhcmdldCwgbmFtZSwgX3ZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgIGBDYW5ub3Qgc2V0IHByb3BlcnR5ICR7cShuYW1lKX0gb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlYCk7XG5cbiAgICAgICB9LFxuICAgICAgaGFzKF90YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYoICFhY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgIGBDYW5ub3QgY2hlY2sgcHJvcGVydHkgJHtxKFxuICAgICAgICAgICAgICBuYW1lKVxuICAgICAgICAgICAgICB9LCB0aGUgbW9kdWxlIGhhcyBub3QgeWV0IGJlZ3VuIHRvIGV4ZWN1dGVgKTtcblxuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmbGVjdEhhcyhwcm94aWVkRXhwb3J0cywgbmFtZSk7XG4gICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgYENhbm5vdCBkZWxldGUgcHJvcGVydHkgJHtxKG5hbWUpfXMgb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlYCk7XG5cbiAgICAgICB9LFxuICAgICAgb3duS2V5cyhfdGFyZ2V0KSB7XG4gICAgICAgIGlmKCAhYWN0aXZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3QgZW51bWVyYXRlIGtleXMsIHRoZSBtb2R1bGUgaGFzIG5vdCB5ZXQgYmVndW4gdG8gZXhlY3V0ZScpO1xuXG4gICAgICAgICB9XG4gICAgICAgIHJldHVybiBvd25LZXlzKHByb3hpZWRFeHBvcnRzKTtcbiAgICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF90YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYoICFhY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgIGBDYW5ub3QgZ2V0IG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yICR7cShcbiAgICAgICAgICAgICAgbmFtZSlcbiAgICAgICAgICAgICAgfSwgdGhlIG1vZHVsZSBoYXMgbm90IHlldCBiZWd1biB0byBleGVjdXRlYCk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZmxlY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJveGllZEV4cG9ydHMsIG5hbWUpO1xuICAgICAgIH0sXG4gICAgICBwcmV2ZW50RXh0ZW5zaW9ucyhfdGFyZ2V0KSB7XG4gICAgICAgIGlmKCAhYWN0aXZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3QgcHJldmVudCBleHRlbnNpb25zIG9mIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSwgdGhlIG1vZHVsZSBoYXMgbm90IHlldCBiZWd1biB0byBleGVjdXRlJyk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9ucyhwcm94aWVkRXhwb3J0cyk7XG4gICAgICAgfSxcbiAgICAgIGlzRXh0ZW5zaWJsZSgpIHtcbiAgICAgICAgaWYoICFhY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0Nhbm5vdCBjaGVjayBleHRlbnNpYmlsaXR5IG9mIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSwgdGhlIG1vZHVsZSBoYXMgbm90IHlldCBiZWd1biB0byBleGVjdXRlJyk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZmxlY3RJc0V4dGVuc2libGUocHJveGllZEV4cG9ydHMpO1xuICAgICAgIH0sXG4gICAgICBnZXRQcm90b3R5cGVPZihfdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgIH0sXG4gICAgICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfcHJvdG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IHNldCBwcm90b3R5cGUgb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlJyk7XG4gICAgICAgfSxcbiAgICAgIGRlZmluZVByb3BlcnR5KF90YXJnZXQsIG5hbWUsIF9kZXNjcmlwdG9yKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgIGBDYW5ub3QgZGVmaW5lIHByb3BlcnR5ICR7cShuYW1lKX0gb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlYCk7XG5cbiAgICAgICB9LFxuICAgICAgYXBwbHkoX3RhcmdldCwgX3RoaXNBcmcsIF9hcmdzKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCBjYWxsIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSwgaXQgaXMgbm90IGEgZnVuY3Rpb24nKTtcblxuICAgICAgIH0sXG4gICAgICBjb25zdHJ1Y3QoX3RhcmdldCwgX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IGNvbnN0cnVjdCBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UsIGl0IGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG5cbiAgICAgICB9fSl9KTtcblxuXG4gfTtcblxuLy8gYGdldERlZmVycmVkRXhwb3J0c2AgbWVtb2l6ZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmZXJyZWQgbW9kdWxlIGV4cG9ydHNcbi8vIG5hbWVzcGFjZSBwcm94eSBmb3IgYW55IGFicml0cmFyeSBmdWxsIHNwZWNpZmllciBpbiBhIGNvbXBhcnRtZW50LlxuLy8gSXQgYWxzbyByZWNvcmRzIHRoZSBjb21wYXJ0bWVudCBhbmQgc3BlY2lmaWVyIGFmZmlsaWF0ZWQgd2l0aCB0aGF0IG1vZHVsZVxuLy8gZXhwb3J0cyBuYW1lc3BhY2UgcHJveHkgc28gaXQgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXMgaW50byBhbm90aGVyXG4vLyBjb21wYXJ0bWVudCB3aGVuIHRocmVhZGVkIHRocm91Z2ggYSBjb21wYXJ0bWVudCdzIGBtb2R1bGVNYXBgIGFyZ3VtZW50LlxuJGjigI1fb25jZS5kZWZlckV4cG9ydHMoZGVmZXJFeHBvcnRzKTtjb25zdCBnZXREZWZlcnJlZEV4cG9ydHM9KFxuICBjb21wYXJ0bWVudCxcbiAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICBtb2R1bGVBbGlhc2VzLFxuICBzcGVjaWZpZXIpPT5cbiAgICAge1xuICBjb25zdCB7IGRlZmVycmVkRXhwb3J0c309ICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzO1xuICBpZiggIW1hcEhhcyhkZWZlcnJlZEV4cG9ydHMsIHNwZWNpZmllcikpIHtcbiAgICBjb25zdCBkZWZlcnJlZD0gIGRlZmVyRXhwb3J0cygpO1xuICAgIHdlYWttYXBTZXQoXG4gICAgICBtb2R1bGVBbGlhc2VzLFxuICAgICAgZGVmZXJyZWQuZXhwb3J0c1Byb3h5LFxuICAgICAgbWFrZUFsaWFzKGNvbXBhcnRtZW50LCBzcGVjaWZpZXIpKTtcblxuICAgIG1hcFNldChkZWZlcnJlZEV4cG9ydHMsIHNwZWNpZmllciwgZGVmZXJyZWQpO1xuICAgfVxuICByZXR1cm4gbWFwR2V0KGRlZmVycmVkRXhwb3J0cywgc3BlY2lmaWVyKTtcbiB9OyRo4oCNX29uY2UuZ2V0RGVmZXJyZWRFeHBvcnRzKGdldERlZmVycmVkRXhwb3J0cyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzIwXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxnZXREZWZlcnJlZEV4cG9ydHMsUmVmZXJlbmNlRXJyb3IsU3ludGF4RXJyb3IsVHlwZUVycm9yLGFycmF5Rm9yRWFjaCxhcnJheUluY2x1ZGVzLGFycmF5UHVzaCxhcnJheVNvbWUsYXJyYXlTb3J0LGNyZWF0ZSxkZWZpbmVQcm9wZXJ0eSxlbnRyaWVzLGZyZWV6ZSxpc0FycmF5LGtleXMsbWFwR2V0LHdlYWttYXBHZXQscmVmbGVjdEhhcyxhc3NpZ24sY29tcGFydG1lbnRFdmFsdWF0ZTskaOKAjV9pbXBvcnRzKFtbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiLi9tb2R1bGUtcHJveHkuanNcIiwgW1tcImdldERlZmVycmVkRXhwb3J0c1wiLCBbJGjigI1fYSA9PiAoZ2V0RGVmZXJyZWRFeHBvcnRzID0gJGjigI1fYSldXV1dLFtcIi4vY29tbW9ucy5qc1wiLCBbW1wiUmVmZXJlbmNlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFJlZmVyZW5jZUVycm9yID0gJGjigI1fYSldXSxbXCJTeW50YXhFcnJvclwiLCBbJGjigI1fYSA9PiAoU3ludGF4RXJyb3IgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhcnJheUZvckVhY2hcIiwgWyRo4oCNX2EgPT4gKGFycmF5Rm9yRWFjaCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlJbmNsdWRlc1wiLCBbJGjigI1fYSA9PiAoYXJyYXlJbmNsdWRlcyA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQdXNoXCIsIFskaOKAjV9hID0+IChhcnJheVB1c2ggPSAkaOKAjV9hKV1dLFtcImFycmF5U29tZVwiLCBbJGjigI1fYSA9PiAoYXJyYXlTb21lID0gJGjigI1fYSldXSxbXCJhcnJheVNvcnRcIiwgWyRo4oCNX2EgPT4gKGFycmF5U29ydCA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnR5XCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiZW50cmllc1wiLCBbJGjigI1fYSA9PiAoZW50cmllcyA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dLFtcImlzQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzQXJyYXkgPSAkaOKAjV9hKV1dLFtcImtleXNcIiwgWyRo4oCNX2EgPT4gKGtleXMgPSAkaOKAjV9hKV1dLFtcIm1hcEdldFwiLCBbJGjigI1fYSA9PiAobWFwR2V0ID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwR2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwR2V0ID0gJGjigI1fYSldXSxbXCJyZWZsZWN0SGFzXCIsIFskaOKAjV9hID0+IChyZWZsZWN0SGFzID0gJGjigI1fYSldXSxbXCJhc3NpZ25cIiwgWyRo4oCNX2EgPT4gKGFzc2lnbiA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LWV2YWx1YXRlLmpzXCIsIFtbXCJjb21wYXJ0bWVudEV2YWx1YXRlXCIsIFskaOKAjV9hID0+IChjb21wYXJ0bWVudEV2YWx1YXRlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBxdW90ZTogcX09ICAgYXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZT0gIChcbiAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICBzdGF0aWNNb2R1bGVSZWNvcmQsXG4gIGNvbXBhcnRtZW50LFxuICBtb2R1bGVBbGlhc2VzLFxuICBtb2R1bGVTcGVjaWZpZXIsXG4gIHJlc29sdmVkSW1wb3J0cyk9PlxuICAgICB7XG4gIGNvbnN0IHsgZXhwb3J0c1Byb3h5LCBwcm94aWVkRXhwb3J0cywgYWN0aXZhdGV9PSAgIGdldERlZmVycmVkRXhwb3J0cyhcbiAgICBjb21wYXJ0bWVudCxcbiAgICB3ZWFrbWFwR2V0KGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcywgY29tcGFydG1lbnQpLFxuICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgbW9kdWxlU3BlY2lmaWVyKTtcblxuXG4gIGNvbnN0IG5vdGlmaWVycz0gIGNyZWF0ZShudWxsKTtcblxuICBpZiggc3RhdGljTW9kdWxlUmVjb3JkLmV4cG9ydHMpIHtcbiAgICBpZihcbiAgICAgICFpc0FycmF5KHN0YXRpY01vZHVsZVJlY29yZC5leHBvcnRzKXx8XG4gICAgICBhcnJheVNvbWUoc3RhdGljTW9kdWxlUmVjb3JkLmV4cG9ydHMsIChuYW1lKT0+dHlwZW9mIG5hbWUhPT0gICdzdHJpbmcnKSlcbiAgICAgIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICBgU0VTIHRoaXJkLXBhcnR5IHN0YXRpYyBtb2R1bGUgcmVjb3JkIFwiZXhwb3J0c1wiIHByb3BlcnR5IG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBmb3IgbW9kdWxlICR7bW9kdWxlU3BlY2lmaWVyfWApO1xuXG4gICAgIH1cbiAgICBhcnJheUZvckVhY2goc3RhdGljTW9kdWxlUmVjb3JkLmV4cG9ydHMsIChuYW1lKT0+e1xuICAgICAgbGV0IHZhbHVlPSAgcHJveGllZEV4cG9ydHNbbmFtZV07XG4gICAgICBjb25zdCB1cGRhdGVycz0gIFtdO1xuXG4gICAgICBjb25zdCBnZXQ9ICAoKT0+ICB2YWx1ZTtcblxuICAgICAgY29uc3Qgc2V0PSAgKG5ld1ZhbHVlKT0+e1xuICAgICAgICB2YWx1ZT0gIG5ld1ZhbHVlO1xuICAgICAgICBmb3IoIGNvbnN0IHVwZGF0ZXIgb2YgdXBkYXRlcnMpIHtcbiAgICAgICAgICB1cGRhdGVyKG5ld1ZhbHVlKTtcbiAgICAgICAgIH1cbiAgICAgICB9O1xuXG4gICAgICBkZWZpbmVQcm9wZXJ0eShwcm94aWVkRXhwb3J0cywgbmFtZSwge1xuICAgICAgICBnZXQsXG4gICAgICAgIHNldCxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX0pO1xuXG5cbiAgICAgIG5vdGlmaWVyc1tuYW1lXT0gICh1cGRhdGUpPT57XG4gICAgICAgIGFycmF5UHVzaCh1cGRhdGVycywgdXBkYXRlKTtcbiAgICAgICAgdXBkYXRlKHZhbHVlKTtcbiAgICAgICB9O1xuICAgICB9KTtcbiAgICAvLyBUaGlzIGlzIGVub3VnaCB0byBzdXBwb3J0IGltcG9ydCAqIGZyb20gY2pzIC0gdGhlICcqJyBmaWVsZCBkb2Vzbid0IG5lZWQgdG8gYmUgaW4gZXhwb3J0cyBub3IgcHJveGllZEV4cG9ydHMgYmVjYXVzZSBpbXBvcnQgd2lsbCBvbmx5IGV2ZXIgYWNjZXNzIGl0IHZpYSBub3RpZmllcnNcbiAgICBub3RpZmllcnNbJyonXT0gICh1cGRhdGUpPT57XG4gICAgICB1cGRhdGUocHJveGllZEV4cG9ydHMpO1xuICAgICB9O1xuICAgfVxuXG4gIGNvbnN0IGxvY2FsU3RhdGU9ICB7XG4gICAgYWN0aXZhdGVkOiBmYWxzZX07XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgbm90aWZpZXJzLFxuICAgIGV4cG9ydHNQcm94eSxcbiAgICBleGVjdXRlKCkge1xuICAgICAgaWYoIHJlZmxlY3RIYXMobG9jYWxTdGF0ZSwgJ2Vycm9yRnJvbUV4ZWN1dGUnKSkge1xuICAgICAgICB0aHJvdyBsb2NhbFN0YXRlLmVycm9yRnJvbUV4ZWN1dGU7XG4gICAgICAgfVxuICAgICAgaWYoICFsb2NhbFN0YXRlLmFjdGl2YXRlZCkge1xuICAgICAgICBhY3RpdmF0ZSgpO1xuICAgICAgICBsb2NhbFN0YXRlLmFjdGl2YXRlZD0gIHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgICAgICBzdGF0aWNNb2R1bGVSZWNvcmQuZXhlY3V0ZShcbiAgICAgICAgICAgIHByb3hpZWRFeHBvcnRzLFxuICAgICAgICAgICAgY29tcGFydG1lbnQsXG4gICAgICAgICAgICByZXNvbHZlZEltcG9ydHMpO1xuXG4gICAgICAgICB9Y2F0Y2goIGVycikge1xuICAgICAgICAgIGxvY2FsU3RhdGUuZXJyb3JGcm9tRXhlY3V0ZT0gIGVycjtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICB9XG4gICAgICAgfVxuICAgICB9fSk7XG5cbiB9O1xuXG4vLyBgbWFrZU1vZHVsZUluc3RhbmNlYCB0YWtlcyBhIG1vZHVsZSdzIGNvbXBhcnRtZW50IHJlY29yZCwgdGhlIGxpdmUgaW1wb3J0XG4vLyBuYW1lc3BhY2UsIGFuZCBhIGdsb2JhbCBvYmplY3Q7IGFuZCBwcm9kdWNlcyBhIG1vZHVsZSBpbnN0YW5jZS5cbi8vIFRoZSBtb2R1bGUgaW5zdGFuY2UgY2FycmllcyB0aGUgcHJveGllZCBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UgKHRoZVxuLy8gXCJleHBvcnRzXCIpLCBub3RpZmllcnMgdG8gdXBkYXRlIHRoZSBtb2R1bGUncyBpbnRlcm5hbCBpbXBvcnQgbmFtZXNwYWNlLCBhbmRcbi8vIGFuIGlkZW1wb3RlbnQgZXhlY3V0ZSBmdW5jdGlvbi5cbi8vIFRoZSBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UgaXMgYSBwcm94eSB0byB0aGUgcHJveGllZCBleHBvcnRzIG5hbWVzcGFjZVxuLy8gdGhhdCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtb2R1bGUgaW5zdGFuY2UgcG9wdWxhdGVzLlxuJGjigI1fb25jZS5tYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlKG1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2UpO2NvbnN0IG1ha2VNb2R1bGVJbnN0YW5jZT0oXG4gIHByaXZhdGVGaWVsZHMsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIG1vZHVsZVJlY29yZCxcbiAgaW1wb3J0ZWRJbnN0YW5jZXMpPT5cbiAgICAge1xuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnQsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgICBpbXBvcnRNZXRhOiBtb2R1bGVSZWNvcmRNZXRhfT1cbiAgICAgIG1vZHVsZVJlY29yZDtcbiAgY29uc3Qge1xuICAgIHJlZXhwb3J0czogZXhwb3J0QWxscz0gIFtdLFxuICAgIF9fc3luY01vZHVsZVByb2dyYW1fXzogZnVuY3RvclNvdXJjZSxcbiAgICBfX2ZpeGVkRXhwb3J0TWFwX186IGZpeGVkRXhwb3J0TWFwPSAge30sXG4gICAgX19saXZlRXhwb3J0TWFwX186IGxpdmVFeHBvcnRNYXA9ICB7fSxcbiAgICBfX25lZWRzSW1wb3J0TWV0YV9fOiBuZWVkc0ltcG9ydE1ldGE9ICBmYWxzZX09XG4gICAgICBzdGF0aWNNb2R1bGVSZWNvcmQ7XG5cbiAgY29uc3QgY29tcGFydG1lbnRGaWVsZHM9ICB3ZWFrbWFwR2V0KHByaXZhdGVGaWVsZHMsIGNvbXBhcnRtZW50KTtcblxuICBjb25zdCB7IF9fc2hpbVRyYW5zZm9ybXNfXywgaW1wb3J0TWV0YUhvb2t9PSAgIGNvbXBhcnRtZW50RmllbGRzO1xuXG4gIGNvbnN0IHsgZXhwb3J0c1Byb3h5LCBwcm94aWVkRXhwb3J0cywgYWN0aXZhdGV9PSAgIGdldERlZmVycmVkRXhwb3J0cyhcbiAgICBjb21wYXJ0bWVudCxcbiAgICBjb21wYXJ0bWVudEZpZWxkcyxcbiAgICBtb2R1bGVBbGlhc2VzLFxuICAgIG1vZHVsZVNwZWNpZmllcik7XG5cblxuICAvLyB7X2V4cG9ydE5hbWVfOiBnZXR0ZXJ9IG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZVxuICAvLyBvYmplY3QgKGV2ZW50dWFsbHkgcHJveGllZCkuXG4gIGNvbnN0IGV4cG9ydHNQcm9wcz0gIGNyZWF0ZShudWxsKTtcblxuICAvLyB7X2xvY2FsTmFtZV86IGFjY2Vzc29yfSBwcm94eSB0cmFwcyBmb3IgbW9kdWxlTGV4aWNhbHMgYW5kIGxpdmUgYmluZGluZ3MuXG4gIC8vIFRoZSBtb2R1bGVMZXhpY2FscyBvYmplY3QgaXMgZnJvemVuIGFuZCB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIG9mXG4gIC8vIG1vZHVsZUxleGljYWxzIG11c3QgYmUgaW1tdXRhYmxlLCBzbyB3ZSBjb3B5IHRoZSBkZXNjcmlwdG9ycy5cbiAgY29uc3QgbW9kdWxlTGV4aWNhbHM9ICBjcmVhdGUobnVsbCk7XG5cbiAgLy8ge19sb2NhbE5hbWVfOiBpbml0KGluaXRWYWx1ZSkgLT4gaW5pdFZhbHVlfSB1c2VkIGJ5IHRoZVxuICAvLyByZXdyaXR0ZW4gY29kZSB0byBpbml0aWFsaXplIGV4cG9ydGVkIGZpeGVkIGJpbmRpbmdzLlxuICBjb25zdCBvbmNlVmFyPSAgY3JlYXRlKG51bGwpO1xuXG4gIC8vIHtfbG9jYWxOYW1lXzogdXBkYXRlKG5ld1ZhbHVlKX0gdXNlZCBieSB0aGUgcmV3cml0dGVuIGNvZGUgdG9cbiAgLy8gYm90aCBpbml0aWFsaXplIGFuZCB1cGRhdGUgbGl2ZSBiaW5kaW5ncy5cbiAgY29uc3QgbGl2ZVZhcj0gIGNyZWF0ZShudWxsKTtcblxuICBjb25zdCBpbXBvcnRNZXRhPSAgY3JlYXRlKG51bGwpO1xuICBpZiggbW9kdWxlUmVjb3JkTWV0YSkge1xuICAgIGFzc2lnbihpbXBvcnRNZXRhLCBtb2R1bGVSZWNvcmRNZXRhKTtcbiAgIH1cbiAgaWYoIG5lZWRzSW1wb3J0TWV0YSYmICBpbXBvcnRNZXRhSG9vaykge1xuICAgIGltcG9ydE1ldGFIb29rKG1vZHVsZVNwZWNpZmllciwgaW1wb3J0TWV0YSk7XG4gICB9XG5cbiAgLy8ge19sb2NhbE5hbWVfOiBbe2dldCwgc2V0LCBub3RpZnl9XX0gdXNlZCB0byBtZXJnZSBhbGwgdGhlIGV4cG9ydCB1cGRhdGVycy5cbiAgY29uc3QgbG9jYWxHZXROb3RpZnk9ICBjcmVhdGUobnVsbCk7XG5cbiAgLy8ge1tpbXBvcnROYW1lOiBzdHJpbmddOiBub3RpZnkodXBkYXRlKG5ld1ZhbHVlKSl9IFVzZWQgYnkgY29kZSB0aGF0IGltcG9ydHNcbiAgLy8gb25lIG9mIHRoaXMgbW9kdWxlJ3MgZXhwb3J0cywgc28gdGhhdCB0aGVpciB1cGRhdGUgZnVuY3Rpb24gd2lsbFxuICAvLyBiZSBub3RpZmllZCB3aGVuIHRoaXMgYmluZGluZyBpcyBpbml0aWFsaXplZCBvciB1cGRhdGVkLlxuICBjb25zdCBub3RpZmllcnM9ICBjcmVhdGUobnVsbCk7XG5cbiAgYXJyYXlGb3JFYWNoKGVudHJpZXMoZml4ZWRFeHBvcnRNYXApLCAoW2ZpeGVkRXhwb3J0TmFtZSwgW2xvY2FsTmFtZV1dKT0+ICB7XG4gICAgbGV0IGZpeGVkR2V0Tm90aWZ5PSAgbG9jYWxHZXROb3RpZnlbbG9jYWxOYW1lXTtcbiAgICBpZiggIWZpeGVkR2V0Tm90aWZ5KSB7XG4gICAgICAvLyBmaXhlZCBiaW5kaW5nIHN0YXRlXG4gICAgICBsZXQgdmFsdWU7XG4gICAgICBsZXQgdGR6PSAgdHJ1ZTtcbiAgICAgIGxldCBvcHRVcGRhdGVycz0gIFtdO1xuXG4gICAgICAvLyB0ZHogc2Vuc2l0aXZlIGdldHRlclxuICAgICAgY29uc3QgZ2V0PSAgKCk9PiAge1xuICAgICAgICBpZiggdGR6KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgIGBiaW5kaW5nICR7cShsb2NhbE5hbWUpfSBub3QgeWV0IGluaXRpYWxpemVkYCk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgIH07XG5cbiAgICAgIC8vIGxlYXZlIHRkeiBvbmNlXG4gICAgICBjb25zdCBpbml0PSAgZnJlZXplKChpbml0VmFsdWUpPT57XG4gICAgICAgIC8vIGluaXQgd2l0aCBpbml0VmFsdWUgb2YgYSBkZWNsYXJlZCBjb25zdCBiaW5kaW5nLCBhbmQgcmV0dXJuXG4gICAgICAgIC8vIGl0LlxuICAgICAgICBpZiggIXRkeikge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgYEludGVybmFsOiBiaW5kaW5nICR7cShsb2NhbE5hbWUpfSBhbHJlYWR5IGluaXRpYWxpemVkYCk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgdmFsdWU9ICBpbml0VmFsdWU7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXJzPSAgb3B0VXBkYXRlcnM7XG4gICAgICAgIG9wdFVwZGF0ZXJzPSAgbnVsbDtcbiAgICAgICAgdGR6PSAgZmFsc2U7XG4gICAgICAgIGZvciggY29uc3QgdXBkYXRlciBvZiB1cGRhdGVycykge1xuICAgICAgICAgIHVwZGF0ZXIoaW5pdFZhbHVlKTtcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluaXRWYWx1ZTtcbiAgICAgICB9KTtcblxuICAgICAgLy8gSWYgc3RpbGwgdGR6LCByZWdpc3RlciB1cGRhdGUgZm9yIG5vdGlmaWNhdGlvbiBsYXRlci5cbiAgICAgIC8vIE90aGVyd2lzZSwgdXBkYXRlIG5vdy5cbiAgICAgIGNvbnN0IG5vdGlmeT0gICh1cGRhdGVyKT0+e1xuICAgICAgICBpZiggdXBkYXRlcj09PSAgaW5pdCkge1xuICAgICAgICAgIC8vIFByZXZlbnQgcmVjdXJzaW9uLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgaWYoIHRkeikge1xuICAgICAgICAgIGFycmF5UHVzaChvcHRVcGRhdGVycywgdXBkYXRlcik7XG4gICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgdXBkYXRlcih2YWx1ZSk7XG4gICAgICAgICB9XG4gICAgICAgfTtcblxuICAgICAgLy8gTmVlZCB0aGVzZSBmb3IgYWRkaXRpb25hbCBleHBvcnRzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZS5cbiAgICAgIGZpeGVkR2V0Tm90aWZ5PSAge1xuICAgICAgICBnZXQsXG4gICAgICAgIG5vdGlmeX07XG5cbiAgICAgIGxvY2FsR2V0Tm90aWZ5W2xvY2FsTmFtZV09ICBmaXhlZEdldE5vdGlmeTtcbiAgICAgIG9uY2VWYXJbbG9jYWxOYW1lXT0gIGluaXQ7XG4gICAgIH1cblxuICAgIGV4cG9ydHNQcm9wc1tmaXhlZEV4cG9ydE5hbWVdPSAge1xuICAgICAgZ2V0OiBmaXhlZEdldE5vdGlmeS5nZXQsXG4gICAgICBzZXQ6IHVuZGVmaW5lZCxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlfTtcblxuXG4gICAgbm90aWZpZXJzW2ZpeGVkRXhwb3J0TmFtZV09ICBmaXhlZEdldE5vdGlmeS5ub3RpZnk7XG4gICB9KTtcblxuICBhcnJheUZvckVhY2goXG4gICAgZW50cmllcyhsaXZlRXhwb3J0TWFwKSxcbiAgICAoW2xpdmVFeHBvcnROYW1lLCBbbG9jYWxOYW1lLCBzZXRQcm94eVRyYXBdXSk9PiAge1xuICAgICAgbGV0IGxpdmVHZXROb3RpZnk9ICBsb2NhbEdldE5vdGlmeVtsb2NhbE5hbWVdO1xuICAgICAgaWYoICFsaXZlR2V0Tm90aWZ5KSB7XG4gICAgICAgIC8vIGxpdmUgYmluZGluZyBzdGF0ZVxuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGxldCB0ZHo9ICB0cnVlO1xuICAgICAgICBjb25zdCB1cGRhdGVycz0gIFtdO1xuXG4gICAgICAgIC8vIHRkeiBzZW5zaXRpdmUgZ2V0dGVyXG4gICAgICAgIGNvbnN0IGdldD0gICgpPT4gIHtcbiAgICAgICAgICBpZiggdGR6KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgICBgYmluZGluZyAke3EobGl2ZUV4cG9ydE5hbWUpfSBub3QgeWV0IGluaXRpYWxpemVkYCk7XG5cbiAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgIH07XG5cbiAgICAgICAgLy8gVGhpcyBtdXN0IGJlIHVzYWJsZSBsb2NhbGx5IGZvciB0aGUgdHJhbnNsYXRpb24gb2YgaW5pdGlhbGl6aW5nXG4gICAgICAgIC8vIGEgZGVjbGFyZWQgbG9jYWwgbGl2ZSBiaW5kaW5nIHZhcmlhYmxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBGb3IgcmVleHBvcnRlZCB2YXJpYWJsZSwgdGhpcyBpcyBhbHNvIGFuIHVwZGF0ZSBmdW5jdGlvbiB0b1xuICAgICAgICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9uIHdpdGggdGhlIGRvd25zdHJlYW0gaW1wb3J0LCB3aGljaCB3ZVxuICAgICAgICAvLyBtdXN0IGFzc3VtZSB0byBiZSBsaXZlLiBUaHVzLCBpdCBjYW4gYmUgY2FsbGVkIGluZGVwZW5kZW50IG9mXG4gICAgICAgIC8vIHRkeiBidXQgYWx3YXlzIGxlYXZlcyB0ZHouIFN1Y2ggcmVleHBvcnRpbmcgY3JlYXRlcyBhIHRyZWUgb2ZcbiAgICAgICAgLy8gYmluZGluZ3MuIFRoaXMgbGV0cyB0aGUgdHJlZSBiZSBob29rZWQgdXAgZXZlbiBpZiB0aGUgaW1wb3J0ZWRcbiAgICAgICAgLy8gbW9kdWxlIGluc3RhbmNlIGlzbid0IGluaXRpYWxpemVkIHlldCwgYXMgbWF5IGhhcHBlbiBpbiBjeWNsZXMuXG4gICAgICAgIGNvbnN0IHVwZGF0ZT0gIGZyZWV6ZSgobmV3VmFsdWUpPT57XG4gICAgICAgICAgdmFsdWU9ICBuZXdWYWx1ZTtcbiAgICAgICAgICB0ZHo9ICBmYWxzZTtcbiAgICAgICAgICBmb3IoIGNvbnN0IHVwZGF0ZXIgb2YgdXBkYXRlcnMpIHtcbiAgICAgICAgICAgIHVwZGF0ZXIobmV3VmFsdWUpO1xuICAgICAgICAgICB9XG4gICAgICAgICB9KTtcblxuICAgICAgICAvLyB0ZHogc2Vuc2l0aXZlIHNldHRlclxuICAgICAgICBjb25zdCBzZXQ9ICAobmV3VmFsdWUpPT57XG4gICAgICAgICAgaWYoIHRkeikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgYGJpbmRpbmcgJHtxKGxvY2FsTmFtZSl9IG5vdCB5ZXQgaW5pdGlhbGl6ZWRgKTtcblxuICAgICAgICAgICB9XG4gICAgICAgICAgdmFsdWU9ICBuZXdWYWx1ZTtcbiAgICAgICAgICBmb3IoIGNvbnN0IHVwZGF0ZXIgb2YgdXBkYXRlcnMpIHtcbiAgICAgICAgICAgIHVwZGF0ZXIobmV3VmFsdWUpO1xuICAgICAgICAgICB9XG4gICAgICAgICB9O1xuXG4gICAgICAgIC8vIEFsd2F5cyByZWdpc3RlciB0aGUgdXBkYXRlciBmdW5jdGlvbi5cbiAgICAgICAgLy8gSWYgbm90IGluIHRkeiwgYWxzbyB1cGRhdGUgbm93LlxuICAgICAgICBjb25zdCBub3RpZnk9ICAodXBkYXRlcik9PntcbiAgICAgICAgICBpZiggdXBkYXRlcj09PSAgdXBkYXRlKSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IHJlY3Vyc2lvbi5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgfVxuICAgICAgICAgIGFycmF5UHVzaCh1cGRhdGVycywgdXBkYXRlcik7XG4gICAgICAgICAgaWYoICF0ZHopIHtcbiAgICAgICAgICAgIHVwZGF0ZXIodmFsdWUpO1xuICAgICAgICAgICB9XG4gICAgICAgICB9O1xuXG4gICAgICAgIGxpdmVHZXROb3RpZnk9ICB7XG4gICAgICAgICAgZ2V0LFxuICAgICAgICAgIG5vdGlmeX07XG5cblxuICAgICAgICBsb2NhbEdldE5vdGlmeVtsb2NhbE5hbWVdPSAgbGl2ZUdldE5vdGlmeTtcbiAgICAgICAgaWYoIHNldFByb3h5VHJhcCkge1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KG1vZHVsZUxleGljYWxzLCBsb2NhbE5hbWUsIHtcbiAgICAgICAgICAgIGdldCxcbiAgICAgICAgICAgIHNldCxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfSk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgbGl2ZVZhcltsb2NhbE5hbWVdPSAgdXBkYXRlO1xuICAgICAgIH1cblxuICAgICAgZXhwb3J0c1Byb3BzW2xpdmVFeHBvcnROYW1lXT0gIHtcbiAgICAgICAgZ2V0OiBsaXZlR2V0Tm90aWZ5LmdldCxcbiAgICAgICAgc2V0OiB1bmRlZmluZWQsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9O1xuXG5cbiAgICAgIG5vdGlmaWVyc1tsaXZlRXhwb3J0TmFtZV09ICBsaXZlR2V0Tm90aWZ5Lm5vdGlmeTtcbiAgICAgfSk7XG5cblxuICBjb25zdCBub3RpZnlTdGFyPSAgKHVwZGF0ZSk9PntcbiAgICB1cGRhdGUocHJveGllZEV4cG9ydHMpO1xuICAgfTtcbiAgbm90aWZpZXJzWycqJ109ICBub3RpZnlTdGFyO1xuXG4gIC8vIFBlciB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZvciB0aGUgbW9kdWxlRnVuY3RvciBnZW5lcmF0ZWQgZnJvbVxuICAvLyBhbiBFU00sIHRoZSBgaW1wb3J0c2AgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgb25jZSB1cCBmcm9udFxuICAvLyB0byBwb3B1bGF0ZSBvciBhcnJhbmdlIHRoZSBwb3B1bGF0aW9uIG9mIGltcG9ydHMgYW5kIHJlZXhwb3J0cy5cbiAgLy8gVGhlIGdlbmVyYXRlZCBjb2RlIHByb2R1Y2VzIGFuIGB1cGRhdGVSZWNvcmRgOiB0aGUgbWVhbnMgZm9yXG4gIC8vIHRoZSBsaW5rZXIgdG8gdXBkYXRlIHRoZSBpbXBvcnRzIGFuZCBleHBvcnRzIG9mIHRoZSBtb2R1bGUuXG4gIC8vIFRoZSB1cGRhdGVSZWNvcmQgbXVzdCBjb25mb3JtIHRvIG1vZHVsZUFuYWx5c2lzLmltcG9ydHNcbiAgLy8gdXBkYXRlUmVjb3JkID0gTWFwPHNwZWNpZmllciwgaW1wb3J0VXBkYXRlcnM+XG4gIC8vIGltcG9ydFVwZGF0ZXJzID0gTWFwPGltcG9ydE5hbWUsIFt1cGRhdGUobmV3VmFsdWUpKl0+XG4gIGZ1bmN0aW9uIGltcG9ydHModXBkYXRlUmVjb3JkKSB7XG4gICAgLy8gQnkgdGhlIHRpbWUgaW1wb3J0cyBpcyBjYWxsZWQsIHRoZSBpbXBvcnRlZEluc3RhbmNlcyBzaG91bGQgYWxyZWFkeSBiZVxuICAgIC8vIGluaXRpYWxpemVkIHdpdGggbW9kdWxlIGluc3RhbmNlcyB0aGF0IHNhdGlzZnlcbiAgICAvLyBpbXBvcnRzLlxuICAgIC8vIGltcG9ydGVkSW5zdGFuY2VzID0gTWFwW19zcGVjaWZpZXJfLCB7IG5vdGlmaWVycywgbW9kdWxlLCBleGVjdXRlIH1dXG4gICAgLy8gbm90aWZpZXJzID0geyBbaW1wb3J0TmFtZTogc3RyaW5nXTogbm90aWZ5KHVwZGF0ZShuZXdWYWx1ZSkpfVxuXG4gICAgLy8gZXhwb3J0ICogY2Fubm90IGV4cG9ydCBkZWZhdWx0LlxuICAgIGNvbnN0IGNhbmRpZGF0ZUFsbD0gIGNyZWF0ZShudWxsKTtcbiAgICBjYW5kaWRhdGVBbGwuZGVmYXVsdD0gIGZhbHNlO1xuICAgIGZvciggY29uc3QgW3NwZWNpZmllciwgaW1wb3J0VXBkYXRlcnNdb2YgIHVwZGF0ZVJlY29yZCkge1xuICAgICAgY29uc3QgaW5zdGFuY2U9ICBtYXBHZXQoaW1wb3J0ZWRJbnN0YW5jZXMsIHNwZWNpZmllcik7XG4gICAgICAvLyBUaGUgbW9kdWxlIGluc3RhbmNlIG9iamVjdCBpcyBhbiBpbnRlcm5hbCBsaXRlcmFsLCBkb2VzIG5vdCBiaW5kIHRoaXMsXG4gICAgICAvLyBhbmQgbmV2ZXIgcmV2ZWFsZWQgb3V0c2lkZSB0aGUgU0VTIHNoaW0uXG4gICAgICAvLyBUaGVyZSBhcmUgdHdvIGluc3RhbnRpYXRpb24gc2l0ZXMgZm9yIGluc3RhbmNlcyBhbmQgdGhleSBhcmUgYm90aCBpblxuICAgICAgLy8gdGhpcyBtb2R1bGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgaW5zdGFuY2UuZXhlY3V0ZSgpOyAvLyBib3R0b20gdXAgY3ljbGUgdG9sZXJhbnRcbiAgICAgIGNvbnN0IHsgbm90aWZpZXJzOiBpbXBvcnROb3RpZmllcnN9PSAgIGluc3RhbmNlO1xuICAgICAgZm9yKCBjb25zdCBbaW1wb3J0TmFtZSwgdXBkYXRlcnNdb2YgIGltcG9ydFVwZGF0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydE5vdGlmeT0gIGltcG9ydE5vdGlmaWVyc1tpbXBvcnROYW1lXTtcbiAgICAgICAgaWYoICFpbXBvcnROb3RpZnkpIHtcbiAgICAgICAgICB0aHJvdyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgICBgVGhlIHJlcXVlc3RlZCBtb2R1bGUgJyR7c3BlY2lmaWVyfScgZG9lcyBub3QgcHJvdmlkZSBhbiBleHBvcnQgbmFtZWQgJyR7aW1wb3J0TmFtZX0nYCk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgZm9yKCBjb25zdCB1cGRhdGVyIG9mIHVwZGF0ZXJzKSB7XG4gICAgICAgICAgaW1wb3J0Tm90aWZ5KHVwZGF0ZXIpO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgIGlmKCBhcnJheUluY2x1ZGVzKGV4cG9ydEFsbHMsIHNwZWNpZmllcikpIHtcbiAgICAgICAgLy8gTWFrZSBhbGwgdGhlc2UgaW1wb3J0cyBjYW5kaWRhdGVzLlxuICAgICAgICBmb3IoIGNvbnN0IFtpbXBvcnROYW1lLCBpbXBvcnROb3RpZnldb2YgIGVudHJpZXMoaW1wb3J0Tm90aWZpZXJzKSkge1xuICAgICAgICAgIGlmKCBjYW5kaWRhdGVBbGxbaW1wb3J0TmFtZV09PT0gIHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FuZGlkYXRlQWxsW2ltcG9ydE5hbWVdPSAgaW1wb3J0Tm90aWZ5O1xuICAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGEgY2FuZGlkYXRlOiByZW1vdmUgYW1iaWd1aXR5LlxuICAgICAgICAgICAgY2FuZGlkYXRlQWxsW2ltcG9ydE5hbWVdPSAgZmFsc2U7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cblxuICAgIGZvciggY29uc3QgW2ltcG9ydE5hbWUsIG5vdGlmeV1vZiAgZW50cmllcyhjYW5kaWRhdGVBbGwpKSB7XG4gICAgICBpZiggIW5vdGlmaWVyc1tpbXBvcnROYW1lXSYmICBub3RpZnkhPT0gIGZhbHNlKSB7XG4gICAgICAgIG5vdGlmaWVyc1tpbXBvcnROYW1lXT0gIG5vdGlmeTtcblxuICAgICAgICAvLyBleHBvcnRlZCBsaXZlIGJpbmRpbmcgc3RhdGVcbiAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICBjb25zdCB1cGRhdGU9ICAobmV3VmFsdWUpPT4gdmFsdWU9ICBuZXdWYWx1ZTtcbiAgICAgICAgbm90aWZ5KHVwZGF0ZSk7XG4gICAgICAgIGV4cG9ydHNQcm9wc1tpbXBvcnROYW1lXT0gIHtcbiAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiB1bmRlZmluZWQsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfTtcblxuICAgICAgIH1cbiAgICAgfVxuXG4gICAgLy8gU29ydCB0aGUgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlIGFzIHBlciBzcGVjLlxuICAgIC8vIFRoZSBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2Ugd2lsbCBiZSB3cmFwcGVkIGluIGEgbW9kdWxlIG5hbWVzcGFjZVxuICAgIC8vIGV4cG9ydHMgcHJveHkgd2hpY2ggd2lsbCBzZXJ2ZSBhcyBhIFwibW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlIGV4b3RpY1xuICAgIC8vIG9iamVjdFwiLlxuICAgIC8vIFNvcnRpbmcgcHJvcGVydGllcyBpcyBub3QgZ2VuZXJhbGx5IHJlbGlhYmxlIGJlY2F1c2Ugc29tZSBwcm9wZXJ0aWVzIG1heVxuICAgIC8vIGJlIHN5bWJvbHMsIGFuZCBzeW1ib2xzIGRvIG5vdCBoYXZlIGFuIGluaGVyZW50IHJlbGF0aXZlIG9yZGVyLCBidXRcbiAgICAvLyBzaW5jZSBhbGwgcHJvcGVydGllcyBvZiB0aGUgZXhwb3J0cyBuYW1lc3BhY2UgbXVzdCBiZSBrZXllZCBieSBhIHN0cmluZ1xuICAgIC8vIGFuZCB0aGUgc3RyaW5nIG11c3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIGlkZW50aWZpZXIsIHNvcnRpbmcgdGhlc2VcbiAgICAvLyBwcm9wZXJ0aWVzIHdvcmtzIGZvciB0aGlzIHNwZWNpZmljIGNhc2UuXG4gICAgYXJyYXlGb3JFYWNoKGFycmF5U29ydChrZXlzKGV4cG9ydHNQcm9wcykpLCAoayk9PlxuICAgICAgZGVmaW5lUHJvcGVydHkocHJveGllZEV4cG9ydHMsIGssIGV4cG9ydHNQcm9wc1trXSkpO1xuXG5cbiAgICBmcmVlemUocHJveGllZEV4cG9ydHMpO1xuICAgIGFjdGl2YXRlKCk7XG4gICB9XG5cbiAgbGV0IG9wdEZ1bmN0b3I9ICBjb21wYXJ0bWVudEV2YWx1YXRlKGNvbXBhcnRtZW50RmllbGRzLCBmdW5jdG9yU291cmNlLCB7XG4gICAgZ2xvYmFsT2JqZWN0OiBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLFxuICAgIHRyYW5zZm9ybXM6IF9fc2hpbVRyYW5zZm9ybXNfXyxcbiAgICBfX21vZHVsZVNoaW1MZXhpY2Fsc19fOiBtb2R1bGVMZXhpY2Fsc30pO1xuXG4gIGxldCBkaWRUaHJvdz0gIGZhbHNlO1xuICBsZXQgdGhyb3duRXJyb3I7XG4gIGZ1bmN0aW9uIGV4ZWN1dGUoKSB7XG4gICAgaWYoIG9wdEZ1bmN0b3IpIHtcbiAgICAgIC8vIHVuaW5pdGlhbGl6ZWRcbiAgICAgIGNvbnN0IGZ1bmN0b3I9ICBvcHRGdW5jdG9yO1xuICAgICAgb3B0RnVuY3Rvcj0gIG51bGw7XG4gICAgICAvLyBpbml0aWFsaXppbmcgLSBjYWxsIHdpdGggYHRoaXNgIG9mIGB1bmRlZmluZWRgLlxuICAgICAgdHJ5IHtcbiAgICAgICAgZnVuY3RvcihcbiAgICAgICAgICBmcmVlemUoe1xuICAgICAgICAgICAgaW1wb3J0czogZnJlZXplKGltcG9ydHMpLFxuICAgICAgICAgICAgb25jZVZhcjogZnJlZXplKG9uY2VWYXIpLFxuICAgICAgICAgICAgbGl2ZVZhcjogZnJlZXplKGxpdmVWYXIpLFxuICAgICAgICAgICAgaW1wb3J0TWV0YX0pKTtcblxuXG4gICAgICAgfWNhdGNoKCBlKSB7XG4gICAgICAgIGRpZFRocm93PSAgdHJ1ZTtcbiAgICAgICAgdGhyb3duRXJyb3I9ICBlO1xuICAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVkXG4gICAgIH1cbiAgICBpZiggZGlkVGhyb3cpIHtcbiAgICAgIHRocm93IHRocm93bkVycm9yO1xuICAgICB9XG4gICB9XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgbm90aWZpZXJzLFxuICAgIGV4cG9ydHNQcm94eSxcbiAgICBleGVjdXRlfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1vZHVsZUluc3RhbmNlKG1ha2VNb2R1bGVJbnN0YW5jZSk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzIxXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxtYWtlTW9kdWxlSW5zdGFuY2UsbWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZSxNYXAsUmVmZXJlbmNlRXJyb3IsVHlwZUVycm9yLGVudHJpZXMsaXNBcnJheSxpc09iamVjdCxtYXBHZXQsbWFwSGFzLG1hcFNldCx3ZWFrbWFwR2V0OyRo4oCNX2ltcG9ydHMoW1tcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCIuL21vZHVsZS1pbnN0YW5jZS5qc1wiLCBbW1wibWFrZU1vZHVsZUluc3RhbmNlXCIsIFskaOKAjV9hID0+IChtYWtlTW9kdWxlSW5zdGFuY2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21tb25zLmpzXCIsIFtbXCJNYXBcIiwgWyRo4oCNX2EgPT4gKE1hcCA9ICRo4oCNX2EpXV0sW1wiUmVmZXJlbmNlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFJlZmVyZW5jZUVycm9yID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiZW50cmllc1wiLCBbJGjigI1fYSA9PiAoZW50cmllcyA9ICRo4oCNX2EpXV0sW1wiaXNBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNBcnJheSA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYXBHZXRcIiwgWyRo4oCNX2EgPT4gKG1hcEdldCA9ICRo4oCNX2EpXV0sW1wibWFwSGFzXCIsIFskaOKAjV9hID0+IChtYXBIYXMgPSAkaOKAjV9hKV1dLFtcIm1hcFNldFwiLCBbJGjigI1fYSA9PiAobWFwU2V0ID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwR2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwR2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IEZhaWwsIHF1b3RlOiBxfT0gICBhc3NlcnQ7XG5cbi8vIGBsaW5rYCBjcmVhdGVzIGBNb2R1bGVJbnN0YW5jZXNgIGFuZCBgTW9kdWxlTmFtZXNwYWNlc2AgZm9yIGEgbW9kdWxlIGFuZCBpdHNcbi8vIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGFuZCBjb25uZWN0cyB0aGVpciBpbXBvcnRzIGFuZCBleHBvcnRzLlxuLy8gQWZ0ZXIgbGlua2luZywgdGhlIHJlc3VsdGluZyB3b3JraW5nIHNldCBpcyByZWFkeSB0byBiZSBleGVjdXRlZC5cbi8vIFRoZSBsaW5rZXIgb25seSBjb25jZXJucyBpdHNlbGYgd2l0aCBtb2R1bGUgbmFtZXNwYWNlcyB0aGF0IGFyZSBvYmplY3RzIHdpdGhcbi8vIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGVpciBleHBvcnRzLCB3aGljaCB0aGUgQ29tcGFydG1lbnQgcHJveGllcyB3aXRoXG4vLyB0aGUgYWN0dWFsIGBNb2R1bGVOYW1lc3BhY2VgLlxuY29uc3QgICAgICAgIGxpbms9ICAoXG4gIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgY29tcGFydG1lbnQsXG4gIG1vZHVsZVNwZWNpZmllcik9PlxuICAgICB7XG4gIGNvbnN0IHsgbmFtZTogY29tcGFydG1lbnROYW1lLCBtb2R1bGVSZWNvcmRzfT0gICB3ZWFrbWFwR2V0KFxuICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICBjb21wYXJ0bWVudCk7XG5cblxuICBjb25zdCBtb2R1bGVSZWNvcmQ9ICBtYXBHZXQobW9kdWxlUmVjb3JkcywgbW9kdWxlU3BlY2lmaWVyKTtcbiAgaWYoIG1vZHVsZVJlY29yZD09PSAgdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgIGBNaXNzaW5nIGxpbmsgdG8gbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBmcm9tIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgY29tcGFydG1lbnROYW1lKVxuICAgICAgICB9YCk7XG5cbiAgIH1cblxuICAvLyBNdXR1YWwgcmVjdXJzaW9uIHNvIHRoZXJlJ3Mgbm8gY29uZnVzaW9uIGFib3V0IHdoaWNoXG4gIC8vIGNvbXBhcnRtZW50IGlzIGluIGNvbnRleHQ6IHRoZSBtb2R1bGUgcmVjb3JkIG1heSBiZSBpbiBhbm90aGVyXG4gIC8vIGNvbXBhcnRtZW50LCBkZW5vdGVkIGJ5IG1vZHVsZVJlY29yZC5jb21wYXJ0bWVudC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIHJldHVybiBpbnN0YW50aWF0ZShjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsIG1vZHVsZUFsaWFzZXMsIG1vZHVsZVJlY29yZCk7XG4gfTskaOKAjV9vbmNlLmxpbmsobGluayk7XG5cbmZ1bmN0aW9uIGlzUHJlY29tcGlsZWQoc3RhdGljTW9kdWxlUmVjb3JkKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGljTW9kdWxlUmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXz09PSAgJ3N0cmluZyc7XG4gfVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByZWNvbXBpbGVkU3RhdGljTW9kdWxlUmVjb3JkKFxuICBzdGF0aWNNb2R1bGVSZWNvcmQsXG4gIG1vZHVsZVNwZWNpZmllcilcbiAge1xuICBjb25zdCB7IF9fZml4ZWRFeHBvcnRNYXBfXywgX19saXZlRXhwb3J0TWFwX199PSAgIHN0YXRpY01vZHVsZVJlY29yZDtcbiAgaXNPYmplY3QoX19maXhlZEV4cG9ydE1hcF9fKXx8XG4gICAgRmFpbCBgUHJvcGVydHkgJ19fZml4ZWRFeHBvcnRNYXBfXycgb2YgYSBwcmVjb21waWxlZCBtb2R1bGUgcmVjb3JkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKFxuICAgICAgX19maXhlZEV4cG9ydE1hcF9fKVxuICAgICAgfSwgZm9yIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX1gO1xuICBpc09iamVjdChfX2xpdmVFeHBvcnRNYXBfXyl8fFxuICAgIEZhaWwgYFByb3BlcnR5ICdfX2xpdmVFeHBvcnRNYXBfXycgb2YgYSBwcmVjb21waWxlZCBtb2R1bGUgcmVjb3JkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKFxuICAgICAgX19saXZlRXhwb3J0TWFwX18pXG4gICAgICB9LCBmb3IgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfWA7XG4gfVxuXG5mdW5jdGlvbiBpc1RoaXJkUGFydHkoc3RhdGljTW9kdWxlUmVjb3JkKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGljTW9kdWxlUmVjb3JkLmV4ZWN1dGU9PT0gICdmdW5jdGlvbic7XG4gfVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVRoaXJkUGFydHlTdGF0aWNNb2R1bGVSZWNvcmQoXG4gIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgbW9kdWxlU3BlY2lmaWVyKVxuICB7XG4gIGNvbnN0IHsgZXhwb3J0c309ICAgc3RhdGljTW9kdWxlUmVjb3JkO1xuICBpc0FycmF5KGV4cG9ydHMpfHxcbiAgICBGYWlsIGBQcm9wZXJ0eSAnZXhwb3J0cycgb2YgYSB0aGlyZC1wYXJ0eSBzdGF0aWMgbW9kdWxlIHJlY29yZCBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHtxKFxuICAgICAgZXhwb3J0cylcbiAgICAgIH0sIGZvciBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3RhdGljTW9kdWxlUmVjb3JkKHN0YXRpY01vZHVsZVJlY29yZCwgbW9kdWxlU3BlY2lmaWVyKSB7XG4gIGlzT2JqZWN0KHN0YXRpY01vZHVsZVJlY29yZCl8fFxuICAgIEZhaWwgYFN0YXRpYyBtb2R1bGUgcmVjb3JkcyBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LCBnb3QgJHtxKFxuICAgICAgc3RhdGljTW9kdWxlUmVjb3JkKVxuICAgICAgfSwgZm9yIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX1gO1xuICBjb25zdCB7IGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cz0gIFtdfT0gICBzdGF0aWNNb2R1bGVSZWNvcmQ7XG4gIGlzQXJyYXkoaW1wb3J0cyl8fFxuICAgIEZhaWwgYFByb3BlcnR5ICdpbXBvcnRzJyBvZiBhIHN0YXRpYyBtb2R1bGUgcmVjb3JkIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke3EoXG4gICAgICBpbXBvcnRzKVxuICAgICAgfSwgZm9yIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX1gO1xuICBpc0FycmF5KGV4cG9ydHMpfHxcbiAgICBGYWlsIGBQcm9wZXJ0eSAnZXhwb3J0cycgb2YgYSBwcmVjb21waWxlZCBtb2R1bGUgcmVjb3JkIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke3EoXG4gICAgICBleHBvcnRzKVxuICAgICAgfSwgZm9yIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX1gO1xuICBpc0FycmF5KHJlZXhwb3J0cyl8fFxuICAgIEZhaWwgYFByb3BlcnR5ICdyZWV4cG9ydHMnIG9mIGEgcHJlY29tcGlsZWQgbW9kdWxlIHJlY29yZCBtdXN0IGJlIGFuIGFycmF5IGlmIHByZXNlbnQsIGdvdCAke3EoXG4gICAgICByZWV4cG9ydHMpXG4gICAgICB9LCBmb3IgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfWA7XG4gfVxuXG5jb25zdCAgICAgICAgaW5zdGFudGlhdGU9ICAoXG4gIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgbW9kdWxlUmVjb3JkKT0+XG4gICAgIHtcbiAgY29uc3Qge1xuICAgIGNvbXBhcnRtZW50LFxuICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICByZXNvbHZlZEltcG9ydHMsXG4gICAgc3RhdGljTW9kdWxlUmVjb3JkfT1cbiAgICAgIG1vZHVsZVJlY29yZDtcbiAgY29uc3QgeyBpbnN0YW5jZXN9PSAgIHdlYWttYXBHZXQoY29tcGFydG1lbnRQcml2YXRlRmllbGRzLCBjb21wYXJ0bWVudCk7XG5cbiAgLy8gTWVtb2l6ZS5cbiAgaWYoIG1hcEhhcyhpbnN0YW5jZXMsIG1vZHVsZVNwZWNpZmllcikpIHtcbiAgICByZXR1cm4gbWFwR2V0KGluc3RhbmNlcywgbW9kdWxlU3BlY2lmaWVyKTtcbiAgIH1cblxuICB2YWxpZGF0ZVN0YXRpY01vZHVsZVJlY29yZChzdGF0aWNNb2R1bGVSZWNvcmQsIG1vZHVsZVNwZWNpZmllcik7XG5cbiAgY29uc3QgaW1wb3J0ZWRJbnN0YW5jZXM9ICBuZXcgTWFwKCk7XG4gIGxldCBtb2R1bGVJbnN0YW5jZTtcbiAgaWYoIGlzUHJlY29tcGlsZWQoc3RhdGljTW9kdWxlUmVjb3JkKSkge1xuICAgIHZhbGlkYXRlUHJlY29tcGlsZWRTdGF0aWNNb2R1bGVSZWNvcmQoc3RhdGljTW9kdWxlUmVjb3JkLCBtb2R1bGVTcGVjaWZpZXIpO1xuICAgIG1vZHVsZUluc3RhbmNlPSAgbWFrZU1vZHVsZUluc3RhbmNlKFxuICAgICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIG1vZHVsZVJlY29yZCxcbiAgICAgIGltcG9ydGVkSW5zdGFuY2VzKTtcblxuICAgfWVsc2UgaWYoIGlzVGhpcmRQYXJ0eShzdGF0aWNNb2R1bGVSZWNvcmQpKSB7XG4gICAgdmFsaWRhdGVUaGlyZFBhcnR5U3RhdGljTW9kdWxlUmVjb3JkKHN0YXRpY01vZHVsZVJlY29yZCwgbW9kdWxlU3BlY2lmaWVyKTtcbiAgICBtb2R1bGVJbnN0YW5jZT0gIG1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2UoXG4gICAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgICBzdGF0aWNNb2R1bGVSZWNvcmQsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICByZXNvbHZlZEltcG9ydHMpO1xuXG4gICB9ZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICBgaW1wb3J0SG9vayBtdXN0IHJldHVybiBhIHN0YXRpYyBtb2R1bGUgcmVjb3JkLCBnb3QgJHtxKFxuICAgICAgICBzdGF0aWNNb2R1bGVSZWNvcmQpXG4gICAgICAgIH1gKTtcblxuICAgfVxuXG4gIC8vIE1lbW9pemUuXG4gIG1hcFNldChpbnN0YW5jZXMsIG1vZHVsZVNwZWNpZmllciwgbW9kdWxlSW5zdGFuY2UpO1xuXG4gIC8vIExpbmsgZGVwZW5kZW5jeSBtb2R1bGVzLlxuICBmb3IoIGNvbnN0IFtpbXBvcnRTcGVjaWZpZXIsIHJlc29sdmVkU3BlY2lmaWVyXW9mICBlbnRyaWVzKHJlc29sdmVkSW1wb3J0cykpIHtcbiAgICBjb25zdCBpbXBvcnRlZEluc3RhbmNlPSAgbGluayhcbiAgICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICAgIHJlc29sdmVkU3BlY2lmaWVyKTtcblxuICAgIG1hcFNldChpbXBvcnRlZEluc3RhbmNlcywgaW1wb3J0U3BlY2lmaWVyLCBpbXBvcnRlZEluc3RhbmNlKTtcbiAgIH1cblxuICByZXR1cm4gbW9kdWxlSW5zdGFuY2U7XG4gfTskaOKAjV9vbmNlLmluc3RhbnRpYXRlKGluc3RhbnRpYXRlKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMjJdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTWFwLFJlZmVyZW5jZUVycm9yLFR5cGVFcnJvcixXZWFrTWFwLGFzc2lnbixkZWZpbmVQcm9wZXJ0aWVzLGVudHJpZXMscHJvbWlzZVRoZW4sd2Vha21hcEdldCx3ZWFrbWFwU2V0LHNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzLHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcyxzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcyxzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzLHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMsbG9hZCxsaW5rLGdldERlZmVycmVkRXhwb3J0cyxhc3NlcnQsY29tcGFydG1lbnRFdmFsdWF0ZSxtYWtlU2FmZUV2YWx1YXRvcjskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIk1hcFwiLCBbJGjigI1fYSA9PiAoTWFwID0gJGjigI1fYSldXSxbXCJSZWZlcmVuY2VFcnJvclwiLCBbJGjigI1fYSA9PiAoUmVmZXJlbmNlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJXZWFrTWFwXCIsIFskaOKAjV9hID0+IChXZWFrTWFwID0gJGjigI1fYSldXSxbXCJhc3NpZ25cIiwgWyRo4oCNX2EgPT4gKGFzc2lnbiA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydGllcyA9ICRo4oCNX2EpXV0sW1wiZW50cmllc1wiLCBbJGjigI1fYSA9PiAoZW50cmllcyA9ICRo4oCNX2EpXV0sW1wicHJvbWlzZVRoZW5cIiwgWyRo4oCNX2EgPT4gKHByb21pc2VUaGVuID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwR2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwR2V0ID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwU2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwU2V0ID0gJGjigI1fYSldXV1dLFtcIi4vZ2xvYmFsLW9iamVjdC5qc1wiLCBbW1wic2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzID0gJGjigI1fYSldXSxbXCJzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcyA9ICRo4oCNX2EpXV0sW1wic2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzXCIsIFskaOKAjV9hID0+IChzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzID0gJGjigI1fYSldXV1dLFtcIi4vd2hpdGVsaXN0LmpzXCIsIFtbXCJzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+IChzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzID0gJGjigI1fYSldXV1dLFtcIi4vbW9kdWxlLWxvYWQuanNcIiwgW1tcImxvYWRcIiwgWyRo4oCNX2EgPT4gKGxvYWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9tb2R1bGUtbGluay5qc1wiLCBbW1wibGlua1wiLCBbJGjigI1fYSA9PiAobGluayA9ICRo4oCNX2EpXV1dXSxbXCIuL21vZHVsZS1wcm94eS5qc1wiLCBbW1wiZ2V0RGVmZXJyZWRFeHBvcnRzXCIsIFskaOKAjV9hID0+IChnZXREZWZlcnJlZEV4cG9ydHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtZXZhbHVhdGUuanNcIiwgW1tcImNvbXBhcnRtZW50RXZhbHVhdGVcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcnRtZW50RXZhbHVhdGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlLXNhZmUtZXZhbHVhdG9yLmpzXCIsIFtbXCJtYWtlU2FmZUV2YWx1YXRvclwiLCBbJGjigI1fYSA9PiAobWFrZVNhZmVFdmFsdWF0b3IgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IHF1b3RlOiBxfT0gICBhc3NlcnQ7XG5cbi8vIG1vZHVsZUFsaWFzZXMgYXNzb2NpYXRlcyBldmVyeSBwdWJsaWMgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlIHdpdGggaXRzXG4vLyBjb3JyZXNwb25kaW5nIGNvbXBhcnRtZW50IGFuZCBzcGVjaWZpZXIgc28gdGhleSBjYW4gYmUgdXNlZCB0byBsaW5rIG1vZHVsZXNcbi8vIGFjcm9zcyBjb21wYXJ0bWVudHMuXG4vLyBUaGUgbWVjaGFuaXNtIHRvIHRocmVhZCBhbiBhbGlhcyBpcyB0byB1c2UgdGhlIGNvbXBhcnRtZW50Lm1vZHVsZSBmdW5jdGlvblxuLy8gdG8gb2J0YWluIHRoZSBleHBvcnRzIG5hbWVzcGFjZSBvZiBhIGZvcmVpZ24gbW9kdWxlIGFuZCBwYXNzIGl0IGludG8gYW5vdGhlclxuLy8gY29tcGFydG1lbnQncyBtb2R1bGVNYXAgY29uc3RydWN0b3Igb3B0aW9uLlxuY29uc3QgbW9kdWxlQWxpYXNlcz0gIG5ldyBXZWFrTWFwKCk7XG5cbi8vIHByaXZhdGVGaWVsZHMgY2FwdHVyZXMgdGhlIHByaXZhdGUgc3RhdGUgZm9yIGVhY2ggY29tcGFydG1lbnQuXG5jb25zdCBwcml2YXRlRmllbGRzPSAgbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7KHNvdXJjZTogc3RyaW5nKSA9PiBzdHJpbmd9IFRyYW5zZm9ybVxuICovXG5cbi8vIENvbXBhcnRtZW50cyBkbyBub3QgbmVlZCBhbiBpbXBvcnRIb29rIG9yIHJlc29sdmVIb29rIHRvIGJlIHVzZWZ1bFxuLy8gYXMgYSB2ZXNzZWwgZm9yIGV2YWx1YXRpbmcgcHJvZ3JhbXMuXG4vLyBIb3dldmVyLCBhbnkgbWV0aG9kIHRoYXQgb3BlcmF0ZXMgdGhlIG1vZHVsZSBzeXN0ZW0gd2lsbCB0aHJvdyBhbiBleGNlcHRpb25cbi8vIGlmIHRoZXNlIGhvb2tzIGFyZSBub3QgYXZhaWxhYmxlLlxuY29uc3QgYXNzZXJ0TW9kdWxlSG9va3M9ICAoY29tcGFydG1lbnQpPT57XG4gIGNvbnN0IHsgaW1wb3J0SG9vaywgcmVzb2x2ZUhvb2t9PSAgIHdlYWttYXBHZXQocHJpdmF0ZUZpZWxkcywgY29tcGFydG1lbnQpO1xuICBpZiggdHlwZW9mIGltcG9ydEhvb2shPT0gICdmdW5jdGlvbid8fCAgdHlwZW9mIHJlc29sdmVIb29rIT09ICAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdDb21wYXJ0bWVudCBtdXN0IGJlIGNvbnN0cnVjdGVkIHdpdGggYW4gaW1wb3J0SG9vayBhbmQgYSByZXNvbHZlSG9vayBmb3IgaXQgdG8gYmUgYWJsZSB0byBsb2FkIG1vZHVsZXMnKTtcblxuICAgfVxuIH07XG5cbmNvbnN0ICAgICAgICBJbmVydENvbXBhcnRtZW50PSAgZnVuY3Rpb24gQ29tcGFydG1lbnQoXG4gIF9lbmRvd21lbnRzPSAge30sXG4gIF9tb2R1bGVzPSAge30sXG4gIF9vcHRpb25zPSAge30pXG4gIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnQ29tcGFydG1lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yIGlzIG5vdCBhIHZhbGlkIGNvbnN0cnVjdG9yLicpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBjb21wYXJ0bWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICovJGjigI1fb25jZS5JbmVydENvbXBhcnRtZW50KEluZXJ0Q29tcGFydG1lbnQpO1xuY29uc3QgY29tcGFydG1lbnRJbXBvcnROb3c9ICAoY29tcGFydG1lbnQsIHNwZWNpZmllcik9PiAge1xuICBjb25zdCB7IGV4ZWN1dGUsIGV4cG9ydHNQcm94eX09ICAgbGluayhcbiAgICBwcml2YXRlRmllbGRzLFxuICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgY29tcGFydG1lbnQsXG4gICAgc3BlY2lmaWVyKTtcblxuICBleGVjdXRlKCk7XG4gIHJldHVybiBleHBvcnRzUHJveHk7XG4gfTtcblxuY29uc3QgICAgICAgIENvbXBhcnRtZW50UHJvdG90eXBlPSAge1xuICBjb25zdHJ1Y3RvcjogSW5lcnRDb21wYXJ0bWVudCxcblxuICBnZXQgZ2xvYmFsVGhpcygpIHtcbiAgICByZXR1cm4gd2Vha21hcEdldChwcml2YXRlRmllbGRzLCB0aGlzKS5nbG9iYWxPYmplY3Q7XG4gICB9LFxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB3ZWFrbWFwR2V0KHByaXZhdGVGaWVsZHMsIHRoaXMpLm5hbWU7XG4gICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIGlzIGEgSmF2YVNjcmlwdCBwcm9ncmFtIGdyYW1tYXIgY29uc3RydWN0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqIEBwYXJhbSB7QXJyYXk8VHJhbnNmb3JtPn0gW29wdGlvbnMudHJhbnNmb3Jtc11cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zbG9wcHlHbG9iYWxzTW9kZV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLl9fbW9kdWxlU2hpbUxleGljYWxzX19dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuX19ldmFkZUh0bWxDb21tZW50VGVzdF9fXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLl9fZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdF9fXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLl9fcmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9uc19fXVxuICAgKi9cbiAgZXZhbHVhdGUoc291cmNlLCBvcHRpb25zPSAge30pIHtcbiAgICBjb25zdCBjb21wYXJ0bWVudEZpZWxkcz0gIHdlYWttYXBHZXQocHJpdmF0ZUZpZWxkcywgdGhpcyk7XG4gICAgcmV0dXJuIGNvbXBhcnRtZW50RXZhbHVhdGUoY29tcGFydG1lbnRGaWVsZHMsIHNvdXJjZSwgb3B0aW9ucyk7XG4gICB9LFxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCBDb21wYXJ0bWVudF0nO1xuICAgfSxcblxuICBtb2R1bGUoc3BlY2lmaWVyKSB7XG4gICAgaWYoIHR5cGVvZiBzcGVjaWZpZXIhPT0gICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBvZiBtb2R1bGUoKSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgIH1cblxuICAgIGFzc2VydE1vZHVsZUhvb2tzKHRoaXMpO1xuXG4gICAgY29uc3QgeyBleHBvcnRzUHJveHl9PSAgIGdldERlZmVycmVkRXhwb3J0cyhcbiAgICAgIHRoaXMsXG4gICAgICB3ZWFrbWFwR2V0KHByaXZhdGVGaWVsZHMsIHRoaXMpLFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIHNwZWNpZmllcik7XG5cblxuICAgIHJldHVybiBleHBvcnRzUHJveHk7XG4gICB9LFxuXG4gICAgICAgIGFzeW5jIGltcG9ydChzcGVjaWZpZXIpe1xuICAgIGlmKCB0eXBlb2Ygc3BlY2lmaWVyIT09ICAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlyc3QgYXJndW1lbnQgb2YgaW1wb3J0KCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICB9XG5cbiAgICBhc3NlcnRNb2R1bGVIb29rcyh0aGlzKTtcblxuICAgIHJldHVybiBwcm9taXNlVGhlbihcbiAgICAgIGxvYWQocHJpdmF0ZUZpZWxkcywgbW9kdWxlQWxpYXNlcywgdGhpcywgc3BlY2lmaWVyKSxcbiAgICAgICgpPT4gIHtcbiAgICAgICAgLy8gVGhlIG5hbWVzcGFjZSBib3ggaXMgYSBjb250ZW50aW91cyBkZXNpZ24gYW5kIGxpa2VseSB0byBiZSBhIGJyZWFraW5nXG4gICAgICAgIC8vIGNoYW5nZSBpbiBhbiBhcHByb3ByaWF0ZWx5IG51bWJlcmVkIGZ1dHVyZSB2ZXJzaW9uLlxuICAgICAgICBjb25zdCBuYW1lc3BhY2U9ICBjb21wYXJ0bWVudEltcG9ydE5vdyhcbiAgICAgICAgICAvKiogQHR5cGUge0NvbXBhcnRtZW50fSAqLyAgdGhpcyxcbiAgICAgICAgICBzcGVjaWZpZXIpO1xuXG4gICAgICAgIHJldHVybiB7IG5hbWVzcGFjZX07XG4gICAgICAgfSk7XG5cbiAgIH0sXG5cbiAgICAgICAgYXN5bmMgbG9hZChzcGVjaWZpZXIpe1xuICAgIGlmKCB0eXBlb2Ygc3BlY2lmaWVyIT09ICAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlyc3QgYXJndW1lbnQgb2YgbG9hZCgpIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgfVxuXG4gICAgYXNzZXJ0TW9kdWxlSG9va3ModGhpcyk7XG5cbiAgICByZXR1cm4gbG9hZChwcml2YXRlRmllbGRzLCBtb2R1bGVBbGlhc2VzLCB0aGlzLCBzcGVjaWZpZXIpO1xuICAgfSxcblxuICBpbXBvcnROb3coc3BlY2lmaWVyKSB7XG4gICAgaWYoIHR5cGVvZiBzcGVjaWZpZXIhPT0gICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBvZiBpbXBvcnROb3coKSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgIH1cblxuICAgIGFzc2VydE1vZHVsZUhvb2tzKHRoaXMpO1xuXG4gICAgcmV0dXJuIGNvbXBhcnRtZW50SW1wb3J0Tm93KC8qKiBAdHlwZSB7Q29tcGFydG1lbnR9ICovICB0aGlzLCAgc3BlY2lmaWVyKTtcbiAgIH19OyRo4oCNX29uY2UuQ29tcGFydG1lbnRQcm90b3R5cGUoQ29tcGFydG1lbnRQcm90b3R5cGUpO1xuXG5cbmRlZmluZVByb3BlcnRpZXMoSW5lcnRDb21wYXJ0bWVudCwge1xuICBwcm90b3R5cGU6IHsgdmFsdWU6IENvbXBhcnRtZW50UHJvdG90eXBlfX0pO1xuXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge01ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yfSB0YXJnZXRNYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvclxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBpbnRyaW5zaWNzXG4gKiBAcGFyYW0geyhvYmplY3Q6IE9iamVjdCkgPT4gdm9pZH0gbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb25cbiAqIEByZXR1cm5zIHtDb21wYXJ0bWVudFsnY29uc3RydWN0b3InXX1cbiAqL1xuXG4vKiogQHR5cGUge01ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yfSAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yPSAgKFxuICB0YXJnZXRNYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcixcbiAgaW50cmluc2ljcyxcbiAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24pPT5cbiAgICAge1xuICBmdW5jdGlvbiBDb21wYXJ0bWVudChlbmRvd21lbnRzPSAge30sIG1vZHVsZU1hcD0gIHt9LCBvcHRpb25zPSAge30pIHtcbiAgICBpZiggbmV3LnRhcmdldD09PSAgdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkNsYXNzIGNvbnN0cnVjdG9yIENvbXBhcnRtZW50IGNhbm5vdCBiZSBpbnZva2VkIHdpdGhvdXQgJ25ldydcIik7XG5cbiAgICAgfVxuXG4gICAgLy8gRXh0cmFjdCBvcHRpb25zLCBhbmQgc2hhbGxvdy1jbG9uZSB0cmFuc2Zvcm1zLlxuICAgIGNvbnN0IHtcbiAgICAgIG5hbWU9ICAnPHVua25vd24+JyxcbiAgICAgIHRyYW5zZm9ybXM9ICBbXSxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXz0gIFtdLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgbW9kdWxlTWFwSG9vayxcbiAgICAgIGltcG9ydE1ldGFIb29rfT1cbiAgICAgICAgb3B0aW9ucztcbiAgICBjb25zdCBnbG9iYWxUcmFuc2Zvcm1zPSAgWy4uLnRyYW5zZm9ybXMsIC4uLl9fc2hpbVRyYW5zZm9ybXNfX107XG5cbiAgICAvLyBNYXA8RnVsbFNwZWNpZmllciwgTW9kdWxlQ29tcGFydG1lbnRSZWNvcmQ+XG4gICAgY29uc3QgbW9kdWxlUmVjb3Jkcz0gIG5ldyBNYXAoKTtcbiAgICAvLyBNYXA8RnVsbFNwZWNpZmllciwgTW9kdWxlSW5zdGFuY2U+XG4gICAgY29uc3QgaW5zdGFuY2VzPSAgbmV3IE1hcCgpO1xuICAgIC8vIE1hcDxGdWxsU3BlY2lmaWVyLCB7RXhwb3J0c1Byb3h5LCBQcm94aWVkRXhwb3J0cywgYWN0aXZhdGUoKX0+XG4gICAgY29uc3QgZGVmZXJyZWRFeHBvcnRzPSAgbmV3IE1hcCgpO1xuXG4gICAgLy8gVmFsaWRhdGUgZ2l2ZW4gbW9kdWxlTWFwLlxuICAgIC8vIFRoZSBtb2R1bGUgbWFwIGdldHMgdHJhbnNsYXRlZCBvbi1kZW1hbmQgaW4gbW9kdWxlLWxvYWQuanMgYW5kIHRoZVxuICAgIC8vIG1vZHVsZU1hcCBjYW4gYmUgaW52YWxpZCBpbiB3YXlzIHRoYXQgY2Fubm90IGJlIGRldGVjdGVkIGluIHRoZVxuICAgIC8vIGNvbnN0cnVjdG9yLCBidXQgdGhlc2UgY2hlY2tzIGFsbG93IHVzIHRvIHRocm93IGVhcmx5IGZvciBhIGJldHRlclxuICAgIC8vIGRldmVsb3BlciBleHBlcmllbmNlLlxuICAgIGZvciggY29uc3QgW3NwZWNpZmllciwgYWxpYXNOYW1lc3BhY2Vdb2YgIGVudHJpZXMobW9kdWxlTWFwfHwgIHt9KSkge1xuICAgICAgaWYoIHR5cGVvZiBhbGlhc05hbWVzcGFjZT09PSAgJ3N0cmluZycpIHtcbiAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgcGFyZW50IG1vZHVsZSByZWNvcmQgcmV0cmlldmFsLlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICBgQ2Fubm90IG1hcCBtb2R1bGUgJHtxKHNwZWNpZmllcil9IHRvICR7cShcbiAgICAgICAgICAgIGFsaWFzTmFtZXNwYWNlKVxuICAgICAgICAgICAgfSBpbiBwYXJlbnQgY29tcGFydG1lbnRgKTtcblxuICAgICAgIH1lbHNlIGlmKCB3ZWFrbWFwR2V0KG1vZHVsZUFsaWFzZXMsIGFsaWFzTmFtZXNwYWNlKT09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRPRE8gY3JlYXRlIGFuZCBsaW5rIGEgc3ludGhldGljIG1vZHVsZSBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlblxuICAgICAgICAvLyBuYW1lc3BhY2Ugb2JqZWN0LlxuICAgICAgICB0aHJvdyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgYENhbm5vdCBtYXAgbW9kdWxlICR7cShcbiAgICAgICAgICAgIHNwZWNpZmllcilcbiAgICAgICAgICAgIH0gYmVjYXVzZSBpdCBoYXMgbm8ga25vd24gY29tcGFydG1lbnQgaW4gdGhpcyByZWFsbWApO1xuXG4gICAgICAgfVxuICAgICB9XG5cbiAgICBjb25zdCBnbG9iYWxPYmplY3Q9ICB7fTtcblxuICAgIHNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzKGdsb2JhbE9iamVjdCk7XG5cbiAgICAvLyBXZSBtdXN0IGluaXRpYWxpemUgYWxsIGNvbnN0YW50IHByb3BlcnRpZXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGBtYWtlU2FmZUV2YWx1YXRvcmAgbWF5IHVzZSB0aGVtIHRvIGNyZWF0ZSBvcHRpbWl6ZWQgYmluZGluZ3NcbiAgICAvLyBpbiB0aGUgZXZhbHVhdG9yLlxuICAgIC8vIFRPRE86IGNvbnNpZGVyIG1lcmdpbmcgaW50byBhIHNpbmdsZSBpbml0aWFsaXphdGlvbiBpZiBpbnRlcm5hbFxuICAgIC8vIGV2YWx1YXRvciBpcyBubyBsb25nZXIgZWFnZXJseSBjcmVhdGVkXG4gICAgc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzKGdsb2JhbE9iamVjdCk7XG5cbiAgICBjb25zdCB7IHNhZmVFdmFsdWF0ZX09ICAgbWFrZVNhZmVFdmFsdWF0b3Ioe1xuICAgICAgZ2xvYmFsT2JqZWN0LFxuICAgICAgZ2xvYmFsVHJhbnNmb3JtcyxcbiAgICAgIHNsb3BweUdsb2JhbHNNb2RlOiBmYWxzZX0pO1xuXG5cbiAgICBzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcyhnbG9iYWxPYmplY3QsIHtcbiAgICAgIGludHJpbnNpY3MsXG4gICAgICBuZXdHbG9iYWxQcm9wZXJ0eU5hbWVzOiBzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzLFxuICAgICAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3I6IHRhcmdldE1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yLFxuICAgICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb259KTtcblxuXG4gICAgLy8gVE9ETzogbWF5YmUgYWRkIGV2YWxUYW1pbmcgdG8gdGhlIENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIDNyZCBvcHRpb25zP1xuICAgIHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMoXG4gICAgICBnbG9iYWxPYmplY3QsXG4gICAgICBzYWZlRXZhbHVhdGUsXG4gICAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbik7XG5cblxuICAgIGFzc2lnbihnbG9iYWxPYmplY3QsIGVuZG93bWVudHMpO1xuXG4gICAgd2Vha21hcFNldChwcml2YXRlRmllbGRzLCB0aGlzLCB7XG4gICAgICBuYW1lOiAgYCR7bmFtZX1gLFxuICAgICAgZ2xvYmFsVHJhbnNmb3JtcyxcbiAgICAgIGdsb2JhbE9iamVjdCxcbiAgICAgIHNhZmVFdmFsdWF0ZSxcbiAgICAgIHJlc29sdmVIb29rLFxuICAgICAgaW1wb3J0SG9vayxcbiAgICAgIG1vZHVsZU1hcCxcbiAgICAgIG1vZHVsZU1hcEhvb2ssXG4gICAgICBpbXBvcnRNZXRhSG9vayxcbiAgICAgIG1vZHVsZVJlY29yZHMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBkZWZlcnJlZEV4cG9ydHMsXG4gICAgICBpbnN0YW5jZXN9KTtcblxuICAgfVxuXG4gIENvbXBhcnRtZW50LnByb3RvdHlwZT0gIENvbXBhcnRtZW50UHJvdG90eXBlO1xuXG4gIHJldHVybiBDb21wYXJ0bWVudDtcbiB9OyRo4oCNX29uY2UubWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IobWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syM10gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBUeXBlRXJyb3IsV2Vha1NldCxhcnJheUZpbHRlcixkZWZpbmVQcm9wZXJ0eSxlbnRyaWVzLGZyZWV6ZSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxnbG9iYWxUaGlzLGlzLGlzT2JqZWN0LG9iamVjdEhhc093blByb3BlcnR5LHZhbHVlcyx3ZWFrc2V0SGFzLGNvbnN0YW50UHJvcGVydGllcyxzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzLHVuaXZlcnNhbFByb3BlcnR5TmFtZXMsd2hpdGVsaXN0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIldlYWtTZXRcIiwgWyRo4oCNX2EgPT4gKFdlYWtTZXQgPSAkaOKAjV9hKV1dLFtcImFycmF5RmlsdGVyXCIsIFskaOKAjV9hID0+IChhcnJheUZpbHRlciA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJlbnRyaWVzXCIsIFskaOKAjV9hID0+IChlbnRyaWVzID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvcnNcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSAkaOKAjV9hKV1dLFtcImdsb2JhbFRoaXNcIiwgWyRo4oCNX2EgPT4gKGdsb2JhbFRoaXMgPSAkaOKAjV9hKV1dLFtcImlzXCIsIFskaOKAjV9hID0+IChpcyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJvYmplY3RIYXNPd25Qcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAob2JqZWN0SGFzT3duUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcInZhbHVlc1wiLCBbJGjigI1fYSA9PiAodmFsdWVzID0gJGjigI1fYSldXSxbXCJ3ZWFrc2V0SGFzXCIsIFskaOKAjV9hID0+ICh3ZWFrc2V0SGFzID0gJGjigI1fYSldXV1dLFtcIi4vd2hpdGVsaXN0LmpzXCIsIFtbXCJjb25zdGFudFByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGNvbnN0YW50UHJvcGVydGllcyA9ICRo4oCNX2EpXV0sW1wic2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lc1wiLCBbJGjigI1fYSA9PiAoc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lcyA9ICRo4oCNX2EpXV0sW1widW5pdmVyc2FsUHJvcGVydHlOYW1lc1wiLCBbJGjigI1fYSA9PiAodW5pdmVyc2FsUHJvcGVydHlOYW1lcyA9ICRo4oCNX2EpXV0sW1wid2hpdGVsaXN0XCIsIFskaOKAjV9hID0+ICh3aGl0ZWxpc3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBpc0Z1bmN0aW9uPSAgKG9iaik9PnR5cGVvZiBvYmo9PT0gICdmdW5jdGlvbic7XG5cbi8vIExpa2UgZGVmaW5lUHJvcGVydHksIGJ1dCB0aHJvd3MgaWYgaXQgd291bGQgbW9kaWZ5IGFuIGV4aXN0aW5nIHByb3BlcnR5LlxuLy8gV2UgdXNlIHRoaXMgdG8gZW5zdXJlIHRoYXQgdHdvIGNvbmZsaWN0aW5nIGF0dGVtcHRzIHRvIGRlZmluZSB0aGUgc2FtZVxuLy8gcHJvcGVydHkgdGhyb3dzLCBjYXVzaW5nIFNFUyBpbml0aWFsaXphdGlvbiB0byBmYWlsLiBPdGhlcndpc2UsIGFcbi8vIGNvbmZsaWN0IGJldHdlZW4sIGZvciBleGFtcGxlLCB0d28gb2YgU0VTJ3MgaW50ZXJuYWwgd2hpdGVsaXN0cyBtaWdodFxuLy8gZ2V0IG1hc2tlZCBhcyBvbmUgb3ZlcndyaXRlcyB0aGUgb3RoZXIuIEFjY29yZGluZ2x5LCB0aGUgdGhyb3duIGVycm9yXG4vLyBjb21wbGFpbnMgb2YgYSBcIkNvbmZsaWN0aW5nIGRlZmluaXRpb25cIi5cbmZ1bmN0aW9uIGluaXRQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2MpIHtcbiAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KG9iaiwgbmFtZSkpIHtcbiAgICBjb25zdCBwcmVEZXNjPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgbmFtZSk7XG4gICAgaWYoXG4gICAgICAhaXMocHJlRGVzYy52YWx1ZSwgZGVzYy52YWx1ZSl8fFxuICAgICAgcHJlRGVzYy5nZXQhPT0gIGRlc2MuZ2V0fHxcbiAgICAgIHByZURlc2Muc2V0IT09ICBkZXNjLnNldHx8XG4gICAgICBwcmVEZXNjLndyaXRhYmxlIT09ICBkZXNjLndyaXRhYmxlfHxcbiAgICAgIHByZURlc2MuZW51bWVyYWJsZSE9PSAgZGVzYy5lbnVtZXJhYmxlfHxcbiAgICAgIHByZURlc2MuY29uZmlndXJhYmxlIT09ICBkZXNjLmNvbmZpZ3VyYWJsZSlcbiAgICAgIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBDb25mbGljdGluZyBkZWZpbml0aW9ucyBvZiAke25hbWV9YCk7XG4gICAgIH1cbiAgIH1cbiAgZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCBkZXNjKTtcbiB9XG5cbi8vIExpa2UgZGVmaW5lUHJvcGVydGllcywgYnV0IHRocm93cyBpZiBpdCB3b3VsZCBtb2RpZnkgYW4gZXhpc3RpbmcgcHJvcGVydHkuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgaW50cmluc2ljcyBhZGRlZCB0byB0aGUgaW50cmluc2ljcyBjb2xsZWN0b3Igb2JqZWN0XG4vLyBncmFwaCBkbyBub3Qgb3ZlcmxhcC5cbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzKG9iaiwgZGVzY3MpIHtcbiAgZm9yKCBjb25zdCBbbmFtZSwgZGVzY11vZiAgZW50cmllcyhkZXNjcykpIHtcbiAgICBpbml0UHJvcGVydHkob2JqLCBuYW1lLCBkZXNjKTtcbiAgIH1cbiB9XG5cbi8vIHNhbXBsZUdsb2JhbHMgY3JlYXRlcyBhbiBpbnRyaW5zaWNzIG9iamVjdCwgc3VpdGFibGUgZm9yXG4vLyBpbnRlcmluc2ljc0NvbGxlY3Rvci5hZGRJbnRyaW5zaWNzLCBmcm9tIHRoZSBuYW1lZCBwcm9wZXJ0aWVzIG9mIGEgZ2xvYmFsXG4vLyBvYmplY3QuXG5mdW5jdGlvbiBzYW1wbGVHbG9iYWxzKGdsb2JhbE9iamVjdCwgbmV3UHJvcGVydHlOYW1lcykge1xuICBjb25zdCBuZXdJbnRyaW5zaWNzPSAgeyBfX3Byb3RvX186IG51bGx9O1xuICBmb3IoIGNvbnN0IFtnbG9iYWxOYW1lLCBpbnRyaW5zaWNOYW1lXW9mICBlbnRyaWVzKG5ld1Byb3BlcnR5TmFtZXMpKSB7XG4gICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KGdsb2JhbE9iamVjdCwgZ2xvYmFsTmFtZSkpIHtcbiAgICAgIG5ld0ludHJpbnNpY3NbaW50cmluc2ljTmFtZV09ICBnbG9iYWxPYmplY3RbZ2xvYmFsTmFtZV07XG4gICAgIH1cbiAgIH1cbiAgcmV0dXJuIG5ld0ludHJpbnNpY3M7XG4gfVxuXG5jb25zdCAgICAgICAgbWFrZUludHJpbnNpY3NDb2xsZWN0b3I9ICAoKT0+ICB7XG4gIGNvbnN0IGludHJpbnNpY3M9ICB7IF9fcHJvdG9fXzogbnVsbH07XG4gIGxldCBwc2V1ZG9OYXRpdmVzO1xuXG4gIGNvbnN0IGFkZEludHJpbnNpY3M9ICAobmV3SW50cmluc2ljcyk9PntcbiAgICBpbml0UHJvcGVydGllcyhpbnRyaW5zaWNzLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG5ld0ludHJpbnNpY3MpKTtcbiAgIH07XG4gIGZyZWV6ZShhZGRJbnRyaW5zaWNzKTtcblxuICAvLyBGb3IgZWFjaCBpbnRyaW5zaWMsIGlmIGl0IGhhcyBhIGAucHJvdG90eXBlYCBwcm9wZXJ0eSwgdXNlIHRoZVxuICAvLyB3aGl0ZWxpc3QgdG8gZmluZCBvdXQgdGhlIGludHJpbnNpYyBuYW1lIGZvciB0aGF0IHByb3RvdHlwZSBhbmQgYWRkIGl0XG4gIC8vIHRvIHRoZSBpbnRyaW5zaWNzLlxuICBjb25zdCBjb21wbGV0ZVByb3RvdHlwZXM9ICAoKT0+ICB7XG4gICAgZm9yKCBjb25zdCBbbmFtZSwgaW50cmluc2ljXW9mICBlbnRyaWVzKGludHJpbnNpY3MpKSB7XG4gICAgICBpZiggIWlzT2JqZWN0KGludHJpbnNpYykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgIH1cbiAgICAgIGlmKCAhb2JqZWN0SGFzT3duUHJvcGVydHkoaW50cmluc2ljLCAncHJvdG90eXBlJykpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgIH1cbiAgICAgIGNvbnN0IHBlcm1pdD0gIHdoaXRlbGlzdFtuYW1lXTtcbiAgICAgIGlmKCB0eXBlb2YgcGVybWl0IT09ICAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgRXhwZWN0ZWQgcGVybWl0IG9iamVjdCBhdCB3aGl0ZWxpc3QuJHtuYW1lfWApO1xuICAgICAgIH1cbiAgICAgIGNvbnN0IG5hbWVQcm90b3R5cGU9ICBwZXJtaXQucHJvdG90eXBlO1xuICAgICAgaWYoICFuYW1lUHJvdG90eXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGAke25hbWV9LnByb3RvdHlwZSBwcm9wZXJ0eSBub3Qgd2hpdGVsaXN0ZWRgKTtcbiAgICAgICB9XG4gICAgICBpZihcbiAgICAgICAgdHlwZW9mIG5hbWVQcm90b3R5cGUhPT0gICdzdHJpbmcnfHxcbiAgICAgICAgIW9iamVjdEhhc093blByb3BlcnR5KHdoaXRlbGlzdCwgbmFtZVByb3RvdHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYFVucmVjb2duaXplZCAke25hbWV9LnByb3RvdHlwZSB3aGl0ZWxpc3QgZW50cnlgKTtcbiAgICAgICB9XG4gICAgICBjb25zdCBpbnRyaW5zaWNQcm90b3R5cGU9ICBpbnRyaW5zaWMucHJvdG90eXBlO1xuICAgICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KGludHJpbnNpY3MsIG5hbWVQcm90b3R5cGUpKSB7XG4gICAgICAgIGlmKCBpbnRyaW5zaWNzW25hbWVQcm90b3R5cGVdIT09ICBpbnRyaW5zaWNQcm90b3R5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgQ29uZmxpY3RpbmcgYmluZGluZ3Mgb2YgJHtuYW1lUHJvdG90eXBlfWApO1xuICAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICAgfVxuICAgICAgaW50cmluc2ljc1tuYW1lUHJvdG90eXBlXT0gIGludHJpbnNpY1Byb3RvdHlwZTtcbiAgICAgfVxuICAgfTtcbiAgZnJlZXplKGNvbXBsZXRlUHJvdG90eXBlcyk7XG5cbiAgY29uc3QgZmluYWxJbnRyaW5zaWNzPSAgKCk9PiAge1xuICAgIGZyZWV6ZShpbnRyaW5zaWNzKTtcbiAgICBwc2V1ZG9OYXRpdmVzPSAgbmV3IFdlYWtTZXQoYXJyYXlGaWx0ZXIodmFsdWVzKGludHJpbnNpY3MpLCBpc0Z1bmN0aW9uKSk7XG4gICAgcmV0dXJuIGludHJpbnNpY3M7XG4gICB9O1xuICBmcmVlemUoZmluYWxJbnRyaW5zaWNzKTtcblxuICBjb25zdCBpc1BzZXVkb05hdGl2ZT0gIChvYmopPT57XG4gICAgaWYoICFwc2V1ZG9OYXRpdmVzKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnaXNQc2V1ZG9OYXRpdmUgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGZpbmFsSW50cmluc2ljcycpO1xuXG4gICAgIH1cbiAgICByZXR1cm4gd2Vha3NldEhhcyhwc2V1ZG9OYXRpdmVzLCBvYmopO1xuICAgfTtcbiAgZnJlZXplKGlzUHNldWRvTmF0aXZlKTtcblxuICBjb25zdCBpbnRyaW5zaWNzQ29sbGVjdG9yPSAge1xuICAgIGFkZEludHJpbnNpY3MsXG4gICAgY29tcGxldGVQcm90b3R5cGVzLFxuICAgIGZpbmFsSW50cmluc2ljcyxcbiAgICBpc1BzZXVkb05hdGl2ZX07XG5cbiAgZnJlZXplKGludHJpbnNpY3NDb2xsZWN0b3IpO1xuXG4gIGFkZEludHJpbnNpY3MoY29uc3RhbnRQcm9wZXJ0aWVzKTtcbiAgYWRkSW50cmluc2ljcyhzYW1wbGVHbG9iYWxzKGdsb2JhbFRoaXMsIHVuaXZlcnNhbFByb3BlcnR5TmFtZXMpKTtcblxuICByZXR1cm4gaW50cmluc2ljc0NvbGxlY3RvcjtcbiB9O1xuXG4vKipcbiAqIGdldEdsb2JhbEludHJpbnNpY3MoKVxuICogRG9lc24ndCB0YW1lLCBkZWxldGUsIG9yIG1vZGlmeSBhbnl0aGluZy4gU2FtcGxlcyBnbG9iYWxPYmplY3QgdG8gY3JlYXRlIGFuXG4gKiBpbnRyaW5zaWNzIHJlY29yZCBjb250YWluaW5nIG9ubHkgdGhlIHdoaXRlbGlzdGVkIGdsb2JhbCB2YXJpYWJsZXMsIGxpc3RlZFxuICogYnkgdGhlIGludHJpbnNpYyBuYW1lcyBhcHByb3ByaWF0ZSBmb3IgbmV3IGdsb2JhbHMsIGkuZS4sIHRoZSBnbG9iYWxzIG9mXG4gKiBuZXdseSBjb25zdHJ1Y3RlZCBjb21wYXJ0bWVudHMuXG4gKlxuICogV0FSTklORzpcbiAqIElmIHJ1biBiZWZvcmUgbG9ja2Rvd24sIHRoZSByZXR1cm5lZCBpbnRyaW5zaWNzIHJlY29yZCB3aWxsIGNhcnJ5IHRoZVxuICogKm9yaWdpbmFsKiB1bnNhZmUgKGZlcmFsLCB1bnRhbWVkKSBiaW5kaW5ncyBvZiB0aGVzZSBnbG9iYWwgdmFyaWFibGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbG9iYWxPYmplY3RcbiAqLyRo4oCNX29uY2UubWFrZUludHJpbnNpY3NDb2xsZWN0b3IobWFrZUludHJpbnNpY3NDb2xsZWN0b3IpO1xuY29uc3QgICAgICAgIGdldEdsb2JhbEludHJpbnNpY3M9ICAoZ2xvYmFsT2JqZWN0KT0+e1xuICBjb25zdCB7IGFkZEludHJpbnNpY3MsIGZpbmFsSW50cmluc2ljc309ICAgbWFrZUludHJpbnNpY3NDb2xsZWN0b3IoKTtcblxuICBhZGRJbnRyaW5zaWNzKHNhbXBsZUdsb2JhbHMoZ2xvYmFsT2JqZWN0LCBzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzKSk7XG5cbiAgcmV0dXJuIGZpbmFsSW50cmluc2ljcygpO1xuIH07JGjigI1fb25jZS5nZXRHbG9iYWxJbnRyaW5zaWNzKGdldEdsb2JhbEludHJpbnNpY3MpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syNF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQGZpbGUgRXhwb3J0cyB7QGNvZGUgZW5hYmxlbWVudHN9LCBhIHJlY3Vyc2l2ZWx5IGRlZmluZWRcbiAqIEpTT04gcmVjb3JkIGRlZmluaW5nIHRoZSBvcHRpbXVtIHNldCBvZiBpbnRyaW5zaWNzIHByb3BlcnRpZXNcbiAqIHRoYXQgbmVlZCB0byBiZSBcInJlcGFpcmVkXCIgYmVmb3JlIGhhcmRlbmluZyBpcyBhcHBsaWVkIG9uXG4gKiBlbnZpcm9tbWVudHMgc3ViamVjdCB0byB0aGUgb3ZlcnJpZGUgbWlzdGFrZS5cbiAqXG4gKiBAYXV0aG9yIEpGIFBhcmFkaXNcbiAqIEBhdXRob3IgTWFyayBTLiBNaWxsZXJcbiAqL1xuXG4vKipcbiAqIDxwPkJlY2F1c2UgXCJyZXBhaXJpbmdcIiByZXBsYWNlcyBkYXRhIHByb3BlcnRpZXMgd2l0aCBhY2Nlc3NvcnMsIGV2ZXJ5XG4gKiB0aW1lIGEgcmVwYWlyZWQgcHJvcGVydHkgaXMgYWNjZXNzZWQsIHRoZSBhc3NvY2lhdGVkIGdldHRlciBpcyBpbnZva2VkLFxuICogd2hpY2ggZGVncmFkZXMgdGhlIHJ1bnRpbWUgcGVyZm9ybWFuY2Ugb2YgYWxsIGNvZGUgZXhlY3V0aW5nIGluIHRoZVxuICogcmVwYWlyZWQgZW52aXJvbW1lbnQsIGNvbXBhcmVkIHRvIHRoZSBub24tcmVwYWlyZWQgY2FzZS4gSW4gb3JkZXJcbiAqIHRvIG1haW50YWluIHBlcmZvcm1hbmNlLCB3ZSBvbmx5IHJlcGFpciB0aGUgcHJvcGVydGllcyBvZiBvYmplY3RzXG4gKiBmb3Igd2hpY2ggaGFyZGVuaW5nIGNhdXNlcyBhIGJyZWFrYWdlIG9mIHRoZWlyIG5vcm1hbCBpbnRlbmRlZCB1c2FnZS5cbiAqXG4gKiBUaGVyZSBhcmUgdGhyZWUgdW53YW50ZWQgY2FzZXM6XG4gKiA8dWw+XG4gKiA8bGk+T3ZlcnJpZGluZyBwcm9wZXJ0aWVzIG9uIG9iamVjdHMgdHlwaWNhbGx5IHVzZWQgYXMgcmVjb3JkcyxcbiAqICAgICBuYW1lbHkge0Bjb2RlIFwiT2JqZWN0XCJ9IGFuZCB7QGNvZGUgXCJBcnJheVwifS4gSW4gdGhlIGNhc2Ugb2YgYXJyYXlzLFxuICogICAgIHRoZSBzaXR1YXRpb24gaXMgdW5pbnRlbnRpb25hbCwgYSBnaXZlbiBwcm9ncmFtIG1pZ2h0IG5vdCBiZSBhd2FyZVxuICogICAgIHRoYXQgbm9uLW51bWVyaWNhbCBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgb24gdGhlIHVuZGVybHlpbmcgb2JqZWN0XG4gKiAgICAgaW5zdGFuY2UsIG5vdCBvbiB0aGUgYXJyYXkuIFdoZW4gYW4gb2JqZWN0IGlzIHR5cGljYWxseSB1c2VkIGFzIGFcbiAqICAgICBtYXAsIHdlIHJlcGFpciBhbGwgb2YgaXRzIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICogPGxpPk92ZXJyaWRpbmcgcHJvcGVydGllcyBvbiBvYmplY3RzIHRoYXQgcHJvdmlkZSBkZWZhdWx0cyBvbiB0aGVpclxuICogICAgIHByb3RvdHlwZSBhbmQgdGhhdCBwcm9ncmFtcyB0eXBpY2FsbHkgc2V0IHVzaW5nIGFuIGFzc2lnbm1lbnQsIHN1Y2ggYXNcbiAqICAgICB7QGNvZGUgXCJFcnJvci5wcm90b3R5cGUubWVzc2FnZVwifSBhbmQge0Bjb2RlIFwiRnVuY3Rpb24ucHJvdG90eXBlLm5hbWVcIn1cbiAqICAgICAoYm90aCBkZWZhdWx0IHRvIFwiXCIpLlxuICogPGxpPlNldHRpbmctdXAgYSBwcm90b3R5cGUgY2hhaW4sIHdoZXJlIGEgY29uc3RydWN0b3IgaXMgc2V0IHRvIGV4dGVuZFxuICogICAgIGFub3RoZXIgb25lLiBUaGlzIGlzIHR5cGljYWxseSBzZXQgYnkgYXNzaWdubWVudCwgZm9yIGV4YW1wbGVcbiAqICAgICB7QGNvZGUgXCJDaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaGlsZFwifSwgaW5zdGVhZCBvZiBpbnZva2luZ1xuICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpO1xuICpcbiAqIDxwPkVhY2ggSlNPTiByZWNvcmQgZW51bWVyYXRlcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIHByb3BlcnRpZXMgb25cbiAqIHNvbWUgY29ycmVzcG9uZGluZyBpbnRyaW5zaWMgb2JqZWN0LlxuICpcbiAqIDxwPkZvciBlYWNoIHN1Y2ggcmVjb3JkLCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBpdHMgcHJvcGVydHlcbiAqIG5hbWVzIGNhbiBiZTpcbiAqIDx1bD5cbiAqIDxsaT50cnVlLCBpbiB3aGljaCBjYXNlIHRoaXMgcHJvcGVydHkgaXMgc2ltcGx5IHJlcGFpcmVkLiBUaGVcbiAqICAgICB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9wZXJ0eSBpcyBub3QgdHJhdmVyc2VkLiBGb3JcbiAqIFx0ICAgZXhhbXBsZSwge0Bjb2RlIFwiRnVuY3Rpb24ucHJvdG90eXBlLm5hbWVcIn0gbGVhZHMgdG8gdHJ1ZSxcbiAqICAgICBtZWFuaW5nIHRoYXQgdGhlIHtAY29kZSBcIm5hbWVcIn0gcHJvcGVydHkgb2Yge0Bjb2RlXG4gKiAgICAgXCJGdW5jdGlvbi5wcm90b3R5cGVcIn0gc2hvdWxkIGJlIHJlcGFpcmVkICh3aGljaCBpcyBuZWVkZWRcbiAqICAgICB3aGVuIGluaGVyaXRpbmcgZnJvbSBAY29kZXtGdW5jdGlvbn0gYW5kIHNldHRpbmcgdGhlIHN1YmNsYXNzJ3NcbiAqICAgICB7QGNvZGUgXCJwcm90b3R5cGUubmFtZVwifSBwcm9wZXJ0eSkuIElmIHRoZSBwcm9wZXJ0eSBpc1xuICogICAgIGFscmVhZHkgYW4gYWNjZXNzb3IgcHJvcGVydHksIGl0IGlzIG5vdCByZXBhaXJlZCAoYmVjYXVzZVxuICogICAgIGFjY2Vzc29ycyBhcmUgbm90IHN1YmplY3QgdG8gdGhlIG92ZXJyaWRlIG1pc3Rha2UpLlxuICogPGxpPlwiKlwiLCBpbiB3aGljaCBjYXNlIHRoaXMgcHJvcGVydHkgaXMgbm90IHJlcGFpcmVkIGJ1dCB0aGVcbiAqICAgICB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBwcm9wZXJ0eSBhcmUgdHJhdmVyc2VkIGFuZCByZXBhaXJlZC5cbiAqIDxsaT5Bbm90aGVyIHJlY29yZCwgaW4gd2hpY2ggY2FzZSB0aGlzIHByb3BlcnR5IGlzIG5vdCByZXBhaXJlZFxuICogICAgIGFuZCB0aGF0IG5leHQgcmVjb3JkIHJlcHJlc2VudHMgdGhlIGRpc3Bvc2l0aW9uIG9mIHRoZSBvYmplY3RcbiAqICAgICB3aGljaCBpcyBpdHMgdmFsdWUuIEZvciBleGFtcGxlLHtAY29kZSBcIkZ1bmN0aW9uUHJvdG90eXBlXCJ9XG4gKiAgICAgbGVhZHMgdG8gYW5vdGhlciByZWNvcmQgZXhwbGFpbmluZyB3aGljaCBwcm9wZXJ0aWVzIHtAY29kZVxuICogICAgIEZ1bmN0aW9uLnByb3RvdHlwZX0gbmVlZCB0byBiZSByZXBhaXJlZC5cbiAqL1xuXG4vKipcbiAqIE1pbmltYWwgZW5hYmxlbWVudHMgd2hlbiBhbGwgdGhlIGNvZGUgaXMgbW9kZXJuIGFuZCBrbm93biBub3QgdG9cbiAqIHN0ZXAgaW50byB0aGUgb3ZlcnJpZGUgbWlzdGFrZSwgZXhjZXB0IGZvciB0aGUgZm9sbG93aW5nIHBlcnZhc2l2ZVxuICogY2FzZXMuXG4gKi9cbmNvbnN0ICAgICAgICBtaW5FbmFibGVtZW50cz0gIHtcbiAgJyVPYmplY3RQcm90b3R5cGUlJzoge1xuICAgIHRvU3RyaW5nOiB0cnVlfSxcblxuXG4gICclRnVuY3Rpb25Qcm90b3R5cGUlJzoge1xuICAgIHRvU3RyaW5nOiB0cnVlICAvLyBzZXQgYnkgXCJyb2xsdXBcIlxufSxcblxuICAnJUVycm9yUHJvdG90eXBlJSc6IHtcbiAgICBuYW1lOiB0cnVlICAvLyBzZXQgYnkgXCJwcmVjb25kXCIsIFwiYXZhXCIsIFwibm9kZS1mZXRjaFwiXG59fTtcblxuXG4vKipcbiAqIE1vZGVyYXRlIGVuYWJsZW1lbnRzIGFyZSB1c3VhbGx5IGdvb2QgZW5vdWdoIGZvciBsZWdhY3kgY29tcGF0LlxuICovJGjigI1fb25jZS5taW5FbmFibGVtZW50cyhtaW5FbmFibGVtZW50cyk7XG5jb25zdCAgICAgICAgbW9kZXJhdGVFbmFibGVtZW50cz0gIHtcbiAgJyVPYmplY3RQcm90b3R5cGUlJzoge1xuICAgIHRvU3RyaW5nOiB0cnVlLFxuICAgIHZhbHVlT2Y6IHRydWV9LFxuXG5cbiAgJyVBcnJheVByb3RvdHlwZSUnOiB7XG4gICAgdG9TdHJpbmc6IHRydWUsXG4gICAgcHVzaDogdHJ1ZSAgLy8gc2V0IGJ5IFwiR29vZ2xlIEFuYWx5dGljc1wiXG59LFxuXG4gIC8vIEZ1bmN0aW9uLnByb3RvdHlwZSBoYXMgbm8gJ3Byb3RvdHlwZScgcHJvcGVydHkgdG8gZW5hYmxlLlxuICAvLyBGdW5jdGlvbiBpbnN0YW5jZXMgaGF2ZSB0aGVpciBvd24gJ25hbWUnIGFuZCAnbGVuZ3RoJyBwcm9wZXJ0aWVzXG4gIC8vIHdoaWNoIGFyZSBjb25maWd1cmFibGUgYW5kIG5vbi13cml0YWJsZS4gVGh1cywgdGhleSBhcmUgYWxyZWFkeVxuICAvLyBub24tYXNzaWduYWJsZSBhbnl3YXkuXG4gICclRnVuY3Rpb25Qcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiB0cnVlLCAvLyBzZXQgYnkgXCJyZWdlbmVyYXRvci1ydW50aW1lXCJcbiAgICBiaW5kOiB0cnVlLCAvLyBzZXQgYnkgXCJ1bmRlcnNjb3JlXCIsIFwiZXhwcmVzc1wiXG4gICAgdG9TdHJpbmc6IHRydWUgIC8vIHNldCBieSBcInJvbGx1cFwiXG59LFxuXG4gICclRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiB0cnVlLCAvLyBzZXQgYnkgXCJmYXN0LWpzb24tcGF0Y2hcIiwgXCJub2RlLWZldGNoXCJcbiAgICBtZXNzYWdlOiB0cnVlLFxuICAgIG5hbWU6IHRydWUsIC8vIHNldCBieSBcInByZWNvbmRcIiwgXCJhdmFcIiwgXCJub2RlLWZldGNoXCIsIFwibm9kZSAxNFwiXG4gICAgdG9TdHJpbmc6IHRydWUgIC8vIHNldCBieSBcImJsdWViaXJkXCJcbn0sXG5cbiAgJyVUeXBlRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiB0cnVlLCAvLyBzZXQgYnkgXCJyZWFkYWJsZS1zdHJlYW1cIlxuICAgIG1lc3NhZ2U6IHRydWUsIC8vIHNldCBieSBcInRhcGVcIlxuICAgIG5hbWU6IHRydWUgIC8vIHNldCBieSBcInJlYWRhYmxlLXN0cmVhbVwiLCBcIm5vZGUgMTRcIlxufSxcblxuICAnJVN5bnRheEVycm9yUHJvdG90eXBlJSc6IHtcbiAgICBtZXNzYWdlOiB0cnVlLCAvLyB0byBtYXRjaCBUeXBlRXJyb3JQcm90b3R5cGUubWVzc2FnZVxuICAgIG5hbWU6IHRydWUgIC8vIHNldCBieSBcIm5vZGUgMTRcIlxufSxcblxuICAnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIG1lc3NhZ2U6IHRydWUsIC8vIHRvIG1hdGNoIFR5cGVFcnJvclByb3RvdHlwZS5tZXNzYWdlXG4gICAgbmFtZTogdHJ1ZSAgLy8gc2V0IGJ5IFwibm9kZSAxNFwiXG59LFxuXG4gICclVVJJRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIG1lc3NhZ2U6IHRydWUsIC8vIHRvIG1hdGNoIFR5cGVFcnJvclByb3RvdHlwZS5tZXNzYWdlXG4gICAgbmFtZTogdHJ1ZSAgLy8gc2V0IGJ5IFwibm9kZSAxNFwiXG59LFxuXG4gICclRXZhbEVycm9yUHJvdG90eXBlJSc6IHtcbiAgICBtZXNzYWdlOiB0cnVlLCAvLyB0byBtYXRjaCBUeXBlRXJyb3JQcm90b3R5cGUubWVzc2FnZVxuICAgIG5hbWU6IHRydWUgIC8vIHNldCBieSBcIm5vZGUgMTRcIlxufSxcblxuICAnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IHtcbiAgICBtZXNzYWdlOiB0cnVlLCAvLyB0byBtYXRjaCBUeXBlRXJyb3JQcm90b3R5cGUubWVzc2FnZVxuICAgIG5hbWU6IHRydWUgIC8vIHNldCBieSBcIm5vZGUgMTRcIlxufSxcblxuICAnJVByb21pc2VQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiB0cnVlICAvLyBzZXQgYnkgXCJjb3JlLWpzXCJcbn0sXG5cbiAgJyVUeXBlZEFycmF5UHJvdG90eXBlJSc6ICcqJywgLy8gc2V0IGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyXG5cbiAgJyVHZW5lcmF0b3IlJzoge1xuICAgIGNvbnN0cnVjdG9yOiB0cnVlLFxuICAgIG5hbWU6IHRydWUsXG4gICAgdG9TdHJpbmc6IHRydWV9LFxuXG5cbiAgJyVJdGVyYXRvclByb3RvdHlwZSUnOiB7XG4gICAgdG9TdHJpbmc6IHRydWV9fTtcblxuXG5cbi8qKlxuICogVGhlICdzZXZlcmUnIGVuYWJsZW1lbnQgYXJlIG5lZWRlZCBiZWNhdXNlIG9mIGlzc3VlcyB0cmFja2VkIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzU3NlxuICpcbiAqIFRoZXkgYXJlIGxpa2UgdGhlIGBtb2RlcmF0ZWAgZW5hYmxlbWVudHMgZXhjZXB0IGZvciB0aGUgZW50cmllcyBiZWxvdy5cbiAqLyRo4oCNX29uY2UubW9kZXJhdGVFbmFibGVtZW50cyhtb2RlcmF0ZUVuYWJsZW1lbnRzKTtcbmNvbnN0ICAgICAgICBzZXZlcmVFbmFibGVtZW50cz0gIHtcbiAgLi4ubW9kZXJhdGVFbmFibGVtZW50cyxcblxuICAvKipcbiAgICogUm9sbHVwIChhcyB1c2VkIGF0IGxlYXN0IGJ5IHZlZ2EpIGFuZCB3ZWJwYWNrXG4gICAqIChhcyB1c2VkIGF0IGxlYXN0IGJ5IHJlZ2VuZXJhdG9yKSBib3RoIHR1cm4gZXhwb3J0cyBpbnRvIGFzc2lnbm1lbnRzXG4gICAqIHRvIGEgYmlnIGBleHBvcnRzYCBvYmplY3QgdGhhdCBpbmhlcml0cyBkaXJlY3RseSBmcm9tXG4gICAqIGBPYmplY3QucHJvdG90eXBlYC4gU29tZSBvZiB0aGUgZXhwb3J0ZWQgbmFtZXMgd2UndmUgc2VlbiBpbmNsdWRlXG4gICAqIGBoYXNPd25Qcm9wZXJ0eWAsIGBjb25zdHJ1Y3RvcmAsIGFuZCBgdG9TdHJpbmdgLiBCdXQgdGhlIHN0cmF0ZWd5IHVzZWRcbiAgICogYnkgcm9sbHVwIGFuZCB3ZWJwYWNrIHBvdGVudGlvbmFsbHkgdHVybnMgYW55IGV4cG9ydGVkIG5hbWVcbiAgICogaW50byBhbiBhc3NpZ25tZW50IHJlamVjdGVkIGJ5IHRoZSBvdmVycmlkZSBtaXN0YWtlLiBUaGF0J3Mgd2h5XG4gICAqIHRoZSBgc2V2ZXJlYCBlbmFibGVtZW50cyB0YWtlcyB0aGUgZXh0cmVtZSBzdGVwIG9mIGVuYWJsaW5nXG4gICAqIGV2ZXJ5dGhpbmcgb24gYE9iamVjdC5wcm90b3R5cGVgLlxuICAgKlxuICAgKiBJbiBhZGRpdGlvbiwgY29kZSBkb2luZyBpbmhlcml0YW5jZSBtYW51YWxseSB3aWxsIG9mdGVuIG92ZXJyaWRlXG4gICAqIHRoZSBgY29uc3RydWN0b3JgIHByb3BlcnR5IG9uIHRoZSBuZXcgcHJvdG90eXBlIGJ5IGFzc2lnbm1lbnQuIFdlJ3ZlXG4gICAqIHNlZW4gdGhpcyBzZXZlcmFsIHRpbWVzLlxuICAgKlxuICAgKiBUaGUgY29zdCBvZiBlbmFibGluZyBhbGwgdGhlc2UgaXMgdGhhdCB0aGV5IGNyZWF0ZSBhIG1pc2VyYWJsZSBkZWJ1Z2dpbmdcbiAgICogZXhwZXJpZW5jZSBzcGVjaWZpY2FsbHkgb24gTm9kZS5cbiAgICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yMzI0XG4gICAqIGV4cGxhaW5zIGhvdyBpdCBjb25mdXNlZCB0aGUgTm9kZSBjb25zb2xlLlxuICAgKlxuICAgKiAoVE9ETyBSZWV4YW1pbmUgdGhlIHZzY29kZSBzaXR1YXRpb24uIEkgdGhpbmsgaXQgbWF5IGhhdmUgaW1wcm92ZWRcbiAgICogc2luY2UgdGhlIGZvbGxvd2luZyBwYXJhZ3JhcGggd2FzIHdyaXR0ZW4uKVxuICAgKlxuICAgKiBUaGUgdnNjb2RlIGRlYnVnZ2VyJ3Mgb2JqZWN0IGluc3BlY3RvciBzaG93cyB0aGUgb3duIGRhdGEgcHJvcGVydGllcyBvZlxuICAgKiBhbiBvYmplY3QsIHdoaWNoIGlzIHR5cGljYWxseSB3aGF0IHlvdSB3YW50LCBidXQgYWxzbyBzaG93cyBib3RoIGdldHRlclxuICAgKiBhbmQgc2V0dGVyIGZvciBldmVyeSBhY2Nlc3NvciBwcm9wZXJ0eSB3aGV0aGVyIGluaGVyaXRlZCBvciBvd24uXG4gICAqIFdpdGggdGhlIGAnKidgIHNldHRpbmcgaGVyZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIGluaGVyaXRlZCBmcm9tXG4gICAqIGBPYmplY3QucHJvdG90eXBlYCBhcmUgYWNjZXNzb3JzLCBjcmVhdGluZyBhbiB1bnVzYWJsZSBkaXNwbGF5IGFzIHNlZW5cbiAgICogYXQgQXMgZXhwbGFpbmVkIGF0XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvbG9ja2Rvd24tb3B0aW9ucy5tZCNvdmVycmlkZXRhbWluZy1vcHRpb25zXG4gICAqIE9wZW4gdGhlIHRyaWFuZ2xlcyBhdCB0aGUgYm90dG9tIG9mIHRoYXQgc2VjdGlvbi5cbiAgICovXG4gICclT2JqZWN0UHJvdG90eXBlJSc6ICcqJyxcblxuICAvKipcbiAgICogVGhlIHdpZGVseSB1c2VkIEJ1ZmZlciBkZWZpbmVkIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyXG4gICAqIG9uIGluaXRpYWxpemF0aW9uLCBtYW51YWxseSBjcmVhdGVzIHRoZSBlcXVpdmFsZW50IG9mIGEgc3ViY2xhc3Mgb2ZcbiAgICogYFR5cGVkQXJyYXlgLCB3aGljaCBpdCB0aGVuIGluaXRpYWxpemVzIGJ5IGFzc2lnbm1lbnQuIFRoZXNlIGFzc2lnbm1lbnRzXG4gICAqIGluY2x1ZGUgZW5vdWdoIG9mIHRoZSBgVHlwZUFycmF5YCBtZXRob2RzIHRoYXQgaGVyZSwgdGhlIGBzZXZlcmVgXG4gICAqIGVuYWJsZW1lbnRzIGp1c3QgZW5hYmxlIHRoZW0gYWxsLlxuICAgKi9cbiAgJyVUeXBlZEFycmF5UHJvdG90eXBlJSc6ICcqJ307JGjigI1fb25jZS5zZXZlcmVFbmFibGVtZW50cyhzZXZlcmVFbmFibGVtZW50cyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzI1XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFNldCxTdHJpbmcsVHlwZUVycm9yLGFycmF5Rm9yRWFjaCxkZWZpbmVQcm9wZXJ0eSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxnZXRPd25Qcm9wZXJ0eU5hbWVzLGlzT2JqZWN0LG9iamVjdEhhc093blByb3BlcnR5LG93bktleXMsc2V0SGFzLG1pbkVuYWJsZW1lbnRzLG1vZGVyYXRlRW5hYmxlbWVudHMsc2V2ZXJlRW5hYmxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJTZXRcIiwgWyRo4oCNX2EgPT4gKFNldCA9ICRo4oCNX2EpXV0sW1wiU3RyaW5nXCIsIFskaOKAjV9hID0+IChTdHJpbmcgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhcnJheUZvckVhY2hcIiwgWyRo4oCNX2EgPT4gKGFycmF5Rm9yRWFjaCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc1wiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlOYW1lc1wiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlOYW1lcyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJvYmplY3RIYXNPd25Qcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAob2JqZWN0SGFzT3duUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcIm93bktleXNcIiwgWyRo4oCNX2EgPT4gKG93bktleXMgPSAkaOKAjV9hKV1dLFtcInNldEhhc1wiLCBbJGjigI1fYSA9PiAoc2V0SGFzID0gJGjigI1fYSldXV1dLFtcIi4vZW5hYmxlbWVudHMuanNcIiwgW1tcIm1pbkVuYWJsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtaW5FbmFibGVtZW50cyA9ICRo4oCNX2EpXV0sW1wibW9kZXJhdGVFbmFibGVtZW50c1wiLCBbJGjigI1fYSA9PiAobW9kZXJhdGVFbmFibGVtZW50cyA9ICRo4oCNX2EpXV0sW1wic2V2ZXJlRW5hYmxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKHNldmVyZUVuYWJsZW1lbnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogRm9yIGEgc3BlY2lhbCBzZXQgb2YgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBgZW5hYmxlbWVudGAgd2hpdGVsaXN0LFxuICogYGVuYWJsZVByb3BlcnR5T3ZlcnJpZGVzYCBlbnN1cmVzIHRoYXQgdGhlIGVmZmVjdCBvZiBmcmVlemluZyBkb2VzIG5vdFxuICogc3VwcHJlc3MgdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgdGhlc2UgcHJvcGVydGllcyBvbiBkZXJpdmVkIG9iamVjdHMgYnlcbiAqIHNpbXBsZSBhc3NpZ25tZW50LlxuICpcbiAqIEJlY2F1c2Ugb2YgbGFjayBvZiBzdWZmaWNpZW50IGZvcmVzaWdodCBhdCB0aGUgdGltZSwgRVM1IHVuZm9ydHVuYXRlbHlcbiAqIHNwZWNpZmllZCB0aGF0IGEgc2ltcGxlIGFzc2lnbm1lbnQgdG8gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgbXVzdCBmYWlsIGlmXG4gKiBpdCB3b3VsZCBvdmVycmlkZSBhbiBub24td3JpdGFibGUgZGF0YSBwcm9wZXJ0eSBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZVxuICogc2hhZG93IG9mIHRoZSBwcm90b3R5cGUgY2hhaW4uIEluIHJldHJvc3BlY3QsIHRoaXMgd2FzIGEgbWlzdGFrZSwgdGhlXG4gKiBzby1jYWxsZWQgXCJvdmVycmlkZSBtaXN0YWtlXCIuIEJ1dCBpdCBpcyBub3cgdG9vIGxhdGUgYW5kIHdlIG11c3QgbGl2ZSB3aXRoXG4gKiB0aGUgY29uc2VxdWVuY2VzLlxuICpcbiAqIEFzIGEgcmVzdWx0LCBzaW1wbHkgZnJlZXppbmcgYW4gb2JqZWN0IHRvIG1ha2UgaXQgdGFtcGVyIHByb29mIGhhcyB0aGVcbiAqIHVuZm9ydHVuYXRlIHNpZGUgZWZmZWN0IG9mIGJyZWFraW5nIHByZXZpb3VzbHkgY29ycmVjdCBjb2RlIHRoYXQgaXNcbiAqIGNvbnNpZGVyZWQgdG8gaGF2ZSBmb2xsb3dlZCBKUyBiZXN0IHByYWN0aWNlcywgaWYgdGhpcyBwcmV2aW91cyBjb2RlIHVzZWRcbiAqIGFzc2lnbm1lbnQgdG8gb3ZlcnJpZGUuXG4gKlxuICogRm9yIHRoZSBlbmFibGVkIHByb3BlcnRpZXMsIGBlbmFibGVQcm9wZXJ0eU92ZXJyaWRlc2AgZWZmZWN0aXZlbHkgc2hpbXMgd2hhdFxuICogdGhlIGFzc2lnbm1lbnQgYmVoYXZpb3Igd291bGQgaGF2ZSBiZWVuIGluIHRoZSBhYnNlbmNlIG9mIHRoZSBvdmVycmlkZVxuICogbWlzdGFrZS4gSG93ZXZlciwgdGhlIHNoaW0gcHJvZHVjZXMgYW4gaW1wZXJmZWN0IGVtdWxhdGlvbi4gSXQgc2hpbXMgdGhlXG4gKiBiZWhhdmlvciBieSB0dXJuaW5nIHRoZXNlIGRhdGEgcHJvcGVydGllcyBpbnRvIGFjY2Vzc29yIHByb3BlcnRpZXMsIHdoZXJlXG4gKiB0aGUgYWNjZXNzb3IncyBnZXR0ZXIgYW5kIHNldHRlciBwcm92aWRlIHRoZSBkZXNpcmVkIGJlaGF2aW9yLiBGb3JcbiAqIG5vbi1yZWZsZWN0aXZlIG9wZXJhdGlvbnMsIHRoZSBpbGx1c2lvbiBpcyBwZXJmZWN0LiBIb3dldmVyLCByZWZsZWN0aXZlXG4gKiBvcGVyYXRpb25zIGxpa2UgYGdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgc2VlIHRoZSBkZXNjcmlwdG9yIG9mIGFuIGFjY2Vzc29yXG4gKiBwcm9wZXJ0eSByYXRoZXIgdGhhbiB0aGUgZGVzY3JpcHRvciBvZiBhIGRhdGEgcHJvcGVydHkuIEF0IHRoZSB0aW1lIG9mIHRoaXNcbiAqIHdyaXRpbmcsIHRoaXMgaXMgdGhlIGJlc3Qgd2Uga25vdyBob3cgdG8gZG8uXG4gKlxuICogVG8gdGhlIGdldHRlciBvZiB0aGUgYWNjZXNzb3Igd2UgYWRkIGEgcHJvcGVydHkgbmFtZWRcbiAqIGAnb3JpZ2luYWxWYWx1ZSdgIHdob3NlIHZhbHVlIGlzLCBhcyBpdCBzYXlzLCB0aGUgdmFsdWUgdGhhdCB0aGVcbiAqIGRhdGEgcHJvcGVydHkgaGFkIGJlZm9yZSBiZWluZyBjb252ZXJ0ZWQgdG8gYW4gYWNjZXNzb3IgcHJvcGVydHkuIFdlIGFkZFxuICogdGhpcyBleHRyYSBwcm9wZXJ0eSB0byB0aGUgZ2V0dGVyIGZvciB0d28gcmVhc29uOlxuICpcbiAqIFRoZSBoYXJkZW4gYWxnb3JpdGhtIHdhbGtzIHRoZSBvd24gcHJvcGVydGllcyByZWZsZWN0aXZlbHksIGkuZS4sIHdpdGhcbiAqIGBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIHNlbWFudGljcywgcmF0aGVyIHRoYW4gYFtbR2V0XV1gIHNlbWFudGljcy4gV2hlblxuICogaXQgc2VlcyBhbiBhY2Nlc3NvciBwcm9wZXJ0eSwgaXQgZG9lcyBub3QgaW52b2tlIHRoZSBnZXR0ZXIuIFJhdGhlciwgaXRcbiAqIHByb2NlZWRzIHRvIHdhbGsgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXMgcGFydCBvZiBpdHMgdHJhbnNpdGl2ZVxuICogdHJhdmVyc2FsLiBXaXRob3V0IHRoaXMgZXh0cmEgcHJvcGVydHksIGBlbmFibGVQcm9wZXJ0eU92ZXJyaWRlc2Agd291bGQgaGF2ZVxuICogaGlkZGVuIHRoZSBvcmlnaW5hbCBkYXRhIHByb3BlcnR5IHZhbHVlIGZyb20gYGhhcmRlbmAsIHdoaWNoIHdvdWxkIGJlIGJhZC5cbiAqIEluc3RlYWQsIGJ5IGV4cG9zaW5nIHRoYXQgdmFsdWUgaW4gYW4gb3duIGRhdGEgcHJvcGVydHkgb24gdGhlIGdldHRlcixcbiAqIGBoYXJkZW5gIGZpbmRzIGFuZCB3YWxrcyBpdCBhbnl3YXkuXG4gKlxuICogV2UgZW5hYmxlIGEgZm9ybSBvZiBjb29wZXJhdGl2ZSBlbXVsYXRpb24sIGdpdmluZyByZWZsZWN0aXZlIGNvZGUgYW5cbiAqIG9wcG9ydHVuaXR5IHRvIGNvb3BlcmF0ZSBpbiB1cGhvbGRpbmcgdGhlIGlsbHVzaW9uLiBXaGVuIHN1Y2ggY29vcGVyYXRpdmVcbiAqIHJlZmxlY3RpdmUgY29kZSBzZWVzIGFuIGFjY2Vzc29yIHByb3BlcnR5LCB3aGVyZSB0aGUgYWNjZXNzb3IncyBnZXR0ZXJcbiAqIGhhcyBhbiBgb3JpZ2luYWxWYWx1ZWAgcHJvcGVydHksIGl0IGtub3dzIHRoYXQgdGhlIGdldHRlciBpc1xuICogYWxsZWdpbmcgdGhhdCBpdCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBgZW5hYmxlUHJvcGVydHlPdmVycmlkZXNgIGNvbnZlcnNpb25cbiAqIHBhdHRlcm4sIHNvIGl0IGNhbiBkZWNpZGUgdG8gY29vcGVyYXRpdmVseSBcInByZXRlbmRcIiB0aGF0IGl0IHNlZXMgYSBkYXRhXG4gKiBwcm9wZXJ0eSB3aXRoIHRoYXQgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBpbnRyaW5zaWNzXG4gKiBAcGFyYW0geydtaW4nIHwgJ21vZGVyYXRlJyB8ICdzZXZlcmUnfSBvdmVycmlkZVRhbWluZ1xuICogQHBhcmFtIHtJdGVyYWJsZTxzdHJpbmcgfCBzeW1ib2w+fSBbb3ZlcnJpZGVEZWJ1Z11cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgZW5hYmxlUHJvcGVydHlPdmVycmlkZXMoXG4gIGludHJpbnNpY3MsXG4gIG92ZXJyaWRlVGFtaW5nLFxuICBvdmVycmlkZURlYnVnPSAgW10pXG4gIHtcbiAgY29uc3QgZGVidWdQcm9wZXJ0aWVzPSAgbmV3IFNldChvdmVycmlkZURlYnVnKTtcbiAgZnVuY3Rpb24gZW5hYmxlKHBhdGgsIG9iaiwgcHJvcCwgZGVzYykge1xuICAgIGlmKCAndmFsdWUnaW4gIGRlc2MmJiAgZGVzYy5jb25maWd1cmFibGUpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWV9PSAgIGRlc2M7XG5cbiAgICAgIGZ1bmN0aW9uIGdldHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgIH1cbiAgICAgIGRlZmluZVByb3BlcnR5KGdldHRlciwgJ29yaWdpbmFsVmFsdWUnLCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfSk7XG5cblxuICAgICAgY29uc3QgaXNEZWJ1Zz0gIHNldEhhcyhkZWJ1Z1Byb3BlcnRpZXMsIHByb3ApO1xuXG4gICAgICBmdW5jdGlvbiBzZXR0ZXIobmV3VmFsdWUpIHtcbiAgICAgICAgaWYoIG9iaj09PSAgdGhpcykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgYENhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5ICcke1N0cmluZyhcbiAgICAgICAgICAgICAgcHJvcClcbiAgICAgICAgICAgICAgfScgb2YgJyR7cGF0aH0nYCk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KHRoaXMsIHByb3ApKSB7XG4gICAgICAgICAgdGhpc1twcm9wXT0gIG5ld1ZhbHVlO1xuICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgIGlmKCBpc0RlYnVnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihuZXcgVHlwZUVycm9yKCBgT3ZlcnJpZGUgcHJvcGVydHkgJHtwcm9wfWApKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIHByb3AsIHtcbiAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0pO1xuXG4gICAgICAgICB9XG4gICAgICAgfVxuXG4gICAgICBkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcbiAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgIHNldDogc2V0dGVyLFxuICAgICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZGVzYy5jb25maWd1cmFibGV9KTtcblxuICAgICB9XG4gICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlUHJvcGVydHkocGF0aCwgb2JqLCBwcm9wKSB7XG4gICAgY29uc3QgZGVzYz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgIGlmKCAhZGVzYykge1xuICAgICAgcmV0dXJuO1xuICAgICB9XG4gICAgZW5hYmxlKHBhdGgsIG9iaiwgcHJvcCwgZGVzYyk7XG4gICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlQWxsUHJvcGVydGllcyhwYXRoLCBvYmopIHtcbiAgICBjb25zdCBkZXNjcz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgICBpZiggIWRlc2NzKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cbiAgICAvLyBUeXBlU2NyaXB0IGRvZXMgbm90IGFsbG93IHN5bWJvbHMgdG8gYmUgdXNlZCBhcyBpbmRleGVzIGJlY2F1c2UgaXRcbiAgICAvLyBjYW5ub3QgcmVjb2tvbiB0eXBlcyBvZiBzeW1ib2xpemVkIHByb3BlcnRpZXMuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGFycmF5Rm9yRWFjaChvd25LZXlzKGRlc2NzKSwgKHByb3ApPT5lbmFibGUocGF0aCwgb2JqLCBwcm9wLCBkZXNjc1twcm9wXSkpO1xuICAgfVxuXG4gIGZ1bmN0aW9uIGVuYWJsZVByb3BlcnRpZXMocGF0aCwgb2JqLCBwbGFuKSB7XG4gICAgZm9yKCBjb25zdCBwcm9wIG9mIGdldE93blByb3BlcnR5TmFtZXMocGxhbikpIHtcbiAgICAgIGNvbnN0IGRlc2M9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcbiAgICAgIGlmKCAhZGVzY3x8ICBkZXNjLmdldHx8ICBkZXNjLnNldCkge1xuICAgICAgICAvLyBObyBub3QgYSB2YWx1ZSBwcm9wZXJ0eSwgbm90aGluZyB0byBkby5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgIH1cblxuICAgICAgLy8gUGxhbiBoYXMgbm8gc3ltYm9sIGtleXMgYW5kIHdlIHVzZSBnZXRPd25Qcm9wZXJ0eU5hbWVzKClcbiAgICAgIC8vIHNvIGBwcm9wYCBjYW5ub3Qgb25seSBiZSBhIHN0cmluZywgbm90IGEgc3ltYm9sLiBXZSBjb2VyY2UgaXQgaW4gcGxhY2VcbiAgICAgIC8vIHdpdGggYFN0cmluZyguLilgIGFueXdheSBqdXN0IGFzIGdvb2QgaHlnaWVuZSwgc2luY2UgdGhlc2UgcGF0aHMgYXJlIGp1c3RcbiAgICAgIC8vIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLlxuICAgICAgY29uc3Qgc3ViUGF0aD0gICBgJHtwYXRofS4ke1N0cmluZyhwcm9wKX1gO1xuICAgICAgY29uc3Qgc3ViUGxhbj0gIHBsYW5bcHJvcF07XG5cbiAgICAgIGlmKCBzdWJQbGFuPT09ICB0cnVlKSB7XG4gICAgICAgIGVuYWJsZVByb3BlcnR5KHN1YlBhdGgsIG9iaiwgcHJvcCk7XG4gICAgICAgfWVsc2UgaWYoIHN1YlBsYW49PT0gICcqJykge1xuICAgICAgICBlbmFibGVBbGxQcm9wZXJ0aWVzKHN1YlBhdGgsIGRlc2MudmFsdWUpO1xuICAgICAgIH1lbHNlIGlmKCBpc09iamVjdChzdWJQbGFuKSkge1xuICAgICAgICBlbmFibGVQcm9wZXJ0aWVzKHN1YlBhdGgsIGRlc2MudmFsdWUsIHN1YlBsYW4pO1xuICAgICAgIH1lbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYFVuZXhwZWN0ZWQgb3ZlcnJpZGUgZW5hYmxlbWVudCBwbGFuICR7c3ViUGF0aH1gKTtcbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICBsZXQgcGxhbjtcbiAgc3dpdGNoKCBvdmVycmlkZVRhbWluZyl7XG4gICAgY2FzZSAnbWluJzoge1xuICAgICAgcGxhbj0gIG1pbkVuYWJsZW1lbnRzO1xuICAgICAgYnJlYWs7XG4gICAgIH1cbiAgICBjYXNlICdtb2RlcmF0ZSc6IHtcbiAgICAgIHBsYW49ICBtb2RlcmF0ZUVuYWJsZW1lbnRzO1xuICAgICAgYnJlYWs7XG4gICAgIH1cbiAgICBjYXNlICdzZXZlcmUnOiB7XG4gICAgICBwbGFuPSAgc2V2ZXJlRW5hYmxlbWVudHM7XG4gICAgICBicmVhaztcbiAgICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgb3ZlcnJpZGVUYW1pbmcgJHtvdmVycmlkZVRhbWluZ31gKTtcbiAgICAgfX1cblxuXG4gIC8vIERvIHRoZSByZXBhaXIuXG4gIGVuYWJsZVByb3BlcnRpZXMoJ3Jvb3QnLCBpbnRyaW5zaWNzLCBwbGFuKTtcbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgZW5hYmxlUHJvcGVydHlPdmVycmlkZXMpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syNl0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhcnJheVB1c2gsZnJlZXplLGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcImFycmF5UHVzaFwiLCBbJGjigI1fYSA9PiAoYXJyYXlQdXNoID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0IHsgZGV0YWlsczogWCwgRmFpbCwgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuLyoqXG4gKiBKYXZhU2NyaXB0IG1vZHVsZSBzZW1hbnRpY3MgcmVzaXN0cyBhdHRlbXB0cyB0byBwYXJhbWV0ZXJpemUgYSBtb2R1bGUnc1xuICogaW5pdGlhbGl6YXRpb24gYmVoYXZpb3IuIEEgbW9kdWxlIGluaXRpYWxpemVzIGluIG9yZGVyIGFjY29yZGluZyB0b1xuICogdGhlIHBhdGggYnkgd2hpY2ggaXQgaXMgZmlyc3QgaW1wb3J0ZWQsIGFuZCB0aGVuIHRoZSBpbml0aWFsaXplZCBtb2R1bGVcbiAqIGlzIHJldXNlZCBieSBhbGwgdGhlIG90aGVyIHRpbWVzIGl0IGlzIGltcG9ydGVkLiBDb21wYXJ0bWVudHMgZ2l2ZSB1c1xuICogdGhlIG9wcG9ydHVuaXR5IHRvIGJpbmQgdGhlIHNhbWUgaW1wb3J0IG5hbWUgdG8gZGlmZmVyZW50IGltcG9ydGVkXG4gKiBtb2R1bGVzLCBkZXBlbmRpbmcgb24gdGhlIHBhY2thZ2UvY29tcGFydG1lbnQgZG9pbmcgdGhlIGltcG9ydC4gQ29tcGFydG1lbnRzXG4gKiBhbHNvIGFkZHJlc3MgdGhlIGRpZmZpY3VsdHkgb2YgcGFyYW1ldGVyaXppbmcgYSBtb2R1bGUncyBpbml0aWFsaXphdGlvblxuICogbG9naWMsIGJ1dCBub3QgaW4gYSBwbGVhc2FudCBtYW5uZXIuXG4gKlxuICogQSBwbGVhc2FudCBwYXJhbWV0ZXJpemF0aW9uIHdvdWxkIGJlIGZvciBhIHN0YXRpYyBtb2R1bGUgdG8gYmUgZnVuY3Rpb24tbGlrZVxuICogd2l0aCBleHBsaWNpdCBwYXJhbWV0ZXJzLCBhbmQgZm9yIHRoZSBwYXJhbWV0ZXJpemF0aW9uIHRvIGJlIGxpa2VcbiAqIGNhbGxpbmcgdGhlIHN0YXRpYyBtb2R1bGUgd2l0aCBwYXJhbWV0ZXJzIGluIG9yZGVyIHRvIGRlcml2ZSBmcm9tIGl0IGFcbiAqIG1vZHVsZSBpbnN0YW5jZS4gQ29tcGFydG1lbnRzIGluc3RlYWQgbGV0cyB1cyBwYXJhbWV0ZXJpemUgdGhlIG1lYW5pbmdcbiAqIG9mIGEgbW9kdWxlIGluc3RhbmNlIGRlcml2ZWQgZnJvbSBhIHN0YXRpYyBtb2R1bGUgYWNjb3JkaW5nIHRvIHRoZVxuICogdGhyZWUgbmFtZXNwYWNlcyBwcm92aWRlZCBieSB0aGUgSmF2YVNjcmlwdCBzZW1hbnRpY3MsIGFmZmVjdGluZyB0aGVcbiAqIG1lYW5pbmcgb2YgYSBtb2R1bGUgaW5zdGFuY2UuXG4gKiAgICAqIFRoZSBnbG9iYWwgdmFyaWFibGUgbmFtZXNwYWNlcy5cbiAqICAgICAgICogVGhlIGdsb2JhbCBzY29wZSwgYWxpYXNlZCB0byBwcm9wZXJ0aWVzIG9mIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogICAgICAgICBUaGlzIGlzIG5lY2Vzc2FyaWx5IGNvbXBhcnRtZW50LXdpZGUsIGFuZCB0aGVyZWZvcmUgaW4gb3VyXG4gKiAgICAgICAgIHJlY29tbWVuZWQgdXNhZ2UgcGF0dGVybiwgcGFja2FnZS13aWRlLlxuICogICAgICAgKiBUaGUgZ2xvYmFsIGxleGljYWwgc2NvcGUuIFRoZSBTRVMtc2hpbSBjb21wYXJ0bWVudHMgc3VwcG9ydFxuICogICAgICAgICB0aGVzZSBib3RoIGNvbXBhcnRtZW50LXdpZGUgYXMgd2VsbCBhcyBwZXItbW9kdWxlLiBCdXQgaXQgaXNcbiAqICAgICAgICAgbm90IHlldCBjbGVhciB3aGF0IHdlIHdpbGwgcHJvcG9zZSBpbiB0aGUgQ29tcGFydG1lbnQgcHJvcG9zYWwuXG4gKiAgICAqIFRoZSBpbXBvcnQgbmFtZXNwYWNlLlxuICogICAgKiBUaGUgaG9zdCBob29rcy5cbiAqXG4gKiBUaGlzIGBlbnZpcm9ubWVudC1vcHRpb25zLmpzYCBtb2R1bGUgbG9va3MgZm9yIGEgc2V0dGluZyBvZiBhblxuICogYG9wdGlvbk5hbWVgIHBhcmFtZXRlciByb290ZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4gSWYgZm9sbG93cyB0aGUgTm9kZVxuICogcHJlY2VkZW50IGZvciBmaW5kaW5nIFVuaXggZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0dGluZ3MsIGxvb2tpbmcgZm9yIGFcbiAqIGdsb2JhbCBgcHJvY2Vzc2Agb2JqZWN0IGhvbGRpbmcgYW4gYGVudmAgb2JqZWN0LFxuICogb3B0aW9uYWxseSBob2xkaW5nIGEgcHJvcGVydHkgbmFtZWQgZm9yIHRoZSBgb3B0aW9uTmFtZWAgd2hvc2UgdmFsdWUgaXMgdGhlXG4gKiBjb25maWd1cmF0aW9uIHNldHRpbmcgb2YgdGhhdCBvcHRpb24uIEZvciBleGFtcGxlLCBmb3IgdGhlIG9wdGlvbk5hbWVcbiAqIGBGT09fQkFSYCBpdCB3b3VsZCBsb29rIGluXG4gKiBgZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5GT09fQkFSYC5cbiAqXG4gKiBJZiBzZXR0aW5nIGlzIGVpdGhlciBhYnNlbnQgb3IgYHVuZGVmaW5lZGAsIHRoYXQgaW5kaWNhdGVzIHRoYXRcbiAqIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gc2hvdWxkIGhhdmUgaXRzIGRlZmF1bHQgYmVoYXZpb3IsIHdoYXRldmVyIHRoYXQgaXMuXG4gKiBPdGhlcndpc2UsIHJlZmxlY3RpbmcgVW5peCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZSBzZXR0aW5nIG11c3QgYmUgYVxuICogc3RyaW5nLiBUaGlzIGFsc28gaGVscHMgZW5zdXJlIHRoYXQgdGhpcyBjaGFubmVsIGlzIHVzZWQgb25seSB0byBwYXNzIGRhdGEsXG4gKiBub3QgYXV0aG9yaXR5IGJleW9uZCB0aGUgYWJpbGl0eSB0byByZWFkIHRoaXMgZ2xvYmFsIHN0YXRlLlxuICovXG5cbi8qKlxuICogbWFrZUVudmlyb25tZW50Q2FwdG9yIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBnZXR0aW5nIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG5lZWRlZCwgYW5kIGEgd2F5IHRvIGNhdGFsb2cgdGhlIG5hbWVzIG9mIGFsbFxuICogdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHdlcmUgY2FwdHVyZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFHbG9iYWxcbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbnZpcm9ubWVudENhcHRvcj0gIChhR2xvYmFsKT0+e1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9ICBbXTtcblxuICAvKipcbiAgICogR2V0cyBhbiBlbnZpcm9ubWVudCBvcHRpb24gYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlIG9yIHRoZVxuICAgKiBnaXZlbiBkZWZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdFNldHRpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uPSAgKG9wdGlvbk5hbWUsIGRlZmF1bHRTZXR0aW5nKT0+ICB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgWCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgZGVmYXVsdFNldHRpbmcsXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIFggYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZylcbiAgICAgICAgfSBtdXN0IGJlIGEgc3RyaW5nLmApO1xuXG5cbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgc2V0dGluZz0gIGRlZmF1bHRTZXR0aW5nO1xuICAgIGNvbnN0IGdsb2JhbFByb2Nlc3M9ICBhR2xvYmFsLnByb2Nlc3M7XG4gICAgaWYoIGdsb2JhbFByb2Nlc3MmJiAgdHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0gICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBnbG9iYWxFbnY9ICBnbG9iYWxQcm9jZXNzLmVudjtcbiAgICAgIGlmKCBnbG9iYWxFbnYmJiAgdHlwZW9mIGdsb2JhbEVudj09PSAgJ29iamVjdCcpIHtcbiAgICAgICAgaWYoIG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWU9ICBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICAgICAgICAnc3RyaW5nJyxcbiAgICAgICAgICAgIFggYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICAgIG9wdGlvbk5hbWUpXG4gICAgICAgICAgICAgIH0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxuICAgICAgICAgICAgICBvcHRpb25WYWx1ZSlcbiAgICAgICAgICAgICAgfWApO1xuXG4gICAgICAgICAgc2V0dGluZz0gIG9wdGlvblZhbHVlO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuICAgIHNldHRpbmc9PT0gIHVuZGVmaW5lZHx8XG4gICAgICB0eXBlb2Ygc2V0dGluZz09PSAgJ3N0cmluZyd8fFxuICAgICAgRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZylcbiAgICAgICAgfSwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuICBjb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9ICAoKT0+ICB7XG4gICAgcmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gICB9O1xuICBmcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxuICByZXR1cm4gZnJlZXplKHsgZ2V0RW52aXJvbm1lbnRPcHRpb24sIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc30pO1xuIH07JGjigI1fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syN10gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBXZWFrU2V0LGFycmF5RmlsdGVyLGFycmF5TWFwLGFycmF5UHVzaCxkZWZpbmVQcm9wZXJ0eSxmcmVlemUsZnJvbUVudHJpZXMsaXNFcnJvcixzdHJpbmdFbmRzV2l0aCx3ZWFrc2V0QWRkLHdlYWtzZXRIYXM7JGjigI1faW1wb3J0cyhbW1wiLi4vY29tbW9ucy5qc1wiLCBbW1wiV2Vha1NldFwiLCBbJGjigI1fYSA9PiAoV2Vha1NldCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlGaWx0ZXJcIiwgWyRo4oCNX2EgPT4gKGFycmF5RmlsdGVyID0gJGjigI1fYSldXSxbXCJhcnJheU1hcFwiLCBbJGjigI1fYSA9PiAoYXJyYXlNYXAgPSAkaOKAjV9hKV1dLFtcImFycmF5UHVzaFwiLCBbJGjigI1fYSA9PiAoYXJyYXlQdXNoID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJmcm9tRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3IgPSAkaOKAjV9hKV1dLFtcInN0cmluZ0VuZHNXaXRoXCIsIFskaOKAjV9hID0+IChzdHJpbmdFbmRzV2l0aCA9ICRo4oCNX2EpXV0sW1wid2Vha3NldEFkZFwiLCBbJGjigI1fYSA9PiAod2Vha3NldEFkZCA9ICRo4oCNX2EpXV0sW1wid2Vha3NldEhhc1wiLCBbJGjigI1fYSA9PiAod2Vha3NldEhhcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vLyBGb3Igb3VyIGludGVybmFsIGRlYnVnZ2luZyBwdXJwb3NlcywgdW5jb21tZW50XG4vLyBjb25zdCBpbnRlcm5hbERlYnVnQ29uc29sZSA9IGNvbnNvbGU7XG5cbi8vIFRoZSB3aGl0ZWxpc3RzIG9mIGNvbnNvbGUgbWV0aG9kcywgZnJvbTpcbi8vIFdoYXR3ZyBcImxpdmluZyBzdGFuZGFyZFwiIGh0dHBzOi8vY29uc29sZS5zcGVjLndoYXR3Zy5vcmcvXG4vLyBOb2RlIGh0dHBzOi8vbm9kZWpzLm9yZy9kaXN0L2xhdGVzdC12MTQueC9kb2NzL2FwaS9jb25zb2xlLmh0bWxcbi8vIE1ETiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ29uc29sZV9BUElcbi8vIFR5cGVTY3JpcHQgaHR0cHM6Ly9vcGVuc3RhcHBzLmdpdGxhYi5pby9wcm9qZWN0bWFuYWdlbWVudC9pbnRlcmZhY2VzL19ub2RlX21vZHVsZXNfX3R5cGVzX25vZGVfZ2xvYmFsc19kXy5jb25zb2xlLmh0bWxcbi8vIENocm9tZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdG9vbHMvY2hyb21lLWRldnRvb2xzL2NvbnNvbGUvYXBpXG5cbi8vIEFsbCBjb25zb2xlIGxldmVsIG1ldGhvZHMgaGF2ZSBwYXJhbWV0ZXJzIChmbXQ/LCAuLi5hcmdzKVxuLy8gd2hlcmUgdGhlIGFyZ3VtZW50IHNlcXVlbmNlIGBmbXQ/LCAuLi5hcmdzYCBmb3JtYXRzIGFyZ3MgYWNjb3JkaW5nIHRvXG4vLyBmbXQgaWYgZm10IGlzIGEgZm9ybWF0IHN0cmluZy4gT3RoZXJ3aXNlLCBpdCBqdXN0IHJlbmRlcnMgdGhlbSBhbGwgYXMgdmFsdWVzXG4vLyBzZXBhcmF0ZWQgYnkgc3BhY2VzLlxuLy8gaHR0cHM6Ly9jb25zb2xlLnNwZWMud2hhdHdnLm9yZy8jZm9ybWF0dGVyXG4vLyBodHRwczovL25vZGVqcy5vcmcvZG9jcy9sYXRlc3QvYXBpL3V0aWwuaHRtbCN1dGlsX3V0aWxfZm9ybWF0X2Zvcm1hdF9hcmdzXG5cbi8vIEZvciB0aGUgY2F1c2FsIGNvbnNvbGUsIGFsbCBvY2N1cnJlbmNlcyBvZiBgZm10LCAuLi5hcmdzYCBvciBgLi4uYXJnc2AgYnlcbi8vIGl0c2VsZiBtdXN0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgYW4gZXJyb3IgdG8gYXNrIHRoZVxuLy8gYGxvZ2dlZEVycm9ySGFuZGxlcmAgdG8gaGFuZGxlLlxuLy8gSW4gdGhlb3J5IHdlIHNob3VsZCBkbyBhIGRlZXAgaW5zcGVjdGlvbiB0byBkZXRlY3QgZm9yIGV4YW1wbGUgYW4gYXJyYXlcbi8vIGNvbnRhaW5pbmcgYW4gZXJyb3IuIFdlIGN1cnJlbnRseSBkbyBub3QgZGV0ZWN0IHRoZXNlIGFuZCBtYXkgbmV2ZXIuXG5cbi8qKiBAdHlwZWRlZiB7a2V5b2YgVmlydHVhbENvbnNvbGUgfCAncHJvZmlsZScgfCAncHJvZmlsZUVuZCd9IENvbnNvbGVQcm9wcyAqL1xuXG4vKiogQHR5cGUge3JlYWRvbmx5IFtDb25zb2xlUHJvcHMsIExvZ1NldmVyaXR5IHwgdW5kZWZpbmVkXVtdfSAqL1xuY29uc3QgY29uc29sZUxldmVsTWV0aG9kcz0gIGZyZWV6ZShbXG4gIFsnZGVidWcnLCAnZGVidWcnXSwgLy8gKGZtdD8sIC4uLmFyZ3MpIHZlcmJvc2UgbGV2ZWwgb24gQ2hyb21lXG4gIFsnbG9nJywgJ2xvZyddLCAvLyAoZm10PywgLi4uYXJncykgaW5mbyBsZXZlbCBvbiBDaHJvbWVcbiAgWydpbmZvJywgJ2luZm8nXSwgLy8gKGZtdD8sIC4uLmFyZ3MpXG4gIFsnd2FybicsICd3YXJuJ10sIC8vIChmbXQ/LCAuLi5hcmdzKVxuICBbJ2Vycm9yJywgJ2Vycm9yJ10sIC8vIChmbXQ/LCAuLi5hcmdzKVxuXG4gIFsndHJhY2UnLCAnbG9nJ10sIC8vIChmbXQ/LCAuLi5hcmdzKVxuICBbJ2RpcnhtbCcsICdsb2cnXSwgLy8gKGZtdD8sIC4uLmFyZ3MpXG4gIFsnZ3JvdXAnLCAnbG9nJ10sIC8vIChmbXQ/LCAuLi5hcmdzKVxuICBbJ2dyb3VwQ29sbGFwc2VkJywgJ2xvZyddICAvLyAoZm10PywgLi4uYXJncylcbl0pO1xuXG4vKiogQHR5cGUge3JlYWRvbmx5IFtDb25zb2xlUHJvcHMsIExvZ1NldmVyaXR5IHwgdW5kZWZpbmVkXVtdfSAqL1xuY29uc3QgY29uc29sZU90aGVyTWV0aG9kcz0gIGZyZWV6ZShbXG4gIFsnYXNzZXJ0JywgJ2Vycm9yJ10sIC8vICh2YWx1ZSwgZm10PywgLi4uYXJncylcbiAgWyd0aW1lTG9nJywgJ2xvZyddLCAvLyAobGFiZWw/LCAuLi5hcmdzKSBubyBmbXQgc3RyaW5nXG5cbiAgLy8gSW5zZW5zaXRpdmUgdG8gd2hldGhlciBhbnkgYXJndW1lbnQgaXMgYW4gZXJyb3IuIEFsbCBhcmd1bWVudHMgY2FuIHBhc3NcbiAgLy8gdGhydSB0byBiYXNlQ29uc29sZSBhcyBpcy5cbiAgWydjbGVhcicsIHVuZGVmaW5lZF0sIC8vICgpXG4gIFsnY291bnQnLCAnaW5mbyddLCAvLyAobGFiZWw/KVxuICBbJ2NvdW50UmVzZXQnLCB1bmRlZmluZWRdLCAvLyAobGFiZWw/KVxuICBbJ2RpcicsICdsb2cnXSwgLy8gKGl0ZW0sIG9wdGlvbnM/KVxuICBbJ2dyb3VwRW5kJywgJ2xvZyddLCAvLyAoKVxuICAvLyBJbiB0aGVvcnkgdGFidWxhciBkYXRhIG1heSBiZSBvciBjb250YWluIGFuIGVycm9yLiBIb3dldmVyLCB3ZSBjdXJyZW50bHlcbiAgLy8gZG8gbm90IGRldGVjdCB0aGVzZSBhbmQgbWF5IG5ldmVyLlxuICBbJ3RhYmxlJywgJ2xvZyddLCAvLyAodGFidWxhckRhdGEsIHByb3BlcnRpZXM/KVxuICBbJ3RpbWUnLCAnaW5mbyddLCAvLyAobGFiZWw/KVxuICBbJ3RpbWVFbmQnLCAnaW5mbyddLCAvLyAobGFiZWw/KVxuXG4gIC8vIE5vZGUgSW5zcGVjdG9yIG9ubHksIE1ETiwgYW5kIFR5cGVTY3JpcHQsIGJ1dCBub3Qgd2hhdHdnXG4gIFsncHJvZmlsZScsIHVuZGVmaW5lZF0sIC8vIChsYWJlbD8pXG4gIFsncHJvZmlsZUVuZCcsIHVuZGVmaW5lZF0sIC8vIChsYWJlbD8pXG4gIFsndGltZVN0YW1wJywgdW5kZWZpbmVkXSAgLy8gKGxhYmVsPylcbl0pO1xuXG4vKiogQHR5cGUge3JlYWRvbmx5IFtDb25zb2xlUHJvcHMsIExvZ1NldmVyaXR5IHwgdW5kZWZpbmVkXVtdfSAqL1xuY29uc3QgICAgICAgIGNvbnNvbGVXaGl0ZWxpc3Q9ICBmcmVlemUoW1xuICAuLi5jb25zb2xlTGV2ZWxNZXRob2RzLFxuICAuLi5jb25zb2xlT3RoZXJNZXRob2RzXSk7XG5cblxuLyoqXG4gKiBjb25zb2xlT21pdHRlZFByb3BlcnRpZXMgaXMgY3VycmVudGx5IHVudXNlZC4gSSByZWNvcmQgYW5kIG1haW50YWluIGl0IGhlcmVcbiAqIHdpdGggdGhlIGludGVudGlvbiB0aGF0IGl0IGJlIHRyZWF0ZWQgbGlrZSB0aGUgYGZhbHNlYCBlbnRyaWVzIGluIHRoZSBtYWluXG4gKiBTRVMgd2hpdGVsaXN0OiB0aGF0IHNlZWluZyB0aGVzZSBvbiB0aGUgb3JpZ2luYWwgY29uc29sZSBpcyBleHBlY3RlZCwgYnV0XG4gKiBzZWVpbmcgYW55dGhpbmcgZWxzZSB0aGF0J3Mgb3V0c2lkZSB0aGUgd2hpdGVsaXN0IGlzIHN1cnByaXNpbmcgYW5kIHNob3VsZFxuICogcHJvdmlkZSBhIGRpYWdub3N0aWMuXG4gKlxuICogY29uc3QgY29uc29sZU9taXR0ZWRQcm9wZXJ0aWVzID0gZnJlZXplKFtcbiAqICAgJ21lbW9yeScsIC8vIENocm9tZVxuICogICAnZXhjZXB0aW9uJywgLy8gRkYsIE1ETlxuICogICAnX2lnbm9yZUVycm9ycycsIC8vIE5vZGVcbiAqICAgJ19zdGRlcnInLCAvLyBOb2RlXG4gKiAgICdfc3RkZXJyRXJyb3JIYW5kbGVyJywgLy8gTm9kZVxuICogICAnX3N0ZG91dCcsIC8vIE5vZGVcbiAqICAgJ19zdGRvdXRFcnJvckhhbmRsZXInLCAvLyBOb2RlXG4gKiAgICdfdGltZXMnLCAvLyBOb2RlXG4gKiAgICdjb250ZXh0JywgLy8gQ2hyb21lLCBOb2RlXG4gKiAgICdyZWNvcmQnLCAvLyBTYWZhcmlcbiAqICAgJ3JlY29yZEVuZCcsIC8vIFNhZmFyaVxuICpcbiAqICAgJ3NjcmVlbnNob3QnLCAvLyBTYWZhcmlcbiAqICAgLy8gU3ltYm9sc1xuICogICAnQEB0b1N0cmluZ1RhZycsIC8vIENocm9tZTogXCJPYmplY3RcIiwgU2FmYXJpOiBcIkNvbnNvbGVcIlxuICogICAvLyBBIHZhcmlldHkgb2Ygb3RoZXIgc3ltYm9scyBhbHNvIHNlZW4gb24gTm9kZVxuICogXSk7XG4gKi9cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqIEB0eXBlIHtNYWtlTG9nZ2luZ0NvbnNvbGVLaXR9ICovJGjigI1fb25jZS5jb25zb2xlV2hpdGVsaXN0KGNvbnNvbGVXaGl0ZWxpc3QpO1xuY29uc3QgbWFrZUxvZ2dpbmdDb25zb2xlS2l0PSAgKFxuICBsb2dnZWRFcnJvckhhbmRsZXIsXG4gIHsgc2hvdWxkUmVzZXRGb3JEZWJ1Z2dpbmc9ICBmYWxzZX09ICAge30pPT5cbiAgICAge1xuICBpZiggc2hvdWxkUmVzZXRGb3JEZWJ1Z2dpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIGxvZ2dlZEVycm9ySGFuZGxlci5yZXNldEVycm9yVGFnTnVtKCk7XG4gICB9XG5cbiAgLy8gTm90IGZyb3plbiFcbiAgbGV0IGxvZ0FycmF5PSAgW107XG5cbiAgY29uc3QgbG9nZ2luZ0NvbnNvbGU9ICBmcm9tRW50cmllcyhcbiAgICBhcnJheU1hcChjb25zb2xlV2hpdGVsaXN0LCAoW25hbWUsIF9dKT0+ICB7XG4gICAgICAvLyBVc2UgYW4gYXJyb3cgZnVuY3Rpb24gc28gdGhhdCBpdCBkb2Vzbid0IGNvbWUgd2l0aCBpdHMgb3duIG5hbWUgaW5cbiAgICAgIC8vIGl0cyBwcmludGVkIGZvcm0uIEluc3RlYWQsIHdlJ3JlIGhvcGluZyB0aGF0IHRvb2xpbmcgdXNlcyBvbmx5XG4gICAgICAvLyB0aGUgYC5uYW1lYCBwcm9wZXJ0eSBzZXQgYmVsb3cuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IG1ldGhvZD0gICguLi5hcmdzKT0+ICB7XG4gICAgICAgIGFycmF5UHVzaChsb2dBcnJheSwgW25hbWUsIC4uLmFyZ3NdKTtcbiAgICAgICB9O1xuICAgICAgZGVmaW5lUHJvcGVydHkobWV0aG9kLCAnbmFtZScsIHsgdmFsdWU6IG5hbWV9KTtcbiAgICAgIHJldHVybiBbbmFtZSwgZnJlZXplKG1ldGhvZCldO1xuICAgICB9KSk7XG5cbiAgZnJlZXplKGxvZ2dpbmdDb25zb2xlKTtcblxuICBjb25zdCB0YWtlTG9nPSAgKCk9PiAge1xuICAgIGNvbnN0IHJlc3VsdD0gIGZyZWV6ZShsb2dBcnJheSk7XG4gICAgbG9nQXJyYXk9ICBbXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICAgfTtcbiAgZnJlZXplKHRha2VMb2cpO1xuXG4gIGNvbnN0IHR5cGVkTG9nZ2luZ0NvbnNvbGU9ICAvKiogQHR5cGUge1ZpcnR1YWxDb25zb2xlfSAqLyAgbG9nZ2luZ0NvbnNvbGU7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7IGxvZ2dpbmdDb25zb2xlOiB0eXBlZExvZ2dpbmdDb25zb2xlLCB0YWtlTG9nfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VMb2dnaW5nQ29uc29sZUtpdChtYWtlTG9nZ2luZ0NvbnNvbGVLaXQpO1xuZnJlZXplKG1ha2VMb2dnaW5nQ29uc29sZUtpdCk7XG5cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqIEB0eXBlIHtFcnJvckluZm99ICovXG5jb25zdCBFcnJvckluZm89ICB7XG4gIE5PVEU6ICdFUlJPUl9OT1RFOicsXG4gIE1FU1NBR0U6ICdFUlJPUl9NRVNTQUdFOid9O1xuXG5mcmVlemUoRXJyb3JJbmZvKTtcblxuLyoqIEB0eXBlIHtNYWtlQ2F1c2FsQ29uc29sZX0gKi9cbmNvbnN0IG1ha2VDYXVzYWxDb25zb2xlPSAgKGJhc2VDb25zb2xlLCBsb2dnZWRFcnJvckhhbmRsZXIpPT4gIHtcbiAgY29uc3Qge1xuICAgIGdldFN0YWNrU3RyaW5nLFxuICAgIHRhZ0Vycm9yLFxuICAgIHRha2VNZXNzYWdlTG9nQXJncyxcbiAgICB0YWtlTm90ZUxvZ0FyZ3NBcnJheX09XG4gICAgICBsb2dnZWRFcnJvckhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVhZG9ubHlBcnJheTxhbnk+fSBsb2dBcmdzXG4gICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gc3ViRXJyb3JzU2lua1xuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgY29uc3QgZXh0cmFjdEVycm9yQXJncz0gIChsb2dBcmdzLCBzdWJFcnJvcnNTaW5rKT0+ICB7XG4gICAgY29uc3QgYXJnVGFncz0gIGFycmF5TWFwKGxvZ0FyZ3MsIChhcmcpPT57XG4gICAgICBpZiggaXNFcnJvcihhcmcpKSB7XG4gICAgICAgIGFycmF5UHVzaChzdWJFcnJvcnNTaW5rLCBhcmcpO1xuICAgICAgICByZXR1cm4gIGAoJHt0YWdFcnJvcihhcmcpfSlgO1xuICAgICAgIH1cbiAgICAgIHJldHVybiBhcmc7XG4gICAgIH0pO1xuICAgIHJldHVybiBhcmdUYWdzO1xuICAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtMb2dTZXZlcml0eX0gc2V2ZXJpdHlcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICogQHBhcmFtIHtFcnJvckluZm9LaW5kfSBraW5kXG4gICAqIEBwYXJhbSB7cmVhZG9ubHkgYW55W119IGxvZ0FyZ3NcbiAgICogQHBhcmFtIHtBcnJheTxFcnJvcj59IHN1YkVycm9yc1NpbmtcbiAgICovXG4gIGNvbnN0IGxvZ0Vycm9ySW5mbz0gIChzZXZlcml0eSwgZXJyb3IsIGtpbmQsIGxvZ0FyZ3MsIHN1YkVycm9yc1NpbmspPT4gIHtcbiAgICBjb25zdCBlcnJvclRhZz0gIHRhZ0Vycm9yKGVycm9yKTtcbiAgICBjb25zdCBlcnJvck5hbWU9XG4gICAgICBraW5kPT09ICBFcnJvckluZm8uTUVTU0FHRT8gICBgJHtlcnJvclRhZ306YDogIGAke2Vycm9yVGFnfSAke2tpbmR9YDtcbiAgICBjb25zdCBhcmdUYWdzPSAgZXh0cmFjdEVycm9yQXJncyhsb2dBcmdzLCBzdWJFcnJvcnNTaW5rKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIGJhc2VDb25zb2xlW3NldmVyaXR5XShlcnJvck5hbWUsIC4uLmFyZ1RhZ3MpO1xuICAgfTtcblxuICAvKipcbiAgICogTG9ncyB0aGUgYHN1YkVycm9yc2Agd2l0aGluIGEgZ3JvdXAgbmFtZSBtZW50aW9uaW5nIGBvcHRUYWdgLlxuICAgKlxuICAgKiBAcGFyYW0ge0xvZ1NldmVyaXR5fSBzZXZlcml0eVxuICAgKiBAcGFyYW0ge0Vycm9yW119IHN1YkVycm9yc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gb3B0VGFnXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY29uc3QgbG9nU3ViRXJyb3JzPSAgKHNldmVyaXR5LCBzdWJFcnJvcnMsIG9wdFRhZz0gIHVuZGVmaW5lZCk9PiAge1xuICAgIGlmKCBzdWJFcnJvcnMubGVuZ3RoPT09ICAwKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cbiAgICBpZiggc3ViRXJyb3JzLmxlbmd0aD09PSAgMSYmICBvcHRUYWc9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICBsb2dFcnJvcihzZXZlcml0eSwgc3ViRXJyb3JzWzBdKTtcbiAgICAgIHJldHVybjtcbiAgICAgfVxuICAgIGxldCBsYWJlbDtcbiAgICBpZiggc3ViRXJyb3JzLmxlbmd0aD09PSAgMSkge1xuICAgICAgbGFiZWw9ICAgYE5lc3RlZCBlcnJvcmA7XG4gICAgIH1lbHNlIHtcbiAgICAgIGxhYmVsPSAgIGBOZXN0ZWQgJHtzdWJFcnJvcnMubGVuZ3RofSBlcnJvcnNgO1xuICAgICB9XG4gICAgaWYoIG9wdFRhZyE9PSAgdW5kZWZpbmVkKSB7XG4gICAgICBsYWJlbD0gICBgJHtsYWJlbH0gdW5kZXIgJHtvcHRUYWd9YDtcbiAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgYmFzZUNvbnNvbGUuZ3JvdXAobGFiZWwpO1xuICAgIHRyeSB7XG4gICAgICBmb3IoIGNvbnN0IHN1YkVycm9yIG9mIHN1YkVycm9ycykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgbG9nRXJyb3Ioc2V2ZXJpdHksIHN1YkVycm9yKTtcbiAgICAgICB9XG4gICAgIH1maW5hbGx5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBiYXNlQ29uc29sZS5ncm91cEVuZCgpO1xuICAgICB9XG4gICB9O1xuXG4gIGNvbnN0IGVycm9yc0xvZ2dlZD0gIG5ldyBXZWFrU2V0KCk7XG5cbiAgLyoqIEB0eXBlIHsoc2V2ZXJpdHk6IExvZ1NldmVyaXR5KSA9PiBOb3RlQ2FsbGJhY2t9ICovXG4gIGNvbnN0IG1ha2VOb3RlQ2FsbGJhY2s9ICAoc2V2ZXJpdHkpPT4oZXJyb3IsIG5vdGVMb2dBcmdzKT0+ICB7XG4gICAgY29uc3Qgc3ViRXJyb3JzPSAgW107XG4gICAgLy8gQW5ub3RhdGlvbiBhcnJpdmVkIGFmdGVyIHRoZSBlcnJvciBoYXMgYWxyZWFkeSBiZWVuIGxvZ2dlZCxcbiAgICAvLyBzbyBqdXN0IGxvZyB0aGUgYW5ub3RhdGlvbiBpbW1lZGlhdGVseSwgcmF0aGVyIHRoYW4gcmVtZW1iZXJpbmcgaXQuXG4gICAgbG9nRXJyb3JJbmZvKHNldmVyaXR5LCBlcnJvciwgRXJyb3JJbmZvLk5PVEUsIG5vdGVMb2dBcmdzLCBzdWJFcnJvcnMpO1xuICAgIGxvZ1N1YkVycm9ycyhzZXZlcml0eSwgc3ViRXJyb3JzLCB0YWdFcnJvcihlcnJvcikpO1xuICAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtMb2dTZXZlcml0eX0gc2V2ZXJpdHlcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICovXG4gIGNvbnN0IGxvZ0Vycm9yPSAgKHNldmVyaXR5LCBlcnJvcik9PiAge1xuICAgIGlmKCB3ZWFrc2V0SGFzKGVycm9yc0xvZ2dlZCwgZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cbiAgICBjb25zdCBlcnJvclRhZz0gIHRhZ0Vycm9yKGVycm9yKTtcbiAgICB3ZWFrc2V0QWRkKGVycm9yc0xvZ2dlZCwgZXJyb3IpO1xuICAgIGNvbnN0IHN1YkVycm9ycz0gIFtdO1xuICAgIGNvbnN0IG1lc3NhZ2VMb2dBcmdzPSAgdGFrZU1lc3NhZ2VMb2dBcmdzKGVycm9yKTtcbiAgICBjb25zdCBub3RlTG9nQXJnc0FycmF5PSAgdGFrZU5vdGVMb2dBcmdzQXJyYXkoXG4gICAgICBlcnJvcixcbiAgICAgIG1ha2VOb3RlQ2FsbGJhY2soc2V2ZXJpdHkpKTtcblxuICAgIC8vIFNob3cgdGhlIGVycm9yJ3MgbW9zdCBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlXG4gICAgaWYoIG1lc3NhZ2VMb2dBcmdzPT09ICB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lc3NhZ2UgbG9nIGFyZ3MsIHRoZW4ganVzdCBzaG93IHRoZSBtZXNzYWdlIHRoYXRcbiAgICAgIC8vIHRoZSBlcnJvciBpdHNlbGYgY2Fycmllcy5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBiYXNlQ29uc29sZVtzZXZlcml0eV0oIGAke2Vycm9yVGFnfTpgLGVycm9yLm1lc3NhZ2UpO1xuICAgICB9ZWxzZSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBvbmUsIHdlIHRha2UgaXQgdG8gYmUgc3RyaWN0bHkgbW9yZSBpbmZvcm1hdGl2ZSB0aGFuIHRoZVxuICAgICAgLy8gbWVzc2FnZSBzdHJpbmcgY2FycmllZCBieSB0aGUgZXJyb3IsIHNvIHNob3cgaXQgKmluc3RlYWQqLlxuICAgICAgbG9nRXJyb3JJbmZvKFxuICAgICAgICBzZXZlcml0eSxcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIEVycm9ySW5mby5NRVNTQUdFLFxuICAgICAgICBtZXNzYWdlTG9nQXJncyxcbiAgICAgICAgc3ViRXJyb3JzKTtcblxuICAgICB9XG4gICAgLy8gQWZ0ZXIgdGhlIG1lc3NhZ2UgYnV0IGJlZm9yZSBhbnkgb3RoZXIgYW5ub3RhdGlvbnMsIHNob3cgdGhlIHN0YWNrLlxuICAgIGxldCBzdGFja1N0cmluZz0gIGdldFN0YWNrU3RyaW5nKGVycm9yKTtcbiAgICBpZihcbiAgICAgIHR5cGVvZiBzdGFja1N0cmluZz09PSAgJ3N0cmluZycmJlxuICAgICAgc3RhY2tTdHJpbmcubGVuZ3RoPj0gIDEmJlxuICAgICAgIXN0cmluZ0VuZHNXaXRoKHN0YWNrU3RyaW5nLCAnXFxuJykpXG4gICAgICB7XG4gICAgICBzdGFja1N0cmluZys9ICAnXFxuJztcbiAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgYmFzZUNvbnNvbGVbc2V2ZXJpdHldKHN0YWNrU3RyaW5nKTtcbiAgICAvLyBTaG93IHRoZSBvdGhlciBhbm5vdGF0aW9ucyBvbiBlcnJvclxuICAgIGZvciggY29uc3Qgbm90ZUxvZ0FyZ3Mgb2Ygbm90ZUxvZ0FyZ3NBcnJheSkge1xuICAgICAgbG9nRXJyb3JJbmZvKHNldmVyaXR5LCBlcnJvciwgRXJyb3JJbmZvLk5PVEUsIG5vdGVMb2dBcmdzLCBzdWJFcnJvcnMpO1xuICAgICB9XG4gICAgLy8gZXhwbGFpbiBhbGwgdGhlIGVycm9ycyBzZWVuIGluIHRoZSBtZXNzYWdlcyBhbHJlYWR5IGVtaXR0ZWQuXG4gICAgbG9nU3ViRXJyb3JzKHNldmVyaXR5LCBzdWJFcnJvcnMsIGVycm9yVGFnKTtcbiAgIH07XG5cbiAgY29uc3QgbGV2ZWxNZXRob2RzPSAgYXJyYXlNYXAoY29uc29sZUxldmVsTWV0aG9kcywgKFtsZXZlbCwgX10pPT4gIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gey4uLmFueX0gbG9nQXJnc1xuICAgICAqL1xuICAgIGNvbnN0IGxldmVsTWV0aG9kPSAgKC4uLmxvZ0FyZ3MpPT4gIHtcbiAgICAgIGNvbnN0IHN1YkVycm9ycz0gIFtdO1xuICAgICAgY29uc3QgYXJnVGFncz0gIGV4dHJhY3RFcnJvckFyZ3MobG9nQXJncywgc3ViRXJyb3JzKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBiYXNlQ29uc29sZVtsZXZlbF0oLi4uYXJnVGFncyk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIENvbnNvbGVQcm9wIHZzIExvZ1NldmVyaXR5IG1pc21hdGNoXG4gICAgICBsb2dTdWJFcnJvcnMobGV2ZWwsIHN1YkVycm9ycyk7XG4gICAgIH07XG4gICAgZGVmaW5lUHJvcGVydHkobGV2ZWxNZXRob2QsICduYW1lJywgeyB2YWx1ZTogbGV2ZWx9KTtcbiAgICByZXR1cm4gW2xldmVsLCBmcmVlemUobGV2ZWxNZXRob2QpXTtcbiAgIH0pO1xuICBjb25zdCBvdGhlck1ldGhvZE5hbWVzPSAgYXJyYXlGaWx0ZXIoXG4gICAgY29uc29sZU90aGVyTWV0aG9kcyxcbiAgICAoW25hbWUsIF9dKT0+ICBuYW1lIGluIGJhc2VDb25zb2xlKTtcblxuICBjb25zdCBvdGhlck1ldGhvZHM9ICBhcnJheU1hcChvdGhlck1ldGhvZE5hbWVzLCAoW25hbWUsIF9dKT0+ICB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICAgKi9cbiAgICBjb25zdCBvdGhlck1ldGhvZD0gICguLi5hcmdzKT0+ICB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgYmFzZUNvbnNvbGVbbmFtZV0oLi4uYXJncyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICB9O1xuICAgIGRlZmluZVByb3BlcnR5KG90aGVyTWV0aG9kLCAnbmFtZScsIHsgdmFsdWU6IG5hbWV9KTtcbiAgICByZXR1cm4gW25hbWUsIGZyZWV6ZShvdGhlck1ldGhvZCldO1xuICAgfSk7XG5cbiAgY29uc3QgY2F1c2FsQ29uc29sZT0gIGZyb21FbnRyaWVzKFsuLi5sZXZlbE1ldGhvZHMsIC4uLm90aGVyTWV0aG9kc10pO1xuICByZXR1cm4gKC8qKiBAdHlwZSB7VmlydHVhbENvbnNvbGV9ICovIGZyZWV6ZShjYXVzYWxDb25zb2xlKSk7XG4gfTskaOKAjV9vbmNlLm1ha2VDYXVzYWxDb25zb2xlKG1ha2VDYXVzYWxDb25zb2xlKTtcbmZyZWV6ZShtYWtlQ2F1c2FsQ29uc29sZSk7XG5cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqIEB0eXBlIHtGaWx0ZXJDb25zb2xlfSAqL1xuY29uc3QgZmlsdGVyQ29uc29sZT0gIChiYXNlQ29uc29sZSwgZmlsdGVyLCBfdG9waWM9ICB1bmRlZmluZWQpPT4gIHtcbiAgLy8gVE9ETyBkbyBzb21ldGhpbmcgd2l0aCBvcHRpb25hbCB0b3BpYyBzdHJpbmdcbiAgY29uc3Qgd2hpdGVsaXN0PSAgYXJyYXlGaWx0ZXIoXG4gICAgY29uc29sZVdoaXRlbGlzdCxcbiAgICAoW25hbWUsIF9dKT0+ICBuYW1lIGluIGJhc2VDb25zb2xlKTtcblxuICBjb25zdCBtZXRob2RzPSAgYXJyYXlNYXAod2hpdGVsaXN0LCAoW25hbWUsIHNldmVyaXR5XSk9PiAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gICAgICovXG4gICAgY29uc3QgbWV0aG9kPSAgKC4uLmFyZ3MpPT4gIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBpZiggc2V2ZXJpdHk9PT0gIHVuZGVmaW5lZHx8ICBmaWx0ZXIuY2FuTG9nKHNldmVyaXR5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICAgIGJhc2VDb25zb2xlW25hbWVdKC4uLmFyZ3MpO1xuICAgICAgIH1cbiAgICAgfTtcbiAgICByZXR1cm4gW25hbWUsIGZyZWV6ZShtZXRob2QpXTtcbiAgIH0pO1xuICBjb25zdCBmaWx0ZXJpbmdDb25zb2xlPSAgZnJvbUVudHJpZXMobWV0aG9kcyk7XG4gIHJldHVybiAoLyoqIEB0eXBlIHtWaXJ0dWFsQ29uc29sZX0gKi8gZnJlZXplKGZpbHRlcmluZ0NvbnNvbGUpKTtcbiB9OyRo4oCNX29uY2UuZmlsdGVyQ29uc29sZShmaWx0ZXJDb25zb2xlKTtcbmZyZWV6ZShmaWx0ZXJDb25zb2xlKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMjhdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmluYWxpemF0aW9uUmVnaXN0cnksTWFwLG1hcEdldCxtYXBEZWxldGUsV2Vha01hcCxtYXBTZXQsZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3Rlcix3ZWFrbWFwU2V0LHdlYWttYXBHZXQsbWFwRW50cmllcyxtYXBIYXM7JGjigI1faW1wb3J0cyhbW1wiLi4vY29tbW9ucy5qc1wiLCBbW1wiRmluYWxpemF0aW9uUmVnaXN0cnlcIiwgWyRo4oCNX2EgPT4gKEZpbmFsaXphdGlvblJlZ2lzdHJ5ID0gJGjigI1fYSldXSxbXCJNYXBcIiwgWyRo4oCNX2EgPT4gKE1hcCA9ICRo4oCNX2EpXV0sW1wibWFwR2V0XCIsIFskaOKAjV9hID0+IChtYXBHZXQgPSAkaOKAjV9hKV1dLFtcIm1hcERlbGV0ZVwiLCBbJGjigI1fYSA9PiAobWFwRGVsZXRlID0gJGjigI1fYSldXSxbXCJXZWFrTWFwXCIsIFskaOKAjV9hID0+IChXZWFrTWFwID0gJGjigI1fYSldXSxbXCJtYXBTZXRcIiwgWyRo4oCNX2EgPT4gKG1hcFNldCA9ICRo4oCNX2EpXV0sW1wiZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3RlclwiLCBbJGjigI1fYSA9PiAoZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3RlciA9ICRo4oCNX2EpXV0sW1wid2Vha21hcFNldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcFNldCA9ICRo4oCNX2EpXV0sW1wid2Vha21hcEdldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcEdldCA9ICRo4oCNX2EpXV0sW1wibWFwRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibWFwSGFzXCIsIFskaOKAjV9hID0+IChtYXBIYXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIENyZWF0ZSByZWplY3Rpb24tdHJhY2tpbmcgbWFjaGluZXJ5IGNvbXBhdGlibGUgd2l0aCBOb2RlLmpzIGFuZCBicm93c2Vycy5cbiAqXG4gKiBOb3RlIHRoYXQgbW9kZXJuIGJyb3dzZXJzICpwcmV2ZW50KiBhY2Nlc3MgdG8gdGhlICd1bmhhbmRsZWRyZWplY3Rpb24nIGFuZFxuICogJ3JlamVjdGlvbmhhbmRsZWQnIGV2ZW50cyBuZWVkZWQ6XG4gKiAtIGluIGNyb3NzLW9yaWdpbiBtb2RlLCBsaWtlIHdoZW4gc2VydmVkIGZyb20gZmlsZTovL1xuICogLSBpbiB0aGUgYnJvd3NlciBjb25zb2xlIChpbnRlcmFjdGl2ZWx5IHR5cGVkLWluIGNvZGUpXG4gKiAtIGluIHRoZSBkZWJ1Z2dlclxuICpcbiAqIFRoZW4sIHRoZXkganVzdCBsb29rIGxpa2U6IGBVbmNhdWdodCAoaW4gcHJvbWlzZSkgRXJyb3I6IC4uLmAgYW5kIGRvbid0XG4gKiBpbXBsZW1lbnQgdGhlIG1hY2hpbmVyeS5cbiAqXG4gKiBUaGUgc29sdXRpb24gaXMgdG8gc2VydmUgeW91ciB3ZWIgcGFnZSBmcm9tIGFuIGh0dHA6Ly8gb3IgaHR0cHM6Ly8gd2ViIHNlcnZlclxuICogYW5kIGV4ZWN1dGUgYWN0dWFsIGNvZGUuXG4gKlxuICogQHBhcmFtIHsocmVhc29uOiB1bmtub3duKSA9PiB2b2lkfSByZXBvcnRSZWFzb24gcmVwb3J0IHRoZSByZWFzb24gZm9yIGFuXG4gKiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICovXG5jb25zdCAgICAgICAgbWFrZVJlamVjdGlvbkhhbmRsZXJzPSAgKHJlcG9ydFJlYXNvbik9PntcbiAgaWYoIEZpbmFsaXphdGlvblJlZ2lzdHJ5PT09ICB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgfVxuXG4gIC8qKiBAdHlwZWRlZiB7bnVtYmVyfSBSZWFzb25JZCAqL1xuICBsZXQgbGFzdFJlYXNvbklkPSAgMDtcblxuICAvKiogQHR5cGUge01hcDxSZWFzb25JZCwgdW5rbm93bj59ICovXG4gIGNvbnN0IGlkVG9SZWFzb249ICBuZXcgTWFwKCk7XG5cbiAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gIGxldCBjYW5jZWxDaGVja2luZztcblxuICBjb25zdCByZW1vdmVSZWFzb25JZD0gIChyZWFzb25JZCk9PntcbiAgICBtYXBEZWxldGUoaWRUb1JlYXNvbiwgcmVhc29uSWQpO1xuICAgIGlmKCBjYW5jZWxDaGVja2luZyYmICBpZFRvUmVhc29uLnNpemU9PT0gIDApIHtcbiAgICAgIC8vIE5vIG1vcmUgdW5oYW5kbGVkIHJlamVjdGlvbnMgdG8gY2hlY2ssIGp1c3QgY2FuY2VsIHRoZSBjaGVjay5cbiAgICAgIGNhbmNlbENoZWNraW5nKCk7XG4gICAgICBjYW5jZWxDaGVja2luZz0gIHVuZGVmaW5lZDtcbiAgICAgfVxuICAgfTtcblxuICAvKiogQHR5cGUge1dlYWtNYXA8UHJvbWlzZSwgUmVhc29uSWQ+fSAqL1xuICBjb25zdCBwcm9taXNlVG9SZWFzb25JZD0gIG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGFuZCByZXBvcnQgdGhlIHJlYXNvbiBmb3IgYSBHQ2VkIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhc29uSWR9IGhlbGRSZWFzb25JZFxuICAgKi9cbiAgY29uc3QgZmluYWxpemVEcm9wcGVkUHJvbWlzZT0gIChoZWxkUmVhc29uSWQpPT57XG4gICAgaWYoIG1hcEhhcyhpZFRvUmVhc29uLCBoZWxkUmVhc29uSWQpKSB7XG4gICAgICBjb25zdCByZWFzb249ICBtYXBHZXQoaWRUb1JlYXNvbiwgaGVsZFJlYXNvbklkKTtcbiAgICAgIHJlbW92ZVJlYXNvbklkKGhlbGRSZWFzb25JZCk7XG4gICAgICByZXBvcnRSZWFzb24ocmVhc29uKTtcbiAgICAgfVxuICAgfTtcblxuICAvKiogQHR5cGUge0ZpbmFsaXphdGlvblJlZ2lzdHJ5PFJlYXNvbklkPn0gKi9cbiAgY29uc3QgcHJvbWlzZVRvUmVhc29uPSAgbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KGZpbmFsaXplRHJvcHBlZFByb21pc2UpO1xuXG4gIC8qKlxuICAgKiBUcmFjayBhIHJlamVjdGVkIHByb21pc2UgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHJlYXNvbiBpZiB0aGVyZSBpcyBub1xuICAgKiByZWplY3Rpb24gaGFuZGxlciBzeW5jaHJvbm91c2x5IGF0dGFjaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3Vua25vd259IHJlYXNvblxuICAgKiBAcGFyYW0ge1Byb21pc2V9IHByXG4gICAqL1xuICBjb25zdCB1bmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyPSAgKHJlYXNvbiwgcHIpPT4gIHtcbiAgICBsYXN0UmVhc29uSWQrPSAgMTtcbiAgICBjb25zdCByZWFzb25JZD0gIGxhc3RSZWFzb25JZDtcblxuICAgIC8vIFVwZGF0ZSBib29ra2VlcGluZy5cbiAgICBtYXBTZXQoaWRUb1JlYXNvbiwgcmVhc29uSWQsIHJlYXNvbik7XG4gICAgd2Vha21hcFNldChwcm9taXNlVG9SZWFzb25JZCwgcHIsIHJlYXNvbklkKTtcbiAgICBmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyKHByb21pc2VUb1JlYXNvbiwgcHIsIHJlYXNvbklkLCBwcik7XG4gICB9O1xuXG4gIC8qKlxuICAgKiBEZWFsIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgaGFuZGxlciB0byBhIHByZXZpb3VzbHkgcmVqZWN0ZWQgcHJvbWlzZS5cbiAgICpcbiAgICogSnVzdCByZW1vdmUgaXQgZnJvbSBvdXIgbGlzdC4gIExldCB0aGUgRmluYWxpemF0aW9uUmVnaXN0cnkgb3JcbiAgICogcHJvY2Vzc1Rlcm1pbmF0aW9uIHJlcG9ydCBhbnkgR0NlZCB1bmhhbmRsZWQgcmVqZWN0ZWQgcHJvbWlzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJcbiAgICovXG4gIGNvbnN0IHJlamVjdGlvbkhhbmRsZWRIYW5kbGVyPSAgKHByKT0+e1xuICAgIGNvbnN0IHJlYXNvbklkPSAgd2Vha21hcEdldChwcm9taXNlVG9SZWFzb25JZCwgcHIpO1xuICAgIHJlbW92ZVJlYXNvbklkKHJlYXNvbklkKTtcbiAgIH07XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBhbGwgdGhlIHVuaGFuZGxlZCByZWplY3Rpb25zLCBub3cgdGhhdCB3ZSBhcmUgYWJydXB0bHkgdGVybWluYXRpbmdcbiAgICogdGhlIGFnZW50IGNsdXN0ZXIuXG4gICAqL1xuICBjb25zdCBwcm9jZXNzVGVybWluYXRpb25IYW5kbGVyPSAgKCk9PiAge1xuICAgIGZvciggY29uc3QgW3JlYXNvbklkLCByZWFzb25db2YgIG1hcEVudHJpZXMoaWRUb1JlYXNvbikpIHtcbiAgICAgIHJlbW92ZVJlYXNvbklkKHJlYXNvbklkKTtcbiAgICAgIHJlcG9ydFJlYXNvbihyZWFzb24pO1xuICAgICB9XG4gICB9O1xuXG4gIHJldHVybiB7XG4gICAgcmVqZWN0aW9uSGFuZGxlZEhhbmRsZXIsXG4gICAgdW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcixcbiAgICBwcm9jZXNzVGVybWluYXRpb25IYW5kbGVyfTtcblxuIH07JGjigI1fb25jZS5tYWtlUmVqZWN0aW9uSGFuZGxlcnMobWFrZVJlamVjdGlvbkhhbmRsZXJzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMjldID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgVHlwZUVycm9yLGdsb2JhbFRoaXMsZGVmYXVsdEhhbmRsZXIsbWFrZUNhdXNhbENvbnNvbGUsbWFrZVJlamVjdGlvbkhhbmRsZXJzOyRo4oCNX2ltcG9ydHMoW1tcIi4uL2NvbW1vbnMuanNcIiwgW1tcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJnbG9iYWxUaGlzXCIsIFskaOKAjV9hID0+IChnbG9iYWxUaGlzID0gJGjigI1fYSldXV1dLFtcIi4vYXNzZXJ0LmpzXCIsIFtbXCJsb2dnZWRFcnJvckhhbmRsZXJcIiwgWyRo4oCNX2EgPT4gKGRlZmF1bHRIYW5kbGVyID0gJGjigI1fYSldXV1dLFtcIi4vY29uc29sZS5qc1wiLCBbW1wibWFrZUNhdXNhbENvbnNvbGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VDYXVzYWxDb25zb2xlID0gJGjigI1fYSldXV1dLFtcIi4vdW5oYW5kbGVkLXJlamVjdGlvbi5qc1wiLCBbW1wibWFrZVJlamVjdGlvbkhhbmRsZXJzXCIsIFskaOKAjV9hID0+IChtYWtlUmVqZWN0aW9uSGFuZGxlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG5jb25zdCBvcmlnaW5hbENvbnNvbGU9ICBjb25zb2xlO1xuXG4vKipcbiAqIFdyYXAgY29uc29sZSB1bmxlc3Mgc3VwcHJlc3NlZC5cbiAqIEF0IHRoZSBtb21lbnQsIHRoZSBjb25zb2xlIGlzIGNvbnNpZGVyZWQgYSBob3N0IHBvd2VyIGluIHRoZSBzdGFydFxuICogY29tcGFydG1lbnQsIGFuZCBub3QgYSBwcmltb3JkaWFsLiBIZW5jZSBpdCBpcyBhYnNlbnQgZnJvbSB0aGUgd2hpbGVsaXN0XG4gKiBhbmQgYnlwYXNzZXMgdGhlIGludHJpbnNpY3NDb2xsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtcInNhZmVcIiB8IFwidW5zYWZlXCJ9IGNvbnNvbGVUYW1pbmdcbiAqIEBwYXJhbSB7XCJwbGF0Zm9ybVwiIHwgXCJleGl0XCIgfCBcImFib3J0XCIgfCBcInJlcG9ydFwiIHwgXCJub25lXCJ9IFtlcnJvclRyYXBwaW5nXVxuICogQHBhcmFtIHtcInJlcG9ydFwiIHwgXCJub25lXCJ9IFt1bmhhbmRsZWRSZWplY3Rpb25UcmFwcGluZ11cbiAqIEBwYXJhbSB7R2V0U3RhY2tTdHJpbmc9fSBvcHRHZXRTdGFja1N0cmluZ1xuICovXG5jb25zdCAgICAgICAgdGFtZUNvbnNvbGU9ICAoXG4gIGNvbnNvbGVUYW1pbmc9ICAnc2FmZScsXG4gIGVycm9yVHJhcHBpbmc9ICAncGxhdGZvcm0nLFxuICB1bmhhbmRsZWRSZWplY3Rpb25UcmFwcGluZz0gICdyZXBvcnQnLFxuICBvcHRHZXRTdGFja1N0cmluZz0gIHVuZGVmaW5lZCk9PlxuICAgICB7XG4gIGlmKCBjb25zb2xlVGFtaW5nIT09ICAnc2FmZScmJiAgY29uc29sZVRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIGNvbnNvbGVUYW1pbmcgJHtjb25zb2xlVGFtaW5nfWApO1xuICAgfVxuXG4gIGxldCBsb2dnZWRFcnJvckhhbmRsZXI7XG4gIGlmKCBvcHRHZXRTdGFja1N0cmluZz09PSAgdW5kZWZpbmVkKSB7XG4gICAgbG9nZ2VkRXJyb3JIYW5kbGVyPSAgZGVmYXVsdEhhbmRsZXI7XG4gICB9ZWxzZSB7XG4gICAgbG9nZ2VkRXJyb3JIYW5kbGVyPSAge1xuICAgICAgLi4uZGVmYXVsdEhhbmRsZXIsXG4gICAgICBnZXRTdGFja1N0cmluZzogb3B0R2V0U3RhY2tTdHJpbmd9O1xuXG4gICB9XG4gIGNvbnN0IG91ckNvbnNvbGU9XG4gICAgY29uc29sZVRhbWluZz09PSAgJ3Vuc2FmZSc/XG4gICAgICAgIG9yaWdpbmFsQ29uc29sZTpcbiAgICAgICAgbWFrZUNhdXNhbENvbnNvbGUob3JpZ2luYWxDb25zb2xlLCBsb2dnZWRFcnJvckhhbmRsZXIpO1xuXG4gIC8vIEF0dGFjaCBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvciB0cmFwcyBzdWNoIHRoYXQgYW55IGVycm9yIHRoYXQgZ2V0cyB0aHJvd25cbiAgLy8gYXQgdG9wLW9mLXR1cm4gKHRoZSBib3R0b20gb2Ygc3RhY2spIHdpbGwgZ2V0IGxvZ2dlZCBieSBvdXIgY2F1c2FsXG4gIC8vIGNvbnNvbGUsIHJldmVhbGluZyB0aGUgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLFxuICAvLyBpbmNsdWRpbmcgdGhlIHN0YWNrIGZyb20gd2hlbiB0aGUgZXJyb3Igd2FzIGNyZWF0ZWQuXG5cbiAgLy8gSW4gdGhlIGZvbGxvd2luZyBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlciBjYXNlcywgYHByb2Nlc3NgIGFuZCBgd2luZG93YCBhcmVcbiAgLy8gc3BlbGxlZCBhcyBgZ2xvYmFsVGhpc2AgcHJvcGVydGllcyB0byBhdm9pZCB0aGUgb3ZlcndlYW5pbmcgZ2F6ZSBvZlxuICAvLyBQYXJjZWwsIHdoaWNoIGR1dGlmdWxseSBpbnN0YWxscyBhbiB1bm5lY2Vzc2FyeSBgcHJvY2Vzc2Agc2hpbSBpZiB3ZSBldmVyXG4gIC8vIHV0dGVyIHRoYXQuIFRoYXQgdW5uZWNlc3Nhcnkgc2hpbSBmb3JjZXMgdGhlIHdob2xlIGJ1bmRsZSBpbnRvIHNsb3BweSBtb2RlLFxuICAvLyB3aGljaCBpbiB0dXJuIGJyZWFrcyBTRVMncyBzdHJpY3QgbW9kZSBpbnZhcmlhbnQuXG5cbiAgLy8gRGlzYWJsZSB0aGUgcG9seW1vcnBoaWMgY2hlY2sgZm9yIHRoZSByZXN0IG9mIHRoaXMgZmlsZS4gIEl0J3MgdG9vIG5vaXN5XG4gIC8vIHdoZW4gZGVhbGluZyB3aXRoIHBsYXRmb3JtIEFQSXMuXG4gIC8qIGVzbGludC1kaXNhYmxlIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwgKi9cblxuICAvLyBOb2RlLmpzXG4gIGlmKCBlcnJvclRyYXBwaW5nIT09ICAnbm9uZScmJiAgZ2xvYmFsVGhpcy5wcm9jZXNzIT09ICB1bmRlZmluZWQpIHtcbiAgICBnbG9iYWxUaGlzLnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycm9yKT0+e1xuICAgICAgLy8gY2F1c2FsQ29uc29sZSBpcyBib3JuIGZyb3plbiBzbyBub3QgdnVsbmVyYWJsZSB0byBtZXRob2QgdGFtcGVyaW5nLlxuICAgICAgb3VyQ29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICBpZiggZXJyb3JUcmFwcGluZz09PSAgJ3BsYXRmb3JtJ3x8ICBlcnJvclRyYXBwaW5nPT09ICAnZXhpdCcpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXQoZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXRDb2RlfHwgIC0xKTtcbiAgICAgICB9ZWxzZSBpZiggZXJyb3JUcmFwcGluZz09PSAgJ2Fib3J0Jykge1xuICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MuYWJvcnQoKTtcbiAgICAgICB9XG4gICAgIH0pO1xuICAgfVxuXG4gIGlmKFxuICAgIHVuaGFuZGxlZFJlamVjdGlvblRyYXBwaW5nIT09ICAnbm9uZScmJlxuICAgIGdsb2JhbFRoaXMucHJvY2VzcyE9PSAgdW5kZWZpbmVkKVxuICAgIHtcbiAgICBjb25zdCBoYW5kbGVSZWplY3Rpb249ICAocmVhc29uKT0+e1xuICAgICAgLy8gJ3BsYXRmb3JtJyBhbmQgJ3JlcG9ydCcganVzdCBsb2cgdGhlIHJlYXNvbi5cbiAgICAgIG91ckNvbnNvbGUuZXJyb3IoJ1NFU19VTkhBTkRMRURfUkVKRUNUSU9OOicsIHJlYXNvbik7XG4gICAgIH07XG4gICAgLy8gTWF5YmUgdHJhY2sgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9ucy5cbiAgICBjb25zdCBoPSAgbWFrZVJlamVjdGlvbkhhbmRsZXJzKGhhbmRsZVJlamVjdGlvbik7XG4gICAgaWYoIGgpIHtcbiAgICAgIC8vIFJlamVjdGlvbiBoYW5kbGVycyBhcmUgc3VwcG9ydGVkLlxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCBoLnVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIpO1xuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLm9uKCdyZWplY3Rpb25IYW5kbGVkJywgaC5yZWplY3Rpb25IYW5kbGVkSGFuZGxlcik7XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3Mub24oJ2V4aXQnLCBoLnByb2Nlc3NUZXJtaW5hdGlvbkhhbmRsZXIpO1xuICAgICB9XG4gICB9XG5cbiAgLy8gQnJvd3NlclxuICBpZihcbiAgICBlcnJvclRyYXBwaW5nIT09ICAnbm9uZScmJlxuICAgIGdsb2JhbFRoaXMud2luZG93IT09ICB1bmRlZmluZWQmJlxuICAgIGdsb2JhbFRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIhPT0gIHVuZGVmaW5lZClcbiAgICB7XG4gICAgZ2xvYmFsVGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpPT57XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgLy8gJ3BsYXRmb3JtJyBhbmQgJ3JlcG9ydCcganVzdCBsb2cgdGhlIHJlYXNvbi5cbiAgICAgIG91ckNvbnNvbGUuZXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgaWYoIGVycm9yVHJhcHBpbmc9PT0gICdleGl0J3x8ICBlcnJvclRyYXBwaW5nPT09ICAnYWJvcnQnKSB7XG4gICAgICAgIGdsb2JhbFRoaXMud2luZG93LmxvY2F0aW9uLmhyZWY9ICAgYGFib3V0OmJsYW5rYDtcbiAgICAgICB9XG4gICAgIH0pO1xuICAgfVxuXG4gIGlmKFxuICAgIHVuaGFuZGxlZFJlamVjdGlvblRyYXBwaW5nIT09ICAnbm9uZScmJlxuICAgIGdsb2JhbFRoaXMud2luZG93IT09ICB1bmRlZmluZWQmJlxuICAgIGdsb2JhbFRoaXMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIhPT0gIHVuZGVmaW5lZClcbiAgICB7XG4gICAgY29uc3QgaGFuZGxlUmVqZWN0aW9uPSAgKHJlYXNvbik9PntcbiAgICAgIG91ckNvbnNvbGUuZXJyb3IoJ1NFU19VTkhBTkRMRURfUkVKRUNUSU9OOicsIHJlYXNvbik7XG4gICAgIH07XG5cbiAgICBjb25zdCBoPSAgbWFrZVJlamVjdGlvbkhhbmRsZXJzKGhhbmRsZVJlamVjdGlvbik7XG4gICAgaWYoIGgpIHtcbiAgICAgIC8vIFJlamVjdGlvbiBoYW5kbGVycyBhcmUgc3VwcG9ydGVkLlxuICAgICAgZ2xvYmFsVGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgKGV2ZW50KT0+e1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBoLnVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIoZXZlbnQucmVhc29uLCBldmVudC5wcm9taXNlKTtcbiAgICAgICB9KTtcblxuICAgICAgZ2xvYmFsVGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVqZWN0aW9uaGFuZGxlZCcsIChldmVudCk9PntcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaC5yZWplY3Rpb25IYW5kbGVkSGFuZGxlcihldmVudC5wcm9taXNlKTtcbiAgICAgICB9KTtcblxuICAgICAgZ2xvYmFsVGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgKF9ldmVudCk9PntcbiAgICAgICAgaC5wcm9jZXNzVGVybWluYXRpb25IYW5kbGVyKCk7XG4gICAgICAgfSk7XG4gICAgIH1cbiAgIH1cbiAgLyogZXNsaW50LWVuYWJsZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsICovXG5cbiAgcmV0dXJuIHsgY29uc29sZTogb3VyQ29uc29sZX07XG4gfTskaOKAjV9vbmNlLnRhbWVDb25zb2xlKHRhbWVDb25zb2xlKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzBdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgV2Vha01hcCxXZWFrU2V0LGFwcGx5LGFycmF5RmlsdGVyLGFycmF5Sm9pbixhcnJheU1hcCxhcnJheVNsaWNlLGNyZWF0ZSxkZWZpbmVQcm9wZXJ0aWVzLGZyb21FbnRyaWVzLHJlZmxlY3RTZXQscmVnZXhwRXhlYyxyZWdleHBUZXN0LHdlYWttYXBHZXQsd2Vha21hcFNldCx3ZWFrc2V0QWRkLHdlYWtzZXRIYXM7JGjigI1faW1wb3J0cyhbW1wiLi4vY29tbW9ucy5qc1wiLCBbW1wiV2Vha01hcFwiLCBbJGjigI1fYSA9PiAoV2Vha01hcCA9ICRo4oCNX2EpXV0sW1wiV2Vha1NldFwiLCBbJGjigI1fYSA9PiAoV2Vha1NldCA9ICRo4oCNX2EpXV0sW1wiYXBwbHlcIiwgWyRo4oCNX2EgPT4gKGFwcGx5ID0gJGjigI1fYSldXSxbXCJhcnJheUZpbHRlclwiLCBbJGjigI1fYSA9PiAoYXJyYXlGaWx0ZXIgPSAkaOKAjV9hKV1dLFtcImFycmF5Sm9pblwiLCBbJGjigI1fYSA9PiAoYXJyYXlKb2luID0gJGjigI1fYSldXSxbXCJhcnJheU1hcFwiLCBbJGjigI1fYSA9PiAoYXJyYXlNYXAgPSAkaOKAjV9hKV1dLFtcImFycmF5U2xpY2VcIiwgWyRo4oCNX2EgPT4gKGFycmF5U2xpY2UgPSAkaOKAjV9hKV1dLFtcImNyZWF0ZVwiLCBbJGjigI1fYSA9PiAoY3JlYXRlID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJmcm9tRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcInJlZmxlY3RTZXRcIiwgWyRo4oCNX2EgPT4gKHJlZmxlY3RTZXQgPSAkaOKAjV9hKV1dLFtcInJlZ2V4cEV4ZWNcIiwgWyRo4oCNX2EgPT4gKHJlZ2V4cEV4ZWMgPSAkaOKAjV9hKV1dLFtcInJlZ2V4cFRlc3RcIiwgWyRo4oCNX2EgPT4gKHJlZ2V4cFRlc3QgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBTZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBTZXQgPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRBZGRcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRBZGQgPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRIYXNcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRIYXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gV2hpdGVsaXN0IG5hbWVzIGZyb20gaHR0cHM6Ly92OC5kZXYvZG9jcy9zdGFjay10cmFjZS1hcGlcbi8vIFdoaXRlbGlzdGluZyBvbmx5IHRoZSBuYW1lcyB1c2VkIGJ5IGVycm9yLXN0YWNrLXNoaW0vc3JjL3Y4U3RhY2tGcmFtZXNcbi8vIGNhbGxTaXRlVG9GcmFtZSB0byBzaGltIHRoZSBlcnJvciBzdGFjayBwcm9wb3NhbC5cbmNvbnN0IHNhZmVWOENhbGxTaXRlTWV0aG9kTmFtZXM9ICBbXG4gIC8vIHN1cHByZXNzICdnZXRUaGlzJyBkZWZpbml0ZWx5XG4gICdnZXRUeXBlTmFtZScsXG4gIC8vIHN1cHByZXNzICdnZXRGdW5jdGlvbicgZGVmaW5pdGVseVxuICAnZ2V0RnVuY3Rpb25OYW1lJyxcbiAgJ2dldE1ldGhvZE5hbWUnLFxuICAnZ2V0RmlsZU5hbWUnLFxuICAnZ2V0TGluZU51bWJlcicsXG4gICdnZXRDb2x1bW5OdW1iZXInLFxuICAnZ2V0RXZhbE9yaWdpbicsXG4gICdpc1RvcGxldmVsJyxcbiAgJ2lzRXZhbCcsXG4gICdpc05hdGl2ZScsXG4gICdpc0NvbnN0cnVjdG9yJyxcbiAgJ2lzQXN5bmMnLFxuICAvLyBzdXBwcmVzcyAnaXNQcm9taXNlQWxsJyBmb3Igbm93XG4gIC8vIHN1cHByZXNzICdnZXRQcm9taXNlSW5kZXgnIGZvciBub3dcblxuICAvLyBBZGRpdGlvbmFsIG5hbWVzIGZvdW5kIGJ5IGV4cGVyaW1lbnQsIGFic2VudCBmcm9tXG4gIC8vIGh0dHBzOi8vdjguZGV2L2RvY3Mvc3RhY2stdHJhY2UtYXBpXG4gICdnZXRQb3NpdGlvbicsXG4gICdnZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwnLFxuXG4gICd0b1N0cmluZycgIC8vIFRPRE8gcmVwbGFjZSB0byB1c2Ugb25seSB3aGl0ZWxpc3RlZCBpbmZvXG5dO1xuXG4vLyBUT0RPIHRoaXMgaXMgYSByaWRpY3Vsb3VzbHkgZXhwZW5zaXZlIHdheSB0byBhdHRlbnVhdGUgY2FsbHNpdGVzLlxuLy8gQmVmb3JlIHRoYXQgbWF0dGVycywgd2Ugc2hvdWxkIHN3aXRjaCB0byBhIHJlYXNvbmFibGUgcmVwcmVzZW50YXRpb24uXG5jb25zdCBzYWZlVjhDYWxsU2l0ZUZhY2V0PSAgKGNhbGxTaXRlKT0+e1xuICBjb25zdCBtZXRob2RFbnRyeT0gIChuYW1lKT0+e1xuICAgIGNvbnN0IG1ldGhvZD0gIGNhbGxTaXRlW25hbWVdO1xuICAgIHJldHVybiBbbmFtZSwgKCk9PiAgYXBwbHkobWV0aG9kLCBjYWxsU2l0ZSwgW10pXTtcbiAgIH07XG4gIGNvbnN0IG89ICBmcm9tRW50cmllcyhhcnJheU1hcChzYWZlVjhDYWxsU2l0ZU1ldGhvZE5hbWVzLCBtZXRob2RFbnRyeSkpO1xuICByZXR1cm4gY3JlYXRlKG8sIHt9KTtcbiB9O1xuXG5jb25zdCBzYWZlVjhTU1Q9ICAoc3N0KT0+YXJyYXlNYXAoc3N0LCBzYWZlVjhDYWxsU2l0ZUZhY2V0KTtcblxuLy8gSWYgaXQgaGFzIGAvbm9kZV9tb2R1bGVzL2AgYW55d2hlcmUgaW4gaXQsIG9uIE5vZGUgaXQgaXMgbGlrZWx5XG4vLyB0byBiZSBhIGRlcGVuZGVudCBwYWNrYWdlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UsIGFuZCBzbyB0b1xuLy8gYmUgYW4gaW5mcmFzdHJ1Y3R1cmUgZnJhbWUgdG8gYmUgZHJvcHBlZCBmcm9tIGNvbmNpc2Ugc3RhY2sgdHJhY2VzLlxuY29uc3QgRklMRU5BTUVfTk9ERV9ERVBFTkRFTlRTX0NFTlNPUj0gIC9cXC9ub2RlX21vZHVsZXNcXC8vO1xuXG4vLyBJZiBpdCBiZWdpbnMgd2l0aCBgaW50ZXJuYWwvYCBvciBgbm9kZTppbnRlcm5hbGAgdGhlbiBpdCBpcyBsaWtlbHlcbi8vIHBhcnQgb2YgdGhlIG5vZGUgaW5mcnVzdHJ1Y3RyZSBpdHNlbGYsIHRvIGJlIGRyb3BwZWQgZnJvbSBjb25jaXNlXG4vLyBzdGFjayB0cmFjZXMuXG5jb25zdCBGSUxFTkFNRV9OT0RFX0lOVEVSTkFMU19DRU5TT1I9ICAvXig/Om5vZGU6KT9pbnRlcm5hbFxcLy87XG5cbi8vIEZyYW1lcyB3aXRoaW4gdGhlIGBhc3NlcnQuanNgIHBhY2thZ2Ugc2hvdWxkIGJlIGRyb3BwZWQgZnJvbVxuLy8gY29uY2lzZSBzdGFjayB0cmFjZXMsIGFzIHRoZXNlIGFyZSBqdXN0IHN0ZXBzIHRvd2FyZHMgY3JlYXRpbmcgdGhlXG4vLyBlcnJvciBvYmplY3QgaW4gcXVlc3Rpb24uXG5jb25zdCBGSUxFTkFNRV9BU1NFUlRfQ0VOU09SPSAgL1xcL3BhY2thZ2VzXFwvc2VzXFwvc3JjXFwvZXJyb3JcXC9hc3NlcnQuanMkLztcblxuLy8gRnJhbWVzIHdpdGhpbiB0aGUgYGV2ZW50dWFsLXNlbmRgIHNoaW0gc2hvdWxkIGJlIGRyb3BwZWQgc28gdGhhdCBjb25jaXNlXG4vLyBkZWVwIHN0YWNrcyBvbWl0IHRoZSBpbnRlcm5hbHMgb2YgdGhlIGV2ZW50dWFsLXNlbmRpbmcgbWVjaGFuaXNtIGNhdXNpbmdcbi8vIGFzeW5jaHJvbm91cyBtZXNzYWdlcyB0byBiZSBzZW50LlxuLy8gTm90ZSB0aGF0IHRoZSBldmVudHVhbC1zZW5kIHBhY2thZ2Ugd2lsbCBtb3ZlIGZyb20gYWdvcmljLXNkayB0b1xuLy8gRW5kbywgc28gdGhpcyBydWxlIHdpbGwgYmUgb2YgZ2VuZXJhbCBpbnRlcmVzdC5cbmNvbnN0IEZJTEVOQU1FX0VWRU5UVUFMX1NFTkRfQ0VOU09SPSAgL1xcL3BhY2thZ2VzXFwvZXZlbnR1YWwtc2VuZFxcL3NyY1xcLy87XG5cbi8vIEFueSBzdGFjayBmcmFtZSB3aG9zZSBgZmlsZU5hbWVgIG1hdGNoZXMgYW55IG9mIHRoZXNlIGNlbnNvciBwYXR0ZXJuc1xuLy8gd2lsbCBiZSBvbWl0dGVkIGZyb20gY29uY2lzZSBzdGFja3MuXG4vLyBUT0RPIEVuYWJsZSB1c2VycyB0byBjb25maWd1cmUgRklMRU5BTUVfQ0VOU09SUyB2aWEgYGxvY2tkb3duYCBvcHRpb25zLlxuY29uc3QgRklMRU5BTUVfQ0VOU09SUz0gIFtcbiAgRklMRU5BTUVfTk9ERV9ERVBFTkRFTlRTX0NFTlNPUixcbiAgRklMRU5BTUVfTk9ERV9JTlRFUk5BTFNfQ0VOU09SLFxuICBGSUxFTkFNRV9BU1NFUlRfQ0VOU09SLFxuICBGSUxFTkFNRV9FVkVOVFVBTF9TRU5EX0NFTlNPUl07XG5cblxuLy8gU2hvdWxkIGEgc3RhY2sgZnJhbWUgd2l0aCB0aGlzIGFzIGl0cyBmaWxlTmFtZSBiZSBpbmNsdWRlZCBpbiBhIGNvbmNpc2Vcbi8vIHN0YWNrIHRyYWNlP1xuLy8gRXhwb3J0ZWQgb25seSBzbyBpdCBjYW4gYmUgdW5pdCB0ZXN0ZWQuXG4vLyBUT0RPIE1vdmUgc28gdGhhdCBpdCBhcHBsaWVzIG5vdCBqdXN0IHRvIHY4LlxuY29uc3QgICAgICAgIGZpbHRlckZpbGVOYW1lPSAgKGZpbGVOYW1lKT0+e1xuICBpZiggIWZpbGVOYW1lKSB7XG4gICAgLy8gU3RhY2sgZnJhbWVzIHdpdGggbm8gZmlsZU5hbWUgc2hvdWxkIGFwcGVhciBpbiBjb25jaXNlIHN0YWNrIHRyYWNlcy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgIH1cbiAgZm9yKCBjb25zdCBmaWx0ZXIgb2YgRklMRU5BTUVfQ0VOU09SUykge1xuICAgIGlmKCByZWdleHBUZXN0KGZpbHRlciwgZmlsZU5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgIH1cbiAgIH1cbiAgcmV0dXJuIHRydWU7XG4gfTtcblxuLy8gVGhlIGFkLWhvYyBydWxlIG9mIHRoZSBjdXJyZW50IHBhdHRlcm4gaXMgdGhhdCBhbnkgbGlrZWx5LWZpbGUtcGF0aCBvclxuLy8gbGlrZWx5IHVybC1wYXRoIHByZWZpeCwgZW5kaW5nIGluIGEgYC8uLi4vYCBzaG91bGQgZ2V0IGRyb3BwZWQuXG4vLyBBbnl0aGluZyB0byB0aGUgbGVmdCBvZiB0aGUgbGlrZWx5IHBhdGggdGV4dCBpcyBrZXB0LlxuLy8gRXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgYC8uLi4vYCBpcyBrZXB0LiBUaHVzXG4vLyBgJ09iamVjdC5iYXIgKC92YXQtdjEvLi4uL2V2ZW50dWFsLXNlbmQvdGVzdC90ZXN0LWRlZXAtc2VuZC5qczoxMzoyMSknYFxuLy8gc2ltcGxpZmllcyB0b1xuLy8gYCdPYmplY3QuYmFyIChldmVudHVhbC1zZW5kL3Rlc3QvdGVzdC1kZWVwLXNlbmQuanM6MTM6MjEpJ2AuXG4vL1xuLy8gU2VlIHRocmVhZCBzdGFydGluZyBhdFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yMzI2I2lzc3VlY29tbWVudC03NzMwMjAzODlcbiRo4oCNX29uY2UuZmlsdGVyRmlsZU5hbWUoZmlsdGVyRmlsZU5hbWUpO2NvbnN0IENBTExTSVRFX0VMTElQU0VTX1BBVFRFUk49L14oKD86LipbKCBdKT8pWzovXFx3Xy1dKlxcL1xcLlxcLlxcLlxcLyguKykkLztcblxuLy8gVGhlIGFkLWhvYyBydWxlIG9mIHRoZSBjdXJyZW50IHBhdHRlcm4gaXMgdGhhdCBhbnkgbGlrZWx5LWZpbGUtcGF0aCBvclxuLy8gbGlrZWx5IHVybC1wYXRoIHByZWZpeCwgZW5kaW5nIGluIGEgYC9gIGFuZCBwcmlvciB0byBgcGFja2FnZS9gIHNob3VsZCBnZXRcbi8vIGRyb3BwZWQuXG4vLyBBbnl0aGluZyB0byB0aGUgbGVmdCBvZiB0aGUgbGlrZWx5IHBhdGggcHJlZml4IHRleHQgaXMga2VwdC4gYHBhY2thZ2UvYCBhbmRcbi8vIGV2ZXJ5dGhpbmcgdG8gaXRzIHJpZ2h0IGlzIGtlcHQuIFRodXNcbi8vIGAnT2JqZWN0LmJhciAoL1VzZXJzL21hcmttaWxsZXIvc3JjL29uZ2l0aHViL2Fnb3JpYy9hZ29yaWMtc2RrL3BhY2thZ2VzL2V2ZW50dWFsLXNlbmQvdGVzdC90ZXN0LWRlZXAtc2VuZC5qczoxMzoyMSknYFxuLy8gc2ltcGxpZmllcyB0b1xuLy8gYCdPYmplY3QuYmFyIChwYWNrYWdlcy9ldmVudHVhbC1zZW5kL3Rlc3QvdGVzdC1kZWVwLXNlbmQuanM6MTM6MjEpJ2AuXG4vLyBOb3RlIHRoYXQgYC9wYWNrYWdlcy9gIGlzIGEgY29udmVudGlvbiBmb3IgbW9ub3JlcG9zIGVuY291cmFnZWQgYnlcbi8vIGxlcm5hLlxuY29uc3QgQ0FMTFNJVEVfUEFDS0FHRVNfUEFUVEVSTj0gIC9eKCg/Oi4qWyggXSk/KVs6L1xcd18tXSpcXC8ocGFja2FnZXNcXC8uKykkLztcblxuLy8gVGhlIHVzZSBvZiB0aGVzZSBjYWxsU2l0ZSBwYXR0ZXJucyBiZWxvdyBhc3N1bWVzIHRoYXQgYW55IG1hdGNoIHdpbGwgYmluZFxuLy8gY2FwdHVyZSBncm91cHMgY29udGFpbmluZyB0aGUgcGFydHMgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyB3ZSB3YW50XG4vLyB0byBrZWVwLiBUaGUgcGFydHMgb3V0c2lkZSB0aG9zZSBjYXB0dXJlIGdyb3VwcyB3aWxsIGJlIGRyb3BwZWQgZnJvbSBjb25jaXNlXG4vLyBzdGFja3MuXG4vLyBUT0RPIEVuYWJsZSB1c2VycyB0byBjb25maWd1cmUgQ0FMTFNJVEVfUEFUVEVSTlMgdmlhIGBsb2NrZG93bmAgb3B0aW9ucy5cbmNvbnN0IENBTExTSVRFX1BBVFRFUk5TPSAgW1xuICBDQUxMU0lURV9FTExJUFNFU19QQVRURVJOLFxuICBDQUxMU0lURV9QQUNLQUdFU19QQVRURVJOXTtcblxuXG4vLyBGb3IgYSBzdGFjayBmcmFtZSB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhIGNvbmNpc2Ugc3RhY2sgdHJhY2UsIGlmXG4vLyBgY2FsbFNpdGVTdHJpbmdgIGlzIHRoZSBvcmlnaW5hbCBzdHJpbmdpZmllZCBzdGFjayBmcmFtZSwgcmV0dXJuIHRoZVxuLy8gcG9zc2libHktc2hvcnRlciBzdHJpbmdpZmllZCBzdGFjayBmcmFtZSB0aGF0IHNob3VsZCBiZSBzaG93biBpbnN0ZWFkLlxuLy8gRXhwb3J0ZWQgb25seSBzbyBpdCBjYW4gYmUgdW5pdCB0ZXN0ZWQuXG4vLyBUT0RPIE1vdmUgc28gdGhhdCBpdCBhcHBsaWVzIG5vdCBqdXN0IHRvIHY4LlxuY29uc3QgICAgICAgIHNob3J0ZW5DYWxsU2l0ZVN0cmluZz0gIChjYWxsU2l0ZVN0cmluZyk9PntcbiAgZm9yKCBjb25zdCBmaWx0ZXIgb2YgQ0FMTFNJVEVfUEFUVEVSTlMpIHtcbiAgICBjb25zdCBtYXRjaD0gIHJlZ2V4cEV4ZWMoZmlsdGVyLCBjYWxsU2l0ZVN0cmluZyk7XG4gICAgaWYoIG1hdGNoKSB7XG4gICAgICByZXR1cm4gYXJyYXlKb2luKGFycmF5U2xpY2UobWF0Y2gsIDEpLCAnJyk7XG4gICAgIH1cbiAgIH1cbiAgcmV0dXJuIGNhbGxTaXRlU3RyaW5nO1xuIH07JGjigI1fb25jZS5zaG9ydGVuQ2FsbFNpdGVTdHJpbmcoc2hvcnRlbkNhbGxTaXRlU3RyaW5nKTtcblxuY29uc3QgICAgICAgIHRhbWVWOEVycm9yQ29uc3RydWN0b3I9ICAoXG4gIE9yaWdpbmFsRXJyb3IsXG4gIEluaXRpYWxFcnJvcixcbiAgZXJyb3JUYW1pbmcsXG4gIHN0YWNrRmlsdGVyaW5nKT0+XG4gICAgIHtcbiAgLy8gVE9ETzogUHJvcGVyIENhbGxTaXRlIHR5cGVzXG4gIC8qKiBAdHlwZWRlZiB7e319IENhbGxTaXRlICovXG5cbiAgY29uc3Qgb3JpZ2luYWxDYXB0dXJlU3RhY2tUcmFjZT0gIE9yaWdpbmFsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7XG5cbiAgLy8gY29uc3QgY2FsbFNpdGVGaWx0ZXIgPSBfY2FsbFNpdGUgPT4gdHJ1ZTtcbiAgY29uc3QgY2FsbFNpdGVGaWx0ZXI9ICAoY2FsbFNpdGUpPT57XG4gICAgaWYoIHN0YWNrRmlsdGVyaW5nPT09ICAndmVyYm9zZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICByZXR1cm4gZmlsdGVyRmlsZU5hbWUoY2FsbFNpdGUuZ2V0RmlsZU5hbWUoKSk7XG4gICB9O1xuXG4gIGNvbnN0IGNhbGxTaXRlU3RyaW5naWZpZXI9ICAoY2FsbFNpdGUpPT57XG4gICAgbGV0IGNhbGxTaXRlU3RyaW5nPSAgIGAke2NhbGxTaXRlfWA7XG4gICAgaWYoIHN0YWNrRmlsdGVyaW5nPT09ICAnY29uY2lzZScpIHtcbiAgICAgIGNhbGxTaXRlU3RyaW5nPSAgc2hvcnRlbkNhbGxTaXRlU3RyaW5nKGNhbGxTaXRlU3RyaW5nKTtcbiAgICAgfVxuICAgIHJldHVybiAgYFxcbiAgYXQgJHtjYWxsU2l0ZVN0cmluZ31gO1xuICAgfTtcblxuICBjb25zdCBzdGFja1N0cmluZ0Zyb21TU1Q9ICAoX2Vycm9yLCBzc3QpPT5cbiAgICBhcnJheUpvaW4oXG4gICAgICBhcnJheU1hcChhcnJheUZpbHRlcihzc3QsIGNhbGxTaXRlRmlsdGVyKSwgY2FsbFNpdGVTdHJpbmdpZmllciksXG4gICAgICAnJyk7XG5cblxuICAvKipcbiAgICogQHR5cGVkZWYge29iamVjdH0gU3RydWN0dXJlZFN0YWNrSW5mb1xuICAgKiBAcHJvcGVydHkge0NhbGxTaXRlW119IGNhbGxTaXRlc1xuICAgKiBAcHJvcGVydHkge3VuZGVmaW5lZH0gW3N0YWNrU3RyaW5nXVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge29iamVjdH0gUGFyc2VkU3RhY2tJbmZvXG4gICAqIEBwcm9wZXJ0eSB7dW5kZWZpbmVkfSBbY2FsbFNpdGVzXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gc3RhY2tTdHJpbmdcbiAgICovXG5cbiAgLy8gTWFwcGluZyBmcm9tIGVycm9yIGluc3RhbmNlIHRvIHRoZSBzdGFjayBmb3IgdGhhdCBpbnN0YW5jZS5cbiAgLy8gVGhlIHN0YWNrIGluZm8gaXMgZWl0aGVyIHRoZSBzdHJ1Y3R1cmVkIHN0YWNrIHRyYWNlXG4gIC8vIG9yIHRoZSBnZW5lcmF0ZWQgdGFtZWQgc3RhY2sgc3RyaW5nXG4gIC8qKiBAdHlwZSB7V2Vha01hcDxFcnJvciwgUGFyc2VkU3RhY2tJbmZvIHwgU3RydWN0dXJlZFN0YWNrSW5mb30gKi9cbiAgY29uc3Qgc3RhY2tJbmZvcz0gIG5ldyBXZWFrTWFwKCk7XG5cbiAgLy8gVXNlIGNvbmNpc2UgbWV0aG9kcyB0byBvYnRhaW4gbmFtZWQgZnVuY3Rpb25zIHdpdGhvdXQgY29uc3RydWN0b3JzLlxuICBjb25zdCB0YW1lZE1ldGhvZHM9ICB7XG4gICAgLy8gVGhlIG9wdGlvbmFsIGBvcHRGbmAgYXJndW1lbnQgaXMgZm9yIGN1dHRpbmcgb2ZmIHRoZSBib3R0b20gb2ZcbiAgICAvLyB0aGUgc3RhY2sgLS0tIGZvciBjYXB0dXJpbmcgdGhlIHN0YWNrIG9ubHkgYWJvdmUgdGhlIHRvcG1vc3RcbiAgICAvLyBjYWxsIHRvIHRoYXQgZnVuY3Rpb24uIFNpbmNlIHRoaXMgaXNuJ3QgdGhlIFwicmVhbFwiIGNhcHR1cmVTdGFja1RyYWNlXG4gICAgLy8gYnV0IGluc3RlYWQgY2FsbHMgdGhlIHJlYWwgb25lLCBpZiBubyBvdGhlciBjdXRvZmYgaXMgcHJvdmlkZWQsXG4gICAgLy8gd2UgY3V0IHRoaXMgb25lIG9mZi5cbiAgICBjYXB0dXJlU3RhY2tUcmFjZShlcnJvciwgb3B0Rm49ICB0YW1lZE1ldGhvZHMuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIGlmKCB0eXBlb2Ygb3JpZ2luYWxDYXB0dXJlU3RhY2tUcmFjZT09PSAgJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBPcmlnaW5hbEVycm9yLmNhcHR1cmVTdGFja1RyYWNlIGlzIG9ubHkgb24gdjhcbiAgICAgICAgYXBwbHkob3JpZ2luYWxDYXB0dXJlU3RhY2tUcmFjZSwgT3JpZ2luYWxFcnJvciwgW2Vycm9yLCBvcHRGbl0pO1xuICAgICAgICByZXR1cm47XG4gICAgICAgfVxuICAgICAgcmVmbGVjdFNldChlcnJvciwgJ3N0YWNrJywgJycpO1xuICAgICB9LFxuICAgIC8vIFNoaW0gb2YgcHJvcG9zZWQgc3BlY2lhbCBwb3dlciwgdG8gcmVzaWRlIGJ5IGRlZmF1bHQgb25seVxuICAgIC8vIGluIHRoZSBzdGFydCBjb21wYXJ0bWVudCwgZm9yIGdldHRpbmcgdGhlIHN0YWNrIHRyYWNlYmFja1xuICAgIC8vIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYW4gZXJyb3IuXG4gICAgLy8gU2VlIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1lcnJvci1zdGFja3MvXG4gICAgZ2V0U3RhY2tTdHJpbmcoZXJyb3IpIHtcbiAgICAgIGxldCBzdGFja0luZm89ICB3ZWFrbWFwR2V0KHN0YWNrSW5mb3MsIGVycm9yKTtcblxuICAgICAgaWYoIHN0YWNrSW5mbz09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgd2lsbCBjYWxsIGBwcmVwYXJlU3RhY2tUcmFjZSgpYCBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIHdoaWNoIHdpbGwgcG9wdWxhdGUgc3RhY2tJbmZvc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICAgICAgICB2b2lkIGVycm9yLnN0YWNrO1xuICAgICAgICBzdGFja0luZm89ICB3ZWFrbWFwR2V0KHN0YWNrSW5mb3MsIGVycm9yKTtcbiAgICAgICAgaWYoICFzdGFja0luZm8pIHtcbiAgICAgICAgICBzdGFja0luZm89ICB7IHN0YWNrU3RyaW5nOiAnJ307XG4gICAgICAgICAgd2Vha21hcFNldChzdGFja0luZm9zLCBlcnJvciwgc3RhY2tJbmZvKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG5cbiAgICAgIC8vIHByZXBhcmVTdGFja1RyYWNlKCkgbWF5IGdlbmVyYXRlIHRoZSBzdGFja1N0cmluZ1xuICAgICAgLy8gaWYgZXJyb3JUYW1pbmcgPT09ICd1bnNhZmUnXG5cbiAgICAgIGlmKCBzdGFja0luZm8uc3RhY2tTdHJpbmchPT0gIHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tJbmZvLnN0YWNrU3RyaW5nO1xuICAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhY2tTdHJpbmc9ICBzdGFja1N0cmluZ0Zyb21TU1QoZXJyb3IsIHN0YWNrSW5mby5jYWxsU2l0ZXMpO1xuICAgICAgd2Vha21hcFNldChzdGFja0luZm9zLCBlcnJvciwgeyBzdGFja1N0cmluZ30pO1xuXG4gICAgICByZXR1cm4gc3RhY2tTdHJpbmc7XG4gICAgIH0sXG4gICAgcHJlcGFyZVN0YWNrVHJhY2UoZXJyb3IsIHNzdCkge1xuICAgICAgaWYoIGVycm9yVGFtaW5nPT09ICAndW5zYWZlJykge1xuICAgICAgICBjb25zdCBzdGFja1N0cmluZz0gIHN0YWNrU3RyaW5nRnJvbVNTVChlcnJvciwgc3N0KTtcbiAgICAgICAgd2Vha21hcFNldChzdGFja0luZm9zLCBlcnJvciwgeyBzdGFja1N0cmluZ30pO1xuICAgICAgICByZXR1cm4gIGAke2Vycm9yfSR7c3RhY2tTdHJpbmd9YDtcbiAgICAgICB9ZWxzZSB7XG4gICAgICAgIHdlYWttYXBTZXQoc3RhY2tJbmZvcywgZXJyb3IsIHsgY2FsbFNpdGVzOiBzc3R9KTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgIH1cbiAgICAgfX07XG5cblxuICAvLyBBIHByZXBhcmVGbiBpcyBhIHByZXBhcmVTdGFja1RyYWNlIGZ1bmN0aW9uLlxuICAvLyBBbiBzc3QgaXMgYSBgc3RydWN0dXJlZFN0YWNrVHJhY2VgLCB3aGljaCBpcyBhbiBhcnJheSBvZlxuICAvLyBjYWxsc2l0ZXMuXG4gIC8vIEEgdXNlciBwcmVwYXJlRm4gaXMgYSBwcmVwYXJlRm4gZGVmaW5lZCBieSBhIGNsaWVudCBvZiB0aGlzIEFQSSxcbiAgLy8gYW5kIHByb3ZpZGVkIGJ5IGFzc2lnbmluZyB0byBgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VgLlxuICAvLyBBIHVzZXIgcHJlcGFyZUZuIHNob3VsZCBvbmx5IHJlY2VpdmUgYW4gYXR0ZW51YXRlZCBzc3QsIHdoaWNoXG4gIC8vIGlzIGFuIGFycmF5IG9mIGF0dGVudWF0ZWQgY2FsbHNpdGVzLlxuICAvLyBBIHN5c3RlbSBwcmVwYXJlRm4gaXMgdGhlIHByZXBhcmVGbiBjcmVhdGVkIGJ5IHRoaXMgbW9kdWxlIHRvXG4gIC8vIGJlIGluc3RhbGxlZCBvbiB0aGUgcmVhbCBgRXJyb3JgIGNvbnN0cnVjdG9yLCB0byByZWNlaXZlXG4gIC8vIGFuIG9yaWdpbmFsIHNzdCwgaS5lLiwgYW4gYXJyYXkgb2YgdW5hdHRlbnVhdGVkIGNhbGxzaXRlcy5cbiAgLy8gQW4gaW5wdXQgcHJlcGFyZUZuIGlzIGEgZnVuY3Rpb24gdGhlIHVzZXIgYXNzaWducyB0b1xuICAvLyBgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VgLCB3aGljaCBtaWdodCBiZSBhIHVzZXIgcHJlcGFyZUZuIG9yXG4gIC8vIGEgc3lzdGVtIHByZXBhcmVGbiBwcmV2aW91c2x5IG9idGFpbmVkIGJ5IHJlYWRpbmdcbiAgLy8gYEVycm9yLnByZXBhcmVTdGFja1RyYWNlYC5cblxuICBjb25zdCBkZWZhdWx0UHJlcGFyZUZuPSAgdGFtZWRNZXRob2RzLnByZXBhcmVTdGFja1RyYWNlO1xuXG4gIE9yaWdpbmFsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9ICBkZWZhdWx0UHJlcGFyZUZuO1xuXG4gIC8vIEEgd2Vha3NldCBicmFuZGluZyBzb21lIGZ1bmN0aW9ucyBhcyBzeXN0ZW0gcHJlcGFyZUZucywgYWxsIG9mIHdoaWNoXG4gIC8vIG11c3QgYmUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZSwgc2luY2UgdGhleSBjYW4gcmVjZWl2ZSBhblxuICAvLyB1bmF0dGVudWF0ZWQgc3N0LlxuICBjb25zdCBzeXN0ZW1QcmVwYXJlRm5TZXQ9ICBuZXcgV2Vha1NldChbZGVmYXVsdFByZXBhcmVGbl0pO1xuXG4gIGNvbnN0IHN5c3RlbVByZXBhcmVGbkZvcj0gIChpbnB1dFByZXBhcmVGbik9PntcbiAgICBpZiggd2Vha3NldEhhcyhzeXN0ZW1QcmVwYXJlRm5TZXQsIGlucHV0UHJlcGFyZUZuKSkge1xuICAgICAgcmV0dXJuIGlucHV0UHJlcGFyZUZuO1xuICAgICB9XG4gICAgLy8gVXNlIGNvbmNpc2UgbWV0aG9kcyB0byBvYnRhaW4gbmFtZWQgZnVuY3Rpb25zIHdpdGhvdXQgY29uc3RydWN0b3JzLlxuICAgIGNvbnN0IHN5c3RlbU1ldGhvZHM9ICB7XG4gICAgICBwcmVwYXJlU3RhY2tUcmFjZShlcnJvciwgc3N0KSB7XG4gICAgICAgIHdlYWttYXBTZXQoc3RhY2tJbmZvcywgZXJyb3IsIHsgY2FsbFNpdGVzOiBzc3R9KTtcbiAgICAgICAgcmV0dXJuIGlucHV0UHJlcGFyZUZuKGVycm9yLCBzYWZlVjhTU1Qoc3N0KSk7XG4gICAgICAgfX07XG5cbiAgICB3ZWFrc2V0QWRkKHN5c3RlbVByZXBhcmVGblNldCwgc3lzdGVtTWV0aG9kcy5wcmVwYXJlU3RhY2tUcmFjZSk7XG4gICAgcmV0dXJuIHN5c3RlbU1ldGhvZHMucHJlcGFyZVN0YWNrVHJhY2U7XG4gICB9O1xuXG4gIC8vIE5vdGUgYHN0YWNrVHJhY2VMaW1pdGAgYWNjZXNzb3IgYWxyZWFkeSBkZWZpbmVkIGJ5XG4gIC8vIHRhbWUtZXJyb3ItY29uc3RydWN0b3IuanNcbiAgZGVmaW5lUHJvcGVydGllcyhJbml0aWFsRXJyb3IsIHtcbiAgICBjYXB0dXJlU3RhY2tUcmFjZToge1xuICAgICAgdmFsdWU6IHRhbWVkTWV0aG9kcy5jYXB0dXJlU3RhY2tUcmFjZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWV9LFxuXG4gICAgcHJlcGFyZVN0YWNrVHJhY2U6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE9yaWdpbmFsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICAgfSxcbiAgICAgIHNldChpbnB1dFByZXBhcmVTdGFja1RyYWNlRm4pIHtcbiAgICAgICAgaWYoIHR5cGVvZiBpbnB1dFByZXBhcmVTdGFja1RyYWNlRm49PT0gICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zdCBzeXN0ZW1QcmVwYXJlRm49ICBzeXN0ZW1QcmVwYXJlRm5Gb3IoaW5wdXRQcmVwYXJlU3RhY2tUcmFjZUZuKTtcbiAgICAgICAgICBPcmlnaW5hbEVycm9yLnByZXBhcmVTdGFja1RyYWNlPSAgc3lzdGVtUHJlcGFyZUZuO1xuICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgIE9yaWdpbmFsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9ICBkZWZhdWx0UHJlcGFyZUZuO1xuICAgICAgICAgfVxuICAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG5cbiAgcmV0dXJuIHRhbWVkTWV0aG9kcy5nZXRTdGFja1N0cmluZztcbiB9OyRo4oCNX29uY2UudGFtZVY4RXJyb3JDb25zdHJ1Y3Rvcih0YW1lVjhFcnJvckNvbnN0cnVjdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzFdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfRVJST1IsVHlwZUVycm9yLGFwcGx5LGNvbnN0cnVjdCxkZWZpbmVQcm9wZXJ0aWVzLHNldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixkZWZpbmVQcm9wZXJ0eSxOYXRpdmVFcnJvcnMsdGFtZVY4RXJyb3JDb25zdHJ1Y3RvcjskaOKAjV9pbXBvcnRzKFtbXCIuLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9FUlJPUlwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRVJST1IgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhcHBseVwiLCBbJGjigI1fYSA9PiAoYXBwbHkgPSAkaOKAjV9hKV1dLFtcImNvbnN0cnVjdFwiLCBbJGjigI1fYSA9PiAoY29uc3RydWN0ID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJzZXRQcm90b3R5cGVPZlwiLCBbJGjigI1fYSA9PiAoc2V0UHJvdG90eXBlT2YgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dXV0sW1wiLi4vd2hpdGVsaXN0LmpzXCIsIFtbXCJOYXRpdmVFcnJvcnNcIiwgWyRo4oCNX2EgPT4gKE5hdGl2ZUVycm9ycyA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhbWUtdjgtZXJyb3ItY29uc3RydWN0b3IuanNcIiwgW1tcInRhbWVWOEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKHRhbWVWOEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIFByZXNlbnQgb24gYXQgbGVhc3QgRkYgYW5kIFhTLiBQcm9wb3NlZCBieSBFcnJvci1wcm9wb3NhbC4gVGhlIG9yaWdpbmFsXG4vLyBpcyBkYW5nZXJvdXMsIHNvIHRhbWVFcnJvckNvbnN0cnVjdG9yIHJlcGxhY2VzIGl0IHdpdGggYSBzYWZlIG9uZS5cbi8vIFdlIGdyYWIgdGhlIG9yaWdpbmFsIGhlcmUgYmVmb3JlIGl0IGdldHMgcmVwbGFjZWQuXG5jb25zdCBzdGFja0Rlc2M9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRkVSQUxfRVJST1IucHJvdG90eXBlLCAnc3RhY2snKTtcbmNvbnN0IHN0YWNrR2V0dGVyPSAgc3RhY2tEZXNjJiYgIHN0YWNrRGVzYy5nZXQ7XG5cbi8vIFVzZSBjb25jaXNlIG1ldGhvZHMgdG8gb2J0YWluIG5hbWVkIGZ1bmN0aW9ucyB3aXRob3V0IGNvbnN0cnVjdG9ycy5cbmNvbnN0IHRhbWVkTWV0aG9kcz0gIHtcbiAgZ2V0U3RhY2tTdHJpbmcoZXJyb3IpIHtcbiAgICBpZiggdHlwZW9mIHN0YWNrR2V0dGVyPT09ICAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYXBwbHkoc3RhY2tHZXR0ZXIsIGVycm9yLCBbXSk7XG4gICAgIH1lbHNlIGlmKCAnc3RhY2snaW4gIGVycm9yKSB7XG4gICAgICAvLyBUaGUgZmFsbGJhY2sgaXMgdG8ganVzdCB1c2UgdGhlIGRlIGZhY3RvIGBlcnJvci5zdGFja2AgaWYgcHJlc2VudFxuICAgICAgcmV0dXJuICBgJHtlcnJvci5zdGFja31gO1xuICAgICB9XG4gICAgcmV0dXJuICcnO1xuICAgfX07XG5cblxuZnVuY3Rpb24gICAgICAgICAgICAgICAgdGFtZUVycm9yQ29uc3RydWN0b3IoXG4gIGVycm9yVGFtaW5nPSAgJ3NhZmUnLFxuICBzdGFja0ZpbHRlcmluZz0gICdjb25jaXNlJylcbiAge1xuICBpZiggZXJyb3JUYW1pbmchPT0gICdzYWZlJyYmICBlcnJvclRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIGVycm9yVGFtaW5nICR7ZXJyb3JUYW1pbmd9YCk7XG4gICB9XG4gIGlmKCBzdGFja0ZpbHRlcmluZyE9PSAgJ2NvbmNpc2UnJiYgIHN0YWNrRmlsdGVyaW5nIT09ICAndmVyYm9zZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIHN0YWNrRmlsdGVyaW5nICR7c3RhY2tGaWx0ZXJpbmd9YCk7XG4gICB9XG4gIGNvbnN0IEVycm9yUHJvdG90eXBlPSAgRkVSQUxfRVJST1IucHJvdG90eXBlO1xuXG4gIGNvbnN0IHBsYXRmb3JtPVxuICAgIHR5cGVvZiBGRVJBTF9FUlJPUi5jYXB0dXJlU3RhY2tUcmFjZT09PSAgJ2Z1bmN0aW9uJz8gICd2OCc6ICAndW5rbm93bic7XG4gIGNvbnN0IHsgY2FwdHVyZVN0YWNrVHJhY2U6IG9yaWdpbmFsQ2FwdHVyZVN0YWNrVHJhY2V9PSAgIEZFUkFMX0VSUk9SO1xuXG4gIGNvbnN0IG1ha2VFcnJvckNvbnN0cnVjdG9yPSAgKF89ICB7fSk9PiAge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBjb25zdCBSZXN1bHRFcnJvcj0gIGZ1bmN0aW9uIEVycm9yKC4uLnJlc3QpIHtcbiAgICAgIGxldCBlcnJvcjtcbiAgICAgIGlmKCBuZXcudGFyZ2V0PT09ICB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3I9ICBhcHBseShGRVJBTF9FUlJPUiwgdGhpcywgcmVzdCk7XG4gICAgICAgfWVsc2Uge1xuICAgICAgICBlcnJvcj0gIGNvbnN0cnVjdChGRVJBTF9FUlJPUiwgcmVzdCwgbmV3LnRhcmdldCk7XG4gICAgICAgfVxuICAgICAgaWYoIHBsYXRmb3JtPT09ICAndjgnKSB7XG4gICAgICAgIC8vIFRPRE8gTGlrZWx5IGV4cGVuc2l2ZSFcbiAgICAgICAgYXBwbHkob3JpZ2luYWxDYXB0dXJlU3RhY2tUcmFjZSwgRkVSQUxfRVJST1IsIFtlcnJvciwgUmVzdWx0RXJyb3JdKTtcbiAgICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgIH07XG4gICAgZGVmaW5lUHJvcGVydGllcyhSZXN1bHRFcnJvciwge1xuICAgICAgbGVuZ3RoOiB7IHZhbHVlOiAxfSxcbiAgICAgIHByb3RvdHlwZToge1xuICAgICAgICB2YWx1ZTogRXJyb3JQcm90b3R5cGUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9fSk7XG5cblxuICAgIHJldHVybiBSZXN1bHRFcnJvcjtcbiAgIH07XG4gIGNvbnN0IEluaXRpYWxFcnJvcj0gIG1ha2VFcnJvckNvbnN0cnVjdG9yKHsgcG93ZXJzOiAnb3JpZ2luYWwnfSk7XG4gIGNvbnN0IFNoYXJlZEVycm9yPSAgbWFrZUVycm9yQ29uc3RydWN0b3IoeyBwb3dlcnM6ICdub25lJ30pO1xuICBkZWZpbmVQcm9wZXJ0aWVzKEVycm9yUHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IFNoYXJlZEVycm9yfX0pO1xuXG5cbiAgZm9yKCBjb25zdCBOYXRpdmVFcnJvciBvZiBOYXRpdmVFcnJvcnMpIHtcbiAgICBzZXRQcm90b3R5cGVPZihOYXRpdmVFcnJvciwgU2hhcmVkRXJyb3IpO1xuICAgfVxuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2RvY3Mvc3RhY2stdHJhY2UtYXBpI2NvbXBhdGliaWxpdHkgYWR2aXNlcyB0aGF0XG4gIC8vIHByb2dyYW1tZXJzIGNhbiBcImFsd2F5c1wiIHNldCBgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0YFxuICAvLyBldmVuIG9uIG5vbi12OCBwbGF0Zm9ybXMuIE9uIG5vbi12OFxuICAvLyBpdCB3aWxsIGhhdmUgbm8gZWZmZWN0LCBidXQgdGhpcyBhZHZpY2Ugb25seSBtYWtlcyBzZW5zZVxuICAvLyBpZiB0aGUgYXNzaWdubWVudCBpdHNlbGYgZG9lcyBub3QgZmFpbCwgd2hpY2ggaXQgd291bGRcbiAgLy8gaWYgYEVycm9yYCB3ZXJlIG5haXZlbHkgZnJvemVuLiBIZW5jZSwgd2UgYWRkIHNldHRlcnMgdGhhdFxuICAvLyBhY2NlcHQgYnV0IGlnbm9yZSB0aGUgYXNzaWdubWVudCBvbiBub24tdjggcGxhdGZvcm1zLlxuICBkZWZpbmVQcm9wZXJ0aWVzKEluaXRpYWxFcnJvciwge1xuICAgIHN0YWNrVHJhY2VMaW1pdDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBpZiggdHlwZW9mIEZFUkFMX0VSUk9SLnN0YWNrVHJhY2VMaW1pdD09PSAgJ251bWJlcicpIHtcbiAgICAgICAgICAvLyBGRVJBTF9FUlJPUi5zdGFja1RyYWNlTGltaXQgaXMgb25seSBvbiB2OFxuICAgICAgICAgIHJldHVybiBGRVJBTF9FUlJPUi5zdGFja1RyYWNlTGltaXQ7XG4gICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgfSxcbiAgICAgIHNldChuZXdMaW1pdCkge1xuICAgICAgICBpZiggdHlwZW9mIG5ld0xpbWl0IT09ICAnbnVtYmVyJykge1xuICAgICAgICAgIC8vIHNpbGVudGx5IGRvIG5vdGhpbmcuIFRoaXMgYmVoYXZpb3IgZG9lc24ndCBwcmVjaXNlbHlcbiAgICAgICAgICAvLyBlbXVsYXRlIHY4IGVkZ2UtY2FzZSBiZWhhdmlvci4gQnV0IGdpdmVuIHRoZSBwdXJwb3NlXG4gICAgICAgICAgLy8gb2YgdGhpcyBlbXVsYXRpb24sIGhhdmluZyBlZGdlIGNhc2VzIGVyciB0b3dhcmRzXG4gICAgICAgICAgLy8gaGFybWxlc3Mgc2VlbXMgdGhlIHNhZmVyIG9wdGlvbi5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgICB9XG4gICAgICAgIGlmKCB0eXBlb2YgRkVSQUxfRVJST1Iuc3RhY2tUcmFjZUxpbWl0PT09ICAnbnVtYmVyJykge1xuICAgICAgICAgIC8vIEZFUkFMX0VSUk9SLnN0YWNrVHJhY2VMaW1pdCBpcyBvbmx5IG9uIHY4XG4gICAgICAgICAgRkVSQUxfRVJST1Iuc3RhY2tUcmFjZUxpbWl0PSAgbmV3TGltaXQ7XG4gICAgICAgICAgLy8gV2UgcGxhY2UgdGhlIHVzZWxlc3MgcmV0dXJuIG9uIHRoZSBuZXh0IGxpbmUgdG8gZW5zdXJlXG4gICAgICAgICAgLy8gdGhhdCBhbnl0aGluZyB3ZSBwbGFjZSBhZnRlciB0aGUgaWYgaW4gdGhlIGZ1dHVyZSBvbmx5XG4gICAgICAgICAgLy8gaGFwcGVucyBpZiB0aGUgdGhlbi1jYXNlIGRvZXMgbm90LlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLXJldHVyblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICB9LFxuICAgICAgLy8gV1RGIG9uIHY4IHN0YWNrVHJhY2VMaW1pdCBpcyBlbnVtZXJhYmxlXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG5cbiAgLy8gVGhlIGRlZmF1bHQgU2hhcmVkRXJyb3IgbXVjaCBiZSBjb21wbGV0ZWx5IHBvd2VybGVzcyBldmVuIG9uIHY4LFxuICAvLyBzbyB0aGUgbGVuaWVudCBgc3RhY2tUcmFjZUxpbWl0YCBhY2Nlc3NvciBkb2VzIG5vdGhpbmcgb24gYWxsXG4gIC8vIHBsYXRmb3Jtcy5cbiAgZGVmaW5lUHJvcGVydGllcyhTaGFyZWRFcnJvciwge1xuICAgIHN0YWNrVHJhY2VMaW1pdDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgIH0sXG4gICAgICBzZXQoX25ld0xpbWl0KSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuXG4gIGlmKCBwbGF0Zm9ybT09PSAgJ3Y4Jykge1xuICAgIC8vIGBTaGFyZWRFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWAsIGlmIGl0IGV4aXN0cywgbXVzdCBhbHNvIGJlXG4gICAgLy8gcG93ZXJsZXNzLiBIb3dldmVyLCBmcm9tIHdoYXQgd2UndmUgaGVhcmQsIGRlcGQgZXhwZWN0cyB0byBiZSBhYmxlIHRvXG4gICAgLy8gYXNzaWduIHRvIGl0IHdpdGhvdXQgdGhlIGFzc2lnbm1lbnQgdGhyb3dpbmcuIEl0IGlzIG5vcm1hbGx5IGEgZnVuY3Rpb25cbiAgICAvLyB0aGF0IHJldHVybnMgYSBzdGFjayBzdHJpbmcgdG8gYmUgbWFnaWNhbGx5IGFkZGVkIHRvIGVycm9yIG9iamVjdHMuXG4gICAgLy8gSG93ZXZlciwgYXMgbG9uZyBhcyB3ZSdyZSBhZGRpbmcgYSBsZW5pZW50IHN0YW5kaW4sIHdlIG1heSBhcyB3ZWxsXG4gICAgLy8gYWNjb21tb2RhdGUgYW55IHdobyBleHBlY3QgdG8gZ2V0IGEgZnVuY3Rpb24gdGhleSBjYW4gY2FsbCBhbmQgZ2V0XG4gICAgLy8gYSBzdHJpbmcgYmFjay4gVGhpcyBwcmVwYXJlU3RhY2tUcmFjZSBpcyBhIGRvLW5vdGhpbmcgZnVuY3Rpb24gdGhhdFxuICAgIC8vIGFsd2F5cyByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuXG4gICAgZGVmaW5lUHJvcGVydGllcyhTaGFyZWRFcnJvciwge1xuICAgICAgcHJlcGFyZVN0YWNrVHJhY2U6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiAoKT0+ICAnJztcbiAgICAgICAgIH0sXG4gICAgICAgIHNldChfcHJlcGFyZUZuKSB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG5cbiAgICAgIGNhcHR1cmVTdGFja1RyYWNlOiB7XG4gICAgICAgIHZhbHVlOiAoZXJyb3Jpc2gsIF9jb25zdHJ1Y3Rvck9wdCk9PiAge1xuICAgICAgICAgIGRlZmluZVByb3BlcnR5KGVycm9yaXNoLCAnc3RhY2snLCB7XG4gICAgICAgICAgICB2YWx1ZTogJyd9KTtcblxuICAgICAgICAgfSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cbiAgIH1cblxuICBsZXQgaW5pdGlhbEdldFN0YWNrU3RyaW5nPSAgdGFtZWRNZXRob2RzLmdldFN0YWNrU3RyaW5nO1xuICBpZiggcGxhdGZvcm09PT0gICd2OCcpIHtcbiAgICBpbml0aWFsR2V0U3RhY2tTdHJpbmc9ICB0YW1lVjhFcnJvckNvbnN0cnVjdG9yKFxuICAgICAgRkVSQUxfRVJST1IsXG4gICAgICBJbml0aWFsRXJyb3IsXG4gICAgICBlcnJvclRhbWluZyxcbiAgICAgIHN0YWNrRmlsdGVyaW5nKTtcblxuICAgfWVsc2UgaWYoIGVycm9yVGFtaW5nPT09ICAndW5zYWZlJykge1xuICAgIC8vIHY4IGhhcyB0b28gbXVjaCBtYWdpYyBhcm91bmQgdGhlaXIgJ3N0YWNrJyBvd24gcHJvcGVydHkgZm9yIGl0IHRvXG4gICAgLy8gY29leGlzdCBjbGVhbmx5IHdpdGggdGhpcyBhY2Nlc3Nvci4gU28gb25seSBpbnN0YWxsIGl0IG9uIG5vbi12OFxuXG4gICAgLy8gRXJyb3IucHJvdG90eXBlLnN0YWNrIHByb3BlcnR5IGFzIHByb3Bvc2VkIGF0XG4gICAgLy8gaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWVycm9yLXN0YWNrcy9cbiAgICAvLyB3aXRoIHRoZSBmaXggcHJvcG9zZWQgYXRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1lcnJvci1zdGFja3MvaXNzdWVzLzQ2XG4gICAgLy8gT24gb3RoZXJzLCB0aGlzIHN0aWxsIHByb3RlY3RzIGZyb20gdGhlIG92ZXJyaWRlIG1pc3Rha2UsXG4gICAgLy8gZXNzZW50aWFsbHkgbGlrZSBlbmFibGUtcHJvcGVydHktb3ZlcnJpZGVzLmpzIHdvdWxkXG4gICAgLy8gb25jZSB0aGlzIGFjY2Vzc29yIHByb3BlcnR5IGl0c2VsZiBpcyBmcm96ZW4sIGFzIHdpbGwgaGFwcGVuXG4gICAgLy8gbGF0ZXIgZHVyaW5nIGxvY2tkb3duLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgdGhlcmUgaXMgaGVyZSBhIGNoYW5nZSBmcm9tIHRoZSBpbnRlbnQgaW4gdGhlIGN1cnJlbnRcbiAgICAvLyBzdGF0ZSBvZiB0aGUgcHJvcG9zYWwuIElmIGV4cGVyaWVuY2UgdGVsbHMgdXMgd2hldGhlciB0aGlzIGNoYW5nZVxuICAgIC8vIGlzIGEgZ29vZCBpZGVhLCB3ZSBzaG91bGQgbW9kaWZ5IHRoZSBwcm9wb3NhbCBhY2NvcmRpbmdseS4gVGhlcmUgaXNcbiAgICAvLyBtdWNoIGNvZGUgaW4gdGhlIHdvcmxkIHRoYXQgYXNzdW1lcyBgZXJyb3Iuc3RhY2tgIGlzIGEgc3RyaW5nLiBTb1xuICAgIC8vIHdoZXJlIHRoZSBwcm9wb3NhbCBhY2NvbW1vZGF0ZXMgc2VjdXJlIG9wZXJhdGlvbiBieSBtYWtpbmcgdGhlXG4gICAgLy8gcHJvcGVydHkgb3B0aW9uYWwsIHdlIGluc3RlYWQgYWNjb21tb2RhdGUgc2VjdXJlIG9wZXJhdGlvbiBieVxuICAgIC8vIGhhdmluZyB0aGUgc2VjdXJlIGZvcm0gYWx3YXlzIHJldHVybiBvbmx5IHRoZSBzdGFibGUgcGFydCwgdGhlXG4gICAgLy8gc3RyaW5naWZpZWQgZXJyb3IgaW5zdGFuY2UsIGFuZCBvbWl0dGluZyBhbGwgdGhlIGZyYW1lIGluZm9ybWF0aW9uXG4gICAgLy8gcmF0aGVyIHRoYW4gb21pdHRpbmcgdGhlIHByb3BlcnR5LlxuICAgIGRlZmluZVByb3BlcnRpZXMoRXJyb3JQcm90b3R5cGUsIHtcbiAgICAgIHN0YWNrOiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbEdldFN0YWNrU3RyaW5nKHRoaXMpO1xuICAgICAgICAgfSxcbiAgICAgICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBzdGFjazoge1xuICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuICAgICAgICAgfX19KTtcblxuXG4gICB9ZWxzZSB7XG4gICAgLy8gdjggaGFzIHRvbyBtdWNoIG1hZ2ljIGFyb3VuZCB0aGVpciAnc3RhY2snIG93biBwcm9wZXJ0eSBmb3IgaXQgdG9cbiAgICAvLyBjb2V4aXN0IGNsZWFubHkgd2l0aCB0aGlzIGFjY2Vzc29yLiBTbyBvbmx5IGluc3RhbGwgaXQgb24gbm9uLXY4XG4gICAgZGVmaW5lUHJvcGVydGllcyhFcnJvclByb3RvdHlwZSwge1xuICAgICAgc3RhY2s6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWVycm9yLXN0YWNrcy9pc3N1ZXMvNDZcbiAgICAgICAgICAvLyBhbGxvd3MgdGhpcyB0byBub3QgYWRkIGFuIHVucGxlYXNhbnQgbmV3bGluZS4gT3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2Ugc2hvdWxkIGZpeCB0aGlzLlxuICAgICAgICAgIHJldHVybiAgYCR7dGhpc31gO1xuICAgICAgICAgfSxcbiAgICAgICAgc2V0KG5ld1ZhbHVlKSB7XG4gICAgICAgICAgZGVmaW5lUHJvcGVydGllcyh0aGlzLCB7XG4gICAgICAgICAgICBzdGFjazoge1xuICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuICAgICAgICAgfX19KTtcblxuXG4gICB9XG5cbiAgcmV0dXJuIHtcbiAgICAnJUluaXRpYWxHZXRTdGFja1N0cmluZyUnOiBpbml0aWFsR2V0U3RhY2tTdHJpbmcsXG4gICAgJyVJbml0aWFsRXJyb3IlJzogSW5pdGlhbEVycm9yLFxuICAgICclU2hhcmVkRXJyb3IlJzogU2hhcmVkRXJyb3J9O1xuXG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIHRhbWVFcnJvckNvbnN0cnVjdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzJdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfRlVOQ1RJT04sRmxvYXQzMkFycmF5LE1hcCxTZXQsU3RyaW5nLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixnZXRQcm90b3R5cGVPZixpdGVyYXRlQXJyYXksaXRlcmF0ZU1hcCxpdGVyYXRlU2V0LGl0ZXJhdGVTdHJpbmcsbWF0Y2hBbGxSZWdFeHAsbWF0Y2hBbGxTeW1ib2wscmVnZXhwUHJvdG90eXBlLEluZXJ0Q29tcGFydG1lbnQ7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9GVU5DVElPTlwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRlVOQ1RJT04gPSAkaOKAjV9hKV1dLFtcIkZsb2F0MzJBcnJheVwiLCBbJGjigI1fYSA9PiAoRmxvYXQzMkFycmF5ID0gJGjigI1fYSldXSxbXCJNYXBcIiwgWyRo4oCNX2EgPT4gKE1hcCA9ICRo4oCNX2EpXV0sW1wiU2V0XCIsIFskaOKAjV9hID0+IChTZXQgPSAkaOKAjV9hKV1dLFtcIlN0cmluZ1wiLCBbJGjigI1fYSA9PiAoU3RyaW5nID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wiZ2V0UHJvdG90eXBlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldFByb3RvdHlwZU9mID0gJGjigI1fYSldXSxbXCJpdGVyYXRlQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGl0ZXJhdGVBcnJheSA9ICRo4oCNX2EpXV0sW1wiaXRlcmF0ZU1hcFwiLCBbJGjigI1fYSA9PiAoaXRlcmF0ZU1hcCA9ICRo4oCNX2EpXV0sW1wiaXRlcmF0ZVNldFwiLCBbJGjigI1fYSA9PiAoaXRlcmF0ZVNldCA9ICRo4oCNX2EpXV0sW1wiaXRlcmF0ZVN0cmluZ1wiLCBbJGjigI1fYSA9PiAoaXRlcmF0ZVN0cmluZyA9ICRo4oCNX2EpXV0sW1wibWF0Y2hBbGxSZWdFeHBcIiwgWyRo4oCNX2EgPT4gKG1hdGNoQWxsUmVnRXhwID0gJGjigI1fYSldXSxbXCJtYXRjaEFsbFN5bWJvbFwiLCBbJGjigI1fYSA9PiAobWF0Y2hBbGxTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInJlZ2V4cFByb3RvdHlwZVwiLCBbJGjigI1fYSA9PiAocmVnZXhwUHJvdG90eXBlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtc2hpbS5qc1wiLCBbW1wiSW5lcnRDb21wYXJ0bWVudFwiLCBbJGjigI1fYSA9PiAoSW5lcnRDb21wYXJ0bWVudCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogT2JqZWN0LmdldENvbnN0cnVjdG9yT2YoKVxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGltcHJvdmUgcmVhZGFiaWxpdHksIHNpbWlsYXIgdG8gT2JqZWN0LmdldFByb3RvdHlwZU9mKCkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck9mKG9iaikge1xuICByZXR1cm4gZ2V0UHJvdG90eXBlT2Yob2JqKS5jb25zdHJ1Y3RvcjtcbiB9XG5cbi8vIGdldEFub255bW91c0ludHJpbnNpY3MgdXNlcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29uc3RydWN0IGFuIGFyZ3VtZW50c1xuLy8gb2JqZWN0LCBzaW5jZSBpdCBjYW5ub3QgaGF2ZSBvbmUgb2YgaXRzIG93biBhbmQgYWxzbyBiZSBhIGNvbnN0IGV4cG9ydC5cbmZ1bmN0aW9uIG1ha2VBcmd1bWVudHMoKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgcmV0dXJuIGFyZ3VtZW50cztcbiB9XG5cbi8qKlxuICogZ2V0QW5vbnltb3VzSW50cmluc2ljcygpXG4gKiBHZXQgdGhlIGludHJpbnNpY3Mgbm90IG90aGVyd2lzZSByZWFjaGFibGUgYnkgbmFtZWQgb3duIHByb3BlcnR5XG4gKiB0cmF2ZXJzYWwgZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgZ2V0QW5vbnltb3VzSW50cmluc2ljcz0gICgpPT4gIHtcbiAgY29uc3QgSW5lcnRGdW5jdGlvbj0gIEZFUkFMX0ZVTkNUSU9OLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuICAvLyA5LjIuNC4xICVUaHJvd1R5cGVFcnJvciVcblxuICBjb25zdCBUaHJvd1R5cGVFcnJvcj0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihtYWtlQXJndW1lbnRzKCksICdjYWxsZWUnKS5cbiAgICAgZ2V0O1xuXG4gIC8vIDIxLjEuNS4yIFRoZSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctd3JhcHBlcnNcbiAgY29uc3QgU3RyaW5nSXRlcmF0b3JPYmplY3Q9ICBpdGVyYXRlU3RyaW5nKG5ldyBTdHJpbmcoKSk7XG4gIGNvbnN0IFN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoU3RyaW5nSXRlcmF0b3JPYmplY3QpO1xuXG4gIC8vIDIxLjIuNy4xIFRoZSAlUmVnRXhwU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuICBjb25zdCBSZWdFeHBTdHJpbmdJdGVyYXRvcj1cbiAgICByZWdleHBQcm90b3R5cGVbbWF0Y2hBbGxTeW1ib2xdJiYgIG1hdGNoQWxsUmVnRXhwKC8uLyk7XG4gIGNvbnN0IFJlZ0V4cFN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlPVxuICAgIFJlZ0V4cFN0cmluZ0l0ZXJhdG9yJiYgIGdldFByb3RvdHlwZU9mKFJlZ0V4cFN0cmluZ0l0ZXJhdG9yKTtcblxuICAvLyAyMi4xLjUuMiBUaGUgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hcnJheS1jb25zdHJ1Y3RvclxuICBjb25zdCBBcnJheUl0ZXJhdG9yT2JqZWN0PSAgaXRlcmF0ZUFycmF5KFtdKTtcbiAgY29uc3QgQXJyYXlJdGVyYXRvclByb3RvdHlwZT0gIGdldFByb3RvdHlwZU9mKEFycmF5SXRlcmF0b3JPYmplY3QpO1xuXG4gIC8vIDIyLjIuMSBUaGUgJVR5cGVkQXJyYXklIEludHJpbnNpYyBPYmplY3RcblxuICBjb25zdCBUeXBlZEFycmF5PSAgZ2V0UHJvdG90eXBlT2YoRmxvYXQzMkFycmF5KTtcblxuICAvLyAyMy4xLjUuMiBUaGUgJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcblxuICBjb25zdCBNYXBJdGVyYXRvck9iamVjdD0gIGl0ZXJhdGVNYXAobmV3IE1hcCgpKTtcbiAgY29uc3QgTWFwSXRlcmF0b3JQcm90b3R5cGU9ICBnZXRQcm90b3R5cGVPZihNYXBJdGVyYXRvck9iamVjdCk7XG5cbiAgLy8gMjMuMi41LjIgVGhlICVTZXRJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG5cbiAgY29uc3QgU2V0SXRlcmF0b3JPYmplY3Q9ICBpdGVyYXRlU2V0KG5ldyBTZXQoKSk7XG4gIGNvbnN0IFNldEl0ZXJhdG9yUHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoU2V0SXRlcmF0b3JPYmplY3QpO1xuXG4gIC8vIDI1LjEuMiBUaGUgJUl0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcblxuICBjb25zdCBJdGVyYXRvclByb3RvdHlwZT0gIGdldFByb3RvdHlwZU9mKEFycmF5SXRlcmF0b3JQcm90b3R5cGUpO1xuXG4gIC8vIDI1LjIuMSBUaGUgR2VuZXJhdG9yRnVuY3Rpb24gQ29uc3RydWN0b3JcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cbiAgZnVuY3Rpb24qIEdlbmVyYXRvckZ1bmN0aW9uSW5zdGFuY2UoKSB7IH1cbiAgY29uc3QgR2VuZXJhdG9yRnVuY3Rpb249ICBnZXRDb25zdHJ1Y3Rvck9mKEdlbmVyYXRvckZ1bmN0aW9uSW5zdGFuY2UpO1xuXG4gIC8vIDI1LjIuMyBQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmF0b3JGdW5jdGlvbiBQcm90b3R5cGUgT2JqZWN0XG5cbiAgY29uc3QgR2VuZXJhdG9yPSAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4gIC8vIDI1LjMuMSBUaGUgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiBDb25zdHJ1Y3RvclxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eS1mdW5jdGlvblxuICBhc3luYyBmdW5jdGlvbiogQXN5bmNHZW5lcmF0b3JGdW5jdGlvbkluc3RhbmNlKCkgeyB9XG4gIGNvbnN0IEFzeW5jR2VuZXJhdG9yRnVuY3Rpb249ICBnZXRDb25zdHJ1Y3Rvck9mKFxuICAgIEFzeW5jR2VuZXJhdG9yRnVuY3Rpb25JbnN0YW5jZSk7XG5cblxuICAvLyAyNS4zLjIuMiBBc3luY0dlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZVxuICBjb25zdCBBc3luY0dlbmVyYXRvcj0gIEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlO1xuICAvLyAyNS41LjEgUHJvcGVydGllcyBvZiB0aGUgQXN5bmNHZW5lcmF0b3IgUHJvdG90eXBlIE9iamVjdFxuICBjb25zdCBBc3luY0dlbmVyYXRvclByb3RvdHlwZT0gIEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZTtcbiAgY29uc3QgQXN5bmNJdGVyYXRvclByb3RvdHlwZT0gIGdldFByb3RvdHlwZU9mKEFzeW5jR2VuZXJhdG9yUHJvdG90eXBlKTtcblxuICAvLyAyNS43LjEgVGhlIEFzeW5jRnVuY3Rpb24gQ29uc3RydWN0b3JcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cbiAgYXN5bmMgZnVuY3Rpb24gQXN5bmNGdW5jdGlvbkluc3RhbmNlKCkgeyB9XG4gIGNvbnN0IEFzeW5jRnVuY3Rpb249ICBnZXRDb25zdHJ1Y3Rvck9mKEFzeW5jRnVuY3Rpb25JbnN0YW5jZSk7XG5cbiAgY29uc3QgaW50cmluc2ljcz0gIHtcbiAgICAnJUluZXJ0RnVuY3Rpb24lJzogSW5lcnRGdW5jdGlvbixcbiAgICAnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogQXJyYXlJdGVyYXRvclByb3RvdHlwZSxcbiAgICAnJUluZXJ0QXN5bmNGdW5jdGlvbiUnOiBBc3luY0Z1bmN0aW9uLFxuICAgICclQXN5bmNHZW5lcmF0b3IlJzogQXN5bmNHZW5lcmF0b3IsXG4gICAgJyVJbmVydEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJzogQXN5bmNHZW5lcmF0b3JGdW5jdGlvbixcbiAgICAnJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSc6IEFzeW5jR2VuZXJhdG9yUHJvdG90eXBlLFxuICAgICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBBc3luY0l0ZXJhdG9yUHJvdG90eXBlLFxuICAgICclR2VuZXJhdG9yJSc6IEdlbmVyYXRvcixcbiAgICAnJUluZXJ0R2VuZXJhdG9yRnVuY3Rpb24lJzogR2VuZXJhdG9yRnVuY3Rpb24sXG4gICAgJyVJdGVyYXRvclByb3RvdHlwZSUnOiBJdGVyYXRvclByb3RvdHlwZSxcbiAgICAnJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSc6IE1hcEl0ZXJhdG9yUHJvdG90eXBlLFxuICAgICclUmVnRXhwU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogUmVnRXhwU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUsXG4gICAgJyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiBTZXRJdGVyYXRvclByb3RvdHlwZSxcbiAgICAnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IFN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlLFxuICAgICclVGhyb3dUeXBlRXJyb3IlJzogVGhyb3dUeXBlRXJyb3IsXG4gICAgJyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG4gICAgJyVJbmVydENvbXBhcnRtZW50JSc6IEluZXJ0Q29tcGFydG1lbnR9O1xuXG5cbiAgcmV0dXJuIGludHJpbnNpY3M7XG4gfTskaOKAjV9vbmNlLmdldEFub255bW91c0ludHJpbnNpY3MoZ2V0QW5vbnltb3VzSW50cmluc2ljcyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzMzXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFNldCxTdHJpbmcsVHlwZUVycm9yLFdlYWtNYXAsV2Vha1NldCxhcHBseSxhcnJheUZvckVhY2gsZGVmaW5lUHJvcGVydHksZnJlZXplLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGdldFByb3RvdHlwZU9mLGlzSW50ZWdlcixpc09iamVjdCxvYmplY3RIYXNPd25Qcm9wZXJ0eSxvd25LZXlzLHByZXZlbnRFeHRlbnNpb25zLHNldEFkZCxzZXRGb3JFYWNoLHNldEhhcyx0b1N0cmluZ1RhZ1N5bWJvbCx0eXBlZEFycmF5UHJvdG90eXBlLHdlYWttYXBHZXQsd2Vha21hcFNldCx3ZWFrc2V0QWRkLHdlYWtzZXRIYXMsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiU2V0XCIsIFskaOKAjV9hID0+IChTZXQgPSAkaOKAjV9hKV1dLFtcIlN0cmluZ1wiLCBbJGjigI1fYSA9PiAoU3RyaW5nID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiV2Vha01hcFwiLCBbJGjigI1fYSA9PiAoV2Vha01hcCA9ICRo4oCNX2EpXV0sW1wiV2Vha1NldFwiLCBbJGjigI1fYSA9PiAoV2Vha1NldCA9ICRo4oCNX2EpXV0sW1wiYXBwbHlcIiwgWyRo4oCNX2EgPT4gKGFwcGx5ID0gJGjigI1fYSldXSxbXCJhcnJheUZvckVhY2hcIiwgWyRo4oCNX2EgPT4gKGFycmF5Rm9yRWFjaCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvcnNcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSAkaOKAjV9hKV1dLFtcImdldFByb3RvdHlwZU9mXCIsIFskaOKAjV9hID0+IChnZXRQcm90b3R5cGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNJbnRlZ2VyXCIsIFskaOKAjV9hID0+IChpc0ludGVnZXIgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wib2JqZWN0SGFzT3duUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKG9iamVjdEhhc093blByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJvd25LZXlzXCIsIFskaOKAjV9hID0+IChvd25LZXlzID0gJGjigI1fYSldXSxbXCJwcmV2ZW50RXh0ZW5zaW9uc1wiLCBbJGjigI1fYSA9PiAocHJldmVudEV4dGVuc2lvbnMgPSAkaOKAjV9hKV1dLFtcInNldEFkZFwiLCBbJGjigI1fYSA9PiAoc2V0QWRkID0gJGjigI1fYSldXSxbXCJzZXRGb3JFYWNoXCIsIFskaOKAjV9hID0+IChzZXRGb3JFYWNoID0gJGjigI1fYSldXSxbXCJzZXRIYXNcIiwgWyRo4oCNX2EgPT4gKHNldEhhcyA9ICRo4oCNX2EpXV0sW1widG9TdHJpbmdUYWdTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKHRvU3RyaW5nVGFnU3ltYm9sID0gJGjigI1fYSldXSxbXCJ0eXBlZEFycmF5UHJvdG90eXBlXCIsIFskaOKAjV9hID0+ICh0eXBlZEFycmF5UHJvdG90eXBlID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwR2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwR2V0ID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwU2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwU2V0ID0gJGjigI1fYSldXSxbXCJ3ZWFrc2V0QWRkXCIsIFskaOKAjV9hID0+ICh3ZWFrc2V0QWRkID0gJGjigI1fYSldXSxbXCJ3ZWFrc2V0SGFzXCIsIFskaOKAjV9hID0+ICh3ZWFrc2V0SGFzID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2luZGV4LmpzJykuSGFyZGVufSBIYXJkZW5cbiAqL1xuXG4vLyBPYnRhaW4gdGhlIHN0cmluZyB0YWcgYWNjZXNzb3Igb2Ygb2YgVHlwZWRBcnJheSBzbyB3ZSBjYW4gaW5kaXJlY3RseSB1c2UgdGhlXG4vLyBUeXBlZEFycmF5IGJyYW5kIGNoZWNrIGl0IGVtcGxveXMuXG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWc9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9ICB0eXBlZEFycmF5VG9TdHJpbmdUYWcuZ2V0O1xuYXNzZXJ0KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyk7XG5cbi8vIEV4cG9ydGVkIGZvciB0ZXN0cy5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9tYXJzaGFsL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PSAgKG9iamVjdCk9PntcbiAgLy8gVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gIGNvbnN0IHRhZz0gIGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWchPT0gIHVuZGVmaW5lZDtcbiB9O1xuXG4vKipcbiAqIFRlc3RzIGlmIGEgcHJvcGVydHkga2V5IGlzIGFuIGludGVnZXItdmFsdWVkIGNhbm9uaWNhbCBudW1lcmljIGluZGV4LlxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1jYW5vbmljYWxudW1lcmljaW5kZXhzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcGVydHlLZXlcbiAqLyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5jb25zdCBpc0Nhbm9uaWNhbEludGVnZXJJbmRleFN0cmluZz0gIChwcm9wZXJ0eUtleSk9PntcbiAgY29uc3Qgbj0gICtTdHJpbmcocHJvcGVydHlLZXkpO1xuICByZXR1cm4gaXNJbnRlZ2VyKG4pJiYgIFN0cmluZyhuKT09PSAgcHJvcGVydHlLZXk7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFycmF5XG4gKi9cbmNvbnN0IGZyZWV6ZVR5cGVkQXJyYXk9ICAoYXJyYXkpPT57XG4gIHByZXZlbnRFeHRlbnNpb25zKGFycmF5KTtcblxuICAvLyBEb3duZ3JhZGUgd3JpdGFibGUgZXhwYW5kb3MgdG8gcmVhZG9ubHksIGV2ZW4gaWYgbm9uLWNvbmZpZ3VyYWJsZS5cbiAgLy8gV2UgZ2V0IGVhY2ggZGVzY3JpcHRvciBpbmRpdmlkdWFsbHkgcmF0aGVyIHRoYW4gdXNpbmdcbiAgLy8gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyBpbiBvcmRlciB0byBmYWlsIHNhZmUgd2hlbiBlbmNvdW50ZXJpbmdcbiAgLy8gYW4gb2JzY3VyZSBHcmFhbEpTIGlzc3VlIHdoZXJlIGdldE93blByb3BlcnR5RGVzY3JpcHRvciByZXR1cm5zXG4gIC8vIHVuZGVmaW5lZCBmb3IgYSBwcm9wZXJ0eSB0aGF0IGRvZXMgZXhpc3QuXG4gIGFycmF5Rm9yRWFjaChvd25LZXlzKGFycmF5KSwgKC8qKiBAdHlwZSB7c3RyaW5nIHwgc3ltYm9sfSAqLyBuYW1lKT0+ICB7XG4gICAgY29uc3QgZGVzYz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcnJheSwgbmFtZSk7XG4gICAgYXNzZXJ0KGRlc2MpO1xuICAgIC8vIFR5cGVkQXJyYXlzIGFyZSBpbnRlZ2VyLWluZGV4ZWQgZXhvdGljIG9iamVjdHMsIHdoaWNoIGRlZmluZSBzcGVjaWFsXG4gICAgLy8gdHJlYXRtZW50IGZvciBwcm9wZXJ0eSBuYW1lcyBpbiBjYW5vbmljYWwgbnVtZXJpYyBmb3JtOlxuICAgIC8vIGludGVnZXJzIGluIHJhbmdlIGFyZSBwZXJtYW5lbnRseSB3cml0YWJsZSBhbmQgbm9uLWNvbmZpZ3VyYWJsZS5cbiAgICAvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWludGVnZXItaW5kZXhlZC1leG90aWMtb2JqZWN0c1xuICAgIC8vXG4gICAgLy8gVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlIGRhdGEgb2YgYSBoYXJkZW5lZCBNYXAgb3IgU2V0LFxuICAgIC8vIHNvIHdlIGNhcnZlIG91dCB0aGlzIGV4Y2VwdGlvbmFsIGJlaGF2aW9yIGJ1dCBtYWtlIGFsbCBvdGhlclxuICAgIC8vIHByb3BlcnRpZXMgbm9uLWNvbmZpZ3VyYWJsZS5cbiAgICBpZiggIWlzQ2Fub25pY2FsSW50ZWdlckluZGV4U3RyaW5nKG5hbWUpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShhcnJheSwgbmFtZSwge1xuICAgICAgICAuLi5kZXNjLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcblxuICAgICB9XG4gICB9KTtcbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIGBoYXJkZW5gIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtIYXJkZW59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGFyZGVuZXI9ICAoKT0+ICB7XG4gIGNvbnN0IGhhcmRlbmVkPSAgbmV3IFdlYWtTZXQoKTtcblxuICBjb25zdCB7IGhhcmRlbn09ICAge1xuICAgIC8qKlxuICAgICAqIEB0ZW1wbGF0ZSBUXG4gICAgICogQHBhcmFtIHtUfSByb290XG4gICAgICogQHJldHVybnMge1R9XG4gICAgICovXG4gICAgaGFyZGVuKHJvb3QpIHtcbiAgICAgIGNvbnN0IHRvRnJlZXplPSAgbmV3IFNldCgpO1xuICAgICAgY29uc3QgcGF0aHM9ICBuZXcgV2Vha01hcCgpO1xuXG4gICAgICAvLyBJZiB2YWwgaXMgc29tZXRoaW5nIHdlIHNob3VsZCBiZSBmcmVlemluZyBidXQgYXJlbid0IHlldCxcbiAgICAgIC8vIGFkZCBpdCB0byB0b0ZyZWV6ZS5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHthbnl9IHZhbFxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiBlbnF1ZXVlKHZhbCwgcGF0aD0gIHVuZGVmaW5lZCkge1xuICAgICAgICBpZiggIWlzT2JqZWN0KHZhbCkpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgcHJpbWl0aXZlc1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgY29uc3QgdHlwZT0gIHR5cGVvZiB2YWw7XG4gICAgICAgIGlmKCB0eXBlIT09ICAnb2JqZWN0JyYmICB0eXBlIT09ICAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gZnV0dXJlIHByb29mOiBicmVhayB1bnRpbCBzb21lb25lIGZpZ3VyZXMgb3V0IHdoYXQgaXQgc2hvdWxkIGRvXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYFVuZXhwZWN0ZWQgdHlwZW9mOiAke3R5cGV9YCk7XG4gICAgICAgICB9XG4gICAgICAgIGlmKCB3ZWFrc2V0SGFzKGhhcmRlbmVkLCB2YWwpfHwgIHNldEhhcyh0b0ZyZWV6ZSwgdmFsKSkge1xuICAgICAgICAgIC8vIElnbm9yZSBpZiB0aGlzIGlzIGFuIGV4aXQsIG9yIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCBpdFxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS53YXJuKGBhZGRpbmcgJHt2YWx9IHRvIHRvRnJlZXplYCwgdmFsKTtcbiAgICAgICAgc2V0QWRkKHRvRnJlZXplLCB2YWwpO1xuICAgICAgICB3ZWFrbWFwU2V0KHBhdGhzLCB2YWwsIHBhdGgpO1xuICAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge2FueX0gb2JqXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGZyZWV6ZUFuZFRyYXZlcnNlKG9iaikge1xuICAgICAgICAvLyBOb3cgZnJlZXplIHRoZSBvYmplY3QgdG8gZW5zdXJlIHJlYWN0aXZlXG4gICAgICAgIC8vIG9iamVjdHMgc3VjaCBhcyBwcm94aWVzIHdvbid0IGFkZCBwcm9wZXJ0aWVzXG4gICAgICAgIC8vIGR1cmluZyB0cmF2ZXJzYWwsIGJlZm9yZSB0aGV5IGdldCBmcm96ZW4uXG5cbiAgICAgICAgLy8gT2JqZWN0IGFyZSB2ZXJpZmllZCBiZWZvcmUgYmVpbmcgZW5xdWV1ZWQsXG4gICAgICAgIC8vIHRoZXJlZm9yZSB0aGlzIGlzIGEgdmFsaWQgY2FuZGlkYXRlLlxuICAgICAgICAvLyBUaHJvd3MgaWYgdGhpcyBmYWlscyAoc3RyaWN0IG1vZGUpLlxuICAgICAgICAvLyBBbHNvIHRocm93cyBpZiB0aGUgb2JqZWN0IGlzIGFuIEFycmF5QnVmZmVyIG9yIGFueSBUeXBlZEFycmF5LlxuICAgICAgICBpZiggaXNUeXBlZEFycmF5KG9iaikpIHtcbiAgICAgICAgICBmcmVlemVUeXBlZEFycmF5KG9iaik7XG4gICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgZnJlZXplKG9iaik7XG4gICAgICAgICB9XG5cbiAgICAgICAgLy8gd2UgcmVseSB1cG9uIGNlcnRhaW4gY29tbWl0bWVudHMgb2YgT2JqZWN0LmZyZWV6ZSBhbmQgcHJveGllcyBoZXJlXG5cbiAgICAgICAgLy8gZ2V0IHN0YWJsZS9pbW11dGFibGUgb3V0Ym91bmQgbGlua3MgYmVmb3JlIGEgUHJveHkgaGFzIGEgY2hhbmNlIHRvIGRvXG4gICAgICAgIC8vIHNvbWV0aGluZyBzbmVha3kuXG4gICAgICAgIGNvbnN0IHBhdGg9ICB3ZWFrbWFwR2V0KHBhdGhzLCBvYmopfHwgICd1bmtub3duJztcbiAgICAgICAgY29uc3QgZGVzY3M9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iaik7XG4gICAgICAgIGNvbnN0IHByb3RvPSAgZ2V0UHJvdG90eXBlT2Yob2JqKTtcbiAgICAgICAgZW5xdWV1ZShwcm90bywgIGAke3BhdGh9Ll9fcHJvdG9fX2ApO1xuXG4gICAgICAgIGFycmF5Rm9yRWFjaChvd25LZXlzKGRlc2NzKSwgKC8qKiBAdHlwZSB7c3RyaW5nIHwgc3ltYm9sfSAqLyBuYW1lKT0+ICB7XG4gICAgICAgICAgY29uc3QgcGF0aG5hbWU9ICAgYCR7cGF0aH0uJHtTdHJpbmcobmFtZSl9YDtcbiAgICAgICAgICAvLyBUaGUgJ25hbWUnIG1heSBiZSBhIHN5bWJvbCwgYW5kIFR5cGVTY3JpcHQgZG9lc24ndCBsaWtlIHVzIHRvXG4gICAgICAgICAgLy8gaW5kZXggYXJiaXRyYXJ5IHN5bWJvbHMgb24gb2JqZWN0cywgc28gd2UgcHJldGVuZCB0aGV5J3JlIGp1c3RcbiAgICAgICAgICAvLyBzdHJpbmdzLlxuICAgICAgICAgIGNvbnN0IGRlc2M9ICBkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi8gIG5hbWVdO1xuICAgICAgICAgIC8vIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gd2VsbC1mb3JtZWRcbiAgICAgICAgICAvLyBkZXNjcmlwdG9ycywgYnV0IHRoZXkgc3RpbGwgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGUuIElmXG4gICAgICAgICAgLy8gc29tZW9uZSBoYXMgcG9pc29uZWQgT2JqZWN0LnByb3RvdHlwZSB0byBhZGQgJ3ZhbHVlJyBvciAnZ2V0J1xuICAgICAgICAgIC8vIHByb3BlcnRpZXMsIHRoZW4gYSBzaW1wbGUgJ2lmIChcInZhbHVlXCIgaW4gZGVzYyknIG9yICdkZXNjLnZhbHVlJ1xuICAgICAgICAgIC8vIHRlc3QgY291bGQgYmUgY29uZnVzZWQuIFdlIHVzZSBoYXNPd25Qcm9wZXJ0eSB0byBiZSBzdXJlIGFib3V0XG4gICAgICAgICAgLy8gd2hldGhlciAndmFsdWUnIGlzIHByZXNlbnQgb3Igbm90LCB3aGljaCB0ZWxscyB1cyBmb3Igc3VyZSB0aGF0XG4gICAgICAgICAgLy8gdGhpcyBpcyBhIGRhdGEgcHJvcGVydHkuXG4gICAgICAgICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KGRlc2MsICd2YWx1ZScpKSB7XG4gICAgICAgICAgICBlbnF1ZXVlKGRlc2MudmFsdWUsICBgJHtwYXRobmFtZX1gKTtcbiAgICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgZW5xdWV1ZShkZXNjLmdldCwgIGAke3BhdGhuYW1lfShnZXQpYCk7XG4gICAgICAgICAgICBlbnF1ZXVlKGRlc2Muc2V0LCAgYCR7cGF0aG5hbWV9KHNldClgKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgfSk7XG4gICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkZXF1ZXVlKCkge1xuICAgICAgICAvLyBOZXcgdmFsdWVzIGFkZGVkIGJlZm9yZSBmb3JFYWNoKCkgaGFzIGZpbmlzaGVkIHdpbGwgYmUgdmlzaXRlZC5cbiAgICAgICAgc2V0Rm9yRWFjaCh0b0ZyZWV6ZSwgZnJlZXplQW5kVHJhdmVyc2UpO1xuICAgICAgIH1cblxuICAgICAgLyoqIEBwYXJhbSB7YW55fSB2YWx1ZSAqL1xuICAgICAgZnVuY3Rpb24gbWFya0hhcmRlbmVkKHZhbHVlKSB7XG4gICAgICAgIHdlYWtzZXRBZGQoaGFyZGVuZWQsIHZhbHVlKTtcbiAgICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNvbW1pdCgpIHtcbiAgICAgICAgc2V0Rm9yRWFjaCh0b0ZyZWV6ZSwgbWFya0hhcmRlbmVkKTtcbiAgICAgICB9XG5cbiAgICAgIGVucXVldWUocm9vdCk7XG4gICAgICBkZXF1ZXVlKCk7XG4gICAgICAvLyBjb25zb2xlLndhcm4oXCJ0b0ZyZWV6ZSBzZXQ6XCIsIHRvRnJlZXplKTtcbiAgICAgIGNvbW1pdCgpO1xuXG4gICAgICByZXR1cm4gcm9vdDtcbiAgICAgfX07XG5cblxuICByZXR1cm4gaGFyZGVuO1xuIH07JGjigI1fb25jZS5tYWtlSGFyZGVuZXIobWFrZUhhcmRlbmVyKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzRdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRGF0ZSxUeXBlRXJyb3IsYXBwbHksY29uc3RydWN0LGRlZmluZVByb3BlcnRpZXM7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJEYXRlXCIsIFskaOKAjV9hID0+IChEYXRlID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiYXBwbHlcIiwgWyRo4oCNX2EgPT4gKGFwcGx5ID0gJGjigI1fYSldXSxbXCJjb25zdHJ1Y3RcIiwgWyRo4oCNX2EgPT4gKGNvbnN0cnVjdCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydGllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gICAgICAgICAgICAgICAgdGFtZURhdGVDb25zdHJ1Y3RvcihkYXRlVGFtaW5nPSAgJ3NhZmUnKSB7XG4gIGlmKCBkYXRlVGFtaW5nIT09ICAnc2FmZScmJiAgZGF0ZVRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIGRhdGVUYW1pbmcgJHtkYXRlVGFtaW5nfWApO1xuICAgfVxuICBjb25zdCBPcmlnaW5hbERhdGU9ICBEYXRlO1xuICBjb25zdCBEYXRlUHJvdG90eXBlPSAgT3JpZ2luYWxEYXRlLnByb3RvdHlwZTtcblxuICAvLyBVc2UgY29uY2lzZSBtZXRob2RzIHRvIG9idGFpbiBuYW1lZCBmdW5jdGlvbnMgd2l0aG91dCBjb25zdHJ1Y3RvcnMuXG4gIGNvbnN0IHRhbWVkTWV0aG9kcz0gIHtcbiAgICBub3coKSB7XG4gICAgICByZXR1cm4gTmFOO1xuICAgICB9fTtcblxuXG4gIC8vIFRhbWUgdGhlIERhdGUgY29uc3RydWN0b3IuXG4gIC8vIENvbW1vbiBiZWhhdmlvclxuICAvLyAgICogbmV3IERhdGUoeCkgY29lcmNlcyB4IGludG8gYSBudW1iZXIgYW5kIHRoZW4gcmV0dXJucyBhIERhdGVcbiAgLy8gICAgIGZvciB0aGF0IG51bWJlciBvZiBtaWxsaXMgc2luY2UgdGhlIGVwb2NoXG4gIC8vICAgKiBuZXcgRGF0ZShOYU4pIHJldHVybnMgYSBEYXRlIG9iamVjdCB3aGljaCBzdHJpbmdpZmllcyB0b1xuICAvLyAgICAgJ0ludmFsaWQgRGF0ZSdcbiAgLy8gICAqIG5ldyBEYXRlKHVuZGVmaW5lZCkgcmV0dXJucyBhIERhdGUgb2JqZWN0IHdoaWNoIHN0cmluZ2lmaWVzIHRvXG4gIC8vICAgICAnSW52YWxpZCBEYXRlJ1xuICAvLyBPcmlnaW5hbERhdGUgKG5vcm1hbCBzdGFuZGFyZCkgYmVoYXZpb3JcbiAgLy8gICAqIERhdGUoYW55dGhpbmcpIGdpdmVzIGEgc3RyaW5nIHdpdGggdGhlIGN1cnJlbnQgdGltZVxuICAvLyAgICogbmV3IERhdGUoKSByZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUsIGFzIGEgRGF0ZSBvYmplY3RcbiAgLy8gU2hhcmVkRGF0ZSBiZWhhdmlvclxuICAvLyAgICogRGF0ZShhbnl0aGluZykgcmV0dXJuZWQgJ0ludmFsaWQgRGF0ZSdcbiAgLy8gICAqIG5ldyBEYXRlKCkgcmV0dXJucyBhIERhdGUgb2JqZWN0IHdoaWNoIHN0cmluZ2lmaWVzIHRvXG4gIC8vICAgICAnSW52YWxpZCBEYXRlJ1xuICBjb25zdCBtYWtlRGF0ZUNvbnN0cnVjdG9yPSAgKHsgcG93ZXJzPSAgJ25vbmUnfT0gICB7fSk9PiAge1xuICAgIGxldCBSZXN1bHREYXRlO1xuICAgIGlmKCBwb3dlcnM9PT0gICdvcmlnaW5hbCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICAgIFJlc3VsdERhdGU9ICBmdW5jdGlvbiBEYXRlKC4uLnJlc3QpIHtcbiAgICAgICAgaWYoIG5ldy50YXJnZXQ9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBhcHBseShPcmlnaW5hbERhdGUsIHVuZGVmaW5lZCwgcmVzdCk7XG4gICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3QoT3JpZ2luYWxEYXRlLCByZXN0LCBuZXcudGFyZ2V0KTtcbiAgICAgICB9O1xuICAgICB9ZWxzZSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgICBSZXN1bHREYXRlPSAgZnVuY3Rpb24gRGF0ZSguLi5yZXN0KSB7XG4gICAgICAgIGlmKCBuZXcudGFyZ2V0PT09ICB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgRGF0ZSc7XG4gICAgICAgICB9XG4gICAgICAgIGlmKCByZXN0Lmxlbmd0aD09PSAgMCkge1xuICAgICAgICAgIHJlc3Q9ICBbTmFOXTtcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdChPcmlnaW5hbERhdGUsIHJlc3QsIG5ldy50YXJnZXQpO1xuICAgICAgIH07XG4gICAgIH1cblxuICAgIGRlZmluZVByb3BlcnRpZXMoUmVzdWx0RGF0ZSwge1xuICAgICAgbGVuZ3RoOiB7IHZhbHVlOiA3fSxcbiAgICAgIHByb3RvdHlwZToge1xuICAgICAgICB2YWx1ZTogRGF0ZVByb3RvdHlwZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX0sXG5cbiAgICAgIHBhcnNlOiB7XG4gICAgICAgIHZhbHVlOiBEYXRlLnBhcnNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG5cbiAgICAgIFVUQzoge1xuICAgICAgICB2YWx1ZTogRGF0ZS5VVEMsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cbiAgICByZXR1cm4gUmVzdWx0RGF0ZTtcbiAgIH07XG4gIGNvbnN0IEluaXRpYWxEYXRlPSAgbWFrZURhdGVDb25zdHJ1Y3Rvcih7IHBvd2VyczogJ29yaWdpbmFsJ30pO1xuICBjb25zdCBTaGFyZWREYXRlPSAgbWFrZURhdGVDb25zdHJ1Y3Rvcih7IHBvd2VyczogJ25vbmUnfSk7XG5cbiAgZGVmaW5lUHJvcGVydGllcyhJbml0aWFsRGF0ZSwge1xuICAgIG5vdzoge1xuICAgICAgdmFsdWU6IERhdGUubm93LFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG4gIGRlZmluZVByb3BlcnRpZXMoU2hhcmVkRGF0ZSwge1xuICAgIG5vdzoge1xuICAgICAgdmFsdWU6IHRhbWVkTWV0aG9kcy5ub3csXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cblxuICBkZWZpbmVQcm9wZXJ0aWVzKERhdGVQcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogU2hhcmVkRGF0ZX19KTtcblxuXG4gIHJldHVybiB7XG4gICAgJyVJbml0aWFsRGF0ZSUnOiBJbml0aWFsRGF0ZSxcbiAgICAnJVNoYXJlZERhdGUlJzogU2hhcmVkRGF0ZX07XG5cbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgdGFtZURhdGVDb25zdHJ1Y3Rvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzM1XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFR5cGVFcnJvcixnbG9iYWxUaGlzLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixkZWZpbmVQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJnbG9iYWxUaGlzXCIsIFskaOKAjV9hID0+IChnbG9iYWxUaGlzID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhbWVEb21haW5zLCAnbmFtZScsIHt2YWx1ZTogXCJ0YW1lRG9tYWluc1wifSk7JGjigI1fb25jZS50YW1lRG9tYWlucyh0YW1lRG9tYWlucyk7ICAgXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gICAgICAgIHRhbWVEb21haW5zKGRvbWFpblRhbWluZz0gICdzYWZlJykge1xuICBpZiggZG9tYWluVGFtaW5nIT09ICAnc2FmZScmJiAgZG9tYWluVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgZG9tYWluVGFtaW5nICR7ZG9tYWluVGFtaW5nfWApO1xuICAgfVxuXG4gIGlmKCBkb21haW5UYW1pbmc9PT0gICd1bnNhZmUnKSB7XG4gICAgcmV0dXJuO1xuICAgfVxuXG4gIC8vIFByb3RlY3QgYWdhaW5zdCB0aGUgaGF6YXJkIHByZXNlbnRlZCBieSBOb2RlLmpzIGRvbWFpbnMuXG4gIGlmKCB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzPT09ICAnb2JqZWN0JyYmICBnbG9iYWxUaGlzLnByb2Nlc3MhPT0gIG51bGwpIHtcbiAgICAvLyBDaGVjayB3aGV0aGVyIGRvbWFpbnMgd2VyZSBpbml0aWFsaXplZC5cbiAgICBjb25zdCBkb21haW5EZXNjcmlwdG9yPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLFxuICAgICAgJ2RvbWFpbicpO1xuXG4gICAgaWYoIGRvbWFpbkRlc2NyaXB0b3IhPT0gIHVuZGVmaW5lZCYmICBkb21haW5EZXNjcmlwdG9yLmdldCE9PSAgdW5kZWZpbmVkKSB7XG4gICAgICAvLyBUaGUgZG9tYWluIGRlc2NyaXB0b3Igb24gTm9kZS5qcyBpbml0aWFsbHkgaGFzIHZhbHVlOiBudWxsLCB3aGljaFxuICAgICAgLy8gYmVjb21lcyBhIGdldCwgc2V0IHBhaXIgYWZ0ZXIgZG9tYWlucyBpbml0aWFsaXplLlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgIGBTRVMgZmFpbGVkIHRvIGxvY2tkb3duLCBOb2RlLmpzIGRvbWFpbnMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIChTRVNfTk9fRE9NQUlOUylgKTtcblxuICAgICB9XG4gICAgLy8gUHJldmVudCBkb21haW5zIGZyb20gaW5pdGlhbGl6aW5nLlxuICAgIC8vIFRoaXMgaXMgY2x1bmt5IGJlY2F1c2UgdGhlIGV4Y2VwdGlvbiB0aHJvd24gZnJvbSB0aGUgZG9tYWlucyBwYWNrYWdlIGRvZXNcbiAgICAvLyBub3QgZGlyZWN0IHRoZSB1c2VyJ3MgZ2F6ZSB0b3dhcmQgYSBrbm93bGVkZ2UgYmFzZSBhYm91dCB0aGUgcHJvYmxlbS5cbiAgICAvLyBUaGUgZG9tYWluIG1vZHVsZSBtZXJlbHkgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGF0dGVtcHRzIHRvIGRlZmluZVxuICAgIC8vIHRoZSBkb21haW4gcHJvcGVydHkgb2YgdGhlIHByb2Nlc3MgZ2xvYmFsIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24uXG4gICAgLy8gV2UgaGF2ZSBubyBiZXR0ZXIgcmVjb3Vyc2UgYmVjYXVzZSBOb2RlLmpzIHVzZXMgZGVmaW5lUHJvcGVydHkgdG9vLlxuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMucHJvY2VzcywgJ2RvbWFpbicsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlfSk7XG5cbiAgIH1cbiB9XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzM2XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZFUkFMX0ZVTkNUSU9OLFN5bnRheEVycm9yLFR5cGVFcnJvcixkZWZpbmVQcm9wZXJ0aWVzLGdldFByb3RvdHlwZU9mLHNldFByb3RvdHlwZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiRkVSQUxfRlVOQ1RJT05cIiwgWyRo4oCNX2EgPT4gKEZFUkFMX0ZVTkNUSU9OID0gJGjigI1fYSldXSxbXCJTeW50YXhFcnJvclwiLCBbJGjigI1fYSA9PiAoU3ludGF4RXJyb3IgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJnZXRQcm90b3R5cGVPZlwiLCBbJGjigI1fYSA9PiAoZ2V0UHJvdG90eXBlT2YgPSAkaOKAjV9hKV1dLFtcInNldFByb3RvdHlwZU9mXCIsIFskaOKAjV9hID0+IChzZXRQcm90b3R5cGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8vIFRoaXMgbW9kdWxlIHJlcGxhY2VzIHRoZSBvcmlnaW5hbCBgRnVuY3Rpb25gIGNvbnN0cnVjdG9yLCBhbmQgdGhlIG9yaWdpbmFsXG4vLyBgJUdlbmVyYXRvckZ1bmN0aW9uJWAsIGAlQXN5bmNGdW5jdGlvbiVgIGFuZCBgJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lYCxcbi8vIHdpdGggc2FmZSByZXBsYWNlbWVudHMgdGhhdCB0aHJvdyBpZiBpbnZva2VkLlxuLy9cbi8vIFRoZXNlIGFyZSBhbGwgcmVhY2hhYmxlIHZpYSBzeW50YXgsIHNvIGl0IGlzbid0IHN1ZmZpY2llbnQgdG8ganVzdFxuLy8gcmVwbGFjZSBnbG9iYWwgcHJvcGVydGllcyB3aXRoIHNhZmUgdmVyc2lvbnMuIE91ciBtYWluIGdvYWwgaXMgdG8gcHJldmVudFxuLy8gYWNjZXNzIHRvIHRoZSBgRnVuY3Rpb25gIGNvbnN0cnVjdG9yIHRocm91Z2ggdGhlc2Ugc3RhcnRpbmcgcG9pbnRzLlxuLy9cbi8vIEFmdGVyIG1vZHVsZXMgYmxvY2sgaXMgZG9uZSwgdGhlIG9yaWdpbmFscyBtdXN0IG5vIGxvbmdlciBiZSByZWFjaGFibGUsXG4vLyB1bmxlc3MgYSBjb3B5IGhhcyBiZWVuIG1hZGUsIGFuZCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSBzeW50YXhcbi8vICh1c2luZyBldmFsKSBvciBieSBpbnZva2luZyBhIHByZXZpb3VzbHkgc2F2ZWQgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbHMuXG4vL1xuLy8gVHlwaWNhbGx5LCB0aGlzIG1vZHVsZSB3aWxsIG5vdCBiZSB1c2VkIGRpcmVjdGx5LCBidXQgdmlhIHRoZVxuLy8gW2xvY2tkb3duIC0gc2hpbV0gd2hpY2ggaGFuZGxlcyBhbGwgbmVjZXNzYXJ5IHJlcGFpcnMgYW5kIHRhbWluZyBpbiBTRVMuXG4vL1xuLy8gUmVsYXRpb24gdG8gRUNNQSBzcGVjaWZpY2F0aW9uc1xuLy9cbi8vIFRoZSB0YW1pbmcgb2YgY29uc3RydWN0b3JzIHJlYWxseSB3YW50cyB0byBiZSBwYXJ0IG9mIHRoZSBzdGFuZGFyZCwgYmVjYXVzZVxuLy8gbmV3IGNvbnN0cnVjdG9ycyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSwgcmVhY2hhYmxlIGZyb20gc3ludGF4LCBhbmQgdGhpc1xuLy8gbGlzdCBtdXN0IGJlIHVwZGF0ZWQgdG8gbWF0Y2guXG4vL1xuLy8gSW4gYWRkaXRpb24sIHRoZSBzdGFuZGFyZCBuZWVkcyB0byBkZWZpbmUgZm91ciBuZXcgaW50cmluc2ljcyBmb3IgdGhlIHNhZmVcbi8vIHJlcGxhY2VtZW50IGZ1bmN0aW9ucy4gU2VlIFsuL3doaXRlbGlzdCBpbnRyaW5zaWNzXS5cbi8vXG4vLyBBZGFwdGVkIGZyb20gU0VTL0NhamFcbi8vIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jYWphL2Jsb2IvbWFzdGVyL3NyYy9jb20vZ29vZ2xlL2NhamEvc2VzL3N0YXJ0U0VTLmpzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2NhamEvYmxvYi9tYXN0ZXIvc3JjL2NvbS9nb29nbGUvY2FqYS9zZXMvcmVwYWlyRVM1LmpzXG5cbi8qKlxuICogdGFtZUZ1bmN0aW9uQ29uc3RydWN0b3JzKClcbiAqIFRoaXMgYmxvY2sgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIEZ1bmN0aW9uIGNvbnN0cnVjdG9yLCBhbmQgdGhlIG9yaWdpbmFsXG4gKiAlR2VuZXJhdG9yRnVuY3Rpb24lICVBc3luY0Z1bmN0aW9uJSBhbmQgJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lLCB3aXRoXG4gKiBzYWZlIHJlcGxhY2VtZW50cyB0aGF0IHRocm93IGlmIGludm9rZWQuXG4gKi9cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIHRhbWVGdW5jdGlvbkNvbnN0cnVjdG9ycygpIHtcbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgbWV0aG9kIGlzIG5vdCBjYWxsYWJsZS5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIEZFUkFMX0ZVTkNUSU9OLnByb3RvdHlwZS5jb25zdHJ1Y3RvcigncmV0dXJuIDEnKTtcbiAgIH1jYXRjaCggaWdub3JlKSB7XG4gICAgLy8gVGhyb3dzLCBubyBuZWVkIHRvIHBhdGNoLlxuICAgIHJldHVybiBoYXJkZW4oe30pO1xuICAgfVxuXG4gIGNvbnN0IG5ld0ludHJpbnNpY3M9ICB7fTtcblxuICAvKlxuICAgKiBUaGUgcHJvY2VzcyB0byByZXBhaXIgY29uc3RydWN0b3JzOlxuICAgKiAxLiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGZ1bmN0aW9uIGJ5IGV2YWx1YXRpbmcgc3ludGF4XG4gICAqIDIuIE9idGFpbiB0aGUgcHJvdG90eXBlIGZyb20gdGhlIGluc3RhbmNlXG4gICAqIDMuIENyZWF0ZSBhIHN1YnN0aXR1dGUgdGFtZWQgY29uc3RydWN0b3JcbiAgICogNC4gUmVwbGFjZSB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3Igd2l0aCB0aGUgdGFtZWQgY29uc3RydWN0b3JcbiAgICogNS4gUmVwbGFjZSB0YW1lZCBjb25zdHJ1Y3RvciBwcm90b3R5cGUgcHJvcGVydHkgd2l0aCB0aGUgb3JpZ2luYWwgb25lXG4gICAqIDYuIFJlcGxhY2UgaXRzIFtbUHJvdG90eXBlXV0gc2xvdCB3aXRoIHRoZSB0YW1lZCBjb25zdHJ1Y3RvciBvZiBGdW5jdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gcmVwYWlyRnVuY3Rpb24obmFtZSwgaW50cmluc2ljTmFtZSwgZGVjbGFyYXRpb24pIHtcbiAgICBsZXQgRnVuY3Rpb25JbnN0YW5jZTtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWV2YWwsIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgICAgRnVuY3Rpb25JbnN0YW5jZT0gICgwLCBldmFsKShkZWNsYXJhdGlvbik7XG4gICAgIH1jYXRjaCggZSkge1xuICAgICAgaWYoIGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICAvLyBQcmV2ZW50IGZhaWx1cmUgb24gcGxhdGZvcm1zIHdoZXJlIGFzeW5jIGFuZC9vciBnZW5lcmF0b3JzXG4gICAgICAgIC8vIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICByZXR1cm47XG4gICAgICAgfVxuICAgICAgLy8gUmUtdGhyb3dcbiAgICAgIHRocm93IGU7XG4gICAgIH1cbiAgICBjb25zdCBGdW5jdGlvblByb3RvdHlwZT0gIGdldFByb3RvdHlwZU9mKEZ1bmN0aW9uSW5zdGFuY2UpO1xuXG4gICAgLy8gUHJldmVudHMgdGhlIGV2YWx1YXRpb24gb2Ygc291cmNlIHdoZW4gY2FsbGluZyBjb25zdHJ1Y3RvciBvbiB0aGVcbiAgICAvLyBwcm90b3R5cGUgb2YgZnVuY3Rpb25zLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgY29uc3QgSW5lcnRDb25zdHJ1Y3Rvcj0gIGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0Z1bmN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciBpcyBub3QgYSB2YWxpZCBjb25zdHJ1Y3Rvci4nKTtcblxuICAgICB9O1xuICAgIGRlZmluZVByb3BlcnRpZXMoSW5lcnRDb25zdHJ1Y3Rvciwge1xuICAgICAgcHJvdG90eXBlOiB7IHZhbHVlOiBGdW5jdGlvblByb3RvdHlwZX0sXG4gICAgICBuYW1lOiB7XG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuXG4gICAgZGVmaW5lUHJvcGVydGllcyhGdW5jdGlvblByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IEluZXJ0Q29uc3RydWN0b3J9fSk7XG5cblxuICAgIC8vIFJlY29uc3RydWN0cyB0aGUgaW5oZXJpdGFuY2UgYW1vbmcgdGhlIG5ldyB0YW1lZCBjb25zdHJ1Y3RvcnNcbiAgICAvLyB0byBtaXJyb3IgdGhlIG9yaWdpbmFsIHNwZWNpZmllZCBpbiBub3JtYWwgSlMuXG4gICAgaWYoIEluZXJ0Q29uc3RydWN0b3IhPT0gIEZFUkFMX0ZVTkNUSU9OLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcikge1xuICAgICAgc2V0UHJvdG90eXBlT2YoSW5lcnRDb25zdHJ1Y3RvciwgRkVSQUxfRlVOQ1RJT04ucHJvdG90eXBlLmNvbnN0cnVjdG9yKTtcbiAgICAgfVxuXG4gICAgbmV3SW50cmluc2ljc1tpbnRyaW5zaWNOYW1lXT0gIEluZXJ0Q29uc3RydWN0b3I7XG4gICB9XG5cbiAgLy8gSGVyZSwgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbiBpcyBpbXBvcnRhbnQ6IEZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJlcGFpcmVkXG4gIC8vIGZpcnN0IHNpbmNlIHRoZSBvdGhlciByZXBhaXJlZCBjb25zdHJ1Y3RvcnMgbmVlZCB0byBpbmhlcml0IGZyb20gdGhlXG4gIC8vIHRhbWVkIEZ1bmN0aW9uIGZ1bmN0aW9uIGNvbnN0cnVjdG9yLlxuXG4gIHJlcGFpckZ1bmN0aW9uKCdGdW5jdGlvbicsICclSW5lcnRGdW5jdGlvbiUnLCAnKGZ1bmN0aW9uKCl7fSknKTtcbiAgcmVwYWlyRnVuY3Rpb24oXG4gICAgJ0dlbmVyYXRvckZ1bmN0aW9uJyxcbiAgICAnJUluZXJ0R2VuZXJhdG9yRnVuY3Rpb24lJyxcbiAgICAnKGZ1bmN0aW9uKigpe30pJyk7XG5cbiAgcmVwYWlyRnVuY3Rpb24oXG4gICAgJ0FzeW5jRnVuY3Rpb24nLFxuICAgICclSW5lcnRBc3luY0Z1bmN0aW9uJScsXG4gICAgJyhhc3luYyBmdW5jdGlvbigpe30pJyk7XG5cbiAgcmVwYWlyRnVuY3Rpb24oXG4gICAgJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLFxuICAgICclSW5lcnRBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScsXG4gICAgJyhhc3luYyBmdW5jdGlvbiooKXt9KScpO1xuXG5cbiAgcmV0dXJuIG5ld0ludHJpbnNpY3M7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIHRhbWVGdW5jdGlvbkNvbnN0cnVjdG9ycyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzM3XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFdlYWtTZXQsZGVmaW5lUHJvcGVydHksZnJlZXplLGZ1bmN0aW9uUHJvdG90eXBlLGZ1bmN0aW9uVG9TdHJpbmcsc3RyaW5nRW5kc1dpdGgsd2Vha3NldEFkZCx3ZWFrc2V0SGFzOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiV2Vha1NldFwiLCBbJGjigI1fYSA9PiAoV2Vha1NldCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wiZnVuY3Rpb25Qcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGZ1bmN0aW9uUHJvdG90eXBlID0gJGjigI1fYSldXSxbXCJmdW5jdGlvblRvU3RyaW5nXCIsIFskaOKAjV9hID0+IChmdW5jdGlvblRvU3RyaW5nID0gJGjigI1fYSldXSxbXCJzdHJpbmdFbmRzV2l0aFwiLCBbJGjigI1fYSA9PiAoc3RyaW5nRW5kc1dpdGggPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRBZGRcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRBZGQgPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRIYXNcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRIYXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgbmF0aXZlU3VmZml4PSAgJykgeyBbbmF0aXZlIGNvZGVdIH0nO1xuXG4vLyBOb3RlOiBUb3AgbGV2ZWwgbXV0YWJsZSBzdGF0ZS4gRG9lcyBub3QgbWFrZSBhbnl0aGluZyB3b3JzZSwgc2luY2UgdGhlXG4vLyBwYXRjaGluZyBvZiBgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nYCBpcyBhbHNvIGdsb2JhbGx5IHN0YXRlZnVsLiBXZVxuLy8gdXNlIHRoaXMgdG9wIGxldmVsIHN0YXRlIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdG8gYHRhbWVGdW5jdGlvblRvU3RyaW5nYCBhcmVcbi8vIGlkZW1wb3RlbnQsIHJhdGhlciB0aGFuIGNyZWF0aW5nIHJlZHVuZGFudCBpbmRpcmVjdGlvbnMuXG5sZXQgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb247XG5cbi8qKlxuICogUmVwbGFjZSBgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nYCB3aXRoIG9uZSB0aGF0IHJlY29nbml6ZXNcbiAqIHNoaW1tZWQgZnVuY3Rpb25zIGFzIGhvbm9yYXJ5IG5hdGl2ZSBmdW5jdGlvbnMuXG4gKi9cbmNvbnN0ICAgICAgICB0YW1lRnVuY3Rpb25Ub1N0cmluZz0gICgpPT4gIHtcbiAgaWYoIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uPT09ICB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB2aXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9ucz0gIG5ldyBXZWFrU2V0KCk7XG5cbiAgICBjb25zdCB0YW1pbmdNZXRob2RzPSAge1xuICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHN0cj0gIGZ1bmN0aW9uVG9TdHJpbmcodGhpcywgW10pO1xuICAgICAgICBpZihcbiAgICAgICAgICBzdHJpbmdFbmRzV2l0aChzdHIsIG5hdGl2ZVN1ZmZpeCl8fFxuICAgICAgICAgICF3ZWFrc2V0SGFzKHZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb25zLCB0aGlzKSlcbiAgICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuICBgZnVuY3Rpb24gJHt0aGlzLm5hbWV9KCkgeyBbbmF0aXZlIGNvZGVdIH1gO1xuICAgICAgIH19O1xuXG5cbiAgICBkZWZpbmVQcm9wZXJ0eShmdW5jdGlvblByb3RvdHlwZSwgJ3RvU3RyaW5nJywge1xuICAgICAgdmFsdWU6IHRhbWluZ01ldGhvZHMudG9TdHJpbmd9KTtcblxuXG4gICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb249ICBmcmVlemUoKGZ1bmMpPT5cbiAgICAgIHdlYWtzZXRBZGQodmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbnMsIGZ1bmMpKTtcblxuICAgfVxuICByZXR1cm4gbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb247XG4gfTskaOKAjV9vbmNlLnRhbWVGdW5jdGlvblRvU3RyaW5nKHRhbWVGdW5jdGlvblRvU3RyaW5nKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzhdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTnVtYmVyLFN0cmluZyxUeXBlRXJyb3IsZGVmaW5lUHJvcGVydHksZ2V0T3duUHJvcGVydHlOYW1lcyxpc09iamVjdCxyZWdleHBFeGVjLGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIk51bWJlclwiLCBbJGjigI1fYSA9PiAoTnVtYmVyID0gJGjigI1fYSldXSxbXCJTdHJpbmdcIiwgWyRo4oCNX2EgPT4gKFN0cmluZyA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnR5XCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlOYW1lc1wiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlOYW1lcyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJyZWdleHBFeGVjXCIsIFskaOKAjV9hID0+IChyZWdleHBFeGVjID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IEZhaWwsIHF1b3RlOiBxfT0gICBhc3NlcnQ7XG5cbmNvbnN0IGxvY2FsZVBhdHRlcm49ICAvXihcXHcqW2Etel0pTG9jYWxlKFtBLVpdXFx3KikkLztcblxuLy8gVXNlIGNvbmNpc2UgbWV0aG9kcyB0byBvYnRhaW4gbmFtZWQgZnVuY3Rpb25zIHdpdGhvdXQgY29uc3RydWN0b3Jcbi8vIGJlaGF2aW9yIG9yIGAucHJvdG90eXBlYCBwcm9wZXJ0eS5cbmNvbnN0IHRhbWVkTWV0aG9kcz0gIHtcbiAgLy8gU2VlIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5sb2NhbGVjb21wYXJlXG4gIGxvY2FsZUNvbXBhcmUodGhhdCkge1xuICAgIGlmKCB0aGlzPT09ICBudWxsfHwgIHRoaXM9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBsb2NhbGVDb21wYXJlIHdpdGggbnVsbCBvciB1bmRlZmluZWQgXCJ0aGlzXCIgdmFsdWUnKTtcblxuICAgICB9XG4gICAgY29uc3Qgcz0gICBgJHt0aGlzfWA7XG4gICAgdGhhdD0gICBgJHt0aGF0fWA7XG4gICAgaWYoIHM8ICB0aGF0KSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgIH1cbiAgICBpZiggcz4gIHRoYXQpIHtcbiAgICAgIHJldHVybiAxO1xuICAgICB9XG4gICAgcz09PSAgdGhhdHx8ICBGYWlsIGBleHBlY3RlZCAke3Eocyl9IGFuZCAke3EodGhhdCl9IHRvIGNvbXBhcmVgO1xuICAgIHJldHVybiAwO1xuICAgfSxcblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gIGAke3RoaXN9YDtcbiAgIH19O1xuXG5cbmNvbnN0IG5vbkxvY2FsZUNvbXBhcmU9ICB0YW1lZE1ldGhvZHMubG9jYWxlQ29tcGFyZTtcbmNvbnN0IG51bWJlclRvU3RyaW5nPSAgdGFtZWRNZXRob2RzLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiAgICAgICAgICAgICAgICB0YW1lTG9jYWxlTWV0aG9kcyhpbnRyaW5zaWNzLCBsb2NhbGVUYW1pbmc9ICAnc2FmZScpIHtcbiAgaWYoIGxvY2FsZVRhbWluZyE9PSAgJ3NhZmUnJiYgIGxvY2FsZVRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIGxvY2FsZVRhbWluZyAke2xvY2FsZVRhbWluZ31gKTtcbiAgIH1cbiAgaWYoIGxvY2FsZVRhbWluZz09PSAgJ3Vuc2FmZScpIHtcbiAgICByZXR1cm47XG4gICB9XG5cbiAgZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSwgJ2xvY2FsZUNvbXBhcmUnLCB7XG4gICAgdmFsdWU6IG5vbkxvY2FsZUNvbXBhcmV9KTtcblxuXG4gIGZvciggY29uc3QgaW50cmluc2ljTmFtZSBvZiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGludHJpbnNpY3MpKSB7XG4gICAgY29uc3QgaW50cmluc2ljPSAgaW50cmluc2ljc1tpbnRyaW5zaWNOYW1lXTtcbiAgICBpZiggaXNPYmplY3QoaW50cmluc2ljKSkge1xuICAgICAgZm9yKCBjb25zdCBtZXRob2ROYW1lIG9mIGdldE93blByb3BlcnR5TmFtZXMoaW50cmluc2ljKSkge1xuICAgICAgICBjb25zdCBtYXRjaD0gIHJlZ2V4cEV4ZWMobG9jYWxlUGF0dGVybiwgbWV0aG9kTmFtZSk7XG4gICAgICAgIGlmKCBtYXRjaCkge1xuICAgICAgICAgIHR5cGVvZiBpbnRyaW5zaWNbbWV0aG9kTmFtZV09PT0gICdmdW5jdGlvbid8fFxuICAgICAgICAgICAgRmFpbCBgZXhwZWN0ZWQgJHtxKG1ldGhvZE5hbWUpfSB0byBiZSBhIGZ1bmN0aW9uYDtcbiAgICAgICAgICBjb25zdCBub25Mb2NhbGVNZXRob2ROYW1lPSAgIGAke21hdGNoWzFdfSR7bWF0Y2hbMl19YDtcbiAgICAgICAgICBjb25zdCBtZXRob2Q9ICBpbnRyaW5zaWNbbm9uTG9jYWxlTWV0aG9kTmFtZV07XG4gICAgICAgICAgdHlwZW9mIG1ldGhvZD09PSAgJ2Z1bmN0aW9uJ3x8XG4gICAgICAgICAgICBGYWlsIGBmdW5jdGlvbiAke3Eobm9uTG9jYWxlTWV0aG9kTmFtZSl9IG5vdCBmb3VuZGA7XG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkoaW50cmluc2ljLCBtZXRob2ROYW1lLCB7IHZhbHVlOiBtZXRob2R9KTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICAvLyBOdW1iZXJzIGFyZSBzcGVjaWFsIGJlY2F1c2UgdG9TdHJpbmcgYWNjZXB0cyBhIHJhZGl4IGluc3RlYWQgb2YgaWdub3JpbmdcbiAgLy8gYWxsIG9mIHRoZSBhcmd1bWVudHMgdGhhdCB3ZSB3b3VsZCBvdGhlcndpc2UgZm9yd2FyZC5cbiAgZGVmaW5lUHJvcGVydHkoTnVtYmVyLnByb3RvdHlwZSwgJ3RvTG9jYWxlU3RyaW5nJywge1xuICAgIHZhbHVlOiBudW1iZXJUb1N0cmluZ30pO1xuXG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIHRhbWVMb2NhbGVNZXRob2RzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzldID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTWF0aCxUeXBlRXJyb3IsY3JlYXRlLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsb2JqZWN0UHJvdG90eXBlOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiTWF0aFwiLCBbJGjigI1fYSA9PiAoTWF0aCA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImNyZWF0ZVwiLCBbJGjigI1fYSA9PiAoY3JlYXRlID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gJGjigI1fYSldXSxbXCJvYmplY3RQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKG9iamVjdFByb3RvdHlwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiAgICAgICAgICAgICAgICB0YW1lTWF0aE9iamVjdChtYXRoVGFtaW5nPSAgJ3NhZmUnKSB7XG4gIGlmKCBtYXRoVGFtaW5nIT09ICAnc2FmZScmJiAgbWF0aFRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIG1hdGhUYW1pbmcgJHttYXRoVGFtaW5nfWApO1xuICAgfVxuICBjb25zdCBvcmlnaW5hbE1hdGg9ICBNYXRoO1xuICBjb25zdCBpbml0aWFsTWF0aD0gIG9yaWdpbmFsTWF0aDsgLy8gdG8gZm9sbG93IHRoZSBuYW1pbmcgcGF0dGVyblxuXG4gIGNvbnN0IHsgcmFuZG9tOiBfLCAuLi5vdGhlckRlc2NyaXB0b3JzfT0gICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKFxuICAgIG9yaWdpbmFsTWF0aCk7XG5cblxuICBjb25zdCBzaGFyZWRNYXRoPSAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwgb3RoZXJEZXNjcmlwdG9ycyk7XG5cbiAgcmV0dXJuIHtcbiAgICAnJUluaXRpYWxNYXRoJSc6IGluaXRpYWxNYXRoLFxuICAgICclU2hhcmVkTWF0aCUnOiBzaGFyZWRNYXRofTtcblxuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICB0YW1lTWF0aE9iamVjdCk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzQwXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZFUkFMX1JFR19FWFAsVHlwZUVycm9yLGNvbnN0cnVjdCxkZWZpbmVQcm9wZXJ0aWVzLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixzcGVjaWVzU3ltYm9sOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiRkVSQUxfUkVHX0VYUFwiLCBbJGjigI1fYSA9PiAoRkVSQUxfUkVHX0VYUCA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImNvbnN0cnVjdFwiLCBbJGjigI1fYSA9PiAoY29uc3RydWN0ID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wic3BlY2llc1N5bWJvbFwiLCBbJGjigI1fYSA9PiAoc3BlY2llc1N5bWJvbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIHRhbWVSZWdFeHBDb25zdHJ1Y3RvcihyZWdFeHBUYW1pbmc9ICAnc2FmZScpIHtcbiAgaWYoIHJlZ0V4cFRhbWluZyE9PSAgJ3NhZmUnJiYgIHJlZ0V4cFRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIHJlZ0V4cFRhbWluZyAke3JlZ0V4cFRhbWluZ31gKTtcbiAgIH1cbiAgY29uc3QgUmVnRXhwUHJvdG90eXBlPSAgRkVSQUxfUkVHX0VYUC5wcm90b3R5cGU7XG5cbiAgY29uc3QgbWFrZVJlZ0V4cENvbnN0cnVjdG9yPSAgKF89ICB7fSk9PiAge1xuICAgIC8vIFJlZ0V4cCBoYXMgbm9uLXdyaXRhYmxlIHN0YXRpYyBwcm9wZXJ0aWVzIHdlIG5lZWQgdG8gb21pdC5cbiAgICBjb25zdCBSZXN1bHRSZWdFeHA9ICBmdW5jdGlvbiBSZWdFeHAoLi4ucmVzdCkge1xuICAgICAgaWYoIG5ldy50YXJnZXQ9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gRkVSQUxfUkVHX0VYUCguLi5yZXN0KTtcbiAgICAgICB9XG4gICAgICByZXR1cm4gY29uc3RydWN0KEZFUkFMX1JFR19FWFAsIHJlc3QsIG5ldy50YXJnZXQpO1xuICAgICB9O1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhSZXN1bHRSZWdFeHAsIHtcbiAgICAgIGxlbmd0aDogeyB2YWx1ZTogMn0sXG4gICAgICBwcm90b3R5cGU6IHtcbiAgICAgICAgdmFsdWU6IFJlZ0V4cFByb3RvdHlwZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX0sXG5cbiAgICAgIFtzcGVjaWVzU3ltYm9sXTogZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEZFUkFMX1JFR19FWFAsIHNwZWNpZXNTeW1ib2wpfSk7XG5cbiAgICByZXR1cm4gUmVzdWx0UmVnRXhwO1xuICAgfTtcblxuICBjb25zdCBJbml0aWFsUmVnRXhwPSAgbWFrZVJlZ0V4cENvbnN0cnVjdG9yKCk7XG4gIGNvbnN0IFNoYXJlZFJlZ0V4cD0gIG1ha2VSZWdFeHBDb25zdHJ1Y3RvcigpO1xuXG4gIGlmKCByZWdFeHBUYW1pbmchPT0gICd1bnNhZmUnKSB7XG4gICAgZGVsZXRlIFJlZ0V4cFByb3RvdHlwZS5jb21waWxlO1xuICAgfVxuICBkZWZpbmVQcm9wZXJ0aWVzKFJlZ0V4cFByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBTaGFyZWRSZWdFeHB9fSk7XG5cblxuICByZXR1cm4ge1xuICAgICclSW5pdGlhbFJlZ0V4cCUnOiBJbml0aWFsUmVnRXhwLFxuICAgICclU2hhcmVkUmVnRXhwJSc6IFNoYXJlZFJlZ0V4cH07XG5cbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgdGFtZVJlZ0V4cENvbnN0cnVjdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbNDFdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgd2hpdGVsaXN0LEZ1bmN0aW9uSW5zdGFuY2UsaXNBY2Nlc3NvclBlcm1pdCxNYXAsU3RyaW5nLFR5cGVFcnJvcixhcnJheUZpbHRlcixhcnJheUluY2x1ZGVzLGFycmF5TWFwLGVudHJpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGdldFByb3RvdHlwZU9mLGlzT2JqZWN0LG1hcEdldCxvYmplY3RIYXNPd25Qcm9wZXJ0eSxvd25LZXlzLHN5bWJvbEtleUZvcjskaOKAjV9pbXBvcnRzKFtbXCIuL3doaXRlbGlzdC5qc1wiLCBbW1wid2hpdGVsaXN0XCIsIFskaOKAjV9hID0+ICh3aGl0ZWxpc3QgPSAkaOKAjV9hKV1dLFtcIkZ1bmN0aW9uSW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKEZ1bmN0aW9uSW5zdGFuY2UgPSAkaOKAjV9hKV1dLFtcImlzQWNjZXNzb3JQZXJtaXRcIiwgWyRo4oCNX2EgPT4gKGlzQWNjZXNzb3JQZXJtaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21tb25zLmpzXCIsIFtbXCJNYXBcIiwgWyRo4oCNX2EgPT4gKE1hcCA9ICRo4oCNX2EpXV0sW1wiU3RyaW5nXCIsIFskaOKAjV9hID0+IChTdHJpbmcgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhcnJheUZpbHRlclwiLCBbJGjigI1fYSA9PiAoYXJyYXlGaWx0ZXIgPSAkaOKAjV9hKV1dLFtcImFycmF5SW5jbHVkZXNcIiwgWyRo4oCNX2EgPT4gKGFycmF5SW5jbHVkZXMgPSAkaOKAjV9hKV1dLFtcImFycmF5TWFwXCIsIFskaOKAjV9hID0+IChhcnJheU1hcCA9ICRo4oCNX2EpXV0sW1wiZW50cmllc1wiLCBbJGjigI1fYSA9PiAoZW50cmllcyA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAkaOKAjV9hKV1dLFtcImdldFByb3RvdHlwZU9mXCIsIFskaOKAjV9hID0+IChnZXRQcm90b3R5cGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYXBHZXRcIiwgWyRo4oCNX2EgPT4gKG1hcEdldCA9ICRo4oCNX2EpXV0sW1wib2JqZWN0SGFzT3duUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKG9iamVjdEhhc093blByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJvd25LZXlzXCIsIFskaOKAjV9hID0+IChvd25LZXlzID0gJGjigI1fYSldXSxbXCJzeW1ib2xLZXlGb3JcIiwgWyRo4oCNX2EgPT4gKHN5bWJvbEtleUZvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogd2hpdGVsaXN0SW50cmluc2ljcygpXG4gKiBSZW1vdmVzIGFsbCBub24tYWxsb3dlZCBwcm9wZXJ0aWVzIGZvdW5kIGJ5IHJlY3Vyc2l2ZWx5IGFuZFxuICogcmVmbGVjdGl2ZWx5IHdhbGtpbmcgb3duIHByb3BlcnR5IGNoYWlucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaW50cmluc2ljc1xuICogQHBhcmFtIHsoT2JqZWN0KSA9PiB2b2lkfSBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvblxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICB3aGl0ZWxpc3RJbnRyaW5zaWNzKFxuICBpbnRyaW5zaWNzLFxuICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbilcbiAge1xuICAvLyBUaGVzZSBwcmltaXRpdmVzIGFyZSBhbGxvd2VkIGFsbG93ZWQgZm9yIHBlcm1pdHMuXG4gIGNvbnN0IHByaW1pdGl2ZXM9ICBbJ3VuZGVmaW5lZCcsICdib29sZWFuJywgJ251bWJlcicsICdzdHJpbmcnLCAnc3ltYm9sJ107XG5cbiAgLy8gVGhlc2Ugc3ltYm9scyBhcmUgYWxsb3dlZCBhcyB3ZWxsLWtub3duIHN5bWJvbHNcbiAgY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9ICBuZXcgTWFwKFxuICAgIGludHJpbnNpY3MuU3ltYm9sP1xuICAgICAgICBhcnJheU1hcChcbiAgICAgICAgICBhcnJheUZpbHRlcihcbiAgICAgICAgICAgIGVudHJpZXMod2hpdGVsaXN0LlN5bWJvbCksXG4gICAgICAgICAgICAoW25hbWUsIHBlcm1pdF0pPT5cbiAgICAgICAgICAgICAgcGVybWl0PT09ICAnc3ltYm9sJyYmXG4gICAgICAgICAgICAgIHR5cGVvZiBpbnRyaW5zaWNzLlN5bWJvbFtuYW1lXT09PSAgJ3N5bWJvbCcpLFxuXG4gICAgICAgICAgKFtuYW1lXSk9PiAgW2ludHJpbnNpY3MuU3ltYm9sW25hbWVdLCAgYEBAJHtuYW1lfWBdKTpcblxuICAgICAgICBbXSk7XG5cblxuICAvKipcbiAgICogYXNTdHJpbmdQcm9wZXJ0eU5hbWUoKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcFxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmdQcm9wZXJ0eU5hbWUocGF0aCwgcHJvcCkge1xuICAgIGlmKCB0eXBlb2YgcHJvcD09PSAgJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBwcm9wO1xuICAgICB9XG5cbiAgICBjb25zdCB3ZWxsS25vd25TeW1ib2w9ICBtYXBHZXQod2VsbEtub3duU3ltYm9sTmFtZXMsIHByb3ApO1xuXG4gICAgaWYoIHR5cGVvZiBwcm9wPT09ICAnc3ltYm9sJykge1xuICAgICAgaWYoIHdlbGxLbm93blN5bWJvbCkge1xuICAgICAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sO1xuICAgICAgIH1lbHNlIHtcbiAgICAgICAgY29uc3QgcmVnaXN0ZXJlZEtleT0gIHN5bWJvbEtleUZvcihwcm9wKTtcbiAgICAgICAgaWYoIHJlZ2lzdGVyZWRLZXkhPT0gIHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiAgYFJlZ2lzdGVyZWRTeW1ib2woJHtyZWdpc3RlcmVkS2V5fSlgO1xuICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgIHJldHVybiAgYFVuaXF1ZSR7U3RyaW5nKHByb3ApfWA7XG4gICAgICAgICB9XG4gICAgICAgfVxuICAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgVW5leHBlY3RlZCBwcm9wZXJ0eSBuYW1lIHR5cGUgJHtwYXRofSAke3Byb3B9YCk7XG4gICB9XG5cbiAgLypcbiAgICogdmlzaXRQcm90b3R5cGUoKVxuICAgKiBWYWxpZGF0ZSB0aGUgb2JqZWN0J3MgW1twcm90b3R5cGVdXSBhZ2FpbnN0IGEgcGVybWl0LlxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRQcm90b3R5cGUocGF0aCwgb2JqLCBwcm90b05hbWUpIHtcbiAgICBpZiggIWlzT2JqZWN0KG9iaikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBPYmplY3QgZXhwZWN0ZWQ6ICR7cGF0aH0sICR7b2JqfSwgJHtwcm90b05hbWV9YCk7XG4gICAgIH1cbiAgICBjb25zdCBwcm90bz0gIGdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICAvLyBOdWxsIHByb3RvdHlwZS5cbiAgICBpZiggcHJvdG89PT0gIG51bGwmJiAgcHJvdG9OYW1lPT09ICBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cblxuICAgIC8vIEFzc2VydDogcHJvdG9OYW1lLCBpZiBwcm92aWRlZCwgaXMgYSBzdHJpbmcuXG4gICAgaWYoIHByb3RvTmFtZSE9PSAgdW5kZWZpbmVkJiYgIHR5cGVvZiBwcm90b05hbWUhPT0gICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgTWFsZm9ybWVkIHdoaXRlbGlzdCBwZXJtaXQgJHtwYXRofS5fX3Byb3RvX19gKTtcbiAgICAgfVxuXG4gICAgLy8gSWYgcGVybWl0IG5vdCBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gT2JqZWN0LnByb3RvdHlwZS5cbiAgICBpZiggcHJvdG89PT0gIGludHJpbnNpY3NbcHJvdG9OYW1lfHwgICclT2JqZWN0UHJvdG90eXBlJSddKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cblxuICAgIC8vIFdlIGNhbid0IGNsZWFuIFtbcHJvdG90eXBlXV0sIHRoZXJlZm9yZSBhYm9ydC5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgIGBVbmV4cGVjdGVkIGludHJpbnNpYyAke3BhdGh9Ll9fcHJvdG9fXyBhdCAke3Byb3RvTmFtZX1gKTtcblxuICAgfVxuXG4gIC8qXG4gICAqIGlzQWxsb3dlZFByb3BlcnR5VmFsdWUoKVxuICAgKiBXaGl0ZWxpc3QgYSBzaW5nbGUgcHJvcGVydHkgdmFsdWUgYWdhaW5zdCBhIHBlcm1pdC5cbiAgICovXG4gIGZ1bmN0aW9uIGlzQWxsb3dlZFByb3BlcnR5VmFsdWUocGF0aCwgdmFsdWUsIHByb3AsIHBlcm1pdCkge1xuICAgIGlmKCB0eXBlb2YgcGVybWl0PT09ICAnb2JqZWN0Jykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB2aXNpdFByb3BlcnRpZXMocGF0aCwgdmFsdWUsIHBlcm1pdCk7XG4gICAgICAvLyBUaGUgcHJvcGVydHkgaXMgYWxsb3dlZC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgICB9XG5cbiAgICBpZiggcGVybWl0PT09ICBmYWxzZSkge1xuICAgICAgLy8gQSBib29sYW4gJ2ZhbHNlJyBwZXJtaXQgc3BlY2lmaWVzIHRoZSByZW1vdmFsIG9mIGEgcHJvcGVydHkuXG4gICAgICAvLyBXZSByZXF1aXJlIGEgbW9yZSBzcGVjaWZpYyBwZXJtaXQgaW5zdGVhZCBvZiBhbGxvd2luZyAndHJ1ZScuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgIH1cblxuICAgIGlmKCB0eXBlb2YgcGVybWl0PT09ICAnc3RyaW5nJykge1xuICAgICAgLy8gQSBzdHJpbmcgcGVybWl0IGNhbiBoYXZlIG9uZSBvZiB0d28gbWVhbmluZ3M6XG5cbiAgICAgIGlmKCBwcm9wPT09ICAncHJvdG90eXBlJ3x8ICBwcm9wPT09ICAnY29uc3RydWN0b3InKSB7XG4gICAgICAgIC8vIEZvciBwcm90b3R5cGUgYW5kIGNvbnN0cnVjdG9yIHZhbHVlIHByb3BlcnRpZXMsIHRoZSBwZXJtaXRcbiAgICAgICAgLy8gaXMgdGhlIG5hbWUgb2YgYW4gaW50cmluc2ljLlxuICAgICAgICAvLyBBc3N1bXB0aW9uOiBwcm90b3R5cGUgYW5kIGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBwcmltaXRpdmVzLlxuICAgICAgICAvLyBBc3NlcnQ6IHRoZSBwZXJtaXQgaXMgdGhlIG5hbWUgb2YgYW4gaW50cmluc2ljLlxuICAgICAgICAvLyBBc3NlcnQ6IHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBlcXVhbCB0byB0aGF0IGludHJpbnNpYy5cblxuICAgICAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoaW50cmluc2ljcywgcGVybWl0KSkge1xuICAgICAgICAgIGlmKCB2YWx1ZSE9PSAgaW50cmluc2ljc1twZXJtaXRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgRG9lcyBub3QgbWF0Y2ggd2hpdGVsaXN0ICR7cGF0aH1gKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgfVxuICAgICAgIH1lbHNlIHtcbiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBwcm9wZXJ0aWVzLCB0aGUgcGVybWl0IGlzIHRoZSBuYW1lIG9mIGEgcHJpbWl0aXZlLlxuICAgICAgICAvLyBBc3NlcnQ6IHRoZSBwZXJtaXQgaXMgdGhlIG5hbWUgb2YgYSBwcmltaXRpdmUuXG4gICAgICAgIC8vIEFzc2VydDogdGhlIHByb3BlcnR5IHZhbHVlIHR5cGUgaXMgZXF1YWwgdG8gdGhhdCBwcmltaXRpdmUuXG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmVseS1pZlxuICAgICAgICBpZiggYXJyYXlJbmNsdWRlcyhwcmltaXRpdmVzLCBwZXJtaXQpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLXR5cGVvZlxuICAgICAgICAgIGlmKCB0eXBlb2YgdmFsdWUhPT0gIHBlcm1pdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgIGBBdCAke3BhdGh9IGV4cGVjdGVkICR7cGVybWl0fSBub3QgJHt0eXBlb2YgdmFsdWV9YCk7XG5cbiAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYFVuZXhwZWN0ZWQgd2hpdGVsaXN0IHBlcm1pdCAke3Blcm1pdH0gYXQgJHtwYXRofWApO1xuICAgfVxuXG4gIC8qXG4gICAqIGlzQWxsb3dlZFByb3BlcnR5KClcbiAgICogQ2hlY2sgd2hldGhlciBhIHNpbmdsZSBwcm9wZXJ0eSBpcyBhbGxvd2VkLlxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbGxvd2VkUHJvcGVydHkocGF0aCwgb2JqLCBwcm9wLCBwZXJtaXQpIHtcbiAgICBjb25zdCBkZXNjPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG5cbiAgICAvLyBJcyB0aGlzIGEgdmFsdWUgcHJvcGVydHk/XG4gICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KGRlc2MsICd2YWx1ZScpKSB7XG4gICAgICBpZiggaXNBY2Nlc3NvclBlcm1pdChwZXJtaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBBY2Nlc3NvciBleHBlY3RlZCBhdCAke3BhdGh9YCk7XG4gICAgICAgfVxuICAgICAgcmV0dXJuIGlzQWxsb3dlZFByb3BlcnR5VmFsdWUocGF0aCwgZGVzYy52YWx1ZSwgcHJvcCwgcGVybWl0KTtcbiAgICAgfVxuICAgIGlmKCAhaXNBY2Nlc3NvclBlcm1pdChwZXJtaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgQWNjZXNzb3Igbm90IGV4cGVjdGVkIGF0ICR7cGF0aH1gKTtcbiAgICAgfVxuICAgIHJldHVybihcbiAgICAgIGlzQWxsb3dlZFByb3BlcnR5VmFsdWUoIGAke3BhdGh9PGdldD5gLGRlc2MuZ2V0LCBwcm9wLCBwZXJtaXQuZ2V0KSYmXG4gICAgICBpc0FsbG93ZWRQcm9wZXJ0eVZhbHVlKCBgJHtwYXRofTxzZXQ+YCxkZXNjLnNldCwgcHJvcCwgcGVybWl0LnNldCkpO1xuXG4gICB9XG5cbiAgLypcbiAgICogZ2V0U3ViUGVybWl0KClcbiAgICovXG4gIGZ1bmN0aW9uIGdldFN1YlBlcm1pdChvYmosIHBlcm1pdCwgcHJvcCkge1xuICAgIGNvbnN0IHBlcm1pdFByb3A9ICBwcm9wPT09ICAnX19wcm90b19fJz8gICctLXByb3RvLS0nOiAgcHJvcDtcbiAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkocGVybWl0LCBwZXJtaXRQcm9wKSkge1xuICAgICAgcmV0dXJuIHBlcm1pdFtwZXJtaXRQcm9wXTtcbiAgICAgfVxuXG4gICAgaWYoIHR5cGVvZiBvYmo9PT0gICdmdW5jdGlvbicpIHtcbiAgICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKG9iaik7XG4gICAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoRnVuY3Rpb25JbnN0YW5jZSwgcGVybWl0UHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uSW5zdGFuY2VbcGVybWl0UHJvcF07XG4gICAgICAgfVxuICAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgfVxuXG4gIC8qXG4gICAqIHZpc2l0UHJvcGVydGllcygpXG4gICAqIFZpc2l0IGFsbCBwcm9wZXJ0aWVzIGZvciBhIHBlcm1pdC5cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0UHJvcGVydGllcyhwYXRoLCBvYmosIHBlcm1pdCkge1xuICAgIGlmKCBvYmo9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgICB9XG5cbiAgICBjb25zdCBwcm90b05hbWU9ICBwZXJtaXRbJ1tbUHJvdG9dXSddO1xuICAgIHZpc2l0UHJvdG90eXBlKHBhdGgsIG9iaiwgcHJvdG9OYW1lKTtcblxuICAgIGZvciggY29uc3QgcHJvcCBvZiBvd25LZXlzKG9iaikpIHtcbiAgICAgIGNvbnN0IHByb3BTdHJpbmc9ICBhc1N0cmluZ1Byb3BlcnR5TmFtZShwYXRoLCBwcm9wKTtcbiAgICAgIGNvbnN0IHN1YlBhdGg9ICAgYCR7cGF0aH0uJHtwcm9wU3RyaW5nfWA7XG4gICAgICBjb25zdCBzdWJQZXJtaXQ9ICBnZXRTdWJQZXJtaXQob2JqLCBwZXJtaXQsIHByb3BTdHJpbmcpO1xuXG4gICAgICBpZiggIXN1YlBlcm1pdHx8ICAhaXNBbGxvd2VkUHJvcGVydHkoc3ViUGF0aCwgb2JqLCBwcm9wLCBzdWJQZXJtaXQpKSB7XG4gICAgICAgIC8vIEVpdGhlciB0aGUgb2JqZWN0IGxhY2tzIGEgcGVybWl0IG9yIHRoZSBvYmplY3QgZG9lc24ndCBtYXRjaCB0aGVcbiAgICAgICAgLy8gcGVybWl0LlxuICAgICAgICAvLyBJZiB0aGUgcGVybWl0IGlzIHNwZWNpZmljYWxseSBmYWxzZSwgbm90IG1lcmVseSB1bmRlZmluZWQsXG4gICAgICAgIC8vIHRoaXMgaXMgYSBwcm9wZXJ0eSB3ZSBleHBlY3QgdG8gc2VlIGJlY2F1c2Ugd2Uga25vdyBpdCBleGlzdHMgaW5cbiAgICAgICAgLy8gc29tZSBlbnZpcm9ubWVudHMgYW5kIHdlIGhhdmUgZXhwcmVzc2x5IGRlY2lkZWQgdG8gZXhjbHVkZSBpdC5cbiAgICAgICAgLy8gQW55IG90aGVyIGRpc2FsbG93ZWQgcHJvcGVydHkgaXMgb25lIHdlIGhhdmUgbm90IGF1ZGl0ZWQgYW5kIHdlIGxvZ1xuICAgICAgICAvLyB0aGF0IHdlIGFyZSByZW1vdmluZyBpdCBzbyB3ZSBrbm93IHRvIGxvb2sgaW50byBpdCwgYXMgaGFwcGVucyB3aGVuXG4gICAgICAgIC8vIHRoZSBsYW5ndWFnZSBldm9sdmVzIG5ldyBmZWF0dXJlcyB0byBleGlzdGluZyBpbnRyaW5zaWNzLlxuICAgICAgICBpZiggc3ViUGVybWl0IT09ICBmYWxzZSkge1xuICAgICAgICAgIC8vIFRoaXMgY2FsbCB0byBgY29uc29sZS53YXJuYCBpcyBpbnRlbnRpb25hbC4gSXQgaXMgbm90IGEgdmVzdGlnZSBvZlxuICAgICAgICAgIC8vIGEgZGVidWdnaW5nIGF0dGVtcHQuIFNlZSB0aGUgY29tbWVudCBhdCB0b3Agb2YgZmlsZSBmb3IgYW5cbiAgICAgICAgICAvLyBleHBsYW5hdGlvbi5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgICAgIGNvbnNvbGUud2FybiggYFJlbW92aW5nICR7c3ViUGF0aH1gKTtcbiAgICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkZWxldGUgb2JqW3Byb3BdO1xuICAgICAgICAgfWNhdGNoKCBlcnIpIHtcbiAgICAgICAgICBpZiggcHJvcCBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmKCB0eXBlb2Ygb2JqPT09ICAnZnVuY3Rpb24nJiYgIHByb3A9PT0gICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgICAgIG9iai5wcm90b3R5cGU9ICB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIGlmKCBvYmoucHJvdG90eXBlPT09ICB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybiggYFRvbGVyYXRpbmcgdW5kZWxldGFibGUgJHtzdWJQYXRofSA9PT0gdW5kZWZpbmVkYCk7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIGBmYWlsZWQgdG8gZGVsZXRlICR7c3ViUGF0aH1gLGVycik7XG4gICAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCBgZGVsZXRpbmcgJHtzdWJQYXRofSB0aHJld2AsZXJyKTtcbiAgICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICAvLyBTdGFydCBwYXRoIHdpdGggJ2ludHJpbnNpY3MnIHRvIGNsYXJpZnkgdGhhdCBwcm9wZXJ0aWVzIGFyZSBub3RcbiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0IGJ5IHRoZSB3aGl0ZWxpc3Rpbmcgb3BlcmF0aW9uLlxuICB2aXNpdFByb3BlcnRpZXMoJ2ludHJpbnNpY3MnLCBpbnRyaW5zaWNzLCB3aGl0ZWxpc3QpO1xuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICB3aGl0ZWxpc3RJbnRyaW5zaWNzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbNDJdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfRlVOQ1RJT04sRkVSQUxfRVZBTCxUeXBlRXJyb3IsYXJyYXlGaWx0ZXIsYXJyYXlNYXAsZ2xvYmFsVGhpcyxpcyxvd25LZXlzLHN0cmluZ1NwbGl0LG5vRXZhbEV2YWx1YXRlLGVuSm9pbixtYWtlSGFyZGVuZXIsbWFrZUludHJpbnNpY3NDb2xsZWN0b3Isd2hpdGVsaXN0SW50cmluc2ljcyx0YW1lRnVuY3Rpb25Db25zdHJ1Y3RvcnMsdGFtZURhdGVDb25zdHJ1Y3Rvcix0YW1lTWF0aE9iamVjdCx0YW1lUmVnRXhwQ29uc3RydWN0b3IsZW5hYmxlUHJvcGVydHlPdmVycmlkZXMsdGFtZUxvY2FsZU1ldGhvZHMsc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzLHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzLHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMsbWFrZVNhZmVFdmFsdWF0b3IsaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXMsdGFtZUZ1bmN0aW9uVG9TdHJpbmcsdGFtZURvbWFpbnMsdGFtZUNvbnNvbGUsdGFtZUVycm9yQ29uc3RydWN0b3IsYXNzZXJ0LG1ha2VBc3NlcnQsbWFrZUVudmlyb25tZW50Q2FwdG9yLGdldEFub255bW91c0ludHJpbnNpY3MsbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3I7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9GVU5DVElPTlwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRlVOQ1RJT04gPSAkaOKAjV9hKV1dLFtcIkZFUkFMX0VWQUxcIiwgWyRo4oCNX2EgPT4gKEZFUkFMX0VWQUwgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhcnJheUZpbHRlclwiLCBbJGjigI1fYSA9PiAoYXJyYXlGaWx0ZXIgPSAkaOKAjV9hKV1dLFtcImFycmF5TWFwXCIsIFskaOKAjV9hID0+IChhcnJheU1hcCA9ICRo4oCNX2EpXV0sW1wiZ2xvYmFsVGhpc1wiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVGhpcyA9ICRo4oCNX2EpXV0sW1wiaXNcIiwgWyRo4oCNX2EgPT4gKGlzID0gJGjigI1fYSldXSxbXCJvd25LZXlzXCIsIFskaOKAjV9hID0+IChvd25LZXlzID0gJGjigI1fYSldXSxbXCJzdHJpbmdTcGxpdFwiLCBbJGjigI1fYSA9PiAoc3RyaW5nU3BsaXQgPSAkaOKAjV9hKV1dLFtcIm5vRXZhbEV2YWx1YXRlXCIsIFskaOKAjV9hID0+IChub0V2YWxFdmFsdWF0ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL3N0cmluZ2lmeS11dGlscy5qc1wiLCBbW1wiZW5Kb2luXCIsIFskaOKAjV9hID0+IChlbkpvaW4gPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlLWhhcmRlbmVyLmpzXCIsIFtbXCJtYWtlSGFyZGVuZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VIYXJkZW5lciA9ICRo4oCNX2EpXV1dXSxbXCIuL2ludHJpbnNpY3MuanNcIiwgW1tcIm1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yXCIsIFskaOKAjV9hID0+IChtYWtlSW50cmluc2ljc0NvbGxlY3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3doaXRlbGlzdC1pbnRyaW5zaWNzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+ICh3aGl0ZWxpc3RJbnRyaW5zaWNzID0gJGjigI1fYSldXV1dLFtcIi4vdGFtZS1mdW5jdGlvbi1jb25zdHJ1Y3RvcnMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHRhbWVGdW5jdGlvbkNvbnN0cnVjdG9ycyA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhbWUtZGF0ZS1jb25zdHJ1Y3Rvci5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAodGFtZURhdGVDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhbWUtbWF0aC1vYmplY3QuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHRhbWVNYXRoT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vdGFtZS1yZWdleHAtY29uc3RydWN0b3IuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHRhbWVSZWdFeHBDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuYWJsZS1wcm9wZXJ0eS1vdmVycmlkZXMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKGVuYWJsZVByb3BlcnR5T3ZlcnJpZGVzID0gJGjigI1fYSldXV1dLFtcIi4vdGFtZS1sb2NhbGUtbWV0aG9kcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAodGFtZUxvY2FsZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9nbG9iYWwtb2JqZWN0LmpzXCIsIFtbXCJzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcyA9ICRo4oCNX2EpXV0sW1wic2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzXCIsIFskaOKAjV9hID0+IChzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZS1zYWZlLWV2YWx1YXRvci5qc1wiLCBbW1wibWFrZVNhZmVFdmFsdWF0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VTYWZlRXZhbHVhdG9yID0gJGjigI1fYSldXV1dLFtcIi4vd2hpdGVsaXN0LmpzXCIsIFtbXCJpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lc1wiLCBbJGjigI1fYSA9PiAoaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi90YW1lLWZ1bmN0aW9uLXRvc3RyaW5nLmpzXCIsIFtbXCJ0YW1lRnVuY3Rpb25Ub1N0cmluZ1wiLCBbJGjigI1fYSA9PiAodGFtZUZ1bmN0aW9uVG9TdHJpbmcgPSAkaOKAjV9hKV1dXV0sW1wiLi90YW1lLWRvbWFpbnMuanNcIiwgW1tcInRhbWVEb21haW5zXCIsIFskaOKAjV9hID0+ICh0YW1lRG9tYWlucyA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL3RhbWUtY29uc29sZS5qc1wiLCBbW1widGFtZUNvbnNvbGVcIiwgWyRo4oCNX2EgPT4gKHRhbWVDb25zb2xlID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvdGFtZS1lcnJvci1jb25zdHJ1Y3Rvci5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAodGFtZUVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJtYWtlQXNzZXJ0XCIsIFskaOKAjV9hID0+IChtYWtlQXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIi4vZW52aXJvbm1lbnQtb3B0aW9ucy5qc1wiLCBbW1wibWFrZUVudmlyb25tZW50Q2FwdG9yXCIsIFskaOKAjV9hID0+IChtYWtlRW52aXJvbm1lbnRDYXB0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9nZXQtYW5vbnltb3VzLWludHJpbnNpY3MuanNcIiwgW1tcImdldEFub255bW91c0ludHJpbnNpY3NcIiwgWyRo4oCNX2EgPT4gKGdldEFub255bW91c0ludHJpbnNpY3MgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC1zaGltLmpzXCIsIFtbXCJtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAobWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbmRleC5qcycpLkxvY2tkb3duT3B0aW9uc30gTG9ja2Rvd25PcHRpb25zICovXG5cbmNvbnN0IHsgRmFpbCwgZGV0YWlsczogZCwgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuLyoqIEB0eXBlIHtFcnJvcj19ICovXG5sZXQgcHJpb3JMb2NrZG93bjtcblxuLy8gQnVpbGQgYSBoYXJkZW4oKSB3aXRoIGFuIGVtcHR5IGZyaW5nZS5cbi8vIEdhdGUgaXQgb24gbG9ja2Rvd24uXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHJlZlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IGhhcmRlbj0gIG1ha2VIYXJkZW5lcigpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBUcmFuc2Zvcm1cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ29tcGFydG1lbnRDb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IGVuZG93bWVudHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2R1bGVNYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7QXJyYXk8VHJhbnNmb3JtPn0gW29wdGlvbnMudHJhbnNmb3Jtc11cbiAqIEBwYXJhbSB7QXJyYXk8VHJhbnNmb3JtPn0gW29wdGlvbnMuX19zaGltVHJhbnNmb3Jtc19fXVxuICovXG5cbi8vIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy84MTRcbi8vIExvY2tkb3duIGN1cnJlbnRseSBhbGxvd3MgbXVsdGlwbGUgY2FsbHMgcHJvdmlkZWQgdGhhdCB0aGUgc3BlY2lmaWVkIG9wdGlvbnNcbi8vIG9mIGV2ZXJ5IGNhbGwgYWdyZWUuICBXaXRoIGV4cGVyaWVuY2UsIHdlIGhhdmUgb2JzZXJ2ZWQgdGhhdCBsb2NrZG93biBzaG91bGRcbi8vIG9ubHkgZXZlciBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIGFuZCB0aGF0IHNpbXBsaWZ5aW5nIGxvY2tkb3duIHdpbGwgaW1wcm92ZVxuLy8gdGhlIHF1YWxpdHkgb2YgYXVkaXRzLlxuXG5jb25zdCBhc3NlcnREaXJlY3RFdmFsQXZhaWxhYmxlPSAgKCk9PiAge1xuICBsZXQgYWxsb3dlZD0gIGZhbHNlO1xuICB0cnkge1xuICAgIGFsbG93ZWQ9ICBGRVJBTF9GVU5DVElPTihcbiAgICAgICdldmFsJyxcbiAgICAgICdTRVNfY2hhbmdlZCcsXG4gICAgICAgYFxcXG4gICAgICAgIGV2YWwoXCJTRVNfY2hhbmdlZCA9IHRydWVcIik7XG4gICAgICAgIHJldHVybiBTRVNfY2hhbmdlZDtcbiAgICAgIGApKFxuICAgICAgRkVSQUxfRVZBTCwgZmFsc2UpO1xuICAgIC8vIElmIHdlIGdldCBoZXJlIGFuZCBTRVNfY2hhbmdlZCBzdGF5ZWQgZmFsc2UsIHRoYXQgbWVhbnMgdGhlIGV2YWwgd2FzIHNsb3BweVxuICAgIC8vIGFuZCBpbmRpcmVjdCwgd2hpY2ggZ2VuZXJhbGx5IGNyZWF0ZXMgYSBuZXcgZ2xvYmFsLlxuICAgIC8vIFdlIGFyZSBnb2luZyB0byB0aHJvdyBhbiBleGNlcHRpb24gZm9yIGZhaWxpbmcgdG8gaW5pdGlhbGl6ZSBTRVMsIGJ1dFxuICAgIC8vIGdvb2QgbmVpZ2hib3JzIGNsZWFuIHVwLlxuICAgIGlmKCAhYWxsb3dlZCkge1xuICAgICAgZGVsZXRlIGdsb2JhbFRoaXMuU0VTX2NoYW5nZWQ7XG4gICAgIH1cbiAgIH1jYXRjaCggX2Vycm9yKSB7XG4gICAgLy8gV2UgcmVhY2ggaGVyZSBpZiBldmFsIGlzIG91dHJpZ2h0IGZvcmJpZGRlbiBieSBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAgIC8vIFdlIGFsbG93IHRoaXMgZm9yIFNFUyB1c2FnZSB0aGF0IGRlbGVnYXRlcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gaXNvbGF0ZVxuICAgIC8vIGd1ZXN0IGNvZGUgdG8gcHJvZHVjdGlvbiBjb2RlIGdlbmVyYXRpb24uXG4gICAgYWxsb3dlZD0gIHRydWU7XG4gICB9XG4gIGlmKCAhYWxsb3dlZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgYFNFUyBjYW5ub3QgaW5pdGlhbGl6ZSB1bmxlc3MgJ2V2YWwnIGlzIHRoZSBvcmlnaW5hbCBpbnRyaW5zaWMgJ2V2YWwnLCBzdWl0YWJsZSBmb3IgZGlyZWN0LWV2YWwgKGR5bmFtaWNhbGx5IHNjb3BlZCBldmFsKSAoU0VTX0RJUkVDVF9FVkFMKWApO1xuXG4gICB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0xvY2tkb3duT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gcmVwYWlySW50cmluc2ljc1xuICovXG5jb25zdCAgICAgICAgcmVwYWlySW50cmluc2ljcz0gIChvcHRpb25zPSAge30pPT4gIHtcbiAgLy8gRmlyc3QgdGltZSwgYWJzZW50IG9wdGlvbnMgZGVmYXVsdCB0byAnc2FmZScuXG4gIC8vIFN1YnNlcXVlbnQgdGltZXMsIGFic2VudCBvcHRpb25zIGRlZmF1bHQgdG8gZmlyc3Qgb3B0aW9ucy5cbiAgLy8gVGh1cywgYWxsIHByZXNlbnQgb3B0aW9ucyBtdXN0IGFncmVlIHdpdGggZmlyc3Qgb3B0aW9ucy5cbiAgLy8gUmVjb25zdHJ1Y3RpbmcgYG9wdGlvbmAgaGVyZSBhbHNvIGVuc3VyZXMgdGhhdCBpdCBpcyBhIHdlbGxcbiAgLy8gYmVoYXZlZCByZWNvcmQsIHdpdGggb25seSBvd24gZGF0YSBwcm9wZXJ0aWVzLlxuICAvL1xuICAvLyBUaGUgYG92ZXJyaWRlVGFtaW5nYCBpcyBub3QgYSBzYWZldHkgaXNzdWUuIFJhdGhlciBpdCBpcyBhIHRyYWRlb2ZmXG4gIC8vIGJldHdlZW4gY29kZSBjb21wYXRpYmlsaXR5LCB3aGljaCBpcyBiZXR0ZXIgd2l0aCB0aGUgYCdtb2RlcmF0ZSdgXG4gIC8vIHNldHRpbmcsIGFuZCB0b29sIGNvbXBhdGliaWxpdHksIHdoaWNoIGlzIGJldHRlciB3aXRoIHRoZSBgJ21pbidgXG4gIC8vIHNldHRpbmcuIFNlZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9SRUFETUUubWQjZW5hYmxpbmctb3ZlcnJpZGUtYnktYXNzaWdubWVudClcbiAgLy8gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoZW4gdG8gdXNlIHdoaWNoLlxuICAvL1xuICAvLyBUaGUgYHN0YWNrRmlsdGVyaW5nYCBpcyBub3QgYSBzYWZldHkgaXNzdWUuIFJhdGhlciBpdCBpcyBhIHRyYWRlb2ZmXG4gIC8vIGJldHdlZW4gcmVsZXZhbmNlIGFuZCBjb21wbGV0ZW5lc3Mgb2YgdGhlIHN0YWNrIGZyYW1lcyBzaG93biBvbiB0aGVcbiAgLy8gY29uc29sZS4gU2V0dGluZ2BzdGFja0ZpbHRlcmluZ2AgdG8gYCd2ZXJib3NlJ2AgYXBwbGllcyBubyBmaWx0ZXJzLCBwcm92aWRpbmdcbiAgLy8gdGhlIHJhdyBzdGFjayBmcmFtZXMgdGhhdCBjYW4gYmUgcXVpdGUgdmVyc2Jvc2UuIFNldHRpbmdcbiAgLy8gYHN0YWNrRnJhbWVGaWx0ZXJpbmdgIHRvYCdjb25jaXNlJ2AgbGltaXRzIHRoZSBkaXNwbGF5IHRvIHRoZSBzdGFjayBmcmFtZVxuICAvLyBpbmZvcm1hdGlvbiBtb3N0IGxpa2VseSB0byBiZSByZWxldmFudCwgZWxpbWluYXRpbmcgZGlzdHJhY3RpbmcgZnJhbWVzXG4gIC8vIHN1Y2ggYXMgdGhvc2UgZnJvbSB0aGUgaW5mcmFzdHJ1Y3R1cmUuIEhvd2V2ZXIsIHRoZSBidWcgeW91J3JlIHRyeWluZyB0b1xuICAvLyB0cmFjayBkb3duIG1pZ2h0IGJlIGluIHRoZSBpbmZyYXN0cnVyZSwgaW4gd2hpY2ggY2FzZSB0aGUgYCd2ZXJib3NlJ2Agc2V0dGluZ1xuICAvLyBpcyB1c2VmdWwuIFNlZVxuICAvLyBbYHN0YWNrRmlsdGVyaW5nYCBvcHRpb25zXShodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9sb2NrZG93bi1vcHRpb25zLm1kI3N0YWNrZmlsdGVyaW5nLW9wdGlvbnMpXG4gIC8vIGZvciBhbiBleHBsYW5hdGlvbi5cblxuICBjb25zdCB7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb246IGdldGVudixcbiAgICBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXN9PVxuICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMpO1xuXG4gIGNvbnN0IHtcbiAgICBlcnJvclRhbWluZz0gIGdldGVudignTE9DS0RPV05fRVJST1JfVEFNSU5HJywgJ3NhZmUnKSxcbiAgICBlcnJvclRyYXBwaW5nPSAgZ2V0ZW52KCdMT0NLRE9XTl9FUlJPUl9UUkFQUElORycsICdwbGF0Zm9ybScpLFxuICAgIHVuaGFuZGxlZFJlamVjdGlvblRyYXBwaW5nPSAgZ2V0ZW52KFxuICAgICAgJ0xPQ0tET1dOX1VOSEFORExFRF9SRUpFQ1RJT05fVFJBUFBJTkcnLFxuICAgICAgJ3JlcG9ydCcpLFxuXG4gICAgcmVnRXhwVGFtaW5nPSAgZ2V0ZW52KCdMT0NLRE9XTl9SRUdFWFBfVEFNSU5HJywgJ3NhZmUnKSxcbiAgICBsb2NhbGVUYW1pbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX0xPQ0FMRV9UQU1JTkcnLCAnc2FmZScpLFxuICAgIGNvbnNvbGVUYW1pbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX0NPTlNPTEVfVEFNSU5HJywgJ3NhZmUnKSxcbiAgICBvdmVycmlkZVRhbWluZz0gIGdldGVudignTE9DS0RPV05fT1ZFUlJJREVfVEFNSU5HJywgJ21vZGVyYXRlJyksXG4gICAgc3RhY2tGaWx0ZXJpbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX1NUQUNLX0ZJTFRFUklORycsICdjb25jaXNlJyksXG4gICAgZG9tYWluVGFtaW5nPSAgZ2V0ZW52KCdMT0NLRE9XTl9ET01BSU5fVEFNSU5HJywgJ3NhZmUnKSxcbiAgICBldmFsVGFtaW5nPSAgZ2V0ZW52KCdMT0NLRE9XTl9FVkFMX1RBTUlORycsICdzYWZlRXZhbCcpLFxuICAgIG92ZXJyaWRlRGVidWc9ICBhcnJheUZpbHRlcihcbiAgICAgIHN0cmluZ1NwbGl0KGdldGVudignTE9DS0RPV05fT1ZFUlJJREVfREVCVUcnLCAnJyksICcsJyksXG4gICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZSAqL1xuICAgICAgKGRlYnVnTmFtZSk9PmRlYnVnTmFtZSE9PSAgJycpLFxuXG4gICAgZGF0ZVRhbWluZz0gICdzYWZlJywgLy8gZGVwcmVjYXRlZFxuICAgIG1hdGhUYW1pbmc9ICAnc2FmZScsIC8vIGRlcHJlY2F0ZWRcbiAgICAuLi5leHRyYU9wdGlvbnN9PVxuICAgICAgb3B0aW9ucztcblxuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9ICBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMoKTtcbiAgaWYoIGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcy5sZW5ndGg+ICAwKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAgYFNFUyBMb2NrZG93biB1c2luZyBvcHRpb25zIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzICR7ZW5Kb2luKFxuICAgICAgICBhcnJheU1hcChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIHEpLFxuICAgICAgICAnYW5kJylcbiAgICAgICAgfWApO1xuXG4gICB9XG5cbiAgZXZhbFRhbWluZz09PSAgJ3Vuc2FmZUV2YWwnfHxcbiAgICBldmFsVGFtaW5nPT09ICAnc2FmZUV2YWwnfHxcbiAgICBldmFsVGFtaW5nPT09ICAnbm9FdmFsJ3x8XG4gICAgRmFpbCBgbG9ja2Rvd24oKTogbm9uIHN1cHBvcnRlZCBvcHRpb24gZXZhbFRhbWluZzogJHtxKGV2YWxUYW1pbmcpfWA7XG5cbiAgLy8gQXNzZXJ0IHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyB3ZXJlIHBhc3NlZC5cbiAgLy8gVXNlIFJlZmxlY3Qub3duS2V5cyB0byByZWplY3Qgc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMgYXMgd2VsbC5cbiAgY29uc3QgZXh0cmFPcHRpb25zTmFtZXM9ICBvd25LZXlzKGV4dHJhT3B0aW9ucyk7XG4gIGV4dHJhT3B0aW9uc05hbWVzLmxlbmd0aD09PSAgMHx8XG4gICAgRmFpbCBgbG9ja2Rvd24oKTogbm9uIHN1cHBvcnRlZCBvcHRpb24gJHtxKGV4dHJhT3B0aW9uc05hbWVzKX1gO1xuXG4gIHByaW9yTG9ja2Rvd249PT0gIHVuZGVmaW5lZHx8XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIGQgYEFscmVhZHkgbG9ja2VkIGRvd24gYXQgJHtwcmlvckxvY2tkb3dufSAoU0VTX0FMUkVBRFlfTE9DS0VEX0RPV04pYCxcbiAgICAgIFR5cGVFcnJvcik7XG5cbiAgcHJpb3JMb2NrZG93bj0gIG5ldyBUeXBlRXJyb3IoJ1ByaW9yIGxvY2tkb3duIChTRVNfQUxSRUFEWV9MT0NLRURfRE9XTiknKTtcbiAgLy8gVGVhc2UgVjggdG8gZ2VuZXJhdGUgdGhlIHN0YWNrIHN0cmluZyBhbmQgcmVsZWFzZSB0aGUgY2xvc3VyZXMgdGhlIHN0YWNrXG4gIC8vIHRyYWNlIHJldGFpbmVkOlxuICBwcmlvckxvY2tkb3duLnN0YWNrO1xuXG4gIGFzc2VydERpcmVjdEV2YWxBdmFpbGFibGUoKTtcblxuICAvKipcbiAgICogQmVjYXVzZSBvZiBwYWNrYWdlcnMgYW5kIGJ1bmRsZXJzLCBldGMsIG11bHRpcGxlIGludm9jYXRpb25zIG9mIGxvY2tkb3duXG4gICAqIG1pZ2h0IGhhcHBlbiBpbiBzZXBhcmF0ZSBpbnN0YW50aWF0aW9ucyBvZiB0aGUgc291cmNlIG9mIHRoaXMgbW9kdWxlLlxuICAgKiBJbiB0aGF0IGNhc2UsIGVhY2ggb25lIHNlZXMgaXRzIG93biBgZmlyc3RPcHRpb25zYCB2YXJpYWJsZSwgc28gdGhlIHRlc3RcbiAgICogYWJvdmUgd2lsbCBub3QgZGV0ZWN0IHRoYXQgbG9ja2Rvd24gaGFzIGFscmVhZHkgaGFwcGVuZWQuIFdlXG4gICAqIHVucmVsaWFibHkgdGVzdCBzb21lIHRlbGx0YWxlIHNpZ25zIHRoYXQgbG9ja2Rvd24gaGFzIHJ1biwgdG8gYXZvaWRcbiAgICogdHJ5aW5nIHRvIGxvY2sgZG93biBhIGxvY2tlZCBkb3duIGVudmlyb25tZW50LiBBbHRob3VnaCB0aGUgdGVzdCBpc1xuICAgKiB1bnJlbGlhYmxlLCB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgU0VTIHRocmVhdCBtb2RlbC4gU0VTIHByb3ZpZGVzXG4gICAqIHNlY3VyaXR5IG9ubHkgaWYgaXQgcnVucyBmaXJzdCBpbiBhIGdpdmVuIHJlYWxtLCBvciBpZiBldmVyeXRoaW5nIHRoYXRcbiAgICogcnVucyBiZWZvcmUgaXQgaXMgU0VTLWF3YXJlIGFuZCBjb29wZXJhdGl2ZS4gTmVpdGhlciBTRVMgbm9yIGFueXRoaW5nXG4gICAqIGNhbiBwcm90ZWN0IGl0c2VsZiBmcm9tIGNvcnJ1cHRpbmcgY29kZSB0aGF0IHJ1bnMgZmlyc3QuIEZvciB0aGVzZVxuICAgKiBwdXJwb3NlcywgY29kZSB0aGF0IHR1cm5zIGEgcmVhbG0gaW50byBzb21ldGhpbmcgdGhhdCBwYXNzZXMgdGhlc2VcbiAgICogdGVzdHMgd2l0aG91dCBhY3R1YWxseSBsb2NraW5nIGRvd24gY291bnRzIGFzIGNvcnJ1cHRpbmcgY29kZS5cbiAgICpcbiAgICogVGhlIHNwZWNpZmljcyBvZiB3aGF0IHRoaXMgdGVzdHMgZm9yIG1heSBjaGFuZ2Ugb3ZlciB0aW1lLCBidXQgaXRcbiAgICogc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBhbnkgc2V0dGluZyBvZiB0aGUgbG9ja2Rvd24gb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0IHNlZW1zVG9CZUxvY2tlZERvd249ICAoKT0+ICB7XG4gICAgcmV0dXJuKFxuICAgICAgZ2xvYmFsVGhpcy5GdW5jdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IhPT0gIGdsb2JhbFRoaXMuRnVuY3Rpb24mJlxuICAgICAgLy8gQHRzLWlnbm9yZSBoYXJkZW4gaXMgYWJzZW50IG9uIGdsb2JhbFRoaXMgdHlwZSBkZWYuXG4gICAgICB0eXBlb2YgZ2xvYmFsVGhpcy5oYXJkZW49PT0gICdmdW5jdGlvbicmJlxuICAgICAgLy8gQHRzLWlnbm9yZSBsb2NrZG93biBpcyBhYnNlbnQgb24gZ2xvYmFsVGhpcyB0eXBlIGRlZi5cbiAgICAgIHR5cGVvZiBnbG9iYWxUaGlzLmxvY2tkb3duPT09ICAnZnVuY3Rpb24nJiZcbiAgICAgIGdsb2JhbFRoaXMuRGF0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IhPT0gIGdsb2JhbFRoaXMuRGF0ZSYmXG4gICAgICB0eXBlb2YgZ2xvYmFsVGhpcy5EYXRlLm5vdz09PSAgJ2Z1bmN0aW9uJyYmXG4gICAgICAvLyBAdHMtaWdub3JlIGRvZXMgbm90IHJlY29nbml6ZSB0aGF0IERhdGUgY29uc3RydWN0b3IgaXMgYSBzcGVjaWFsXG4gICAgICAvLyBGdW5jdGlvbi5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBpcyhnbG9iYWxUaGlzLkRhdGUucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5vdygpLCBOYU4pKTtcblxuICAgfTtcblxuICBpZiggc2VlbXNUb0JlTG9ja2VkRG93bigpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICBgQWxyZWFkeSBsb2NrZWQgZG93biBidXQgbm90IGJ5IHRoaXMgU0VTIGluc3RhbmNlIChTRVNfTVVMVElQTEVfSU5TVEFOQ0VTKWApO1xuXG4gICB9XG5cbiAgLyoqXG4gICAqIDEuIFRBTUUgcG93ZXJzICYgZ2F0aGVyIGludHJpbnNpY3MgZmlyc3QuXG4gICAqL1xuXG4gIHRhbWVEb21haW5zKGRvbWFpblRhbWluZyk7XG5cbiAgY29uc3Qge1xuICAgIGFkZEludHJpbnNpY3MsXG4gICAgY29tcGxldGVQcm90b3R5cGVzLFxuICAgIGZpbmFsSW50cmluc2ljc309XG4gICAgICBtYWtlSW50cmluc2ljc0NvbGxlY3RvcigpO1xuXG4gIGFkZEludHJpbnNpY3MoeyBoYXJkZW59KTtcblxuICBhZGRJbnRyaW5zaWNzKHRhbWVGdW5jdGlvbkNvbnN0cnVjdG9ycygpKTtcblxuICBhZGRJbnRyaW5zaWNzKHRhbWVEYXRlQ29uc3RydWN0b3IoZGF0ZVRhbWluZykpO1xuICBhZGRJbnRyaW5zaWNzKHRhbWVFcnJvckNvbnN0cnVjdG9yKGVycm9yVGFtaW5nLCBzdGFja0ZpbHRlcmluZykpO1xuICBhZGRJbnRyaW5zaWNzKHRhbWVNYXRoT2JqZWN0KG1hdGhUYW1pbmcpKTtcbiAgYWRkSW50cmluc2ljcyh0YW1lUmVnRXhwQ29uc3RydWN0b3IocmVnRXhwVGFtaW5nKSk7XG5cbiAgYWRkSW50cmluc2ljcyhnZXRBbm9ueW1vdXNJbnRyaW5zaWNzKCkpO1xuXG4gIGNvbXBsZXRlUHJvdG90eXBlcygpO1xuXG4gIGNvbnN0IGludHJpbnNpY3M9ICBmaW5hbEludHJpbnNpY3MoKTtcblxuICAvKipcbiAgICogV3JhcCBjb25zb2xlIHVubGVzcyBzdXBwcmVzc2VkLlxuICAgKiBBdCB0aGUgbW9tZW50LCB0aGUgY29uc29sZSBpcyBjb25zaWRlcmVkIGEgaG9zdCBwb3dlciBpbiB0aGUgc3RhcnRcbiAgICogY29tcGFydG1lbnQsIGFuZCBub3QgYSBwcmltb3JkaWFsLiBIZW5jZSBpdCBpcyBhYnNlbnQgZnJvbSB0aGUgd2hpbGVsaXN0XG4gICAqIGFuZCBieXBhc3NlcyB0aGUgaW50cmluc2ljc0NvbGxlY3Rvci5cbiAgICpcbiAgICogQHR5cGUgeygoZXJyb3I6IGFueSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGxldCBvcHRHZXRTdGFja1N0cmluZztcbiAgaWYoIGVycm9yVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIG9wdEdldFN0YWNrU3RyaW5nPSAgaW50cmluc2ljc1snJUluaXRpYWxHZXRTdGFja1N0cmluZyUnXTtcbiAgIH1cbiAgY29uc3QgY29uc29sZVJlY29yZD0gIHRhbWVDb25zb2xlKFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdGFtZUNvbnNvbGUgZG9lcyBpdHMgb3duIGlucHV0IHZhbGlkYXRpb25cbiAgICBjb25zb2xlVGFtaW5nLFxuICAgIGVycm9yVHJhcHBpbmcsXG4gICAgdW5oYW5kbGVkUmVqZWN0aW9uVHJhcHBpbmcsXG4gICAgb3B0R2V0U3RhY2tTdHJpbmcpO1xuXG4gIGdsb2JhbFRoaXMuY29uc29sZT0gIC8qKiBAdHlwZSB7Q29uc29sZX0gKi8gIGNvbnNvbGVSZWNvcmQuY29uc29sZTtcblxuICAvLyBAdHMtaWdub3JlIGFzc2VydCBpcyBhYnNlbnQgb24gZ2xvYmFsVGhpcyB0eXBlIGRlZi5cbiAgaWYoIGVycm9yVGFtaW5nPT09ICAndW5zYWZlJyYmICBnbG9iYWxUaGlzLmFzc2VydD09PSAgYXNzZXJ0KSB7XG4gICAgLy8gSWYgZXJyb3JUYW1pbmcgaXMgJ3Vuc2FmZScgd2UgcmVwbGFjZSB0aGUgZ2xvYmFsIGFzc2VydCB3aXRoXG4gICAgLy8gb25lIHdob3NlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyBkb2VzIG5vdCByZWRhY3RcbiAgICAvLyB1bm1hcmtlZCBzdWJzdGl0dXRpb24gdmFsdWVzLiBJT1csIGl0IGJsYWJzIGluZm9ybWF0aW9uIHRoYXRcbiAgICAvLyB3YXMgc3VwcG9zZWQgdG8gYmUgc2VjcmV0IGZyb20gY2FsbGVycywgYXMgYW4gYWlkIHRvIGRlYnVnZ2luZ1xuICAgIC8vIGF0IGEgZnVydGhlciBjb3N0IGluIHNhZmV0eS5cbiAgICAvLyBAdHMtaWdub3JlIGFzc2VydCBpcyBhYnNlbnQgb24gZ2xvYmFsVGhpcyB0eXBlIGRlZi5cbiAgICBnbG9iYWxUaGlzLmFzc2VydD0gIG1ha2VBc3NlcnQodW5kZWZpbmVkLCB0cnVlKTtcbiAgIH1cblxuICAvLyBSZXBsYWNlICpMb2NhbGUqIG1ldGhvZHMgd2l0aCB0aGVpciBub24tbG9jYWxlIGVxdWl2YWxlbnRzXG4gIHRhbWVMb2NhbGVNZXRob2RzKGludHJpbnNpY3MsIGxvY2FsZVRhbWluZyk7XG5cbiAgLy8gUmVwbGFjZSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgd2l0aCBvbmUgdGhhdCByZWNvZ25pemVzXG4gIC8vIHNoaW1tZWQgZnVuY3Rpb25zIGFzIGhvbm9yYXJ5IG5hdGl2ZSBmdW5jdGlvbnMuXG4gIGNvbnN0IG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uPSAgdGFtZUZ1bmN0aW9uVG9TdHJpbmcoKTtcblxuICAvKipcbiAgICogMi4gV0hJVEVMSVNUIHRvIHN0YW5kYXJkaXplIHRoZSBlbnZpcm9ubWVudC5cbiAgICovXG5cbiAgLy8gUmVtb3ZlIG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzLlxuICAvLyBBbGwgcmVtYWluaW5nIGZ1bmN0aW9uIGVuY291bnRlcmVkIGR1cmluZyB3aGl0ZWxpc3RpbmcgYXJlXG4gIC8vIGJyYW5kZWQgYXMgaG9ub3JhcnkgbmF0aXZlIGZ1bmN0aW9ucy5cbiAgd2hpdGVsaXN0SW50cmluc2ljcyhpbnRyaW5zaWNzLCBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbik7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgcG93ZXJmdWwgaW5pdGlhbCBnbG9iYWwsIGkuZS4sIHRoZSBnbG9iYWwgb2YgdGhlXG4gIC8vIHN0YXJ0IGNvbXBhcnRtZW50LCBmcm9tIHRoZSBpbnRyaW5zaWNzLlxuXG4gIHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcyhnbG9iYWxUaGlzKTtcblxuICBzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcyhnbG9iYWxUaGlzLCB7XG4gICAgaW50cmluc2ljcyxcbiAgICBuZXdHbG9iYWxQcm9wZXJ0eU5hbWVzOiBpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lcyxcbiAgICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcixcbiAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbn0pO1xuXG5cbiAgaWYoIGV2YWxUYW1pbmc9PT0gICdub0V2YWwnKSB7XG4gICAgc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9ycyhcbiAgICAgIGdsb2JhbFRoaXMsXG4gICAgICBub0V2YWxFdmFsdWF0ZSxcbiAgICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKTtcblxuICAgfWVsc2UgaWYoIGV2YWxUYW1pbmc9PT0gICdzYWZlRXZhbCcpIHtcbiAgICBjb25zdCB7IHNhZmVFdmFsdWF0ZX09ICAgbWFrZVNhZmVFdmFsdWF0b3IoeyBnbG9iYWxPYmplY3Q6IGdsb2JhbFRoaXN9KTtcbiAgICBzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzKFxuICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgIHNhZmVFdmFsdWF0ZSxcbiAgICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKTtcblxuICAgfWVsc2UgaWYoIGV2YWxUYW1pbmc9PT0gICd1bnNhZmVFdmFsJykge1xuICAgIC8vIExlYXZlIGV2YWwgZnVuY3Rpb24gYW5kIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIG9mIHRoZSBpbml0aWFsIGNvbXBhcnRtZW50IGluLXRhY3QuXG4gICAgLy8gT3RoZXIgY29tcGFydG1lbnRzIHdpbGwgbm90IGhhdmUgYWNjZXNzIHRvIHRoZXNlIGV2YWx1YXRvcnMgdW5sZXNzIGEgZ3Vlc3QgcHJvZ3JhbVxuICAgIC8vIGVzY2FwZXMgY29udGFpbm1lbnQuXG4gICB9XG5cbiAgLyoqXG4gICAqIDMuIEhBUkRFTiB0byBzaGFyZSB0aGUgaW50cmluc2ljcy5cbiAgICpcbiAgICogV2UgZGVmaW5lIGhhcmRlbkludHJpbnNpY3MgaGVyZSBzbyB0aGF0IG9wdGlvbnMgYXJlIGluIHNjb3BlLCBidXQgcmV0dXJuXG4gICAqIGl0IHRvIHRoZSBjYWxsZXIgYmVjYXVzZSB3ZSBpbnRlbmQgdG8gZXZlbnR1YWxseSBhbGxvdyB2ZXR0ZWQgc2hpbXMgdG8gcnVuXG4gICAqIGJldHdlZW4gcmVwYWlycyBhbmQgdGhlIGhhcmRlbmluZyBvZiBpbnRyaW5zaWNzIGFuZCBzbyB3ZSBjYW4gYmVuY2htYXJrXG4gICAqIHJlcGFpciBzZXBhcmF0ZWx5IGZyb20gaGFyZGVuaW5nLlxuICAgKi9cblxuICBmdW5jdGlvbiBoYXJkZW5JbnRyaW5zaWNzKCkge1xuICAgIC8vIENpcmN1bXZlbnQgdGhlIG92ZXJyaWRlIG1pc3Rha2UuXG4gICAgLy8gVE9ETyBjb25zaWRlciBtb3ZpbmcgdGhpcyB0byB0aGUgZW5kIG9mIHRoZSByZXBhaXIgcGhhc2UsIGFuZFxuICAgIC8vIHRoZXJlZm9yZSBiZWZvcmUgdmV0dGVkIHNoaW1zIHJhdGhlciB0aGFuIGFmdGVyd2FyZHMuIEl0IGlzIG5vdFxuICAgIC8vIGNsZWFyIHlldCB3aGljaCBpcyBiZXR0ZXIuXG4gICAgLy8gQHRzLWlnbm9yZSBlbmFibGVQcm9wZXJ0eU92ZXJyaWRlcyBkb2VzIGl0cyBvd24gaW5wdXQgdmFsaWRhdGlvblxuICAgIGVuYWJsZVByb3BlcnR5T3ZlcnJpZGVzKGludHJpbnNpY3MsIG92ZXJyaWRlVGFtaW5nLCBvdmVycmlkZURlYnVnKTtcblxuICAgIC8vIEZpbmFsbHkgcmVnaXN0ZXIgYW5kIG9wdGlvbmFsbHkgZnJlZXplIGFsbCB0aGUgaW50cmluc2ljcy4gVGhpc1xuICAgIC8vIG11c3QgYmUgdGhlIG9wZXJhdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBpbnRyaW5zaWNzLlxuICAgIGhhcmRlbihpbnRyaW5zaWNzKTtcblxuICAgIC8vIFJldmVhbCBoYXJkZW4gYWZ0ZXIgbG9ja2Rvd24uXG4gICAgLy8gSGFyZGVuIGlzIGRhbmdlcm91cyBiZWZvcmUgbG9ja2Rvd24gYmVjYXVzZSBoYXJkZW5pbmcganVzdFxuICAgIC8vIGFib3V0IGFueXRoaW5nIHdpbGwgaW5hZHZlcnRlbnRseSByZW5kZXIgaW50cmluc2ljcyBpcnJlcGFyYWJsZS5cbiAgICAvLyBBbHNvLCBmb3IgbW9kdWxlcyB0aGF0IG11c3Qgd29yayBib3RoIGJlZm9yZSBvciBhZnRlciBsb2NrZG93biAoY29kZVxuICAgIC8vIHRoYXQgaXMgcG9ydGFibGUgYmV0d2VlbiBKUyBhbmQgU0VTKSwgdGhlIGV4aXN0ZW5jZSBvZiBoYXJkZW4gaW4gZ2xvYmFsXG4gICAgLy8gc2NvcGUgc2lnbmFscyB3aGV0aGVyIHN1Y2ggY29kZSBzaG91bGQgYXR0ZW1wdCB0byB1c2UgaGFyZGVuIGluIHRoZVxuICAgIC8vIGRlZmVuc2Ugb2YgaXRzIG93biBBUEkuXG4gICAgLy8gQHRzLWlnbm9yZSBoYXJkZW4gbm90IHlldCByZWNvZ25pemVkIG9uIGdsb2JhbFRoaXMuXG4gICAgZ2xvYmFsVGhpcy5oYXJkZW49ICBoYXJkZW47XG5cbiAgICAvLyBSZXR1cm5pbmcgYHRydWVgIGluZGljYXRlcyB0aGF0IHRoaXMgaXMgYSBKUyB0byBTRVMgdHJhbnNpdGlvbi5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgIH1cblxuICByZXR1cm4gaGFyZGVuSW50cmluc2ljcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TG9ja2Rvd25PcHRpb25zfSBbb3B0aW9uc11cbiAqLyRo4oCNX29uY2UucmVwYWlySW50cmluc2ljcyhyZXBhaXJJbnRyaW5zaWNzKTtcbmNvbnN0ICAgICAgICBsb2NrZG93bj0gIChvcHRpb25zPSAge30pPT4gIHtcbiAgY29uc3QgaGFyZGVuSW50cmluc2ljcz0gIHJlcGFpckludHJpbnNpY3Mob3B0aW9ucyk7XG4gIGhhcmRlbkludHJpbnNpY3MoKTtcbiB9OyRo4oCNX29uY2UubG9ja2Rvd24obG9ja2Rvd24pO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s0M10gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnbG9iYWxUaGlzLFR5cGVFcnJvcixhc3NpZ24sdGFtZUZ1bmN0aW9uVG9TdHJpbmcsZ2V0R2xvYmFsSW50cmluc2ljcyxsb2NrZG93bixtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3Rvcixhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiLi9zcmMvY29tbW9ucy5qc1wiLCBbW1wiZ2xvYmFsVGhpc1wiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVGhpcyA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFzc2lnblwiLCBbJGjigI1fYSA9PiAoYXNzaWduID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL3RhbWUtZnVuY3Rpb24tdG9zdHJpbmcuanNcIiwgW1tcInRhbWVGdW5jdGlvblRvU3RyaW5nXCIsIFskaOKAjV9hID0+ICh0YW1lRnVuY3Rpb25Ub1N0cmluZyA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pbnRyaW5zaWNzLmpzXCIsIFtbXCJnZXRHbG9iYWxJbnRyaW5zaWNzXCIsIFskaOKAjV9hID0+IChnZXRHbG9iYWxJbnRyaW5zaWNzID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2xvY2tkb3duLXNoaW0uanNcIiwgW1tcImxvY2tkb3duXCIsIFskaOKAjV9hID0+IChsb2NrZG93biA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9jb21wYXJ0bWVudC1zaGltLmpzXCIsIFtbXCJtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAobWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIGdldFRoaXMgcmV0dXJucyBnbG9iYWxUaGlzIGluIHNsb3BweSBtb2RlIG9yIHVuZGVmaW5lZCBpbiBzdHJpY3QgbW9kZS4gKi9cbmZ1bmN0aW9uIGdldFRoaXMoKSB7XG4gIHJldHVybiB0aGlzO1xuIH1cblxuaWYoIGdldFRoaXMoKSkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgU0VTIGZhaWxlZCB0byBpbml0aWFsaXplLCBzbG9wcHkgbW9kZSAoU0VTX05PX1NMT1BQWSlgKTtcbiB9XG5cbmNvbnN0IG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uPSAgdGFtZUZ1bmN0aW9uVG9TdHJpbmcoKTtcblxuY29uc3QgQ29tcGFydG1lbnQ9ICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcihcbiAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IsXG4gIGdldEdsb2JhbEludHJpbnNpY3MoZ2xvYmFsVGhpcyksXG4gIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKTtcblxuXG5hc3NpZ24oZ2xvYmFsVGhpcywge1xuICBsb2NrZG93bixcbiAgQ29tcGFydG1lbnQsXG4gIGFzc2VydH0pO1xufSlcbixcbl07IC8vIGZ1bmN0b3JzIGVuZFxuXG4gIGZ1bmN0aW9uIGNlbGwobmFtZSwgdmFsdWUgPSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvYnNlcnZlcnMgPSBbXTtcbiAgICBmdW5jdGlvbiBzZXQobmV3VmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3VmFsdWU7XG4gICAgICBmb3IgKGNvbnN0IG9ic2VydmUgb2Ygb2JzZXJ2ZXJzKSB7XG4gICAgICAgIG9ic2VydmUodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9ic2VydmUob2JzZXJ2ZSkge1xuICAgICAgb2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZSk7XG4gICAgICBvYnNlcnZlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgZ2V0LCBzZXQsIG9ic2VydmUsIGVudW1lcmFibGU6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNlbGxzID0gW1xuICAgIHtcbiAgICAgIGdsb2JhbFRoaXM6IGNlbGwoXCJnbG9iYWxUaGlzXCIpLFxuICAgICAgQXJyYXk6IGNlbGwoXCJBcnJheVwiKSxcbiAgICAgIERhdGU6IGNlbGwoXCJEYXRlXCIpLFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IGNlbGwoXCJGaW5hbGl6YXRpb25SZWdpc3RyeVwiKSxcbiAgICAgIEZsb2F0MzJBcnJheTogY2VsbChcIkZsb2F0MzJBcnJheVwiKSxcbiAgICAgIEpTT046IGNlbGwoXCJKU09OXCIpLFxuICAgICAgTWFwOiBjZWxsKFwiTWFwXCIpLFxuICAgICAgTWF0aDogY2VsbChcIk1hdGhcIiksXG4gICAgICBOdW1iZXI6IGNlbGwoXCJOdW1iZXJcIiksXG4gICAgICBPYmplY3Q6IGNlbGwoXCJPYmplY3RcIiksXG4gICAgICBQcm9taXNlOiBjZWxsKFwiUHJvbWlzZVwiKSxcbiAgICAgIFByb3h5OiBjZWxsKFwiUHJveHlcIiksXG4gICAgICBSZWZsZWN0OiBjZWxsKFwiUmVmbGVjdFwiKSxcbiAgICAgIEZFUkFMX1JFR19FWFA6IGNlbGwoXCJGRVJBTF9SRUdfRVhQXCIpLFxuICAgICAgU2V0OiBjZWxsKFwiU2V0XCIpLFxuICAgICAgU3RyaW5nOiBjZWxsKFwiU3RyaW5nXCIpLFxuICAgICAgV2Vha01hcDogY2VsbChcIldlYWtNYXBcIiksXG4gICAgICBXZWFrU2V0OiBjZWxsKFwiV2Vha1NldFwiKSxcbiAgICAgIEZFUkFMX0VSUk9SOiBjZWxsKFwiRkVSQUxfRVJST1JcIiksXG4gICAgICBSYW5nZUVycm9yOiBjZWxsKFwiUmFuZ2VFcnJvclwiKSxcbiAgICAgIFJlZmVyZW5jZUVycm9yOiBjZWxsKFwiUmVmZXJlbmNlRXJyb3JcIiksXG4gICAgICBTeW50YXhFcnJvcjogY2VsbChcIlN5bnRheEVycm9yXCIpLFxuICAgICAgVHlwZUVycm9yOiBjZWxsKFwiVHlwZUVycm9yXCIpLFxuICAgICAgYXNzaWduOiBjZWxsKFwiYXNzaWduXCIpLFxuICAgICAgY3JlYXRlOiBjZWxsKFwiY3JlYXRlXCIpLFxuICAgICAgZGVmaW5lUHJvcGVydGllczogY2VsbChcImRlZmluZVByb3BlcnRpZXNcIiksXG4gICAgICBlbnRyaWVzOiBjZWxsKFwiZW50cmllc1wiKSxcbiAgICAgIGZyZWV6ZTogY2VsbChcImZyZWV6ZVwiKSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogY2VsbChcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiKSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGNlbGwoXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXCIpLFxuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogY2VsbChcImdldE93blByb3BlcnR5TmFtZXNcIiksXG4gICAgICBnZXRQcm90b3R5cGVPZjogY2VsbChcImdldFByb3RvdHlwZU9mXCIpLFxuICAgICAgaXM6IGNlbGwoXCJpc1wiKSxcbiAgICAgIGlzRXh0ZW5zaWJsZTogY2VsbChcImlzRXh0ZW5zaWJsZVwiKSxcbiAgICAgIGtleXM6IGNlbGwoXCJrZXlzXCIpLFxuICAgICAgb2JqZWN0UHJvdG90eXBlOiBjZWxsKFwib2JqZWN0UHJvdG90eXBlXCIpLFxuICAgICAgc2VhbDogY2VsbChcInNlYWxcIiksXG4gICAgICBwcmV2ZW50RXh0ZW5zaW9uczogY2VsbChcInByZXZlbnRFeHRlbnNpb25zXCIpLFxuICAgICAgc2V0UHJvdG90eXBlT2Y6IGNlbGwoXCJzZXRQcm90b3R5cGVPZlwiKSxcbiAgICAgIHZhbHVlczogY2VsbChcInZhbHVlc1wiKSxcbiAgICAgIGZyb21FbnRyaWVzOiBjZWxsKFwiZnJvbUVudHJpZXNcIiksXG4gICAgICBzcGVjaWVzU3ltYm9sOiBjZWxsKFwic3BlY2llc1N5bWJvbFwiKSxcbiAgICAgIHRvU3RyaW5nVGFnU3ltYm9sOiBjZWxsKFwidG9TdHJpbmdUYWdTeW1ib2xcIiksXG4gICAgICBpdGVyYXRvclN5bWJvbDogY2VsbChcIml0ZXJhdG9yU3ltYm9sXCIpLFxuICAgICAgbWF0Y2hBbGxTeW1ib2w6IGNlbGwoXCJtYXRjaEFsbFN5bWJvbFwiKSxcbiAgICAgIHVuc2NvcGFibGVzU3ltYm9sOiBjZWxsKFwidW5zY29wYWJsZXNTeW1ib2xcIiksXG4gICAgICBzeW1ib2xLZXlGb3I6IGNlbGwoXCJzeW1ib2xLZXlGb3JcIiksXG4gICAgICBzeW1ib2xGb3I6IGNlbGwoXCJzeW1ib2xGb3JcIiksXG4gICAgICBpc0ludGVnZXI6IGNlbGwoXCJpc0ludGVnZXJcIiksXG4gICAgICBzdHJpbmdpZnlKc29uOiBjZWxsKFwic3RyaW5naWZ5SnNvblwiKSxcbiAgICAgIGRlZmluZVByb3BlcnR5OiBjZWxsKFwiZGVmaW5lUHJvcGVydHlcIiksXG4gICAgICBhcHBseTogY2VsbChcImFwcGx5XCIpLFxuICAgICAgY29uc3RydWN0OiBjZWxsKFwiY29uc3RydWN0XCIpLFxuICAgICAgcmVmbGVjdEdldDogY2VsbChcInJlZmxlY3RHZXRcIiksXG4gICAgICByZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBjZWxsKFwicmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvclwiKSxcbiAgICAgIHJlZmxlY3RIYXM6IGNlbGwoXCJyZWZsZWN0SGFzXCIpLFxuICAgICAgcmVmbGVjdElzRXh0ZW5zaWJsZTogY2VsbChcInJlZmxlY3RJc0V4dGVuc2libGVcIiksXG4gICAgICBvd25LZXlzOiBjZWxsKFwib3duS2V5c1wiKSxcbiAgICAgIHJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9uczogY2VsbChcInJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9uc1wiKSxcbiAgICAgIHJlZmxlY3RTZXQ6IGNlbGwoXCJyZWZsZWN0U2V0XCIpLFxuICAgICAgaXNBcnJheTogY2VsbChcImlzQXJyYXlcIiksXG4gICAgICBhcnJheVByb3RvdHlwZTogY2VsbChcImFycmF5UHJvdG90eXBlXCIpLFxuICAgICAgbWFwUHJvdG90eXBlOiBjZWxsKFwibWFwUHJvdG90eXBlXCIpLFxuICAgICAgcHJveHlSZXZvY2FibGU6IGNlbGwoXCJwcm94eVJldm9jYWJsZVwiKSxcbiAgICAgIHJlZ2V4cFByb3RvdHlwZTogY2VsbChcInJlZ2V4cFByb3RvdHlwZVwiKSxcbiAgICAgIHNldFByb3RvdHlwZTogY2VsbChcInNldFByb3RvdHlwZVwiKSxcbiAgICAgIHN0cmluZ1Byb3RvdHlwZTogY2VsbChcInN0cmluZ1Byb3RvdHlwZVwiKSxcbiAgICAgIHdlYWttYXBQcm90b3R5cGU6IGNlbGwoXCJ3ZWFrbWFwUHJvdG90eXBlXCIpLFxuICAgICAgd2Vha3NldFByb3RvdHlwZTogY2VsbChcIndlYWtzZXRQcm90b3R5cGVcIiksXG4gICAgICBmdW5jdGlvblByb3RvdHlwZTogY2VsbChcImZ1bmN0aW9uUHJvdG90eXBlXCIpLFxuICAgICAgcHJvbWlzZVByb3RvdHlwZTogY2VsbChcInByb21pc2VQcm90b3R5cGVcIiksXG4gICAgICB0eXBlZEFycmF5UHJvdG90eXBlOiBjZWxsKFwidHlwZWRBcnJheVByb3RvdHlwZVwiKSxcbiAgICAgIHVuY3VycnlUaGlzOiBjZWxsKFwidW5jdXJyeVRoaXNcIiksXG4gICAgICBvYmplY3RIYXNPd25Qcm9wZXJ0eTogY2VsbChcIm9iamVjdEhhc093blByb3BlcnR5XCIpLFxuICAgICAgYXJyYXlGaWx0ZXI6IGNlbGwoXCJhcnJheUZpbHRlclwiKSxcbiAgICAgIGFycmF5Rm9yRWFjaDogY2VsbChcImFycmF5Rm9yRWFjaFwiKSxcbiAgICAgIGFycmF5SW5jbHVkZXM6IGNlbGwoXCJhcnJheUluY2x1ZGVzXCIpLFxuICAgICAgYXJyYXlKb2luOiBjZWxsKFwiYXJyYXlKb2luXCIpLFxuICAgICAgYXJyYXlNYXA6IGNlbGwoXCJhcnJheU1hcFwiKSxcbiAgICAgIGFycmF5UG9wOiBjZWxsKFwiYXJyYXlQb3BcIiksXG4gICAgICBhcnJheVB1c2g6IGNlbGwoXCJhcnJheVB1c2hcIiksXG4gICAgICBhcnJheVNsaWNlOiBjZWxsKFwiYXJyYXlTbGljZVwiKSxcbiAgICAgIGFycmF5U29tZTogY2VsbChcImFycmF5U29tZVwiKSxcbiAgICAgIGFycmF5U29ydDogY2VsbChcImFycmF5U29ydFwiKSxcbiAgICAgIGl0ZXJhdGVBcnJheTogY2VsbChcIml0ZXJhdGVBcnJheVwiKSxcbiAgICAgIG1hcFNldDogY2VsbChcIm1hcFNldFwiKSxcbiAgICAgIG1hcEdldDogY2VsbChcIm1hcEdldFwiKSxcbiAgICAgIG1hcEhhczogY2VsbChcIm1hcEhhc1wiKSxcbiAgICAgIG1hcERlbGV0ZTogY2VsbChcIm1hcERlbGV0ZVwiKSxcbiAgICAgIG1hcEVudHJpZXM6IGNlbGwoXCJtYXBFbnRyaWVzXCIpLFxuICAgICAgaXRlcmF0ZU1hcDogY2VsbChcIml0ZXJhdGVNYXBcIiksXG4gICAgICBzZXRBZGQ6IGNlbGwoXCJzZXRBZGRcIiksXG4gICAgICBzZXREZWxldGU6IGNlbGwoXCJzZXREZWxldGVcIiksXG4gICAgICBzZXRGb3JFYWNoOiBjZWxsKFwic2V0Rm9yRWFjaFwiKSxcbiAgICAgIHNldEhhczogY2VsbChcInNldEhhc1wiKSxcbiAgICAgIGl0ZXJhdGVTZXQ6IGNlbGwoXCJpdGVyYXRlU2V0XCIpLFxuICAgICAgcmVnZXhwVGVzdDogY2VsbChcInJlZ2V4cFRlc3RcIiksXG4gICAgICByZWdleHBFeGVjOiBjZWxsKFwicmVnZXhwRXhlY1wiKSxcbiAgICAgIG1hdGNoQWxsUmVnRXhwOiBjZWxsKFwibWF0Y2hBbGxSZWdFeHBcIiksXG4gICAgICBzdHJpbmdFbmRzV2l0aDogY2VsbChcInN0cmluZ0VuZHNXaXRoXCIpLFxuICAgICAgc3RyaW5nSW5jbHVkZXM6IGNlbGwoXCJzdHJpbmdJbmNsdWRlc1wiKSxcbiAgICAgIHN0cmluZ0luZGV4T2Y6IGNlbGwoXCJzdHJpbmdJbmRleE9mXCIpLFxuICAgICAgc3RyaW5nTWF0Y2g6IGNlbGwoXCJzdHJpbmdNYXRjaFwiKSxcbiAgICAgIHN0cmluZ1JlcGxhY2U6IGNlbGwoXCJzdHJpbmdSZXBsYWNlXCIpLFxuICAgICAgc3RyaW5nU2VhcmNoOiBjZWxsKFwic3RyaW5nU2VhcmNoXCIpLFxuICAgICAgc3RyaW5nU2xpY2U6IGNlbGwoXCJzdHJpbmdTbGljZVwiKSxcbiAgICAgIHN0cmluZ1NwbGl0OiBjZWxsKFwic3RyaW5nU3BsaXRcIiksXG4gICAgICBzdHJpbmdTdGFydHNXaXRoOiBjZWxsKFwic3RyaW5nU3RhcnRzV2l0aFwiKSxcbiAgICAgIGl0ZXJhdGVTdHJpbmc6IGNlbGwoXCJpdGVyYXRlU3RyaW5nXCIpLFxuICAgICAgd2Vha21hcERlbGV0ZTogY2VsbChcIndlYWttYXBEZWxldGVcIiksXG4gICAgICB3ZWFrbWFwR2V0OiBjZWxsKFwid2Vha21hcEdldFwiKSxcbiAgICAgIHdlYWttYXBIYXM6IGNlbGwoXCJ3ZWFrbWFwSGFzXCIpLFxuICAgICAgd2Vha21hcFNldDogY2VsbChcIndlYWttYXBTZXRcIiksXG4gICAgICB3ZWFrc2V0QWRkOiBjZWxsKFwid2Vha3NldEFkZFwiKSxcbiAgICAgIHdlYWtzZXRHZXQ6IGNlbGwoXCJ3ZWFrc2V0R2V0XCIpLFxuICAgICAgd2Vha3NldEhhczogY2VsbChcIndlYWtzZXRIYXNcIiksXG4gICAgICBmdW5jdGlvblRvU3RyaW5nOiBjZWxsKFwiZnVuY3Rpb25Ub1N0cmluZ1wiKSxcbiAgICAgIHByb21pc2VBbGw6IGNlbGwoXCJwcm9taXNlQWxsXCIpLFxuICAgICAgcHJvbWlzZUNhdGNoOiBjZWxsKFwicHJvbWlzZUNhdGNoXCIpLFxuICAgICAgcHJvbWlzZVRoZW46IGNlbGwoXCJwcm9taXNlVGhlblwiKSxcbiAgICAgIGZpbmFsaXphdGlvblJlZ2lzdHJ5UmVnaXN0ZXI6IGNlbGwoXCJmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyXCIpLFxuICAgICAgZmluYWxpemF0aW9uUmVnaXN0cnlVbnJlZ2lzdGVyOiBjZWxsKFwiZmluYWxpemF0aW9uUmVnaXN0cnlVbnJlZ2lzdGVyXCIpLFxuICAgICAgZ2V0Q29uc3RydWN0b3JPZjogY2VsbChcImdldENvbnN0cnVjdG9yT2ZcIiksXG4gICAgICBpbW11dGFibGVPYmplY3Q6IGNlbGwoXCJpbW11dGFibGVPYmplY3RcIiksXG4gICAgICBpc09iamVjdDogY2VsbChcImlzT2JqZWN0XCIpLFxuICAgICAgaXNFcnJvcjogY2VsbChcImlzRXJyb3JcIiksXG4gICAgICBGRVJBTF9FVkFMOiBjZWxsKFwiRkVSQUxfRVZBTFwiKSxcbiAgICAgIEZFUkFMX0ZVTkNUSU9OOiBjZWxsKFwiRkVSQUxfRlVOQ1RJT05cIiksXG4gICAgICBub0V2YWxFdmFsdWF0ZTogY2VsbChcIm5vRXZhbEV2YWx1YXRlXCIpLFxuICAgIH0sXG4gICAge1xuICAgIH0sXG4gICAge1xuICAgICAgYW46IGNlbGwoXCJhblwiKSxcbiAgICAgIGJlc3RFZmZvcnRTdHJpbmdpZnk6IGNlbGwoXCJiZXN0RWZmb3J0U3RyaW5naWZ5XCIpLFxuICAgICAgZW5Kb2luOiBjZWxsKFwiZW5Kb2luXCIpLFxuICAgIH0sXG4gICAge1xuICAgIH0sXG4gICAge1xuICAgICAgdW5yZWRhY3RlZERldGFpbHM6IGNlbGwoXCJ1bnJlZGFjdGVkRGV0YWlsc1wiKSxcbiAgICAgIGxvZ2dlZEVycm9ySGFuZGxlcjogY2VsbChcImxvZ2dlZEVycm9ySGFuZGxlclwiKSxcbiAgICAgIG1ha2VBc3NlcnQ6IGNlbGwoXCJtYWtlQXNzZXJ0XCIpLFxuICAgICAgYXNzZXJ0OiBjZWxsKFwiYXNzZXJ0XCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFrZUV2YWxTY29wZUtpdDogY2VsbChcIm1ha2VFdmFsU2NvcGVLaXRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBpc1ZhbGlkSWRlbnRpZmllck5hbWU6IGNlbGwoXCJpc1ZhbGlkSWRlbnRpZmllck5hbWVcIiksXG4gICAgICBnZXRTY29wZUNvbnN0YW50czogY2VsbChcImdldFNjb3BlQ29uc3RhbnRzXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFrZUV2YWx1YXRlOiBjZWxsKFwibWFrZUV2YWx1YXRlXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgYWx3YXlzVGhyb3dIYW5kbGVyOiBjZWxsKFwiYWx3YXlzVGhyb3dIYW5kbGVyXCIpLFxuICAgICAgc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlcjogY2VsbChcInN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXJcIiksXG4gICAgICBzdHJpY3RTY29wZVRlcm1pbmF0b3I6IGNlbGwoXCJzdHJpY3RTY29wZVRlcm1pbmF0b3JcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yOiBjZWxsKFwiY3JlYXRlU2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvclwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFNvdXJjZVVSTDogY2VsbChcImdldFNvdXJjZVVSTFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHJlamVjdEh0bWxDb21tZW50czogY2VsbChcInJlamVjdEh0bWxDb21tZW50c1wiKSxcbiAgICAgIGV2YWRlSHRtbENvbW1lbnRUZXN0OiBjZWxsKFwiZXZhZGVIdG1sQ29tbWVudFRlc3RcIiksXG4gICAgICByZWplY3RJbXBvcnRFeHByZXNzaW9uczogY2VsbChcInJlamVjdEltcG9ydEV4cHJlc3Npb25zXCIpLFxuICAgICAgZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdDogY2VsbChcImV2YWRlSW1wb3J0RXhwcmVzc2lvblRlc3RcIiksXG4gICAgICByZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zOiBjZWxsKFwicmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9uc1wiKSxcbiAgICAgIG1hbmRhdG9yeVRyYW5zZm9ybXM6IGNlbGwoXCJtYW5kYXRvcnlUcmFuc2Zvcm1zXCIpLFxuICAgICAgYXBwbHlUcmFuc2Zvcm1zOiBjZWxsKFwiYXBwbHlUcmFuc2Zvcm1zXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFrZVNhZmVFdmFsdWF0b3I6IGNlbGwoXCJtYWtlU2FmZUV2YWx1YXRvclwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvcjogY2VsbChcInByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvclwiKSxcbiAgICAgIGNvbXBhcnRtZW50RXZhbHVhdGU6IGNlbGwoXCJjb21wYXJ0bWVudEV2YWx1YXRlXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFrZUV2YWxGdW5jdGlvbjogY2VsbChcIm1ha2VFdmFsRnVuY3Rpb25cIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlRnVuY3Rpb25Db25zdHJ1Y3RvcjogY2VsbChcIm1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgY29uc3RhbnRQcm9wZXJ0aWVzOiBjZWxsKFwiY29uc3RhbnRQcm9wZXJ0aWVzXCIpLFxuICAgICAgdW5pdmVyc2FsUHJvcGVydHlOYW1lczogY2VsbChcInVuaXZlcnNhbFByb3BlcnR5TmFtZXNcIiksXG4gICAgICBpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lczogY2VsbChcImluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzXCIpLFxuICAgICAgc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lczogY2VsbChcInNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXNcIiksXG4gICAgICB1bmlxdWVHbG9iYWxQcm9wZXJ0eU5hbWVzOiBjZWxsKFwidW5pcXVlR2xvYmFsUHJvcGVydHlOYW1lc1wiKSxcbiAgICAgIE5hdGl2ZUVycm9yczogY2VsbChcIk5hdGl2ZUVycm9yc1wiKSxcbiAgICAgIEZ1bmN0aW9uSW5zdGFuY2U6IGNlbGwoXCJGdW5jdGlvbkluc3RhbmNlXCIpLFxuICAgICAgaXNBY2Nlc3NvclBlcm1pdDogY2VsbChcImlzQWNjZXNzb3JQZXJtaXRcIiksXG4gICAgICB3aGl0ZWxpc3Q6IGNlbGwoXCJ3aGl0ZWxpc3RcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBzZXRHbG9iYWxPYmplY3RTeW1ib2xVbnNjb3BhYmxlczogY2VsbChcInNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzXCIpLFxuICAgICAgc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzOiBjZWxsKFwic2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzXCIpLFxuICAgICAgc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXM6IGNlbGwoXCJzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllc1wiKSxcbiAgICAgIHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnM6IGNlbGwoXCJzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFrZUFsaWFzOiBjZWxsKFwibWFrZUFsaWFzXCIpLFxuICAgICAgbG9hZDogY2VsbChcImxvYWRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZlckV4cG9ydHM6IGNlbGwoXCJkZWZlckV4cG9ydHNcIiksXG4gICAgICBnZXREZWZlcnJlZEV4cG9ydHM6IGNlbGwoXCJnZXREZWZlcnJlZEV4cG9ydHNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlOiBjZWxsKFwibWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZVwiKSxcbiAgICAgIG1ha2VNb2R1bGVJbnN0YW5jZTogY2VsbChcIm1ha2VNb2R1bGVJbnN0YW5jZVwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxpbms6IGNlbGwoXCJsaW5rXCIpLFxuICAgICAgaW5zdGFudGlhdGU6IGNlbGwoXCJpbnN0YW50aWF0ZVwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIEluZXJ0Q29tcGFydG1lbnQ6IGNlbGwoXCJJbmVydENvbXBhcnRtZW50XCIpLFxuICAgICAgQ29tcGFydG1lbnRQcm90b3R5cGU6IGNlbGwoXCJDb21wYXJ0bWVudFByb3RvdHlwZVwiKSxcbiAgICAgIG1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yOiBjZWxsKFwibWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3JcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlSW50cmluc2ljc0NvbGxlY3RvcjogY2VsbChcIm1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yXCIpLFxuICAgICAgZ2V0R2xvYmFsSW50cmluc2ljczogY2VsbChcImdldEdsb2JhbEludHJpbnNpY3NcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtaW5FbmFibGVtZW50czogY2VsbChcIm1pbkVuYWJsZW1lbnRzXCIpLFxuICAgICAgbW9kZXJhdGVFbmFibGVtZW50czogY2VsbChcIm1vZGVyYXRlRW5hYmxlbWVudHNcIiksXG4gICAgICBzZXZlcmVFbmFibGVtZW50czogY2VsbChcInNldmVyZUVuYWJsZW1lbnRzXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdDogY2VsbChcImRlZmF1bHRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlRW52aXJvbm1lbnRDYXB0b3I6IGNlbGwoXCJtYWtlRW52aXJvbm1lbnRDYXB0b3JcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlTG9nZ2luZ0NvbnNvbGVLaXQ6IGNlbGwoXCJtYWtlTG9nZ2luZ0NvbnNvbGVLaXRcIiksXG4gICAgICBtYWtlQ2F1c2FsQ29uc29sZTogY2VsbChcIm1ha2VDYXVzYWxDb25zb2xlXCIpLFxuICAgICAgZmlsdGVyQ29uc29sZTogY2VsbChcImZpbHRlckNvbnNvbGVcIiksXG4gICAgICBjb25zb2xlV2hpdGVsaXN0OiBjZWxsKFwiY29uc29sZVdoaXRlbGlzdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1ha2VSZWplY3Rpb25IYW5kbGVyczogY2VsbChcIm1ha2VSZWplY3Rpb25IYW5kbGVyc1wiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRhbWVDb25zb2xlOiBjZWxsKFwidGFtZUNvbnNvbGVcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBmaWx0ZXJGaWxlTmFtZTogY2VsbChcImZpbHRlckZpbGVOYW1lXCIpLFxuICAgICAgc2hvcnRlbkNhbGxTaXRlU3RyaW5nOiBjZWxsKFwic2hvcnRlbkNhbGxTaXRlU3RyaW5nXCIpLFxuICAgICAgdGFtZVY4RXJyb3JDb25zdHJ1Y3RvcjogY2VsbChcInRhbWVWOEVycm9yQ29uc3RydWN0b3JcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldEFub255bW91c0ludHJpbnNpY3M6IGNlbGwoXCJnZXRBbm9ueW1vdXNJbnRyaW5zaWNzXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgaXNUeXBlZEFycmF5OiBjZWxsKFwiaXNUeXBlZEFycmF5XCIpLFxuICAgICAgbWFrZUhhcmRlbmVyOiBjZWxsKFwibWFrZUhhcmRlbmVyXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdDogY2VsbChcImRlZmF1bHRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICB0YW1lRG9tYWluczogY2VsbChcInRhbWVEb21haW5zXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdDogY2VsbChcImRlZmF1bHRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICB0YW1lRnVuY3Rpb25Ub1N0cmluZzogY2VsbChcInRhbWVGdW5jdGlvblRvU3RyaW5nXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdDogY2VsbChcImRlZmF1bHRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmF1bHQ6IGNlbGwoXCJkZWZhdWx0XCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdDogY2VsbChcImRlZmF1bHRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICByZXBhaXJJbnRyaW5zaWNzOiBjZWxsKFwicmVwYWlySW50cmluc2ljc1wiKSxcbiAgICAgIGxvY2tkb3duOiBjZWxsKFwibG9ja2Rvd25cIiksXG4gICAgfSxcbiAgICB7XG4gICAgfSxcbiAgXTtcblxuXG4gIGNvbnN0IG5hbWVzcGFjZXMgPSBjZWxscy5tYXAoY2VsbHMgPT4gT2JqZWN0LmNyZWF0ZShudWxsLCBjZWxscykpO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lc3BhY2VzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNlbGxzW2luZGV4XVsnKiddID0gY2VsbCgnKicsIG5hbWVzcGFjZXNbaW5kZXhdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ic2VydmVJbXBvcnRzKG1hcCwgaW1wb3J0TmFtZSwgaW1wb3J0SW5kZXgpIHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBvYnNlcnZlcnNdIG9mIG1hcC5nZXQoaW1wb3J0TmFtZSkpIHtcbiAgICAgIGNvbnN0IGNlbGwgPSBjZWxsc1tpbXBvcnRJbmRleF1bbmFtZV07XG4gICAgICBpZiAoY2VsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgQ2Fubm90IGltcG9ydCBuYW1lICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2Ygb2JzZXJ2ZXJzKSB7XG4gICAgICAgIGNlbGwub2JzZXJ2ZShvYnNlcnZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3RvcnNbMF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIHVuaXZlcnNhbFRoaXM6IGNlbGxzWzBdLmdsb2JhbFRoaXMuc2V0LFxuICAgICAgQXJyYXk6IGNlbGxzWzBdLkFycmF5LnNldCxcbiAgICAgIERhdGU6IGNlbGxzWzBdLkRhdGUuc2V0LFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IGNlbGxzWzBdLkZpbmFsaXphdGlvblJlZ2lzdHJ5LnNldCxcbiAgICAgIEZsb2F0MzJBcnJheTogY2VsbHNbMF0uRmxvYXQzMkFycmF5LnNldCxcbiAgICAgIEpTT046IGNlbGxzWzBdLkpTT04uc2V0LFxuICAgICAgTWFwOiBjZWxsc1swXS5NYXAuc2V0LFxuICAgICAgTWF0aDogY2VsbHNbMF0uTWF0aC5zZXQsXG4gICAgICBOdW1iZXI6IGNlbGxzWzBdLk51bWJlci5zZXQsXG4gICAgICBPYmplY3Q6IGNlbGxzWzBdLk9iamVjdC5zZXQsXG4gICAgICBQcm9taXNlOiBjZWxsc1swXS5Qcm9taXNlLnNldCxcbiAgICAgIFByb3h5OiBjZWxsc1swXS5Qcm94eS5zZXQsXG4gICAgICBSZWZsZWN0OiBjZWxsc1swXS5SZWZsZWN0LnNldCxcbiAgICAgIEZFUkFMX1JFR19FWFA6IGNlbGxzWzBdLkZFUkFMX1JFR19FWFAuc2V0LFxuICAgICAgU2V0OiBjZWxsc1swXS5TZXQuc2V0LFxuICAgICAgU3RyaW5nOiBjZWxsc1swXS5TdHJpbmcuc2V0LFxuICAgICAgV2Vha01hcDogY2VsbHNbMF0uV2Vha01hcC5zZXQsXG4gICAgICBXZWFrU2V0OiBjZWxsc1swXS5XZWFrU2V0LnNldCxcbiAgICAgIEZFUkFMX0VSUk9SOiBjZWxsc1swXS5GRVJBTF9FUlJPUi5zZXQsXG4gICAgICBSYW5nZUVycm9yOiBjZWxsc1swXS5SYW5nZUVycm9yLnNldCxcbiAgICAgIFJlZmVyZW5jZUVycm9yOiBjZWxsc1swXS5SZWZlcmVuY2VFcnJvci5zZXQsXG4gICAgICBTeW50YXhFcnJvcjogY2VsbHNbMF0uU3ludGF4RXJyb3Iuc2V0LFxuICAgICAgVHlwZUVycm9yOiBjZWxsc1swXS5UeXBlRXJyb3Iuc2V0LFxuICAgICAgYXNzaWduOiBjZWxsc1swXS5hc3NpZ24uc2V0LFxuICAgICAgY3JlYXRlOiBjZWxsc1swXS5jcmVhdGUuc2V0LFxuICAgICAgZGVmaW5lUHJvcGVydGllczogY2VsbHNbMF0uZGVmaW5lUHJvcGVydGllcy5zZXQsXG4gICAgICBlbnRyaWVzOiBjZWxsc1swXS5lbnRyaWVzLnNldCxcbiAgICAgIGZyZWV6ZTogY2VsbHNbMF0uZnJlZXplLnNldCxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogY2VsbHNbMF0uZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNldCxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGNlbGxzWzBdLmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMuc2V0LFxuICAgICAgZ2V0T3duUHJvcGVydHlOYW1lczogY2VsbHNbMF0uZ2V0T3duUHJvcGVydHlOYW1lcy5zZXQsXG4gICAgICBnZXRQcm90b3R5cGVPZjogY2VsbHNbMF0uZ2V0UHJvdG90eXBlT2Yuc2V0LFxuICAgICAgaXM6IGNlbGxzWzBdLmlzLnNldCxcbiAgICAgIGlzRXh0ZW5zaWJsZTogY2VsbHNbMF0uaXNFeHRlbnNpYmxlLnNldCxcbiAgICAgIGtleXM6IGNlbGxzWzBdLmtleXMuc2V0LFxuICAgICAgb2JqZWN0UHJvdG90eXBlOiBjZWxsc1swXS5vYmplY3RQcm90b3R5cGUuc2V0LFxuICAgICAgc2VhbDogY2VsbHNbMF0uc2VhbC5zZXQsXG4gICAgICBwcmV2ZW50RXh0ZW5zaW9uczogY2VsbHNbMF0ucHJldmVudEV4dGVuc2lvbnMuc2V0LFxuICAgICAgc2V0UHJvdG90eXBlT2Y6IGNlbGxzWzBdLnNldFByb3RvdHlwZU9mLnNldCxcbiAgICAgIHZhbHVlczogY2VsbHNbMF0udmFsdWVzLnNldCxcbiAgICAgIGZyb21FbnRyaWVzOiBjZWxsc1swXS5mcm9tRW50cmllcy5zZXQsXG4gICAgICBzcGVjaWVzU3ltYm9sOiBjZWxsc1swXS5zcGVjaWVzU3ltYm9sLnNldCxcbiAgICAgIHRvU3RyaW5nVGFnU3ltYm9sOiBjZWxsc1swXS50b1N0cmluZ1RhZ1N5bWJvbC5zZXQsXG4gICAgICBpdGVyYXRvclN5bWJvbDogY2VsbHNbMF0uaXRlcmF0b3JTeW1ib2wuc2V0LFxuICAgICAgbWF0Y2hBbGxTeW1ib2w6IGNlbGxzWzBdLm1hdGNoQWxsU3ltYm9sLnNldCxcbiAgICAgIHVuc2NvcGFibGVzU3ltYm9sOiBjZWxsc1swXS51bnNjb3BhYmxlc1N5bWJvbC5zZXQsXG4gICAgICBzeW1ib2xLZXlGb3I6IGNlbGxzWzBdLnN5bWJvbEtleUZvci5zZXQsXG4gICAgICBzeW1ib2xGb3I6IGNlbGxzWzBdLnN5bWJvbEZvci5zZXQsXG4gICAgICBpc0ludGVnZXI6IGNlbGxzWzBdLmlzSW50ZWdlci5zZXQsXG4gICAgICBzdHJpbmdpZnlKc29uOiBjZWxsc1swXS5zdHJpbmdpZnlKc29uLnNldCxcbiAgICAgIGRlZmluZVByb3BlcnR5OiBjZWxsc1swXS5kZWZpbmVQcm9wZXJ0eS5zZXQsXG4gICAgICBhcHBseTogY2VsbHNbMF0uYXBwbHkuc2V0LFxuICAgICAgY29uc3RydWN0OiBjZWxsc1swXS5jb25zdHJ1Y3Quc2V0LFxuICAgICAgcmVmbGVjdEdldDogY2VsbHNbMF0ucmVmbGVjdEdldC5zZXQsXG4gICAgICByZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBjZWxsc1swXS5yZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNldCxcbiAgICAgIHJlZmxlY3RIYXM6IGNlbGxzWzBdLnJlZmxlY3RIYXMuc2V0LFxuICAgICAgcmVmbGVjdElzRXh0ZW5zaWJsZTogY2VsbHNbMF0ucmVmbGVjdElzRXh0ZW5zaWJsZS5zZXQsXG4gICAgICBvd25LZXlzOiBjZWxsc1swXS5vd25LZXlzLnNldCxcbiAgICAgIHJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9uczogY2VsbHNbMF0ucmVmbGVjdFByZXZlbnRFeHRlbnNpb25zLnNldCxcbiAgICAgIHJlZmxlY3RTZXQ6IGNlbGxzWzBdLnJlZmxlY3RTZXQuc2V0LFxuICAgICAgaXNBcnJheTogY2VsbHNbMF0uaXNBcnJheS5zZXQsXG4gICAgICBhcnJheVByb3RvdHlwZTogY2VsbHNbMF0uYXJyYXlQcm90b3R5cGUuc2V0LFxuICAgICAgbWFwUHJvdG90eXBlOiBjZWxsc1swXS5tYXBQcm90b3R5cGUuc2V0LFxuICAgICAgcHJveHlSZXZvY2FibGU6IGNlbGxzWzBdLnByb3h5UmV2b2NhYmxlLnNldCxcbiAgICAgIHJlZ2V4cFByb3RvdHlwZTogY2VsbHNbMF0ucmVnZXhwUHJvdG90eXBlLnNldCxcbiAgICAgIHNldFByb3RvdHlwZTogY2VsbHNbMF0uc2V0UHJvdG90eXBlLnNldCxcbiAgICAgIHN0cmluZ1Byb3RvdHlwZTogY2VsbHNbMF0uc3RyaW5nUHJvdG90eXBlLnNldCxcbiAgICAgIHdlYWttYXBQcm90b3R5cGU6IGNlbGxzWzBdLndlYWttYXBQcm90b3R5cGUuc2V0LFxuICAgICAgd2Vha3NldFByb3RvdHlwZTogY2VsbHNbMF0ud2Vha3NldFByb3RvdHlwZS5zZXQsXG4gICAgICBmdW5jdGlvblByb3RvdHlwZTogY2VsbHNbMF0uZnVuY3Rpb25Qcm90b3R5cGUuc2V0LFxuICAgICAgcHJvbWlzZVByb3RvdHlwZTogY2VsbHNbMF0ucHJvbWlzZVByb3RvdHlwZS5zZXQsXG4gICAgICB0eXBlZEFycmF5UHJvdG90eXBlOiBjZWxsc1swXS50eXBlZEFycmF5UHJvdG90eXBlLnNldCxcbiAgICAgIHVuY3VycnlUaGlzOiBjZWxsc1swXS51bmN1cnJ5VGhpcy5zZXQsXG4gICAgICBvYmplY3RIYXNPd25Qcm9wZXJ0eTogY2VsbHNbMF0ub2JqZWN0SGFzT3duUHJvcGVydHkuc2V0LFxuICAgICAgYXJyYXlGaWx0ZXI6IGNlbGxzWzBdLmFycmF5RmlsdGVyLnNldCxcbiAgICAgIGFycmF5Rm9yRWFjaDogY2VsbHNbMF0uYXJyYXlGb3JFYWNoLnNldCxcbiAgICAgIGFycmF5SW5jbHVkZXM6IGNlbGxzWzBdLmFycmF5SW5jbHVkZXMuc2V0LFxuICAgICAgYXJyYXlKb2luOiBjZWxsc1swXS5hcnJheUpvaW4uc2V0LFxuICAgICAgYXJyYXlNYXA6IGNlbGxzWzBdLmFycmF5TWFwLnNldCxcbiAgICAgIGFycmF5UG9wOiBjZWxsc1swXS5hcnJheVBvcC5zZXQsXG4gICAgICBhcnJheVB1c2g6IGNlbGxzWzBdLmFycmF5UHVzaC5zZXQsXG4gICAgICBhcnJheVNsaWNlOiBjZWxsc1swXS5hcnJheVNsaWNlLnNldCxcbiAgICAgIGFycmF5U29tZTogY2VsbHNbMF0uYXJyYXlTb21lLnNldCxcbiAgICAgIGFycmF5U29ydDogY2VsbHNbMF0uYXJyYXlTb3J0LnNldCxcbiAgICAgIGl0ZXJhdGVBcnJheTogY2VsbHNbMF0uaXRlcmF0ZUFycmF5LnNldCxcbiAgICAgIG1hcFNldDogY2VsbHNbMF0ubWFwU2V0LnNldCxcbiAgICAgIG1hcEdldDogY2VsbHNbMF0ubWFwR2V0LnNldCxcbiAgICAgIG1hcEhhczogY2VsbHNbMF0ubWFwSGFzLnNldCxcbiAgICAgIG1hcERlbGV0ZTogY2VsbHNbMF0ubWFwRGVsZXRlLnNldCxcbiAgICAgIG1hcEVudHJpZXM6IGNlbGxzWzBdLm1hcEVudHJpZXMuc2V0LFxuICAgICAgaXRlcmF0ZU1hcDogY2VsbHNbMF0uaXRlcmF0ZU1hcC5zZXQsXG4gICAgICBzZXRBZGQ6IGNlbGxzWzBdLnNldEFkZC5zZXQsXG4gICAgICBzZXREZWxldGU6IGNlbGxzWzBdLnNldERlbGV0ZS5zZXQsXG4gICAgICBzZXRGb3JFYWNoOiBjZWxsc1swXS5zZXRGb3JFYWNoLnNldCxcbiAgICAgIHNldEhhczogY2VsbHNbMF0uc2V0SGFzLnNldCxcbiAgICAgIGl0ZXJhdGVTZXQ6IGNlbGxzWzBdLml0ZXJhdGVTZXQuc2V0LFxuICAgICAgcmVnZXhwVGVzdDogY2VsbHNbMF0ucmVnZXhwVGVzdC5zZXQsXG4gICAgICByZWdleHBFeGVjOiBjZWxsc1swXS5yZWdleHBFeGVjLnNldCxcbiAgICAgIG1hdGNoQWxsUmVnRXhwOiBjZWxsc1swXS5tYXRjaEFsbFJlZ0V4cC5zZXQsXG4gICAgICBzdHJpbmdFbmRzV2l0aDogY2VsbHNbMF0uc3RyaW5nRW5kc1dpdGguc2V0LFxuICAgICAgc3RyaW5nSW5jbHVkZXM6IGNlbGxzWzBdLnN0cmluZ0luY2x1ZGVzLnNldCxcbiAgICAgIHN0cmluZ0luZGV4T2Y6IGNlbGxzWzBdLnN0cmluZ0luZGV4T2Yuc2V0LFxuICAgICAgc3RyaW5nTWF0Y2g6IGNlbGxzWzBdLnN0cmluZ01hdGNoLnNldCxcbiAgICAgIHN0cmluZ1JlcGxhY2U6IGNlbGxzWzBdLnN0cmluZ1JlcGxhY2Uuc2V0LFxuICAgICAgc3RyaW5nU2VhcmNoOiBjZWxsc1swXS5zdHJpbmdTZWFyY2guc2V0LFxuICAgICAgc3RyaW5nU2xpY2U6IGNlbGxzWzBdLnN0cmluZ1NsaWNlLnNldCxcbiAgICAgIHN0cmluZ1NwbGl0OiBjZWxsc1swXS5zdHJpbmdTcGxpdC5zZXQsXG4gICAgICBzdHJpbmdTdGFydHNXaXRoOiBjZWxsc1swXS5zdHJpbmdTdGFydHNXaXRoLnNldCxcbiAgICAgIGl0ZXJhdGVTdHJpbmc6IGNlbGxzWzBdLml0ZXJhdGVTdHJpbmcuc2V0LFxuICAgICAgd2Vha21hcERlbGV0ZTogY2VsbHNbMF0ud2Vha21hcERlbGV0ZS5zZXQsXG4gICAgICB3ZWFrbWFwR2V0OiBjZWxsc1swXS53ZWFrbWFwR2V0LnNldCxcbiAgICAgIHdlYWttYXBIYXM6IGNlbGxzWzBdLndlYWttYXBIYXMuc2V0LFxuICAgICAgd2Vha21hcFNldDogY2VsbHNbMF0ud2Vha21hcFNldC5zZXQsXG4gICAgICB3ZWFrc2V0QWRkOiBjZWxsc1swXS53ZWFrc2V0QWRkLnNldCxcbiAgICAgIHdlYWtzZXRHZXQ6IGNlbGxzWzBdLndlYWtzZXRHZXQuc2V0LFxuICAgICAgd2Vha3NldEhhczogY2VsbHNbMF0ud2Vha3NldEhhcy5zZXQsXG4gICAgICBmdW5jdGlvblRvU3RyaW5nOiBjZWxsc1swXS5mdW5jdGlvblRvU3RyaW5nLnNldCxcbiAgICAgIHByb21pc2VBbGw6IGNlbGxzWzBdLnByb21pc2VBbGwuc2V0LFxuICAgICAgcHJvbWlzZUNhdGNoOiBjZWxsc1swXS5wcm9taXNlQ2F0Y2guc2V0LFxuICAgICAgcHJvbWlzZVRoZW46IGNlbGxzWzBdLnByb21pc2VUaGVuLnNldCxcbiAgICAgIGZpbmFsaXphdGlvblJlZ2lzdHJ5UmVnaXN0ZXI6IGNlbGxzWzBdLmZpbmFsaXphdGlvblJlZ2lzdHJ5UmVnaXN0ZXIuc2V0LFxuICAgICAgZmluYWxpemF0aW9uUmVnaXN0cnlVbnJlZ2lzdGVyOiBjZWxsc1swXS5maW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXIuc2V0LFxuICAgICAgZ2V0Q29uc3RydWN0b3JPZjogY2VsbHNbMF0uZ2V0Q29uc3RydWN0b3JPZi5zZXQsXG4gICAgICBpbW11dGFibGVPYmplY3Q6IGNlbGxzWzBdLmltbXV0YWJsZU9iamVjdC5zZXQsXG4gICAgICBpc09iamVjdDogY2VsbHNbMF0uaXNPYmplY3Quc2V0LFxuICAgICAgaXNFcnJvcjogY2VsbHNbMF0uaXNFcnJvci5zZXQsXG4gICAgICBGRVJBTF9FVkFMOiBjZWxsc1swXS5GRVJBTF9FVkFMLnNldCxcbiAgICAgIEZFUkFMX0ZVTkNUSU9OOiBjZWxsc1swXS5GRVJBTF9GVU5DVElPTi5zZXQsXG4gICAgICBub0V2YWxFdmFsdWF0ZTogY2VsbHNbMF0ubm9FdmFsRXZhbHVhdGUuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1syXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4uL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBhbjogY2VsbHNbMl0uYW4uc2V0LFxuICAgICAgYmVzdEVmZm9ydFN0cmluZ2lmeTogY2VsbHNbMl0uYmVzdEVmZm9ydFN0cmluZ2lmeS5zZXQsXG4gICAgICBlbkpvaW46IGNlbGxzWzJdLmVuSm9pbi5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzNdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzRdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIDEpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3RyaW5naWZ5LXV0aWxzLmpzXCIsIDIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdHlwZXMuanNcIiwgMyk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICB1bnJlZGFjdGVkRGV0YWlsczogY2VsbHNbNF0udW5yZWRhY3RlZERldGFpbHMuc2V0LFxuICAgICAgbG9nZ2VkRXJyb3JIYW5kbGVyOiBjZWxsc1s0XS5sb2dnZWRFcnJvckhhbmRsZXIuc2V0LFxuICAgICAgbWFrZUFzc2VydDogY2VsbHNbNF0ubWFrZUFzc2VydC5zZXQsXG4gICAgICBhc3NlcnQ6IGNlbGxzWzRdLmFzc2VydC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzVdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZUV2YWxTY29wZUtpdDogY2VsbHNbNV0ubWFrZUV2YWxTY29wZUtpdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzZdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgaXNWYWxpZElkZW50aWZpZXJOYW1lOiBjZWxsc1s2XS5pc1ZhbGlkSWRlbnRpZmllck5hbWUuc2V0LFxuICAgICAgZ2V0U2NvcGVDb25zdGFudHM6IGNlbGxzWzZdLmdldFNjb3BlQ29uc3RhbnRzLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbN10oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9zY29wZS1jb25zdGFudHMuanNcIiwgNik7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlRXZhbHVhdGU6IGNlbGxzWzddLm1ha2VFdmFsdWF0ZS5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzhdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgYWx3YXlzVGhyb3dIYW5kbGVyOiBjZWxsc1s4XS5hbHdheXNUaHJvd0hhbmRsZXIuc2V0LFxuICAgICAgc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlcjogY2VsbHNbOF0uc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlci5zZXQsXG4gICAgICBzdHJpY3RTY29wZVRlcm1pbmF0b3I6IGNlbGxzWzhdLnN0cmljdFNjb3BlVGVybWluYXRvci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzldKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3RyaWN0LXNjb3BlLXRlcm1pbmF0b3IuanNcIiwgOCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yOiBjZWxsc1s5XS5jcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTBdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZ2V0U291cmNlVVJMOiBjZWxsc1sxMF0uZ2V0U291cmNlVVJMLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTFdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZ2V0LXNvdXJjZS11cmwuanNcIiwgMTApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgcmVqZWN0SHRtbENvbW1lbnRzOiBjZWxsc1sxMV0ucmVqZWN0SHRtbENvbW1lbnRzLnNldCxcbiAgICAgIGV2YWRlSHRtbENvbW1lbnRUZXN0OiBjZWxsc1sxMV0uZXZhZGVIdG1sQ29tbWVudFRlc3Quc2V0LFxuICAgICAgcmVqZWN0SW1wb3J0RXhwcmVzc2lvbnM6IGNlbGxzWzExXS5yZWplY3RJbXBvcnRFeHByZXNzaW9ucy5zZXQsXG4gICAgICBldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0OiBjZWxsc1sxMV0uZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdC5zZXQsXG4gICAgICByZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zOiBjZWxsc1sxMV0ucmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9ucy5zZXQsXG4gICAgICBtYW5kYXRvcnlUcmFuc2Zvcm1zOiBjZWxsc1sxMV0ubWFuZGF0b3J5VHJhbnNmb3Jtcy5zZXQsXG4gICAgICBhcHBseVRyYW5zZm9ybXM6IGNlbGxzWzExXS5hcHBseVRyYW5zZm9ybXMuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxMl0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9ldmFsLXNjb3BlLmpzXCIsIDUpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbWFrZS1ldmFsdWF0ZS5qc1wiLCA3KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3Nsb3BweS1nbG9iYWxzLXNjb3BlLXRlcm1pbmF0b3IuanNcIiwgOSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9zdHJpY3Qtc2NvcGUtdGVybWluYXRvci5qc1wiLCA4KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3RyYW5zZm9ybXMuanNcIiwgMTEpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZVNhZmVFdmFsdWF0b3I6IGNlbGxzWzEyXS5tYWtlU2FmZUV2YWx1YXRvci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzEzXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21ha2Utc2FmZS1ldmFsdWF0b3IuanNcIiwgMTIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdHJhbnNmb3Jtcy5qc1wiLCAxMSk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBwcm92aWRlQ29tcGFydG1lbnRFdmFsdWF0b3I6IGNlbGxzWzEzXS5wcm92aWRlQ29tcGFydG1lbnRFdmFsdWF0b3Iuc2V0LFxuICAgICAgY29tcGFydG1lbnRFdmFsdWF0ZTogY2VsbHNbMTNdLmNvbXBhcnRtZW50RXZhbHVhdGUuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxNF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIG1ha2VFdmFsRnVuY3Rpb246IGNlbGxzWzE0XS5tYWtlRXZhbEZ1bmN0aW9uLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTVdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZUZ1bmN0aW9uQ29uc3RydWN0b3I6IGNlbGxzWzE1XS5tYWtlRnVuY3Rpb25Db25zdHJ1Y3Rvci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzE2XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgY29uc3RhbnRQcm9wZXJ0aWVzOiBjZWxsc1sxNl0uY29uc3RhbnRQcm9wZXJ0aWVzLnNldCxcbiAgICAgIHVuaXZlcnNhbFByb3BlcnR5TmFtZXM6IGNlbGxzWzE2XS51bml2ZXJzYWxQcm9wZXJ0eU5hbWVzLnNldCxcbiAgICAgIGluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzOiBjZWxsc1sxNl0uaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXMuc2V0LFxuICAgICAgc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lczogY2VsbHNbMTZdLnNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMuc2V0LFxuICAgICAgdW5pcXVlR2xvYmFsUHJvcGVydHlOYW1lczogY2VsbHNbMTZdLnVuaXF1ZUdsb2JhbFByb3BlcnR5TmFtZXMuc2V0LFxuICAgICAgTmF0aXZlRXJyb3JzOiBjZWxsc1sxNl0uTmF0aXZlRXJyb3JzLnNldCxcbiAgICAgIEZ1bmN0aW9uSW5zdGFuY2U6IGNlbGxzWzE2XS5GdW5jdGlvbkluc3RhbmNlLnNldCxcbiAgICAgIGlzQWNjZXNzb3JQZXJtaXQ6IGNlbGxzWzE2XS5pc0FjY2Vzc29yUGVybWl0LnNldCxcbiAgICAgIHdoaXRlbGlzdDogY2VsbHNbMTZdLndoaXRlbGlzdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzE3XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21ha2UtZXZhbC1mdW5jdGlvbi5qc1wiLCAxNCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tYWtlLWZ1bmN0aW9uLWNvbnN0cnVjdG9yLmpzXCIsIDE1KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3doaXRlbGlzdC5qc1wiLCAxNik7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBzZXRHbG9iYWxPYmplY3RTeW1ib2xVbnNjb3BhYmxlczogY2VsbHNbMTddLnNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzLnNldCxcbiAgICAgIHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllczogY2VsbHNbMTddLnNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcy5zZXQsXG4gICAgICBzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllczogY2VsbHNbMTddLnNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzLnNldCxcbiAgICAgIHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnM6IGNlbGxzWzE3XS5zZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMThdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZUFsaWFzOiBjZWxsc1sxOF0ubWFrZUFsaWFzLnNldCxcbiAgICAgIGxvYWQ6IGNlbGxzWzE4XS5sb2FkLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTldKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbW9kdWxlLWxvYWQuanNcIiwgMTgpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZGVmZXJFeHBvcnRzOiBjZWxsc1sxOV0uZGVmZXJFeHBvcnRzLnNldCxcbiAgICAgIGdldERlZmVycmVkRXhwb3J0czogY2VsbHNbMTldLmdldERlZmVycmVkRXhwb3J0cy5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzIwXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbXBhcnRtZW50LWV2YWx1YXRlLmpzXCIsIDEzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21vZHVsZS1wcm94eS5qc1wiLCAxOSk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlOiBjZWxsc1syMF0ubWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZS5zZXQsXG4gICAgICBtYWtlTW9kdWxlSW5zdGFuY2U6IGNlbGxzWzIwXS5tYWtlTW9kdWxlSW5zdGFuY2Uuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1syMV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tb2R1bGUtaW5zdGFuY2UuanNcIiwgMjApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbGluazogY2VsbHNbMjFdLmxpbmsuc2V0LFxuICAgICAgaW5zdGFudGlhdGU6IGNlbGxzWzIxXS5pbnN0YW50aWF0ZS5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzIyXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbXBhcnRtZW50LWV2YWx1YXRlLmpzXCIsIDEzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2dsb2JhbC1vYmplY3QuanNcIiwgMTcpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbWFrZS1zYWZlLWV2YWx1YXRvci5qc1wiLCAxMik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tb2R1bGUtbGluay5qc1wiLCAyMSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tb2R1bGUtbG9hZC5qc1wiLCAxOCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tb2R1bGUtcHJveHkuanNcIiwgMTkpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vd2hpdGVsaXN0LmpzXCIsIDE2KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIEluZXJ0Q29tcGFydG1lbnQ6IGNlbGxzWzIyXS5JbmVydENvbXBhcnRtZW50LnNldCxcbiAgICAgIENvbXBhcnRtZW50UHJvdG90eXBlOiBjZWxsc1syMl0uQ29tcGFydG1lbnRQcm90b3R5cGUuc2V0LFxuICAgICAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3I6IGNlbGxzWzIyXS5tYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3Rvci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzIzXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3doaXRlbGlzdC5qc1wiLCAxNik7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlSW50cmluc2ljc0NvbGxlY3RvcjogY2VsbHNbMjNdLm1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yLnNldCxcbiAgICAgIGdldEdsb2JhbEludHJpbnNpY3M6IGNlbGxzWzIzXS5nZXRHbG9iYWxJbnRyaW5zaWNzLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjRdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtaW5FbmFibGVtZW50czogY2VsbHNbMjRdLm1pbkVuYWJsZW1lbnRzLnNldCxcbiAgICAgIG1vZGVyYXRlRW5hYmxlbWVudHM6IGNlbGxzWzI0XS5tb2RlcmF0ZUVuYWJsZW1lbnRzLnNldCxcbiAgICAgIHNldmVyZUVuYWJsZW1lbnRzOiBjZWxsc1syNF0uc2V2ZXJlRW5hYmxlbWVudHMuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1syNV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lbmFibGVtZW50cy5qc1wiLCAyNCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBkZWZhdWx0OiBjZWxsc1syNV0uZGVmYXVsdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzI2XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIG1ha2VFbnZpcm9ubWVudENhcHRvcjogY2VsbHNbMjZdLm1ha2VFbnZpcm9ubWVudENhcHRvci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzI3XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4uL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCAxKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3R5cGVzLmpzXCIsIDMpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZUxvZ2dpbmdDb25zb2xlS2l0OiBjZWxsc1syN10ubWFrZUxvZ2dpbmdDb25zb2xlS2l0LnNldCxcbiAgICAgIG1ha2VDYXVzYWxDb25zb2xlOiBjZWxsc1syN10ubWFrZUNhdXNhbENvbnNvbGUuc2V0LFxuICAgICAgZmlsdGVyQ29uc29sZTogY2VsbHNbMjddLmZpbHRlckNvbnNvbGUuc2V0LFxuICAgICAgY29uc29sZVdoaXRlbGlzdDogY2VsbHNbMjddLmNvbnNvbGVXaGl0ZWxpc3Quc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1syOF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZVJlamVjdGlvbkhhbmRsZXJzOiBjZWxsc1syOF0ubWFrZVJlamVjdGlvbkhhbmRsZXJzLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjldKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbnNvbGUuanNcIiwgMjcpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgMSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90eXBlcy5qc1wiLCAzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3VuaGFuZGxlZC1yZWplY3Rpb24uanNcIiwgMjgpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgdGFtZUNvbnNvbGU6IGNlbGxzWzI5XS50YW1lQ29uc29sZS5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzMwXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4uL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBmaWx0ZXJGaWxlTmFtZTogY2VsbHNbMzBdLmZpbHRlckZpbGVOYW1lLnNldCxcbiAgICAgIHNob3J0ZW5DYWxsU2l0ZVN0cmluZzogY2VsbHNbMzBdLnNob3J0ZW5DYWxsU2l0ZVN0cmluZy5zZXQsXG4gICAgICB0YW1lVjhFcnJvckNvbnN0cnVjdG9yOiBjZWxsc1szMF0udGFtZVY4RXJyb3JDb25zdHJ1Y3Rvci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzMxXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4uL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vd2hpdGVsaXN0LmpzXCIsIDE2KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3RhbWUtdjgtZXJyb3ItY29uc3RydWN0b3IuanNcIiwgMzApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZGVmYXVsdDogY2VsbHNbMzFdLmRlZmF1bHQuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1szMl0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21wYXJ0bWVudC1zaGltLmpzXCIsIDIyKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGdldEFub255bW91c0ludHJpbnNpY3M6IGNlbGxzWzMyXS5nZXRBbm9ueW1vdXNJbnRyaW5zaWNzLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzNdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgaXNUeXBlZEFycmF5OiBjZWxsc1szM10uaXNUeXBlZEFycmF5LnNldCxcbiAgICAgIG1ha2VIYXJkZW5lcjogY2VsbHNbMzNdLm1ha2VIYXJkZW5lci5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzM0XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGRlZmF1bHQ6IGNlbGxzWzM0XS5kZWZhdWx0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzVdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgdGFtZURvbWFpbnM6IGNlbGxzWzM1XS50YW1lRG9tYWlucy5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzM2XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGRlZmF1bHQ6IGNlbGxzWzM2XS5kZWZhdWx0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzddKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgdGFtZUZ1bmN0aW9uVG9TdHJpbmc6IGNlbGxzWzM3XS50YW1lRnVuY3Rpb25Ub1N0cmluZy5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzM4XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGRlZmF1bHQ6IGNlbGxzWzM4XS5kZWZhdWx0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzldKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZGVmYXVsdDogY2VsbHNbMzldLmRlZmF1bHQuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1s0MF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBkZWZhdWx0OiBjZWxsc1s0MF0uZGVmYXVsdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzQxXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3doaXRlbGlzdC5qc1wiLCAxNik7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBkZWZhdWx0OiBjZWxsc1s0MV0uZGVmYXVsdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzQyXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbXBhcnRtZW50LXNoaW0uanNcIiwgMjIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZW5hYmxlLXByb3BlcnR5LW92ZXJyaWRlcy5qc1wiLCAyNSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lbnZpcm9ubWVudC1vcHRpb25zLmpzXCIsIDI2KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL3N0cmluZ2lmeS11dGlscy5qc1wiLCAyKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL3RhbWUtY29uc29sZS5qc1wiLCAyOSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci90YW1lLWVycm9yLWNvbnN0cnVjdG9yLmpzXCIsIDMxKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2dldC1hbm9ueW1vdXMtaW50cmluc2ljcy5qc1wiLCAzMik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9nbG9iYWwtb2JqZWN0LmpzXCIsIDE3KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2ludHJpbnNpY3MuanNcIiwgMjMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbWFrZS1oYXJkZW5lci5qc1wiLCAzMyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tYWtlLXNhZmUtZXZhbHVhdG9yLmpzXCIsIDEyKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3RhbWUtZGF0ZS1jb25zdHJ1Y3Rvci5qc1wiLCAzNCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90YW1lLWRvbWFpbnMuanNcIiwgMzUpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdGFtZS1mdW5jdGlvbi1jb25zdHJ1Y3RvcnMuanNcIiwgMzYpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdGFtZS1mdW5jdGlvbi10b3N0cmluZy5qc1wiLCAzNyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90YW1lLWxvY2FsZS1tZXRob2RzLmpzXCIsIDM4KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3RhbWUtbWF0aC1vYmplY3QuanNcIiwgMzkpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdGFtZS1yZWdleHAtY29uc3RydWN0b3IuanNcIiwgNDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vd2hpdGVsaXN0LWludHJpbnNpY3MuanNcIiwgNDEpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vd2hpdGVsaXN0LmpzXCIsIDE2KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIHJlcGFpckludHJpbnNpY3M6IGNlbGxzWzQyXS5yZXBhaXJJbnRyaW5zaWNzLnNldCxcbiAgICAgIGxvY2tkb3duOiBjZWxsc1s0Ml0ubG9ja2Rvd24uc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1s0M10oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3NyYy9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3JjL2NvbXBhcnRtZW50LXNoaW0uanNcIiwgMjIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3JjL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3NyYy9pbnRyaW5zaWNzLmpzXCIsIDIzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3NyYy9sb2NrZG93bi1zaGltLmpzXCIsIDQyKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3NyYy90YW1lLWZ1bmN0aW9uLXRvc3RyaW5nLmpzXCIsIDM3KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcblxuICByZXR1cm4gY2VsbHNbY2VsbHMubGVuZ3RoIC0gMV1bJyonXS5nZXQoKTtcbn0pKCk7XG5cbi8vIEVORCBvZiBpbmplY3RlZCBjb2RlIGZyb20gc2VzXG4gIH0pKClcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzXG59KSgpXG5cbiAgICBjb25zdCBsb2NrZG93bk9wdGlvbnMgPSB7XG4gICAgICAvLyBnaXZlcyBhIHNlbWktaGlnaCByZXNvbHV0aW9uIHRpbWVyXG4gICAgICBkYXRlVGFtaW5nOiAndW5zYWZlJyxcbiAgICAgIC8vIHRoaXMgaXMgaW50cm9kdWNlcyBub24tZGV0ZXJtaW5pc20sIGJ1dCBpcyBvdGhlcndpc2Ugc2FmZVxuICAgICAgbWF0aFRhbWluZzogJ3Vuc2FmZScsXG4gICAgICAvLyBsZXRzIGNvZGUgb2JzZXJ2ZSBjYWxsIHN0YWNrLCBidXQgZWFzaWVyIGRlYnVnZ2FiaWxpdHlcbiAgICAgIGVycm9yVGFtaW5nOiAndW5zYWZlJyxcbiAgICAgIC8vIHNob3dzIHRoZSBmdWxsIGNhbGwgc3RhY2tcbiAgICAgIHN0YWNrRmlsdGVyaW5nOiAndmVyYm9zZScsXG4gICAgICAvLyBkZWVwIHN0YWNrc1xuICAgICAgY29uc29sZVRhbWluZzogJ3Vuc2FmZScsXG4gICAgfVxuXG4gICAgbG9ja2Rvd24obG9ja2Rvd25PcHRpb25zKVxuXG4gICAgLy8gaW5pdGlhbGl6ZSB0aGUga2VybmVsXG4gICAgY29uc3QgY3JlYXRlS2VybmVsQ29yZSA9IChmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0J1xuICByZXR1cm4gY3JlYXRlS2VybmVsQ29yZVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUtlcm5lbENvcmUgKHtcbiAgICAvLyB0aGUgcGxhdGZvcm0gYXBpIGdsb2JhbFxuICAgIGdsb2JhbFJlZixcbiAgICAvLyBwYWNrYWdlIHBvbGljeSBvYmplY3RcbiAgICBsYXZhbW9hdENvbmZpZyxcbiAgICAvLyBrZXJuZWwgY29uZmlndXJhdGlvblxuICAgIGxvYWRNb2R1bGVEYXRhLFxuICAgIGdldFJlbGF0aXZlTW9kdWxlSWQsXG4gICAgcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyQXJncyxcbiAgICBnZXRFeHRlcm5hbENvbXBhcnRtZW50LFxuICAgIGdsb2JhbFRoaXNSZWZzLFxuICAgIC8vIHNlY3VyaXR5IG9wdGlvbnNcbiAgICBzY3V0dGxlR2xvYmFsVGhpcyxcbiAgICBzY3V0dGxlR2xvYmFsVGhpc0V4Y2VwdGlvbnMsXG4gICAgZGVidWdNb2RlLFxuICAgIHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXMsXG4gICAgcmVwb3J0U3RhdHNIb29rLFxuICB9KSB7XG4gICAgLy8gcHJlcGFyZSB0aGUgTGF2YU1vYXQga2VybmVsLWNvcmUgZmFjdG9yeVxuICAgIC8vIGZhY3RvcnkgaXMgZGVmaW5lZCB3aXRoaW4gYSBDb21wYXJ0bWVudFxuICAgIC8vIHVubGVzcyBcInJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXNcIiBpcyBlbmFibGVkXG4gICAgbGV0IG1ha2VLZXJuZWxDb3JlXG4gICAgaWYgKHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXMpIHtcbiAgICAgIG1ha2VLZXJuZWxDb3JlID0gdW5zYWZlTWFrZUtlcm5lbENvcmVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW5kb3dtZW50czpcbiAgICAgIC8vIC0gY29uc29sZSBpcyBpbmNsdWRlZCBmb3IgY29udmVuaWVuY2VcbiAgICAgIC8vIC0gTWF0aCBpcyBmb3IgdW50YW1lZCBNYXRoLnJhbmRvbVxuICAgICAgLy8gLSBEYXRlIGlzIGZvciB1bnRhbWVkIERhdGUubm93XG4gICAgICBjb25zdCBrZXJuZWxDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCh7IGNvbnNvbGUsIE1hdGgsIERhdGUgfSlcbiAgICAgIG1ha2VLZXJuZWxDb3JlID0ga2VybmVsQ29tcGFydG1lbnQuZXZhbHVhdGUoYCgke3Vuc2FmZU1ha2VLZXJuZWxDb3JlfSlcXG4vLyMgc291cmNlVVJMPUxhdmFNb2F0L2NvcmUva2VybmVsYClcbiAgICB9XG4gICAgY29uc3QgbGF2YW1vYXRLZXJuZWwgPSBtYWtlS2VybmVsQ29yZSh7XG4gICAgICBnbG9iYWxSZWYsXG4gICAgICBsYXZhbW9hdENvbmZpZyxcbiAgICAgIGxvYWRNb2R1bGVEYXRhLFxuICAgICAgZ2V0UmVsYXRpdmVNb2R1bGVJZCxcbiAgICAgIHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MsXG4gICAgICBnZXRFeHRlcm5hbENvbXBhcnRtZW50LFxuICAgICAgZ2xvYmFsVGhpc1JlZnMsXG4gICAgICBzY3V0dGxlR2xvYmFsVGhpcyxcbiAgICAgIHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9ucyxcbiAgICAgIGRlYnVnTW9kZSxcbiAgICAgIHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXMsXG4gICAgICByZXBvcnRTdGF0c0hvb2ssXG4gICAgfSlcblxuICAgIHJldHVybiBsYXZhbW9hdEtlcm5lbFxuICB9XG5cbiAgLy8gdGhpcyBpcyBzZXJpYWxpemVkIGFuZCBydW4gaW4gYSBTRVMgQ29tcGFydG1lbnQgd2hlbiBcInJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXNcIiBpcyBmYWxzZVxuICAvLyBtb3N0bHkganVzdCBleGlzdHMgdG8gZXhwb3NlIHZhcmlhYmxlcyB0byBpbnRlcm5hbFJlcXVpcmUgYW5kIGxvYWRCdW5kbGVcbiAgZnVuY3Rpb24gdW5zYWZlTWFrZUtlcm5lbENvcmUgKHtcbiAgICBnbG9iYWxSZWYsXG4gICAgbGF2YW1vYXRDb25maWcsXG4gICAgbG9hZE1vZHVsZURhdGEsXG4gICAgZ2V0UmVsYXRpdmVNb2R1bGVJZCxcbiAgICBwcmVwYXJlTW9kdWxlSW5pdGlhbGl6ZXJBcmdzLFxuICAgIGdldEV4dGVybmFsQ29tcGFydG1lbnQsXG4gICAgZ2xvYmFsVGhpc1JlZnMgPSBbJ2dsb2JhbFRoaXMnXSxcbiAgICBzY3V0dGxlR2xvYmFsVGhpcyA9IGZhbHNlLFxuICAgIHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9ucyA9IFtdLFxuICAgIGRlYnVnTW9kZSA9IGZhbHNlLFxuICAgIHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXMgPSBmYWxzZSxcbiAgICByZXBvcnRTdGF0c0hvb2sgPSAoKSA9PiB7fSxcbiAgfSkge1xuICAgIC8vIFwidGVtcGxhdGVSZXF1aXJlXCIgY2FsbHMgYXJlIGlubGluZWQgaW4gXCJnZW5lcmF0ZUtlcm5lbFwiXG4gICAgY29uc3QgZ2VuZXJhbFV0aWxzID0gLy8gZGVmaW5lIG1ha2VHZW5lcmFsVXRpbHNcbihmdW5jdGlvbigpe1xuICBjb25zdCBnbG9iYWwgPSBnbG9iYWxSZWZcbiAgY29uc3QgZXhwb3J0cyA9IHt9XG4gIGNvbnN0IG1vZHVsZSA9IHsgZXhwb3J0cyB9XG4gIDsoZnVuY3Rpb24oKXtcbi8vIFNUQVJUIG9mIGluamVjdGVkIGNvZGUgZnJvbSBtYWtlR2VuZXJhbFV0aWxzXG5tb2R1bGUuZXhwb3J0cyA9IG1ha2VHZW5lcmFsVXRpbHNcblxuZnVuY3Rpb24gbWFrZUdlbmVyYWxVdGlscyAoKSB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlRnVuY3Rpb25XcmFwcGVyLFxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb25XcmFwcGVyIChzb3VyY2VWYWx1ZSwgdW53cmFwVGVzdCwgdW53cmFwVG8pIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICBpZiAobmV3LnRhcmdldCkge1xuICAgICAgICAvLyBoYW5kbGUgY29uc3RydWN0b3IgY2FsbHNcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuY29uc3RydWN0KHNvdXJjZVZhbHVlLCBhcmdzLCBuZXcudGFyZ2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaGFuZGxlIGZ1bmN0aW9uIGNhbGxzXG4gICAgICAgIC8vIHVud3JhcCB0byB0YXJnZXQgdmFsdWUgaWYgdGhpcyB2YWx1ZSBpcyB0aGUgc291cmNlIHBhY2thZ2UgY29tcGFydG1lbnQncyBnbG9iYWxUaGlzXG4gICAgICAgIGNvbnN0IHRoaXNSZWYgPSB1bndyYXBUZXN0KHRoaXMpID8gdW53cmFwVG8gOiB0aGlzXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHNvdXJjZVZhbHVlLCB0aGlzUmVmLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuZXdWYWx1ZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlVmFsdWUpKVxuICAgIHJldHVybiBuZXdWYWx1ZVxuICB9XG59XG5cbi8vIEVORCBvZiBpbmplY3RlZCBjb2RlIGZyb20gbWFrZUdlbmVyYWxVdGlsc1xuICB9KSgpXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0c1xufSkoKSgpXG4gICAgY29uc3QgeyBnZXRFbmRvd21lbnRzRm9yQ29uZmlnLCBtYWtlTWluaW1hbFZpZXdPZlJlZiwgYXBwbHlFbmRvd21lbnRQcm9wRGVzY1RyYW5zZm9ybXMgfSA9IC8vIGRlZmluZSBtYWtlR2V0RW5kb3dtZW50c0ZvckNvbmZpZ1xuKGZ1bmN0aW9uKCl7XG4gIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFJlZlxuICBjb25zdCBleHBvcnRzID0ge31cbiAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzIH1cbiAgOyhmdW5jdGlvbigpe1xuLy8gU1RBUlQgb2YgaW5qZWN0ZWQgY29kZSBmcm9tIG1ha2VHZXRFbmRvd21lbnRzRm9yQ29uZmlnXG4vLyB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIHdpbGwgYmUgY29waWVkIGludG8gdGhlIHByZWx1ZGUgdGVtcGxhdGVcbi8vIHRoaXMgbW9kdWxlIGhhcyBiZWVuIHdyaXR0ZW4gc28gdGhhdCBpdCByZXF1aXJlZCBkaXJlY3RseSBvciBjb3BpZWQgYW5kIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSB3aXRoIGEgc21hbGwgd3JhcHBlclxubW9kdWxlLmV4cG9ydHMgPSBtYWtlR2V0RW5kb3dtZW50c0ZvckNvbmZpZ1xuXG4vLyB1dGlsaXRpZXMgZm9yIGdlbmVyYXRpbmcgdGhlIGVuZG93bWVudHMgb2JqZWN0IGJhc2VkIG9uIGEgZ2xvYmFsUmVmIGFuZCBhIGNvbmZpZ1xuXG4vLyBUaGUgY29uZmlnIHVzZXMgYSBwZXJpb2QtZGVsaW1pbmF0ZWQgcGF0aCBub3RhdGlvbiB0byBwdWxsIG91dCBkZWVwIHZhbHVlcyBmcm9tIG9iamVjdHNcbi8vIFRoZXNlIHV0aWxpdGllcyBoZWxwIGNyZWF0ZSBhbiBvYmplY3QgcG9wdWxhdGVkIHdpdGggb25seSB0aGUgZGVlcCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnXG5cbmZ1bmN0aW9uIG1ha2VHZXRFbmRvd21lbnRzRm9yQ29uZmlnICh7IGNyZWF0ZUZ1bmN0aW9uV3JhcHBlciB9KSB7XG4gIHJldHVybiB7XG4gICAgZ2V0RW5kb3dtZW50c0ZvckNvbmZpZyxcbiAgICBtYWtlTWluaW1hbFZpZXdPZlJlZixcbiAgICBjb3B5VmFsdWVBdFBhdGgsXG4gICAgYXBwbHlHZXRTZXRQcm9wRGVzY1RyYW5zZm9ybXMsXG4gICAgYXBwbHlFbmRvd21lbnRQcm9wRGVzY1RyYW5zZm9ybXMsXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGdldEVuZG93bWVudHNGb3JDb25maWdcbiAgICogQHBhcmFtIHtvYmplY3R9IHNvdXJjZVJlZiAtIE9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllc1xuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gTGF2YU1vYXQgcGFja2FnZSBjb25maWdcbiAgICogQHBhcmFtIHtvYmplY3R9IHVud3JhcFRvIC0gRm9yIGdldHRlcnMgYW5kIHNldHRlcnMsIHdoZW4gdGhlIHRoaXMtdmFsdWUgaXMgdW53cmFwRnJvbSwgaXMgcmVwbGFjZWQgYXMgdW53cmFwVG9cbiAgICogQHBhcmFtIHtvYmplY3R9IHVud3JhcEZyb20gLSBGb3IgZ2V0dGVycyBhbmQgc2V0dGVycywgdGhlIHRoaXMtdmFsdWUgdG8gcmVwbGFjZSAoZGVmYXVsdDogdGFyZ2V0UmVmKVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IC0gVGhlIHRhcmdldFJlZlxuICAgKlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RW5kb3dtZW50c0ZvckNvbmZpZyAoc291cmNlUmVmLCBjb25maWcsIHVud3JhcFRvLCB1bndyYXBGcm9tKSB7XG4gICAgaWYgKCFjb25maWcuZ2xvYmFscykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIC8vIHZhbGlkYXRlIHJlYWQgYWNjZXNzIGZyb20gY29uZmlnXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRSZWFkcyA9IFtdXG4gICAgY29uc3QgZXhwbGljaXRseUJhbm5lZCA9IFtdXG4gICAgT2JqZWN0LmVudHJpZXMoY29uZmlnLmdsb2JhbHMpLmZvckVhY2goKFtwYXRoLCBjb25maWdWYWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHBhdGguc3BsaXQoJy4nKVxuICAgICAgLy8gZGlzYWxsb3cgZHVuZGVyIHByb3RvIGluIHBhdGhcbiAgICAgIGNvbnN0IHBhdGhDb250YWluc0R1bmRlclByb3RvID0gcGF0aFBhcnRzLnNvbWUocGF0aFBhcnQgPT4gcGF0aFBhcnQgPT09ICdfX3Byb3RvX18nKVxuICAgICAgaWYgKHBhdGhDb250YWluc0R1bmRlclByb3RvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YW1vYXQgLSBcIl9fcHJvdG9fX1wiIGRpc2FsbG93ZWQgd2hlbiBjcmVhdGluZyBtaW5pYWwgdmlldy4gc2F3IFwiJHtwYXRofVwiYClcbiAgICAgIH1cbiAgICAgIC8vIGZhbHNlIG1lYW5zIG5vIGFjY2Vzcy4gSXQncyBuZWNlc3Nhcnkgc28gdGhhdCBvdmVycmlkZXMgY2FuIGFsc28gYmUgdXNlZCB0byB0aWdodGVuIHRoZSBwb2xpY3lcbiAgICAgIGlmIChjb25maWdWYWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgZXhwbGljaXRseUJhbm5lZC5wdXNoKHBhdGgpXG4gICAgICAgIHJldHVybiBcbiAgICAgIH1cbiAgICAgIC8vIHdyaXRlIGFjY2VzcyBoYW5kbGVkIGVsc2V3aGVyZVxuICAgICAgaWYgKGNvbmZpZ1ZhbHVlID09PSAnd3JpdGUnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZ1ZhbHVlICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YU1vYXQgLSB1bnJlY29nbml6YWJsZSBwb2xpY3kgdmFsdWUgKCR7dHlwZW9mIGNvbmZpZ1ZhbHVlfSkgZm9yIHBhdGggXCIke3BhdGh9XCJgKVxuICAgICAgfVxuICAgICAgd2hpdGVsaXN0ZWRSZWFkcy5wdXNoKHBhdGgpXG4gICAgfSlcbiAgICByZXR1cm4gbWFrZU1pbmltYWxWaWV3T2ZSZWYoc291cmNlUmVmLCB3aGl0ZWxpc3RlZFJlYWRzLCB1bndyYXBUbywgdW53cmFwRnJvbSwgZXhwbGljaXRseUJhbm5lZClcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VNaW5pbWFsVmlld09mUmVmIChzb3VyY2VSZWYsIHBhdGhzLCB1bndyYXBUbywgdW53cmFwRnJvbSwgZXhwbGljaXRseUJhbm5lZCA9IFtdKSB7XG4gICAgY29uc3QgdGFyZ2V0UmVmID0ge31cbiAgICBwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuICAgICAgY29weVZhbHVlQXRQYXRoKCcnLCBwYXRoLnNwbGl0KCcuJyksIGV4cGxpY2l0bHlCYW5uZWQsIHNvdXJjZVJlZiwgdGFyZ2V0UmVmLCB1bndyYXBUbywgdW53cmFwRnJvbSlcbiAgICB9KVxuICAgIHJldHVybiB0YXJnZXRSZWZcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4dGVuZFBhdGgodmlzaXRlZCwgbmV4dCkge1xuICAgIGlmICghdmlzaXRlZCB8fCB2aXNpdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5leHRcbiAgICB9XG4gICAgcmV0dXJuIGAke3Zpc2l0ZWR9LiR7bmV4dH1gXG4gIH1cblxuICBmdW5jdGlvbiBjb3B5VmFsdWVBdFBhdGggKHZpc2l0ZWRQYXRoLCBwYXRoUGFydHMsIGV4cGxpY2l0bHlCYW5uZWQsIHNvdXJjZVJlZiwgdGFyZ2V0UmVmLCB1bndyYXBUbyA9IHNvdXJjZVJlZiwgdW53cmFwRnJvbSA9IHRhcmdldFJlZikge1xuICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBjb3B5LCBtdXN0IGhhdmUgcGF0aFBhcnRzLCB3YXMgZW1wdHknKVxuICAgIH1cbiAgICBjb25zdCBbbmV4dFBhcnQsIC4uLnJlbWFpbmluZ1BhcnRzXSA9IHBhdGhQYXJ0c1xuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gZXh0ZW5kUGF0aCh2aXNpdGVkUGF0aCwgbmV4dFBhcnQpXG4gICAgLy8gZ2V0IHRoZSBwcm9wZXJ0eSBmcm9tIGFueSBkZXB0aCBpbiB0aGUgcHJvcGVydHkgY2hhaW5cbiAgICBjb25zdCB7IHByb3A6IHNvdXJjZVByb3BEZXNjIH0gPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JEZWVwKHNvdXJjZVJlZiwgbmV4dFBhcnQpXG5cbiAgICAvLyBpZiBzb3VyY2UgbWlzc2luZyB0aGUgdmFsdWUgdG8gY29weSwganVzdCBza2lwIGl0XG4gICAgaWYgKCFzb3VyY2VQcm9wRGVzYykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gaWYgdGFyZ2V0IGFscmVhZHkgaGFzIGEgdmFsdWUsIGl0IG11c3QgYmUgZXh0ZW5zaWJsZVxuICAgIGNvbnN0IHRhcmdldFByb3BEZXNjID0gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0UmVmLCBuZXh0UGFydClcbiAgICBpZiAodGFyZ2V0UHJvcERlc2MpIHtcbiAgICAgIC8vIGRvbnQgYXR0ZW1wdCB0byBleHRlbmQgYSBnZXR0ZXIgb3IgdHJpZ2dlciBhIHNldHRlclxuICAgICAgaWYgKCEoJ3ZhbHVlJyBpbiB0YXJnZXRQcm9wRGVzYykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmFibGUgdG8gY29weSBvbiB0byB0YXJnZXRSZWYsIHRhcmdldFJlZiBoYXMgYSBnZXR0ZXIgYXQgXCIke25leHRQYXJ0fVwiYClcbiAgICAgIH1cbiAgICAgIC8vIHZhbHVlIG11c3QgYmUgZXh0ZW5zaWJsZSAoY2FudCB3cml0ZSBwcm9wZXJ0aWVzIG9udG8gaXQpXG4gICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9IHRhcmdldFByb3BEZXNjLnZhbHVlXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0eXBlb2YgdGFyZ2V0VmFsdWVcbiAgICAgIGlmICh2YWx1ZVR5cGUgIT09ICdvYmplY3QnICYmIHZhbHVlVHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuYWJsZSB0byBjb3B5IG9uIHRvIHRhcmdldFJlZiwgdGFyZ2V0UmVmIHZhbHVlIGlzIG5vdCBhbiBvYmogb3IgZnVuYyBcIiR7bmV4dFBhcnR9XCJgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoaXMgaXMgbm90IHRoZSBsYXN0IHBhdGggaW4gdGhlIGFzc2lnbm1lbnQsIHdhbGsgaW50byB0aGUgY29udGFpbmluZyByZWZlcmVuY2VcbiAgICBpZiAocmVtYWluaW5nUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBzb3VyY2VWYWx1ZSwgc291cmNlV3JpdGFibGUgfSA9IGdldFNvdXJjZVZhbHVlKClcbiAgICAgIGNvbnN0IG5leHRTb3VyY2VSZWYgPSBzb3VyY2VWYWx1ZVxuICAgICAgbGV0IG5leHRUYXJnZXRSZWZcbiAgICAgIC8vIGNoZWNrIGlmIHZhbHVlIGV4aXN0cyBvbiB0YXJnZXQgYW5kIGRvZXMgbm90IG5lZWQgc2VsZWN0aXZlIHRyZWF0bWVudFxuICAgICAgaWYgKHRhcmdldFByb3BEZXNjICYmICFleHBsaWNpdGx5QmFubmVkLmluY2x1ZGVzKGN1cnJlbnRQYXRoKSkge1xuICAgICAgICAvLyBhIHZhbHVlIGFscmVhZHkgZXhpc3RzLCB3ZSBzaG91bGQgd2FsayBpbnRvIGl0XG4gICAgICAgIG5leHRUYXJnZXRSZWYgPSB0YXJnZXRQcm9wRGVzYy52YWx1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaXRzIG5vdCBwb3B1bGF0ZWQgc28gbGV0cyB3cml0ZSB0byBpdFxuICAgICAgICAvLyBwdXQgYW4gb2JqZWN0IHRvIHNlcnZlIGFzIGEgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IHt9XG4gICAgICAgIGNvbnN0IG5ld1Byb3BEZXNjID0ge1xuICAgICAgICAgIHZhbHVlOiBjb250YWluZXJSZWYsXG4gICAgICAgICAgd3JpdGFibGU6IHNvdXJjZVdyaXRhYmxlLFxuICAgICAgICAgIGVudW1lcmFibGU6IHNvdXJjZVByb3BEZXNjLmVudW1lcmFibGUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiBzb3VyY2VQcm9wRGVzYy5jb25maWd1cmFibGUsXG4gICAgICAgIH1cbiAgICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXRSZWYsIG5leHRQYXJ0LCBuZXdQcm9wRGVzYylcbiAgICAgICAgLy8gdGhlIG5ld2x5IGNyZWF0ZWQgY29udGFpbmVyIHdpbGwgYmUgdGhlIG5leHQgdGFyZ2V0XG4gICAgICAgIG5leHRUYXJnZXRSZWYgPSBjb250YWluZXJSZWZcbiAgICAgIH1cbiAgICAgIGNvcHlWYWx1ZUF0UGF0aChjdXJyZW50UGF0aCwgcmVtYWluaW5nUGFydHMsIGV4cGxpY2l0bHlCYW5uZWQsIG5leHRTb3VyY2VSZWYsIG5leHRUYXJnZXRSZWYpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBjb25mbGljdGluZyBydWxlcyBleGlzdCwgb3B0IGZvciB0aGUgbmVnYXRpdmUgb25lLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW5cbiAgICBpZiAoZXhwbGljaXRseUJhbm5lZC5pbmNsdWRlcyhjdXJyZW50UGF0aCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgTGF2YU1vYXQgLSBjb25mbGljdGluZyBydWxlcyBleGlzdCBmb3IgXCIke2N1cnJlbnRQYXRofVwiYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aCwgdGhlIHZhbHVlIHdlJ3JlIHRyeWluZyB0byBhY3R1YWxseSBjb3B5XG4gICAgLy8gaWYgaGFzIGdldHRlci9zZXR0ZXIgLSBhcHBseSB0aGlzLXZhbHVlIHVud3JhcHBpbmdcbiAgICBpZiAoISgndmFsdWUnIGluIHNvdXJjZVByb3BEZXNjKSkge1xuICAgICAgLy8gd3JhcHBlciBzZXR0ZXIvZ2V0dGVyIHdpdGggY29ycmVjdCByZWNlaXZlclxuICAgICAgY29uc3Qgd3JhcHBlclByb3BEZXNjID0gYXBwbHlHZXRTZXRQcm9wRGVzY1RyYW5zZm9ybXMoc291cmNlUHJvcERlc2MsIHVud3JhcEZyb20sIHVud3JhcFRvKVxuICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXRSZWYsIG5leHRQYXJ0LCB3cmFwcGVyUHJvcERlc2MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBuZWVkIHRvIGRldGVybWluZSB0aGUgdmFsdWUgdHlwZSBpbiBvcmRlciB0byBjb3B5IGl0IHdpdGhcbiAgICAvLyB0aGlzLXZhbHVlIHVud3JhcHBpbmcgc3VwcG9ydFxuICAgIGNvbnN0IHsgc291cmNlVmFsdWUsIHNvdXJjZVdyaXRhYmxlIH0gPSBnZXRTb3VyY2VWYWx1ZSgpXG5cbiAgICAvLyBub3QgYSBmdW5jdGlvbiAtIGNvcHkgYXMgaXNcbiAgICBpZiAodHlwZW9mIHNvdXJjZVZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldFJlZiwgbmV4dFBhcnQsIHNvdXJjZVByb3BEZXNjKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIG90aGVyd2lzZSBhZGQgd29ya2Fyb3VuZCBmb3IgZnVuY3Rpb25zIHRvIHN3YXAgYmFjayB0byB0aGUgc291cmNlYWwgXCJ0aGlzXCIgcmVmZXJlbmNlXG4gICAgY29uc3QgdW53cmFwVGVzdCA9IHRoaXNWYWx1ZSA9PiB0aGlzVmFsdWUgPT09IHVud3JhcEZyb21cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGNyZWF0ZUZ1bmN0aW9uV3JhcHBlcihzb3VyY2VWYWx1ZSwgdW53cmFwVGVzdCwgdW53cmFwVG8pXG4gICAgY29uc3QgbmV3UHJvcERlc2MgPSB7XG4gICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICB3cml0YWJsZTogc291cmNlV3JpdGFibGUsXG4gICAgICBlbnVtZXJhYmxlOiBzb3VyY2VQcm9wRGVzYy5lbnVtZXJhYmxlLFxuICAgICAgY29uZmlndXJhYmxlOiBzb3VyY2VQcm9wRGVzYy5jb25maWd1cmFibGUsXG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0UmVmLCBuZXh0UGFydCwgbmV3UHJvcERlc2MpXG5cbiAgICBmdW5jdGlvbiBnZXRTb3VyY2VWYWx1ZSAoKSB7XG4gICAgICAvLyBkZXRlcm1pbmUgdGhlIHNvdXJjZSB2YWx1ZSwgdGhpcyBjb2VyY2VzIGdldHRlcnMgdG8gdmFsdWVzXG4gICAgICAvLyBpbSBkZWVwbHkgc29ycnksIHJlc3BlY3RpbmcgZ2V0dGVycyB3YXMgY29tcGxpY2F0ZWQgYW5kXG4gICAgICAvLyBteSBicmFpbiBpcyBub3QgdmVyeSBnb29kXG4gICAgICBsZXQgc291cmNlVmFsdWUsIHNvdXJjZVdyaXRhYmxlXG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBzb3VyY2VQcm9wRGVzYykge1xuICAgICAgICBzb3VyY2VWYWx1ZSA9IHNvdXJjZVByb3BEZXNjLnZhbHVlXG4gICAgICAgIHNvdXJjZVdyaXRhYmxlID0gc291cmNlUHJvcERlc2Mud3JpdGFibGVcbiAgICAgIH0gZWxzZSBpZiAoJ2dldCcgaW4gc291cmNlUHJvcERlc2MpIHtcbiAgICAgICAgc291cmNlVmFsdWUgPSBzb3VyY2VQcm9wRGVzYy5nZXQuY2FsbCh1bndyYXBUbylcbiAgICAgICAgc291cmNlV3JpdGFibGUgPSAnc2V0JyBpbiBzb3VyY2VQcm9wRGVzY1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRFbmRvd21lbnRzRm9yQ29uZmlnIC0gcHJvcGVydHkgZGVzY3JpcHRvciBtaXNzaW5nIGEgZ2V0dGVyJylcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHNvdXJjZVZhbHVlLCBzb3VyY2VXcml0YWJsZSB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlFbmRvd21lbnRQcm9wRGVzY1RyYW5zZm9ybXMgKHByb3BEZXNjLCB1bndyYXBGcm9tQ29tcGFydG1lbnQsIHVud3JhcFRvR2xvYmFsVGhpcykge1xuICAgIGxldCBuZXdQcm9wRGVzYyA9IHByb3BEZXNjXG4gICAgbmV3UHJvcERlc2MgPSBhcHBseUZ1bmN0aW9uUHJvcERlc2NUcmFuc2Zvcm0obmV3UHJvcERlc2MsIHVud3JhcEZyb21Db21wYXJ0bWVudCwgdW53cmFwVG9HbG9iYWxUaGlzKVxuICAgIG5ld1Byb3BEZXNjID0gYXBwbHlHZXRTZXRQcm9wRGVzY1RyYW5zZm9ybXMobmV3UHJvcERlc2MsIHVud3JhcEZyb21Db21wYXJ0bWVudC5nbG9iYWxUaGlzLCB1bndyYXBUb0dsb2JhbFRoaXMpXG4gICAgcmV0dXJuIG5ld1Byb3BEZXNjXG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUdldFNldFByb3BEZXNjVHJhbnNmb3JtcyAoc291cmNlUHJvcERlc2MsIHVud3JhcEZyb21HbG9iYWxUaGlzLCB1bndyYXBUb0dsb2JhbFRoaXMpIHtcbiAgICBjb25zdCB3cmFwcGVkUHJvcERlc2MgPSB7IC4uLnNvdXJjZVByb3BEZXNjIH1cbiAgICBpZiAoc291cmNlUHJvcERlc2MuZ2V0KSB7XG4gICAgICB3cmFwcGVkUHJvcERlc2MuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZWNlaXZlciA9IHRoaXNcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgXCJyZWNlaXZlclwiIHZhbHVlIGlmIGl0IHBvaW50cyB0byBmYWtlIHBhcmVudFxuICAgICAgICBjb25zdCByZWNlaXZlclJlZiA9IHJlY2VpdmVyID09PSB1bndyYXBGcm9tR2xvYmFsVGhpcyA/IHVud3JhcFRvR2xvYmFsVGhpcyA6IHJlY2VpdmVyXG4gICAgICAgIC8vIHNvbWV0aW1lcyBnZXR0ZXJzIHJlcGxhY2UgdGhlbXNlbHZlcyB3aXRoIHN0YXRpYyBwcm9wZXJ0aWVzLCBhcyBzZWVuIHdpaCB0aGUgRmlyZUZveCBydW50aW1lXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoc291cmNlUHJvcERlc2MuZ2V0LCByZWNlaXZlclJlZiwgW10pXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gZnVuY3Rpb25zIG11c3QgYmUgd3JhcHBlZCB0byBlbnN1cmUgYSBnb29kIHRoaXMtdmFsdWUuXG4gICAgICAgICAgLy8gbG9ja2Rvd24gY2F1c2VzIHNvbWUgcHJvcERlc2NzIHRvIGdvIHRvIHZhbHVlIC0+IGdldHRlcixcbiAgICAgICAgICAvLyBlZyBcIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXCIuIHdlIG5lZWQgdG8gd3JhcCBnZXR0ZXIgcmVzdWx0c1xuICAgICAgICAgIC8vIGFzIHdlbGwgaW4gb3JkZXIgdG8gZW5zdXJlIHRoZXkgaGF2ZSB0aGVpciB0aGlzLXZhbHVlIHdyYXBwZWQgY29ycmVjdGx5XG4gICAgICAgICAgLy8gaWYgdGhpcyBlbmRzIHVwIGJlaW5nIHByb2JsZW1hdGljIHdlIGNhbiBtYXliZSB0YWtlIGFkdmFudGFnZSBvZiBsb2NrZG93bidzXG4gICAgICAgICAgLy8gXCJnZXR0ZXIub3JpZ2luYWxWYWx1ZVwiIHByb3BlcnR5IGJlaW5nIGF2YWlsYWJsZVxuICAgICAgICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbldyYXBwZXIocmVzdWx0LCAodGhpc1ZhbHVlKSA9PiB0aGlzVmFsdWUgPT09IHVud3JhcEZyb21HbG9iYWxUaGlzLCB1bndyYXBUb0dsb2JhbFRoaXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2VQcm9wRGVzYy5zZXQpIHtcbiAgICAgIHdyYXBwZWRQcm9wRGVzYy5zZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gcmVwbGFjZSB0aGUgXCJyZWNlaXZlclwiIHZhbHVlIGlmIGl0IHBvaW50cyB0byBmYWtlIHBhcmVudFxuICAgICAgICBjb25zdCByZWNlaXZlciA9IHRoaXNcbiAgICAgICAgY29uc3QgcmVjZWl2ZXJSZWYgPSByZWNlaXZlciA9PT0gdW53cmFwRnJvbUdsb2JhbFRoaXMgPyB1bndyYXBUb0dsb2JhbFRoaXMgOiByZWNlaXZlclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShzb3VyY2VQcm9wRGVzYy5zZXQsIHJlY2VpdmVyUmVmLCBbdmFsdWVdKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZFByb3BEZXNjXG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUZ1bmN0aW9uUHJvcERlc2NUcmFuc2Zvcm0gKHByb3BEZXNjLCB1bndyYXBGcm9tQ29tcGFydG1lbnQsIHVud3JhcFRvR2xvYmFsVGhpcykge1xuICAgIGlmICghKCd2YWx1ZScgaW4gcHJvcERlc2MgJiYgdHlwZW9mIHByb3BEZXNjLnZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgcmV0dXJuIHByb3BEZXNjXG4gICAgfVxuICAgIGNvbnN0IHVud3JhcFRlc3QgPSAodGhpc1ZhbHVlKSA9PiB7XG4gICAgICAvLyB1bndyYXAgZnVuY3Rpb24gY2FsbHMgdGhpcy12YWx1ZSB0byB1bndyYXBUb0dsb2JhbFRoaXMgd2hlbjpcbiAgICAgIC8vIHRoaXMgdmFsdWUgaXMgZ2xvYmFsVGhpcyBleC4gZ2xvYmFsVGhpcy5hYmMoKVxuICAgICAgLy8gc2NvcGUgcHJveHkgbGVhayB3b3JrYXJvdW5kIGV4LiBhYmMoKVxuICAgICAgcmV0dXJuIHRoaXNWYWx1ZSA9PT0gdW53cmFwRnJvbUNvbXBhcnRtZW50Lmdsb2JhbFRoaXNcbiAgICB9XG4gICAgY29uc3QgbmV3Rm4gPSBjcmVhdGVGdW5jdGlvbldyYXBwZXIocHJvcERlc2MudmFsdWUsIHVud3JhcFRlc3QsIHVud3JhcFRvR2xvYmFsVGhpcylcbiAgICByZXR1cm4geyAuLi5wcm9wRGVzYywgdmFsdWU6IG5ld0ZuIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JEZWVwICh0YXJnZXQsIGtleSkge1xuICBsZXQgcmVjZWl2ZXIgPSB0YXJnZXRcbiAgd2hpbGUgKHRydWUpIHtcbiAgICAvLyBhYm9ydCBpZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICBpZiAoIXJlY2VpdmVyKSB7XG4gICAgICByZXR1cm4geyBwcm9wOiBudWxsLCByZWNlaXZlcjogbnVsbCB9XG4gICAgfVxuICAgIC8vIHN1cHBvcnQgbG9va3VwIG9uIG9iamVjdHMgYW5kIHByaW1pdGl2ZXNcbiAgICBjb25zdCB0eXBlb2ZSZWNlaXZlciA9IHR5cGVvZiByZWNlaXZlclxuICAgIGlmICh0eXBlb2ZSZWNlaXZlciA9PT0gJ29iamVjdCcgfHwgdHlwZW9mUmVjZWl2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHByb3AgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWNlaXZlciwga2V5KVxuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIHsgcmVjZWl2ZXIsIHByb3AgfVxuICAgICAgfVxuICAgICAgLy8gdHJ5IG5leHQgaW4gdGhlIHByb3RvdHlwZSBjaGFpblxuICAgICAgcmVjZWl2ZXIgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHJlY2VpdmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBwcm90b3R5cGUgbG9va3VwIGZvciBwcmltaXRpdmVzXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG9cbiAgICAgIHJlY2VpdmVyID0gcmVjZWl2ZXIuX19wcm90b19fXG4gICAgfVxuICB9XG59XG5cbi8vIEVORCBvZiBpbmplY3RlZCBjb2RlIGZyb20gbWFrZUdldEVuZG93bWVudHNGb3JDb25maWdcbiAgfSkoKVxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHNcbn0pKCkoZ2VuZXJhbFV0aWxzKVxuICAgIGNvbnN0IHsgcHJlcGFyZUNvbXBhcnRtZW50R2xvYmFsRnJvbUNvbmZpZyB9ID0gLy8gZGVmaW5lIG1ha2VQcmVwYXJlUmVhbG1HbG9iYWxGcm9tQ29uZmlnXG4oZnVuY3Rpb24oKXtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsUmVmXG4gIGNvbnN0IGV4cG9ydHMgPSB7fVxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHMgfVxuICA7KGZ1bmN0aW9uKCl7XG4vLyBTVEFSVCBvZiBpbmplY3RlZCBjb2RlIGZyb20gbWFrZVByZXBhcmVSZWFsbUdsb2JhbEZyb21Db25maWdcbi8vIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgcHJlbHVkZSB0ZW1wbGF0ZVxuLy8gdGhpcyBtb2R1bGUgaGFzIGJlZW4gd3JpdHRlbiBzbyB0aGF0IGl0IHJlcXVpcmVkIGRpcmVjdGx5IG9yIGNvcGllZCBhbmQgYWRkZWQgdG8gdGhlIHRlbXBsYXRlIHdpdGggYSBzbWFsbCB3cmFwcGVyXG5tb2R1bGUuZXhwb3J0cyA9IG1ha2VQcmVwYXJlUmVhbG1HbG9iYWxGcm9tQ29uZmlnXG5cbi8vIHV0aWxpdGllcyBmb3IgZXhwb3NpbmcgY29uZmlndXJpbmcgdGhlIGV4cG9zZWQgZW5kb3dtZW50cyBvbiB0aGUgY29udGFpbmVyIGdsb2JhbFxuXG4vLyBUaGUgY29uZmlnIHVzZXMgYSBwZXJpb2QtZGVsaW1pbmF0ZWQgcGF0aCBub3RhdGlvbiB0byBwdWxsIG91dCBkZWVwIHZhbHVlcyBmcm9tIG9iamVjdHNcbi8vIFRoZXNlIHV0aWxpdGllcyBoZWxwIG1vZGlmeSB0aGUgY29udGFpbmVyIGdsb2JhbCB0byBleHBvc2UgdGhlIGFsbG93ZWQgZ2xvYmFscyBmcm9tIHRoZSBnbG9iYWxTdG9yZSBPUiB0aGUgcGxhdGZvcm0gZ2xvYmFsXG5cbmZ1bmN0aW9uIG1ha2VQcmVwYXJlUmVhbG1HbG9iYWxGcm9tQ29uZmlnICh7IGNyZWF0ZUZ1bmN0aW9uV3JhcHBlciB9KSB7XG4gIHJldHVybiB7XG4gICAgcHJlcGFyZUNvbXBhcnRtZW50R2xvYmFsRnJvbUNvbmZpZyxcbiAgICBnZXRUb3BMZXZlbFJlYWRBY2Nlc3NGcm9tUGFja2FnZUNvbmZpZyxcbiAgICBnZXRUb3BMZXZlbFdyaXRlQWNjZXNzRnJvbVBhY2thZ2VDb25maWcsXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb3BMZXZlbFJlYWRBY2Nlc3NGcm9tUGFja2FnZUNvbmZpZyAoZ2xvYmFsc0NvbmZpZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKGdsb2JhbHNDb25maWcpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlID09PSAncmVhZCcgfHwgdmFsdWUgPT09IHRydWUgfHwgKHZhbHVlID09PSAnd3JpdGUnICYmIGtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDEpKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleS5zcGxpdCgnLicpWzBdKVxuICAgIC8vIHJldHVybiB1bmlxdWUgYXJyYXlcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHJlc3VsdCkpXG4gIH1cblxuICBmdW5jdGlvbiBnZXRUb3BMZXZlbFdyaXRlQWNjZXNzRnJvbVBhY2thZ2VDb25maWcgKGdsb2JhbHNDb25maWcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhnbG9iYWxzQ29uZmlnKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSA9PT0gJ3dyaXRlJyAmJiBrZXkuc3BsaXQoJy4nKS5sZW5ndGggPT09IDEpXG4gICAgICAubWFwKChba2V5XSkgPT4ga2V5KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVDb21wYXJ0bWVudEdsb2JhbEZyb21Db25maWcgKHBhY2thZ2VDb21wYXJ0bWVudCwgZ2xvYmFsc0NvbmZpZywgZW5kb3dtZW50cywgZ2xvYmFsU3RvcmUsIGdsb2JhbFRoaXNSZWZzKSB7XG4gICAgY29uc3QgcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsID0gcGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXNcbiAgICAvLyBsb29rdXAgdG9wIGxldmVsIHJlYWQgKyB3cml0ZSBhY2Nlc3Mga2V5c1xuICAgIGNvbnN0IHRvcExldmVsV3JpdGVBY2Nlc3NLZXlzID0gZ2V0VG9wTGV2ZWxXcml0ZUFjY2Vzc0Zyb21QYWNrYWdlQ29uZmlnKGdsb2JhbHNDb25maWcpXG4gICAgY29uc3QgdG9wTGV2ZWxSZWFkQWNjZXNzS2V5cyA9IGdldFRvcExldmVsUmVhZEFjY2Vzc0Zyb21QYWNrYWdlQ29uZmlnKGdsb2JhbHNDb25maWcpXG5cbiAgICAvLyBkZWZpbmUgYWNjZXNzb3JzXG5cbiAgICAvLyBhbGxvdyByZWFkIGFjY2VzcyB2aWEgZ2xvYmFsU3RvcmUgb3IgcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsXG4gICAgdG9wTGV2ZWxSZWFkQWNjZXNzS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFja2FnZUNvbXBhcnRtZW50R2xvYmFsLCBrZXksIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICBpZiAoZ2xvYmFsU3RvcmUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxTdG9yZS5nZXQoa2V5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQoZW5kb3dtZW50cywga2V5LCB0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0ICgpIHtcbiAgICAgICAgICAvLyBUT0RPOiB0aGVyZSBzaG91bGQgYmUgYSBjb25maWcgdG8gdGhyb3cgdnMgc2lsZW50bHkgaWdub3JlXG4gICAgICAgICAgY29uc29sZS53YXJuKGBMYXZhTW9hdDogaWdub3Jpbmcgd3JpdGUgYXR0ZW1wdCB0byByZWFkLWFjY2VzcyBnbG9iYWwgXCIke2tleX1cImApXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBhbGxvdyB3cml0ZSBhY2Nlc3MgdG8gZ2xvYmFsU3RvcmVcbiAgICAvLyByZWFkIGFjY2VzcyB2aWEgZ2xvYmFsU3RvcmUgb3IgcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsXG4gICAgdG9wTGV2ZWxXcml0ZUFjY2Vzc0tleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhY2thZ2VDb21wYXJ0bWVudEdsb2JhbCwga2V5LCB7XG4gICAgICAgIGdldCAoKSB7XG4gICAgICAgICAgaWYgKGdsb2JhbFN0b3JlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsU3RvcmUuZ2V0KGtleSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVuZG93bWVudHNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0ICh2YWx1ZSkge1xuICAgICAgICAgIGdsb2JhbFN0b3JlLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICAvLyBzZXQgY2lyY3VsYXIgZ2xvYmFsUmVmc1xuICAgIGdsb2JhbFRoaXNSZWZzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIC8vIGlmIGdsb2JhbFJlZiBpcyBhY3R1YWxseSBhbiBlbmRvd21lbnQsIGlnbm9yZVxuICAgICAgaWYgKHRvcExldmVsUmVhZEFjY2Vzc0tleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh0b3BMZXZlbFdyaXRlQWNjZXNzS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gc2V0IGNpcmN1bGFyIHJlZiB0byBnbG9iYWxcbiAgICAgIHBhY2thZ2VDb21wYXJ0bWVudEdsb2JhbFtrZXldID0gcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsXG4gICAgfSlcblxuICAgIC8vIGJpbmQgRnVuY3Rpb24gY29uc3RydWN0b3IgdGhpcyB2YWx1ZSB0byBnbG9iYWxUaGlzXG4gICAgLy8gbGVnYWN5IGdsb2JhbFRoaXMgc2hpbVxuICAgIGNvbnN0IG9yaWdGdW5jdGlvbiA9IHBhY2thZ2VDb21wYXJ0bWVudEdsb2JhbC5GdW5jdGlvblxuICAgIGNvbnN0IG5ld0Z1bmN0aW9uID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGZuID0gb3JpZ0Z1bmN0aW9uKC4uLmFyZ3MpXG4gICAgICBjb25zdCB1bndyYXBUZXN0ID0gdGhpc1ZhbHVlID0+IHRoaXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25XcmFwcGVyKGZuLCB1bndyYXBUZXN0LCBwYWNrYWdlQ29tcGFydG1lbnRHbG9iYWwpXG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5ld0Z1bmN0aW9uLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnRnVuY3Rpb24pKVxuICAgIHBhY2thZ2VDb21wYXJ0bWVudEdsb2JhbC5GdW5jdGlvbiA9IG5ld0Z1bmN0aW9uXG4gIH1cbn1cblxuLy8gRU5EIG9mIGluamVjdGVkIGNvZGUgZnJvbSBtYWtlUHJlcGFyZVJlYWxtR2xvYmFsRnJvbUNvbmZpZ1xuICB9KSgpXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0c1xufSkoKShnZW5lcmFsVXRpbHMpXG4gICAgY29uc3QgeyBzdHJpY3RTY29wZVRlcm1pbmF0b3IgfSA9IC8vIGRlZmluZSBzdHJpY3Qtc2NvcGUtdGVybWluYXRvclxuKGZ1bmN0aW9uKCl7XG4gIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFJlZlxuICBjb25zdCBleHBvcnRzID0ge31cbiAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzIH1cbiAgOyhmdW5jdGlvbigpe1xuLy8gU1RBUlQgb2YgaW5qZWN0ZWQgY29kZSBmcm9tIHN0cmljdC1zY29wZS10ZXJtaW5hdG9yXG4vLyBpbXBvcnQge1xuLy8gICBQcm94eSxcbi8vICAgU3RyaW5nLFxuLy8gICBUeXBlRXJyb3IsXG4vLyAgIFJlZmVyZW5jZUVycm9yLFxuLy8gICBjcmVhdGUsXG4vLyAgIGZyZWV6ZSxcbi8vICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbi8vICAgZ2xvYmFsVGhpcyxcbi8vICAgaW1tdXRhYmxlT2JqZWN0LFxuLy8gfSBmcm9tICcuL2NvbW1vbnMuanMnO1xuY29uc3QgeyBmcmVlemUsIGNyZWF0ZSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID0gT2JqZWN0O1xuY29uc3QgaW1tdXRhYmxlT2JqZWN0ID0gZnJlZXplKGNyZWF0ZShudWxsKSk7XG5cbi8vIGltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vZXJyb3IvYXNzZXJ0LmpzJztcbmNvbnN0IGFzc2VydCA9IHtcbiAgZmFpbDogKG1zZykgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICB9XG59XG5cbi8vIGNvbnN0IHsgZGV0YWlsczogZCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcbmNvbnN0IGQgPSAoc3RyaW5ncywgYXJncykgPT4gc3RyaW5ncy5qb2luKCkgKyBhcmdzLmpvaW4oKTtcbmNvbnN0IHEgPSAoYXJnKSA9PiBhcmdcblxuLyoqXG4gKiBhbHdheXNUaHJvd0hhbmRsZXJcbiAqIFRoaXMgaXMgYW4gb2JqZWN0IHRoYXQgdGhyb3dzIGlmIGFueSBwcm9wZXJ0eSBpcyBjYWxsZWQuIEl0J3MgdXNlZCBhc1xuICogYSBwcm94eSBoYW5kbGVyIHdoaWNoIHRocm93cyBvbiBhbnkgdHJhcCBjYWxsZWQuXG4gKiBJdCdzIG1hZGUgZnJvbSBhIHByb3h5IHdpdGggYSBnZXQgdHJhcCB0aGF0IHRocm93cy4gSXQncyBzYWZlIHRvXG4gKiBjcmVhdGUgb25lIGFuZCBzaGFyZSBpdCBiZXR3ZWVuIGFsbCBQcm94eSBoYW5kbGVycy5cbiAqL1xuY29uc3QgYWx3YXlzVGhyb3dIYW5kbGVyID0gbmV3IFByb3h5KFxuICBpbW11dGFibGVPYmplY3QsXG4gIGZyZWV6ZSh7XG4gICAgZ2V0KF9zaGFkb3csIHByb3ApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgZGBQbGVhc2UgcmVwb3J0IHVuZXhwZWN0ZWQgc2NvcGUgaGFuZGxlciB0cmFwOiAke3EoU3RyaW5nKHByb3ApKX1gLFxuICAgICAgKTtcbiAgICB9LFxuICB9KSxcbik7XG5cbi8qXG4gKiBzY29wZVByb3h5SGFuZGxlclByb3BlcnRpZXNcbiAqIHNjb3BlVGVybWluYXRvckhhbmRsZXIgbWFuYWdlcyBhIHN0cmljdFNjb3BlVGVybWluYXRvciBQcm94eSB3aGljaCBzZXJ2ZXMgYXNcbiAqIHRoZSBmaW5hbCBzY29wZSBib3VuZGFyeSB0aGF0IHdpbGwgYWx3YXlzIHJldHVybiBcInVuZGVmaW5lZFwiIGluIG9yZGVyXG4gKiB0byBwcmV2ZW50IGFjY2VzcyB0byBcInN0YXJ0IGNvbXBhcnRtZW50IGdsb2JhbHNcIi5cbiAqL1xuY29uc3Qgc2NvcGVQcm94eUhhbmRsZXJQcm9wZXJ0aWVzID0ge1xuICBnZXQoX3NoYWRvdywgX3Byb3ApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LFxuXG4gIHNldChfc2hhZG93LCBwcm9wLCBfdmFsdWUpIHtcbiAgICAvLyBXZSBzaG91bGQgb25seSBoaXQgdGhpcyBpZiB0aGUgaGFzKCkgaG9vayByZXR1cm5lZCB0cnVlIG1hdGNoZXMgdGhlIHY4XG4gICAgLy8gUmVmZXJlbmNlRXJyb3IgbWVzc2FnZSBcIlVuY2F1Z2h0IFJlZmVyZW5jZUVycm9yOiB4eXogaXMgbm90IGRlZmluZWRcIlxuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihgJHtTdHJpbmcocHJvcCl9IGlzIG5vdCBkZWZpbmVkYCk7XG4gIH0sXG5cbiAgaGFzKF9zaGFkb3csIHByb3ApIHtcbiAgICAvLyB3ZSBtdXN0IGF0IGxlYXN0IHJldHVybiB0cnVlIGZvciBhbGwgcHJvcGVydGllcyBvbiB0aGUgcmVhbG0gZ2xvYmFsVGhpc1xuICAgIHJldHVybiBwcm9wIGluIGdsb2JhbFRoaXM7XG4gIH0sXG5cbiAgLy8gbm90ZTogdGhpcyBpcyBsaWtlbHkgYSBidWcgb2Ygc2FmYXJpXG4gIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTU1MzRcbiAgZ2V0UHJvdG90eXBlT2YoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLy8gQ2hpcCBoYXMgc2VlbiB0aGlzIGhhcHBlbiBzaW5nbGUgc3RlcHBpbmcgdW5kZXIgdGhlIENocm9tZS92OCBkZWJ1Z2dlci5cbiAgLy8gVE9ETyByZWNvcmQgaG93IHRvIHJlbGlhYmx5IHJlcHJvZHVjZSwgYW5kIHRvIHRlc3QgaWYgdGhpcyBmaXggaGVscHMuXG4gIC8vIFRPRE8gcmVwb3J0IGFzIGJ1ZyB0byB2OCBvciBDaHJvbWUsIGFuZCByZWNvcmQgaXNzdWUgbGluayBoZXJlLlxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3RhcmdldCwgcHJvcCkge1xuICAgIC8vIENvZXJjZSB3aXRoIGBTdHJpbmdgIGluIGNhc2UgcHJvcCBpcyBhIHN5bWJvbC5cbiAgICBjb25zdCBxdW90ZWRQcm9wID0gcShTdHJpbmcocHJvcCkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYGdldE93blByb3BlcnR5RGVzY3JpcHRvciB0cmFwIG9uIHNjb3BlVGVybWluYXRvckhhbmRsZXIgZm9yICR7cXVvdGVkUHJvcH1gLFxuICAgICAgbmV3IFR5cGVFcnJvcigpLnN0YWNrLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSxcbn07XG5cbi8vIFRoZSBzY29wZSBoYW5kbGVyJ3MgcHJvdG90eXBlIGlzIGEgcHJveHkgdGhhdCB0aHJvd3MgaWYgYW55IHRyYXAgb3RoZXJcbi8vIHRoYW4gZ2V0L3NldC9oYXMgYXJlIHJ1biAobGlrZSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBhcHBseSxcbi8vIGdldFByb3RvdHlwZU9mKS5cbmNvbnN0IHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIgPSBmcmVlemUoXG4gIGNyZWF0ZShcbiAgICBhbHdheXNUaHJvd0hhbmRsZXIsXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzY29wZVByb3h5SGFuZGxlclByb3BlcnRpZXMpLFxuICApLFxuKTtcblxuY29uc3Qgc3RyaWN0U2NvcGVUZXJtaW5hdG9yID0gbmV3IFByb3h5KFxuICBpbW11dGFibGVPYmplY3QsXG4gIHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIsXG4pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgYWx3YXlzVGhyb3dIYW5kbGVyLFxuICBzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyLFxuICBzdHJpY3RTY29wZVRlcm1pbmF0b3IsXG59XG5cbi8vIEVORCBvZiBpbmplY3RlZCBjb2RlIGZyb20gc3RyaWN0LXNjb3BlLXRlcm1pbmF0b3JcbiAgfSkoKVxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHNcbn0pKClcblxuICAgIGNvbnN0IG1vZHVsZUNhY2hlID0gbmV3IE1hcCgpXG4gICAgY29uc3QgcGFja2FnZUNvbXBhcnRtZW50Q2FjaGUgPSBuZXcgTWFwKClcbiAgICBjb25zdCBnbG9iYWxTdG9yZSA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VOYW1lID0gJyRyb290JCdcbiAgICBjb25zdCByb290UGFja2FnZUNvbXBhcnRtZW50ID0gY3JlYXRlUm9vdFBhY2thZ2VDb21wYXJ0bWVudChnbG9iYWxSZWYpXG5cbiAgICAvLyBzY3V0dGxlIGdsb2JhbFRoaXMgcmlnaHQgYWZ0ZXIgd2UgdXNlZCBpdCB0byBjcmVhdGUgdGhlIHJvb3QgcGFja2FnZSBjb21wYXJ0bWVudFxuICAgIGlmIChzY3V0dGxlR2xvYmFsVGhpcykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9ucyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgXCIke3R5cGVvZiBzY3V0dGxlR2xvYmFsVGhpc0V4Y2VwdGlvbnN9XCJgKVxuICAgICAgfVxuICAgICAgcGVyZm9ybVNjdXR0bGVHbG9iYWxUaGlzKGdsb2JhbFJlZiwgc2N1dHRsZUdsb2JhbFRoaXNFeGNlcHRpb25zKVxuICAgIH1cblxuICAgIGNvbnN0IGtlcm5lbCA9IHtcbiAgICAgIGludGVybmFsUmVxdWlyZSxcbiAgICB9XG4gICAgaWYgKGRlYnVnTW9kZSkge1xuICAgICAga2VybmVsLl9nZXRQb2xpY3lGb3JQYWNrYWdlID0gZ2V0UG9saWN5Rm9yUGFja2FnZVxuICAgICAga2VybmVsLl9nZXRDb21wYXJ0bWVudEZvclBhY2thZ2UgPSBnZXRDb21wYXJ0bWVudEZvclBhY2thZ2VcbiAgICB9XG4gICAgT2JqZWN0LmZyZWV6ZShrZXJuZWwpXG4gICAgcmV0dXJuIGtlcm5lbFxuXG4gICAgZnVuY3Rpb24gcGVyZm9ybVNjdXR0bGVHbG9iYWxUaGlzIChnbG9iYWxSZWYsIGV4dHJhUHJvcHNUb0F2b2lkID0gbmV3IEFycmF5KCkpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gbmV3IEFycmF5KClcbiAgICAgIGdldFByb3RvdHlwZUNoYWluKGdsb2JhbFJlZilcbiAgICAgICAgLmZvckVhY2gocHJvdG8gPT5cbiAgICAgICAgICBwcm9wcy5wdXNoKC4uLk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKSkpXG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0cmFQcm9wc1RvQXZvaWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IGV4dHJhUHJvcHNUb0F2b2lkW2ldXG4gICAgICAgIGlmICghcHJvcC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcHJvcC5zcGxpdCgnLycpXG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBwYXJ0cy5zbGljZSgxLCAtMSkuam9pbignLycpXG4gICAgICAgIGNvbnN0IGZsYWdzID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1cbiAgICAgICAgZXh0cmFQcm9wc1RvQXZvaWRbaV0gPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKVxuICAgICAgfVxuXG4gICAgICAvLyBzdXBwb3J0IExNLFNFUyBleHBvcnRlZCBBUElzIGFuZCBwb2x5ZmlsbHNcbiAgICAgIGNvbnN0IGF2b2lkRm9yTGF2YU1vYXRDb21wYXRpYmlsaXR5ID0gWydDb21wYXJ0bWVudCcsICdFcnJvcicsICdnbG9iYWxUaGlzJ11cbiAgICAgIGNvbnN0IHByb3BzVG9Bdm9pZCA9IG5ldyBTZXQoWy4uLmF2b2lkRm9yTGF2YU1vYXRDb21wYXRpYmlsaXR5LCAuLi5leHRyYVByb3BzVG9Bdm9pZF0pXG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICBpZiAoc2hvdWxkQXZvaWRQcm9wKHByb3BzVG9Bdm9pZCwgcHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbFJlZiwgcHJvcCk/LmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2MgPSB7XG4gICAgICAgICAgc2V0OiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBMYXZhTW9hdCAtIHByb3BlcnR5IFwiJHtwcm9wfVwiIG9mIGdsb2JhbFRoaXMgY2Fubm90IGJlIHNldCB1bmRlciBzY3V0dGxpbmcgbW9kZS4gYCArXG4gICAgICAgICAgICAgICdUbyBsZWFybiBtb3JlIHZpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9MYXZhTW9hdC9MYXZhTW9hdC9wdWxsLzM2MC4nLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBMYXZhTW9hdCAtIHByb3BlcnR5IFwiJHtwcm9wfVwiIG9mIGdsb2JhbFRoaXMgaXMgaW5hY2Nlc3NpYmxlIHVuZGVyIHNjdXR0bGluZyBtb2RlLiBgICtcbiAgICAgICAgICAgICAgJ1RvIGxlYXJuIG1vcmUgdmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL0xhdmFNb2F0L0xhdmFNb2F0L3B1bGwvMzYwLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxSZWYsIHByb3AsIGRlc2MpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiBpbnN0YW50aWF0aWVzIGEgbW9kdWxlIGZyb20gYSBtb2R1bGVJZC5cbiAgICAvLyAxLiBsb2FkcyB0aGUgbW9kdWxlIG1ldGFkYXRhIGFuZCBwb2xpY3lcbiAgICAvLyAyLiBwcmVwYXJlcyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAgLy8gMy4gaW5zdGFudGlhdGVzIHRoZSBtb2R1bGUsIHJlY3Vyc2l2ZWx5IGluc3RhbnRpYXRpbmcgZGVwZW5kZW5jaWVzXG4gICAgLy8gNC4gcmV0dXJucyB0aGUgbW9kdWxlIGV4cG9ydHNcbiAgICBmdW5jdGlvbiBpbnRlcm5hbFJlcXVpcmUgKG1vZHVsZUlkKSB7XG4gICAgICAvLyB1c2UgY2FjaGVkIG1vZHVsZS5leHBvcnRzIGlmIG1vZHVsZSBpcyBhbHJlYWR5IGluc3RhbnRpYXRlZFxuICAgICAgaWYgKG1vZHVsZUNhY2hlLmhhcyhtb2R1bGVJZCkpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlRXhwb3J0cyA9IG1vZHVsZUNhY2hlLmdldChtb2R1bGVJZCkuZXhwb3J0c1xuICAgICAgICByZXR1cm4gbW9kdWxlRXhwb3J0c1xuICAgICAgfVxuXG4gICAgICByZXBvcnRTdGF0c0hvb2soJ3N0YXJ0JywgbW9kdWxlSWQpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGxvYWQgYW5kIHZhbGlkYXRlIG1vZHVsZSBtZXRhZGF0YVxuICAgICAgICAvLyBpZiBtb2R1bGUgbWV0YWRhdGEgaXMgbWlzc2luZywgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgY29uc3QgbW9kdWxlRGF0YSA9IGxvYWRNb2R1bGVEYXRhKG1vZHVsZUlkKVxuICAgICAgICBpZiAoIW1vZHVsZURhdGEpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIG1vZHVsZSBcXCcnICsgbW9kdWxlSWQgKyAnXFwnJylcbiAgICAgICAgICBlcnIuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJ1xuICAgICAgICAgIHRocm93IGVyclxuICAgICAgICB9XG4gICAgICAgIGlmIChtb2R1bGVEYXRhLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhdmFNb2F0IC0gbW9kdWxlSWQgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LicpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBwYXJzZSBhbmQgdmFsaWRhdGUgbW9kdWxlIGRhdGFcbiAgICAgICAgY29uc3QgeyBwYWNrYWdlOiBwYWNrYWdlTmFtZSwgc291cmNlOiBtb2R1bGVTb3VyY2UgfSA9IG1vZHVsZURhdGFcbiAgICAgICAgaWYgKCFwYWNrYWdlTmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YU1vYXQgLSBtaXNzaW5nIHBhY2thZ2VOYW1lIGZvciBtb2R1bGUgXCIke21vZHVsZUlkfVwiYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWNrYWdlUG9saWN5ID0gZ2V0UG9saWN5Rm9yUGFja2FnZShsYXZhbW9hdENvbmZpZywgcGFja2FnZU5hbWUpXG5cbiAgICAgICAgLy8gY3JlYXRlIHRoZSBtb2R1bGVPYmogYW5kIGluaXRpYWxpemVyXG4gICAgICAgIGNvbnN0IHsgbW9kdWxlSW5pdGlhbGl6ZXIsIG1vZHVsZU9iaiB9ID0gcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyKG1vZHVsZURhdGEsIHBhY2thZ2VQb2xpY3kpXG5cbiAgICAgICAgLy8gY2FjaGUgbW9kdWxlT2JqIGhlcmVcbiAgICAgICAgLy8gdGhpcyBpcyBpbXBvcnRhbnQgdG8gaW5mIGxvb3BzIHdoZW4gaGl0dGluZyBjeWNsZXMgaW4gdGhlIGRlcCBncmFwaFxuICAgICAgICAvLyBtdXN0IGNhY2hlIGJlZm9yZSBydW5uaW5nIHRoZSBtb2R1bGVJbml0aWFsaXplclxuICAgICAgICBtb2R1bGVDYWNoZS5zZXQobW9kdWxlSWQsIG1vZHVsZU9iailcblxuICAgICAgICAvLyB2YWxpZGF0ZSBtb2R1bGVJbml0aWFsaXplclxuICAgICAgICBpZiAodHlwZW9mIG1vZHVsZUluaXRpYWxpemVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIG1vZHVsZUluaXRpYWxpemVyIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseS4gZ290IFwiJHt0eXBlb2YgbW9kdWxlSW5pdGlhbGl6ZXJ9XCJcXG4ke21vZHVsZVNvdXJjZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuICAgICAgICBjb25zdCBpbml0aWFsaXplckFyZ3MgPSBwcmVwYXJlTW9kdWxlSW5pdGlhbGl6ZXJBcmdzKHJlcXVpcmVSZWxhdGl2ZVdpdGhDb250ZXh0LCBtb2R1bGVPYmosIG1vZHVsZURhdGEpXG4gICAgICAgIG1vZHVsZUluaXRpYWxpemVyLmFwcGx5KG1vZHVsZU9iai5leHBvcnRzLCBpbml0aWFsaXplckFyZ3MpXG4gICAgICAgIGNvbnN0IG1vZHVsZUV4cG9ydHMgPSBtb2R1bGVPYmouZXhwb3J0c1xuICAgICAgICByZXR1cm4gbW9kdWxlRXhwb3J0c1xuXG4gICAgICAgIC8vIHRoaXMgaXMgcGFzc2VkIHRvIHRoZSBtb2R1bGUgaW5pdGlhbGl6ZXJcbiAgICAgICAgLy8gaXQgYWRkcyB0aGUgY29udGV4dCBvZiB0aGUgcGFyZW50IG1vZHVsZVxuICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIHJlcGxhY2VkIHZpYSBcIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXCIgaWYgaXRzIG1vcmUgcGVyZm9ybWFudFxuICAgICAgICBmdW5jdGlvbiByZXF1aXJlUmVsYXRpdmVXaXRoQ29udGV4dCAocmVxdWVzdGVkTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudE1vZHVsZUV4cG9ydHMgPSBtb2R1bGVPYmouZXhwb3J0c1xuICAgICAgICAgIGNvbnN0IHBhcmVudE1vZHVsZURhdGEgPSBtb2R1bGVEYXRhXG4gICAgICAgICAgY29uc3QgcGFyZW50UGFja2FnZVBvbGljeSA9IHBhY2thZ2VQb2xpY3lcbiAgICAgICAgICBjb25zdCBwYXJlbnRNb2R1bGVJZCA9IG1vZHVsZUlkXG4gICAgICAgICAgcmV0dXJuIHJlcXVpcmVSZWxhdGl2ZSh7IHJlcXVlc3RlZE5hbWUsIHBhcmVudE1vZHVsZUV4cG9ydHMsIHBhcmVudE1vZHVsZURhdGEsIHBhcmVudFBhY2thZ2VQb2xpY3ksIHBhcmVudE1vZHVsZUlkIH0pXG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlcG9ydFN0YXRzSG9vaygnZW5kJywgbW9kdWxlSWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhpcyByZXNvbHZlcyBhIG1vZHVsZSBnaXZlbiBhIHJlcXVlc3RlZE5hbWUgKGVnIHJlbGF0aXZlIHBhdGggdG8gcGFyZW50KSBhbmQgYSBwYXJlbnRNb2R1bGUgY29udGV4dFxuICAgIC8vIHRoZSBleHBvcnRzIGFyZSBwcm9jZXNzZWQgdmlhIFwicHJvdGVjdEV4cG9ydHNSZXF1aXJlVGltZVwiIHBlciB0aGUgbW9kdWxlJ3MgY29uZmlndXJhdGlvblxuICAgIGZ1bmN0aW9uIHJlcXVpcmVSZWxhdGl2ZSAoeyByZXF1ZXN0ZWROYW1lLCBwYXJlbnRNb2R1bGVFeHBvcnRzLCBwYXJlbnRNb2R1bGVEYXRhLCBwYXJlbnRQYWNrYWdlUG9saWN5LCBwYXJlbnRNb2R1bGVJZCB9KSB7XG4gICAgICBjb25zdCBwYXJlbnRNb2R1bGVQYWNrYWdlTmFtZSA9IHBhcmVudE1vZHVsZURhdGEucGFja2FnZVxuICAgICAgY29uc3QgcGFyZW50UGFja2FnZXNXaGl0ZWxpc3QgPSBwYXJlbnRQYWNrYWdlUG9saWN5LnBhY2thZ2VzXG4gICAgICBjb25zdCBwYXJlbnRCdWlsdGluc1doaXRlbGlzdCA9IE9iamVjdC5lbnRyaWVzKHBhcmVudFBhY2thZ2VQb2xpY3kuYnVpbHRpbilcbiAgICAgICAgLmZpbHRlcigoW18sIGFsbG93ZWRdKSA9PiBhbGxvd2VkID09PSB0cnVlKVxuICAgICAgICAubWFwKChbcGFja2FnZVBhdGgsIGFsbG93ZWRdKSA9PiBwYWNrYWdlUGF0aC5zcGxpdCgnLicpWzBdKVxuXG4gICAgICAvLyByZXNvbHZlIHRoZSBtb2R1bGVJZCBmcm9tIHRoZSByZXF1ZXN0ZWROYW1lXG4gICAgICBjb25zdCBtb2R1bGVJZCA9IGdldFJlbGF0aXZlTW9kdWxlSWQocGFyZW50TW9kdWxlSWQsIHJlcXVlc3RlZE5hbWUpXG5cbiAgICAgIC8vIGJyb3dzZXJpZnkgZ29vcDpcbiAgICAgIC8vIHJlY3Vyc2l2ZSByZXF1aXJlcyBkb250IGhpdCBjYWNoZSBzbyBpdCBpbmYgbG9vcHMsIHNvIHdlIHNob3J0Y2lyY3VpdFxuICAgICAgLy8gdGhpcyBvbmx5IHNlZW1zIHRvIGhhcHBlbiB3aXRoIGEgZmV3IGJyb3dzZXJpZnkgYnVpbHRpbnMgKG5vZGVqcyBidWlsdGluIG1vZHVsZSBwb2x5ZmlsbHMpXG4gICAgICAvLyB3ZSBjb3VsZCBsaWtlbHkgYWxsb3cgYW55IHJlcXVlc3RlZE5hbWUgc2luY2UgaXQgY2FuIG9ubHkgcmVmZXIgdG8gaXRzZWxmXG4gICAgICBpZiAobW9kdWxlSWQgPT09IHBhcmVudE1vZHVsZUlkKSB7XG4gICAgICAgIGlmIChbJ3RpbWVycycsICdidWZmZXInXS5pbmNsdWRlcyhyZXF1ZXN0ZWROYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gcmVjdXJzaXZlIHJlcXVpcmUgZGV0ZWN0ZWQ6IFwiJHtyZXF1ZXN0ZWROYW1lfVwiYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50TW9kdWxlRXhwb3J0c1xuICAgICAgfVxuXG4gICAgICAvLyBsb2FkIG1vZHVsZVxuICAgICAgbGV0IG1vZHVsZUV4cG9ydHMgPSBpbnRlcm5hbFJlcXVpcmUobW9kdWxlSWQpXG5cbiAgICAgIC8vIGxvb2sgdXAgY29uZmlnIGZvciBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZURhdGEgPSBsb2FkTW9kdWxlRGF0YShtb2R1bGVJZClcbiAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gbW9kdWxlRGF0YS5wYWNrYWdlXG5cbiAgICAgIC8vIGRpc2FsbG93IHJlcXVpcmluZyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHBhcmVudCdzIHdoaXRlbGlzdFxuICAgICAgY29uc3QgaXNTYW1lUGFja2FnZSA9IHBhY2thZ2VOYW1lID09PSBwYXJlbnRNb2R1bGVQYWNrYWdlTmFtZVxuICAgICAgY29uc3QgcGFyZW50SXNFbnRyeU1vZHVsZSA9IHBhcmVudE1vZHVsZVBhY2thZ2VOYW1lID09PSByb290UGFja2FnZU5hbWVcbiAgICAgIGxldCBpc0luUGFyZW50V2hpdGVsaXN0ID0gZmFsc2VcbiAgICAgIGlmIChtb2R1bGVEYXRhLnR5cGUgPT09ICdidWlsdGluJykge1xuICAgICAgICBpc0luUGFyZW50V2hpdGVsaXN0ID0gcGFyZW50QnVpbHRpbnNXaGl0ZWxpc3QuaW5jbHVkZXMocGFja2FnZU5hbWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0luUGFyZW50V2hpdGVsaXN0ID0gKHBhcmVudFBhY2thZ2VzV2hpdGVsaXN0W3BhY2thZ2VOYW1lXSA9PT0gdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWRhdGUgdGhhdCB0aGUgaW1wb3J0IGlzIGFsbG93ZWRcbiAgICAgIGlmICghcGFyZW50SXNFbnRyeU1vZHVsZSAmJiAhaXNTYW1lUGFja2FnZSAmJiAhaXNJblBhcmVudFdoaXRlbGlzdCkge1xuICAgICAgICBsZXQgdHlwZVRleHQgPSAnICdcbiAgICAgICAgaWYgKG1vZHVsZURhdGEudHlwZSA9PT0gJ2J1aWx0aW4nKSB7XG4gICAgICAgICAgdHlwZVRleHQgPSAnIG5vZGUgYnVpbHRpbiAnXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIHJlcXVpcmVkJHt0eXBlVGV4dH1wYWNrYWdlIG5vdCBpbiBhbGxvd2xpc3Q6IHBhY2thZ2UgXCIke3BhcmVudE1vZHVsZVBhY2thZ2VOYW1lfVwiIHJlcXVlc3RlZCBcIiR7cGFja2FnZU5hbWV9XCIgYXMgXCIke3JlcXVlc3RlZE5hbWV9XCJgKVxuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGUgbWluaW1hbCBzZWxlY3Rpb24gaWYgaXRzIGEgYnVpbHRpbiBhbmQgdGhlIHdob2xlIHBhdGggaXMgbm90IHNlbGVjdGVkIGZvclxuICAgICAgaWYgKCFwYXJlbnRJc0VudHJ5TW9kdWxlICYmIG1vZHVsZURhdGEudHlwZSA9PT0gJ2J1aWx0aW4nICYmICFwYXJlbnRQYWNrYWdlUG9saWN5LmJ1aWx0aW5bbW9kdWxlSWRdKSB7XG4gICAgICAgIGNvbnN0IGJ1aWx0aW5QYXRocyA9IChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXJlbnRQYWNrYWdlUG9saWN5LmJ1aWx0aW4pXG4gICAgICAgICAgLy8gZ3JhYiBhbGwgYWxsb3dlZCBidWlsdGluIHBhdGhzIHRoYXQgbWF0Y2ggdGhpcyBwYWNrYWdlXG4gICAgICAgICAgICAuZmlsdGVyKChbcGFja2FnZVBhdGgsIGFsbG93ZWRdKSA9PiBhbGxvd2VkID09PSB0cnVlICYmIG1vZHVsZUlkID09PSBwYWNrYWdlUGF0aC5zcGxpdCgnLicpWzBdKVxuICAgICAgICAgIC8vIG9ubHkgaW5jbHVkZSB0aGUgcGF0aHMgYWZ0ZXIgdGhlIHBhY2thZ2VOYW1lXG4gICAgICAgICAgICAubWFwKChbcGFja2FnZVBhdGgsIGFsbG93ZWRdKSA9PiBwYWNrYWdlUGF0aC5zcGxpdCgnLicpLnNsaWNlKDEpLmpvaW4oJy4nKSlcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgKVxuICAgICAgICBtb2R1bGVFeHBvcnRzID0gbWFrZU1pbmltYWxWaWV3T2ZSZWYobW9kdWxlRXhwb3J0cywgYnVpbHRpblBhdGhzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW9kdWxlRXhwb3J0c1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVNb2R1bGVJbml0aWFsaXplciAobW9kdWxlRGF0YSwgcGFja2FnZVBvbGljeSkge1xuICAgICAgY29uc3QgeyBtb2R1bGVJbml0aWFsaXplciwgcHJlY29tcGlsZWRJbml0aWFsaXplciwgcGFja2FnZTogcGFja2FnZU5hbWUsIGlkOiBtb2R1bGVJZCwgc291cmNlOiBtb2R1bGVTb3VyY2UgfSA9IG1vZHVsZURhdGFcblxuICAgICAgLy8gbW9kdWxlSW5pdGlhbGl6ZXIgbWF5IGJlIHNldCBieSBsb2FkTW9kdWxlRGF0YSAoZS5nLiBidWlsdGluICsgbmF0aXZlIG1vZHVsZXMpXG4gICAgICBpZiAobW9kdWxlSW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgLy8gaWYgYW4gZXh0ZXJuYWwgbW9kdWxlSW5pdGlhbGl6ZXIgaXMgc2V0LCBlbnN1cmUgaXQgaXMgYWxsb3dlZFxuICAgICAgICBpZiAobW9kdWxlRGF0YS50eXBlID09PSAnbmF0aXZlJykge1xuICAgICAgICAgIC8vIGVuc3VyZSBwYWNrYWdlIGlzIGFsbG93ZWQgdG8gaGF2ZSBuYXRpdmUgbW9kdWxlc1xuICAgICAgICAgIGlmIChwYWNrYWdlUG9saWN5Lm5hdGl2ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIFwibmF0aXZlXCIgbW9kdWxlIHR5cGUgbm90IHBlcm1pdHRlZCBmb3IgcGFja2FnZSBcIiR7cGFja2FnZU5hbWV9XCIsIG1vZHVsZSBcIiR7bW9kdWxlSWR9XCJgKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtb2R1bGVEYXRhLnR5cGUgIT09ICdidWlsdGluJykge1xuICAgICAgICAgIC8vIGJ1aWx0aW4gbW9kdWxlIHR5cGVzIGRvbnQgaGF2ZSBwb2xpY3kgY29uZmlndXJhdGlvbnNcbiAgICAgICAgICAvLyBidXQgdGhlIHBhY2thZ2VzIHRoYXQgY2FuIGltcG9ydCB0aGVtIGFyZSBjb25zdHJhaW5lZCBlbHNld2hlcmVcbiAgICAgICAgICAvLyBoZXJlIHdlIGp1c3QgZW5zdXJlIHRoYXQgdGhlIG1vZHVsZSB0eXBlIGlzIHRoZSBvbmx5IG90aGVyIHR5cGUgd2l0aCBhIGV4dGVybmFsIG1vZHVsZUluaXRpYWxpemVyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIGludmFsaWQgZXh0ZXJuYWwgbW9kdWxlSW5pdGlhbGl6ZXIgZm9yIG1vZHVsZSB0eXBlIFwiJHttb2R1bGVEYXRhLnR5cGV9XCIgaW4gcGFja2FnZSBcIiR7cGFja2FnZU5hbWV9XCIsIG1vZHVsZSBcIiR7bW9kdWxlSWR9XCJgKVxuICAgICAgICB9XG4gICAgICAgIC8vIG1vZHVsZU9iaiBtdXN0IGJlIGZyb20gdGhlIHNhbWUgUmVhbG0gYXMgdGhlIG1vZHVsZUluaXRpYWxpemVyIChlZyBkYXJ0MmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnQpXG4gICAgICAgIC8vIGhlcmUgd2UgYXJlIGFzc3VtaW5nIHRoZSBwcm92aWRlZCBtb2R1bGVJbml0aWFsaXplciBpcyBmcm9tIHRoZSBzYW1lIFJlYWxtIGFzIHRoaXMga2VybmVsXG4gICAgICAgIGNvbnN0IG1vZHVsZU9iaiA9IHsgZXhwb3J0czoge30gfVxuICAgICAgICByZXR1cm4geyBtb2R1bGVJbml0aWFsaXplciwgbW9kdWxlT2JqIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0dXAgaW5pdGlhbGl6ZXIgZnJvbSBtb2R1bGVTb3VyY2UgYW5kIGNvbXBhcnRtZW50LlxuICAgICAgLy8gZXhlY3V0ZSBpbiBwYWNrYWdlIGNvbXBhcnRtZW50IHdpdGggZ2xvYmFsVGhpcyBwb3B1bGF0ZWQgcGVyIHBhY2thZ2UgcG9saWN5XG4gICAgICBjb25zdCBwYWNrYWdlQ29tcGFydG1lbnQgPSBnZXRDb21wYXJ0bWVudEZvclBhY2thZ2UocGFja2FnZU5hbWUsIHBhY2thZ2VQb2xpY3kpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBtb2R1bGVPYmpcbiAgICAgICAgbGV0IG1vZHVsZUluaXRpYWxpemVyXG4gICAgICAgIGlmIChydW5XaXRoUHJlY29tcGlsZWRNb2R1bGVzKSB7XG4gICAgICAgICAgaWYgKCFwcmVjb21waWxlZEluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gcHJlY29tcGlsZWRJbml0aWFsaXplciBtaXNzaW5nIGZvciBcIiR7bW9kdWxlSWR9XCIgZnJvbSBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cImApXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG1vZHVsZU9iaiBtdXN0IGJlIGZyb20gdGhlIHNhbWUgUmVhbG0gYXMgdGhlIG1vZHVsZUluaXRpYWxpemVyIChlZyBkYXJ0MmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnQpXG4gICAgICAgICAgLy8gaGVyZSB3ZSBhcmUgYXNzdW1pbmcgdGhlIHByb3ZpZGVkIG1vZHVsZUluaXRpYWxpemVyIGlzIGZyb20gdGhlIHNhbWUgUmVhbG0gYXMgdGhpcyBrZXJuZWxcbiAgICAgICAgICBtb2R1bGVPYmogPSB7IGV4cG9ydHM6IHt9IH1cbiAgICAgICAgICBjb25zdCBldmFsS2l0ID0ge1xuICAgICAgICAgICAgZ2xvYmFsVGhpczogcGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG4gICAgICAgICAgICBzY29wZVRlcm1pbmF0b3I6IHN0cmljdFNjb3BlVGVybWluYXRvcixcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhpcyBpbnZva2VzIHRoZSB3aXRoLXByb3h5IHdyYXBwZXJcbiAgICAgICAgICBjb25zdCBtb2R1bGVJbml0aWFsaXplckZhY3RvcnkgPSBwcmVjb21waWxlZEluaXRpYWxpemVyLmNhbGwoZXZhbEtpdClcbiAgICAgICAgICAvLyB0aGlzIGVuc3VyZXMgc3RyaWN0IG1vZGVcbiAgICAgICAgICBtb2R1bGVJbml0aWFsaXplciA9IG1vZHVsZUluaXRpYWxpemVyRmFjdG9yeSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGVTb3VyY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gbW9kdWxlU291cmNlIG5vdCBhIHN0cmluZyBmb3IgXCIke21vZHVsZUlkfVwiIGZyb20gcGFja2FnZSBcIiR7cGFja2FnZU5hbWV9XCJgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzb3VyY2VVUkwgPSBtb2R1bGVEYXRhLmZpbGUgfHwgYG1vZHVsZXMvJHttb2R1bGVJZH1gXG4gICAgICAgICAgaWYgKHNvdXJjZVVSTC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YU1vYXQgLSBOZXdsaW5lcyBub3QgYWxsb3dlZCBpbiBmaWxlbmFtZXM6ICR7SlNPTi5zdHJpbmdpZnkoc291cmNlVVJMKX1gKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBtb2R1bGVPYmogbXVzdCBiZSBmcm9tIHRoZSBzYW1lIFJlYWxtIGFzIHRoZSBtb2R1bGVJbml0aWFsaXplciAoZWcgZGFydDJqcyBydW50aW1lIHJlcXVpcmVtZW50KVxuICAgICAgICAgIG1vZHVsZU9iaiA9IHBhY2thZ2VDb21wYXJ0bWVudC5ldmFsdWF0ZSgnKHsgZXhwb3J0czoge30gfSknKVxuICAgICAgICAgIC8vIFRPRE86IG1vdmUgYWxsIHNvdXJjZSBtdXRhdGlvbnMgZWxzZXdoZXJlXG4gICAgICAgICAgbW9kdWxlSW5pdGlhbGl6ZXIgPSBwYWNrYWdlQ29tcGFydG1lbnQuZXZhbHVhdGUoYCR7bW9kdWxlU291cmNlfVxcbi8vIyBzb3VyY2VVUkw9JHtzb3VyY2VVUkx9YClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtb2R1bGVJbml0aWFsaXplciwgbW9kdWxlT2JqIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oYExhdmFNb2F0IC0gRXJyb3IgZXZhbHVhdGluZyBtb2R1bGUgXCIke21vZHVsZUlkfVwiIGZyb20gcGFja2FnZSBcIiR7cGFja2FnZU5hbWV9XCIgXFxuJHtlcnIuc3RhY2t9YClcbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlUm9vdFBhY2thZ2VDb21wYXJ0bWVudCAoZ2xvYmFsUmVmKSB7XG4gICAgICBpZiAocGFja2FnZUNvbXBhcnRtZW50Q2FjaGUuaGFzKHJvb3RQYWNrYWdlTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMYXZhTW9hdCAtIGNyZWF0ZVJvb3RQYWNrYWdlQ29tcGFydG1lbnQgY2FsbGVkIG1vcmUgdGhhbiBvbmNlJylcbiAgICAgIH1cbiAgICAgIC8vIHByZXBhcmUgdGhlIHJvb3QgcGFja2FnZSdzIFNFUyBDb21wYXJ0bWVudFxuICAgICAgLy8gZW5kb3dtZW50czpcbiAgICAgIC8vIC0gTWF0aCBpcyBmb3IgdW50YW1lZCBNYXRoLnJhbmRvbVxuICAgICAgLy8gLSBEYXRlIGlzIGZvciB1bnRhbWVkIERhdGUubm93XG4gICAgICBjb25zdCByb290UGFja2FnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHsgTWF0aCwgRGF0ZSB9KVxuICAgICAgLy8gZmluZCB0aGUgcmVsZXZhbnQgZW5kb3dtZW50IHNvdXJjZXNcbiAgICAgIGNvbnN0IGdsb2JhbFByb3RvQ2hhaW4gPSBnZXRQcm90b3R5cGVDaGFpbihnbG9iYWxSZWYpXG4gICAgICAvLyB0aGUgaW5kZXggZm9yIHRoZSBjb21tb24gcHJvdG90eXBhbCBhbmNlc3RvciwgT2JqZWN0LnByb3RvdHlwZVxuICAgICAgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBsYXN0IGluZGV4LCBidXQgd2UgY2hlY2sganVzdCBpbiBjYXNlXG4gICAgICBjb25zdCBjb21tb25Qcm90b3R5cGVJbmRleCA9IGdsb2JhbFByb3RvQ2hhaW4uZmluZEluZGV4KGdsb2JhbFByb3RvQ2hhaW5FbnRyeSA9PiBnbG9iYWxQcm90b0NoYWluRW50cnkgPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICBpZiAoY29tbW9uUHJvdG90eXBlSW5kZXggPT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTGF2YW1vYXQgLSB1bmFibGUgdG8gZmluZCBjb21tb24gcHJvdG90eXBlIGJldHdlZW4gQ29tcGFydG1lbnQgYW5kIGdsb2JhbFJlZicpXG4gICAgICB9XG4gICAgICAvLyB3ZSB3aWxsIGNvcHkgZW5kb3dtZW50cyBmcm9tIGFsbCBlbnRyaWVzIGluIHRoZSBwcm90b3R5cGUgY2hhaW4sIGV4Y2x1ZGluZyBPYmplY3QucHJvdG90eXBlXG4gICAgICBjb25zdCBlbmRvd21lbnRTb3VyY2VzID0gZ2xvYmFsUHJvdG9DaGFpbi5zbGljZSgwLCBjb21tb25Qcm90b3R5cGVJbmRleClcblxuICAgICAgLy8gY2FsbCBhbGwgZ2V0dGVycywgaW4gY2FzZSBvZiBiZWhhdmlvciBjaGFuZ2UgKHN1Y2ggYXMgd2l0aCBGaXJlRm94IGxhenkgZ2V0dGVycylcbiAgICAgIC8vIGNhbGwgb24gY29udGVudHMgb2YgZW5kb3dtZW50c1NvdXJjZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBpbiBuZXcgYXJyYXkgaW5zdGFuY2VzLiBJZiB0aGVyZSBpcyBhIGxhenkgZ2V0dGVyIGl0IG9ubHkgY2hhbmdlcyB0aGUgb3JpZ2luYWwgcHJvcCBkZXNjLlxuICAgICAgZW5kb3dtZW50U291cmNlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKVxuICAgICAgICBPYmplY3QudmFsdWVzKGRlc2NyaXB0b3JzKS5mb3JFYWNoKGRlc2MgPT4ge1xuICAgICAgICAgIGlmICgnZ2V0JyBpbiBkZXNjKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBSZWZsZWN0LmFwcGx5KGRlc2MuZ2V0LCBnbG9iYWxSZWYsIFtdKVxuICAgICAgICAgICAgfWNhdGNoe31cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBlbmRvd21lbnRTb3VyY2VEZXNjcmlwdG9ycyA9IGVuZG93bWVudFNvdXJjZXMubWFwKGdsb2JhbFByb3RvQ2hhaW5FbnRyeSA9PiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhnbG9iYWxQcm90b0NoYWluRW50cnkpKVxuICAgICAgLy8gZmxhdHRlbiBwcm9wRGVzYyBjb2xsZWN0aW9ucyB3aXRoIHByZWNlZGVuY2UgZm9yIGdsb2JhbFRoaXMtZW5kIG9mIHRoZSBwcm90b3R5cGUgY2hhaW5cbiAgICAgIGNvbnN0IGVuZG93bWVudERlc2NyaXB0b3JzRmxhdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgLi4uZW5kb3dtZW50U291cmNlRGVzY3JpcHRvcnMucmV2ZXJzZSgpKVxuICAgICAgLy8gZXhwb3NlIGFsbCBvd24gcHJvcGVydGllcyBvZiBnbG9iYWxSZWYsIGluY2x1ZGluZyBub24tZW51bWVyYWJsZVxuICAgICAgT2JqZWN0LmVudHJpZXMoZW5kb3dtZW50RGVzY3JpcHRvcnNGbGF0KVxuICAgICAgICAvLyBpZ25vcmUgcHJvcGVydGllcyBhbHJlYWR5IGRlZmluZWQgb24gY29tcGFydG1lbnQgZ2xvYmFsXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhKGtleSBpbiByb290UGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMpKVxuICAgICAgICAvLyBpZ25vcmUgY2lyY3VsYXIgZ2xvYmFsVGhpcyByZWZzXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhKGdsb2JhbFRoaXNSZWZzLmluY2x1ZGVzKGtleSkpKVxuICAgICAgICAvLyBkZWZpbmUgcHJvcGVydHkgb24gY29tcGFydG1lbnQgZ2xvYmFsXG4gICAgICAgIC5mb3JFYWNoKChba2V5LCBkZXNjXSkgPT4ge1xuICAgICAgICAgIC8vIHVud3JhcCBmdW5jdGlvbnMsIHNldHRlcnMvZ2V0dGVycyAmIGFwcGx5IHNjb3BlIHByb3h5IHdvcmthcm91bmRcbiAgICAgICAgICBjb25zdCB3cmFwcGVkUHJvcERlc2MgPSBhcHBseUVuZG93bWVudFByb3BEZXNjVHJhbnNmb3JtcyhkZXNjLCByb290UGFja2FnZUNvbXBhcnRtZW50LCBnbG9iYWxSZWYpXG4gICAgICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShyb290UGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsIGtleSwgd3JhcHBlZFByb3BEZXNjKVxuICAgICAgICB9KVxuICAgICAgLy8gZ2xvYmFsIGNpcmN1bGFyIHJlZmVyZW5jZXMgb3RoZXJ3aXNlIGFkZGVkIGJ5IHByZXBhcmVDb21wYXJ0bWVudEdsb2JhbEZyb21Db25maWdcbiAgICAgIC8vIEFkZCBhbGwgY2lyY3VsYXIgcmVmcyB0byByb290IHBhY2thZ2UgY29tcGFydG1lbnQgZ2xvYmFsVGhpc1xuICAgICAgZm9yIChjb25zdCByZWYgb2YgZ2xvYmFsVGhpc1JlZnMpIHtcbiAgICAgICAgaWYgKHJlZiBpbiByb290UGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHJvb3RQYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpc1tyZWZdID0gcm9vdFBhY2thZ2VDb21wYXJ0bWVudC5nbG9iYWxUaGlzXG4gICAgICB9XG5cbiAgICAgIC8vIHNhdmUgdGhlIGNvbXBhcnRtZW50IGZvciB1c2UgYnkgb3RoZXIgbW9kdWxlcyBpbiB0aGUgcGFja2FnZVxuICAgICAgcGFja2FnZUNvbXBhcnRtZW50Q2FjaGUuc2V0KHJvb3RQYWNrYWdlTmFtZSwgcm9vdFBhY2thZ2VDb21wYXJ0bWVudClcblxuICAgICAgcmV0dXJuIHJvb3RQYWNrYWdlQ29tcGFydG1lbnRcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDb21wYXJ0bWVudEZvclBhY2thZ2UgKHBhY2thZ2VOYW1lLCBwYWNrYWdlUG9saWN5KSB7XG4gICAgICAvLyBjb21wYXJ0bWVudCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZFxuICAgICAgbGV0IHBhY2thZ2VDb21wYXJ0bWVudCA9IHBhY2thZ2VDb21wYXJ0bWVudENhY2hlLmdldChwYWNrYWdlTmFtZSlcbiAgICAgIGlmIChwYWNrYWdlQ29tcGFydG1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHBhY2thZ2VDb21wYXJ0bWVudFxuICAgICAgfVxuXG4gICAgICAvLyBwcmVwYXJlIENvbXBhcnRtZW50XG4gICAgICBpZiAoZ2V0RXh0ZXJuYWxDb21wYXJ0bWVudCAmJiBwYWNrYWdlUG9saWN5LmVudikge1xuICAgICAgICAvLyBleHRlcm5hbCBjb21wYXJ0bWVudCBjYW4gYmUgcHJvdmlkZWQgYnkgdGhlIHBsYXRmb3JtIChlZyBsYXZhbW9hdC1ub2RlKVxuICAgICAgICBwYWNrYWdlQ29tcGFydG1lbnQgPSBnZXRFeHRlcm5hbENvbXBhcnRtZW50KHBhY2thZ2VOYW1lLCBwYWNrYWdlUG9saWN5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJlcGFyZSB0aGUgbW9kdWxlJ3MgU0VTIENvbXBhcnRtZW50XG4gICAgICAgIC8vIGVuZG93bWVudHM6XG4gICAgICAgIC8vIC0gTWF0aCBpcyBmb3IgdW50YW1lZCBNYXRoLnJhbmRvbVxuICAgICAgICAvLyAtIERhdGUgaXMgZm9yIHVudGFtZWQgRGF0ZS5ub3dcbiAgICAgICAgcGFja2FnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHsgTWF0aCwgRGF0ZSB9KVxuICAgICAgfVxuICAgICAgLy8gcHJlcGFyZSBlbmRvd21lbnRzXG4gICAgICBsZXQgZW5kb3dtZW50c1xuICAgICAgdHJ5IHtcbiAgICAgICAgZW5kb3dtZW50cyA9IGdldEVuZG93bWVudHNGb3JDb25maWcoXG4gICAgICAgICAgLy8gc291cmNlIHJlZmVyZW5jZVxuICAgICAgICAgIHJvb3RQYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgICAvLyBwb2xpY3lcbiAgICAgICAgICBwYWNrYWdlUG9saWN5LFxuICAgICAgICAgIC8vIHVud3JhcCB0b1xuICAgICAgICAgIGdsb2JhbFJlZixcbiAgICAgICAgICAvLyB1bndyYXAgZnJvbVxuICAgICAgICAgIHBhY2thZ2VDb21wYXJ0bWVudC5nbG9iYWxUaGlzLFxuICAgICAgICApXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZXJyTXNnID0gYExhdmFtb2F0IC0gZmFpbGVkIHRvIHByZXBhcmUgZW5kb3dtZW50cyBmb3IgcGFja2FnZSBcIiR7cGFja2FnZU5hbWV9XCI6XFxuJHtlcnIuc3RhY2t9YFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFuc2Zvcm0gZnVuY3Rpb25zLCBnZXR0ZXJzICYgc2V0dGVycyBvbiBwcm9wIGRlc2NzLiBTb2x2ZXMgU0VTIHNjb3BlIHByb3h5IGJ1Z1xuICAgICAgT2JqZWN0LmVudHJpZXMoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZW5kb3dtZW50cykpXG4gICAgICAgIC8vIGlnbm9yZSBub24tY29uZmlndXJhYmxlIHByb3BlcnRpZXMgYmVjYXVzZSB3ZSBhcmUgbW9kaWZ5aW5nIGVuZG93bWVudHMgaW4gcGxhY2VcbiAgICAgICAgLmZpbHRlcigoW2tleSwgcHJvcERlc2NdKSA9PiBwcm9wRGVzYy5jb25maWd1cmFibGUpXG4gICAgICAgIC5mb3JFYWNoKChba2V5LCBwcm9wRGVzY10pID0+IHtcbiAgICAgICAgICBjb25zdCB3cmFwcGVkUHJvcERlc2MgPSBhcHBseUVuZG93bWVudFByb3BEZXNjVHJhbnNmb3Jtcyhwcm9wRGVzYywgcGFja2FnZUNvbXBhcnRtZW50LCByb290UGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMpXG4gICAgICAgICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShlbmRvd21lbnRzLCBrZXksIHdyYXBwZWRQcm9wRGVzYylcbiAgICAgICAgfSlcblxuICAgICAgLy8gc2V0cyB1cCByZWFkL3dyaXRlIGFjY2VzcyBhcyBjb25maWd1cmVkXG4gICAgICBjb25zdCBnbG9iYWxzQ29uZmlnID0gcGFja2FnZVBvbGljeS5nbG9iYWxzXG4gICAgICBwcmVwYXJlQ29tcGFydG1lbnRHbG9iYWxGcm9tQ29uZmlnKHBhY2thZ2VDb21wYXJ0bWVudCwgZ2xvYmFsc0NvbmZpZywgZW5kb3dtZW50cywgZ2xvYmFsU3RvcmUsIGdsb2JhbFRoaXNSZWZzKVxuXG4gICAgICAvLyBzYXZlIHRoZSBjb21wYXJ0bWVudCBmb3IgdXNlIGJ5IG90aGVyIG1vZHVsZXMgaW4gdGhlIHBhY2thZ2VcbiAgICAgIHBhY2thZ2VDb21wYXJ0bWVudENhY2hlLnNldChwYWNrYWdlTmFtZSwgcGFja2FnZUNvbXBhcnRtZW50KVxuXG4gICAgICByZXR1cm4gcGFja2FnZUNvbXBhcnRtZW50XG4gICAgfVxuXG4gICAgLy8gdGhpcyBnZXRzIHRoZSBsYXZhTW9hdCBjb25maWcgZm9yIGEgbW9kdWxlIGJ5IHBhY2thZ2VOYW1lXG4gICAgLy8gaWYgdGhlcmUgd2VyZSBnbG9iYWwgZGVmYXVsdHMgKGUuZy4gZXZlcnl0aGluZyBnZXRzIFwiY29uc29sZVwiKSB0aGV5IGNvdWxkIGJlIGFwcGxpZWQgaGVyZVxuICAgIGZ1bmN0aW9uIGdldFBvbGljeUZvclBhY2thZ2UgKGNvbmZpZywgcGFja2FnZU5hbWUpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VDb25maWcgPSAoY29uZmlnLnJlc291cmNlcyB8fCB7fSlbcGFja2FnZU5hbWVdIHx8IHt9XG4gICAgICBwYWNrYWdlQ29uZmlnLmdsb2JhbHMgPSBwYWNrYWdlQ29uZmlnLmdsb2JhbHMgfHwge31cbiAgICAgIHBhY2thZ2VDb25maWcucGFja2FnZXMgPSBwYWNrYWdlQ29uZmlnLnBhY2thZ2VzIHx8IHt9XG4gICAgICBwYWNrYWdlQ29uZmlnLmJ1aWx0aW4gPSBwYWNrYWdlQ29uZmlnLmJ1aWx0aW4gfHwge31cbiAgICAgIHJldHVybiBwYWNrYWdlQ29uZmlnXG4gICAgfVxuXG4gICAgLy8gdXRpbCBmb3IgZ2V0dGluZyB0aGUgcHJvdG90eXBlIGNoYWluIGFzIGFuIGFycmF5XG4gICAgLy8gaW5jbHVkZXMgdGhlIHByb3ZpZGVkIHZhbHVlIGluIHRoZSByZXN1bHRcbiAgICBmdW5jdGlvbiBnZXRQcm90b3R5cGVDaGFpbiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IHByb3RvQ2hhaW4gPSBbXVxuICAgICAgbGV0IGN1cnJlbnQgPSB2YWx1ZVxuICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgKHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgcHJvdG9DaGFpbi5wdXNoKGN1cnJlbnQpXG4gICAgICAgIGN1cnJlbnQgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpXG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvdG9DaGFpblxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3VsZEF2b2lkUHJvcChwcm9wc1RvQXZvaWQsIHByb3ApIHtcbiAgICAgIGZvciAoY29uc3QgYXZvaWQgb2YgcHJvcHNUb0F2b2lkKSB7XG4gICAgICAgIGlmIChhdm9pZCBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBhdm9pZC50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHNUb0F2b2lkLmhhcyhwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxufSkoKVxuXG4gICAgY29uc3Qga2VybmVsID0gY3JlYXRlS2VybmVsQ29yZSh7XG4gICAgICBsYXZhbW9hdENvbmZpZyxcbiAgICAgIGxvYWRNb2R1bGVEYXRhLFxuICAgICAgZ2V0UmVsYXRpdmVNb2R1bGVJZCxcbiAgICAgIHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MsXG4gICAgICBnZXRFeHRlcm5hbENvbXBhcnRtZW50LFxuICAgICAgZ2xvYmFsUmVmLFxuICAgICAgZ2xvYmFsVGhpc1JlZnMsXG4gICAgICBzY3V0dGxlR2xvYmFsVGhpcyxcbiAgICAgIHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9ucyxcbiAgICAgIGRlYnVnTW9kZSxcbiAgICAgIHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXMsXG4gICAgICByZXBvcnRTdGF0c0hvb2ssXG4gICAgfSlcbiAgICByZXR1cm4ga2VybmVsXG4gIH1cbn0pKClcblxuICBjb25zdCBrZXJuZWwgPSBjcmVhdGVLZXJuZWwoe1xuICAgIHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXM6IHRydWUsXG4gICAgbGF2YW1vYXRDb25maWc6IGxhdmFtb2F0UG9saWN5LFxuICAgIGxvYWRNb2R1bGVEYXRhLFxuICAgIGdldFJlbGF0aXZlTW9kdWxlSWQsXG4gICAgcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyQXJncyxcbiAgICBnbG9iYWxUaGlzUmVmczogWyd3aW5kb3cnLCAnc2VsZicsICdnbG9iYWwnLCAnZ2xvYmFsVGhpcyddLFxuICAgIGRlYnVnTW9kZSxcbiAgICByZXBvcnRTdGF0c0hvb2ssXG4gIH0pXG4gIGNvbnN0IHsgaW50ZXJuYWxSZXF1aXJlIH0gPSBrZXJuZWxcblxuICAvLyBjcmVhdGUgYSBsYXZhbW9hdCBwdWxpYyBBUEkgZm9yIGxvYWRpbmcgbW9kdWxlcyBvdmVyIG11bHRpcGxlIGZpbGVzXG4gIGNvbnN0IExhdmFQYWNrID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgbG9hZFBvbGljeTogT2JqZWN0LmZyZWV6ZShsb2FkUG9saWN5KSxcbiAgICBsb2FkQnVuZGxlOiBPYmplY3QuZnJlZXplKGxvYWRCdW5kbGUpLFxuICAgIHJ1bk1vZHVsZTogT2JqZWN0LmZyZWV6ZShydW5Nb2R1bGUpLFxuICB9KVxuICAvLyBpbiBkZWJ1ZyBtb2RlLCBleHBvc2UgdGhlIGtlcm5lbCBvbiB0aGUgTGF2YVBhY2sgQVBJXG4gIGlmIChkZWJ1Z01vZGUpIHtcbiAgICBMYXZhUGFjay5fa2VybmVsID0ga2VybmVsXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgJ0xhdmFQYWNrJywge3ZhbHVlOiBMYXZhUGFja30pXG4gIHJldHVyblxuXG5cbiAgZnVuY3Rpb24gbG9hZE1vZHVsZURhdGEgKG1vZHVsZUlkKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiByZXF1aXJlID09PSAnZnVuY3Rpb24nICYmIHJlcXVpcmUoJ25vZGU6bW9kdWxlJykuaXNCdWlsdGluKG1vZHVsZUlkKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2J1aWx0aW4nLFxuICAgICAgICBwYWNrYWdlOiBtb2R1bGVJZCxcbiAgICAgICAgaWQ6IG1vZHVsZUlkLFxuICAgICAgICAvLyBVc2luZyB1bnByb3RlY3RlZCByZXF1aXJlXG4gICAgICAgIG1vZHVsZUluaXRpYWxpemVyOiAoXywgbW9kdWxlKSA9PiB7XG4gICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKG1vZHVsZUlkKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFtb2R1bGVSZWdpc3RyeS5oYXMobW9kdWxlSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIG1vZHVsZSByZWdpc3RlcmVkIGZvciBcIiR7bW9kdWxlSWR9XCIgKCR7dHlwZW9mIG1vZHVsZUlkfSlgKVxuICAgIH1cbiAgICByZXR1cm4gbW9kdWxlUmVnaXN0cnkuZ2V0KG1vZHVsZUlkKVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVsYXRpdmVNb2R1bGVJZCAocGFyZW50TW9kdWxlSWQsIHJlcXVlc3RlZE5hbWUpIHtcbiAgICBjb25zdCBwYXJlbnRNb2R1bGVEYXRhID0gbG9hZE1vZHVsZURhdGEocGFyZW50TW9kdWxlSWQpXG4gICAgaWYgKCEocmVxdWVzdGVkTmFtZSBpbiBwYXJlbnRNb2R1bGVEYXRhLmRlcHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYG1pc3NpbmcgZGVwOiAke3BhcmVudE1vZHVsZURhdGEucGFja2FnZX0gcmVxdWVzdGVkICR7cmVxdWVzdGVkTmFtZX1gKVxuICAgIH1cbiAgICByZXR1cm4gcGFyZW50TW9kdWxlRGF0YS5kZXBzW3JlcXVlc3RlZE5hbWVdIHx8IHJlcXVlc3RlZE5hbWVcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MgKHJlcXVpcmVSZWxhdGl2ZVdpdGhDb250ZXh0LCBtb2R1bGVPYmosIG1vZHVsZURhdGEpIHtcbiAgICBjb25zdCByZXF1aXJlID0gcmVxdWlyZVJlbGF0aXZlV2l0aENvbnRleHRcbiAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVPYmpcbiAgICBjb25zdCBleHBvcnRzID0gbW9kdWxlT2JqLmV4cG9ydHNcbiAgICAvLyBiaWZ5IGRpcmVjdCBtb2R1bGUgaW5zdGFudGlhdGlvbiBkaXNhYmxlZCAoXCJhcmd1bWVudHNbNF1cIilcbiAgICByZXR1cm4gW3JlcXVpcmUsIG1vZHVsZSwgZXhwb3J0cywgbnVsbCwgbnVsbF1cbiAgfVxuXG4gIC8vIGl0IGlzIGNhbGxlZCBieSB0aGUgcG9saWN5IGxvYWRlciBvciBtb2R1bGVzIGNvbGxlY3Rpb25cbiAgZnVuY3Rpb24gbG9hZFBvbGljeSAoYnVuZGxlUG9saWN5KSB7XG4gICAgLy8gdmVyaWZ5ICsgbG9hZCBjb25maWdcbiAgICBPYmplY3QuZW50cmllcyhidW5kbGVQb2xpY3kucmVzb3VyY2VzIHx8IHt9KS5mb3JFYWNoKChbcGFja2FnZU5hbWUsIHBhY2thZ2VDb25maWddKSA9PiB7XG4gICAgICBpZiAocGFja2FnZU5hbWUgaW4gbGF2YW1vYXRQb2xpY3kpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIGxvYWRCdW5kbGUgZW5jb3VudGVyZWQgcmVkdW5kYW50IGNvbmZpZyBkZWZpbml0aW9uIGZvciBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cImApXG4gICAgICB9XG4gICAgICBsYXZhbW9hdFBvbGljeS5yZXNvdXJjZXNbcGFja2FnZU5hbWVdID0gcGFja2FnZUNvbmZpZ1xuICAgIH0pXG4gIH1cblxuICAvLyBpdCBpcyBjYWxsZWQgYnkgdGhlIG1vZHVsZXMgY29sbGVjdGlvblxuICBmdW5jdGlvbiBsb2FkQnVuZGxlIChuZXdNb2R1bGVzLCBlbnRyeVBvaW50cywgYnVuZGxlUG9saWN5KSB7XG4gICAgLy8gdmVyaWZ5ICsgbG9hZCBjb25maWdcbiAgICBpZiAoYnVuZGxlUG9saWN5KSB7XG4gICAgICBsb2FkUG9saWN5KGJ1bmRsZVBvbGljeSlcbiAgICB9XG4gICAgLy8gdmVyaWZ5ICsgbG9hZCBpbiBlYWNoIG1vZHVsZVxuICAgIGZvciAoY29uc3QgW21vZHVsZUlkLCBtb2R1bGVEZXBzLCBpbml0Rm4sIHsgcGFja2FnZTogcGFja2FnZU5hbWUsIHR5cGUgfV0gb2YgbmV3TW9kdWxlcykge1xuICAgICAgLy8gdmVyaWZ5IHRoYXQgbW9kdWxlIGlzIG5ld1xuICAgICAgaWYgKG1vZHVsZVJlZ2lzdHJ5Lmhhcyhtb2R1bGVJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIGxvYWRCdW5kbGUgZW5jb3VudGVyZWQgcmVkdW5kYW50IG1vZHVsZSBkZWZpbml0aW9uIGZvciBpZCBcIiR7bW9kdWxlSWR9XCJgKVxuICAgICAgfVxuICAgICAgLy8gYWRkIHRoZSBtb2R1bGVcbiAgICAgIG1vZHVsZVJlZ2lzdHJ5LnNldChtb2R1bGVJZCwge1xuICAgICAgICB0eXBlOiB0eXBlIHx8ICdqcycsXG4gICAgICAgIGlkOiBtb2R1bGVJZCxcbiAgICAgICAgZGVwczogbW9kdWxlRGVwcyxcbiAgICAgICAgLy8gc291cmNlOiBgKCR7aW5pdEZufSlgLFxuICAgICAgICBwcmVjb21waWxlZEluaXRpYWxpemVyOiBpbml0Rm4sXG4gICAgICAgIHBhY2thZ2U6IHBhY2thZ2VOYW1lLFxuICAgICAgfSlcbiAgICB9XG4gICAgLy8gcnVuIGVhY2ggb2YgZW50cnlQb2ludHNcbiAgICBjb25zdCBlbnRyeUV4cG9ydHMgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoZW50cnlQb2ludHMsIChlbnRyeUlkKSA9PiB7XG4gICAgICByZXR1cm4gcnVuTW9kdWxlKGVudHJ5SWQpXG4gICAgfSlcbiAgICAvLyB3ZWJwYWNrIGNvbXBhdDogcmV0dXJuIHRoZSBmaXJzdCBtb2R1bGUncyBleHBvcnRzXG4gICAgcmV0dXJuIGVudHJ5RXhwb3J0c1swXVxuICB9XG5cbiAgZnVuY3Rpb24gcnVuTW9kdWxlIChtb2R1bGVJZCkge1xuICAgIGlmICghbW9kdWxlUmVnaXN0cnkuaGFzKG1vZHVsZUlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBtb2R1bGUgcmVnaXN0ZXJlZCBmb3IgXCIke21vZHVsZUlkfVwiICgke3R5cGVvZiBtb2R1bGVJZH0pYClcbiAgICB9XG4gICAgcmV0dXJuIGludGVybmFsUmVxdWlyZShtb2R1bGVJZClcbiAgfVxuXG4gIC8vIGNhbGxlZCBieSByZXBvcnRTdGF0c0hvb2tcbiAgZnVuY3Rpb24gb25TdGF0c1JlYWR5IChtb2R1bGVHcmFwaFN0YXRzT2JqKSB7XG4gICAgY29uc3QgZ3JhcGhJZCA9IERhdGUubm93KClcbiAgICBjb25zb2xlLndhcm4oYGNvbXBsZXRlZCBtb2R1bGUgZ3JhcGggaW5pdCBcIiR7Z3JhcGhJZH1cIiBpbiAke21vZHVsZUdyYXBoU3RhdHNPYmoudmFsdWV9bXMgKFwiJHttb2R1bGVHcmFwaFN0YXRzT2JqLm5hbWV9XCIpYClcbiAgICBjb25zb2xlLndhcm4oJ2xvZ2dpbmcgbW9kdWxlIGluaXQgc3RhdHMgb2JqZWN0OicpXG4gICAgY29uc29sZS53YXJuKEpTT04uc3RyaW5naWZ5KG1vZHVsZUdyYXBoU3RhdHNPYmosIG51bGwsIDIpKVxuICB9XG5cbn0pKClcbiJdfQ==