axios 0.5.3 → 0.5.4

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.

Potentially problematic release.


This version of axios might be problematic. Click here for more details.

@@ -18,16 +18,16 @@
18
18
  <h1>Code coverage report for <span class="entity">./webpack.tests.js</span></h1>
19
19
  <h2>
20
20
 
21
- Statements: <span class="metric">86.28% <small>(1094 / 1268)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
21
+ Statements: <span class="metric">86.22% <small>(1095 / 1270)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
22
22
 
23
23
 
24
- Branches: <span class="metric">60% <small>(198 / 330)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
24
+ Branches: <span class="metric">59.94% <small>(199 / 332)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
25
25
 
26
26
 
27
- Functions: <span class="metric">86.46% <small>(332 / 384)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
27
+ Functions: <span class="metric">86.49% <small>(333 / 385)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
28
28
 
29
29
 
30
- Lines: <span class="metric">87.15% <small>(1092 / 1253)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
30
+ Lines: <span class="metric">87.09% <small>(1093 / 1255)</small></span> &nbsp;&nbsp;&nbsp;&nbsp;
31
31
 
32
32
  Ignored: <span class="metric"><span class="ignore-none">none</span></span> &nbsp;&nbsp;&nbsp;&nbsp;
33
33
  </h2>
@@ -3379,32 +3379,81 @@
3379
3379
  3342
3380
3380
  3343
3381
3381
  3344
3382
- 3345</td><td class="line-coverage"><span class="cline-any cline-yes">1</span>
3383
- <span class="cline-any cline-neutral">&nbsp;</span>
3384
- <span class="cline-any cline-yes">1</span>
3385
- <span class="cline-any cline-neutral">&nbsp;</span>
3386
- <span class="cline-any cline-neutral">&nbsp;</span>
3387
- <span class="cline-any cline-yes">1</span>
3388
- <span class="cline-any cline-neutral">&nbsp;</span>
3389
- <span class="cline-any cline-neutral">&nbsp;</span>
3390
- <span class="cline-any cline-yes">95</span>
3382
+ 3345
3383
+ 3346
3384
+ 3347
3385
+ 3348
3386
+ 3349
3387
+ 3350
3388
+ 3351
3389
+ 3352
3390
+ 3353
3391
+ 3354
3392
+ 3355
3393
+ 3356
3394
+ 3357
3395
+ 3358
3396
+ 3359
3397
+ 3360
3398
+ 3361
3399
+ 3362
3400
+ 3363
3401
+ 3364
3402
+ 3365
3403
+ 3366
3404
+ 3367
3405
+ 3368
3406
+ 3369
3407
+ 3370
3408
+ 3371
3409
+ 3372
3410
+ 3373
3411
+ 3374
3412
+ 3375
3413
+ 3376
3414
+ 3377
3415
+ 3378
3416
+ 3379
3417
+ 3380
3418
+ 3381
3419
+ 3382
3420
+ 3383
3421
+ 3384
3422
+ 3385
3423
+ 3386
3424
+ 3387
3425
+ 3388
3426
+ 3389
3427
+ 3390
3428
+ 3391
3429
+ 3392
3430
+ 3393
3431
+ 3394</td><td class="line-coverage"><span class="cline-any cline-yes">1</span>
3432
+ <span class="cline-any cline-neutral">&nbsp;</span>
3433
+ <span class="cline-any cline-yes">1</span>
3434
+ <span class="cline-any cline-neutral">&nbsp;</span>
3435
+ <span class="cline-any cline-neutral">&nbsp;</span>
3436
+ <span class="cline-any cline-yes">1</span>
3437
+ <span class="cline-any cline-neutral">&nbsp;</span>
3438
+ <span class="cline-any cline-neutral">&nbsp;</span>
3439
+ <span class="cline-any cline-yes">96</span>
3391
3440
  <span class="cline-any cline-yes">57</span>
3392
3441
  <span class="cline-any cline-neutral">&nbsp;</span>
3393
3442
  <span class="cline-any cline-neutral">&nbsp;</span>
3394
- <span class="cline-any cline-yes">38</span>
3443
+ <span class="cline-any cline-yes">39</span>
3395
3444
  <span class="cline-any cline-neutral">&nbsp;</span>
3396
3445
  <span class="cline-any cline-neutral">&nbsp;</span>
3397
3446
  <span class="cline-any cline-neutral">&nbsp;</span>
3398
3447
  <span class="cline-any cline-neutral">&nbsp;</span>
3399
3448
  <span class="cline-any cline-neutral">&nbsp;</span>
3400
3449
  <span class="cline-any cline-neutral">&nbsp;</span>
3401
- <span class="cline-any cline-yes">38</span>
3450
+ <span class="cline-any cline-yes">39</span>
3402
3451
  <span class="cline-any cline-neutral">&nbsp;</span>
3403
3452
  <span class="cline-any cline-neutral">&nbsp;</span>
3404
- <span class="cline-any cline-yes">38</span>
3453
+ <span class="cline-any cline-yes">39</span>
3405
3454
  <span class="cline-any cline-neutral">&nbsp;</span>
3406
3455
  <span class="cline-any cline-neutral">&nbsp;</span>
3407
- <span class="cline-any cline-yes">38</span>
3456
+ <span class="cline-any cline-yes">39</span>
3408
3457
  <span class="cline-any cline-neutral">&nbsp;</span>
3409
3458
  <span class="cline-any cline-neutral">&nbsp;</span>
3410
3459
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -3453,11 +3502,12 @@
3453
3502
  <span class="cline-any cline-neutral">&nbsp;</span>
3454
3503
  <span class="cline-any cline-neutral">&nbsp;</span>
3455
3504
  <span class="cline-any cline-neutral">&nbsp;</span>
3505
+ <span class="cline-any cline-neutral">&nbsp;</span>
3456
3506
  <span class="cline-any cline-yes">1</span>
3457
- <span class="cline-any cline-yes">18</span>
3507
+ <span class="cline-any cline-yes">19</span>
3458
3508
  <span class="cline-any cline-neutral">&nbsp;</span>
3459
3509
  <span class="cline-any cline-yes">1</span>
3460
- <span class="cline-any cline-yes">18</span>
3510
+ <span class="cline-any cline-yes">19</span>
3461
3511
  <span class="cline-any cline-neutral">&nbsp;</span>
3462
3512
  <span class="cline-any cline-yes">1</span>
3463
3513
  <span class="cline-any cline-yes">1</span>
@@ -4139,6 +4189,51 @@
4139
4189
  <span class="cline-any cline-neutral">&nbsp;</span>
4140
4190
  <span class="cline-any cline-neutral">&nbsp;</span>
4141
4191
  <span class="cline-any cline-neutral">&nbsp;</span>
4192
+ <span class="cline-any cline-neutral">&nbsp;</span>
4193
+ <span class="cline-any cline-neutral">&nbsp;</span>
4194
+ <span class="cline-any cline-neutral">&nbsp;</span>
4195
+ <span class="cline-any cline-neutral">&nbsp;</span>
4196
+ <span class="cline-any cline-neutral">&nbsp;</span>
4197
+ <span class="cline-any cline-neutral">&nbsp;</span>
4198
+ <span class="cline-any cline-neutral">&nbsp;</span>
4199
+ <span class="cline-any cline-neutral">&nbsp;</span>
4200
+ <span class="cline-any cline-neutral">&nbsp;</span>
4201
+ <span class="cline-any cline-neutral">&nbsp;</span>
4202
+ <span class="cline-any cline-neutral">&nbsp;</span>
4203
+ <span class="cline-any cline-neutral">&nbsp;</span>
4204
+ <span class="cline-any cline-neutral">&nbsp;</span>
4205
+ <span class="cline-any cline-neutral">&nbsp;</span>
4206
+ <span class="cline-any cline-neutral">&nbsp;</span>
4207
+ <span class="cline-any cline-neutral">&nbsp;</span>
4208
+ <span class="cline-any cline-neutral">&nbsp;</span>
4209
+ <span class="cline-any cline-neutral">&nbsp;</span>
4210
+ <span class="cline-any cline-neutral">&nbsp;</span>
4211
+ <span class="cline-any cline-neutral">&nbsp;</span>
4212
+ <span class="cline-any cline-neutral">&nbsp;</span>
4213
+ <span class="cline-any cline-neutral">&nbsp;</span>
4214
+ <span class="cline-any cline-neutral">&nbsp;</span>
4215
+ <span class="cline-any cline-neutral">&nbsp;</span>
4216
+ <span class="cline-any cline-neutral">&nbsp;</span>
4217
+ <span class="cline-any cline-neutral">&nbsp;</span>
4218
+ <span class="cline-any cline-neutral">&nbsp;</span>
4219
+ <span class="cline-any cline-neutral">&nbsp;</span>
4220
+ <span class="cline-any cline-neutral">&nbsp;</span>
4221
+ <span class="cline-any cline-neutral">&nbsp;</span>
4222
+ <span class="cline-any cline-neutral">&nbsp;</span>
4223
+ <span class="cline-any cline-neutral">&nbsp;</span>
4224
+ <span class="cline-any cline-neutral">&nbsp;</span>
4225
+ <span class="cline-any cline-neutral">&nbsp;</span>
4226
+ <span class="cline-any cline-neutral">&nbsp;</span>
4227
+ <span class="cline-any cline-neutral">&nbsp;</span>
4228
+ <span class="cline-any cline-neutral">&nbsp;</span>
4229
+ <span class="cline-any cline-neutral">&nbsp;</span>
4230
+ <span class="cline-any cline-neutral">&nbsp;</span>
4231
+ <span class="cline-any cline-neutral">&nbsp;</span>
4232
+ <span class="cline-any cline-neutral">&nbsp;</span>
4233
+ <span class="cline-any cline-neutral">&nbsp;</span>
4234
+ <span class="cline-any cline-neutral">&nbsp;</span>
4235
+ <span class="cline-any cline-neutral">&nbsp;</span>
4236
+ <span class="cline-any cline-neutral">&nbsp;</span>
4142
4237
  <span class="cline-any cline-yes">1</span>
4143
4238
  <span class="cline-any cline-neutral">&nbsp;</span>
4144
4239
  <span class="cline-any cline-yes">1</span>
@@ -4801,6 +4896,9 @@
4801
4896
  <span class="cline-any cline-yes">1</span>
4802
4897
  <span class="cline-any cline-neutral">&nbsp;</span>
4803
4898
  <span class="cline-any cline-yes">30</span>
4899
+ <span class="cline-any cline-no">&nbsp;</span>
4900
+ <span class="cline-any cline-neutral">&nbsp;</span>
4901
+ <span class="cline-any cline-yes">30</span>
4804
4902
  <span class="cline-any cline-yes">1</span>
4805
4903
  <span class="cline-any cline-neutral">&nbsp;</span>
4806
4904
  <span class="cline-any cline-yes">29</span>
@@ -5136,7 +5234,7 @@
5136
5234
  <span class="cline-any cline-neutral">&nbsp;</span>
5137
5235
  <span class="cline-any cline-neutral">&nbsp;</span>
5138
5236
  <span class="cline-any cline-yes">1</span>
5139
- <span class="cline-any cline-yes">32</span>
5237
+ <span class="cline-any cline-yes">62</span>
5140
5238
  <span class="cline-any cline-neutral">&nbsp;</span>
5141
5239
  <span class="cline-any cline-neutral">&nbsp;</span>
5142
5240
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -6780,22 +6878,23 @@
6780
6878
  var map = {
6781
6879
  "./api.spec.js": 2,
6782
6880
  "./defaults.spec.js": 3,
6783
- "./helpers/buildUrl.spec.js": 10,
6784
- "./helpers/cookies.spec.js": 11,
6785
- "./helpers/parseHeaders.spec.js": 12,
6786
- "./helpers/spread.spec.js": 13,
6787
- "./helpers/transformData.spec.js": 14,
6788
- "./helpers/urlIsSameOrigin.spec.js": 15,
6881
+ "./helpers/buildUrl.spec.js": 11,
6882
+ "./helpers/cookies.spec.js": 12,
6883
+ "./helpers/parseHeaders.spec.js": 13,
6884
+ "./helpers/spread.spec.js": 14,
6885
+ "./helpers/transformData.spec.js": 15,
6886
+ "./helpers/urlIsSameOrigin.spec.js": 16,
6789
6887
  "./interceptors.spec.js": 4,
6790
6888
  "./options.spec.js": 5,
6791
6889
  "./promise.spec.js": 6,
6792
6890
  "./transform.spec.js": 7,
6793
- "./utils/forEach.spec.js": 16,
6794
- "./utils/isX.spec.js": 17,
6795
- "./utils/merge.spec.js": 18,
6796
- "./utils/trim.spec.js": 19,
6797
- "./wrapper.spec.js": 8,
6798
- "./xsrf.spec.js": 9
6891
+ "./upload.spec.js": 8,
6892
+ "./utils/forEach.spec.js": 17,
6893
+ "./utils/isX.spec.js": 18,
6894
+ "./utils/merge.spec.js": 19,
6895
+ "./utils/trim.spec.js": 20,
6896
+ "./wrapper.spec.js": 9,
6897
+ "./xsrf.spec.js": 10
6799
6898
  };
6800
6899
  function webpackContext(req) {
6801
6900
  return __webpack_require__(webpackContextResolve(req));
@@ -6815,7 +6914,7 @@
6815
6914
  /* 2 */
6816
6915
  /***/ function(module, exports, __webpack_require__) {
6817
6916
  &nbsp;
6818
- var axios = __webpack_require__(20);
6917
+ var axios = __webpack_require__(21);
6819
6918
 
6820
6919
  describe('api', function () {
6821
6920
  it('should have request method helpers', function () {
@@ -6852,7 +6951,7 @@
6852
6951
  /* 3 */
6853
6952
  /***/ function(module, exports, __webpack_require__) {
6854
6953
  &nbsp;
6855
- var defaults = __webpack_require__(21);
6954
+ var defaults = __webpack_require__(22);
6856
6955
 
6857
6956
  describe('defaults', function () {
6858
6957
  it('should transform request json', function () {
@@ -6881,7 +6980,7 @@
6881
6980
  /* 4 */
6882
6981
  /***/ function(module, exports, __webpack_require__) {
6883
6982
  &nbsp;
6884
- var axios = __webpack_require__(20);
6983
+ var axios = __webpack_require__(21);
6885
6984
 
6886
6985
  describe('interceptors', function () {
6887
6986
  beforeEach(function () {
@@ -7187,7 +7286,7 @@
7187
7286
  /* 5 */
7188
7287
  /***/ function(module, exports, __webpack_require__) {
7189
7288
  &nbsp;
7190
- var axios = __webpack_require__(20);
7289
+ var axios = __webpack_require__(21);
7191
7290
 
7192
7291
  describe('options', function () {
7193
7292
  beforeEach(function () {
@@ -7274,7 +7373,7 @@
7274
7373
  /* 6 */
7275
7374
  /***/ function(module, exports, __webpack_require__) {
7276
7375
  &nbsp;
7277
- var axios = __webpack_require__(20);
7376
+ var axios = __webpack_require__(21);
7278
7377
 
7279
7378
  describe('promise', function () {
7280
7379
  beforeEach(function () {
@@ -7379,7 +7478,7 @@
7379
7478
  /* 7 */
7380
7479
  /***/ function(module, exports, __webpack_require__) {
7381
7480
  &nbsp;
7382
- var axios = __webpack_require__(20);
7481
+ var axios = __webpack_require__(21);
7383
7482
 
7384
7483
  describe('transform', function () {
7385
7484
  beforeEach(function () {
@@ -7483,7 +7582,52 @@
7483
7582
  /* 8 */
7484
7583
  /***/ function(module, exports, __webpack_require__) {
7485
7584
  &nbsp;
7486
- var axios = __webpack_require__(20);
7585
+ // var axios = require('../../index');
7586
+ //
7587
+ // describe('upload', function () {
7588
+ //
7589
+ // it('should upload a file to a server', function (done) {
7590
+ // });
7591
+ //
7592
+ // it('should not set xsrf header if cookie is null', function (done) {
7593
+ // var request;
7594
+ //
7595
+ // axios({
7596
+ // url: '/foo'
7597
+ // });
7598
+ //
7599
+ // setTimeout(function () {
7600
+ // request = jasmine.Ajax.requests.mostRecent();
7601
+ //
7602
+ // expect(request.requestHeaders[axios.defaults.xsrfHeaderName]).toEqual(undefined);
7603
+ // done();
7604
+ // }, 0);
7605
+ // });
7606
+ //
7607
+ // it('should set xsrf header if cookie is set', function (done) {
7608
+ // var request;
7609
+ // document.cookie = axios.defaults.xsrfCookieName + '=12345';
7610
+ //
7611
+ // axios({
7612
+ // url: '/foo'
7613
+ // });
7614
+ //
7615
+ // setTimeout(function () {
7616
+ // request = jasmine.Ajax.requests.mostRecent();
7617
+ //
7618
+ // expect(request.requestHeaders[axios.defaults.xsrfHeaderName]).toEqual('12345');
7619
+ // done();
7620
+ // }, 0);
7621
+ // });
7622
+ // });
7623
+ //
7624
+ &nbsp;
7625
+ &nbsp;
7626
+ /***/ },
7627
+ /* 9 */
7628
+ /***/ function(module, exports, __webpack_require__) {
7629
+ &nbsp;
7630
+ var axios = __webpack_require__(21);
7487
7631
 
7488
7632
  describe('wrapper', function () {
7489
7633
  beforeEach(function () {
@@ -7703,10 +7847,10 @@
7703
7847
  &nbsp;
7704
7848
  &nbsp;
7705
7849
  /***/ },
7706
- /* 9 */
7850
+ /* 10 */
7707
7851
  /***/ function(module, exports, __webpack_require__) {
7708
7852
  &nbsp;
7709
- var axios = __webpack_require__(20);
7853
+ var axios = __webpack_require__(21);
7710
7854
 
7711
7855
  describe('xsrf', function () {
7712
7856
  beforeEach(function () {
@@ -7752,10 +7896,10 @@
7752
7896
  &nbsp;
7753
7897
  &nbsp;
7754
7898
  /***/ },
7755
- /* 10 */
7899
+ /* 11 */
7756
7900
  /***/ function(module, exports, __webpack_require__) {
7757
7901
  &nbsp;
7758
- var buildUrl = __webpack_require__(22);
7902
+ var buildUrl = __webpack_require__(23);
7759
7903
 
7760
7904
  describe('helpers::buildUrl', function () {
7761
7905
  it('should support null params', function () {
@@ -7806,10 +7950,10 @@
7806
7950
  &nbsp;
7807
7951
  &nbsp;
7808
7952
  /***/ },
7809
- /* 11 */
7953
+ /* 12 */
7810
7954
  /***/ function(module, exports, __webpack_require__) {
7811
7955
  &nbsp;
7812
- var cookies = __webpack_require__(23);
7956
+ var cookies = __webpack_require__(24);
7813
7957
 
7814
7958
  describe('helpers::cookies', function () {
7815
7959
  afterEach(function () {
@@ -7848,10 +7992,10 @@
7848
7992
  &nbsp;
7849
7993
  &nbsp;
7850
7994
  /***/ },
7851
- /* 12 */
7995
+ /* 13 */
7852
7996
  /***/ function(module, exports, __webpack_require__) {
7853
7997
  &nbsp;
7854
- var parseHeaders = __webpack_require__(24);
7998
+ var parseHeaders = __webpack_require__(25);
7855
7999
 
7856
8000
  describe('helpers::parseHeaders', function () {
7857
8001
  it('should parse headers', function () {
@@ -7873,10 +8017,10 @@
7873
8017
  &nbsp;
7874
8018
  &nbsp;
7875
8019
  /***/ },
7876
- /* 13 */
8020
+ /* 14 */
7877
8021
  /***/ function(module, exports, __webpack_require__) {
7878
8022
  &nbsp;
7879
- var spread = __webpack_require__(25);
8023
+ var spread = __webpack_require__(26);
7880
8024
 
7881
8025
  describe('helpers::spread', function () {
7882
8026
  it('should spread array to arguments', function () {
@@ -7892,10 +8036,10 @@
7892
8036
  &nbsp;
7893
8037
  &nbsp;
7894
8038
  /***/ },
7895
- /* 14 */
8039
+ /* 15 */
7896
8040
  /***/ function(module, exports, __webpack_require__) {
7897
8041
  &nbsp;
7898
- var transformData = __webpack_require__(26);
8042
+ var transformData = __webpack_require__(27);
7899
8043
 
7900
8044
  describe('helpers::transformData', function () {
7901
8045
  it('should support a single transformer', function () {
@@ -7928,10 +8072,10 @@
7928
8072
  &nbsp;
7929
8073
  &nbsp;
7930
8074
  /***/ },
7931
- /* 15 */
8075
+ /* 16 */
7932
8076
  /***/ function(module, exports, __webpack_require__) {
7933
8077
  &nbsp;
7934
- var urlIsSameOrigin = __webpack_require__(27);
8078
+ var urlIsSameOrigin = __webpack_require__(28);
7935
8079
 
7936
8080
  describe('helpers::urlIsSameOrigin', function () {
7937
8081
  it('should detect same origin', function () {
@@ -7945,10 +8089,10 @@
7945
8089
  &nbsp;
7946
8090
  &nbsp;
7947
8091
  /***/ },
7948
- /* 16 */
8092
+ /* 17 */
7949
8093
  /***/ function(module, exports, __webpack_require__) {
7950
8094
  &nbsp;
7951
- var forEach = __webpack_require__(28).forEach;
8095
+ var forEach = __webpack_require__(29).forEach;
7952
8096
 
7953
8097
  describe('utils::forEach', function () {
7954
8098
  it('should loop over an array', function () {
@@ -8015,10 +8159,10 @@
8015
8159
  &nbsp;
8016
8160
  &nbsp;
8017
8161
  /***/ },
8018
- /* 17 */
8162
+ /* 18 */
8019
8163
  /***/ function(module, exports, __webpack_require__) {
8020
8164
  &nbsp;
8021
- var utils = __webpack_require__(28);
8165
+ var utils = __webpack_require__(29);
8022
8166
 
8023
8167
  describe('utils::isX', function () {
8024
8168
  it('should validate Array', function () {
@@ -8073,10 +8217,10 @@
8073
8217
  &nbsp;
8074
8218
  &nbsp;
8075
8219
  /***/ },
8076
- /* 18 */
8220
+ /* 19 */
8077
8221
  /***/ function(module, exports, __webpack_require__) {
8078
8222
  &nbsp;
8079
- var merge = __webpack_require__(28).merge;
8223
+ var merge = __webpack_require__(29).merge;
8080
8224
 
8081
8225
  describe('utils::merge', function () {
8082
8226
  it('should be immutable', function () {
@@ -8106,10 +8250,10 @@
8106
8250
  &nbsp;
8107
8251
  &nbsp;
8108
8252
  /***/ },
8109
- /* 19 */
8253
+ /* 20 */
8110
8254
  /***/ function(module, exports, __webpack_require__) {
8111
8255
  &nbsp;
8112
- var trim = __webpack_require__(28).trim;
8256
+ var trim = __webpack_require__(29).trim;
8113
8257
 
8114
8258
  describe('utils::trim', function () {
8115
8259
  it('should trim spaces', function () {
@@ -8124,18 +8268,18 @@
8124
8268
  &nbsp;
8125
8269
  &nbsp;
8126
8270
  /***/ },
8127
- /* 20 */
8271
+ /* 21 */
8128
8272
  /***/ function(module, exports, __webpack_require__) {
8129
8273
  &nbsp;
8130
- module.exports = __webpack_require__(29);
8274
+ module.exports = __webpack_require__(30);
8131
8275
  &nbsp;
8132
8276
  /***/ },
8133
- /* 21 */
8277
+ /* 22 */
8134
8278
  /***/ function(module, exports, __webpack_require__) {
8135
8279
  &nbsp;
8136
8280
  'use strict';
8137
8281
 
8138
- var utils = __webpack_require__(28);
8282
+ var utils = __webpack_require__(29);
8139
8283
 
8140
8284
  var PROTECTION_PREFIX = /^\)\]\}',?\n/;
8141
8285
  var DEFAULT_CONTENT_TYPE = {
@@ -8144,6 +8288,9 @@
8144
8288
 
8145
8289
  module.exports = {
8146
8290
  transformRequest: [function (data, headers) {
8291
+ <span class="missing-if-branch" title="if path not taken" >I</span>if(utils.isFormData(data)) {
8292
+ <span class="cstat-no" title="statement not covered" > return data;</span>
8293
+ }
8147
8294
  if (utils.isArrayBuffer(data)) {
8148
8295
  return data;
8149
8296
  }
@@ -8185,12 +8332,12 @@
8185
8332
  &nbsp;
8186
8333
  &nbsp;
8187
8334
  /***/ },
8188
- /* 22 */
8335
+ /* 23 */
8189
8336
  /***/ function(module, exports, __webpack_require__) {
8190
8337
  &nbsp;
8191
8338
  'use strict';
8192
8339
 
8193
- var utils = __webpack_require__(28);
8340
+ var utils = __webpack_require__(29);
8194
8341
 
8195
8342
  function encode(val) {
8196
8343
  return encodeURIComponent(val).
@@ -8243,12 +8390,12 @@
8243
8390
  &nbsp;
8244
8391
  &nbsp;
8245
8392
  /***/ },
8246
- /* 23 */
8393
+ /* 24 */
8247
8394
  /***/ function(module, exports, __webpack_require__) {
8248
8395
  &nbsp;
8249
8396
  'use strict';
8250
8397
 
8251
- var utils = __webpack_require__(28);
8398
+ var utils = __webpack_require__(29);
8252
8399
 
8253
8400
  module.exports = {
8254
8401
  write: function write(name, value, expires, path, domain, secure) {
@@ -8286,12 +8433,12 @@
8286
8433
  &nbsp;
8287
8434
  &nbsp;
8288
8435
  /***/ },
8289
- /* 24 */
8436
+ /* 25 */
8290
8437
  /***/ function(module, exports, __webpack_require__) {
8291
8438
  &nbsp;
8292
8439
  'use strict';
8293
8440
 
8294
- var utils = __webpack_require__(28);
8441
+ var utils = __webpack_require__(29);
8295
8442
 
8296
8443
  /**
8297
8444
  * Parse headers into an object
@@ -8326,7 +8473,7 @@
8326
8473
  &nbsp;
8327
8474
  &nbsp;
8328
8475
  /***/ },
8329
- /* 25 */
8476
+ /* 26 */
8330
8477
  /***/ function(module, exports, __webpack_require__) {
8331
8478
  &nbsp;
8332
8479
  'use strict';
@@ -8359,12 +8506,12 @@
8359
8506
  &nbsp;
8360
8507
  &nbsp;
8361
8508
  /***/ },
8362
- /* 26 */
8509
+ /* 27 */
8363
8510
  /***/ function(module, exports, __webpack_require__) {
8364
8511
  &nbsp;
8365
8512
  'use strict';
8366
8513
 
8367
- var utils = __webpack_require__(28);
8514
+ var utils = __webpack_require__(29);
8368
8515
 
8369
8516
  /**
8370
8517
  * Transform the data for a request or a response
@@ -8384,12 +8531,12 @@
8384
8531
  &nbsp;
8385
8532
  &nbsp;
8386
8533
  /***/ },
8387
- /* 27 */
8534
+ /* 28 */
8388
8535
  /***/ function(module, exports, __webpack_require__) {
8389
8536
  &nbsp;
8390
8537
  'use strict';
8391
8538
 
8392
- var utils = __webpack_require__(28);
8539
+ var utils = __webpack_require__(29);
8393
8540
  var msie = /(msie|trident)/i.test(navigator.userAgent);
8394
8541
  var urlParsingNode = document.createElement('a');
8395
8542
  var originUrl;
@@ -8442,7 +8589,7 @@
8442
8589
  &nbsp;
8443
8590
  &nbsp;
8444
8591
  /***/ },
8445
- /* 28 */
8592
+ /* 29 */
8446
8593
  /***/ function(module, exports, __webpack_require__) {
8447
8594
  &nbsp;
8448
8595
  'use strict';
@@ -8665,22 +8812,22 @@
8665
8812
  &nbsp;
8666
8813
  &nbsp;
8667
8814
  /***/ },
8668
- /* 29 */
8815
+ /* 30 */
8669
8816
  /***/ function(module, exports, __webpack_require__) {
8670
8817
  &nbsp;
8671
8818
  'use strict';
8672
8819
 
8673
- var defaults = __webpack_require__(21);
8674
- var utils = __webpack_require__(28);
8675
- var deprecatedMethod = __webpack_require__(30);
8676
- var dispatchRequest = __webpack_require__(31);
8677
- var InterceptorManager = __webpack_require__(32);
8820
+ var defaults = __webpack_require__(22);
8821
+ var utils = __webpack_require__(29);
8822
+ var deprecatedMethod = __webpack_require__(31);
8823
+ var dispatchRequest = __webpack_require__(32);
8824
+ var InterceptorManager = __webpack_require__(33);
8678
8825
 
8679
8826
  // Polyfill ES6 Promise if needed
8680
8827
  (function () {
8681
8828
  // webpack is being used to set es6-promise to the native Promise
8682
8829
  // for the standalone build. It's necessary to make sure polyfill exists.
8683
- var P = __webpack_require__(34);
8830
+ var P = __webpack_require__(35);
8684
8831
  <span class="missing-if-branch" title="else path not taken" >E</span>if (P &amp;&amp; typeof P.polyfill === 'function') {
8685
8832
  P.polyfill();
8686
8833
  }
@@ -8743,7 +8890,7 @@
8743
8890
  axios.all = function (promises) {
8744
8891
  return Promise.all(promises);
8745
8892
  };
8746
- axios.spread = __webpack_require__(25);
8893
+ axios.spread = __webpack_require__(26);
8747
8894
 
8748
8895
  // Expose interceptors
8749
8896
  axios.interceptors = {
@@ -8782,7 +8929,7 @@
8782
8929
  &nbsp;
8783
8930
  &nbsp;
8784
8931
  /***/ },
8785
- /* 30 */
8932
+ /* 31 */
8786
8933
  /***/ function(module, exports, __webpack_require__) {
8787
8934
  &nbsp;
8788
8935
  'use strict';
@@ -8810,7 +8957,7 @@
8810
8957
  &nbsp;
8811
8958
  &nbsp;
8812
8959
  /***/ },
8813
- /* 31 */
8960
+ /* 32 */
8814
8961
  /***/ function(module, exports, __webpack_require__) {
8815
8962
  &nbsp;
8816
8963
  /* WEBPACK VAR INJECTION */(function(process) {'use strict';
@@ -8827,11 +8974,11 @@
8827
8974
  try {
8828
8975
  // For browsers use XHR adapter
8829
8976
  <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof window !== 'undefined') {
8830
- __webpack_require__(33)(resolve, reject, config);
8977
+ __webpack_require__(34)(resolve, reject, config);
8831
8978
  }
8832
8979
  // For node use HTTP adapter
8833
8980
  else <span class="cstat-no" title="statement not covered" >if (typeof process !== 'undefined') {</span>
8834
- <span class="cstat-no" title="statement not covered" > __webpack_require__(33)(resolve, reject, config);</span>
8981
+ <span class="cstat-no" title="statement not covered" > __webpack_require__(34)(resolve, reject, config);</span>
8835
8982
  }
8836
8983
  } catch (e) {
8837
8984
  reject(e);
@@ -8840,15 +8987,15 @@
8840
8987
  };
8841
8988
 
8842
8989
 
8843
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(35)))
8990
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(36)))
8844
8991
  &nbsp;
8845
8992
  /***/ },
8846
- /* 32 */
8993
+ /* 33 */
8847
8994
  /***/ function(module, exports, __webpack_require__) {
8848
8995
  &nbsp;
8849
8996
  'use strict';
8850
8997
 
8851
- var utils = __webpack_require__(28);
8998
+ var utils = __webpack_require__(29);
8852
8999
 
8853
9000
  function InterceptorManager() {
8854
9001
  this.handlers = [];
@@ -8901,20 +9048,20 @@
8901
9048
  &nbsp;
8902
9049
  &nbsp;
8903
9050
  /***/ },
8904
- /* 33 */
9051
+ /* 34 */
8905
9052
  /***/ function(module, exports, __webpack_require__) {
8906
9053
  &nbsp;
8907
9054
  'use strict';
8908
9055
 
8909
9056
  /*global ActiveXObject:true*/
8910
9057
 
8911
- var defaults = __webpack_require__(21);
8912
- var utils = __webpack_require__(28);
8913
- var buildUrl = __webpack_require__(22);
8914
- var cookies = __webpack_require__(23);
8915
- var parseHeaders = __webpack_require__(24);
8916
- var transformData = __webpack_require__(26);
8917
- var urlIsSameOrigin = __webpack_require__(27);
9058
+ var defaults = __webpack_require__(22);
9059
+ var utils = __webpack_require__(29);
9060
+ var buildUrl = __webpack_require__(23);
9061
+ var cookies = __webpack_require__(24);
9062
+ var parseHeaders = __webpack_require__(25);
9063
+ var transformData = __webpack_require__(27);
9064
+ var urlIsSameOrigin = __webpack_require__(28);
8918
9065
 
8919
9066
  module.exports = function xhrAdapter(resolve, reject, config) {
8920
9067
  // Transform request data
@@ -9013,7 +9160,7 @@
9013
9160
  &nbsp;
9014
9161
  &nbsp;
9015
9162
  /***/ },
9016
- /* 34 */
9163
+ /* 35 */
9017
9164
  /***/ function(module, exports, __webpack_require__) {
9018
9165
  &nbsp;
9019
9166
  var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(process, global, module) {/*!
@@ -9968,7 +10115,7 @@
9968
10115
  };
9969
10116
 
9970
10117
  /* global define:true module:true window: true */
9971
- <span class="missing-if-branch" title="if path not taken" >I</span>if ("function" === 'function' &amp;&amp; __webpack_require__(36)['amd']) {
10118
+ <span class="missing-if-branch" title="if path not taken" >I</span>if ("function" === 'function' &amp;&amp; __webpack_require__(37)['amd']) {
9972
10119
  <span class="cstat-no" title="statement not covered" > !(__WEBPACK_AMD_DEFINE_RESULT__ = <span class="fstat-no" title="function not covered" >function() {</span> <span class="cstat-no" title="statement not covered" >return es6$promise$umd$$ES6Promise; </span>}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &amp;&amp; (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));</span>
9973
10120
  } else <span class="missing-if-branch" title="else path not taken" >E</span>if (typeof module !== 'undefined' &amp;&amp; module['exports']) {
9974
10121
  module['exports'] = es6$promise$umd$$ES6Promise;
@@ -9976,10 +10123,10 @@
9976
10123
  <span class="cstat-no" title="statement not covered" > this['ES6Promise'] = es6$promise$umd$$ES6Promise;</span>
9977
10124
  }
9978
10125
  }).call(this);
9979
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(35), (function() { return this; }()), __webpack_require__(37)(module)))
10126
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(36), (function() { return this; }()), __webpack_require__(38)(module)))
9980
10127
  &nbsp;
9981
10128
  /***/ },
9982
- /* 35 */
10129
+ /* 36 */
9983
10130
  /***/ function(module, exports, __webpack_require__) {
9984
10131
  &nbsp;
9985
10132
  // shim for using process in browser
@@ -10043,14 +10190,14 @@
10043
10190
  &nbsp;
10044
10191
  &nbsp;
10045
10192
  /***/ },
10046
- /* 36 */
10193
+ /* 37 */
10047
10194
  /***/ function(module, exports, __webpack_require__) {
10048
10195
  &nbsp;
10049
10196
  module.exports = <span class="fstat-no" title="function not covered" >function() {</span> <span class="cstat-no" title="statement not covered" >throw new Error("define cannot be used indirect"); </span>};
10050
10197
  &nbsp;
10051
10198
  &nbsp;
10052
10199
  /***/ },
10053
- /* 37 */
10200
+ /* 38 */
10054
10201
  /***/ function(module, exports, __webpack_require__) {
10055
10202
  &nbsp;
10056
10203
  module.exports = function(module) {
@@ -10067,12 +10214,12 @@
10067
10214
  &nbsp;
10068
10215
  /***/ }
10069
10216
  /******/ ]);
10070
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMGFlZDcxZmQ5NThjNjQzOTZhZTEiLCJ3ZWJwYWNrOi8vLy4vd2VicGFjay50ZXN0cy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzIFxcLmpzJCIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2FwaS5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvZGVmYXVsdHMuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2ludGVyY2VwdG9ycy5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3Mvb3B0aW9ucy5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvcHJvbWlzZS5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvdHJhbnNmb3JtLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy93cmFwcGVyLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy94c3JmLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy9oZWxwZXJzL2J1aWxkVXJsLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy9oZWxwZXJzL2Nvb2tpZXMuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2hlbHBlcnMvcGFyc2VIZWFkZXJzLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy9oZWxwZXJzL3NwcmVhZC5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvaGVscGVycy90cmFuc2Zvcm1EYXRhLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy9oZWxwZXJzL3VybElzU2FtZU9yaWdpbi5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvdXRpbHMvZm9yRWFjaC5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvdXRpbHMvaXNYLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy91dGlscy9tZXJnZS5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvdXRpbHMvdHJpbS5zcGVjLmpzIiwid2VicGFjazovLy8uL2luZGV4LmpzIiwid2VicGFjazovLy8uL2xpYi9kZWZhdWx0cy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaGVscGVycy9idWlsZFVybC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaGVscGVycy9jb29raWVzLmpzIiwid2VicGFjazovLy8uL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaGVscGVycy9zcHJlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2hlbHBlcnMvdHJhbnNmb3JtRGF0YS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaGVscGVycy91cmxJc1NhbWVPcmlnaW4uanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWxzLmpzIiwid2VicGFjazovLy8uL2xpYi9heGlvcy5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaGVscGVycy9kZXByZWNhdGVkTWV0aG9kLmpzIiwid2VicGFjazovLy8uL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2FkYXB0ZXJzL3hoci5qcyIsIndlYnBhY2s6Ly8vLi9+L2VzNi1wcm9taXNlL2Rpc3QvZXM2LXByb21pc2UuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9hbWQtZGVmaW5lLmpzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esd0M7Ozs7Ozs7QUN0Q0E7QUFDQTs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFpQyx1REFBdUQ7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUMvQkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxJQUFHO0FBQ0gsRUFBQzs7Ozs7OztBQzlCRDs7QUFFQTtBQUNBO0FBQ0EsMENBQXlDLFdBQVcsYUFBYSxZQUFZO0FBQzdFLElBQUc7O0FBRUg7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQSxnREFBK0MsWUFBWTs7QUFFM0Q7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQ3JCRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPOztBQUVQO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVCxRQUFPO0FBQ1AsTUFBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1QsUUFBTztBQUNQLE1BQUs7O0FBRUw7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUCxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSztBQUNMLElBQUc7QUFDSCxFQUFDOzs7Ozs7O0FDM1NEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHO0FBQ0gsRUFBQzs7Ozs7OztBQ2hGRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXdCLGdCQUFnQjtBQUN4QyxRQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBd0IsZ0JBQWdCO0FBQ3hDLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRztBQUNILEVBQUM7Ozs7Ozs7QUNsR0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBLHdDQUF1QyxZQUFZO0FBQ25EO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUEsd0NBQXVDLFlBQVk7QUFDbkQ7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7QUFDSCxFQUFDOzs7Ozs7O0FDakdEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQSxnRkFBK0U7QUFDL0U7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXdCLGFBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBa0MsS0FBSztBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSztBQUNMLElBQUc7O0FBRUgsRUFBQzs7Ozs7OztBQ3hORDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0EsMERBQXlEO0FBQ3pEO0FBQ0EsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRztBQUNILEVBQUM7Ozs7Ozs7QUMxQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSyxxQ0FBcUMsWUFBWTtBQUN0RCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHO0FBQ0gsRUFBQzs7Ozs7Ozs7QUM5Q0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNEI7QUFDNUI7QUFDQSxNQUFLO0FBQ0wsbUNBQWtDO0FBQ2xDLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7O0FDbkNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQ2pCRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQ1hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQzVCRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQSxJQUFHO0FBQ0gsRUFBQzs7Ozs7OztBQ1ZEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSzs7QUFFTDtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7O0FBRUw7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O0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQSxVQUFTO0FBQ1Q7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscURBQW9ELFFBQVE7O0FBRTVEO0FBQ0E7O0FBRUE7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQW9ELFFBQVE7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNDQUFxQyxRQUFROztBQUU3Qzs7QUFFQSxzQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBLFVBQVM7QUFDVCxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFxQix1REFBdUQ7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBcUIsdURBQXVEO0FBQzVFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0EsZUFBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWU7QUFDZjtBQUNBO0FBQ0Esa0JBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGNBQWE7QUFDYixZQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBLGVBQWMsU0FBUztBQUN2QixlQUFjLFNBQVM7QUFDdkI7QUFDQSxnQkFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYLFVBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0EsZUFBYyxTQUFTO0FBQ3ZCO0FBQ0EsZ0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUF5QyxhQUFhLEVBQUU7QUFDeEQ7QUFDQSxVQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxREFBeUIsb0NBQW9DLEVBQUU7QUFDL0QsTUFBSztBQUNMO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxFQUFDLGE7Ozs7Ozs7QUMvN0JEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLDZCQUE0QixVQUFVOzs7Ozs7O0FDekR0Qyw4QkFBNkIsbURBQW1EOzs7Ozs7O0FDQWhGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL19rYXJtYV93ZWJwYWNrXy8vXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgMGFlZDcxZmQ5NThjNjQzOTZhZTFcbiAqKi8iLCJ2YXIgY29udGV4dCA9IHJlcXVpcmUuY29udGV4dCgnLi90ZXN0L3NwZWNzJywgdHJ1ZSwgL1xcLmpzJC8pO1xuY29udGV4dC5rZXlzKCkuZm9yRWFjaChjb250ZXh0KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi93ZWJwYWNrLnRlc3RzLmpzXG4gKiogbW9kdWxlIGlkID0gMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIG1hcCA9IHtcblx0XCIuL2FwaS5zcGVjLmpzXCI6IDIsXG5cdFwiLi9kZWZhdWx0cy5zcGVjLmpzXCI6IDMsXG5cdFwiLi9oZWxwZXJzL2J1aWxkVXJsLnNwZWMuanNcIjogMTAsXG5cdFwiLi9oZWxwZXJzL2Nvb2tpZXMuc3BlYy5qc1wiOiAxMSxcblx0XCIuL2hlbHBlcnMvcGFyc2VIZWFkZXJzLnNwZWMuanNcIjogMTIsXG5cdFwiLi9oZWxwZXJzL3NwcmVhZC5zcGVjLmpzXCI6IDEzLFxuXHRcIi4vaGVscGVycy90cmFuc2Zvcm1EYXRhLnNwZWMuanNcIjogMTQsXG5cdFwiLi9oZWxwZXJzL3VybElzU2FtZU9yaWdpbi5zcGVjLmpzXCI6IDE1LFxuXHRcIi4vaW50ZXJjZXB0b3JzLnNwZWMuanNcIjogNCxcblx0XCIuL29wdGlvbnMuc3BlYy5qc1wiOiA1LFxuXHRcIi4vcHJvbWlzZS5zcGVjLmpzXCI6IDYsXG5cdFwiLi90cmFuc2Zvcm0uc3BlYy5qc1wiOiA3LFxuXHRcIi4vdXRpbHMvZm9yRWFjaC5zcGVjLmpzXCI6IDE2LFxuXHRcIi4vdXRpbHMvaXNYLnNwZWMuanNcIjogMTcsXG5cdFwiLi91dGlscy9tZXJnZS5zcGVjLmpzXCI6IDE4LFxuXHRcIi4vdXRpbHMvdHJpbS5zcGVjLmpzXCI6IDE5LFxuXHRcIi4vd3JhcHBlci5zcGVjLmpzXCI6IDgsXG5cdFwiLi94c3JmLnNwZWMuanNcIjogOVxufTtcbmZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0KHJlcSkge1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyh3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSk7XG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHRSZXNvbHZlKHJlcSkge1xuXHRyZXR1cm4gbWFwW3JlcV0gfHwgKGZ1bmN0aW9uKCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInLlwiKSB9KCkpO1xufTtcbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSAxO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MgXFwuanMkXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ2FwaScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBoYXZlIHJlcXVlc3QgbWV0aG9kIGhlbHBlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHR5cGVvZiBheGlvcy5nZXQpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBheGlvcy5oZWFkKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYXhpb3MuZGVsZXRlKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYXhpb3MucG9zdCkudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLnB1dCkudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLnBhdGNoKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhdmUgcHJvbWlzZSBtZXRob2QgaGVscGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IGF4aW9zKCk7XG5cbiAgICBleHBlY3QodHlwZW9mIHByb21pc2UudGhlbikudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIHByb21pc2UuY2F0Y2gpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBwcm9taXNlLnN1Y2Nlc3MpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBwcm9taXNlLmVycm9yKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhdmUgZGVmYXVsdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHR5cGVvZiBheGlvcy5kZWZhdWx0cykudG9FcXVhbCgnb2JqZWN0Jyk7XG4gICAgZXhwZWN0KHR5cGVvZiBheGlvcy5kZWZhdWx0cy5oZWFkZXJzKS50b0VxdWFsKCdvYmplY3QnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBoYXZlIGFsbC9zcHJlYWQgaGVscGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLmFsbCkudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLnNwcmVhZCkudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgfSk7XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL2FwaS5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi4vLi4vbGliL2RlZmF1bHRzJyk7XG5cbmRlc2NyaWJlKCdkZWZhdWx0cycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCB0cmFuc2Zvcm0gcmVxdWVzdCBqc29uJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0WzBdKHtmb286ICdiYXInfSkpLnRvRXF1YWwoJ3tcImZvb1wiOlwiYmFyXCJ9Jyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZG8gbm90aGluZyB0byByZXF1ZXN0IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoZGVmYXVsdHMudHJhbnNmb3JtUmVxdWVzdFswXSgnZm9vPWJhcicpKS50b0VxdWFsKCdmb289YmFyJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdHJhbnNmb3JtIHJlc3BvbnNlIGpzb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZVswXSgne1wiZm9vXCI6XCJiYXJcIn0nKTtcblxuICAgIGV4cGVjdCh0eXBlb2YgZGF0YSkudG9FcXVhbCgnb2JqZWN0Jyk7XG4gICAgZXhwZWN0KGRhdGEuZm9vKS50b0VxdWFsKCdiYXInKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkbyBub3RoaW5nIHRvIHJlc3BvbnNlIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoZGVmYXVsdHMudHJhbnNmb3JtUmVzcG9uc2VbMF0oJ2Zvbz1iYXInKSkudG9FcXVhbCgnZm9vPWJhcicpO1xuICB9KTtcbn0pO1xuXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy9kZWZhdWx0cy5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ2ludGVyY2VwdG9ycycsIGZ1bmN0aW9uICgpIHtcbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgamFzbWluZS5BamF4Lmluc3RhbGwoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXgudW5pbnN0YWxsKCk7XG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QuaGFuZGxlcnMgPSBbXTtcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuaGFuZGxlcnMgPSBbXTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhZGQgYSByZXF1ZXN0IGludGVyY2VwdG9yJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcbiAgICBcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgY29uZmlnLmhlYWRlcnMudGVzdCA9ICdhZGRlZCBieSBpbnRlcmNlcHRvcic7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0pO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAnT0snXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnMudGVzdCkudG9CZSgnYWRkZWQgYnkgaW50ZXJjZXB0b3InKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhZGQgYSByZXF1ZXN0IGludGVyY2VwdG9yIHRoYXQgcmV0dXJucyBhIG5ldyBjb25maWcgb2JqZWN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6ICcvYmFyJyxcbiAgICAgICAgbWV0aG9kOiAncG9zdCdcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5tZXRob2QpLnRvQmUoJ1BPU1QnKTtcbiAgICAgIGV4cGVjdChyZXF1ZXN0LnVybCkudG9CZSgnL2JhcicpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBhIHJlcXVlc3QgaW50ZXJjZXB0b3IgdGhhdCByZXR1cm5zIGEgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIGRvIHNvbWV0aGluZyBhc3luY1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25maWcuaGVhZGVycy5hc3luYyA9ICdwcm9taXNlJztcbiAgICAgICAgICByZXNvbHZlKGNvbmZpZyk7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAnT0snXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnMuYXN5bmMpLnRvQmUoJ3Byb21pc2UnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAxMDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBtdWx0aXBsZSByZXF1ZXN0IGludGVyY2VwdG9ycycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgY29uZmlnLmhlYWRlcnMudGVzdDEgPSAnMSc7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0pO1xuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICBjb25maWcuaGVhZGVycy50ZXN0MiA9ICcyJztcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSk7XG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIGNvbmZpZy5oZWFkZXJzLnRlc3QzID0gJzMnO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9KTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ09LJ1xuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzLnRlc3QxKS50b0JlKCcxJyk7XG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVycy50ZXN0MikudG9CZSgnMicpO1xuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnMudGVzdDMpLnRvQmUoJzMnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhZGQgYSByZXNwb25zZSBpbnRlcmNlcHRvcicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIHJlc3BvbnNlO1xuXG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJyAtIG1vZGlmaWVkIGJ5IGludGVyY2VwdG9yJztcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXNwb25zZSA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ09LJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YSkudG9CZSgnT0sgLSBtb2RpZmllZCBieSBpbnRlcmNlcHRvcicpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhZGQgYSByZXNwb25zZSBpbnRlcmNlcHRvciB0aGF0IHJldHVybnMgYSBuZXcgZGF0YSBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0LCByZXNwb25zZTtcblxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogJ3N0dWZmJ1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmVzcG9uc2UgPSBkYXRhO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmRhdGEpLnRvQmUoJ3N0dWZmJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBhIHJlc3BvbnNlIGludGVyY2VwdG9yIHRoYXQgcmV0dXJucyBhIHByb21pc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0LCByZXNwb25zZTtcblxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAvLyBkbyBzb21ldGhpbmcgYXN5bmNcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGF0YS5kYXRhID0gJ3lvdSBoYXZlIGJlZW4gcHJvbWlzZWQhJztcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LCAxMCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmVzcG9uc2UgPSBkYXRhO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmRhdGEpLnRvQmUoJ3lvdSBoYXZlIGJlZW4gcHJvbWlzZWQhJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWRkIG11bHRpcGxlIHJlc3BvbnNlIGludGVyY2VwdG9ycycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIHJlc3BvbnNlO1xuXG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJzEnO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJzInO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJzMnO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJlc3BvbnNlID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAnT0snXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5kYXRhKS50b0JlKCdPSzEyMycpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyByZW1vdmluZyBpbnRlcmNlcHRvcnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0LCByZXNwb25zZSwgaW50ZXJjZXB0O1xuXG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJzEnO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gICAgaW50ZXJjZXB0ID0gYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJzInO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YS5kYXRhID0gZGF0YS5kYXRhICsgJzMnO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG5cbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZWplY3QoaW50ZXJjZXB0KTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmVzcG9uc2UgPSBkYXRhO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmRhdGEpLnRvQmUoJ09LMTMnKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH0pO1xufSk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy9pbnRlcmNlcHRvcnMuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBheGlvcyA9IHJlcXVpcmUoJy4uLy4uL2luZGV4Jyk7XG5cbmRlc2NyaWJlKCdvcHRpb25zJywgZnVuY3Rpb24gKCkge1xuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXguaW5zdGFsbCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC51bmluc3RhbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZWZhdWx0IG1ldGhvZCB0byBnZXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0Lm1ldGhvZCkudG9CZSgnR0VUJyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWNjZXB0IGhlYWRlcnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0J1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnNbJ1gtUmVxdWVzdGVkLVdpdGgnXSkudG9FcXVhbCgnWE1MSHR0cFJlcXVlc3QnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhY2NlcHQgcGFyYW1zJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIGZvbzogMTIzLFxuICAgICAgICBiYXI6IDQ1NlxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QudXJsKS50b0JlKCcvZm9vP2Zvbz0xMjMmYmFyPTQ1NicpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFsbG93IG92ZXJyaWRpbmcgZGVmYXVsdCBoZWFkZXJzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXB0JzogJ2Zvby9iYXInXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1snQWNjZXB0J10pLnRvRXF1YWwoJ2Zvby9iYXInKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL29wdGlvbnMuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBheGlvcyA9IHJlcXVpcmUoJy4uLy4uL2luZGV4Jyk7XG5cbmRlc2NyaWJlKCdwcm9taXNlJywgZnVuY3Rpb24gKCkge1xuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXguaW5zdGFsbCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC51bmluc3RhbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBwcm92aWRlIHN1Y2NpbmN0IG9iamVjdCB0byB0aGVuJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdCwgcmVzcG9uc2U7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJlc3BvbnNlID0gcjtcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAne1wiaGVsbG9cIjpcIndvcmxkXCJ9J1xuICAgICAgfSk7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QodHlwZW9mIHJlc3BvbnNlKS50b0VxdWFsKCdvYmplY3QnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmRhdGEuaGVsbG8pLnRvRXF1YWwoJ3dvcmxkJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXMpLnRvRXF1YWwoMjAwKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5jb25maWcudXJsKS50b0VxdWFsKCcvZm9vJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByb3ZpZGUgdmVyYm9zZSBhcmd1bWVudHMgdG8gc3VjY2VzcycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIGRhdGEsIHN0YXR1cywgaGVhZGVycywgY29uZmlnO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uIChkLCBzLCBoLCBjKSB7XG4gICAgICBkYXRhID0gZDtcbiAgICAgIHN0YXR1cyA9IHM7XG4gICAgICBoZWFkZXJzID0gaDtcbiAgICAgIGNvbmZpZyA9IGM7XG4gICAgICBmdWxmaWxsZWQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICd7XCJoZWxsb1wiOlwid29ybGRcIn0nXG4gICAgICB9KTtcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChkYXRhLmhlbGxvKS50b0VxdWFsKCd3b3JsZCcpO1xuICAgICAgICBleHBlY3Qoc3RhdHVzKS50b0JlKDIwMCk7XG4gICAgICAgIGV4cGVjdChoZWFkZXJzWydjb250ZW50LXR5cGUnXSkudG9FcXVhbCgnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBleHBlY3QoY29uZmlnLnVybCkudG9FcXVhbCgnL2ZvbycpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IGFsbCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIGZ1bGZpbGxlZCA9IGZhbHNlO1xuXG4gICAgYXhpb3MuYWxsKFt0cnVlLCAxMjNdKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bGZpbGxlZCA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGV4cGVjdChmdWxmaWxsZWQpLnRvRXF1YWwodHJ1ZSk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBzcHJlYWQnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBmdWxmaWxsZWQgPSBmYWxzZTtcblxuICAgIGF4aW9zLmFsbChbMTIzLCA0NTZdKS50aGVuKGF4aW9zLnNwcmVhZChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgc3VtID0gYSArIGI7XG4gICAgICBmdWxmaWxsZWQgPSB0cnVlO1xuICAgIH0pKTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZXhwZWN0KGZ1bGZpbGxlZCkudG9FcXVhbCh0cnVlKTtcbiAgICAgIGV4cGVjdChzdW0pLnRvRXF1YWwoMTIzICsgNDU2KTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3Byb21pc2Uuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBheGlvcyA9IHJlcXVpcmUoJy4uLy4uL2luZGV4Jyk7XG5cbmRlc2NyaWJlKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC5pbnN0YWxsKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgamFzbWluZS5BamF4LnVuaW5zdGFsbCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRyYW5zZm9ybSBKU09OIHRvIHN0cmluZycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBmb286ICdiYXInXG4gICAgfTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5wYXJhbXMpLnRvRXF1YWwoJ3tcImZvb1wiOlwiYmFyXCJ9Jyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgb3ZlcnJpZGUgZGVmYXVsdCB0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgZm9vOiAnYmFyJ1xuICAgIH07XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJyxcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHR5cGVvZiByZXF1ZXN0LnBhcmFtcykudG9FcXVhbCgnb2JqZWN0Jyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWxsb3cgYW4gQXJyYXkgb2YgdHJhbnNmb3JtZXJzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIGZvbzogJ2JhcidcbiAgICB9O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBheGlvcy5kZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0LmNvbmNhdChcbiAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCdiYXInLCAnYmF6Jyk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnBhcmFtcykudG9FcXVhbCgne1wiZm9vXCI6XCJiYXpcIn0nKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbGxvd2luZyBtdXRhdGluZyBoZWFkZXJzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdG9rZW4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygyLCA2NCkpLnRvU3RyaW5nKDM2KTtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogZnVuY3Rpb24gKGRhdGEsIGhlYWRlcnMpIHtcbiAgICAgICAgaGVhZGVyc1snWC1BdXRob3JpemF0aW9uJ10gPSB0b2tlbjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzWydYLUF1dGhvcml6YXRpb24nXSkudG9FcXVhbCh0b2tlbik7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xufSk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy90cmFuc2Zvcm0uc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBheGlvcyA9IHJlcXVpcmUoJy4uLy4uL2luZGV4Jyk7XG5cbmRlc2NyaWJlKCd3cmFwcGVyJywgZnVuY3Rpb24gKCkge1xuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXguaW5zdGFsbCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC51bmluc3RhbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBtYWtlIGFuIGh0dHAgcmVxdWVzdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QudXJsKS50b0JlKCcvZm9vJyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVmYXVsdCBjb21tb24gaGVhZGVycycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGhlYWRlcnMgPSBheGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vbjtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnNba2V5XSkudG9FcXVhbChoZWFkZXJzW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWRkIGV4dHJhIGhlYWRlcnMgZm9yIHBvc3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuICAgIHZhciBoZWFkZXJzID0gYXhpb3MuZGVmYXVsdHMuaGVhZGVycy5jb21tb247XG5cbiAgICBheGlvcyh7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgZGF0YTogJ2Zpeno9YnV6eidcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1trZXldKS50b0VxdWFsKGhlYWRlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB1c2UgYXBwbGljYXRpb24vanNvbiB3aGVuIHBvc3RpbmcgYW4gb2JqZWN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28vYmFyJyxcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgZGF0YToge1xuICAgICAgICBmaXJzdE5hbWU6ICdmb28nLFxuICAgICAgICBsYXN0TmFtZTogJ2JhcidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzWydDb250ZW50LVR5cGUnXSkudG9FcXVhbCgnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBiaW5hcnkgZGF0YSBhcyBhcnJheSBidWZmZXInLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuICAgIHZhciBpbnB1dCA9IG5ldyBJbnQ4QXJyYXkoMik7XG4gICAgaW5wdXRbMF0gPSAxO1xuICAgIGlucHV0WzFdID0gMjtcblxuICAgIGF4aW9zKHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBkYXRhOiBpbnB1dC5idWZmZXJcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHZhciBvdXRwdXQgPSBuZXcgSW50OEFycmF5KHJlcXVlc3QucGFyYW1zLmJ1ZmZlcik7XG4gICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICAgIGV4cGVjdChvdXRwdXRbMF0pLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3Qob3V0cHV0WzFdKS50b0VxdWFsKDIpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgYmluYXJ5IGRhdGEgYXMgYXJyYXkgYnVmZmVyIHZpZXcnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuICAgIHZhciBpbnB1dCA9IG5ldyBJbnQ4QXJyYXkoMik7XG4gICAgaW5wdXRbMF0gPSAxO1xuICAgIGlucHV0WzFdID0gMjtcblxuICAgIGF4aW9zKHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBkYXRhOiBpbnB1dFxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgdmFyIG91dHB1dCA9IG5ldyBJbnQ4QXJyYXkocmVxdWVzdC5wYXJhbXMuYnVmZmVyKTtcbiAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoKS50b0VxdWFsKDIpO1xuICAgICAgZXhwZWN0KG91dHB1dFswXSkudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChvdXRwdXRbMV0pLnRvRXF1YWwoMik7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVtb3ZlIGNvbnRlbnQtdHlwZSBpZiBkYXRhIGlzIGVtcHR5JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzWydjb250ZW50LXR5cGUnXSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBseSBjb3JyZWN0IHJlc3BvbnNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdCwgcmVzcG9uc2U7XG5cbiAgICBheGlvcyh7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICByZXNwb25zZSA9IHJlcztcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAne1wiZm9vXCI6IFwiYmFyXCJ9JyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YS5mb28pLnRvRXF1YWwoJ2JhcicpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2Uuc3RhdHVzKS50b0VxdWFsKDIwMCk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXNUZXh0KS50b0VxdWFsKCdPSycpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuaGVhZGVyc1snY29udGVudC10eXBlJ10pLnRvRXF1YWwoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhcnJheSBidWZmZXIgcmVzcG9uc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0LCByZXNwb25zZTtcblxuICAgIGZ1bmN0aW9uIHN0cjJhYihzdHIpIHtcbiAgICAgIHZhciBidWZmID0gbmV3IEFycmF5QnVmZmVyKHN0ci5sZW5ndGggKiAyKTtcbiAgICAgIHZhciB2aWV3ID0gbmV3IFVpbnQxNkFycmF5KGJ1ZmYpO1xuICAgICAgZm9yICggdmFyIGk9MCwgbD1zdHIubGVuZ3RoOyBpPGw7IGkrKykge1xuICAgICAgICB2aWV3W2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnVmZjtcbiAgICB9XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJyxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJlc3BvbnNlID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2U6IHN0cjJhYignSGVsbG8gd29ybGQnKVxuICAgICAgfSk7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YS5ieXRlTGVuZ3RoKS50b0JlKDIyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3dyYXBwZXIuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDhcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBheGlvcyA9IHJlcXVpcmUoJy4uLy4uL2luZGV4Jyk7XG5cbmRlc2NyaWJlKCd4c3JmJywgZnVuY3Rpb24gKCkge1xuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXguaW5zdGFsbCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGF4aW9zLmRlZmF1bHRzLnhzcmZDb29raWVOYW1lICsgJz07ZXhwaXJlcz0nICsgbmV3IERhdGUoRGF0ZS5ub3coKSAtIDg2NDAwMDAwKS50b0dNVFN0cmluZygpO1xuICAgIGphc21pbmUuQWpheC51bmluc3RhbGwoKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3Qgc2V0IHhzcmYgaGVhZGVyIGlmIGNvb2tpZSBpcyBudWxsJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1theGlvcy5kZWZhdWx0cy54c3JmSGVhZGVyTmFtZV0pLnRvRXF1YWwodW5kZWZpbmVkKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzZXQgeHNyZiBoZWFkZXIgaWYgY29va2llIGlzIHNldCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgZG9jdW1lbnQuY29va2llID0gYXhpb3MuZGVmYXVsdHMueHNyZkNvb2tpZU5hbWUgKyAnPTEyMzQ1JztcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1theGlvcy5kZWZhdWx0cy54c3JmSGVhZGVyTmFtZV0pLnRvRXF1YWwoJzEyMzQ1Jyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xufSk7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy94c3JmLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSA5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgYnVpbGRVcmwgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvaGVscGVycy9idWlsZFVybCcpO1xuXG5kZXNjcmliZSgnaGVscGVyczo6YnVpbGRVcmwnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgc3VwcG9ydCBudWxsIHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoYnVpbGRVcmwoJy9mb28nKSkudG9FcXVhbCgnL2ZvbycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgcGFyYW1zJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChidWlsZFVybCgnL2ZvbycsIHtcbiAgICAgIGZvbzogJ2JhcidcbiAgICB9KSkudG9FcXVhbCgnL2Zvbz9mb289YmFyJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBvYmplY3QgcGFyYW1zJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChidWlsZFVybCgnL2ZvbycsIHtcbiAgICAgIGZvbzoge1xuICAgICAgICBiYXI6ICdiYXonXG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoJy9mb28/Zm9vPScgKyBlbmNvZGVVUkkoJ3tcImJhclwiOlwiYmF6XCJ9JykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgZGF0ZSBwYXJhbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgZXhwZWN0KGJ1aWxkVXJsKCcvZm9vJywge1xuICAgICAgZGF0ZTogZGF0ZVxuICAgIH0pKS50b0VxdWFsKCcvZm9vP2RhdGU9JyArIGRhdGUudG9JU09TdHJpbmcoKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhcnJheSBwYXJhbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KGJ1aWxkVXJsKCcvZm9vJywge1xuICAgICAgZm9vOiBbJ2JhcicsICdiYXonXVxuICAgIH0pKS50b0VxdWFsKCcvZm9vP2Zvbz1iYXImZm9vPWJheicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgc3BlY2lhbCBjaGFyIHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoYnVpbGRVcmwoJy9mb28nLCB7XG4gICAgICBmb286ICdAOiQsICdcbiAgICB9KSkudG9FcXVhbCgnL2Zvbz9mb289QDokLCsnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IGV4aXN0aW5nIHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoYnVpbGRVcmwoJy9mb28/Zm9vPWJhcicsIHtcbiAgICAgIGJhcjogJ2JheidcbiAgICB9KSkudG9FcXVhbCgnL2Zvbz9mb289YmFyJmJhcj1iYXonKTtcbiAgfSk7XG59KTtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy9idWlsZFVybC5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMTBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb29raWVzID0gcmVxdWlyZSgnLi4vLi4vLi4vbGliL2hlbHBlcnMvY29va2llcycpO1xuXG5kZXNjcmliZSgnaGVscGVyczo6Y29va2llcycsIGZ1bmN0aW9uICgpIHtcbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBSZW1vdmUgYWxsIHRoZSBjb29raWVzXG4gICAgdmFyIGV4cGlyZXMgPSBEYXRlLm5vdygpIC0gKDYwICogNjAgKiAyNCAqIDcpO1xuICAgIGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpLm1hcChmdW5jdGlvbiAoY29va2llKSB7XG4gICAgICByZXR1cm4gY29va2llLnNwbGl0KCc9JylbMF07XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArICc9OyBleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHdyaXRlIGNvb2tpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29va2llcy53cml0ZSgnZm9vJywgJ2JheicpO1xuICAgIGV4cGVjdChkb2N1bWVudC5jb29raWUpLnRvRXF1YWwoJ2Zvbz1iYXonKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWFkIGNvb2tpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29va2llcy53cml0ZSgnZm9vJywgJ2FiYycpO1xuICAgIGNvb2tpZXMud3JpdGUoJ2JhcicsICdkZWYnKTtcbiAgICBleHBlY3QoY29va2llcy5yZWFkKCdmb28nKSkudG9FcXVhbCgnYWJjJyk7XG4gICAgZXhwZWN0KGNvb2tpZXMucmVhZCgnYmFyJykpLnRvRXF1YWwoJ2RlZicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlbW92ZSBjb29raWVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvb2tpZXMud3JpdGUoJ2ZvbycsICdiYXInKTtcbiAgICBjb29raWVzLnJlbW92ZSgnZm9vJyk7XG4gICAgZXhwZWN0KGNvb2tpZXMucmVhZCgnZm9vJykpLnRvRXF1YWwobnVsbCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdXJpIGVuY29kZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29va2llcy53cml0ZSgnZm9vJywgJ2JhciBiYXolJyk7XG4gICAgZXhwZWN0KGRvY3VtZW50LmNvb2tpZSkudG9FcXVhbCgnZm9vPWJhciUyMGJheiUyNScpO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy9jb29raWVzLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xuXG5kZXNjcmliZSgnaGVscGVyczo6cGFyc2VIZWFkZXJzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIHBhcnNlIGhlYWRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUhlYWRlcnMoXG4gICAgICAnRGF0ZTogJyArIGRhdGUudG9JU09TdHJpbmcoKSArICdcXG4nICtcbiAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXG4nICtcbiAgICAgICdDb25uZWN0aW9uOiBrZWVwLWFsaXZlXFxuJyArXG4gICAgICAnVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQnXG4gICAgKTtcblxuICAgIGV4cGVjdChwYXJzZWRbJ2RhdGUnXSkudG9FcXVhbChkYXRlLnRvSVNPU3RyaW5nKCkpO1xuICAgIGV4cGVjdChwYXJzZWRbJ2NvbnRlbnQtdHlwZSddKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgZXhwZWN0KHBhcnNlZFsnY29ubmVjdGlvbiddKS50b0VxdWFsKCdrZWVwLWFsaXZlJyk7XG4gICAgZXhwZWN0KHBhcnNlZFsndHJhbnNmZXItZW5jb2RpbmcnXSkudG9FcXVhbCgnY2h1bmtlZCcpO1xuICB9KTtcbn0pO1xuXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy9oZWxwZXJzL3BhcnNlSGVhZGVycy5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMTJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBzcHJlYWQgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvaGVscGVycy9zcHJlYWQnKTtcblxuZGVzY3JpYmUoJ2hlbHBlcnM6OnNwcmVhZCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBzcHJlYWQgYXJyYXkgdG8gYXJndW1lbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IDA7XG4gICAgc3ByZWFkKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YWx1ZSA9IGEgKiBiO1xuICAgIH0pKFs1LCAxMF0pO1xuXG4gICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKDUwKTtcbiAgfSk7XG59KTtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy9zcHJlYWQuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi9oZWxwZXJzL3RyYW5zZm9ybURhdGEnKTtcblxuZGVzY3JpYmUoJ2hlbHBlcnM6OnRyYW5zZm9ybURhdGEnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhIHNpbmdsZSB0cmFuc2Zvcm1lcicsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICBkYXRhID0gdHJhbnNmb3JtRGF0YShkYXRhLCBudWxsLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YSA9ICdmb28nO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG5cbiAgICBleHBlY3QoZGF0YSkudG9FcXVhbCgnZm9vJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhbiBhcnJheSBvZiB0cmFuc2Zvcm1lcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSAnJztcbiAgICBkYXRhID0gdHJhbnNmb3JtRGF0YShkYXRhLCBudWxsLCBbZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGRhdGEgKz0gJ2YnO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGRhdGEgKz0gJ28nO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGRhdGEgKz0gJ28nO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfV0pO1xuXG4gICAgZXhwZWN0KGRhdGEpLnRvRXF1YWwoJ2ZvbycpO1xuICB9KTtcbn0pO1xuXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy9oZWxwZXJzL3RyYW5zZm9ybURhdGEuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdXJsSXNTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi4vLi4vLi4vbGliL2hlbHBlcnMvdXJsSXNTYW1lT3JpZ2luJyk7XG5cbmRlc2NyaWJlKCdoZWxwZXJzOjp1cmxJc1NhbWVPcmlnaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgZGV0ZWN0IHNhbWUgb3JpZ2luJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1cmxJc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYpKS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRldGVjdCBkaWZmZXJlbnQgb3JpZ2luJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1cmxJc1NhbWVPcmlnaW4oJ2h0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zJykpLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy91cmxJc1NhbWVPcmlnaW4uc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscycpLmZvckVhY2g7XG5cbmRlc2NyaWJlKCd1dGlsczo6Zm9yRWFjaCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBsb29wIG92ZXIgYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1bSA9IDA7XG5cbiAgICBmb3JFYWNoKFsxLCAyLCAzLCA0LCA1XSwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgc3VtICs9IHZhbDtcbiAgICB9KTtcblxuICAgIGV4cGVjdChzdW0pLnRvRXF1YWwoMTUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGxvb3Agb3ZlciBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1bSA9IDA7XG5cbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgc3VtICs9IHZhbDtcbiAgICAgIH0pO1xuICAgIH0pKDEsIDIsIDMsIDQsIDUpO1xuXG4gICAgZXhwZWN0KHN1bSkudG9FcXVhbCgxNSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbG9vcCBvdmVyIG9iamVjdCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBrZXlzID0gJyc7XG4gICAgdmFyIHZhbHMgPSAwO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBiOiAxLFxuICAgICAgYTogMixcbiAgICAgIHI6IDNcbiAgICB9O1xuXG4gICAgZm9yRWFjaChvYmosIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICBrZXlzICs9IGs7XG4gICAgICB2YWxzICs9IHY7XG4gICAgfSk7XG5cbiAgICBleHBlY3Qoa2V5cykudG9FcXVhbCgnYmFyJyk7XG4gICAgZXhwZWN0KHZhbHMpLnRvRXF1YWwoNik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCBncmFjZWZ1bGx5JywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBmb3JFYWNoKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuICAgICAgY291bnQrKztcbiAgICB9KTtcblxuICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBtYWtlIGFuIGFycmF5IG91dCBvZiBub24tYXJyYXkgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvdW50ID0gMDtcblxuICAgIGZvckVhY2goZnVuY3Rpb24gKCkge30sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvdW50Kys7XG4gICAgfSk7XG5cbiAgICBleHBlY3QoY291bnQpLnRvRXF1YWwoMSk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL2ZvckVhY2guc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvdXRpbHMnKTtcblxuZGVzY3JpYmUoJ3V0aWxzOjppc1gnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgQXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzQXJyYXkoW10pKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdCh1dGlscy5pc0FycmF5KHtsZW5ndGg6IDV9KSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgQXJyYXlCdWZmZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKSkudG9FcXVhbCh0cnVlKTtcbiAgICBleHBlY3QodXRpbHMuaXNBcnJheUJ1ZmZlcih7fSkpLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIEFycmF5QnVmZmVyVmlldycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigyKSkpKS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIEZvcm1EYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc0Zvcm1EYXRhKG5ldyBGb3JtRGF0YSgpKSkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgLy8gVE9ETyBCbG9iIGlzIG5vdCBhIGNvbnN0cnVjdG9yIGluIFBoYW50b21KU1xuICAvLyBpdCgnc2hvdWxkIHZhbGlkYXRlIEJsb2InLCBmdW5jdGlvbiAoKSB7XG4gIC8vICAgZXhwZWN0KHV0aWxzLmlzQmxvYihuZXcgQmxvYigpKSkudG9FcXVhbCh0cnVlKTtcbiAgLy8gfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBTdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzU3RyaW5nKCcnKSkudG9FcXVhbCh0cnVlKTtcbiAgICBleHBlY3QodXRpbHMuaXNTdHJpbmcoe3RvU3RyaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnJzsgfX0pKS50b0VxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBOdW1iZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzTnVtYmVyKDEyMykpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KHV0aWxzLmlzTnVtYmVyKCcxMjMnKSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgVW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc1VuZGVmaW5lZCgpKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdCh1dGlscy5pc1VuZGVmaW5lZChudWxsKSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc09iamVjdCh7fSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KHV0aWxzLmlzT2JqZWN0KG51bGwpKS50b0VxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBEYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc0RhdGUobmV3IERhdGUoKSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KHV0aWxzLmlzRGF0ZShEYXRlLm5vdygpKSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL2lzWC5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMTdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXJnZSA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscycpLm1lcmdlO1xuXG5kZXNjcmliZSgndXRpbHM6Om1lcmdlJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGJlIGltbXV0YWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IHt9O1xuICAgIHZhciBiID0ge2ZvbzogMTIzfTtcbiAgICB2YXIgYyA9IHtiYXI6IDQ1Nn07XG5cbiAgICBtZXJnZShhLCBiLCBjKTtcblxuICAgIGV4cGVjdCh0eXBlb2YgYS5mb28pLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICAgIGV4cGVjdCh0eXBlb2YgYS5iYXIpLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICAgIGV4cGVjdCh0eXBlb2YgYi5iYXIpLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICAgIGV4cGVjdCh0eXBlb2YgYy5mb28pLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICB9KTtcbiAgXG4gIGl0KCdzaG91bGQgbWVyZ2UgcHJvcGVydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IHtmb286IDEyM307XG4gICAgdmFyIGIgPSB7YmFyOiA0NTZ9O1xuICAgIHZhciBjID0ge2ZvbzogNzg5fTtcbiAgICB2YXIgZCA9IG1lcmdlKGEsIGIsIGMpO1xuXG4gICAgZXhwZWN0KGQuZm9vKS50b0VxdWFsKDc4OSk7XG4gICAgZXhwZWN0KGQuYmFyKS50b0VxdWFsKDQ1Nik7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL21lcmdlLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSAxOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHRyaW0gPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvdXRpbHMnKS50cmltO1xuXG5kZXNjcmliZSgndXRpbHM6OnRyaW0nLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgdHJpbSBzcGFjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHRyaW0oJyAgZm9vICAnKSkudG9FcXVhbCgnZm9vJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdHJpbSB0YWJzJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh0cmltKCdcXHRmb29cXHQnKSkudG9FcXVhbCgnZm9vJyk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL3RyaW0uc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMjBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgUFJPVEVDVElPTl9QUkVGSVggPSAvXlxcKVxcXVxcfScsP1xcbi87XG52YXIgREVGQVVMVF9DT05URU5UX1RZUEUgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiAoZGF0YSwgaGVhZGVycykge1xuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXJWaWV3KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5idWZmZXI7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSAmJiAhdXRpbHMuaXNGaWxlKGRhdGEpICYmICF1dGlscy5pc0Jsb2IoZGF0YSkpIHtcbiAgICAgIC8vIFNldCBhcHBsaWNhdGlvbi9qc29uIGlmIG5vIENvbnRlbnQtVHlwZSBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVycykgJiYgdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZShQUk9URUNUSU9OX1BSRUZJWCwgJycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonXG4gICAgfSxcbiAgICBwYXRjaDogdXRpbHMubWVyZ2UoREVGQVVMVF9DT05URU5UX1RZUEUpLFxuICAgIHBvc3Q6IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKSxcbiAgICBwdXQ6IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKVxuICB9LFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJ1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvZGVmYXVsdHMuanNcbiAqKiBtb2R1bGUgaWQgPSAyMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVcmwodXJsLCBwYXJhbXMpIHtcbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHBhcnRzID0gW107XG5cbiAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhbCA9IFt2YWxdO1xuICAgIH1cblxuICAgIHV0aWxzLmZvckVhY2godmFsLCBmdW5jdGlvbiAodikge1xuICAgICAgaWYgKHV0aWxzLmlzRGF0ZSh2KSkge1xuICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodXRpbHMuaXNPYmplY3QodikpIHtcbiAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaChlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2KSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBwYXJ0cy5qb2luKCcmJyk7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy9idWlsZFVybC5qc1xuICoqIG1vZHVsZSBpZCA9IDIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHdyaXRlOiBmdW5jdGlvbiB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICB2YXIgY29va2llID0gW107XG4gICAgY29va2llLnB1c2gobmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XG4gICAgICBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzU3RyaW5nKHBhdGgpKSB7XG4gICAgICBjb29raWUucHVzaCgncGF0aD0nICsgcGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzU3RyaW5nKGRvbWFpbikpIHtcbiAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG4gICAgfVxuXG4gICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgY29va2llLnB1c2goJ3NlY3VyZScpO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICB9LFxuXG4gIHJlYWQ6IGZ1bmN0aW9uIHJlYWQobmFtZSkge1xuICAgIHZhciBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcbiAgfSxcblxuICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XG4gICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgfVxufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy9jb29raWVzLmpzXG4gKiogbW9kdWxlIGlkID0gMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vKipcbiAqIFBhcnNlIGhlYWRlcnMgaW50byBhbiBvYmplY3RcbiAqXG4gKiBgYGBcbiAqIERhdGU6IFdlZCwgMjcgQXVnIDIwMTQgMDg6NTg6NDkgR01UXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cbiAqIENvbm5lY3Rpb246IGtlZXAtYWxpdmVcbiAqIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVycyBIZWFkZXJzIG5lZWRpbmcgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBhcnNlSGVhZGVycyhoZWFkZXJzKSB7XG4gIHZhciBwYXJzZWQgPSB7fSwga2V5LCB2YWwsIGk7XG5cbiAgaWYgKCFoZWFkZXJzKSB7IHJldHVybiBwYXJzZWQ7IH1cblxuICB1dGlscy5mb3JFYWNoKGhlYWRlcnMuc3BsaXQoJ1xcbicpLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoMCwgaSkpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cihpICsgMSkpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gKGFycikge1xuICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9oZWxwZXJzL3NwcmVhZC5qc1xuICoqIG1vZHVsZSBpZCA9IDI1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEoZGF0YSwgaGVhZGVycywgZm5zKSB7XG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiAoZm4pIHtcbiAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycyk7XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy90cmFuc2Zvcm1EYXRhLmpzXG4gKiogbW9kdWxlIGlkID0gMjZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIG1zaWUgPSAvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xudmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xudmFyIG9yaWdpblVybDtcblxuLyoqXG4gKiBQYXJzZSBhIFVSTCB0byBkaXNjb3ZlciBpdCdzIGNvbXBvbmVudHNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHVybCkge1xuICB2YXIgaHJlZiA9IHVybDtcblxuICBpZiAobXNpZSkge1xuICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcbiAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcbiAgICBocmVmID0gdXJsUGFyc2luZ05vZGUuaHJlZjtcbiAgfVxuXG4gIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuXG4gIC8vIHVybFBhcnNpbmdOb2RlIHByb3ZpZGVzIHRoZSBVcmxVdGlscyBpbnRlcmZhY2UgLSBodHRwOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsdXRpbHNcbiAgcmV0dXJuIHtcbiAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxuICAgIHByb3RvY29sOiB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbCA/IHVybFBhcnNpbmdOb2RlLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpIDogJycsXG4gICAgaG9zdDogdXJsUGFyc2luZ05vZGUuaG9zdCxcbiAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXG4gICAgaGFzaDogdXJsUGFyc2luZ05vZGUuaGFzaCA/IHVybFBhcnNpbmdOb2RlLmhhc2gucmVwbGFjZSgvXiMvLCAnJykgOiAnJyxcbiAgICBob3N0bmFtZTogdXJsUGFyc2luZ05vZGUuaG9zdG5hbWUsXG4gICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcbiAgICBwYXRobmFtZTogKHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSA/XG4gICAgICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWVcbiAgfTtcbn1cblxub3JpZ2luVXJsID0gdXJsUmVzb2x2ZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgVVJMIHNoYXJlcyB0aGUgc2FtZSBvcmlnaW4gYXMgdGhlIGN1cnJlbnQgbG9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcmVxdWVzdFVybCBUaGUgVVJMIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB1cmxJc1NhbWVPcmlnaW4ocmVxdWVzdFVybCkge1xuICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVcmwpKSA/IHVybFJlc29sdmUocmVxdWVzdFVybCkgOiByZXF1ZXN0VXJsO1xuICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVXJsLnByb3RvY29sICYmXG4gICAgICAgIHBhcnNlZC5ob3N0ID09PSBvcmlnaW5VcmwuaG9zdCk7XG59O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9oZWxwZXJzL3VybElzU2FtZU9yaWdpbi5qc1xuICoqIG1vZHVsZSBpZCA9IDI3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbi8qZ2xvYmFsIHRvU3RyaW5nOnRydWUqL1xuXG4vLyB1dGlscyBpcyBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBoZWxwZXIgZnVuY3Rpb25zIG5vbi1zcGVjaWZpYyB0byBheGlvc1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRm9ybURhdGEodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAodmFsLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRGF0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRGF0ZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQmxvYiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQmxvYl0nO1xufVxuXG4vKipcbiAqIFRyaW0gZXhjZXNzIHdoaXRlc3BhY2Ugb2ZmIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJykucmVwbGFjZSgvXFxzKiQvLCAnJyk7XG59XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgb3IgYXJndW1lbnRzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIG9iaiBpcyBhcnJheS1saWtlXG4gIHZhciBpc0FycmF5TGlrZSA9IGlzQXJyYXkob2JqKSB8fCAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIWlzTmFOKG9iai5sZW5ndGgpKTtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmICFpc0FycmF5TGlrZSkge1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICBpZiAoaXNBcnJheUxpa2UpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfVxuICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgZWxzZSB7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLypvYmoxLCBvYmoyLCBvYmozLCAuLi4qLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgZm9yRWFjaChvYmosIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWw7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBcnJheTogaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcbiAgaXNBcnJheUJ1ZmZlclZpZXc6IGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZzogaXNTdHJpbmcsXG4gIGlzTnVtYmVyOiBpc051bWJlcixcbiAgaXNPYmplY3Q6IGlzT2JqZWN0LFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzRGF0ZTogaXNEYXRlLFxuICBpc0ZpbGU6IGlzRmlsZSxcbiAgaXNCbG9iOiBpc0Jsb2IsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIG1lcmdlOiBtZXJnZSxcbiAgdHJpbTogdHJpbVxufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvdXRpbHMuanNcbiAqKiBtb2R1bGUgaWQgPSAyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZGVwcmVjYXRlZE1ldGhvZCA9IHJlcXVpcmUoJy4vaGVscGVycy9kZXByZWNhdGVkTWV0aG9kJyk7XG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gcmVxdWlyZSgnLi9jb3JlL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIEludGVyY2VwdG9yTWFuYWdlciA9IHJlcXVpcmUoJy4vY29yZS9JbnRlcmNlcHRvck1hbmFnZXInKTtcblxuLy8gUG9seWZpbGwgRVM2IFByb21pc2UgaWYgbmVlZGVkXG4oZnVuY3Rpb24gKCkge1xuICAvLyB3ZWJwYWNrIGlzIGJlaW5nIHVzZWQgdG8gc2V0IGVzNi1wcm9taXNlIHRvIHRoZSBuYXRpdmUgUHJvbWlzZVxuICAvLyBmb3IgdGhlIHN0YW5kYWxvbmUgYnVpbGQuIEl0J3MgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBwb2x5ZmlsbCBleGlzdHMuXG4gIHZhciBQID0gcmVxdWlyZSgnZXM2LXByb21pc2UnKTtcbiAgaWYgKFAgJiYgdHlwZW9mIFAucG9seWZpbGwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBQLnBvbHlmaWxsKCk7XG4gIH1cbn0pKCk7XG5cbnZhciBheGlvcyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXhpb3MoY29uZmlnKSB7XG4gIGNvbmZpZyA9IHV0aWxzLm1lcmdlKHtcbiAgICBtZXRob2Q6ICdnZXQnLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3QsXG4gICAgdHJhbnNmb3JtUmVzcG9uc2U6IGRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlXG4gIH0sIGNvbmZpZyk7XG5cbiAgLy8gRG9uJ3QgYWxsb3cgb3ZlcnJpZGluZyBkZWZhdWx0cy53aXRoQ3JlZGVudGlhbHNcbiAgY29uZmlnLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgfHwgZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzO1xuXG4gIC8vIEhvb2sgdXAgaW50ZXJjZXB0b3JzIG1pZGRsZXdhcmVcbiAgdmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcblxuICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgIGNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIGF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmNlcHRvcikge1xuICAgIGNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XG4gIH0pO1xuXG4gIHdoaWxlIChjaGFpbi5sZW5ndGgpIHtcbiAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKGNoYWluLnNoaWZ0KCksIGNoYWluLnNoaWZ0KCkpO1xuICB9XG5cbiAgLy8gUHJvdmlkZSBhbGlhcyBmb3Igc3VjY2Vzc1xuICBwcm9taXNlLnN1Y2Nlc3MgPSBmdW5jdGlvbiBzdWNjZXNzKGZuKSB7XG4gICAgZGVwcmVjYXRlZE1ldGhvZCgnc3VjY2VzcycsICd0aGVuJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNyZXNwb25zZS1hcGknKTtcblxuICAgIHByb21pc2UudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgZm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5jb25maWcpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xuXG4gIC8vIFByb3ZpZGUgYWxpYXMgZm9yIGVycm9yXG4gIHByb21pc2UuZXJyb3IgPSBmdW5jdGlvbiBlcnJvcihmbikge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ2Vycm9yJywgJ2NhdGNoJywgJ2h0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNyZXNwb25zZS1hcGknKTtcblxuICAgIHByb21pc2UudGhlbihudWxsLCBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgZm4ocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLCByZXNwb25zZS5jb25maWcpO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuLy8gRXhwb3NlIGRlZmF1bHRzXG5heGlvcy5kZWZhdWx0cyA9IGRlZmF1bHRzO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG4vLyBFeHBvc2UgaW50ZXJjZXB0b3JzXG5heGlvcy5pbnRlcmNlcHRvcnMgPSB7XG4gIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG4oZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBjcmVhdGVTaG9ydE1ldGhvZHMoKSB7XG4gICAgdXRpbHMuZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIGF4aW9zW21ldGhvZF0gPSBmdW5jdGlvbiAodXJsLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIGF4aW9zKHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgIHVybDogdXJsXG4gICAgICAgIH0pKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaG9ydE1ldGhvZHNXaXRoRGF0YSgpIHtcbiAgICB1dGlscy5mb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgYXhpb3NbbWV0aG9kXSA9IGZ1bmN0aW9uICh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgICByZXR1cm4gYXhpb3ModXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlU2hvcnRNZXRob2RzKCdkZWxldGUnLCAnZ2V0JywgJ2hlYWQnKTtcbiAgY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEoJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJyk7XG59KSgpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9heGlvcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3VwcGx5IGEgd2FybmluZyB0byB0aGUgZGV2ZWxvcGVyIHRoYXQgYSBtZXRob2QgdGhleSBhcmUgdXNpbmdcbiAqIGhhcyBiZWVuIGRlcHJlY2F0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBUaGUgbmFtZSBvZiB0aGUgZGVwcmVjYXRlZCBtZXRob2RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaW5zdGVhZF0gVGhlIGFsdGVybmF0ZSBtZXRob2QgdG8gdXNlIGlmIGFwcGxpY2FibGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZG9jc10gVGhlIGRvY3VtZW50YXRpb24gVVJMIHRvIGdldCBmdXJ0aGVyIGRldGFpbHNcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZXByZWNhdGVkTWV0aG9kKG1ldGhvZCwgaW5zdGVhZCwgZG9jcykge1xuICB0cnkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdERVBSRUNBVEVEIG1ldGhvZCBgJyArIG1ldGhvZCArICdgLicgK1xuICAgICAgKGluc3RlYWQgPyAnIFVzZSBgJyArIGluc3RlYWQgKyAnYCBpbnN0ZWFkLicgOiAnJykgK1xuICAgICAgJyBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4nKTtcblxuICAgIGlmIChkb2NzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzYWdlIHNlZSAnICsgZG9jcyk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7fVxufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy9kZXByZWNhdGVkTWV0aG9kLmpzXG4gKiogbW9kdWxlIGlkID0gMzBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB3aGljaGV2ZXIgYWRhcHRlclxuICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBGb3IgYnJvd3NlcnMgdXNlIFhIUiBhZGFwdGVyXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVxdWlyZSgnLi4vYWRhcHRlcnMveGhyJykocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpO1xuICAgICAgfVxuICAgICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxuICAgICAgZWxzZSBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlcXVpcmUoJy4uL2FkYXB0ZXJzL2h0dHAnKShyZXNvbHZlLCByZWplY3QsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVqZWN0KGUpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzXG4gKiogbW9kdWxlIGlkID0gMzFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIChpZCkge1xuICBpZiAodGhpcy5oYW5kbGVyc1tpZF0pIHtcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGByZW1vdmVgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChmbikge1xuICB1dGlscy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsIGZ1bmN0aW9uIChoKSB7XG4gICAgaWYgKGggIT09IG51bGwpIHtcbiAgICAgIGZuKGgpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvY29yZS9JbnRlcmNlcHRvck1hbmFnZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAzMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmdsb2JhbCBBY3RpdmVYT2JqZWN0OnRydWUqL1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLy4uL2RlZmF1bHRzJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVcmwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVcmwnKTtcbnZhciBjb29raWVzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2Nvb2tpZXMnKTtcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvcGFyc2VIZWFkZXJzJyk7XG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy90cmFuc2Zvcm1EYXRhJyk7XG52YXIgdXJsSXNTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3VybElzU2FtZU9yaWdpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHhockFkYXB0ZXIocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpIHtcbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICB2YXIgZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgY29uZmlnLmRhdGEsXG4gICAgY29uZmlnLmhlYWRlcnMsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICAvLyBNZXJnZSBoZWFkZXJzXG4gIHZhciByZXF1ZXN0SGVhZGVycyA9IHV0aWxzLm1lcmdlKFxuICAgIGRlZmF1bHRzLmhlYWRlcnMuY29tbW9uLFxuICAgIGRlZmF1bHRzLmhlYWRlcnNbY29uZmlnLm1ldGhvZF0gfHwge30sXG4gICAgY29uZmlnLmhlYWRlcnMgfHwge31cbiAgKTtcblxuICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSkge1xuICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1snQ29udGVudC1UeXBlJ107IC8vIExldCB0aGUgYnJvd3NlciBzZXQgaXRcbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgcmVxdWVzdFxuICB2YXIgcmVxdWVzdCA9IG5ldyAoWE1MSHR0cFJlcXVlc3QgfHwgQWN0aXZlWE9iamVjdCkoJ01pY3Jvc29mdC5YTUxIVFRQJyk7XG4gIHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVXJsKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMpLCB0cnVlKTtcblxuICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlXG4gIHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIHZhciByZXNwb25zZUhlYWRlcnMgPSBwYXJzZUhlYWRlcnMocmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gWyd0ZXh0JywgJyddLmluZGV4T2YoY29uZmlnLnJlc3BvbnNlVHlwZSB8fCAnJykgIT09IC0xID8gcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiB0cmFuc2Zvcm1EYXRhKFxuICAgICAgICAgIHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICksXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzb2x2ZSBvciByZWplY3QgdGhlIFByb21pc2UgYmFzZWQgb24gdGhlIHN0YXR1c1xuICAgICAgKHJlcXVlc3Quc3RhdHVzID49IDIwMCAmJiByZXF1ZXN0LnN0YXR1cyA8IDMwMCA/XG4gICAgICAgIHJlc29sdmUgOlxuICAgICAgICByZWplY3QpKHJlc3BvbnNlKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICB2YXIgeHNyZlZhbHVlID0gdXJsSXNTYW1lT3JpZ2luKGNvbmZpZy51cmwpID9cbiAgICAgIGNvb2tpZXMucmVhZChjb25maWcueHNyZkNvb2tpZU5hbWUgfHwgZGVmYXVsdHMueHNyZkNvb2tpZU5hbWUpIDpcbiAgICAgIHVuZGVmaW5lZDtcbiAgaWYgKHhzcmZWYWx1ZSkge1xuICAgIHJlcXVlc3RIZWFkZXJzW2NvbmZpZy54c3JmSGVhZGVyTmFtZSB8fCBkZWZhdWx0cy54c3JmSGVhZGVyTmFtZV0gPSB4c3JmVmFsdWU7XG4gIH1cblxuICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxuICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXG4gICAgaWYgKCFkYXRhICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgZGVsZXRlIHJlcXVlc3RIZWFkZXJzW2tleV07XG4gICAgfVxuICAgIC8vIE90aGVyd2lzZSBhZGQgaGVhZGVyIHRvIHRoZSByZXF1ZXN0XG4gICAgZWxzZSB7XG4gICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICBpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscykge1xuICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChyZXF1ZXN0LnJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkpIHtcbiAgICBkYXRhID0gbmV3IERhdGFWaWV3KGRhdGEpO1xuICB9XG5cbiAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICByZXF1ZXN0LnNlbmQoZGF0YSk7XG59O1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9hZGFwdGVycy94aHIuanNcbiAqKiBtb2R1bGUgaWQgPSAzM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyohXG4gKiBAb3ZlcnZpZXcgZXM2LXByb21pc2UgLSBhIHRpbnkgaW1wbGVtZW50YXRpb24gb2YgUHJvbWlzZXMvQSsuXG4gKiBAY29weXJpZ2h0IENvcHlyaWdodCAoYykgMjAxNCBZZWh1ZGEgS2F0eiwgVG9tIERhbGUsIFN0ZWZhbiBQZW5uZXIgYW5kIGNvbnRyaWJ1dG9ycyAoQ29udmVyc2lvbiB0byBFUzYgQVBJIGJ5IEpha2UgQXJjaGliYWxkKVxuICogQGxpY2Vuc2UgICBMaWNlbnNlZCB1bmRlciBNSVQgbGljZW5zZVxuICogICAgICAgICAgICBTZWUgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2pha2VhcmNoaWJhbGQvZXM2LXByb21pc2UvbWFzdGVyL0xJQ0VOU0VcbiAqIEB2ZXJzaW9uICAgMi4wLjFcbiAqL1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBmdW5jdGlvbiAkJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJyB8fCAodHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkdXRpbHMkJGlzRnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZSh4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnICYmIHggIT09IG51bGw7XG4gICAgfVxuXG4gICAgdmFyICQkdXRpbHMkJF9pc0FycmF5O1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KSB7XG4gICAgICAkJHV0aWxzJCRfaXNBcnJheSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAkJHV0aWxzJCRfaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG4gICAgfVxuXG4gICAgdmFyICQkdXRpbHMkJGlzQXJyYXkgPSAkJHV0aWxzJCRfaXNBcnJheTtcbiAgICB2YXIgJCR1dGlscyQkbm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfTtcbiAgICBmdW5jdGlvbiAkJHV0aWxzJCRGKCkgeyB9XG5cbiAgICB2YXIgJCR1dGlscyQkb19jcmVhdGUgPSAoT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAobykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2Vjb25kIGFyZ3VtZW50IG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH1cbiAgICAgICQkdXRpbHMkJEYucHJvdG90eXBlID0gbztcbiAgICAgIHJldHVybiBuZXcgJCR1dGlscyQkRigpO1xuICAgIH0pO1xuXG4gICAgdmFyICQkYXNhcCQkbGVuID0gMDtcblxuICAgIHZhciAkJGFzYXAkJGRlZmF1bHQgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgICAgICQkYXNhcCQkcXVldWVbJCRhc2FwJCRsZW5dID0gY2FsbGJhY2s7XG4gICAgICAkJGFzYXAkJHF1ZXVlWyQkYXNhcCQkbGVuICsgMV0gPSBhcmc7XG4gICAgICAkJGFzYXAkJGxlbiArPSAyO1xuICAgICAgaWYgKCQkYXNhcCQkbGVuID09PSAyKSB7XG4gICAgICAgIC8vIElmIGxlbiBpcyAxLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBzY2hlZHVsZSBhbiBhc3luYyBmbHVzaC5cbiAgICAgICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAgICAgLy8gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBmbHVzaCB0aGF0IHdlIGFyZSBzY2hlZHVsaW5nLlxuICAgICAgICAkJGFzYXAkJHNjaGVkdWxlRmx1c2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyICQkYXNhcCQkYnJvd3Nlckdsb2JhbCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgPyB3aW5kb3cgOiB7fTtcbiAgICB2YXIgJCRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9ICQkYXNhcCQkYnJvd3Nlckdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8ICQkYXNhcCQkYnJvd3Nlckdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgLy8gdGVzdCBmb3Igd2ViIHdvcmtlciBidXQgbm90IGluIElFMTBcbiAgICB2YXIgJCRhc2FwJCRpc1dvcmtlciA9IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJztcblxuICAgIC8vIG5vZGVcbiAgICBmdW5jdGlvbiAkJGFzYXAkJHVzZU5leHRUaWNrKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCQkYXNhcCQkZmx1c2gpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJGFzYXAkJHVzZU11dGF0aW9uT2JzZXJ2ZXIoKSB7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgJCRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcigkJGFzYXAkJGZsdXNoKTtcbiAgICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgbm9kZS5kYXRhID0gKGl0ZXJhdGlvbnMgPSArK2l0ZXJhdGlvbnMgJSAyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gd2ViIHdvcmtlclxuICAgIGZ1bmN0aW9uICQkYXNhcCQkdXNlTWVzc2FnZUNoYW5uZWwoKSB7XG4gICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSAkJGFzYXAkJGZsdXNoO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCRhc2FwJCR1c2VTZXRUaW1lb3V0KCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCQkYXNhcCQkZmx1c2gsIDEpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgJCRhc2FwJCRxdWV1ZSA9IG5ldyBBcnJheSgxMDAwKTtcblxuICAgIGZ1bmN0aW9uICQkYXNhcCQkZmx1c2goKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQkYXNhcCQkbGVuOyBpKz0yKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9ICQkYXNhcCQkcXVldWVbaV07XG4gICAgICAgIHZhciBhcmcgPSAkJGFzYXAkJHF1ZXVlW2krMV07XG5cbiAgICAgICAgY2FsbGJhY2soYXJnKTtcblxuICAgICAgICAkJGFzYXAkJHF1ZXVlW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICAkJGFzYXAkJHF1ZXVlW2krMV0gPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgICQkYXNhcCQkbGVuID0gMDtcbiAgICB9XG5cbiAgICB2YXIgJCRhc2FwJCRzY2hlZHVsZUZsdXNoO1xuXG4gICAgLy8gRGVjaWRlIHdoYXQgYXN5bmMgbWV0aG9kIHRvIHVzZSB0byB0cmlnZ2VyaW5nIHByb2Nlc3Npbmcgb2YgcXVldWVkIGNhbGxiYWNrczpcbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgICAgJCRhc2FwJCRzY2hlZHVsZUZsdXNoID0gJCRhc2FwJCR1c2VOZXh0VGljaygpO1xuICAgIH0gZWxzZSBpZiAoJCRhc2FwJCRCcm93c2VyTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgJCRhc2FwJCRzY2hlZHVsZUZsdXNoID0gJCRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCk7XG4gICAgfSBlbHNlIGlmICgkJGFzYXAkJGlzV29ya2VyKSB7XG4gICAgICAkJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSAkJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQkYXNhcCQkc2NoZWR1bGVGbHVzaCA9ICQkYXNhcCQkdXNlU2V0VGltZW91dCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRub29wKCkge31cbiAgICB2YXIgJCQkaW50ZXJuYWwkJFBFTkRJTkcgICA9IHZvaWQgMDtcbiAgICB2YXIgJCQkaW50ZXJuYWwkJEZVTEZJTExFRCA9IDE7XG4gICAgdmFyICQkJGludGVybmFsJCRSRUpFQ1RFRCAgPSAyO1xuICAgIHZhciAkJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IgPSBuZXcgJCQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IGNhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZlwiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkge1xuICAgICAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4nKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRnZXRUaGVuKHByb21pc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW47XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICQkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgICAgICByZXR1cm4gJCQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCR0cnlUaGVuKHRoZW4sIHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuKSB7XG4gICAgICAgJCRhc2FwJCRkZWZhdWx0KGZ1bmN0aW9uKHByb21pc2UpIHtcbiAgICAgICAgdmFyIHNlYWxlZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZXJyb3IgPSAkJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB0aGVuYWJsZSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoZW5hYmxlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgJCQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBpZiAoc2VhbGVkKSB7IHJldHVybjsgfVxuICAgICAgICAgIHNlYWxlZCA9IHRydWU7XG5cbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0sICdTZXR0bGU6ICcgKyAocHJvbWlzZS5fbGFiZWwgfHwgJyB1bmtub3duIHByb21pc2UnKSk7XG5cbiAgICAgICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgdGhlbmFibGUpIHtcbiAgICAgIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09ICQkJGludGVybmFsJCRGVUxGSUxMRUQpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2UgaWYgKHByb21pc2UuX3N0YXRlID09PSAkJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQkJGludGVybmFsJCRzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSkge1xuICAgICAgaWYgKG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IgPT09IHByb21pc2UuY29uc3RydWN0b3IpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRoZW4gPSAkJCRpbnRlcm5hbCQkZ2V0VGhlbihtYXliZVRoZW5hYmxlKTtcblxuICAgICAgICBpZiAodGhlbiA9PT0gJCQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCAkJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICQkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9IGVsc2UgaWYgKCQkdXRpbHMkJGlzRnVuY3Rpb24odGhlbikpIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpIHtcbiAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsICQkJGludGVybmFsJCRzZWxmRnVsbGZpbGxtZW50KCkpO1xuICAgICAgfSBlbHNlIGlmICgkJHV0aWxzJCRvYmplY3RPckZ1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkaGFuZGxlTWF5YmVUaGVuYWJsZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJHB1Ymxpc2hSZWplY3Rpb24ocHJvbWlzZSkge1xuICAgICAgaWYgKHByb21pc2UuX29uZXJyb3IpIHtcbiAgICAgICAgcHJvbWlzZS5fb25lcnJvcihwcm9taXNlLl9yZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICAkJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSAkJCRpbnRlcm5hbCQkUEVORElORykgeyByZXR1cm47IH1cblxuICAgICAgcHJvbWlzZS5fcmVzdWx0ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9ICQkJGludGVybmFsJCRGVUxGSUxMRUQ7XG5cbiAgICAgIGlmIChwcm9taXNlLl9zdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQkYXNhcCQkZGVmYXVsdCgkJCRpbnRlcm5hbCQkcHVibGlzaCwgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gJCQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG4gICAgICBwcm9taXNlLl9zdGF0ZSA9ICQkJGludGVybmFsJCRSRUpFQ1RFRDtcbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHJlYXNvbjtcblxuICAgICAgJCRhc2FwJCRkZWZhdWx0KCQkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uLCBwcm9taXNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHBhcmVudCwgY2hpbGQsIG9uRnVsZmlsbG1lbnQsIG9uUmVqZWN0aW9uKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwYXJlbnQuX3N1YnNjcmliZXJzO1xuICAgICAgdmFyIGxlbmd0aCA9IHN1YnNjcmliZXJzLmxlbmd0aDtcblxuICAgICAgcGFyZW50Ll9vbmVycm9yID0gbnVsbDtcblxuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoXSA9IGNoaWxkO1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgJCQkaW50ZXJuYWwkJEZVTEZJTExFRF0gPSBvbkZ1bGZpbGxtZW50O1xuICAgICAgc3Vic2NyaWJlcnNbbGVuZ3RoICsgJCQkaW50ZXJuYWwkJFJFSkVDVEVEXSAgPSBvblJlamVjdGlvbjtcblxuICAgICAgaWYgKGxlbmd0aCA9PT0gMCAmJiBwYXJlbnQuX3N0YXRlKSB7XG4gICAgICAgICQkYXNhcCQkZGVmYXVsdCgkJCRpbnRlcm5hbCQkcHVibGlzaCwgcGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkcHVibGlzaChwcm9taXNlKSB7XG4gICAgICB2YXIgc3Vic2NyaWJlcnMgPSBwcm9taXNlLl9zdWJzY3JpYmVycztcbiAgICAgIHZhciBzZXR0bGVkID0gcHJvbWlzZS5fc3RhdGU7XG5cbiAgICAgIGlmIChzdWJzY3JpYmVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICAgIHZhciBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCA9IHByb21pc2UuX3Jlc3VsdDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJzY3JpYmVycy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBjaGlsZCA9IHN1YnNjcmliZXJzW2ldO1xuICAgICAgICBjYWxsYmFjayA9IHN1YnNjcmliZXJzW2kgKyBzZXR0bGVkXTtcblxuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkaW52b2tlQ2FsbGJhY2soc2V0dGxlZCwgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKSB7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgJCQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUiA9IG5ldyAkJCRpbnRlcm5hbCQkRXJyb3JPYmplY3QoKTtcblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZGV0YWlsKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SLmVycm9yID0gZTtcbiAgICAgICAgcmV0dXJuICQkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgICAgIHZhciBoYXNDYWxsYmFjayA9ICQkdXRpbHMkJGlzRnVuY3Rpb24oY2FsbGJhY2spLFxuICAgICAgICAgIHZhbHVlLCBlcnJvciwgc3VjY2VlZGVkLCBmYWlsZWQ7XG5cbiAgICAgIGlmIChoYXNDYWxsYmFjaykge1xuICAgICAgICB2YWx1ZSA9ICQkJGludGVybmFsJCR0cnlDYXRjaChjYWxsYmFjaywgZGV0YWlsKTtcblxuICAgICAgICBpZiAodmFsdWUgPT09ICQkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IpIHtcbiAgICAgICAgICBmYWlsZWQgPSB0cnVlO1xuICAgICAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsICQkJGludGVybmFsJCRjYW5ub3RSZXR1cm5Pd24oKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZGV0YWlsO1xuICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09ICQkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICAgIH0gZWxzZSBpZiAoaGFzQ2FsbGJhY2sgJiYgc3VjY2VlZGVkKSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZmFpbGVkKSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmIChzZXR0bGVkID09PSAkJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgICQkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gJCQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRpbml0aWFsaXplUHJvbWlzZShwcm9taXNlLCByZXNvbHZlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzb2x2ZXIoZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UodmFsdWUpe1xuICAgICAgICAgICQkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShyZWFzb24pIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkZW51bWVyYXRvciQkbWFrZVNldHRsZWRSZXN1bHQoc3RhdGUsIHBvc2l0aW9uLCB2YWx1ZSkge1xuICAgICAgaWYgKHN0YXRlID09PSAkJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdGU6ICdmdWxmaWxsZWQnLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0ZTogJ3JlamVjdGVkJyxcbiAgICAgICAgICByZWFzb246IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkZW51bWVyYXRvciQkRW51bWVyYXRvcihDb25zdHJ1Y3RvciwgaW5wdXQsIGFib3J0T25SZWplY3QsIGxhYmVsKSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgICB0aGlzLnByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IoJCQkaW50ZXJuYWwkJG5vb3AsIGxhYmVsKTtcbiAgICAgIHRoaXMuX2Fib3J0T25SZWplY3QgPSBhYm9ydE9uUmVqZWN0O1xuXG4gICAgICBpZiAodGhpcy5fdmFsaWRhdGVJbnB1dChpbnB1dCkpIHtcbiAgICAgICAgdGhpcy5faW5wdXQgICAgID0gaW5wdXQ7XG4gICAgICAgIHRoaXMubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nID0gaW5wdXQubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMuX2luaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAwO1xuICAgICAgICAgIHRoaXMuX2VudW1lcmF0ZSgpO1xuICAgICAgICAgIGlmICh0aGlzLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgICAgICQkJGludGVybmFsJCRmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZWplY3QodGhpcy5wcm9taXNlLCB0aGlzLl92YWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJCQkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlSW5wdXQgPSBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgcmV0dXJuICQkdXRpbHMkJGlzQXJyYXkoaW5wdXQpO1xuICAgIH07XG5cbiAgICAkJCRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fdmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbiAgICB9O1xuXG4gICAgJCQkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgfTtcblxuICAgIHZhciAkJCRlbnVtZXJhdG9yJCRkZWZhdWx0ID0gJCQkZW51bWVyYXRvciQkRW51bWVyYXRvcjtcblxuICAgICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lbnVtZXJhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsZW5ndGggID0gdGhpcy5sZW5ndGg7XG4gICAgICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZTtcbiAgICAgIHZhciBpbnB1dCAgID0gdGhpcy5faW5wdXQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gJCQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX2VhY2hFbnRyeShpbnB1dFtpXSwgaSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbihlbnRyeSwgaSkge1xuICAgICAgdmFyIGMgPSB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuICAgICAgaWYgKCQkdXRpbHMkJGlzTWF5YmVUaGVuYWJsZShlbnRyeSkpIHtcbiAgICAgICAgaWYgKGVudHJ5LmNvbnN0cnVjdG9yID09PSBjICYmIGVudHJ5Ll9zdGF0ZSAhPT0gJCQkaW50ZXJuYWwkJFBFTkRJTkcpIHtcbiAgICAgICAgICBlbnRyeS5fb25lcnJvciA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fc2V0dGxlZEF0KGVudHJ5Ll9zdGF0ZSwgaSwgZW50cnkuX3Jlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KGMucmVzb2x2ZShlbnRyeSksIGkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZW1haW5pbmctLTtcbiAgICAgICAgdGhpcy5fcmVzdWx0W2ldID0gdGhpcy5fbWFrZVJlc3VsdCgkJCRpbnRlcm5hbCQkRlVMRklMTEVELCBpLCBlbnRyeSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbihzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgICAgIHZhciBwcm9taXNlID0gdGhpcy5wcm9taXNlO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09ICQkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuXG4gICAgICAgIGlmICh0aGlzLl9hYm9ydE9uUmVqZWN0ICYmIHN0YXRlID09PSAkJCRpbnRlcm5hbCQkUkVKRUNURUQpIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9yZXN1bHRbaV0gPSB0aGlzLl9tYWtlUmVzdWx0KHN0YXRlLCBpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAkJCRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fbWFrZVJlc3VsdCA9IGZ1bmN0aW9uKHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG5cbiAgICAkJCRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0ID0gZnVuY3Rpb24ocHJvbWlzZSwgaSkge1xuICAgICAgdmFyIGVudW1lcmF0b3IgPSB0aGlzO1xuXG4gICAgICAkJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHByb21pc2UsIHVuZGVmaW5lZCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KCQkJGludGVybmFsJCRGVUxGSUxMRUQsIGksIHZhbHVlKTtcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoJCQkaW50ZXJuYWwkJFJFSkVDVEVELCBpLCByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciAkJHByb21pc2UkYWxsJCRkZWZhdWx0ID0gZnVuY3Rpb24gYWxsKGVudHJpZXMsIGxhYmVsKSB7XG4gICAgICByZXR1cm4gbmV3ICQkJGVudW1lcmF0b3IkJGRlZmF1bHQodGhpcywgZW50cmllcywgdHJ1ZSAvKiBhYm9ydCBvbiByZWplY3QgKi8sIGxhYmVsKS5wcm9taXNlO1xuICAgIH07XG5cbiAgICB2YXIgJCRwcm9taXNlJHJhY2UkJGRlZmF1bHQgPSBmdW5jdGlvbiByYWNlKGVudHJpZXMsIGxhYmVsKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IoJCQkaW50ZXJuYWwkJG5vb3AsIGxhYmVsKTtcblxuICAgICAgaWYgKCEkJHV0aWxzJCRpc0FycmF5KGVudHJpZXMpKSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgZnVuY3Rpb24gb25GdWxmaWxsbWVudCh2YWx1ZSkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0aW9uKHJlYXNvbikge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBwcm9taXNlLl9zdGF0ZSA9PT0gJCQkaW50ZXJuYWwkJFBFTkRJTkcgJiYgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICQkJGludGVybmFsJCRzdWJzY3JpYmUoQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKSwgdW5kZWZpbmVkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICB2YXIgJCRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQgPSBmdW5jdGlvbiByZXNvbHZlKG9iamVjdCwgbGFiZWwpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuXG4gICAgICBpZiAob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gQ29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IoJCQkaW50ZXJuYWwkJG5vb3AsIGxhYmVsKTtcbiAgICAgICQkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIG9iamVjdCk7XG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgdmFyICQkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQgPSBmdW5jdGlvbiByZWplY3QocmVhc29uLCBsYWJlbCkge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3RvcigkJCRpbnRlcm5hbCQkbm9vcCwgbGFiZWwpO1xuICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHZhciAkJGVzNiRwcm9taXNlJHByb21pc2UkJGNvdW50ZXIgPSAwO1xuXG4gICAgZnVuY3Rpb24gJCRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc1Jlc29sdmVyKCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNOZXcoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUHJvbWlzZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cblxuICAgIHZhciAkJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQgPSAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2U7XG5cbiAgICAvKipcbiAgICAgIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgICAgIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsIHdoaWNoXG4gICAgICByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZeKAmXMgZXZlbnR1YWwgdmFsdWUgb3IgdGhlIHJlYXNvblxuICAgICAgd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIFRlcm1pbm9sb2d5XG4gICAgICAtLS0tLS0tLS0tLVxuXG4gICAgICAtIGBwcm9taXNlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gd2l0aCBhIGB0aGVuYCBtZXRob2Qgd2hvc2UgYmVoYXZpb3IgY29uZm9ybXMgdG8gdGhpcyBzcGVjaWZpY2F0aW9uLlxuICAgICAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAgICAgLSBgdmFsdWVgIGlzIGFueSBsZWdhbCBKYXZhU2NyaXB0IHZhbHVlIChpbmNsdWRpbmcgdW5kZWZpbmVkLCBhIHRoZW5hYmxlLCBvciBhIHByb21pc2UpLlxuICAgICAgLSBgZXhjZXB0aW9uYCBpcyBhIHZhbHVlIHRoYXQgaXMgdGhyb3duIHVzaW5nIHRoZSB0aHJvdyBzdGF0ZW1lbnQuXG4gICAgICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gICAgICAtIGBzZXR0bGVkYCB0aGUgZmluYWwgcmVzdGluZyBzdGF0ZSBvZiBhIHByb21pc2UsIGZ1bGZpbGxlZCBvciByZWplY3RlZC5cblxuICAgICAgQSBwcm9taXNlIGNhbiBiZSBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOiBwZW5kaW5nLCBmdWxmaWxsZWQsIG9yIHJlamVjdGVkLlxuXG4gICAgICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICAgICAgc3RhdGUuICBQcm9taXNlcyB0aGF0IGFyZSByZWplY3RlZCBoYXZlIGEgcmVqZWN0aW9uIHJlYXNvbiBhbmQgYXJlIGluIHRoZVxuICAgICAgcmVqZWN0ZWQgc3RhdGUuICBBIGZ1bGZpbGxtZW50IHZhbHVlIGlzIG5ldmVyIGEgdGhlbmFibGUuXG5cbiAgICAgIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICAgICAgcHJvbWlzZSwgdGhlbiB0aGUgb3JpZ2luYWwgcHJvbWlzZSdzIHNldHRsZWQgc3RhdGUgd2lsbCBtYXRjaCB0aGUgdmFsdWUnc1xuICAgICAgc2V0dGxlZCBzdGF0ZS4gIFNvIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgcmVqZWN0cyB3aWxsXG4gICAgICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gICAgICBpdHNlbGYgZnVsZmlsbC5cblxuXG4gICAgICBCYXNpYyBVc2FnZTpcbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBgYGBqc1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgLy8gb24gc3VjY2Vzc1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcblxuICAgICAgICAvLyBvbiBmYWlsdXJlXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfSk7XG5cbiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS0tLS1cblxuICAgICAgUHJvbWlzZXMgc2hpbmUgd2hlbiBhYnN0cmFjdGluZyBhd2F5IGFzeW5jaHJvbm91cyBpbnRlcmFjdGlvbnMgc3VjaCBhc1xuICAgICAgYFhNTEh0dHBSZXF1ZXN0YHMuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmdW5jdGlvbiBnZXRKU09OKHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gaGFuZGxlcjtcbiAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICAgIHhoci5zZW5kKCk7XG5cbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdnZXRKU09OOiBgJyArIHVybCArICdgIGZhaWxlZCB3aXRoIHN0YXR1czogWycgKyB0aGlzLnN0YXR1cyArICddJykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGdldEpTT04oJy9wb3N0cy5qc29uJykudGhlbihmdW5jdGlvbihqc29uKSB7XG4gICAgICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgLy8gb24gcmVqZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBVbmxpa2UgY2FsbGJhY2tzLCBwcm9taXNlcyBhcmUgZ3JlYXQgY29tcG9zYWJsZSBwcmltaXRpdmVzLlxuXG4gICAgICBgYGBqc1xuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZXRKU09OKCcvcG9zdHMnKSxcbiAgICAgICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgICAgIF0pLnRoZW4oZnVuY3Rpb24odmFsdWVzKXtcbiAgICAgICAgdmFsdWVzWzBdIC8vID0+IHBvc3RzSlNPTlxuICAgICAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBjbGFzcyBQcm9taXNlXG4gICAgICBAcGFyYW0ge2Z1bmN0aW9ufSByZXNvbHZlclxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQGNvbnN0cnVjdG9yXG4gICAgKi9cbiAgICBmdW5jdGlvbiAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICAgIHRoaXMuX2lkID0gJCRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyKys7XG4gICAgICB0aGlzLl9zdGF0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Jlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N1YnNjcmliZXJzID0gW107XG5cbiAgICAgIGlmICgkJCRpbnRlcm5hbCQkbm9vcCAhPT0gcmVzb2x2ZXIpIHtcbiAgICAgICAgaWYgKCEkJHV0aWxzJCRpc0Z1bmN0aW9uKHJlc29sdmVyKSkge1xuICAgICAgICAgICQkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mICQkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSkpIHtcbiAgICAgICAgICAkJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICAkJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgICQkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5hbGwgPSAkJHByb21pc2UkYWxsJCRkZWZhdWx0O1xuICAgICQkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yYWNlID0gJCRwcm9taXNlJHJhY2UkJGRlZmF1bHQ7XG4gICAgJCRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlc29sdmUgPSAkJHByb21pc2UkcmVzb2x2ZSQkZGVmYXVsdDtcbiAgICAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmVqZWN0ID0gJCRwcm9taXNlJHJlamVjdCQkZGVmYXVsdDtcblxuICAgICQkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5wcm90b3R5cGUgPSB7XG4gICAgICBjb25zdHJ1Y3RvcjogJCRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLFxuXG4gICAgLyoqXG4gICAgICBUaGUgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCxcbiAgICAgIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gICAgICByZWFzb24gd2h5IHRoZSBwcm9taXNlIGNhbm5vdCBiZSBmdWxmaWxsZWQuXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24odXNlcil7XG4gICAgICAgIC8vIHVzZXIgaXMgYXZhaWxhYmxlXG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyB1c2VyIGlzIHVuYXZhaWxhYmxlLCBhbmQgeW91IGFyZSBnaXZlbiB0aGUgcmVhc29uIHdoeVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQ2hhaW5pbmdcbiAgICAgIC0tLS0tLS0tXG5cbiAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgYHRoZW5gIGlzIGl0c2VsZiBhIHByb21pc2UuICBUaGlzIHNlY29uZCwgJ2Rvd25zdHJlYW0nXG4gICAgICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gICAgICBvciByZWplY3Rpb24gaGFuZGxlciwgb3IgcmVqZWN0ZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gdXNlci5uYW1lO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHQgbmFtZSc7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh1c2VyTmFtZSkge1xuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgICAgIC8vIHdpbGwgYmUgYCdkZWZhdWx0IG5hbWUnYFxuICAgICAgfSk7XG5cbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jyk7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBpZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHJlYXNvbmAgd2lsbCBiZSAnRm91bmQgdXNlciwgYnV0IHN0aWxsIHVuaGFwcHknLlxuICAgICAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgICAgIH0pO1xuICAgICAgYGBgXG4gICAgICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgUGVkYWdvZ2ljYWxFeGNlcHRpb24oJ1Vwc3RyZWFtIGVycm9yJyk7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyBuZXZlciByZWFjaGVkXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIFRoZSBgUGVkZ2Fnb2NpYWxFeGNlcHRpb25gIGlzIHByb3BhZ2F0ZWQgYWxsIHRoZSB3YXkgZG93biB0byBoZXJlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBBc3NpbWlsYXRpb25cbiAgICAgIC0tLS0tLS0tLS0tLVxuXG4gICAgICBTb21ldGltZXMgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHByb3BhZ2F0ZSB0byBhIGRvd25zdHJlYW0gcHJvbWlzZSBjYW4gb25seSBiZVxuICAgICAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICAgICAgZnVsZmlsbG1lbnQgb3IgcmVqZWN0aW9uIGhhbmRsZXIuIFRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCB0aGVuIGJlIHBlbmRpbmdcbiAgICAgIHVudGlsIHRoZSByZXR1cm5lZCBwcm9taXNlIGlzIHNldHRsZWQuIFRoaXMgaXMgY2FsbGVkICphc3NpbWlsYXRpb24qLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIFRoZSB1c2VyJ3MgY29tbWVudHMgYXJlIG5vdyBhdmFpbGFibGVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvbW1lbnRzKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gSWYgYGZpbmRDb21tZW50c0J5QXV0aG9yYCByZWplY3RzLCB3ZSdsbCBoYXZlIHRoZSByZWFzb24gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgU2ltcGxlIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIHJlc3VsdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kUmVzdWx0KGZ1bmN0aW9uKHJlc3VsdCwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZFJlc3VsdCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KXtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQWR2YW5jZWQgRXhhbXBsZVxuICAgICAgLS0tLS0tLS0tLS0tLS1cblxuICAgICAgU3luY2hyb25vdXMgRXhhbXBsZVxuXG4gICAgICBgYGBqYXZhc2NyaXB0XG4gICAgICB2YXIgYXV0aG9yLCBib29rcztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXV0aG9yID0gZmluZEF1dGhvcigpO1xuICAgICAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgICAgICAvLyBzdWNjZXNzXG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBmYWlsdXJlXG4gICAgICB9XG4gICAgICBgYGBcblxuICAgICAgRXJyYmFjayBFeGFtcGxlXG5cbiAgICAgIGBgYGpzXG5cbiAgICAgIGZ1bmN0aW9uIGZvdW5kQm9va3MoYm9va3MpIHtcblxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuXG4gICAgICB9XG5cbiAgICAgIGZpbmRBdXRob3IoZnVuY3Rpb24oYXV0aG9yLCBlcnIpe1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIC8vIGZhaWx1cmVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmluZEJvb29rc0J5QXV0aG9yKGF1dGhvciwgZnVuY3Rpb24oYm9va3MsIGVycikge1xuICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAgICAgICAgICAgZmFpbHVyZShyZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFByb21pc2UgRXhhbXBsZTtcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgZmluZEF1dGhvcigpLlxuICAgICAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICAgICAgdGhlbihmdW5jdGlvbihib29rcyl7XG4gICAgICAgICAgLy8gZm91bmQgYm9va3NcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAbWV0aG9kIHRoZW5cbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGVkXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICB0aGVuOiBmdW5jdGlvbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcztcbiAgICAgICAgdmFyIHN0YXRlID0gcGFyZW50Ll9zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09ICQkJGludGVybmFsJCRGVUxGSUxMRUQgJiYgIW9uRnVsZmlsbG1lbnQgfHwgc3RhdGUgPT09ICQkJGludGVybmFsJCRSRUpFQ1RFRCAmJiAhb25SZWplY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKCQkJGludGVybmFsJCRub29wKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHBhcmVudC5fcmVzdWx0O1xuXG4gICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1tzdGF0ZSAtIDFdO1xuICAgICAgICAgICQkYXNhcCQkZGVmYXVsdChmdW5jdGlvbigpe1xuICAgICAgICAgICAgJCQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHN0YXRlLCBjaGlsZCwgY2FsbGJhY2ssIHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9LFxuXG4gICAgLyoqXG4gICAgICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gICAgICBhcyB0aGUgY2F0Y2ggYmxvY2sgb2YgYSB0cnkvY2F0Y2ggc3RhdGVtZW50LlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZmluZEF1dGhvcigpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkbid0IGZpbmQgdGhhdCBhdXRob3InKTtcbiAgICAgIH1cblxuICAgICAgLy8gc3luY2hyb25vdXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpbmRBdXRob3IoKTtcbiAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICB9XG5cbiAgICAgIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgICAgIGZpbmRBdXRob3IoKS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCBjYXRjaFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3Rpb25cbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEByZXR1cm4ge1Byb21pc2V9XG4gICAgKi9cbiAgICAgICdjYXRjaCc6IGZ1bmN0aW9uKG9uUmVqZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgJCRlczYkcHJvbWlzZSRwb2x5ZmlsbCQkZGVmYXVsdCA9IGZ1bmN0aW9uIHBvbHlmaWxsKCkge1xuICAgICAgdmFyIGxvY2FsO1xuXG4gICAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbG9jYWwgPSBnbG9iYWw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICBsb2NhbCA9IHdpbmRvdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsID0gc2VsZjtcbiAgICAgIH1cblxuICAgICAgdmFyIGVzNlByb21pc2VTdXBwb3J0ID1cbiAgICAgICAgXCJQcm9taXNlXCIgaW4gbG9jYWwgJiZcbiAgICAgICAgLy8gU29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBtaXNzaW5nIGZyb21cbiAgICAgICAgLy8gRmlyZWZveC9DaHJvbWUgZXhwZXJpbWVudGFsIGltcGxlbWVudGF0aW9uc1xuICAgICAgICBcInJlc29sdmVcIiBpbiBsb2NhbC5Qcm9taXNlICYmXG4gICAgICAgIFwicmVqZWN0XCIgaW4gbG9jYWwuUHJvbWlzZSAmJlxuICAgICAgICBcImFsbFwiIGluIGxvY2FsLlByb21pc2UgJiZcbiAgICAgICAgXCJyYWNlXCIgaW4gbG9jYWwuUHJvbWlzZSAmJlxuICAgICAgICAvLyBPbGRlciB2ZXJzaW9uIG9mIHRoZSBzcGVjIGhhZCBhIHJlc29sdmVyIG9iamVjdFxuICAgICAgICAvLyBhcyB0aGUgYXJnIHJhdGhlciB0aGFuIGEgZnVuY3Rpb25cbiAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciByZXNvbHZlO1xuICAgICAgICAgIG5ldyBsb2NhbC5Qcm9taXNlKGZ1bmN0aW9uKHIpIHsgcmVzb2x2ZSA9IHI7IH0pO1xuICAgICAgICAgIHJldHVybiAkJHV0aWxzJCRpc0Z1bmN0aW9uKHJlc29sdmUpO1xuICAgICAgICB9KCkpO1xuXG4gICAgICBpZiAoIWVzNlByb21pc2VTdXBwb3J0KSB7XG4gICAgICAgIGxvY2FsLlByb21pc2UgPSAkJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2UgPSB7XG4gICAgICAnUHJvbWlzZSc6ICQkZXM2JHByb21pc2UkcHJvbWlzZSQkZGVmYXVsdCxcbiAgICAgICdwb2x5ZmlsbCc6ICQkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHRcbiAgICB9O1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZTp0cnVlIG1vZHVsZTp0cnVlIHdpbmRvdzogdHJ1ZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZVsnYW1kJ10pIHtcbiAgICAgIGRlZmluZShmdW5jdGlvbigpIHsgcmV0dXJuIGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTsgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGVbJ2V4cG9ydHMnXSkge1xuICAgICAgbW9kdWxlWydleHBvcnRzJ10gPSBlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXNbJ0VTNlByb21pc2UnXSA9IGVzNiRwcm9taXNlJHVtZCQkRVM2UHJvbWlzZTtcbiAgICB9XG59KS5jYWxsKHRoaXMpO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2VzNi1wcm9taXNlL2Rpc3QvZXM2LXByb21pc2UuanNcbiAqKiBtb2R1bGUgaWQgPSAzNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuICAgIHZhciBjdXJyZW50UXVldWU7XG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHZhciBpID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtpXSgpO1xuICAgICAgICB9XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbn1cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgcXVldWUucHVzaChmdW4pO1xuICAgIGlmICghZHJhaW5pbmcpIHtcbiAgICAgICAgc2V0VGltZW91dChkcmFpblF1ZXVlLCAwKTtcbiAgICB9XG59O1xuXG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxuLy8gVE9ETyhzaHR5bG1hbilcbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAzNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHsgdGhyb3cgbmV3IEVycm9yKFwiZGVmaW5lIGNhbm5vdCBiZSB1c2VkIGluZGlyZWN0XCIpOyB9O1xyXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9idWlsZGluL2FtZC1kZWZpbmUuanNcbiAqKiBtb2R1bGUgaWQgPSAzNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0bW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHR9XHJcblx0cmV0dXJuIG1vZHVsZTtcclxufVxyXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iXSwic291cmNlUm9vdCI6IiIsImZpbGUiOiJ3ZWJwYWNrLnRlc3RzLmpzIn0=</pre></td></tr>
10217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNDdjZDAwMDY3NWQzOTVhZDMyZjciLCJ3ZWJwYWNrOi8vLy4vd2VicGFjay50ZXN0cy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzIFxcLmpzJCIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2FwaS5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvZGVmYXVsdHMuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2ludGVyY2VwdG9ycy5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3Mvb3B0aW9ucy5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvcHJvbWlzZS5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvdHJhbnNmb3JtLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy91cGxvYWQuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL3dyYXBwZXIuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL3hzcmYuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2hlbHBlcnMvYnVpbGRVcmwuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2hlbHBlcnMvY29va2llcy5zcGVjLmpzIiwid2VicGFjazovLy8uL3Rlc3Qvc3BlY3MvaGVscGVycy9wYXJzZUhlYWRlcnMuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2hlbHBlcnMvc3ByZWFkLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy9oZWxwZXJzL3RyYW5zZm9ybURhdGEuc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL2hlbHBlcnMvdXJsSXNTYW1lT3JpZ2luLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy91dGlscy9mb3JFYWNoLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy91dGlscy9pc1guc3BlYy5qcyIsIndlYnBhY2s6Ly8vLi90ZXN0L3NwZWNzL3V0aWxzL21lcmdlLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vdGVzdC9zcGVjcy91dGlscy90cmltLnNwZWMuanMiLCJ3ZWJwYWNrOi8vLy4vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2RlZmF1bHRzLmpzIiwid2VicGFjazovLy8uL2xpYi9oZWxwZXJzL2J1aWxkVXJsLmpzIiwid2VicGFjazovLy8uL2xpYi9oZWxwZXJzL2Nvb2tpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzIiwid2VicGFjazovLy8uL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaGVscGVycy90cmFuc2Zvcm1EYXRhLmpzIiwid2VicGFjazovLy8uL2xpYi9oZWxwZXJzL3VybElzU2FtZU9yaWdpbi5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2F4aW9zLmpzIiwid2VicGFjazovLy8uL2xpYi9oZWxwZXJzL2RlcHJlY2F0ZWRNZXRob2QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NvcmUvZGlzcGF0Y2hSZXF1ZXN0LmpzIiwid2VicGFjazovLy8uL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvYWRhcHRlcnMveGhyLmpzIiwid2VicGFjazovLy8uL34vZXM2LXByb21pc2UvZGlzdC9lczYtcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2FtZC1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3Qzs7Ozs7OztBQ3RDQTtBQUNBOzs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBaUMsdURBQXVEO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDaENBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsSUFBRztBQUNILEVBQUM7Ozs7Ozs7QUM5QkQ7O0FBRUE7QUFDQTtBQUNBLDBDQUF5QyxXQUFXLGFBQWEsWUFBWTtBQUM3RSxJQUFHOztBQUVIO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0EsZ0RBQStDLFlBQVk7O0FBRTNEO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQSxJQUFHO0FBQ0gsRUFBQzs7Ozs7Ozs7QUNyQkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1QsUUFBTztBQUNQLE1BQUs7O0FBRUw7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPOztBQUVQO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUCxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNULFFBQU87QUFDUCxNQUFLOztBQUVMO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQSxNQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1AsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUCxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQLE1BQUs7QUFDTCxJQUFHO0FBQ0gsRUFBQzs7Ozs7OztBQzNTRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBSztBQUNMLElBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRztBQUNILEVBQUM7Ozs7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QUM7Ozs7Ozs7QUMxQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0wsSUFBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSyxxQ0FBcUMsWUFBWTtBQUN0RCxJQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTCxJQUFHO0FBQ0gsRUFBQzs7Ozs7Ozs7QUM5Q0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNEI7QUFDNUI7QUFDQSxNQUFLO0FBQ0wsbUNBQWtDO0FBQ2xDLE1BQUs7QUFDTCxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7O0FDbkNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQ2pCRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQ1hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQSxJQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBLElBQUc7QUFDSCxFQUFDOzs7Ozs7OztBQzVCRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJ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QSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXVCLFFBQVE7QUFDL0I7QUFDQTtBQUNBO0FBQ0EsWUFBVztBQUNYO0FBQ0E7QUFDQSxVQUFTO0FBQ1Qsd0JBQXVCLFFBQVE7QUFDL0I7O0FBRUE7QUFDQSxVQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0EsVUFBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQSxVQUFTO0FBQ1Q7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscURBQW9ELFFBQVE7O0FBRTVEO0FBQ0E7O0FBRUE7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQW9ELFFBQVE7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNDQUFxQyxRQUFROztBQUU3Qzs7QUFFQSxzQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBLFVBQVM7QUFDVCxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFxQix1REFBdUQ7QUFDNUU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBcUIsdURBQXVEO0FBQzVFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBTzs7QUFFUDtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsUUFBTztBQUNQO0FBQ0EsUUFBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBTztBQUNQOztBQUVBO0FBQ0EsZUFBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFPO0FBQ1A7QUFDQSxRQUFPO0FBQ1A7QUFDQTtBQUNBLFFBQU87O0FBRVA7QUFDQTtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNBLFFBQU87QUFDUDtBQUNB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IGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL19rYXJtYV93ZWJwYWNrXy8vXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogd2VicGFjay9ib290c3RyYXAgNDdjZDAwMDY3NWQzOTVhZDMyZjdcbiAqKi8iLCJ2YXIgY29udGV4dCA9IHJlcXVpcmUuY29udGV4dCgnLi90ZXN0L3NwZWNzJywgdHJ1ZSwgL1xcLmpzJC8pO1xuY29udGV4dC5rZXlzKCkuZm9yRWFjaChjb250ZXh0KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi93ZWJwYWNrLnRlc3RzLmpzXG4gKiogbW9kdWxlIGlkID0gMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIG1hcCA9IHtcblx0XCIuL2FwaS5zcGVjLmpzXCI6IDIsXG5cdFwiLi9kZWZhdWx0cy5zcGVjLmpzXCI6IDMsXG5cdFwiLi9oZWxwZXJzL2J1aWxkVXJsLnNwZWMuanNcIjogMTEsXG5cdFwiLi9oZWxwZXJzL2Nvb2tpZXMuc3BlYy5qc1wiOiAxMixcblx0XCIuL2hlbHBlcnMvcGFyc2VIZWFkZXJzLnNwZWMuanNcIjogMTMsXG5cdFwiLi9oZWxwZXJzL3NwcmVhZC5zcGVjLmpzXCI6IDE0LFxuXHRcIi4vaGVscGVycy90cmFuc2Zvcm1EYXRhLnNwZWMuanNcIjogMTUsXG5cdFwiLi9oZWxwZXJzL3VybElzU2FtZU9yaWdpbi5zcGVjLmpzXCI6IDE2LFxuXHRcIi4vaW50ZXJjZXB0b3JzLnNwZWMuanNcIjogNCxcblx0XCIuL29wdGlvbnMuc3BlYy5qc1wiOiA1LFxuXHRcIi4vcHJvbWlzZS5zcGVjLmpzXCI6IDYsXG5cdFwiLi90cmFuc2Zvcm0uc3BlYy5qc1wiOiA3LFxuXHRcIi4vdXBsb2FkLnNwZWMuanNcIjogOCxcblx0XCIuL3V0aWxzL2ZvckVhY2guc3BlYy5qc1wiOiAxNyxcblx0XCIuL3V0aWxzL2lzWC5zcGVjLmpzXCI6IDE4LFxuXHRcIi4vdXRpbHMvbWVyZ2Uuc3BlYy5qc1wiOiAxOSxcblx0XCIuL3V0aWxzL3RyaW0uc3BlYy5qc1wiOiAyMCxcblx0XCIuL3dyYXBwZXIuc3BlYy5qc1wiOiA5LFxuXHRcIi4veHNyZi5zcGVjLmpzXCI6IDEwXG59O1xuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpKTtcbn07XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdHJldHVybiBtYXBbcmVxXSB8fCAoZnVuY3Rpb24oKSB7IHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIicuXCIpIH0oKSk7XG59O1xud2VicGFja0NvbnRleHQua2V5cyA9IGZ1bmN0aW9uIHdlYnBhY2tDb250ZXh0S2V5cygpIHtcblx0cmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7XG59O1xud2VicGFja0NvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZTtcbm1vZHVsZS5leHBvcnRzID0gd2VicGFja0NvbnRleHQ7XG53ZWJwYWNrQ29udGV4dC5pZCA9IDE7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcyBcXC5qcyRcbiAqKiBtb2R1bGUgaWQgPSAxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgYXhpb3MgPSByZXF1aXJlKCcuLi8uLi9pbmRleCcpO1xuXG5kZXNjcmliZSgnYXBpJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGhhdmUgcmVxdWVzdCBtZXRob2QgaGVscGVycycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLmdldCkudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLmhlYWQpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBheGlvcy5kZWxldGUpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gICAgZXhwZWN0KHR5cGVvZiBheGlvcy5wb3N0KS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYXhpb3MucHV0KS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYXhpb3MucGF0Y2gpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBwcm9taXNlIG1ldGhvZCBoZWxwZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gYXhpb3MoKTtcblxuICAgIGV4cGVjdCh0eXBlb2YgcHJvbWlzZS50aGVuKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgcHJvbWlzZS5jYXRjaCkudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIHByb21pc2Uuc3VjY2VzcykudG9FcXVhbCgnZnVuY3Rpb24nKTtcbiAgICBleHBlY3QodHlwZW9mIHByb21pc2UuZXJyb3IpLnRvRXF1YWwoJ2Z1bmN0aW9uJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBkZWZhdWx0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLmRlZmF1bHRzKS50b0VxdWFsKCdvYmplY3QnKTtcbiAgICBleHBlY3QodHlwZW9mIGF4aW9zLmRlZmF1bHRzLmhlYWRlcnMpLnRvRXF1YWwoJ29iamVjdCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGhhdmUgYWxsL3NwcmVhZCBoZWxwZXJzJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh0eXBlb2YgYXhpb3MuYWxsKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICAgIGV4cGVjdCh0eXBlb2YgYXhpb3Muc3ByZWFkKS50b0VxdWFsKCdmdW5jdGlvbicpO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvYXBpLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSAyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuLi8uLi9saWIvZGVmYXVsdHMnKTtcblxuZGVzY3JpYmUoJ2RlZmF1bHRzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIHRyYW5zZm9ybSByZXF1ZXN0IGpzb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KGRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3RbMF0oe2ZvbzogJ2Jhcid9KSkudG9FcXVhbCgne1wiZm9vXCI6XCJiYXJcIn0nKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkbyBub3RoaW5nIHRvIHJlcXVlc3Qgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0WzBdKCdmb289YmFyJykpLnRvRXF1YWwoJ2Zvbz1iYXInKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0cmFuc2Zvcm0gcmVzcG9uc2UganNvbicsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YSA9IGRlZmF1bHRzLnRyYW5zZm9ybVJlc3BvbnNlWzBdKCd7XCJmb29cIjpcImJhclwifScpO1xuXG4gICAgZXhwZWN0KHR5cGVvZiBkYXRhKS50b0VxdWFsKCdvYmplY3QnKTtcbiAgICBleHBlY3QoZGF0YS5mb28pLnRvRXF1YWwoJ2JhcicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRvIG5vdGhpbmcgdG8gcmVzcG9uc2Ugc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZVswXSgnZm9vPWJhcicpKS50b0VxdWFsKCdmb289YmFyJyk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL2RlZmF1bHRzLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSAzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgYXhpb3MgPSByZXF1aXJlKCcuLi8uLi9pbmRleCcpO1xuXG5kZXNjcmliZSgnaW50ZXJjZXB0b3JzJywgZnVuY3Rpb24gKCkge1xuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXguaW5zdGFsbCgpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC51bmluc3RhbGwoKTtcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5oYW5kbGVycyA9IFtdO1xuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS5oYW5kbGVycyA9IFtdO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBhIHJlcXVlc3QgaW50ZXJjZXB0b3InLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuICAgIFxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICBjb25maWcuaGVhZGVycy50ZXN0ID0gJ2FkZGVkIGJ5IGludGVyY2VwdG9yJztcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSk7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVycy50ZXN0KS50b0JlKCdhZGRlZCBieSBpbnRlcmNlcHRvcicpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBhIHJlcXVlc3QgaW50ZXJjZXB0b3IgdGhhdCByZXR1cm5zIGEgbmV3IGNvbmZpZyBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVybDogJy9iYXInLFxuICAgICAgICBtZXRob2Q6ICdwb3N0J1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ09LJ1xuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0Lm1ldGhvZCkudG9CZSgnUE9TVCcpO1xuICAgICAgZXhwZWN0KHJlcXVlc3QudXJsKS50b0JlKCcvYmFyJyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWRkIGEgcmVxdWVzdCBpbnRlcmNlcHRvciB0aGF0IHJldHVybnMgYSBwcm9taXNlJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgLy8gZG8gc29tZXRoaW5nIGFzeW5jXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbmZpZy5oZWFkZXJzLmFzeW5jID0gJ3Byb21pc2UnO1xuICAgICAgICAgIHJlc29sdmUoY29uZmlnKTtcbiAgICAgICAgfSwgMTApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVycy5hc3luYykudG9CZSgncHJvbWlzZScpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWRkIG11bHRpcGxlIHJlcXVlc3QgaW50ZXJjZXB0b3JzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICBjb25maWcuaGVhZGVycy50ZXN0MSA9ICcxJztcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSk7XG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIGNvbmZpZy5oZWFkZXJzLnRlc3QyID0gJzInO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9KTtcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgY29uZmlnLmhlYWRlcnMudGVzdDMgPSAnMyc7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0pO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAnT0snXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnMudGVzdDEpLnRvQmUoJzEnKTtcbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzLnRlc3QyKS50b0JlKCcyJyk7XG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVycy50ZXN0MykudG9CZSgnMycpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBhIHJlc3BvbnNlIGludGVyY2VwdG9yJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdCwgcmVzcG9uc2U7XG5cbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnIC0gbW9kaWZpZWQgYnkgaW50ZXJjZXB0b3InO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIHJlc3BvbnNlID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIHJlcXVlc3QucmVzcG9uZFdpdGgoe1xuICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAnT0snXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5kYXRhKS50b0JlKCdPSyAtIG1vZGlmaWVkIGJ5IGludGVyY2VwdG9yJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBhIHJlc3BvbnNlIGludGVyY2VwdG9yIHRoYXQgcmV0dXJucyBhIG5ldyBkYXRhIG9iamVjdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIHJlc3BvbnNlO1xuXG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiAnc3R1ZmYnXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXNwb25zZSA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ09LJ1xuICAgICAgfSk7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YSkudG9CZSgnc3R1ZmYnKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWRkIGEgcmVzcG9uc2UgaW50ZXJjZXB0b3IgdGhhdCByZXR1cm5zIGEgcHJvbWlzZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIHJlc3BvbnNlO1xuXG4gICAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIGRvIHNvbWV0aGluZyBhc3luY1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkYXRhLmRhdGEgPSAneW91IGhhdmUgYmVlbiBwcm9taXNlZCEnO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXNwb25zZSA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ09LJ1xuICAgICAgfSk7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YSkudG9CZSgneW91IGhhdmUgYmVlbiBwcm9taXNlZCEnKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhZGQgbXVsdGlwbGUgcmVzcG9uc2UgaW50ZXJjZXB0b3JzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdCwgcmVzcG9uc2U7XG5cbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnMSc7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnMic7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnMyc7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmVzcG9uc2UgPSBkYXRhO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICdPSydcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmRhdGEpLnRvQmUoJ09LMTIzJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFsbG93IHJlbW92aW5nIGludGVyY2VwdG9ycycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIHJlc3BvbnNlLCBpbnRlcmNlcHQ7XG5cbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnMSc7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbiAgICBpbnRlcmNlcHQgPSBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnMic7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbiAgICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBkYXRhLmRhdGEgPSBkYXRhLmRhdGEgKyAnMyc7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcblxuICAgIGF4aW9zLmludGVyY2VwdG9ycy5yZXNwb25zZS5lamVjdChpbnRlcmNlcHQpO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICByZXNwb25zZSA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ09LJ1xuICAgICAgfSk7XG5cbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YSkudG9CZSgnT0sxMycpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL2ludGVyY2VwdG9ycy5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gNFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ29wdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC5pbnN0YWxsKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgamFzbWluZS5BamF4LnVuaW5zdGFsbCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlZmF1bHQgbWV0aG9kIHRvIGdldCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QubWV0aG9kKS50b0JlKCdHRVQnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhY2NlcHQgaGVhZGVycycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnWE1MSHR0cFJlcXVlc3QnXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddKS50b0VxdWFsKCdYTUxIdHRwUmVxdWVzdCcpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFjY2VwdCBwYXJhbXMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZm9vOiAxMjMsXG4gICAgICAgIGJhcjogNDU2XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC51cmwpLnRvQmUoJy9mb28/Zm9vPTEyMyZiYXI9NDU2Jyk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWxsb3cgb3ZlcnJpZGluZyBkZWZhdWx0IGhlYWRlcnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBY2NlcHQnOiAnZm9vL2JhcidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzWydBY2NlcHQnXSkudG9FcXVhbCgnZm9vL2JhcicpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3Mvb3B0aW9ucy5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ3Byb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC5pbnN0YWxsKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgamFzbWluZS5BamF4LnVuaW5zdGFsbCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHByb3ZpZGUgc3VjY2luY3Qgb2JqZWN0IHRvIHRoZW4nLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0LCByZXNwb25zZTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSkudGhlbihmdW5jdGlvbiAocikge1xuICAgICAgcmVzcG9uc2UgPSByO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZVRleHQ6ICd7XCJoZWxsb1wiOlwid29ybGRcIn0nXG4gICAgICB9KTtcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdCh0eXBlb2YgcmVzcG9uc2UpLnRvRXF1YWwoJ29iamVjdCcpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuZGF0YS5oZWxsbykudG9FcXVhbCgnd29ybGQnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1cykudG9FcXVhbCgyMDApO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UuaGVhZGVyc1snY29udGVudC10eXBlJ10pLnRvRXF1YWwoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLmNvbmZpZy51cmwpLnRvRXF1YWwoJy9mb28nKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcHJvdmlkZSB2ZXJib3NlIGFyZ3VtZW50cyB0byBzdWNjZXNzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdCwgZGF0YSwgc3RhdHVzLCBoZWFkZXJzLCBjb25maWc7XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24gKGQsIHMsIGgsIGMpIHtcbiAgICAgIGRhdGEgPSBkO1xuICAgICAgc3RhdHVzID0gcztcbiAgICAgIGhlYWRlcnMgPSBoO1xuICAgICAgY29uZmlnID0gYztcbiAgICAgIGZ1bGZpbGxlZCA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICByZXF1ZXN0LnJlc3BvbmRXaXRoKHtcbiAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ3tcImhlbGxvXCI6XCJ3b3JsZFwifSdcbiAgICAgIH0pO1xuXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGRhdGEuaGVsbG8pLnRvRXF1YWwoJ3dvcmxkJyk7XG4gICAgICAgIGV4cGVjdChzdGF0dXMpLnRvQmUoMjAwKTtcbiAgICAgICAgZXhwZWN0KGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIGV4cGVjdChjb25maWcudXJsKS50b0VxdWFsKCcvZm9vJyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0sIDApO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgYWxsJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgZnVsZmlsbGVkID0gZmFsc2U7XG5cbiAgICBheGlvcy5hbGwoW3RydWUsIDEyM10pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgZnVsZmlsbGVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZXhwZWN0KGZ1bGZpbGxlZCkudG9FcXVhbCh0cnVlKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IHNwcmVhZCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgdmFyIGZ1bGZpbGxlZCA9IGZhbHNlO1xuXG4gICAgYXhpb3MuYWxsKFsxMjMsIDQ1Nl0pLnRoZW4oYXhpb3Muc3ByZWFkKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBzdW0gPSBhICsgYjtcbiAgICAgIGZ1bGZpbGxlZCA9IHRydWU7XG4gICAgfSkpO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBleHBlY3QoZnVsZmlsbGVkKS50b0VxdWFsKHRydWUpO1xuICAgICAgZXhwZWN0KHN1bSkudG9FcXVhbCgxMjMgKyA0NTYpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvcHJvbWlzZS5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uICgpIHtcbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgamFzbWluZS5BamF4Lmluc3RhbGwoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBqYXNtaW5lLkFqYXgudW5pbnN0YWxsKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdHJhbnNmb3JtIEpTT04gdG8gc3RyaW5nJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIGZvbzogJ2JhcidcbiAgICB9O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnBhcmFtcykudG9FcXVhbCgne1wiZm9vXCI6XCJiYXJcIn0nKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBvdmVycmlkZSBkZWZhdWx0IHRyYW5zZm9ybScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBmb286ICdiYXInXG4gICAgfTtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QodHlwZW9mIHJlcXVlc3QucGFyYW1zKS50b0VxdWFsKCdvYmplY3QnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbGxvdyBhbiBBcnJheSBvZiB0cmFuc2Zvcm1lcnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgZm9vOiAnYmFyJ1xuICAgIH07XG5cbiAgICBheGlvcyh7XG4gICAgICB1cmw6ICcvZm9vJyxcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IGF4aW9zLmRlZmF1bHRzLnRyYW5zZm9ybVJlcXVlc3QuY29uY2F0KFxuICAgICAgICBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2UoJ2JhcicsICdiYXonKTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucGFyYW1zKS50b0VxdWFsKCd7XCJmb29cIjpcImJhelwifScpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFsbG93aW5nIG11dGF0aW5nIGhlYWRlcnMnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciB0b2tlbiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDIsIDY0KSkudG9TdHJpbmcoMzYpO1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBmdW5jdGlvbiAoZGF0YSwgaGVhZGVycykge1xuICAgICAgICBoZWFkZXJzWydYLUF1dGhvcml6YXRpb24nXSA9IHRva2VuO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnNbJ1gtQXV0aG9yaXphdGlvbiddKS50b0VxdWFsKHRva2VuKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3RyYW5zZm9ybS5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLy8gdmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcbi8vXG4vLyBkZXNjcmliZSgndXBsb2FkJywgZnVuY3Rpb24gKCkge1xuLy8gICBcbi8vICAgaXQoJ3Nob3VsZCB1cGxvYWQgYSBmaWxlIHRvIGEgc2VydmVyJywgZnVuY3Rpb24gKGRvbmUpIHtcbi8vICAgfSk7XG4vL1xuLy8gICBpdCgnc2hvdWxkIG5vdCBzZXQgeHNyZiBoZWFkZXIgaWYgY29va2llIGlzIG51bGwnLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciByZXF1ZXN0O1xuLy9cbi8vICAgICBheGlvcyh7XG4vLyAgICAgICB1cmw6ICcvZm9vJ1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbi8vICAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuLy9cbi8vICAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzW2F4aW9zLmRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lXSkudG9FcXVhbCh1bmRlZmluZWQpO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0sIDApO1xuLy8gICB9KTtcbi8vXG4vLyAgIGl0KCdzaG91bGQgc2V0IHhzcmYgaGVhZGVyIGlmIGNvb2tpZSBpcyBzZXQnLCBmdW5jdGlvbiAoZG9uZSkge1xuLy8gICAgIHZhciByZXF1ZXN0O1xuLy8gICAgIGRvY3VtZW50LmNvb2tpZSA9IGF4aW9zLmRlZmF1bHRzLnhzcmZDb29raWVOYW1lICsgJz0xMjM0NSc7XG4vL1xuLy8gICAgIGF4aW9zKHtcbi8vICAgICAgIHVybDogJy9mb28nXG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuLy8gICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG4vL1xuLy8gICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnNbYXhpb3MuZGVmYXVsdHMueHNyZkhlYWRlck5hbWVdKS50b0VxdWFsKCcxMjM0NScpO1xuLy8gICAgICAgZG9uZSgpO1xuLy8gICAgIH0sIDApO1xuLy8gICB9KTtcbi8vIH0pO1xuLy9cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3VwbG9hZC5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ3dyYXBwZXInLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC5pbnN0YWxsKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgamFzbWluZS5BamF4LnVuaW5zdGFsbCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG1ha2UgYW4gaHR0cCByZXF1ZXN0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nXG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICBleHBlY3QocmVxdWVzdC51cmwpLnRvQmUoJy9mb28nKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkZWZhdWx0IGNvbW1vbiBoZWFkZXJzJywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcbiAgICB2YXIgaGVhZGVycyA9IGF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBleHBlY3QocmVxdWVzdC5yZXF1ZXN0SGVhZGVyc1trZXldKS50b0VxdWFsKGhlYWRlcnNba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhZGQgZXh0cmEgaGVhZGVycyBmb3IgcG9zdCcsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGhlYWRlcnMgPSBheGlvcy5kZWZhdWx0cy5oZWFkZXJzLmNvbW1vbjtcblxuICAgIGF4aW9zKHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgdXJsOiAnL2ZvbycsXG4gICAgICBkYXRhOiAnZml6ej1idXp6J1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzW2tleV0pLnRvRXF1YWwoaGVhZGVyc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHVzZSBhcHBsaWNhdGlvbi9qc29uIHdoZW4gcG9zdGluZyBhbiBvYmplY3QnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2Zvby9iYXInLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZpcnN0TmFtZTogJ2ZvbycsXG4gICAgICAgIGxhc3ROYW1lOiAnYmFyJ1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IGJpbmFyeSBkYXRhIGFzIGFycmF5IGJ1ZmZlcicsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGlucHV0ID0gbmV3IEludDhBcnJheSgyKTtcbiAgICBpbnB1dFswXSA9IDE7XG4gICAgaW5wdXRbMV0gPSAyO1xuXG4gICAgYXhpb3Moe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6ICcvZm9vJyxcbiAgICAgIGRhdGE6IGlucHV0LmJ1ZmZlclxuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgdmFyIG91dHB1dCA9IG5ldyBJbnQ4QXJyYXkocmVxdWVzdC5wYXJhbXMuYnVmZmVyKTtcbiAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoKS50b0VxdWFsKDIpO1xuICAgICAgZXhwZWN0KG91dHB1dFswXSkudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChvdXRwdXRbMV0pLnRvRXF1YWwoMik7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBiaW5hcnkgZGF0YSBhcyBhcnJheSBidWZmZXIgdmlldycsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3Q7XG4gICAgdmFyIGlucHV0ID0gbmV3IEludDhBcnJheSgyKTtcbiAgICBpbnB1dFswXSA9IDE7XG4gICAgaW5wdXRbMV0gPSAyO1xuXG4gICAgYXhpb3Moe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6ICcvZm9vJyxcbiAgICAgIGRhdGE6IGlucHV0XG4gICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcXVlc3QgPSBqYXNtaW5lLkFqYXgucmVxdWVzdHMubW9zdFJlY2VudCgpO1xuXG4gICAgICB2YXIgb3V0cHV0ID0gbmV3IEludDhBcnJheShyZXF1ZXN0LnBhcmFtcy5idWZmZXIpO1xuICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3Qob3V0cHV0WzBdKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KG91dHB1dFsxXSkudG9FcXVhbCgyKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZW1vdmUgY29udGVudC10eXBlIGlmIGRhdGEgaXMgZW1wdHknLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmw6ICcvZm9vJ1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgZXhwZWN0KHJlcXVlc3QucmVxdWVzdEhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKS50b0VxdWFsKHVuZGVmaW5lZCk7XG4gICAgICBkb25lKCk7XG4gICAgfSwgMCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcGx5IGNvcnJlY3QgcmVzcG9uc2UnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0LCByZXNwb25zZTtcblxuICAgIGF4aW9zKHtcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHJlc3BvbnNlID0gcmVzO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBzdGF0dXNUZXh0OiAnT0snLFxuICAgICAgICByZXNwb25zZVRleHQ6ICd7XCJmb29cIjogXCJiYXJcIn0nLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5kYXRhLmZvbykudG9FcXVhbCgnYmFyJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5zdGF0dXMpLnRvRXF1YWwoMjAwKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlLnN0YXR1c1RleHQpLnRvRXF1YWwoJ09LJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSkudG9FcXVhbCgnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IGFycmF5IGJ1ZmZlciByZXNwb25zZScsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgdmFyIHJlcXVlc3QsIHJlc3BvbnNlO1xuXG4gICAgZnVuY3Rpb24gc3RyMmFiKHN0cikge1xuICAgICAgdmFyIGJ1ZmYgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCAqIDIpO1xuICAgICAgdmFyIHZpZXcgPSBuZXcgVWludDE2QXJyYXkoYnVmZik7XG4gICAgICBmb3IgKCB2YXIgaT0wLCBsPXN0ci5sZW5ndGg7IGk8bDsgaSsrKSB7XG4gICAgICAgIHZpZXdbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBidWZmO1xuICAgIH1cblxuICAgIGF4aW9zKHtcbiAgICAgIHVybDogJy9mb28nLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgcmVzcG9uc2UgPSBkYXRhO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXF1ZXN0ID0gamFzbWluZS5BamF4LnJlcXVlc3RzLm1vc3RSZWNlbnQoKTtcblxuICAgICAgcmVxdWVzdC5yZXNwb25kV2l0aCh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICByZXNwb25zZTogc3RyMmFiKCdIZWxsbyB3b3JsZCcpXG4gICAgICB9KTtcblxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZS5kYXRhLmJ5dGVMZW5ndGgpLnRvQmUoMjIpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCAwKTtcbiAgICB9LCAwKTtcbiAgfSk7XG5cbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3Mvd3JhcHBlci5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIGF4aW9zID0gcmVxdWlyZSgnLi4vLi4vaW5kZXgnKTtcblxuZGVzY3JpYmUoJ3hzcmYnLCBmdW5jdGlvbiAoKSB7XG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGphc21pbmUuQWpheC5pbnN0YWxsKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQuY29va2llID0gYXhpb3MuZGVmYXVsdHMueHNyZkNvb2tpZU5hbWUgKyAnPTtleHBpcmVzPScgKyBuZXcgRGF0ZShEYXRlLm5vdygpIC0gODY0MDAwMDApLnRvR01UU3RyaW5nKCk7XG4gICAgamFzbWluZS5BamF4LnVuaW5zdGFsbCgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG5vdCBzZXQgeHNyZiBoZWFkZXIgaWYgY29va2llIGlzIG51bGwnLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIHZhciByZXF1ZXN0O1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzW2F4aW9zLmRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lXSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgICAgZG9uZSgpO1xuICAgIH0sIDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNldCB4c3JmIGhlYWRlciBpZiBjb29raWUgaXMgc2V0JywgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgcmVxdWVzdDtcbiAgICBkb2N1bWVudC5jb29raWUgPSBheGlvcy5kZWZhdWx0cy54c3JmQ29va2llTmFtZSArICc9MTIzNDUnO1xuXG4gICAgYXhpb3Moe1xuICAgICAgdXJsOiAnL2ZvbydcbiAgICB9KTtcblxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVxdWVzdCA9IGphc21pbmUuQWpheC5yZXF1ZXN0cy5tb3N0UmVjZW50KCk7XG5cbiAgICAgIGV4cGVjdChyZXF1ZXN0LnJlcXVlc3RIZWFkZXJzW2F4aW9zLmRlZmF1bHRzLnhzcmZIZWFkZXJOYW1lXSkudG9FcXVhbCgnMTIzNDUnKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9LCAwKTtcbiAgfSk7XG59KTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3hzcmYuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDEwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgYnVpbGRVcmwgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvaGVscGVycy9idWlsZFVybCcpO1xuXG5kZXNjcmliZSgnaGVscGVyczo6YnVpbGRVcmwnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgc3VwcG9ydCBudWxsIHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoYnVpbGRVcmwoJy9mb28nKSkudG9FcXVhbCgnL2ZvbycpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgcGFyYW1zJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChidWlsZFVybCgnL2ZvbycsIHtcbiAgICAgIGZvbzogJ2JhcidcbiAgICB9KSkudG9FcXVhbCgnL2Zvbz9mb289YmFyJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBvYmplY3QgcGFyYW1zJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdChidWlsZFVybCgnL2ZvbycsIHtcbiAgICAgIGZvbzoge1xuICAgICAgICBiYXI6ICdiYXonXG4gICAgICB9XG4gICAgfSkpLnRvRXF1YWwoJy9mb28/Zm9vPScgKyBlbmNvZGVVUkkoJ3tcImJhclwiOlwiYmF6XCJ9JykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgZGF0ZSBwYXJhbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgZXhwZWN0KGJ1aWxkVXJsKCcvZm9vJywge1xuICAgICAgZGF0ZTogZGF0ZVxuICAgIH0pKS50b0VxdWFsKCcvZm9vP2RhdGU9JyArIGRhdGUudG9JU09TdHJpbmcoKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhcnJheSBwYXJhbXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KGJ1aWxkVXJsKCcvZm9vJywge1xuICAgICAgZm9vOiBbJ2JhcicsICdiYXonXVxuICAgIH0pKS50b0VxdWFsKCcvZm9vP2Zvbz1iYXImZm9vPWJheicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHN1cHBvcnQgc3BlY2lhbCBjaGFyIHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoYnVpbGRVcmwoJy9mb28nLCB7XG4gICAgICBmb286ICdAOiQsICdcbiAgICB9KSkudG9FcXVhbCgnL2Zvbz9mb289QDokLCsnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzdXBwb3J0IGV4aXN0aW5nIHBhcmFtcycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QoYnVpbGRVcmwoJy9mb28/Zm9vPWJhcicsIHtcbiAgICAgIGJhcjogJ2JheidcbiAgICB9KSkudG9FcXVhbCgnL2Zvbz9mb289YmFyJmJhcj1iYXonKTtcbiAgfSk7XG59KTtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy9idWlsZFVybC5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBjb29raWVzID0gcmVxdWlyZSgnLi4vLi4vLi4vbGliL2hlbHBlcnMvY29va2llcycpO1xuXG5kZXNjcmliZSgnaGVscGVyczo6Y29va2llcycsIGZ1bmN0aW9uICgpIHtcbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBSZW1vdmUgYWxsIHRoZSBjb29raWVzXG4gICAgdmFyIGV4cGlyZXMgPSBEYXRlLm5vdygpIC0gKDYwICogNjAgKiAyNCAqIDcpO1xuICAgIGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpLm1hcChmdW5jdGlvbiAoY29va2llKSB7XG4gICAgICByZXR1cm4gY29va2llLnNwbGl0KCc9JylbMF07XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArICc9OyBleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHdyaXRlIGNvb2tpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29va2llcy53cml0ZSgnZm9vJywgJ2JheicpO1xuICAgIGV4cGVjdChkb2N1bWVudC5jb29raWUpLnRvRXF1YWwoJ2Zvbz1iYXonKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZWFkIGNvb2tpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29va2llcy53cml0ZSgnZm9vJywgJ2FiYycpO1xuICAgIGNvb2tpZXMud3JpdGUoJ2JhcicsICdkZWYnKTtcbiAgICBleHBlY3QoY29va2llcy5yZWFkKCdmb28nKSkudG9FcXVhbCgnYWJjJyk7XG4gICAgZXhwZWN0KGNvb2tpZXMucmVhZCgnYmFyJykpLnRvRXF1YWwoJ2RlZicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlbW92ZSBjb29raWVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvb2tpZXMud3JpdGUoJ2ZvbycsICdiYXInKTtcbiAgICBjb29raWVzLnJlbW92ZSgnZm9vJyk7XG4gICAgZXhwZWN0KGNvb2tpZXMucmVhZCgnZm9vJykpLnRvRXF1YWwobnVsbCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdXJpIGVuY29kZSB2YWx1ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29va2llcy53cml0ZSgnZm9vJywgJ2JhciBiYXolJyk7XG4gICAgZXhwZWN0KGRvY3VtZW50LmNvb2tpZSkudG9FcXVhbCgnZm9vPWJhciUyMGJheiUyNScpO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy9jb29raWVzLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSAxMlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xuXG5kZXNjcmliZSgnaGVscGVyczo6cGFyc2VIZWFkZXJzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIHBhcnNlIGhlYWRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUhlYWRlcnMoXG4gICAgICAnRGF0ZTogJyArIGRhdGUudG9JU09TdHJpbmcoKSArICdcXG4nICtcbiAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cXG4nICtcbiAgICAgICdDb25uZWN0aW9uOiBrZWVwLWFsaXZlXFxuJyArXG4gICAgICAnVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQnXG4gICAgKTtcblxuICAgIGV4cGVjdChwYXJzZWRbJ2RhdGUnXSkudG9FcXVhbChkYXRlLnRvSVNPU3RyaW5nKCkpO1xuICAgIGV4cGVjdChwYXJzZWRbJ2NvbnRlbnQtdHlwZSddKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgZXhwZWN0KHBhcnNlZFsnY29ubmVjdGlvbiddKS50b0VxdWFsKCdrZWVwLWFsaXZlJyk7XG4gICAgZXhwZWN0KHBhcnNlZFsndHJhbnNmZXItZW5jb2RpbmcnXSkudG9FcXVhbCgnY2h1bmtlZCcpO1xuICB9KTtcbn0pO1xuXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy9oZWxwZXJzL3BhcnNlSGVhZGVycy5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMTNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBzcHJlYWQgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvaGVscGVycy9zcHJlYWQnKTtcblxuZGVzY3JpYmUoJ2hlbHBlcnM6OnNwcmVhZCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBzcHJlYWQgYXJyYXkgdG8gYXJndW1lbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IDA7XG4gICAgc3ByZWFkKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICB2YWx1ZSA9IGEgKiBiO1xuICAgIH0pKFs1LCAxMF0pO1xuXG4gICAgZXhwZWN0KHZhbHVlKS50b0VxdWFsKDUwKTtcbiAgfSk7XG59KTtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy9zcHJlYWQuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi9oZWxwZXJzL3RyYW5zZm9ybURhdGEnKTtcblxuZGVzY3JpYmUoJ2hlbHBlcnM6OnRyYW5zZm9ybURhdGEnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhIHNpbmdsZSB0cmFuc2Zvcm1lcicsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGF0YTtcbiAgICBkYXRhID0gdHJhbnNmb3JtRGF0YShkYXRhLCBudWxsLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgZGF0YSA9ICdmb28nO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG5cbiAgICBleHBlY3QoZGF0YSkudG9FcXVhbCgnZm9vJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc3VwcG9ydCBhbiBhcnJheSBvZiB0cmFuc2Zvcm1lcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSAnJztcbiAgICBkYXRhID0gdHJhbnNmb3JtRGF0YShkYXRhLCBudWxsLCBbZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGRhdGEgKz0gJ2YnO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGRhdGEgKz0gJ28nO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSwgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIGRhdGEgKz0gJ28nO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfV0pO1xuXG4gICAgZXhwZWN0KGRhdGEpLnRvRXF1YWwoJ2ZvbycpO1xuICB9KTtcbn0pO1xuXG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vdGVzdC9zcGVjcy9oZWxwZXJzL3RyYW5zZm9ybURhdGEuc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE1XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdXJsSXNTYW1lT3JpZ2luID0gcmVxdWlyZSgnLi4vLi4vLi4vbGliL2hlbHBlcnMvdXJsSXNTYW1lT3JpZ2luJyk7XG5cbmRlc2NyaWJlKCdoZWxwZXJzOjp1cmxJc1NhbWVPcmlnaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgZGV0ZWN0IHNhbWUgb3JpZ2luJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1cmxJc1NhbWVPcmlnaW4od2luZG93LmxvY2F0aW9uLmhyZWYpKS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRldGVjdCBkaWZmZXJlbnQgb3JpZ2luJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1cmxJc1NhbWVPcmlnaW4oJ2h0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zJykpLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rlc3Qvc3BlY3MvaGVscGVycy91cmxJc1NhbWVPcmlnaW4uc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE2XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgZm9yRWFjaCA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscycpLmZvckVhY2g7XG5cbmRlc2NyaWJlKCd1dGlsczo6Zm9yRWFjaCcsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCBsb29wIG92ZXIgYW4gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1bSA9IDA7XG5cbiAgICBmb3JFYWNoKFsxLCAyLCAzLCA0LCA1XSwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgc3VtICs9IHZhbDtcbiAgICB9KTtcblxuICAgIGV4cGVjdChzdW0pLnRvRXF1YWwoMTUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGxvb3Agb3ZlciBhcmd1bWVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN1bSA9IDA7XG5cbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgc3VtICs9IHZhbDtcbiAgICAgIH0pO1xuICAgIH0pKDEsIDIsIDMsIDQsIDUpO1xuXG4gICAgZXhwZWN0KHN1bSkudG9FcXVhbCgxNSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbG9vcCBvdmVyIG9iamVjdCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBrZXlzID0gJyc7XG4gICAgdmFyIHZhbHMgPSAwO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBiOiAxLFxuICAgICAgYTogMixcbiAgICAgIHI6IDNcbiAgICB9O1xuXG4gICAgZm9yRWFjaChvYmosIGZ1bmN0aW9uICh2LCBrKSB7XG4gICAgICBrZXlzICs9IGs7XG4gICAgICB2YWxzICs9IHY7XG4gICAgfSk7XG5cbiAgICBleHBlY3Qoa2V5cykudG9FcXVhbCgnYmFyJyk7XG4gICAgZXhwZWN0KHZhbHMpLnRvRXF1YWwoNik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaGFuZGxlIHVuZGVmaW5lZCBncmFjZWZ1bGx5JywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb3VudCA9IDA7XG5cbiAgICBmb3JFYWNoKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuICAgICAgY291bnQrKztcbiAgICB9KTtcblxuICAgIGV4cGVjdChjb3VudCkudG9FcXVhbCgwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBtYWtlIGFuIGFycmF5IG91dCBvZiBub24tYXJyYXkgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNvdW50ID0gMDtcblxuICAgIGZvckVhY2goZnVuY3Rpb24gKCkge30sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvdW50Kys7XG4gICAgfSk7XG5cbiAgICBleHBlY3QoY291bnQpLnRvRXF1YWwoMSk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL2ZvckVhY2guc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDE3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJ2YXIgdXRpbHMgPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvdXRpbHMnKTtcblxuZGVzY3JpYmUoJ3V0aWxzOjppc1gnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgQXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzQXJyYXkoW10pKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdCh1dGlscy5pc0FycmF5KHtsZW5ndGg6IDV9KSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgQXJyYXlCdWZmZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKSkudG9FcXVhbCh0cnVlKTtcbiAgICBleHBlY3QodXRpbHMuaXNBcnJheUJ1ZmZlcih7fSkpLnRvRXF1YWwoZmFsc2UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIEFycmF5QnVmZmVyVmlldycsIGZ1bmN0aW9uICgpIHtcbiAgICBleHBlY3QodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigyKSkpKS50b0VxdWFsKHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIEZvcm1EYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc0Zvcm1EYXRhKG5ldyBGb3JtRGF0YSgpKSkudG9FcXVhbCh0cnVlKTtcbiAgfSk7XG5cbiAgLy8gVE9ETyBCbG9iIGlzIG5vdCBhIGNvbnN0cnVjdG9yIGluIFBoYW50b21KU1xuICAvLyBpdCgnc2hvdWxkIHZhbGlkYXRlIEJsb2InLCBmdW5jdGlvbiAoKSB7XG4gIC8vICAgZXhwZWN0KHV0aWxzLmlzQmxvYihuZXcgQmxvYigpKSkudG9FcXVhbCh0cnVlKTtcbiAgLy8gfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBTdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzU3RyaW5nKCcnKSkudG9FcXVhbCh0cnVlKTtcbiAgICBleHBlY3QodXRpbHMuaXNTdHJpbmcoe3RvU3RyaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnJzsgfX0pKS50b0VxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBOdW1iZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHV0aWxzLmlzTnVtYmVyKDEyMykpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KHV0aWxzLmlzTnVtYmVyKCcxMjMnKSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgVW5kZWZpbmVkJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc1VuZGVmaW5lZCgpKS50b0VxdWFsKHRydWUpO1xuICAgIGV4cGVjdCh1dGlscy5pc1VuZGVmaW5lZChudWxsKSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgT2JqZWN0JywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc09iamVjdCh7fSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KHV0aWxzLmlzT2JqZWN0KG51bGwpKS50b0VxdWFsKGZhbHNlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBEYXRlJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh1dGlscy5pc0RhdGUobmV3IERhdGUoKSkpLnRvRXF1YWwodHJ1ZSk7XG4gICAgZXhwZWN0KHV0aWxzLmlzRGF0ZShEYXRlLm5vdygpKSkudG9FcXVhbChmYWxzZSk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL2lzWC5zcGVjLmpzXG4gKiogbW9kdWxlIGlkID0gMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsInZhciBtZXJnZSA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscycpLm1lcmdlO1xuXG5kZXNjcmliZSgndXRpbHM6Om1lcmdlJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGJlIGltbXV0YWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IHt9O1xuICAgIHZhciBiID0ge2ZvbzogMTIzfTtcbiAgICB2YXIgYyA9IHtiYXI6IDQ1Nn07XG5cbiAgICBtZXJnZShhLCBiLCBjKTtcblxuICAgIGV4cGVjdCh0eXBlb2YgYS5mb28pLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICAgIGV4cGVjdCh0eXBlb2YgYS5iYXIpLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICAgIGV4cGVjdCh0eXBlb2YgYi5iYXIpLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICAgIGV4cGVjdCh0eXBlb2YgYy5mb28pLnRvRXF1YWwoJ3VuZGVmaW5lZCcpO1xuICB9KTtcbiAgXG4gIGl0KCdzaG91bGQgbWVyZ2UgcHJvcGVydGllcycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYSA9IHtmb286IDEyM307XG4gICAgdmFyIGIgPSB7YmFyOiA0NTZ9O1xuICAgIHZhciBjID0ge2ZvbzogNzg5fTtcbiAgICB2YXIgZCA9IG1lcmdlKGEsIGIsIGMpO1xuXG4gICAgZXhwZWN0KGQuZm9vKS50b0VxdWFsKDc4OSk7XG4gICAgZXhwZWN0KGQuYmFyKS50b0VxdWFsKDQ1Nik7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL21lcmdlLnNwZWMuanNcbiAqKiBtb2R1bGUgaWQgPSAxOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwidmFyIHRyaW0gPSByZXF1aXJlKCcuLi8uLi8uLi9saWIvdXRpbHMnKS50cmltO1xuXG5kZXNjcmliZSgndXRpbHM6OnRyaW0nLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdzaG91bGQgdHJpbSBzcGFjZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgZXhwZWN0KHRyaW0oJyAgZm9vICAnKSkudG9FcXVhbCgnZm9vJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdHJpbSB0YWJzJywgZnVuY3Rpb24gKCkge1xuICAgIGV4cGVjdCh0cmltKCdcXHRmb29cXHQnKSkudG9FcXVhbCgnZm9vJyk7XG4gIH0pO1xufSk7XG5cblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi90ZXN0L3NwZWNzL3V0aWxzL3RyaW0uc3BlYy5qc1xuICoqIG1vZHVsZSBpZCA9IDIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgUFJPVEVDVElPTl9QUkVGSVggPSAvXlxcKVxcXVxcfScsP1xcbi87XG52YXIgREVGQVVMVF9DT05URU5UX1RZUEUgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiAoZGF0YSwgaGVhZGVycykge1xuICAgIGlmKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyVmlldyhkYXRhKSkge1xuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkgJiYgIXV0aWxzLmlzRmlsZShkYXRhKSAmJiAhdXRpbHMuaXNCbG9iKGRhdGEpKSB7XG4gICAgICAvLyBTZXQgYXBwbGljYXRpb24vanNvbiBpZiBubyBDb250ZW50LVR5cGUgaGFzIGJlZW4gc3BlY2lmaWVkXG4gICAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnMpICYmIHV0aWxzLmlzVW5kZWZpbmVkKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddKSkge1xuICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoUFJPVEVDVElPTl9QUkVGSVgsICcnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIGhlYWRlcnM6IHtcbiAgICBjb21tb246IHtcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICAgIH0sXG4gICAgcGF0Y2g6IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKSxcbiAgICBwb3N0OiB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSksXG4gICAgcHV0OiB1dGlscy5tZXJnZShERUZBVUxUX0NPTlRFTlRfVFlQRSlcbiAgfSxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTidcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2RlZmF1bHRzLmpzXG4gKiogbW9kdWxlIGlkID0gMjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsKS5cbiAgICByZXBsYWNlKC8lNDAvZ2ksICdAJykuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIHVybFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJ1aWxkVXJsKHVybCwgcGFyYW1zKSB7XG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHZhciBwYXJ0cyA9IFtdO1xuXG4gIHV0aWxzLmZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdXRpbHMuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YWwgPSBbdmFsXTtcbiAgICB9XG5cbiAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gKHYpIHtcbiAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgIHYgPSBKU09OLnN0cmluZ2lmeSh2KTtcbiAgICAgIH1cbiAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgIH0pO1xuICB9KTtcblxuICBpZiAocGFydHMubGVuZ3RoID4gMCkge1xuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2hlbHBlcnMvYnVpbGRVcmwuanNcbiAqKiBtb2R1bGUgaWQgPSAyM1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgdmFyIGNvb2tpZSA9IFtdO1xuICAgIGNvb2tpZS5wdXNoKG5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcblxuICAgIGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuICAgIH1cblxuICAgIGlmIChzZWN1cmUgPT09IHRydWUpIHtcbiAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgfSxcblxuICByZWFkOiBmdW5jdGlvbiByZWFkKG5hbWUpIHtcbiAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gIH0sXG5cbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobmFtZSkge1xuICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gIH1cbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2hlbHBlcnMvY29va2llcy5qc1xuICoqIG1vZHVsZSBpZCA9IDI0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH0gSGVhZGVycyBwYXJzZWQgaW50byBhbiBvYmplY3RcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xuICB2YXIgcGFyc2VkID0ge30sIGtleSwgdmFsLCBpO1xuXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XG5cbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24obGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbCA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoaSArIDEpKTtcblxuICAgIGlmIChrZXkpIHtcbiAgICAgIHBhcnNlZFtrZXldID0gcGFyc2VkW2tleV0gPyBwYXJzZWRba2V5XSArICcsICcgKyB2YWwgOiB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy9wYXJzZUhlYWRlcnMuanNcbiAqKiBtb2R1bGUgaWQgPSAyNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcnIpIHtcbiAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcnIpO1xuICB9O1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy9zcHJlYWQuanNcbiAqKiBtb2R1bGUgaWQgPSAyNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbi8qKlxuICogVHJhbnNmb3JtIHRoZSBkYXRhIGZvciBhIHJlcXVlc3Qgb3IgYSByZXNwb25zZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxuICogQHBhcmFtIHtBcnJheX0gaGVhZGVycyBUaGUgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2VcbiAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb259IGZucyBBIHNpbmdsZSBmdW5jdGlvbiBvciBBcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGRhdGEsIGhlYWRlcnMsIGZucykge1xuICB1dGlscy5mb3JFYWNoKGZucywgZnVuY3Rpb24gKGZuKSB7XG4gICAgZGF0YSA9IGZuKGRhdGEsIGhlYWRlcnMpO1xuICB9KTtcblxuICByZXR1cm4gZGF0YTtcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2hlbHBlcnMvdHJhbnNmb3JtRGF0YS5qc1xuICoqIG1vZHVsZSBpZCA9IDI3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbnZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbnZhciBvcmlnaW5Vcmw7XG5cbi8qKlxuICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gdXJsUmVzb2x2ZSh1cmwpIHtcbiAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgaWYgKG1zaWUpIHtcbiAgICAvLyBJRSBuZWVkcyBhdHRyaWJ1dGUgc2V0IHR3aWNlIHRvIG5vcm1hbGl6ZSBwcm9wZXJ0aWVzXG4gICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG4gICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XG4gIH1cblxuICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcblxuICAvLyB1cmxQYXJzaW5nTm9kZSBwcm92aWRlcyB0aGUgVXJsVXRpbHMgaW50ZXJmYWNlIC0gaHR0cDovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybHV0aWxzXG4gIHJldHVybiB7XG4gICAgaHJlZjogdXJsUGFyc2luZ05vZGUuaHJlZixcbiAgICBwcm90b2NvbDogdXJsUGFyc2luZ05vZGUucHJvdG9jb2wgPyB1cmxQYXJzaW5nTm9kZS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLFxuICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXG4gICAgc2VhcmNoOiB1cmxQYXJzaW5nTm9kZS5zZWFyY2ggPyB1cmxQYXJzaW5nTm9kZS5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKSA6ICcnLFxuICAgIGhhc2g6IHVybFBhcnNpbmdOb2RlLmhhc2ggPyB1cmxQYXJzaW5nTm9kZS5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsXG4gICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxuICAgIHBvcnQ6IHVybFBhcnNpbmdOb2RlLnBvcnQsXG4gICAgcGF0aG5hbWU6ICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgP1xuICAgICAgICAgICAgICB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gIH07XG59XG5cbm9yaWdpblVybCA9IHVybFJlc29sdmUod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVcmwgVGhlIFVSTCB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdXJsSXNTYW1lT3JpZ2luKHJlcXVlc3RVcmwpIHtcbiAgdmFyIHBhcnNlZCA9ICh1dGlscy5pc1N0cmluZyhyZXF1ZXN0VXJsKSkgPyB1cmxSZXNvbHZlKHJlcXVlc3RVcmwpIDogcmVxdWVzdFVybDtcbiAgcmV0dXJuIChwYXJzZWQucHJvdG9jb2wgPT09IG9yaWdpblVybC5wcm90b2NvbCAmJlxuICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVXJsLmhvc3QpO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvaGVscGVycy91cmxJc1NhbWVPcmlnaW4uanNcbiAqKiBtb2R1bGUgaWQgPSAyOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmdsb2JhbCB0b1N0cmluZzp0cnVlKi9cblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheSh2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWwpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gRm9ybURhdGEsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGb3JtRGF0YV0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKHZhbC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgTnVtYmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0RhdGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZpbGVcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEZpbGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZpbGVdJztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJsb2JcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJsb2IsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jsb2IodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEJsb2JdJztcbn1cblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFN0cmluZyBmcmVlZCBvZiBleGNlc3Mgd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiB0cmltKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMqLywgJycpLnJlcGxhY2UoL1xccyokLywgJycpO1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IG9yIGFyZ3VtZW50cyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICovXG5mdW5jdGlvbiBmb3JFYWNoKG9iaiwgZm4pIHtcbiAgLy8gRG9uJ3QgYm90aGVyIGlmIG5vIHZhbHVlIHByb3ZpZGVkXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDaGVjayBpZiBvYmogaXMgYXJyYXktbGlrZVxuICB2YXIgaXNBcnJheUxpa2UgPSBpc0FycmF5KG9iaikgfHwgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFpc05hTihvYmoubGVuZ3RoKSk7XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiAhaXNBcnJheUxpa2UpIHtcbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgaWYgKGlzQXJyYXlMaWtlKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH1cbiAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gIGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qb2JqMSwgb2JqMiwgb2JqMywgLi4uKi8pIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3JFYWNoKGFyZ3VtZW50cywgZnVuY3Rpb24gKG9iaikge1xuICAgIGZvckVhY2gob2JqLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXI6IGlzQXJyYXlCdWZmZXIsXG4gIGlzRm9ybURhdGE6IGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3OiBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNGaWxlOiBpc0ZpbGUsXG4gIGlzQmxvYjogaXNCbG9iLFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIHRyaW06IHRyaW1cbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL3V0aWxzLmpzXG4gKiogbW9kdWxlIGlkID0gMjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGRlcHJlY2F0ZWRNZXRob2QgPSByZXF1aXJlKCcuL2hlbHBlcnMvZGVwcmVjYXRlZE1ldGhvZCcpO1xudmFyIGRpc3BhdGNoUmVxdWVzdCA9IHJlcXVpcmUoJy4vY29yZS9kaXNwYXRjaFJlcXVlc3QnKTtcbnZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSByZXF1aXJlKCcuL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyJyk7XG5cbi8vIFBvbHlmaWxsIEVTNiBQcm9taXNlIGlmIG5lZWRlZFxuKGZ1bmN0aW9uICgpIHtcbiAgLy8gd2VicGFjayBpcyBiZWluZyB1c2VkIHRvIHNldCBlczYtcHJvbWlzZSB0byB0aGUgbmF0aXZlIFByb21pc2VcbiAgLy8gZm9yIHRoZSBzdGFuZGFsb25lIGJ1aWxkLiBJdCdzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgcG9seWZpbGwgZXhpc3RzLlxuICB2YXIgUCA9IHJlcXVpcmUoJ2VzNi1wcm9taXNlJyk7XG4gIGlmIChQICYmIHR5cGVvZiBQLnBvbHlmaWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgUC5wb2x5ZmlsbCgpO1xuICB9XG59KSgpO1xuXG52YXIgYXhpb3MgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGF4aW9zKGNvbmZpZykge1xuICBjb25maWcgPSB1dGlscy5tZXJnZSh7XG4gICAgbWV0aG9kOiAnZ2V0JyxcbiAgICBoZWFkZXJzOiB7fSxcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0cy50cmFuc2Zvcm1SZXF1ZXN0LFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZVxuICB9LCBjb25maWcpO1xuXG4gIC8vIERvbid0IGFsbG93IG92ZXJyaWRpbmcgZGVmYXVsdHMud2l0aENyZWRlbnRpYWxzXG4gIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgPSBjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGRlZmF1bHRzLndpdGhDcmVkZW50aWFscztcblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgYXhpb3MuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICBheGlvcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIC8vIFByb3ZpZGUgYWxpYXMgZm9yIHN1Y2Nlc3NcbiAgcHJvbWlzZS5zdWNjZXNzID0gZnVuY3Rpb24gc3VjY2Vzcyhmbikge1xuICAgIGRlcHJlY2F0ZWRNZXRob2QoJ3N1Y2Nlc3MnLCAndGhlbicsICdodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9heGlvcy9ibG9iL21hc3Rlci9SRUFETUUubWQjcmVzcG9uc2UtYXBpJyk7XG5cbiAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIGZuKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2UuY29uZmlnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfTtcblxuICAvLyBQcm92aWRlIGFsaWFzIGZvciBlcnJvclxuICBwcm9taXNlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IoZm4pIHtcbiAgICBkZXByZWNhdGVkTWV0aG9kKCdlcnJvcicsICdjYXRjaCcsICdodHRwczovL2dpdGh1Yi5jb20vbXphYnJpc2tpZS9heGlvcy9ibG9iL21hc3Rlci9SRUFETUUubWQjcmVzcG9uc2UtYXBpJyk7XG5cbiAgICBwcm9taXNlLnRoZW4obnVsbCwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgIGZuKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycywgcmVzcG9uc2UuY29uZmlnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfTtcblxuICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbi8vIEV4cG9zZSBkZWZhdWx0c1xuYXhpb3MuZGVmYXVsdHMgPSBkZWZhdWx0cztcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcbmF4aW9zLnNwcmVhZCA9IHJlcXVpcmUoJy4vaGVscGVycy9zcHJlYWQnKTtcblxuLy8gRXhwb3NlIGludGVyY2VwdG9yc1xuYXhpb3MuaW50ZXJjZXB0b3JzID0ge1xuICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKCksXG4gIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcbn07XG5cbi8vIFByb3ZpZGUgYWxpYXNlcyBmb3Igc3VwcG9ydGVkIHJlcXVlc3QgbWV0aG9kc1xuKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gY3JlYXRlU2hvcnRNZXRob2RzKCkge1xuICAgIHV0aWxzLmZvckVhY2goYXJndW1lbnRzLCBmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBheGlvc1ttZXRob2RdID0gZnVuY3Rpb24gKHVybCwgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBheGlvcyh1dGlscy5tZXJnZShjb25maWcgfHwge30sIHtcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICB1cmw6IHVybFxuICAgICAgICB9KSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hvcnRNZXRob2RzV2l0aERhdGEoKSB7XG4gICAgdXRpbHMuZm9yRWFjaChhcmd1bWVudHMsIGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIGF4aW9zW21ldGhvZF0gPSBmdW5jdGlvbiAodXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIGF4aW9zKHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSkpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVNob3J0TWV0aG9kcygnZGVsZXRlJywgJ2dldCcsICdoZWFkJyk7XG4gIGNyZWF0ZVNob3J0TWV0aG9kc1dpdGhEYXRhKCdwb3N0JywgJ3B1dCcsICdwYXRjaCcpO1xufSkoKTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvYXhpb3MuanNcbiAqKiBtb2R1bGUgaWQgPSAzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFN1cHBseSBhIHdhcm5pbmcgdG8gdGhlIGRldmVsb3BlciB0aGF0IGEgbWV0aG9kIHRoZXkgYXJlIHVzaW5nXG4gKiBoYXMgYmVlbiBkZXByZWNhdGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgVGhlIG5hbWUgb2YgdGhlIGRlcHJlY2F0ZWQgbWV0aG9kXG4gKiBAcGFyYW0ge3N0cmluZ30gW2luc3RlYWRdIFRoZSBhbHRlcm5hdGUgbWV0aG9kIHRvIHVzZSBpZiBhcHBsaWNhYmxlXG4gKiBAcGFyYW0ge3N0cmluZ30gW2RvY3NdIFRoZSBkb2N1bWVudGF0aW9uIFVSTCB0byBnZXQgZnVydGhlciBkZXRhaWxzXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVwcmVjYXRlZE1ldGhvZChtZXRob2QsIGluc3RlYWQsIGRvY3MpIHtcbiAgdHJ5IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnREVQUkVDQVRFRCBtZXRob2QgYCcgKyBtZXRob2QgKyAnYC4nICtcbiAgICAgIChpbnN0ZWFkID8gJyBVc2UgYCcgKyBpbnN0ZWFkICsgJ2AgaW5zdGVhZC4nIDogJycpICtcbiAgICAgICcgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG5cbiAgICBpZiAoZG9jcykge1xuICAgICAgY29uc29sZS53YXJuKCdGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2FnZSBzZWUgJyArIGRvY3MpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2hlbHBlcnMvZGVwcmVjYXRlZE1ldGhvZC5qc1xuICoqIG1vZHVsZSBpZCA9IDMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgd2hpY2hldmVyIGFkYXB0ZXJcbiAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRpc3BhdGNoUmVxdWVzdChjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9yIGJyb3dzZXJzIHVzZSBYSFIgYWRhcHRlclxuICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlcXVpcmUoJy4uL2FkYXB0ZXJzL3hocicpKHJlc29sdmUsIHJlamVjdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICAgIC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXF1aXJlKCcuLi9hZGFwdGVycy9odHRwJykocmVzb2x2ZSwgcmVqZWN0LCBjb25maWcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qc1xuICoqIG1vZHVsZSBpZCA9IDMyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gSW50ZXJjZXB0b3JNYW5hZ2VyKCkge1xuICB0aGlzLmhhbmRsZXJzID0gW107XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gKlxuICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIChmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gIHRoaXMuaGFuZGxlcnMucHVzaCh7XG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXG4gICAgcmVqZWN0ZWQ6IHJlamVjdGVkXG4gIH0pO1xuICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaWQgVGhlIElEIHRoYXQgd2FzIHJldHVybmVkIGJ5IGB1c2VgXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXG4gKlxuICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgcmVtb3ZlYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoZm4pIHtcbiAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiAoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMzNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuLypnbG9iYWwgQWN0aXZlWE9iamVjdDp0cnVlKi9cblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi8uLi9kZWZhdWx0cycpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIGJ1aWxkVXJsID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL2J1aWxkVXJsJyk7XG52YXIgY29va2llcyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9jb29raWVzJyk7XG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xudmFyIHRyYW5zZm9ybURhdGEgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvdHJhbnNmb3JtRGF0YScpO1xudmFyIHVybElzU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy91cmxJc1NhbWVPcmlnaW4nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKHJlc29sdmUsIHJlamVjdCwgY29uZmlnKSB7XG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gTWVyZ2UgaGVhZGVyc1xuICB2YXIgcmVxdWVzdEhlYWRlcnMgPSB1dGlscy5tZXJnZShcbiAgICBkZWZhdWx0cy5oZWFkZXJzLmNvbW1vbixcbiAgICBkZWZhdWx0cy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzIHx8IHt9XG4gICk7XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkpIHtcbiAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIHJlcXVlc3RcbiAgdmFyIHJlcXVlc3QgPSBuZXcgKFhNTEh0dHBSZXF1ZXN0IHx8IEFjdGl2ZVhPYmplY3QpKCdNaWNyb3NvZnQuWE1MSFRUUCcpO1xuICByZXF1ZXN0Lm9wZW4oY29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBidWlsZFVybChjb25maWcudXJsLCBjb25maWcucGFyYW1zKSwgdHJ1ZSk7XG5cbiAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZVxuICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gcGFyc2VIZWFkZXJzKHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO1xuICAgICAgdmFyIHJlc3BvbnNlRGF0YSA9IFsndGV4dCcsICcnXS5pbmRleE9mKGNvbmZpZy5yZXNwb25zZVR5cGUgfHwgJycpICE9PSAtMSA/IHJlcXVlc3QucmVzcG9uc2VUZXh0IDogcmVxdWVzdC5yZXNwb25zZTtcbiAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgZGF0YTogdHJhbnNmb3JtRGF0YShcbiAgICAgICAgICByZXNwb25zZURhdGEsXG4gICAgICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAgIGNvbmZpZy50cmFuc2Zvcm1SZXNwb25zZVxuICAgICAgICApLFxuICAgICAgICBzdGF0dXM6IHJlcXVlc3Quc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXF1ZXN0LnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcbiAgICAgICAgY29uZmlnOiBjb25maWdcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlc29sdmUgb3IgcmVqZWN0IHRoZSBQcm9taXNlIGJhc2VkIG9uIHRoZSBzdGF0dXNcbiAgICAgIChyZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgPCAzMDAgP1xuICAgICAgICByZXNvbHZlIDpcbiAgICAgICAgcmVqZWN0KShyZXNwb25zZSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgdmFyIHhzcmZWYWx1ZSA9IHVybElzU2FtZU9yaWdpbihjb25maWcudXJsKSA/XG4gICAgICBjb29raWVzLnJlYWQoY29uZmlnLnhzcmZDb29raWVOYW1lIHx8IGRlZmF1bHRzLnhzcmZDb29raWVOYW1lKSA6XG4gICAgICB1bmRlZmluZWQ7XG4gIGlmICh4c3JmVmFsdWUpIHtcbiAgICByZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWUgfHwgZGVmYXVsdHMueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xuICB9XG5cbiAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgdXRpbHMuZm9yRWFjaChyZXF1ZXN0SGVhZGVycywgZnVuY3Rpb24gKHZhbCwga2V5KSB7XG4gICAgLy8gUmVtb3ZlIENvbnRlbnQtVHlwZSBpZiBkYXRhIGlzIHVuZGVmaW5lZFxuICAgIGlmICghZGF0YSAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgIGRlbGV0ZSByZXF1ZXN0SGVhZGVyc1trZXldO1xuICAgIH1cbiAgICAvLyBPdGhlcndpc2UgYWRkIGhlYWRlciB0byB0aGUgcmVxdWVzdFxuICAgIGVsc2Uge1xuICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgaWYgKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gIH1cblxuICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gIGlmIChjb25maWcucmVzcG9uc2VUeXBlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAocmVxdWVzdC5yZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKGRhdGEpKSB7XG4gICAgZGF0YSA9IG5ldyBEYXRhVmlldyhkYXRhKTtcbiAgfVxuXG4gIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgcmVxdWVzdC5zZW5kKGRhdGEpO1xufTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9saWIvYWRhcHRlcnMveGhyLmpzXG4gKiogbW9kdWxlIGlkID0gMzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8qIVxuICogQG92ZXJ2aWV3IGVzNi1wcm9taXNlIC0gYSB0aW55IGltcGxlbWVudGF0aW9uIG9mIFByb21pc2VzL0ErLlxuICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKGMpIDIwMTQgWWVodWRhIEthdHosIFRvbSBEYWxlLCBTdGVmYW4gUGVubmVyIGFuZCBjb250cmlidXRvcnMgKENvbnZlcnNpb24gdG8gRVM2IEFQSSBieSBKYWtlIEFyY2hpYmFsZClcbiAqIEBsaWNlbnNlICAgTGljZW5zZWQgdW5kZXIgTUlUIGxpY2Vuc2VcbiAqICAgICAgICAgICAgU2VlIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qYWtlYXJjaGliYWxkL2VzNi1wcm9taXNlL21hc3Rlci9MSUNFTlNFXG4gKiBAdmVyc2lvbiAgIDIuMC4xXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgZnVuY3Rpb24gJCR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJHV0aWxzJCRpc0Z1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJHV0aWxzJCRpc01heWJlVGhlbmFibGUoeCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiB4ICE9PSBudWxsO1xuICAgIH1cblxuICAgIHZhciAkJHV0aWxzJCRfaXNBcnJheTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheSkge1xuICAgICAgJCR1dGlscyQkX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCR1dGlscyQkX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuICAgIH1cblxuICAgIHZhciAkJHV0aWxzJCRpc0FycmF5ID0gJCR1dGlscyQkX2lzQXJyYXk7XG4gICAgdmFyICQkdXRpbHMkJG5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH07XG4gICAgZnVuY3Rpb24gJCR1dGlscyQkRigpIHsgfVxuXG4gICAgdmFyICQkdXRpbHMkJG9fY3JlYXRlID0gKE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlY29uZCBhcmd1bWVudCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG8gIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICAkJHV0aWxzJCRGLnByb3RvdHlwZSA9IG87XG4gICAgICByZXR1cm4gbmV3ICQkdXRpbHMkJEYoKTtcbiAgICB9KTtcblxuICAgIHZhciAkJGFzYXAkJGxlbiA9IDA7XG5cbiAgICB2YXIgJCRhc2FwJCRkZWZhdWx0ID0gZnVuY3Rpb24gYXNhcChjYWxsYmFjaywgYXJnKSB7XG4gICAgICAkJGFzYXAkJHF1ZXVlWyQkYXNhcCQkbGVuXSA9IGNhbGxiYWNrO1xuICAgICAgJCRhc2FwJCRxdWV1ZVskJGFzYXAkJGxlbiArIDFdID0gYXJnO1xuICAgICAgJCRhc2FwJCRsZW4gKz0gMjtcbiAgICAgIGlmICgkJGFzYXAkJGxlbiA9PT0gMikge1xuICAgICAgICAvLyBJZiBsZW4gaXMgMSwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gYXN5bmMgZmx1c2guXG4gICAgICAgIC8vIElmIGFkZGl0aW9uYWwgY2FsbGJhY2tzIGFyZSBxdWV1ZWQgYmVmb3JlIHRoZSBxdWV1ZSBpcyBmbHVzaGVkLCB0aGV5XG4gICAgICAgIC8vIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgZmx1c2ggdGhhdCB3ZSBhcmUgc2NoZWR1bGluZy5cbiAgICAgICAgJCRhc2FwJCRzY2hlZHVsZUZsdXNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciAkJGFzYXAkJGJyb3dzZXJHbG9iYWwgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpID8gd2luZG93IDoge307XG4gICAgdmFyICQkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPSAkJGFzYXAkJGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCAkJGFzYXAkJGJyb3dzZXJHbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIC8vIHRlc3QgZm9yIHdlYiB3b3JrZXIgYnV0IG5vdCBpbiBJRTEwXG4gICAgdmFyICQkYXNhcCQkaXNXb3JrZXIgPSB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgaW1wb3J0U2NyaXB0cyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCc7XG5cbiAgICAvLyBub2RlXG4gICAgZnVuY3Rpb24gJCRhc2FwJCR1c2VOZXh0VGljaygpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygkJGFzYXAkJGZsdXNoKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCRhc2FwJCR1c2VNdXRhdGlvbk9ic2VydmVyKCkge1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdmFyIG9ic2VydmVyID0gbmV3ICQkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoJCRhc2FwJCRmbHVzaCk7XG4gICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIG5vZGUuZGF0YSA9IChpdGVyYXRpb25zID0gKytpdGVyYXRpb25zICUgMik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHdlYiB3b3JrZXJcbiAgICBmdW5jdGlvbiAkJGFzYXAkJHVzZU1lc3NhZ2VDaGFubmVsKCkge1xuICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gJCRhc2FwJCRmbHVzaDtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkYXNhcCQkdXNlU2V0VGltZW91dCgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dCgkJGFzYXAkJGZsdXNoLCAxKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyICQkYXNhcCQkcXVldWUgPSBuZXcgQXJyYXkoMTAwMCk7XG5cbiAgICBmdW5jdGlvbiAkJGFzYXAkJGZsdXNoKCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkJGFzYXAkJGxlbjsgaSs9Mikge1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSAkJGFzYXAkJHF1ZXVlW2ldO1xuICAgICAgICB2YXIgYXJnID0gJCRhc2FwJCRxdWV1ZVtpKzFdO1xuXG4gICAgICAgIGNhbGxiYWNrKGFyZyk7XG5cbiAgICAgICAgJCRhc2FwJCRxdWV1ZVtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgJCRhc2FwJCRxdWV1ZVtpKzFdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAkJGFzYXAkJGxlbiA9IDA7XG4gICAgfVxuXG4gICAgdmFyICQkYXNhcCQkc2NoZWR1bGVGbHVzaDtcblxuICAgIC8vIERlY2lkZSB3aGF0IGFzeW5jIG1ldGhvZCB0byB1c2UgdG8gdHJpZ2dlcmluZyBwcm9jZXNzaW5nIG9mIHF1ZXVlZCBjYWxsYmFja3M6XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXScpIHtcbiAgICAgICQkYXNhcCQkc2NoZWR1bGVGbHVzaCA9ICQkYXNhcCQkdXNlTmV4dFRpY2soKTtcbiAgICB9IGVsc2UgaWYgKCQkYXNhcCQkQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICQkYXNhcCQkc2NoZWR1bGVGbHVzaCA9ICQkYXNhcCQkdXNlTXV0YXRpb25PYnNlcnZlcigpO1xuICAgIH0gZWxzZSBpZiAoJCRhc2FwJCRpc1dvcmtlcikge1xuICAgICAgJCRhc2FwJCRzY2hlZHVsZUZsdXNoID0gJCRhc2FwJCR1c2VNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAkJGFzYXAkJHNjaGVkdWxlRmx1c2ggPSAkJGFzYXAkJHVzZVNldFRpbWVvdXQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkbm9vcCgpIHt9XG4gICAgdmFyICQkJGludGVybmFsJCRQRU5ESU5HICAgPSB2b2lkIDA7XG4gICAgdmFyICQkJGludGVybmFsJCRGVUxGSUxMRUQgPSAxO1xuICAgIHZhciAkJCRpbnRlcm5hbCQkUkVKRUNURUQgID0gMjtcbiAgICB2YXIgJCQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SID0gbmV3ICQkJGludGVybmFsJCRFcnJvck9iamVjdCgpO1xuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJHNlbGZGdWxsZmlsbG1lbnQoKSB7XG4gICAgICByZXR1cm4gbmV3IFR5cGVFcnJvcihcIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGZcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJGNhbm5vdFJldHVybk93bigpIHtcbiAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkZ2V0VGhlbihwcm9taXNlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAkJCRpbnRlcm5hbCQkR0VUX1RIRU5fRVJST1IuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuICQkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkdHJ5VGhlbih0aGVuLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGVuLmNhbGwodmFsdWUsIGZ1bGZpbGxtZW50SGFuZGxlciwgcmVqZWN0aW9uSGFuZGxlcik7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCB0aGVuYWJsZSwgdGhlbikge1xuICAgICAgICQkYXNhcCQkZGVmYXVsdChmdW5jdGlvbihwcm9taXNlKSB7XG4gICAgICAgIHZhciBzZWFsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGVycm9yID0gJCQkaW50ZXJuYWwkJHRyeVRoZW4odGhlbiwgdGhlbmFibGUsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuICAgICAgICAgIGlmICh0aGVuYWJsZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICQkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgaWYgKHNlYWxlZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgICAgIGlmICghc2VhbGVkICYmIGVycm9yKSB7XG4gICAgICAgICAgc2VhbGVkID0gdHJ1ZTtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gICAgICBpZiAodGhlbmFibGUuX3N0YXRlID09PSAkJCRpbnRlcm5hbCQkRlVMRklMTEVEKSB7XG4gICAgICAgICQkJGludGVybmFsJCRmdWxmaWxsKHByb21pc2UsIHRoZW5hYmxlLl9yZXN1bHQpO1xuICAgICAgfSBlbHNlIGlmIChwcm9taXNlLl9zdGF0ZSA9PT0gJCQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkJCRpbnRlcm5hbCQkc3Vic2NyaWJlKHRoZW5hYmxlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUpIHtcbiAgICAgIGlmIChtYXliZVRoZW5hYmxlLmNvbnN0cnVjdG9yID09PSBwcm9taXNlLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICQkJGludGVybmFsJCRoYW5kbGVPd25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0aGVuID0gJCQkaW50ZXJuYWwkJGdldFRoZW4obWF5YmVUaGVuYWJsZSk7XG5cbiAgICAgICAgaWYgKHRoZW4gPT09ICQkJGludGVybmFsJCRHRVRfVEhFTl9FUlJPUikge1xuICAgICAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgJCQkaW50ZXJuYWwkJEdFVF9USEVOX0VSUk9SLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgICAgfSBlbHNlIGlmICgkJHV0aWxzJCRpc0Z1bmN0aW9uKHRoZW4pKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJGhhbmRsZUZvcmVpZ25UaGVuYWJsZShwcm9taXNlLCBtYXliZVRoZW5hYmxlLCB0aGVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCBtYXliZVRoZW5hYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRyZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gICAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCAkJCRpbnRlcm5hbCQkc2VsZkZ1bGxmaWxsbWVudCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoJCR1dGlscyQkb2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRwdWJsaXNoUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICAgIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgICAgIHByb21pc2UuX29uZXJyb3IocHJvbWlzZS5fcmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgJCQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdmFsdWUpIHtcbiAgICAgIGlmIChwcm9taXNlLl9zdGF0ZSAhPT0gJCQkaW50ZXJuYWwkJFBFTkRJTkcpIHsgcmV0dXJuOyB9XG5cbiAgICAgIHByb21pc2UuX3Jlc3VsdCA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fc3RhdGUgPSAkJCRpbnRlcm5hbCQkRlVMRklMTEVEO1xuXG4gICAgICBpZiAocHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkJGFzYXAkJGRlZmF1bHQoJCQkaW50ZXJuYWwkJHB1Ymxpc2gsIHByb21pc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgICBpZiAocHJvbWlzZS5fc3RhdGUgIT09ICQkJGludGVybmFsJCRQRU5ESU5HKSB7IHJldHVybjsgfVxuICAgICAgcHJvbWlzZS5fc3RhdGUgPSAkJCRpbnRlcm5hbCQkUkVKRUNURUQ7XG4gICAgICBwcm9taXNlLl9yZXN1bHQgPSByZWFzb247XG5cbiAgICAgICQkYXNhcCQkZGVmYXVsdCgkJCRpbnRlcm5hbCQkcHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVycztcbiAgICAgIHZhciBsZW5ndGggPSBzdWJzY3JpYmVycy5sZW5ndGg7XG5cbiAgICAgIHBhcmVudC5fb25lcnJvciA9IG51bGw7XG5cbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aF0gPSBjaGlsZDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArICQkJGludGVybmFsJCRGVUxGSUxMRURdID0gb25GdWxmaWxsbWVudDtcbiAgICAgIHN1YnNjcmliZXJzW2xlbmd0aCArICQkJGludGVybmFsJCRSRUpFQ1RFRF0gID0gb25SZWplY3Rpb247XG5cbiAgICAgIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgICAgICAkJGFzYXAkJGRlZmF1bHQoJCQkaW50ZXJuYWwkJHB1Ymxpc2gsIHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJHB1Ymxpc2gocHJvbWlzZSkge1xuICAgICAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gICAgICB2YXIgc2V0dGxlZCA9IHByb21pc2UuX3N0YXRlO1xuXG4gICAgICBpZiAoc3Vic2NyaWJlcnMubGVuZ3RoID09PSAwKSB7IHJldHVybjsgfVxuXG4gICAgICB2YXIgY2hpbGQsIGNhbGxiYWNrLCBkZXRhaWwgPSBwcm9taXNlLl9yZXN1bHQ7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgY2hpbGQgPSBzdWJzY3JpYmVyc1tpXTtcbiAgICAgICAgY2FsbGJhY2sgPSBzdWJzY3JpYmVyc1tpICsgc2V0dGxlZF07XG5cbiAgICAgICAgaWYgKGNoaWxkKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJGludm9rZUNhbGxiYWNrKHNldHRsZWQsIGNoaWxkLCBjYWxsYmFjaywgZGV0YWlsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhkZXRhaWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gJCQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCkge1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgfVxuXG4gICAgdmFyICQkJGludGVybmFsJCRUUllfQ0FUQ0hfRVJST1IgPSBuZXcgJCQkaW50ZXJuYWwkJEVycm9yT2JqZWN0KCk7XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGU7XG4gICAgICAgIHJldHVybiAkJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBwcm9taXNlLCBjYWxsYmFjaywgZGV0YWlsKSB7XG4gICAgICB2YXIgaGFzQ2FsbGJhY2sgPSAkJHV0aWxzJCRpc0Z1bmN0aW9uKGNhbGxiYWNrKSxcbiAgICAgICAgICB2YWx1ZSwgZXJyb3IsIHN1Y2NlZWRlZCwgZmFpbGVkO1xuXG4gICAgICBpZiAoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgdmFsdWUgPSAkJCRpbnRlcm5hbCQkdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSAkJCRpbnRlcm5hbCQkVFJZX0NBVENIX0VSUk9SKSB7XG4gICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvciA9IHZhbHVlLmVycm9yO1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCAkJCRpbnRlcm5hbCQkY2Fubm90UmV0dXJuT3duKCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRldGFpbDtcbiAgICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSAkJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICAvLyBub29wXG4gICAgICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gJCQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHNldHRsZWQgPT09ICQkJGludGVybmFsJCRSRUpFQ1RFRCkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJCRpbnRlcm5hbCQkaW5pdGlhbGl6ZVByb21pc2UocHJvbWlzZSwgcmVzb2x2ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHZhbHVlKXtcbiAgICAgICAgICAkJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGVudW1lcmF0b3IkJG1ha2VTZXR0bGVkUmVzdWx0KHN0YXRlLCBwb3NpdGlvbiwgdmFsdWUpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gJCQkaW50ZXJuYWwkJEZVTEZJTExFRCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0YXRlOiAnZnVsZmlsbGVkJyxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdGU6ICdyZWplY3RlZCcsXG4gICAgICAgICAgcmVhc29uOiB2YWx1ZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3IoQ29uc3RydWN0b3IsIGlucHV0LCBhYm9ydE9uUmVqZWN0LCBsYWJlbCkge1xuICAgICAgdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgICAgdGhpcy5wcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKCQkJGludGVybmFsJCRub29wLCBsYWJlbCk7XG4gICAgICB0aGlzLl9hYm9ydE9uUmVqZWN0ID0gYWJvcnRPblJlamVjdDtcblxuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlSW5wdXQoaW5wdXQpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0ICAgICA9IGlucHV0O1xuICAgICAgICB0aGlzLmxlbmd0aCAgICAgPSBpbnB1dC5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3JlbWFpbmluZyA9IGlucHV0Lmxlbmd0aDtcblxuICAgICAgICB0aGlzLl9pbml0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJGZ1bGZpbGwodGhpcy5wcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMDtcbiAgICAgICAgICB0aGlzLl9lbnVtZXJhdGUoKTtcbiAgICAgICAgICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgICAkJCRpbnRlcm5hbCQkZnVsZmlsbCh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHRoaXMucHJvbWlzZSwgdGhpcy5fdmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0ZUlucHV0ID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgIHJldHVybiAkJHV0aWxzJCRpc0FycmF5KGlucHV0KTtcbiAgICB9O1xuXG4gICAgJCQkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Jyk7XG4gICAgfTtcblxuICAgICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3IucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9yZXN1bHQgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICB2YXIgJCQkZW51bWVyYXRvciQkZGVmYXVsdCA9ICQkJGVudW1lcmF0b3IkJEVudW1lcmF0b3I7XG5cbiAgICAkJCRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGVuZ3RoICA9IHRoaXMubGVuZ3RoO1xuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnByb21pc2U7XG4gICAgICB2YXIgaW5wdXQgICA9IHRoaXMuX2lucHV0O1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09ICQkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLl9lYWNoRW50cnkoaW5wdXRbaV0sIGkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAkJCRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fZWFjaEVudHJ5ID0gZnVuY3Rpb24oZW50cnksIGkpIHtcbiAgICAgIHZhciBjID0gdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvcjtcbiAgICAgIGlmICgkJHV0aWxzJCRpc01heWJlVGhlbmFibGUoZW50cnkpKSB7XG4gICAgICAgIGlmIChlbnRyeS5jb25zdHJ1Y3RvciA9PT0gYyAmJiBlbnRyeS5fc3RhdGUgIT09ICQkJGludGVybmFsJCRQRU5ESU5HKSB7XG4gICAgICAgICAgZW50cnkuX29uZXJyb3IgPSBudWxsO1xuICAgICAgICAgIHRoaXMuX3NldHRsZWRBdChlbnRyeS5fc3RhdGUsIGksIGVudHJ5Ll9yZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3dpbGxTZXR0bGVBdChjLnJlc29sdmUoZW50cnkpLCBpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nLS07XG4gICAgICAgIHRoaXMuX3Jlc3VsdFtpXSA9IHRoaXMuX21ha2VSZXN1bHQoJCQkaW50ZXJuYWwkJEZVTEZJTExFRCwgaSwgZW50cnkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAkJCRlbnVtZXJhdG9yJCRFbnVtZXJhdG9yLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24oc3RhdGUsIGksIHZhbHVlKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IHRoaXMucHJvbWlzZTtcblxuICAgICAgaWYgKHByb21pc2UuX3N0YXRlID09PSAkJCRpbnRlcm5hbCQkUEVORElORykge1xuICAgICAgICB0aGlzLl9yZW1haW5pbmctLTtcblxuICAgICAgICBpZiAodGhpcy5fYWJvcnRPblJlamVjdCAmJiBzdGF0ZSA9PT0gJCQkaW50ZXJuYWwkJFJFSkVDVEVEKSB7XG4gICAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVzdWx0W2ldID0gdGhpcy5fbWFrZVJlc3VsdChzdGF0ZSwgaSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9yZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJGZ1bGZpbGwocHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgJCQkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX21ha2VSZXN1bHQgPSBmdW5jdGlvbihzdGF0ZSwgaSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuXG4gICAgJCQkZW51bWVyYXRvciQkRW51bWVyYXRvci5wcm90b3R5cGUuX3dpbGxTZXR0bGVBdCA9IGZ1bmN0aW9uKHByb21pc2UsIGkpIHtcbiAgICAgIHZhciBlbnVtZXJhdG9yID0gdGhpcztcblxuICAgICAgJCQkaW50ZXJuYWwkJHN1YnNjcmliZShwcm9taXNlLCB1bmRlZmluZWQsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGVudW1lcmF0b3IuX3NldHRsZWRBdCgkJCRpbnRlcm5hbCQkRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgZW51bWVyYXRvci5fc2V0dGxlZEF0KCQkJGludGVybmFsJCRSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgJCRwcm9taXNlJGFsbCQkZGVmYXVsdCA9IGZ1bmN0aW9uIGFsbChlbnRyaWVzLCBsYWJlbCkge1xuICAgICAgcmV0dXJuIG5ldyAkJCRlbnVtZXJhdG9yJCRkZWZhdWx0KHRoaXMsIGVudHJpZXMsIHRydWUgLyogYWJvcnQgb24gcmVqZWN0ICovLCBsYWJlbCkucHJvbWlzZTtcbiAgICB9O1xuXG4gICAgdmFyICQkcHJvbWlzZSRyYWNlJCRkZWZhdWx0ID0gZnVuY3Rpb24gcmFjZShlbnRyaWVzLCBsYWJlbCkge1xuICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKCQkJGludGVybmFsJCRub29wLCBsYWJlbCk7XG5cbiAgICAgIGlmICghJCR1dGlscyQkaXNBcnJheShlbnRyaWVzKSkge1xuICAgICAgICAkJCRpbnRlcm5hbCQkcmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4nKSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGVuZ3RoID0gZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIGZ1bmN0aW9uIG9uRnVsZmlsbG1lbnQodmFsdWUpIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlamVjdGlvbihyZWFzb24pIHtcbiAgICAgICAgJCQkaW50ZXJuYWwkJHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgcHJvbWlzZS5fc3RhdGUgPT09ICQkJGludGVybmFsJCRQRU5ESU5HICYmIGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAkJCRpbnRlcm5hbCQkc3Vic2NyaWJlKENvbnN0cnVjdG9yLnJlc29sdmUoZW50cmllc1tpXSksIHVuZGVmaW5lZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgdmFyICQkcHJvbWlzZSRyZXNvbHZlJCRkZWZhdWx0ID0gZnVuY3Rpb24gcmVzb2x2ZShvYmplY3QsIGxhYmVsKSB7XG4gICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICAgICAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENvbnN0cnVjdG9yKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKCQkJGludGVybmFsJCRub29wLCBsYWJlbCk7XG4gICAgICAkJCRpbnRlcm5hbCQkcmVzb2x2ZShwcm9taXNlLCBvYmplY3QpO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHZhciAkJHByb21pc2UkcmVqZWN0JCRkZWZhdWx0ID0gZnVuY3Rpb24gcmVqZWN0KHJlYXNvbiwgbGFiZWwpIHtcbiAgICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSB0aGlzO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3IoJCQkaW50ZXJuYWwkJG5vb3AsIGxhYmVsKTtcbiAgICAgICQkJGludGVybmFsJCRyZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICB2YXIgJCRlczYkcHJvbWlzZSRwcm9taXNlJCRjb3VudGVyID0gMDtcblxuICAgIGZ1bmN0aW9uICQkZXM2JHByb21pc2UkcHJvbWlzZSQkbmVlZHNSZXNvbHZlcigpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiAkJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzTmV3KCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgJCRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0ID0gJCRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlO1xuXG4gICAgLyoqXG4gICAgICBQcm9taXNlIG9iamVjdHMgcmVwcmVzZW50IHRoZSBldmVudHVhbCByZXN1bHQgb2YgYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4gVGhlXG4gICAgICBwcmltYXJ5IHdheSBvZiBpbnRlcmFjdGluZyB3aXRoIGEgcHJvbWlzZSBpcyB0aHJvdWdoIGl0cyBgdGhlbmAgbWV0aG9kLCB3aGljaFxuICAgICAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2XigJlzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZSByZWFzb25cbiAgICAgIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBUZXJtaW5vbG9neVxuICAgICAgLS0tLS0tLS0tLS1cblxuICAgICAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgICAgIC0gYHRoZW5hYmxlYCBpcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgYHRoZW5gIG1ldGhvZC5cbiAgICAgIC0gYHZhbHVlYCBpcyBhbnkgbGVnYWwgSmF2YVNjcmlwdCB2YWx1ZSAoaW5jbHVkaW5nIHVuZGVmaW5lZCwgYSB0aGVuYWJsZSwgb3IgYSBwcm9taXNlKS5cbiAgICAgIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAgICAgLSBgcmVhc29uYCBpcyBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoeSBhIHByb21pc2Ugd2FzIHJlamVjdGVkLlxuICAgICAgLSBgc2V0dGxlZGAgdGhlIGZpbmFsIHJlc3Rpbmcgc3RhdGUgb2YgYSBwcm9taXNlLCBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG5cbiAgICAgIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICAgICAgUHJvbWlzZXMgdGhhdCBhcmUgZnVsZmlsbGVkIGhhdmUgYSBmdWxmaWxsbWVudCB2YWx1ZSBhbmQgYXJlIGluIHRoZSBmdWxmaWxsZWRcbiAgICAgIHN0YXRlLiAgUHJvbWlzZXMgdGhhdCBhcmUgcmVqZWN0ZWQgaGF2ZSBhIHJlamVjdGlvbiByZWFzb24gYW5kIGFyZSBpbiB0aGVcbiAgICAgIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gICAgICBQcm9taXNlcyBjYW4gYWxzbyBiZSBzYWlkIHRvICpyZXNvbHZlKiBhIHZhbHVlLiAgSWYgdGhpcyB2YWx1ZSBpcyBhbHNvIGFcbiAgICAgIHByb21pc2UsIHRoZW4gdGhlIG9yaWdpbmFsIHByb21pc2UncyBzZXR0bGVkIHN0YXRlIHdpbGwgbWF0Y2ggdGhlIHZhbHVlJ3NcbiAgICAgIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICAgICAgaXRzZWxmIHJlamVjdCwgYW5kIGEgcHJvbWlzZSB0aGF0ICpyZXNvbHZlcyogYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgd2lsbFxuICAgICAgaXRzZWxmIGZ1bGZpbGwuXG5cblxuICAgICAgQmFzaWMgVXNhZ2U6XG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgYGBganNcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIG9uIHN1Y2Nlc3NcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gb24gZmFpbHVyZVxuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgLy8gb24gZnVsZmlsbG1lbnRcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAvLyBvbiByZWplY3Rpb25cbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIFVzYWdlOlxuICAgICAgLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFByb21pc2VzIHNoaW5lIHdoZW4gYWJzdHJhY3RpbmcgYXdheSBhc3luY2hyb25vdXMgaW50ZXJhY3Rpb25zIHN1Y2ggYXNcbiAgICAgIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gICAgICBgYGBqc1xuICAgICAgZnVuY3Rpb24gZ2V0SlNPTih1cmwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICAgICAgZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgICAgICAvLyBvbiBmdWxmaWxsbWVudFxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIC8vIG9uIHJlamVjdGlvblxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICAgICAgYGBganNcbiAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgICAgIGdldEpTT04oJy9jb21tZW50cycpXG4gICAgICBdKS50aGVuKGZ1bmN0aW9uKHZhbHVlcyl7XG4gICAgICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICAgICAgdmFsdWVzWzFdIC8vID0+IGNvbW1lbnRzSlNPTlxuXG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBAY2xhc3MgUHJvbWlzZVxuICAgICAgQHBhcmFtIHtmdW5jdGlvbn0gcmVzb2x2ZXJcbiAgICAgIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgICAgIEBjb25zdHJ1Y3RvclxuICAgICovXG4gICAgZnVuY3Rpb24gJCRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlKHJlc29sdmVyKSB7XG4gICAgICB0aGlzLl9pZCA9ICQkZXM2JHByb21pc2UkcHJvbWlzZSQkY291bnRlcisrO1xuICAgICAgdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuXG4gICAgICBpZiAoJCQkaW50ZXJuYWwkJG5vb3AgIT09IHJlc29sdmVyKSB7XG4gICAgICAgIGlmICghJCR1dGlscyQkaXNGdW5jdGlvbihyZXNvbHZlcikpIHtcbiAgICAgICAgICAkJGVzNiRwcm9taXNlJHByb21pc2UkJG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UpKSB7XG4gICAgICAgICAgJCRlczYkcHJvbWlzZSRwcm9taXNlJCRuZWVkc05ldygpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCQkaW50ZXJuYWwkJGluaXRpYWxpemVQcm9taXNlKHRoaXMsIHJlc29sdmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UuYWxsID0gJCRwcm9taXNlJGFsbCQkZGVmYXVsdDtcbiAgICAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucmFjZSA9ICQkcHJvbWlzZSRyYWNlJCRkZWZhdWx0O1xuICAgICQkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZS5yZXNvbHZlID0gJCRwcm9taXNlJHJlc29sdmUkJGRlZmF1bHQ7XG4gICAgJCRlczYkcHJvbWlzZSRwcm9taXNlJCRQcm9taXNlLnJlamVjdCA9ICQkcHJvbWlzZSRyZWplY3QkJGRlZmF1bHQ7XG5cbiAgICAkJGVzNiRwcm9taXNlJHByb21pc2UkJFByb21pc2UucHJvdG90eXBlID0ge1xuICAgICAgY29uc3RydWN0b3I6ICQkZXM2JHByb21pc2UkcHJvbWlzZSQkUHJvbWlzZSxcblxuICAgIC8qKlxuICAgICAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gICAgICB3aGljaCByZWdpc3RlcnMgY2FsbGJhY2tzIHRvIHJlY2VpdmUgZWl0aGVyIGEgcHJvbWlzZSdzIGV2ZW50dWFsIHZhbHVlIG9yIHRoZVxuICAgICAgcmVhc29uIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uKHVzZXIpe1xuICAgICAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICAgICAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gdXNlciBpcyB1bmF2YWlsYWJsZSwgYW5kIHlvdSBhcmUgZ2l2ZW4gdGhlIHJlYXNvbiB3aHlcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIENoYWluaW5nXG4gICAgICAtLS0tLS0tLVxuXG4gICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICAgICAgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpcnN0IHByb21pc2UncyBmdWxmaWxsbWVudFxuICAgICAgb3IgcmVqZWN0aW9uIGhhbmRsZXIsIG9yIHJlamVjdGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0IG5hbWUnO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGB1c2VyTmFtZWAgd2lsbCBiZSB0aGUgdXNlcidzIG5hbWUsIG90aGVyd2lzZSBpdFxuICAgICAgICAvLyB3aWxsIGJlIGAnZGVmYXVsdCBuYW1lJ2BcbiAgICAgIH0pO1xuXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BmaW5kVXNlcmAgcmVqZWN0ZWQgYW5kIHdlJ3JlIHVuaGFwcHknKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5ldmVyIHJlYWNoZWRcbiAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAgICAgLy8gSWYgYGZpbmRVc2VyYCByZWplY3RlZCwgYHJlYXNvbmAgd2lsbCBiZSAnYGZpbmRVc2VyYCByZWplY3RlZCBhbmQgd2UncmUgdW5oYXBweScuXG4gICAgICB9KTtcbiAgICAgIGBgYFxuICAgICAgSWYgdGhlIGRvd25zdHJlYW0gcHJvbWlzZSBkb2VzIG5vdCBzcGVjaWZ5IGEgcmVqZWN0aW9uIGhhbmRsZXIsIHJlamVjdGlvbiByZWFzb25zIHdpbGwgYmUgcHJvcGFnYXRlZCBmdXJ0aGVyIGRvd25zdHJlYW0uXG5cbiAgICAgIGBgYGpzXG4gICAgICBmaW5kVXNlcigpLnRoZW4oZnVuY3Rpb24gKHVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBlZGFnb2dpY2FsRXhjZXB0aW9uKCdVcHN0cmVhbSBlcnJvcicpO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgLy8gbmV2ZXIgcmVhY2hlZFxuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBUaGUgYFBlZGdhZ29jaWFsRXhjZXB0aW9uYCBpcyBwcm9wYWdhdGVkIGFsbCB0aGUgd2F5IGRvd24gdG8gaGVyZVxuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQXNzaW1pbGF0aW9uXG4gICAgICAtLS0tLS0tLS0tLS1cblxuICAgICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgICAgIHJldHJpZXZlZCBhc3luY2hyb25vdXNseS4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgcmV0dXJuaW5nIGEgcHJvbWlzZSBpbiB0aGVcbiAgICAgIGZ1bGZpbGxtZW50IG9yIHJlamVjdGlvbiBoYW5kbGVyLiBUaGUgZG93bnN0cmVhbSBwcm9taXNlIHdpbGwgdGhlbiBiZSBwZW5kaW5nXG4gICAgICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBJZiB0aGUgYXNzaW1saWF0ZWQgcHJvbWlzZSByZWplY3RzLCB0aGVuIHRoZSBkb3duc3RyZWFtIHByb21pc2Ugd2lsbCBhbHNvIHJlamVjdC5cblxuICAgICAgYGBganNcbiAgICAgIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgICAgICByZXR1cm4gZmluZENvbW1lbnRzQnlBdXRob3IodXNlcik7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgICAgICAvLyBJZiBgZmluZENvbW1lbnRzQnlBdXRob3JgIGZ1bGZpbGxzLCB3ZSdsbCBoYXZlIHRoZSB2YWx1ZSBoZXJlXG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIFNpbXBsZSBFeGFtcGxlXG4gICAgICAtLS0tLS0tLS0tLS0tLVxuXG4gICAgICBTeW5jaHJvbm91cyBFeGFtcGxlXG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZpbmRSZXN1bHQoKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuICAgICAgZmluZFJlc3VsdChmdW5jdGlvbihyZXN1bHQsIGVycil7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRSZXN1bHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7XG4gICAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgICAgIC8vIGZhaWx1cmVcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgICAgIC0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIFN5bmNocm9ub3VzIEV4YW1wbGVcblxuICAgICAgYGBgamF2YXNjcmlwdFxuICAgICAgdmFyIGF1dGhvciwgYm9va3M7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICAgICAgYm9va3MgID0gZmluZEJvb2tzQnlBdXRob3IoYXV0aG9yKTtcbiAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgLy8gZmFpbHVyZVxuICAgICAgfVxuICAgICAgYGBgXG5cbiAgICAgIEVycmJhY2sgRXhhbXBsZVxuXG4gICAgICBgYGBqc1xuXG4gICAgICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG5cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZmFpbHVyZShyZWFzb24pIHtcblxuICAgICAgfVxuXG4gICAgICBmaW5kQXV0aG9yKGZ1bmN0aW9uKGF1dGhvciwgZXJyKXtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAvLyBmYWlsdXJlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbmRCb29va3NCeUF1dGhvcihhdXRob3IsIGZ1bmN0aW9uKGJvb2tzLCBlcnIpIHtcbiAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm91bmRCb29rcyhib29rcyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGZhaWx1cmUoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc3VjY2Vzc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGBgYFxuXG4gICAgICBQcm9taXNlIEV4YW1wbGU7XG5cbiAgICAgIGBgYGphdmFzY3JpcHRcbiAgICAgIGZpbmRBdXRob3IoKS5cbiAgICAgICAgdGhlbihmaW5kQm9va3NCeUF1dGhvcikuXG4gICAgICAgIHRoZW4oZnVuY3Rpb24oYm9va3Mpe1xuICAgICAgICAgIC8vIGZvdW5kIGJvb2tzXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pe1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfSk7XG4gICAgICBgYGBcblxuICAgICAgQG1ldGhvZCB0aGVuXG4gICAgICBAcGFyYW0ge0Z1bmN0aW9ufSBvbkZ1bGZpbGxlZFxuICAgICAgQHBhcmFtIHtGdW5jdGlvbn0gb25SZWplY3RlZFxuICAgICAgVXNlZnVsIGZvciB0b29saW5nLlxuICAgICAgQHJldHVybiB7UHJvbWlzZX1cbiAgICAqL1xuICAgICAgdGhlbjogZnVuY3Rpb24ob25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pIHtcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXM7XG4gICAgICAgIHZhciBzdGF0ZSA9IHBhcmVudC5fc3RhdGU7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSAkJCRpbnRlcm5hbCQkRlVMRklMTEVEICYmICFvbkZ1bGZpbGxtZW50IHx8IHN0YXRlID09PSAkJCRpbnRlcm5hbCQkUkVKRUNURUQgJiYgIW9uUmVqZWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcigkJCRpbnRlcm5hbCQkbm9vcCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBwYXJlbnQuX3Jlc3VsdDtcblxuICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbc3RhdGUgLSAxXTtcbiAgICAgICAgICAkJGFzYXAkJGRlZmF1bHQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICQkJGludGVybmFsJCRpbnZva2VDYWxsYmFjayhzdGF0ZSwgY2hpbGQsIGNhbGxiYWNrLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQkJGludGVybmFsJCRzdWJzY3JpYmUocGFyZW50LCBjaGlsZCwgb25GdWxmaWxsbWVudCwgb25SZWplY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfSxcblxuICAgIC8qKlxuICAgICAgYGNhdGNoYCBpcyBzaW1wbHkgc3VnYXIgZm9yIGB0aGVuKHVuZGVmaW5lZCwgb25SZWplY3Rpb24pYCB3aGljaCBtYWtlcyBpdCB0aGUgc2FtZVxuICAgICAgYXMgdGhlIGNhdGNoIGJsb2NrIG9mIGEgdHJ5L2NhdGNoIHN0YXRlbWVudC5cblxuICAgICAgYGBganNcbiAgICAgIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHN5bmNocm9ub3VzXG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQXV0aG9yKCk7XG4gICAgICB9IGNhdGNoKHJlYXNvbikge1xuICAgICAgICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgfVxuXG4gICAgICAvLyBhc3luYyB3aXRoIHByb21pc2VzXG4gICAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICAgIH0pO1xuICAgICAgYGBgXG5cbiAgICAgIEBtZXRob2QgY2F0Y2hcbiAgICAgIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0aW9uXG4gICAgICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyICQkZXM2JHByb21pc2UkcG9seWZpbGwkJGRlZmF1bHQgPSBmdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgICAgIHZhciBsb2NhbDtcblxuICAgICAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxvY2FsID0gZ2xvYmFsO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgbG9jYWwgPSB3aW5kb3c7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhbCA9IHNlbGY7XG4gICAgICB9XG5cbiAgICAgIHZhciBlczZQcm9taXNlU3VwcG9ydCA9XG4gICAgICAgIFwiUHJvbWlzZVwiIGluIGxvY2FsICYmXG4gICAgICAgIC8vIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgbWlzc2luZyBmcm9tXG4gICAgICAgIC8vIEZpcmVmb3gvQ2hyb21lIGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgXCJyZXNvbHZlXCIgaW4gbG9jYWwuUHJvbWlzZSAmJlxuICAgICAgICBcInJlamVjdFwiIGluIGxvY2FsLlByb21pc2UgJiZcbiAgICAgICAgXCJhbGxcIiBpbiBsb2NhbC5Qcm9taXNlICYmXG4gICAgICAgIFwicmFjZVwiIGluIGxvY2FsLlByb21pc2UgJiZcbiAgICAgICAgLy8gT2xkZXIgdmVyc2lvbiBvZiB0aGUgc3BlYyBoYWQgYSByZXNvbHZlciBvYmplY3RcbiAgICAgICAgLy8gYXMgdGhlIGFyZyByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uXG4gICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgcmVzb2x2ZTtcbiAgICAgICAgICBuZXcgbG9jYWwuUHJvbWlzZShmdW5jdGlvbihyKSB7IHJlc29sdmUgPSByOyB9KTtcbiAgICAgICAgICByZXR1cm4gJCR1dGlscyQkaXNGdW5jdGlvbihyZXNvbHZlKTtcbiAgICAgICAgfSgpKTtcblxuICAgICAgaWYgKCFlczZQcm9taXNlU3VwcG9ydCkge1xuICAgICAgICBsb2NhbC5Qcm9taXNlID0gJCRlczYkcHJvbWlzZSRwcm9taXNlJCRkZWZhdWx0O1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlID0ge1xuICAgICAgJ1Byb21pc2UnOiAkJGVzNiRwcm9taXNlJHByb21pc2UkJGRlZmF1bHQsXG4gICAgICAncG9seWZpbGwnOiAkJGVzNiRwcm9taXNlJHBvbHlmaWxsJCRkZWZhdWx0XG4gICAgfTtcblxuICAgIC8qIGdsb2JhbCBkZWZpbmU6dHJ1ZSBtb2R1bGU6dHJ1ZSB3aW5kb3c6IHRydWUgKi9cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7IHJldHVybiBlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlWydleHBvcnRzJ10pIHtcbiAgICAgIG1vZHVsZVsnZXhwb3J0cyddID0gZXM2JHByb21pc2UkdW1kJCRFUzZQcm9taXNlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzWydFUzZQcm9taXNlJ10gPSBlczYkcHJvbWlzZSR1bWQkJEVTNlByb21pc2U7XG4gICAgfVxufSkuY2FsbCh0aGlzKTtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9lczYtcHJvbWlzZS9kaXN0L2VzNi1wcm9taXNlLmpzXG4gKiogbW9kdWxlIGlkID0gMzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxuXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gdHJ1ZTtcbiAgICB2YXIgY3VycmVudFF1ZXVlO1xuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICAgICAgICBjdXJyZW50UXVldWVbaV0oKTtcbiAgICAgICAgfVxuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG59XG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHF1ZXVlLnB1c2goZnVuKTtcbiAgICBpZiAoIWRyYWluaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZHJhaW5RdWV1ZSwgMCk7XG4gICAgfVxufTtcblxucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbi8vIFRPRE8oc2h0eWxtYW4pXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqICh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzXG4gKiogbW9kdWxlIGlkID0gMzZcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7IHRocm93IG5ldyBFcnJvcihcImRlZmluZSBjYW5ub3QgYmUgdXNlZCBpbmRpcmVjdFwiKTsgfTtcclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvYnVpbGRpbi9hbWQtZGVmaW5lLmpzXG4gKiogbW9kdWxlIGlkID0gMzdcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XHJcblx0aWYoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcclxuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xyXG5cdFx0bW9kdWxlLnBhdGhzID0gW107XHJcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcclxuXHRcdG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xyXG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XHJcblx0fVxyXG5cdHJldHVybiBtb2R1bGU7XHJcbn1cclxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAod2VicGFjaykvYnVpbGRpbi9tb2R1bGUuanNcbiAqKiBtb2R1bGUgaWQgPSAzOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIiLCJmaWxlIjoid2VicGFjay50ZXN0cy5qcyJ9</pre></td></tr>
10071
10218
  </table></pre>
10072
10219
 
10073
10220
  </div>
10074
10221
  <div class="footer">
10075
- <div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Tue Apr 07 2015 20:55:55 GMT-0600 (MDT)</div>
10222
+ <div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Wed Apr 08 2015 12:46:51 GMT-0600 (MDT)</div>
10076
10223
  </div>
10077
10224
 
10078
10225
  <script src="prettify.js"></script>