@speleotica/frcsdata 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/FrcsPlotFile.js +5 -1
  2. package/FrcsPlotShot.js +5 -1
  3. package/FrcsShot.js +4 -5
  4. package/FrcsSurveyFile.js +5 -1
  5. package/FrcsTrip.js +5 -1
  6. package/FrcsTripSummary.js +5 -1
  7. package/FrcsTripSummaryFile.js +5 -1
  8. package/es/FrcsPlotFile.js +5 -1
  9. package/es/FrcsPlotShot.js +5 -1
  10. package/es/FrcsShot.js +5 -6
  11. package/es/FrcsSurveyFile.js +5 -1
  12. package/es/FrcsTrip.js +5 -1
  13. package/es/FrcsTripSummary.js +5 -1
  14. package/es/FrcsTripSummaryFile.js +5 -1
  15. package/es/formatFrcsShot.js +5 -19
  16. package/es/formatFrcsShot.spec.js +8 -17
  17. package/es/index.js +21 -33
  18. package/es/node/index.js +2 -10
  19. package/es/node/parseFrcsPlotFile.spec.js +1 -5
  20. package/es/node/parseFrcsSurveyFile.spec.js +2 -6
  21. package/es/node/parseFrcsTripSummaryFile.spec.js +1 -5
  22. package/es/parseFrcsPlotFile.js +1 -26
  23. package/es/parseFrcsSurveyFile.js +45 -95
  24. package/es/parseFrcsTripSummaryFile.js +1 -12
  25. package/es/string/index.js +2 -9
  26. package/es/string/parseFrcsPlotFile.spec.js +1 -5
  27. package/es/string/parseFrcsSurveyFile.spec.js +8 -14
  28. package/formatFrcsShot.js +5 -19
  29. package/formatFrcsShot.spec.js +4 -15
  30. package/index.js +20 -32
  31. package/node/index.js +1 -9
  32. package/node/parseFrcsPlotFile.spec.js +165 -180
  33. package/node/parseFrcsSurveyFile.spec.js +306 -321
  34. package/node/parseFrcsTripSummaryFile.spec.js +83 -106
  35. package/package.json +15 -15
  36. package/parseFrcsPlotFile.js +224 -318
  37. package/parseFrcsSurveyFile.js +411 -452
  38. package/parseFrcsTripSummaryFile.js +102 -142
  39. package/string/index.js +10 -27
  40. package/string/parseFrcsPlotFile.spec.js +165 -180
  41. package/string/parseFrcsSurveyFile.spec.js +598 -689
  42. package/yarn.lock +1285 -702
@@ -4,106 +4,86 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = parseFrcsSurveyFile;
7
-
8
7
  var _parseSegment = require("parse-segment");
9
-
10
8
  var _unitized = require("@speleotica/unitized");
11
-
12
9
  var _FrcsShot = require("./FrcsShot");
13
-
14
10
  function parseNumber(s, unit) {
15
11
  const value = parseFloat(s);
16
12
  if (isNaN(value)) return null;
17
13
  return new _unitized.UnitizedNumber(value, unit);
18
14
  }
19
-
20
15
  function parseAzimuth(s, unit) {
21
16
  const parsed = parseNumber(s, unit);
22
17
  return (parsed === null || parsed === void 0 ? void 0 : parsed.get(_unitized.Angle.degrees)) === 360 ? _unitized.Unitize.degrees(0) : parsed;
23
18
  }
24
-
25
19
  function parseKind(kind) {
26
20
  switch (kind) {
27
21
  case 'H':
28
22
  return _FrcsShot.FrcsShotKind.Horizontal;
29
-
30
23
  case 'D':
31
24
  return _FrcsShot.FrcsShotKind.Diagonal;
32
-
33
25
  default:
34
26
  return _FrcsShot.FrcsShotKind.Normal;
35
27
  }
36
28
  }
37
-
38
29
  function parseLengthUnit(unit) {
39
30
  switch (unit) {
40
31
  case 'FI':
41
32
  return _unitized.Length.inches;
42
-
33
+ case 'FF':
43
34
  case 'FT':
44
35
  return _unitized.Length.feet;
45
-
36
+ case 'MT':
46
37
  case 'M ':
47
38
  return _unitized.Length.meters;
48
39
  }
49
-
50
40
  return null;
51
41
  }
52
-
53
42
  function parseAngleUnit(unit) {
54
43
  switch (unit) {
55
44
  case 'D':
56
45
  return _unitized.Angle.degrees;
57
-
58
46
  case 'G':
59
47
  return _unitized.Angle.gradians;
60
-
61
48
  case 'M':
62
49
  return _unitized.Angle.milsNATO;
63
50
  }
64
-
65
51
  return null;
66
- } // determines if a cell contains a valid station name.
67
-
52
+ }
68
53
 
54
+ // determines if a cell contains a valid station name.
69
55
  function isValidStation(s) {
70
56
  return /^\s*\S+\s*$/.test(s);
71
- } // determines if a cell contains a valid unsigned integer.
72
-
73
-
57
+ }
58
+ // determines if a cell contains a valid unsigned integer.
74
59
  function isValidUInt(s) {
75
60
  return /^\s*[0-9]+\s*$/.test(s);
76
- } // determines if a cell contains a valid float.
77
-
78
-
61
+ }
62
+ // determines if a cell contains a valid float.
79
63
  function isValidFloat(s) {
80
64
  return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
81
- } // determines if a cell contains a valid unsigned float or whitespace.
82
-
83
-
65
+ }
66
+ // determines if a cell contains a valid unsigned float or whitespace.
84
67
  function isValidOptFloat(s) {
85
68
  return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
86
- } // determines if a cell contains a valid unsigned float or whitespace.
87
-
88
-
69
+ }
70
+ // determines if a cell contains a valid unsigned float or whitespace.
89
71
  function isValidOptUFloat(s) {
90
72
  return /^\s*[0-9]*(\.[0-9]*)?\s*$/.test(s);
91
- } // determines if a cell contains a valid unsigned float.
92
-
93
-
73
+ }
74
+ // determines if a cell contains a valid unsigned float.
94
75
  function isValidUFloat(s) {
95
76
  return /^\s*([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
96
- } // determines if a cell contains a valid inclination or whitespace.
97
-
98
-
77
+ }
78
+ // determines if a cell contains a valid inclination or whitespace.
99
79
  function isValidOptInclination(s) {
100
80
  return /^\s*[-+]?[0-9]*(\.[0-9]*)?\s*$/.test(s);
101
81
  }
102
-
103
82
  function parseLrud(s, unit) {
104
83
  const value = parseFloat(s);
105
84
  return !Number.isFinite(value) || value < 0 ? null : new _unitized.UnitizedNumber(value, unit);
106
85
  }
86
+
107
87
  /**
108
88
  * Parses a raw cdata.fr survey file. These look like so:
109
89
  *
@@ -149,9 +129,8 @@ FI B DD
149
129
  ...</pre>
150
130
  *
151
131
  */
152
-
153
-
154
- async function parseFrcsSurveyFile(file, // eslint-disable-line @typescript-eslint/no-explicit-any
132
+ async function parseFrcsSurveyFile(file,
133
+ // eslint-disable-line @typescript-eslint/no-explicit-any
155
134
  lines) {
156
135
  let cave = null;
157
136
  let location = null;
@@ -168,20 +147,16 @@ lines) {
168
147
  let trip = null;
169
148
  let inBlockComment = false;
170
149
  let section;
171
-
172
150
  function getComment() {
173
151
  if (!commentLines) return null;
174
152
  const comment = commentLines.join('\n').trim();
175
153
  commentLines = null;
176
154
  return comment || null;
177
155
  }
178
-
179
156
  let lineNumber = 0;
180
-
181
157
  for await (const line of lines) {
182
158
  let errored = false;
183
159
  const thisLineNumber = lineNumber;
184
-
185
160
  const error = (message, startColumn, endColumn) => {
186
161
  errored = true;
187
162
  errors.push(new _parseSegment.SegmentParseError(message, new _parseSegment.Segment({
@@ -191,34 +166,25 @@ lines) {
191
166
  startCol: 0
192
167
  }).substring(startColumn, endColumn)));
193
168
  };
194
-
195
169
  const validate = (startColumn, endColumn, fieldName, validator) => {
196
170
  const field = line.substring(startColumn, endColumn);
197
-
198
171
  if (!validator(field)) {
199
172
  error((field.trim() ? 'Invalid ' : 'Missing ') + fieldName, startColumn, endColumn);
200
173
  }
201
-
202
174
  return field;
203
175
  };
204
-
205
176
  lineNumber++;
206
-
207
177
  if (lineNumber === 1) {
208
178
  const match = /^\s*([^,]+)(,(.*))?/.exec(line);
209
-
210
179
  if (match) {
211
180
  cave = match[1].trim();
212
-
213
181
  if (match[3]) {
214
182
  location = match[3].trim();
215
183
  }
216
184
  }
217
185
  }
218
-
219
186
  if (line.charAt(0) === ' ' && line.charAt(1) === '*') {
220
187
  inTripComment = !inTripComment;
221
-
222
188
  if (inTripComment) {
223
189
  section = undefined;
224
190
  tripComment = [];
@@ -231,7 +197,6 @@ lines) {
231
197
  tripName = line && line.trim();
232
198
  } else if (lineNumber === tripCommentStartLine + 2) {
233
199
  const match = /^(.+?)\s*[-.]\s*(\d+)\/(\d+)\/(\d+)$/.exec(line && line.trim());
234
-
235
200
  if (match) {
236
201
  let k = 1;
237
202
  const team = match[k++];
@@ -244,9 +209,7 @@ lines) {
244
209
  } else if (lineNumber > 1) {
245
210
  tripComment.push(line);
246
211
  }
247
-
248
212
  const match = /^\*\*\*([^*])\*\*\*/.exec(line);
249
-
250
213
  if (match) {
251
214
  section = match[1].trim();
252
215
  }
@@ -262,39 +225,30 @@ lines) {
262
225
  // FT CC DD
263
226
  // 01234567
264
227
  let distanceUnit = parseLengthUnit(line.slice(0, 2));
265
-
266
228
  if (!distanceUnit) {
267
229
  distanceUnit = _unitized.Length.feet;
268
230
  error('Invalid distance unit', 0, 2);
269
231
  }
270
-
271
232
  let azimuthUnit = parseAngleUnit(line[6]);
272
-
273
233
  if (!azimuthUnit) {
274
234
  azimuthUnit = _unitized.Angle.degrees;
275
235
  error('Invalid azimuth unit', 6, 7);
276
236
  }
277
-
278
237
  let inclinationUnit = parseAngleUnit(line[7]);
279
-
280
238
  if (!inclinationUnit) {
281
239
  inclinationUnit = _unitized.Angle.degrees;
282
240
  error('Invalid inclination unit', 7, 8);
283
241
  }
284
-
285
242
  const backsightAzimuthCorrected = line[3] === 'C';
286
243
  const backsightInclinationCorrected = line[4] === 'C';
287
244
  const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-';
288
245
  const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-';
289
-
290
246
  if (!/[-CB ]/.test(line[3])) {
291
247
  error('Invalid backsight azimuth type', 3, 4);
292
248
  }
293
-
294
249
  if (!/[-CB ]/.test(line[4])) {
295
250
  error('Invalid backsight inclination type', 4, 5);
296
251
  }
297
-
298
252
  trip = {
299
253
  header: {
300
254
  name: tripName || '',
@@ -325,16 +279,19 @@ lines) {
325
279
  distanceUnit
326
280
  } = trip.header;
327
281
  const inches = distanceUnit === _unitized.Length.inches;
328
- if (inches) distanceUnit = _unitized.Length.feet; // rigorously check the values in all the columns to make sure this
282
+ if (inches) distanceUnit = _unitized.Length.feet;
283
+
284
+ // rigorously check the values in all the columns to make sure this
329
285
  // is really a survey shot line, just in case any stray comments are
330
286
  // not properly delimited.
331
- // from station name
332
287
 
288
+ // from station name
333
289
  if (!/\S/.test(line.substring(5, 10))) continue;
334
- const fromStr = validate(5, 10, 'from station', isValidStation); // Sadly I have found negative LRUD values in Chip's format and apparently
290
+ const fromStr = validate(5, 10, 'from station', isValidStation);
291
+
292
+ // Sadly I have found negative LRUD values in Chip's format and apparently
335
293
  // his program doesn't fail on them, so I have to accept them here
336
294
  // isValidOptFloat instead of isValidOptUFloat
337
-
338
295
  const lStr = validate(40, 43, 'left', isValidOptFloat);
339
296
  const rStr = validate(43, 46, 'right', isValidOptFloat);
340
297
  const uStr = validate(46, 49, 'up', isValidOptFloat);
@@ -343,10 +300,10 @@ lines) {
343
300
  const up = parseLrud(uStr, distanceUnit);
344
301
  const down = parseLrud(dStr, distanceUnit);
345
302
  const left = parseLrud(lStr, distanceUnit);
346
- const right = parseLrud(rStr, distanceUnit); // to station name
303
+ const right = parseLrud(rStr, distanceUnit);
347
304
 
305
+ // to station name
348
306
  const toStr = line.substring(0, 5);
349
-
350
307
  if (!toStr.trim()) {
351
308
  const shot = {
352
309
  from: fromStr.trim(),
@@ -369,14 +326,11 @@ lines) {
369
326
  shots.push(shot);
370
327
  continue;
371
328
  }
372
-
373
329
  if (!isValidStation(toStr)) {
374
330
  error('Invalid station name', 0, 5);
375
331
  }
376
-
377
332
  const fromLrudMatch = new RegExp(`^\\s+${fromStr.trim().replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}((\\s+(\\d+(\\.\\d*)?|\\.\\d+)){4})`).exec(line.substring(52));
378
333
  let fromLruds;
379
-
380
334
  if (fromLrudMatch) {
381
335
  const [left, right, up, down] = fromLrudMatch[1].trim().split(/\s+/g).map(s => parseLrud(s, distanceUnit));
382
336
  fromLruds = {
@@ -385,9 +339,9 @@ lines) {
385
339
  up,
386
340
  down
387
341
  };
388
- } // azimuth and inclination
389
-
342
+ }
390
343
 
344
+ // azimuth and inclination
391
345
  const azmFsStr = validate(19, 25, 'azimuth', isValidOptUFloat);
392
346
  const azmBsStr = validate(25, 30, 'azimuth', isValidOptUFloat);
393
347
  const incFsStr = line.substring(30, 35);
@@ -400,26 +354,27 @@ lines) {
400
354
  let frontsightInclination;
401
355
  let backsightInclination;
402
356
  let excludeDistance;
403
- let isSplay; // parse distance
357
+ let isSplay;
404
358
 
359
+ // parse distance
405
360
  if (inches) {
406
361
  const feetStr = line.substring(10, 14);
407
- const inchesStr = line.substring(14, 17); // feet and inches are not both optional
408
-
362
+ const inchesStr = line.substring(14, 17);
363
+ // feet and inches are not both optional
409
364
  if (!isValidUInt(feetStr) && !isValidUInt(inchesStr)) {
410
365
  const invalid = feetStr.trim() || inchesStr.trim();
411
366
  error(invalid ? 'Invalid distance' : 'Missing distance', 10, 17);
412
367
  continue;
413
- } // sometimes inches are omitted, hence the || 0...I'm assuming it's possible
414
- // for feet to be omitted as well
415
-
368
+ }
416
369
 
370
+ // sometimes inches are omitted, hence the || 0...I'm assuming it's possible
371
+ // for feet to be omitted as well
417
372
  distance = _unitized.Unitize.inches(parseFloat(inchesStr) || 0).add(_unitized.Unitize.feet(parseFloat(feetStr) || 0));
418
- kind = parseKind(line[17]); // NOTE there are two columns around here that can contain a *.
373
+ kind = parseKind(line[17]);
374
+ // NOTE there are two columns around here that can contain a *.
419
375
  // I think they might represent different values, but thisis confused by
420
376
  // the fact that for ft/in shots, if there is a D or H flag it occupies the
421
377
  // first column that can contain a * for decimal feet shots
422
-
423
378
  excludeDistance = line[18] === '*' || line[18] === 's';
424
379
  isSplay = line[18] === 's';
425
380
  } else {
@@ -430,15 +385,14 @@ lines) {
430
385
  excludeDistance = line[17] === '*' || line[17] === 's';
431
386
  isSplay = line[17] === 's';
432
387
  }
433
-
434
388
  if (kind !== _FrcsShot.FrcsShotKind.Normal) {
435
389
  validate(30, 35, 'vertical-distance', isValidFloat);
436
- } // convert horizontal and diagonal shots to standard
390
+ }
391
+
392
+ // convert horizontal and diagonal shots to standard
437
393
  // in this case incFs is the vertical offset between stations
438
394
  // fortunately it appears we can always count on incFs being specified
439
395
  // and incBs not being specified for these types of shots
440
-
441
-
442
396
  if (kind === _FrcsShot.FrcsShotKind.Horizontal) {
443
397
  // distance is horizontal offset and incFsStr is vertical offset
444
398
  horizontalDistance = distance;
@@ -457,21 +411,18 @@ lines) {
457
411
  backsightInclination = null;
458
412
  } else {
459
413
  // frontsight inclination
460
- validate(30, 35, 'inclination', isValidOptInclination); // frontsight inclination
461
-
414
+ validate(30, 35, 'inclination', isValidOptInclination);
415
+ // frontsight inclination
462
416
  validate(35, 40, 'inclination', isValidOptInclination);
463
417
  frontsightInclination = parseNumber(incFsStr, inclinationUnit);
464
418
  backsightInclination = parseNumber(incBsStr, inclinationUnit);
465
419
  }
466
-
467
420
  if (errored) continue;
468
421
  const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit);
469
422
  const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit);
470
-
471
423
  if (!frontsightInclination && !backsightInclination) {
472
424
  frontsightInclination = _unitized.Unitize.degrees(0);
473
425
  }
474
-
475
426
  const shot = {
476
427
  from: fromStr.trim(),
477
428
  to: toStr.trim(),
@@ -497,7 +448,6 @@ lines) {
497
448
  shots.push(shot);
498
449
  }
499
450
  }
500
-
501
451
  return {
502
452
  cave,
503
453
  location,
@@ -505,4 +455,4 @@ lines) {
505
455
  errors
506
456
  };
507
457
  }
508
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUZyY3NTdXJ2ZXlGaWxlLnRzIl0sIm5hbWVzIjpbInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJmcm9tU3RyIiwibFN0ciIsInJTdHIiLCJ1U3RyIiwiZFN0ciIsInVwIiwiZG93biIsImxlZnQiLCJyaWdodCIsInRvU3RyIiwic2hvdCIsImZyb20iLCJ0byIsImRpc3RhbmNlIiwiZnJvbnRzaWdodEF6aW11dGgiLCJiYWNrc2lnaHRBemltdXRoIiwiZnJvbnRzaWdodEluY2xpbmF0aW9uIiwiYmFja3NpZ2h0SW5jbGluYXRpb24iLCJmcm9tTHJ1ZHMiLCJleGNsdWRlRGlzdGFuY2UiLCJmcm9tTHJ1ZE1hdGNoIiwiUmVnRXhwIiwicmVwbGFjZSIsIm1hcCIsImF6bUZzU3RyIiwiYXptQnNTdHIiLCJpbmNGc1N0ciIsImluY0JzU3RyIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwidmVydGljYWxEaXN0YW5jZSIsImlzU3BsYXkiLCJmZWV0U3RyIiwiaW5jaGVzU3RyIiwiaW52YWxpZCIsImFkZCIsImgiLCJ2IiwiTWF0aCIsInNxcnQiLCJhdGFuMiIsImQiLCJhc2luIiwidG9McnVkcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUNBOztBQVFBOztBQUVBLFNBQVNBLFdBQVQsQ0FD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bGUgfSBmcm9tICcuL0ZyY3NTdXJ2ZXlGaWxlJ1xuaW1wb3J0IHsgRnJjc1RyaXAgfSBmcm9tICcuL0ZyY3NUcmlwJ1xuaW1wb3J0IHsgU2VnbWVudCwgU2VnbWVudFBhcnNlRXJyb3IgfSBmcm9tICdwYXJzZS1zZWdtZW50J1xuaW1wb3J0IHtcbiAgQW5nbGUsXG4gIExlbmd0aCxcbiAgVW5pdCxcbiAgVW5pdGl6ZWROdW1iZXIsXG4gIFVuaXRUeXBlLFxuICBVbml0aXplLFxufSBmcm9tICdAc3BlbGVvdGljYS91bml0aXplZCdcbmltcG9ydCB7IEZyY3NTaG90LCBGcmNzU2hvdEtpbmQgfSBmcm9tICcuL0ZyY3NTaG90J1xuXG5mdW5jdGlvbiBwYXJzZU51bWJlcjxUIGV4dGVuZHMgVW5pdFR5cGU8VD4+KFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8VD5cbik6IFVuaXRpemVkTnVtYmVyPFQ+IHwgbnVsbCB7XG4gIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChzKVxuICBpZiAoaXNOYU4odmFsdWUpKSByZXR1cm4gbnVsbFxuICByZXR1cm4gbmV3IFVuaXRpemVkTnVtYmVyKHZhbHVlLCB1bml0KVxufVxuXG5mdW5jdGlvbiBwYXJzZUF6aW11dGgoXG4gIHM6IHN0cmluZyxcbiAgdW5pdDogVW5pdDxBbmdsZT5cbik6IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGwge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU51bWJlcihzLCB1bml0KVxuICByZXR1cm4gcGFyc2VkPy5nZXQoQW5nbGUuZGVncmVlcykgPT09IDM2MCA/IFVuaXRpemUuZGVncmVlcygwKSA6IHBhcnNlZFxufVxuXG5mdW5jdGlvbiBwYXJzZUtpbmQoa2luZDogc3RyaW5nKTogRnJjc1Nob3RLaW5kIHtcbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAnSCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkhvcml6b250YWxcbiAgICBjYXNlICdEJzpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuRGlhZ29uYWxcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ob3JtYWxcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxlbmd0aFVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxMZW5ndGg+IHwgbnVsbCB7XG4gIHN3aXRjaCAodW5pdCkge1xuICAgIGNhc2UgJ0ZJJzpcbiAgICAgIHJldHVybiBMZW5ndGguaW5jaGVzXG4gICAgY2FzZSAnRlQnOlxuICAgICAgcmV0dXJuIExlbmd0aC5mZWV0XG4gICAgY2FzZSAnTSAnOlxuICAgICAgcmV0dXJuIExlbmd0aC5tZXRlcnNcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuZnVuY3Rpb24gcGFyc2VBbmdsZVVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxBbmdsZT4gfCBudWxsIHtcbiAgc3dpdGNoICh1bml0KSB7XG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gQW5nbGUuZGVncmVlc1xuICAgIGNhc2UgJ0cnOlxuICAgICAgcmV0dXJuIEFuZ2xlLmdyYWRpYW5zXG4gICAgY2FzZSAnTSc6XG4gICAgICByZXR1cm4gQW5nbGUubWlsc05BVE9cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHN0YXRpb24gbmFtZS5cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0aW9uKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqXFxTK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGludGVnZXIuXG5mdW5jdGlvbiBpc1ZhbGlkVUludChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT8oWzAtOV0rKFxcLlswLTldKik/fFxcLlswLTldKylcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT9bMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKihbMC05XSsoXFwuWzAtOV0qKT98XFwuWzAtOV0rKVxccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGluY2xpbmF0aW9uIG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0SW5jbGluYXRpb24oczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdP1swLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG5mdW5jdGlvbiBwYXJzZUxydWQ8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PExlbmd0aD5cbik6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCBudWxsIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHMpXG4gIHJldHVybiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDBcbiAgICA/IG51bGxcbiAgICA6IG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSByYXcgY2RhdGEuZnIgc3VydmV5IGZpbGUuICBUaGVzZSBsb29rIGxpa2Ugc286XG4gKlxuPHByZT4gICAgICBGaXNoZXIgUmlkZ2UgQ2F2ZSBTeXN0ZW0sIEhhcnQgQ28uLCBLWVxuRU5UUkFOQ0UgRFJPUFMsIEpPRSdTIFwiSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0VcIiwgVFJJQ0tZIFRSQVZFUlNFXG5QRVRFUiBRVUlDSywgS0VJVEggT1JUSVogICAtICAyLTE1LTgxXG5UaGlzIEZpbGUgaGFzIENydW1wcyB0ZXN0IGNvbm5lY3RlZC4gIDExLzIwLzEyXG4gKlxuRlQgQyAgREQgICAgQVxuICAgICAgQUUyMCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgMyAgMCAgMlxuKiAgICAgICVGU1xuKiAgICAgQUUyMCAgICAgMCAgICAgICAgMCAgICAgICAgMCAgICAgICAgQnVnLWNhbid0IHB1dCBiZWZvcmUgc28gcHV0IGFmdGVyLXNvIGNhbid0IG1ha2UgMiBmaXhlZCAxMC8yOC8xMlxuIEFFMTkgQUUyMCAgIDkuMyAgICA2MC4wICA2MC4wLTM2LjAgICAgICAgMiAxMiAgMCAyMFxuIEFFMTggQUUxOSAgMjQuNSAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgNiAxMCAyNSAgMFxuIEFFMTcgQUUxOCAgIDguMCAgIDM1MC41IDM1MC41IDE3LjAgICAgICAgMyAgNSAgMCAgMFxuIEFFMTYgQUUxNyAgIDYuNyAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgMyAgNSAgNiAgMVxuIEFFMTUgQUUxNiAgMTIuNiAgICA3MC41ICA3MS4wLTE4LjAgICAgICAgNCAgMCAgMiAgMVxuIEFFMTQgQUUxNSAgMTAuMCAgICAyMS41ICAyMC4wICA2LjAgICAgICAgNSAgNSAgMCAgM1xuIEFFMTMgQUUxNCAgMjYuOCAgIDI4OC4wIDI4Ni4wLTUwLjAgICAgICAgMCAgNyAyMCAgNVxuKlxuKlNIT1JUIENBTllPTiBBVCBUSEUgQkFTRSBPRiBUSEUgU0VDT05EIERST1BcbiBBRTEyIEFFMTMgIDIwLjcgICAyMzYuMCAyMzYuMCAzNC4wICAgICAgIDMgIDUgIDQgIDRcbiBBRTExIEFFMTIgIDEyLjQgICAyMTAuMCAyMTAuMCAzNS4wICAgICAgIDcgIDQgIDUgIDFcbiBBRTEwIEFFMTMgIDI1LjcgICAgNDAuMCAgNDAuMCAtOS4wICAgICAgIDIgIDIgIDMgIDZcbipcbipBRTEwIEFUIEpPRSdTIFwiIEkgTE9WRSBNWSBXSUZFIFRSQVZFUlNFIFwiXG4gIEFFOSBBRTEwICAxNy44ICAgIDMyLjUgIDMxLjAgMjMuMCAgICAgICA0ICA1IDIwIDE1XG4gIEFFMSAgQUU5ICAxMy43ICAgIDgyLjAgIDgyLjAtMTMuMFxuICAgQTEgIEFFMSAgMzQuMyAgICA0Ni4wICA0OC4wLTE3LjVcbipcbipTVVJWRVkgVE8gRE9NRSBORUFSIFRIRSBFTlRSQU5DRSBET01FIChBQk9WRSBUSEUgU0VDT05EIERST1ApXG4gIEFEMSBBRTE1ICAgOC4wICAgMjAwLjAgMjAwLjAgIDAuMCAgICAgICAzICAxICAxICAxXG4gIEFEMiAgQUQxICAxNy43ICAgMTYxLjAgMTYxLjAgIDcuMCAgICAgICAxICA0IDI1ICAxXG4gIEFEMyAgQUQyICAxMC40ICAgMTgwLjAgMTgwLjAgNTAuMCAgICAgICA0ICAxIDE1ICA1XG4gKlxuVFJJQ0tZIFRSQVZFUlNFIEFORCBUSEVOIEZJUlNUIFNVUlZFWSBJTiBVUFBFUiBDUk9XTFdBWVxuREFOIENST1dMLCBLRUlUSCBPUlRJWiwgQ0hJUCBIT1BQRVIsIFBFVEVSIFFVSUNLLCBMQVJSWSBCRUFOICAgIDE0IEZFQiAxOTgxXG4gKlxuRkkgQiAgRERcbiAgIEEyICAgQTEgIDQ4IDEwICAyOTIuMCAxMTAuMC00Mi4wICAgICAgIDUgMTAgMzUgIDVcbiAgIEEzICAgQTIgIDEyICA1ICAzMzMuNSAxNTMuNSAzNS4wICAgICAgIDMgIDEgMTUgIDVcbiAgIEE0ICAgQTMgICA0ICAyICAgIDAuMCAgIDAuMCA5MC4wICAgICAgIDMgIDEgMTAgMTBcbi4uLjwvcHJlPlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcGFyc2VGcmNzU3VydmV5RmlsZShcbiAgZmlsZTogYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbGluZXM6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuKTogUHJvbWlzZTxGcmNzU3VydmV5RmlsZT4ge1xuICBsZXQgY2F2ZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBjb25zdCB0cmlwczogQXJyYXk8RnJjc1RyaXA+ID0gW11cbiAgY29uc3QgZXJyb3JzOiBBcnJheTxTZWdtZW50UGFyc2VFcnJvcj4gPSBbXVxuXG4gIGxldCB0cmlwTmFtZVxuICBsZXQgdHJpcFRlYW1cbiAgbGV0IHRyaXBEYXRlXG4gIGxldCBpblRyaXBDb21tZW50ID0gdHJ1ZVxuICBsZXQgdHJpcENvbW1lbnRTdGFydExpbmUgPSAxXG4gIGxldCB0cmlwQ29tbWVudEVuZExpbmUgPSAtMVxuICBsZXQgdHJpcENvbW1lbnQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBsZXQgY29tbWVudExpbmVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IG51bGxcbiAgbGV0IHRyaXA6IEZyY3NUcmlwIHwgbnVsbCA9IG51bGxcbiAgbGV0IGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgbGV0IHNlY3Rpb25cblxuICBmdW5jdGlvbiBnZXRDb21tZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29tbWVudExpbmVzKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50TGluZXMuam9pbignXFxuJykudHJpbSgpXG4gICAgY29tbWVudExpbmVzID0gbnVsbFxuICAgIHJldHVybiBjb21tZW50IHx8IG51bGxcbiAgfVxuXG4gIGxldCBsaW5lTnVtYmVyID0gMFxuXG4gIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGxldCBlcnJvcmVkID0gZmFsc2VcblxuICAgIGNvbnN0IHRoaXNMaW5lTnVtYmVyID0gbGluZU51bWJlclxuXG4gICAgY29uc3QgZXJyb3IgPSAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgZW5kQ29sdW1uOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IFNlZ21lbnRQYXJzZUVycm9yKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbmV3IFNlZ21lbnQoe1xuICAgICAgICAgICAgdmFsdWU6IGxpbmUsXG4gICAgICAgICAgICBzb3VyY2U6IGZpbGUsXG4gICAgICAgICAgICBzdGFydExpbmU6IHRoaXNMaW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2w6IDAsXG4gICAgICAgICAgfSkuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IChcbiAgICAgIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBlbmRDb2x1bW46IG51bWJlcixcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gYm9vbGVhblxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICBpZiAoIXZhbGlkYXRvcihmaWVsZCkpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgKGZpZWxkLnRyaW0oKSA/ICdJbnZhbGlkICcgOiAnTWlzc2luZyAnKSArIGZpZWxkTmFtZSxcbiAgICAgICAgICBzdGFydENvbHVtbixcbiAgICAgICAgICBlbmRDb2x1bW5cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkXG4gICAgfVxuXG4gICAgbGluZU51bWJlcisrXG5cbiAgICBpZiAobGluZU51bWJlciA9PT0gMSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxccyooW14sXSspKCwoLiopKT8vLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjYXZlID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgIGxvY2F0aW9uID0gbWF0Y2hbM10udHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09ICcgJyAmJiBsaW5lLmNoYXJBdCgxKSA9PT0gJyonKSB7XG4gICAgICBpblRyaXBDb21tZW50ID0gIWluVHJpcENvbW1lbnRcbiAgICAgIGlmIChpblRyaXBDb21tZW50KSB7XG4gICAgICAgIHNlY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgICAgdHJpcENvbW1lbnQgPSBbXVxuICAgICAgICB0cmlwQ29tbWVudFN0YXJ0TGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXBDb21tZW50RW5kTGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluVHJpcENvbW1lbnQpIHtcbiAgICAgIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudFN0YXJ0TGluZSArIDEpIHtcbiAgICAgICAgdHJpcE5hbWUgPSBsaW5lICYmIGxpbmUudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50U3RhcnRMaW5lICsgMikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4rPylcXHMqWy0uXVxccyooXFxkKylcXC8oXFxkKylcXC8oXFxkKykkLy5leGVjKFxuICAgICAgICAgIGxpbmUgJiYgbGluZS50cmltKClcbiAgICAgICAgKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgayA9IDFcbiAgICAgICAgICBjb25zdCB0ZWFtID0gbWF0Y2hbaysrXVxuICAgICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIHRyaXBEYXRlID0gbmV3IERhdGUoeWVhciA8IDcwID8geWVhciArIDIwMDAgOiB5ZWFyLCBtb250aCAtIDEsIGRheSlcbiAgICAgICAgICB0cmlwVGVhbSA9IHRlYW0uc3BsaXQoXG4gICAgICAgICAgICB0ZWFtLmluZGV4T2YoJzsnKSA+PSAwID8gL1xccyo7XFxzKi9nIDogL1xccyosXFxzKi9nXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPiAxKSB7XG4gICAgICAgIHRyaXBDb21tZW50LnB1c2gobGluZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXCpcXCpcXCooW14qXSlcXCpcXCpcXCovLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBzZWN0aW9uID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICBpbkJsb2NrQ29tbWVudCA9ICFpbkJsb2NrQ29tbWVudFxuICAgICAgaWYgKGluQmxvY2tDb21tZW50KSBjb21tZW50TGluZXMgPSBbXVxuICAgICAgZWxzZSBpZiAoY29tbWVudExpbmVzKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBsaW5lLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgaWYgKHBhcnQgJiYgY29tbWVudExpbmVzKSBjb21tZW50TGluZXMucHVzaChwYXJ0KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgIGlmIChjb21tZW50TGluZXMpIGNvbW1lbnRMaW5lcy5wdXNoKGxpbmUpXG4gICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudEVuZExpbmUgKyAxKSB7XG4gICAgICAvLyBGVCBDQyBERFxuICAgICAgLy8gMDEyMzQ1NjdcbiAgICAgIGxldCBkaXN0YW5jZVVuaXQgPSBwYXJzZUxlbmd0aFVuaXQobGluZS5zbGljZSgwLCAyKSlcbiAgICAgIGlmICghZGlzdGFuY2VVbml0KSB7XG4gICAgICAgIGRpc3RhbmNlVW5pdCA9IExlbmd0aC5mZWV0XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIHVuaXQnLCAwLCAyKVxuICAgICAgfVxuICAgICAgbGV0IGF6aW11dGhVbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs2XSlcbiAgICAgIGlmICghYXppbXV0aFVuaXQpIHtcbiAgICAgICAgYXppbXV0aFVuaXQgPSBBbmdsZS5kZWdyZWVzXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGF6aW11dGggdW5pdCcsIDYsIDcpXG4gICAgICB9XG4gICAgICBsZXQgaW5jbGluYXRpb25Vbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs3XSlcbiAgICAgIGlmICghaW5jbGluYXRpb25Vbml0KSB7XG4gICAgICAgIGluY2xpbmF0aW9uVW5pdCA9IEFuZ2xlLmRlZ3JlZXNcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgaW5jbGluYXRpb24gdW5pdCcsIDcsIDgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrc2lnaHRBemltdXRoQ29ycmVjdGVkID0gbGluZVszXSA9PT0gJ0MnXG4gICAgICBjb25zdCBiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCA9IGxpbmVbNF0gPT09ICdDJ1xuICAgICAgY29uc3QgaGFzQmFja3NpZ2h0QXppbXV0aCA9IGxpbmVbM10gIT09ICcgJyAmJiBsaW5lWzNdICE9PSAnLSdcbiAgICAgIGNvbnN0IGhhc0JhY2tzaWdodEluY2xpbmF0aW9uID0gbGluZVs0XSAhPT0gJyAnICYmIGxpbmVbNF0gIT09ICctJ1xuXG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVszXSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGF6aW11dGggdHlwZScsIDMsIDQpXG4gICAgICB9XG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVs0XSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGluY2xpbmF0aW9uIHR5cGUnLCA0LCA1KVxuICAgICAgfVxuXG4gICAgICB0cmlwID0ge1xuICAgICAgICBoZWFkZXI6IHtcbiAgICAgICAgICBuYW1lOiB0cmlwTmFtZSB8fCAnJyxcbiAgICAgICAgICBjb21tZW50OiAodHJpcENvbW1lbnQgJiYgdHJpcENvbW1lbnQuam9pbignXFxuJykpIHx8IG51bGwsXG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICBkYXRlOiB0cmlwRGF0ZSxcbiAgICAgICAgICB0ZWFtOiB0cmlwVGVhbSxcbiAgICAgICAgICBkaXN0YW5jZVVuaXQsXG4gICAgICAgICAgYXppbXV0aFVuaXQsXG4gICAgICAgICAgaW5jbGluYXRpb25Vbml0LFxuICAgICAgICAgIGJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQsXG4gICAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb25Db3JyZWN0ZWQsXG4gICAgICAgICAgaGFzQmFja3NpZ2h0QXppbXV0aCxcbiAgICAgICAgICBoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvdHM6IFtdLFxuICAgICAgfVxuICAgICAgdHJpcHMucHVzaCh0cmlwKVxuICAgIH0gZWxzZSBpZiAodHJpcCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaG90cyxcbiAgICAgICAgaGVhZGVyOiB7IGF6aW11dGhVbml0LCBpbmNsaW5hdGlvblVuaXQgfSxcbiAgICAgIH0gPSB0cmlwXG4gICAgICBsZXQgeyBkaXN0YW5jZVVuaXQgfSA9IHRyaXAuaGVhZGVyXG5cbiAgICAgIGNvbnN0IGluY2hlcyA9IGRpc3RhbmNlVW5pdCA9PT0gTGVuZ3RoLmluY2hlc1xuICAgICAgaWYgKGluY2hlcykgZGlzdGFuY2VVbml0ID0gTGVuZ3RoLmZlZXRcblxuICAgICAgLy8gcmlnb3JvdXNseSBjaGVjayB0aGUgdmFsdWVzIGluIGFsbCB0aGUgY29sdW1ucyB0byBtYWtlIHN1cmUgdGhpc1xuICAgICAgLy8gaXMgcmVhbGx5IGEgc3VydmV5IHNob3QgbGluZSwganVzdCBpbiBjYXNlIGFueSBzdHJheSBjb21tZW50cyBhcmVcbiAgICAgIC8vIG5vdCBwcm9wZXJseSBkZWxpbWl0ZWQuXG5cbiAgICAgIC8vIGZyb20gc3RhdGlvbiBuYW1lXG4gICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS5zdWJzdHJpbmcoNSwgMTApKSkgY29udGludWVcbiAgICAgIGNvbnN0IGZyb21TdHIgPSB2YWxpZGF0ZSg1LCAxMCwgJ2Zyb20gc3RhdGlvbicsIGlzVmFsaWRTdGF0aW9uKVxuXG4gICAgICAvLyBTYWRseSBJIGhhdmUgZm91bmQgbmVnYXRpdmUgTFJVRCB2YWx1ZXMgaW4gQ2hpcCdzIGZvcm1hdCBhbmQgYXBwYXJlbnRseVxuICAgICAgLy8gaGlzIHByb2dyYW0gZG9lc24ndCBmYWlsIG9uIHRoZW0sIHNvIEkgaGF2ZSB0byBhY2NlcHQgdGhlbSBoZXJlXG4gICAgICAvLyBpc1ZhbGlkT3B0RmxvYXQgaW5zdGVhZCBvZiBpc1ZhbGlkT3B0VUZsb2F0XG4gICAgICBjb25zdCBsU3RyID0gdmFsaWRhdGUoNDAsIDQzLCAnbGVmdCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHJTdHIgPSB2YWxpZGF0ZSg0MywgNDYsICdyaWdodCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHVTdHIgPSB2YWxpZGF0ZSg0NiwgNDksICd1cCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IGRTdHIgPSB2YWxpZGF0ZSg0OSwgNTIsICdkb3duJywgaXNWYWxpZE9wdEZsb2F0KVxuXG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgY29uc3QgdXAgPSBwYXJzZUxydWQodVN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgZG93biA9IHBhcnNlTHJ1ZChkU3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCBsZWZ0ID0gcGFyc2VMcnVkKGxTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VMcnVkKHJTdHIsIGRpc3RhbmNlVW5pdClcblxuICAgICAgLy8gdG8gc3RhdGlvbiBuYW1lXG4gICAgICBjb25zdCB0b1N0ciA9IGxpbmUuc3Vic3RyaW5nKDAsIDUpXG4gICAgICBpZiAoIXRvU3RyLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBzaG90OiBGcmNzU2hvdCA9IHtcbiAgICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgICB0bzogbnVsbCxcbiAgICAgICAgICBraW5kOiBGcmNzU2hvdEtpbmQuTm9ybWFsLFxuICAgICAgICAgIGRpc3RhbmNlOiBuZXcgVW5pdGl6ZWROdW1iZXIoMCwgZGlzdGFuY2VVbml0KSxcbiAgICAgICAgICBmcm9udHNpZ2h0QXppbXV0aDogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRBemltdXRoOiBudWxsLFxuICAgICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBmcm9tTHJ1ZHM6IHtcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHVwLFxuICAgICAgICAgICAgZG93bixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4Y2x1ZGVEaXN0YW5jZTogdHJ1ZSxcbiAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KCksXG4gICAgICAgIH1cbiAgICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKCFpc1ZhbGlkU3RhdGlvbih0b1N0cikpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgc3RhdGlvbiBuYW1lJywgMCwgNSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUxydWRNYXRjaCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeXFxcXHMrJHtmcm9tU3RyXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLFxuICAgICAgICAgICAgJ1xcXFwkJidcbiAgICAgICAgICApfSgoXFxcXHMrKFxcXFxkKyhcXFxcLlxcXFxkKik/fFxcXFwuXFxcXGQrKSl7NH0pYFxuICAgICAgKS5leGVjKGxpbmUuc3Vic3RyaW5nKDUyKSlcbiAgICAgIGxldCBmcm9tTHJ1ZHNcbiAgICAgIGlmIChmcm9tTHJ1ZE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodCwgdXAsIGRvd25dID0gZnJvbUxydWRNYXRjaFsxXVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoL1xccysvZylcbiAgICAgICAgICAubWFwKHMgPT4gcGFyc2VMcnVkKHMsIGRpc3RhbmNlVW5pdCkpXG4gICAgICAgIGZyb21McnVkcyA9IHsgbGVmdCwgcmlnaHQsIHVwLCBkb3duIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXppbXV0aCBhbmQgaW5jbGluYXRpb25cbiAgICAgIGNvbnN0IGF6bUZzU3RyID0gdmFsaWRhdGUoMTksIDI1LCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBhem1Cc1N0ciA9IHZhbGlkYXRlKDI1LCAzMCwgJ2F6aW11dGgnLCBpc1ZhbGlkT3B0VUZsb2F0KVxuICAgICAgY29uc3QgaW5jRnNTdHIgPSBsaW5lLnN1YnN0cmluZygzMCwgMzUpXG4gICAgICBjb25zdCBpbmNCc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDM1LCA0MClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGxldCBraW5kOiBGcmNzU2hvdEtpbmRcbiAgICAgIGxldCBkaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPlxuICAgICAgbGV0IGhvcml6b250YWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHZlcnRpY2FsRGlzdGFuY2U6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCB1bmRlZmluZWRcbiAgICAgIGxldCBmcm9udHNpZ2h0SW5jbGluYXRpb246IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGxcbiAgICAgIGxldCBiYWNrc2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGV4Y2x1ZGVEaXN0YW5jZTogYm9vbGVhblxuICAgICAgbGV0IGlzU3BsYXk6IGJvb2xlYW5cblxuICAgICAgLy8gcGFyc2UgZGlzdGFuY2VcbiAgICAgIGlmIChpbmNoZXMpIHtcbiAgICAgICAgY29uc3QgZmVldFN0ciA9IGxpbmUuc3Vic3RyaW5nKDEwLCAxNClcbiAgICAgICAgY29uc3QgaW5jaGVzU3RyID0gbGluZS5zdWJzdHJpbmcoMTQsIDE3KVxuICAgICAgICAvLyBmZWV0IGFuZCBpbmNoZXMgYXJlIG5vdCBib3RoIG9wdGlvbmFsXG4gICAgICAgIGlmICghaXNWYWxpZFVJbnQoZmVldFN0cikgJiYgIWlzVmFsaWRVSW50KGluY2hlc1N0cikpIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkID0gZmVldFN0ci50cmltKCkgfHwgaW5jaGVzU3RyLnRyaW0oKVxuICAgICAgICAgIGVycm9yKGludmFsaWQgPyAnSW52YWxpZCBkaXN0YW5jZScgOiAnTWlzc2luZyBkaXN0YW5jZScsIDEwLCAxNylcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29tZXRpbWVzIGluY2hlcyBhcmUgb21pdHRlZCwgaGVuY2UgdGhlIHx8IDAuLi5JJ20gYXNzdW1pbmcgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyBmb3IgZmVldCB0byBiZSBvbWl0dGVkIGFzIHdlbGxcbiAgICAgICAgZGlzdGFuY2UgPSBVbml0aXplLmluY2hlcyhwYXJzZUZsb2F0KGluY2hlc1N0cikgfHwgMCkuYWRkKFxuICAgICAgICAgIFVuaXRpemUuZmVldChwYXJzZUZsb2F0KGZlZXRTdHIpIHx8IDApXG4gICAgICAgIClcblxuICAgICAgICBraW5kID0gcGFyc2VLaW5kKGxpbmVbMTddKVxuICAgICAgICAvLyBOT1RFIHRoZXJlIGFyZSB0d28gY29sdW1ucyBhcm91bmQgaGVyZSB0aGF0IGNhbiBjb250YWluIGEgKi5cbiAgICAgICAgLy8gSSB0aGluayB0aGV5IG1pZ2h0IHJlcHJlc2VudCBkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhpc2lzIGNvbmZ1c2VkIGJ5XG4gICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgZm9yIGZ0L2luIHNob3RzLCBpZiB0aGVyZSBpcyBhIEQgb3IgSCBmbGFnIGl0IG9jY3VwaWVzIHRoZVxuICAgICAgICAvLyBmaXJzdCBjb2x1bW4gdGhhdCBjYW4gY29udGFpbiBhICogZm9yIGRlY2ltYWwgZmVldCBzaG90c1xuICAgICAgICBleGNsdWRlRGlzdGFuY2UgPSBsaW5lWzE4XSA9PT0gJyonIHx8IGxpbmVbMThdID09PSAncydcbiAgICAgICAgaXNTcGxheSA9IGxpbmVbMThdID09PSAncydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlY2ltYWwgZmVldCBhcmUgbm90IG9wdGlvbmFsXG4gICAgICAgIGNvbnN0IGZlZXRTdHIgPSB2YWxpZGF0ZSgxMCwgMTYsICdkaXN0YW5jZScsIGlzVmFsaWRVRmxvYXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHBhcnNlRmxvYXQoZmVldFN0ciksIGRpc3RhbmNlVW5pdClcbiAgICAgICAga2luZCA9IHBhcnNlS2luZChsaW5lWzE2XSlcbiAgICAgICAgZXhjbHVkZURpc3RhbmNlID0gbGluZVsxN10gPT09ICcqJyB8fCBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICAgIGlzU3BsYXkgPSBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kICE9PSBGcmNzU2hvdEtpbmQuTm9ybWFsKSB7XG4gICAgICAgIHZhbGlkYXRlKDMwLCAzNSwgJ3ZlcnRpY2FsLWRpc3RhbmNlJywgaXNWYWxpZEZsb2F0KVxuICAgICAgfVxuXG4gICAgICAvLyBjb252ZXJ0IGhvcml6b250YWwgYW5kIGRpYWdvbmFsIHNob3RzIHRvIHN0YW5kYXJkXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgaW5jRnMgaXMgdGhlIHZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIHN0YXRpb25zXG4gICAgICAvLyBmb3J0dW5hdGVseSBpdCBhcHBlYXJzIHdlIGNhbiBhbHdheXMgY291bnQgb24gaW5jRnMgYmVpbmcgc3BlY2lmaWVkXG4gICAgICAvLyBhbmQgaW5jQnMgbm90IGJlaW5nIHNwZWNpZmllZCBmb3IgdGhlc2UgdHlwZXMgb2Ygc2hvdHNcbiAgICAgIGlmIChraW5kID09PSBGcmNzU2hvdEtpbmQuSG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBkaXN0YW5jZSBpcyBob3Jpem9udGFsIG9mZnNldCBhbmQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGhvcml6b250YWxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgIGNvbnN0IGggPSBob3Jpem9udGFsRGlzdGFuY2UuZ2V0KGRpc3RhbmNlVW5pdClcbiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoaW5jRnNTdHIpXG4gICAgICAgIHZlcnRpY2FsRGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIodiwgZGlzdGFuY2VVbml0KVxuICAgICAgICBkaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcihNYXRoLnNxcnQoaCAqIGggKyB2ICogdiksIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gQW5nbGUuYXRhbjIoXG4gICAgICAgICAgdmVydGljYWxEaXN0YW5jZSxcbiAgICAgICAgICBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgICAgKVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gRnJjc1Nob3RLaW5kLkRpYWdvbmFsKSB7XG4gICAgICAgIC8vIGRpc3RhbmNlIGlzIGFzIHVzdWFsLCBidXQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZS5nZXQoZGlzdGFuY2VVbml0KVxuICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChpbmNGc1N0cilcbiAgICAgICAgdmVydGljYWxEaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcih2LCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IEFuZ2xlLmFzaW4odiAvIGQpXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzMCwgMzUsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzNSwgNDAsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gcGFyc2VOdW1iZXIoaW5jRnNTdHIsIGluY2xpbmF0aW9uVW5pdClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBwYXJzZU51bWJlcihpbmNCc1N0ciwgaW5jbGluYXRpb25Vbml0KVxuICAgICAgfVxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZyb250c2lnaHRBemltdXRoID0gcGFyc2VBemltdXRoKGF6bUZzU3RyLCBhemltdXRoVW5pdClcbiAgICAgIGNvbnN0IGJhY2tzaWdodEF6aW11dGggPSBwYXJzZUF6aW11dGgoYXptQnNTdHIsIGF6aW11dGhVbml0KVxuXG4gICAgICBpZiAoIWZyb250c2lnaHRJbmNsaW5hdGlvbiAmJiAhYmFja3NpZ2h0SW5jbGluYXRpb24pIHtcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gVW5pdGl6ZS5kZWdyZWVzKDApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3Q6IEZyY3NTaG90ID0ge1xuICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgdG86IHRvU3RyLnRyaW0oKSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGZyb250c2lnaHRBemltdXRoLFxuICAgICAgICBiYWNrc2lnaHRBemltdXRoLFxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICB0b0xydWRzOiB7XG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICByaWdodCxcbiAgICAgICAgICB1cCxcbiAgICAgICAgICBkb3duLFxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRGlzdGFuY2UsXG4gICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgIH1cbiAgICAgIGlmIChpc1NwbGF5KSBzaG90LmlzU3BsYXkgPSB0cnVlXG4gICAgICBpZiAoZnJvbUxydWRzKSBzaG90LmZyb21McnVkcyA9IGZyb21McnVkc1xuICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSkgc2hvdC5ob3Jpem9udGFsRGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgIGlmICh2ZXJ0aWNhbERpc3RhbmNlKSBzaG90LnZlcnRpY2FsRGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlXG4gICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXZlLFxuICAgIGxvY2F0aW9uLFxuICAgIHRyaXBzLFxuICAgIGVycm9ycyxcbiAgfVxufVxuIl19
458
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcGFyc2VTZWdtZW50IiwicmVxdWlyZSIsIl91bml0aXplZCIsIl9GcmNzU2hvdCIsInBhcnNlTnVtYmVyIiwicyIsInVuaXQiLCJ2YWx1ZSIsInBhcnNlRmxvYXQiLCJpc05hTiIsIlVuaXRpemVkTnVtYmVyIiwicGFyc2VBemltdXRoIiwicGFyc2VkIiwiZ2V0IiwiQW5nbGUiLCJkZWdyZWVzIiwiVW5pdGl6ZSIsInBhcnNlS2luZCIsImtpbmQiLCJGcmNzU2hvdEtpbmQiLCJIb3Jpem9udGFsIiwiRGlhZ29uYWwiLCJOb3JtYWwiLCJwYXJzZUxlbmd0aFVuaXQiLCJMZW5ndGgiLCJpbmNoZXMiLCJmZWV0IiwibWV0ZXJzIiwicGFyc2VBbmdsZVVuaXQiLCJncmFkaWFucyIsIm1pbHNOQVRPIiwiaXNWYWxpZFN0YXRpb24iLCJ0ZXN0IiwiaXNWYWxpZFVJbnQiLCJpc1ZhbGlkRmxvYXQiLCJpc1ZhbGlkT3B0RmxvYXQiLCJpc1ZhbGlkT3B0VUZsb2F0IiwiaXNWYWxpZFVGbG9hdCIsImlzVmFsaWRPcHRJbmNsaW5hdGlvbiIsInBhcnNlTHJ1ZCIsIk51bWJlciIsImlzRmluaXRlIiwicGFyc2VGcmNzU3VydmV5RmlsZSIsImZpbGUiLCJsaW5lcyIsImNhdmUiLCJsb2NhdGlvbiIsInRyaXBzIiwiZXJyb3JzIiwidHJpcE5hbWUiLCJ0cmlwVGVhbSIsInRyaXBEYXRlIiwiaW5UcmlwQ29tbWVudCIsInRyaXBDb21tZW50U3RhcnRMaW5lIiwidHJpcENvbW1lbnRFbmRMaW5lIiwidHJpcENvbW1lbnQiLCJjb21tZW50TGluZXMiLCJ0cmlwIiwiaW5CbG9ja0NvbW1lbnQiLCJzZWN0aW9uIiwiZ2V0Q29tbWVudCIsImNvbW1lbnQiLCJqb2luIiwidHJpbSIsImxpbmVOdW1iZXIiLCJsaW5lIiwiZXJyb3JlZCIsInRoaXNMaW5lTnVtYmVyIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhcnRDb2x1bW4iLCJlbmRDb2x1bW4iLCJwdXNoIiwiU2VnbWVudFBhcnNlRXJyb3IiLCJTZWdtZW50Iiwic291cmNlIiwic3RhcnRMaW5lIiwic3RhcnRDb2wiLCJzdWJzdHJpbmciLCJ2YWxpZGF0ZSIsImZpZWxkTmFtZSIsInZhbGlkYXRvciIsImZpZWxkIiwibWF0Y2giLCJleGVjIiwiY2hhckF0IiwidW5kZWZpbmVkIiwiayIsInRlYW0iLCJtb250aCIsInBhcnNlSW50IiwiZGF5IiwieWVhciIsIkRhdGUiLCJzcGxpdCIsImluZGV4T2YiLCJwYXJ0IiwiZGlzdGFuY2VVbml0Iiwic2xpY2UiLCJhemltdXRoVW5pdCIsImluY2xpbmF0aW9uVW5pdCIsImJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQiLCJiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCIsImhhc0JhY2tzaWdodEF6aW11dGgiLCJoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbiIsImhlYWRlciIsIm5hbWUiLCJkYXRlIiwic2hvdHMiLCJmcm9tU3RyIiwibFN0ciIsInJTdHIiLCJ1U3RyIiwiZFN0ciIsInVwIiwiZG93biIsImxlZnQiLCJyaWdodCIsInRvU3RyIiwic2hvdCIsImZyb20iLCJ0byIsImRpc3RhbmNlIiwiZnJvbnRzaWdodEF6aW11dGgiLCJiYWNrc2lnaHRBemltdXRoIiwiZnJvbnRzaWdodEluY2xpbmF0aW9uIiwiYmFja3NpZ2h0SW5jbGluYXRpb24iLCJmcm9tTHJ1ZHMiLCJleGNsdWRlRGlzdGFuY2UiLCJmcm9tTHJ1ZE1hdGNoIiwiUmVnRXhwIiwicmVwbGFjZSIsIm1hcCIsImF6bUZzU3RyIiwiYXptQnNTdHIiLCJpbmNGc1N0ciIsImluY0JzU3RyIiwiaG9yaXpvbnRhbERpc3RhbmNlIiwidmVydGljYWxEaXN0YW5jZSIsImlzU3BsYXkiLCJmZWV0U3RyIiwiaW5jaGVzU3RyIiwiaW52YWxpZCIsImFkZCIsImgiLCJ2IiwiTWF0aCIsInNxcnQiLCJhdGFuMiIsImQiLCJhc2luIiwidG9McnVkcyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUZyY3NTdXJ2ZXlGaWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZyY3NTdXJ2ZXlGaWxlIH0gZnJvbSAnLi9GcmNzU3VydmV5RmlsZSdcbmltcG9ydCB7IEZyY3NUcmlwIH0gZnJvbSAnLi9GcmNzVHJpcCdcbmltcG9ydCB7IFNlZ21lbnQsIFNlZ21lbnRQYXJzZUVycm9yIH0gZnJvbSAncGFyc2Utc2VnbWVudCdcbmltcG9ydCB7XG4gIEFuZ2xlLFxuICBMZW5ndGgsXG4gIFVuaXQsXG4gIFVuaXRpemVkTnVtYmVyLFxuICBVbml0VHlwZSxcbiAgVW5pdGl6ZSxcbn0gZnJvbSAnQHNwZWxlb3RpY2EvdW5pdGl6ZWQnXG5pbXBvcnQgeyBGcmNzU2hvdCwgRnJjc1Nob3RLaW5kIH0gZnJvbSAnLi9GcmNzU2hvdCdcblxuZnVuY3Rpb24gcGFyc2VOdW1iZXI8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PFQ+XG4pOiBVbml0aXplZE51bWJlcjxUPiB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQocylcbiAgaWYgKGlzTmFOKHZhbHVlKSkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuZnVuY3Rpb24gcGFyc2VBemltdXRoKFxuICBzOiBzdHJpbmcsXG4gIHVuaXQ6IFVuaXQ8QW5nbGU+XG4pOiBVbml0aXplZE51bWJlcjxBbmdsZT4gfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VOdW1iZXIocywgdW5pdClcbiAgcmV0dXJuIHBhcnNlZD8uZ2V0KEFuZ2xlLmRlZ3JlZXMpID09PSAzNjAgPyBVbml0aXplLmRlZ3JlZXMoMCkgOiBwYXJzZWRcbn1cblxuZnVuY3Rpb24gcGFyc2VLaW5kKGtpbmQ6IHN0cmluZyk6IEZyY3NTaG90S2luZCB7XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ0gnOlxuICAgICAgcmV0dXJuIEZyY3NTaG90S2luZC5Ib3Jpem9udGFsXG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gRnJjc1Nob3RLaW5kLkRpYWdvbmFsXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBGcmNzU2hvdEtpbmQuTm9ybWFsXG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMZW5ndGhVbml0KHVuaXQ6IHN0cmluZyk6IFVuaXQ8TGVuZ3RoPiB8IG51bGwge1xuICBzd2l0Y2ggKHVuaXQpIHtcbiAgICBjYXNlICdGSSc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmluY2hlc1xuICAgIGNhc2UgJ0ZGJzpcbiAgICBjYXNlICdGVCc6XG4gICAgICByZXR1cm4gTGVuZ3RoLmZlZXRcbiAgICBjYXNlICdNVCc6XG4gICAgY2FzZSAnTSAnOlxuICAgICAgcmV0dXJuIExlbmd0aC5tZXRlcnNcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuZnVuY3Rpb24gcGFyc2VBbmdsZVVuaXQodW5pdDogc3RyaW5nKTogVW5pdDxBbmdsZT4gfCBudWxsIHtcbiAgc3dpdGNoICh1bml0KSB7XG4gICAgY2FzZSAnRCc6XG4gICAgICByZXR1cm4gQW5nbGUuZGVncmVlc1xuICAgIGNhc2UgJ0cnOlxuICAgICAgcmV0dXJuIEFuZ2xlLmdyYWRpYW5zXG4gICAgY2FzZSAnTSc6XG4gICAgICByZXR1cm4gQW5nbGUubWlsc05BVE9cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHN0YXRpb24gbmFtZS5cbmZ1bmN0aW9uIGlzVmFsaWRTdGF0aW9uKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqXFxTK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGludGVnZXIuXG5mdW5jdGlvbiBpc1ZhbGlkVUludChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldK1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT8oWzAtOV0rKFxcLlswLTldKik/fFxcLlswLTldKylcXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdEZsb2F0KHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL15cXHMqWy0rXT9bMC05XSooXFwuWzAtOV0qKT9cXHMqJC8udGVzdChzKVxufVxuLy8gZGV0ZXJtaW5lcyBpZiBhIGNlbGwgY29udGFpbnMgYSB2YWxpZCB1bnNpZ25lZCBmbG9hdCBvciB3aGl0ZXNwYWNlLlxuZnVuY3Rpb24gaXNWYWxpZE9wdFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKlswLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIHVuc2lnbmVkIGZsb2F0LlxuZnVuY3Rpb24gaXNWYWxpZFVGbG9hdChzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxzKihbMC05XSsoXFwuWzAtOV0qKT98XFwuWzAtOV0rKVxccyokLy50ZXN0KHMpXG59XG4vLyBkZXRlcm1pbmVzIGlmIGEgY2VsbCBjb250YWlucyBhIHZhbGlkIGluY2xpbmF0aW9uIG9yIHdoaXRlc3BhY2UuXG5mdW5jdGlvbiBpc1ZhbGlkT3B0SW5jbGluYXRpb24oczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlxccypbLStdP1swLTldKihcXC5bMC05XSopP1xccyokLy50ZXN0KHMpXG59XG5mdW5jdGlvbiBwYXJzZUxydWQ8VCBleHRlbmRzIFVuaXRUeXBlPFQ+PihcbiAgczogc3RyaW5nLFxuICB1bml0OiBVbml0PExlbmd0aD5cbik6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCBudWxsIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJzZUZsb2F0KHMpXG4gIHJldHVybiAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSB8fCB2YWx1ZSA8IDBcbiAgICA/IG51bGxcbiAgICA6IG5ldyBVbml0aXplZE51bWJlcih2YWx1ZSwgdW5pdClcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSByYXcgY2RhdGEuZnIgc3VydmV5IGZpbGUuICBUaGVzZSBsb29rIGxpa2Ugc286XG4gKlxuPHByZT4gICAgICBGaXNoZXIgUmlkZ2UgQ2F2ZSBTeXN0ZW0sIEhhcnQgQ28uLCBLWVxuRU5UUkFOQ0UgRFJPUFMsIEpPRSdTIFwiSSBMT1ZFIE1ZIFdJRkUgVFJBVkVSU0VcIiwgVFJJQ0tZIFRSQVZFUlNFXG5QRVRFUiBRVUlDSywgS0VJVEggT1JUSVogICAtICAyLTE1LTgxXG5UaGlzIEZpbGUgaGFzIENydW1wcyB0ZXN0IGNvbm5lY3RlZC4gIDExLzIwLzEyXG4gKlxuRlQgQyAgREQgICAgQVxuICAgICAgQUUyMCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgMyAgMCAgMlxuKiAgICAgICVGU1xuKiAgICAgQUUyMCAgICAgMCAgICAgICAgMCAgICAgICAgMCAgICAgICAgQnVnLWNhbid0IHB1dCBiZWZvcmUgc28gcHV0IGFmdGVyLXNvIGNhbid0IG1ha2UgMiBmaXhlZCAxMC8yOC8xMlxuIEFFMTkgQUUyMCAgIDkuMyAgICA2MC4wICA2MC4wLTM2LjAgICAgICAgMiAxMiAgMCAyMFxuIEFFMTggQUUxOSAgMjQuNSAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgNiAxMCAyNSAgMFxuIEFFMTcgQUUxOCAgIDguMCAgIDM1MC41IDM1MC41IDE3LjAgICAgICAgMyAgNSAgMCAgMFxuIEFFMTYgQUUxNyAgIDYuNyAgICAgMC4wICAgMC4wLTkwLjAgICAgICAgMyAgNSAgNiAgMVxuIEFFMTUgQUUxNiAgMTIuNiAgICA3MC41ICA3MS4wLTE4LjAgICAgICAgNCAgMCAgMiAgMVxuIEFFMTQgQUUxNSAgMTAuMCAgICAyMS41ICAyMC4wICA2LjAgICAgICAgNSAgNSAgMCAgM1xuIEFFMTMgQUUxNCAgMjYuOCAgIDI4OC4wIDI4Ni4wLTUwLjAgICAgICAgMCAgNyAyMCAgNVxuKlxuKlNIT1JUIENBTllPTiBBVCBUSEUgQkFTRSBPRiBUSEUgU0VDT05EIERST1BcbiBBRTEyIEFFMTMgIDIwLjcgICAyMzYuMCAyMzYuMCAzNC4wICAgICAgIDMgIDUgIDQgIDRcbiBBRTExIEFFMTIgIDEyLjQgICAyMTAuMCAyMTAuMCAzNS4wICAgICAgIDcgIDQgIDUgIDFcbiBBRTEwIEFFMTMgIDI1LjcgICAgNDAuMCAgNDAuMCAtOS4wICAgICAgIDIgIDIgIDMgIDZcbipcbipBRTEwIEFUIEpPRSdTIFwiIEkgTE9WRSBNWSBXSUZFIFRSQVZFUlNFIFwiXG4gIEFFOSBBRTEwICAxNy44ICAgIDMyLjUgIDMxLjAgMjMuMCAgICAgICA0ICA1IDIwIDE1XG4gIEFFMSAgQUU5ICAxMy43ICAgIDgyLjAgIDgyLjAtMTMuMFxuICAgQTEgIEFFMSAgMzQuMyAgICA0Ni4wICA0OC4wLTE3LjVcbipcbipTVVJWRVkgVE8gRE9NRSBORUFSIFRIRSBFTlRSQU5DRSBET01FIChBQk9WRSBUSEUgU0VDT05EIERST1ApXG4gIEFEMSBBRTE1ICAgOC4wICAgMjAwLjAgMjAwLjAgIDAuMCAgICAgICAzICAxICAxICAxXG4gIEFEMiAgQUQxICAxNy43ICAgMTYxLjAgMTYxLjAgIDcuMCAgICAgICAxICA0IDI1ICAxXG4gIEFEMyAgQUQyICAxMC40ICAgMTgwLjAgMTgwLjAgNTAuMCAgICAgICA0ICAxIDE1ICA1XG4gKlxuVFJJQ0tZIFRSQVZFUlNFIEFORCBUSEVOIEZJUlNUIFNVUlZFWSBJTiBVUFBFUiBDUk9XTFdBWVxuREFOIENST1dMLCBLRUlUSCBPUlRJWiwgQ0hJUCBIT1BQRVIsIFBFVEVSIFFVSUNLLCBMQVJSWSBCRUFOICAgIDE0IEZFQiAxOTgxXG4gKlxuRkkgQiAgRERcbiAgIEEyICAgQTEgIDQ4IDEwICAyOTIuMCAxMTAuMC00Mi4wICAgICAgIDUgMTAgMzUgIDVcbiAgIEEzICAgQTIgIDEyICA1ICAzMzMuNSAxNTMuNSAzNS4wICAgICAgIDMgIDEgMTUgIDVcbiAgIEE0ICAgQTMgICA0ICAyICAgIDAuMCAgIDAuMCA5MC4wICAgICAgIDMgIDEgMTAgMTBcbi4uLjwvcHJlPlxuICpcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcGFyc2VGcmNzU3VydmV5RmlsZShcbiAgZmlsZTogYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbGluZXM6IEFzeW5jSXRlcmFibGU8c3RyaW5nPlxuKTogUHJvbWlzZTxGcmNzU3VydmV5RmlsZT4ge1xuICBsZXQgY2F2ZTogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgbGV0IGxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBjb25zdCB0cmlwczogQXJyYXk8RnJjc1RyaXA+ID0gW11cbiAgY29uc3QgZXJyb3JzOiBBcnJheTxTZWdtZW50UGFyc2VFcnJvcj4gPSBbXVxuXG4gIGxldCB0cmlwTmFtZVxuICBsZXQgdHJpcFRlYW1cbiAgbGV0IHRyaXBEYXRlXG4gIGxldCBpblRyaXBDb21tZW50ID0gdHJ1ZVxuICBsZXQgdHJpcENvbW1lbnRTdGFydExpbmUgPSAxXG4gIGxldCB0cmlwQ29tbWVudEVuZExpbmUgPSAtMVxuICBsZXQgdHJpcENvbW1lbnQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBsZXQgY29tbWVudExpbmVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbCA9IG51bGxcbiAgbGV0IHRyaXA6IEZyY3NUcmlwIHwgbnVsbCA9IG51bGxcbiAgbGV0IGluQmxvY2tDb21tZW50ID0gZmFsc2VcbiAgbGV0IHNlY3Rpb25cblxuICBmdW5jdGlvbiBnZXRDb21tZW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghY29tbWVudExpbmVzKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50TGluZXMuam9pbignXFxuJykudHJpbSgpXG4gICAgY29tbWVudExpbmVzID0gbnVsbFxuICAgIHJldHVybiBjb21tZW50IHx8IG51bGxcbiAgfVxuXG4gIGxldCBsaW5lTnVtYmVyID0gMFxuXG4gIGZvciBhd2FpdCAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGxldCBlcnJvcmVkID0gZmFsc2VcblxuICAgIGNvbnN0IHRoaXNMaW5lTnVtYmVyID0gbGluZU51bWJlclxuXG4gICAgY29uc3QgZXJyb3IgPSAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgZW5kQ29sdW1uOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGVycm9yZWQgPSB0cnVlXG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgbmV3IFNlZ21lbnRQYXJzZUVycm9yKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgbmV3IFNlZ21lbnQoe1xuICAgICAgICAgICAgdmFsdWU6IGxpbmUsXG4gICAgICAgICAgICBzb3VyY2U6IGZpbGUsXG4gICAgICAgICAgICBzdGFydExpbmU6IHRoaXNMaW5lTnVtYmVyLFxuICAgICAgICAgICAgc3RhcnRDb2w6IDAsXG4gICAgICAgICAgfSkuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IChcbiAgICAgIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBlbmRDb2x1bW46IG51bWJlcixcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gYm9vbGVhblxuICAgICk6IHN0cmluZyA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IGxpbmUuc3Vic3RyaW5nKHN0YXJ0Q29sdW1uLCBlbmRDb2x1bW4pXG4gICAgICBpZiAoIXZhbGlkYXRvcihmaWVsZCkpIHtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgKGZpZWxkLnRyaW0oKSA/ICdJbnZhbGlkICcgOiAnTWlzc2luZyAnKSArIGZpZWxkTmFtZSxcbiAgICAgICAgICBzdGFydENvbHVtbixcbiAgICAgICAgICBlbmRDb2x1bW5cbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZpZWxkXG4gICAgfVxuXG4gICAgbGluZU51bWJlcisrXG5cbiAgICBpZiAobGluZU51bWJlciA9PT0gMSkge1xuICAgICAgY29uc3QgbWF0Y2ggPSAvXlxccyooW14sXSspKCwoLiopKT8vLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBjYXZlID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgIGxvY2F0aW9uID0gbWF0Y2hbM10udHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09ICcgJyAmJiBsaW5lLmNoYXJBdCgxKSA9PT0gJyonKSB7XG4gICAgICBpblRyaXBDb21tZW50ID0gIWluVHJpcENvbW1lbnRcbiAgICAgIGlmIChpblRyaXBDb21tZW50KSB7XG4gICAgICAgIHNlY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgICAgdHJpcENvbW1lbnQgPSBbXVxuICAgICAgICB0cmlwQ29tbWVudFN0YXJ0TGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaXBDb21tZW50RW5kTGluZSA9IGxpbmVOdW1iZXJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluVHJpcENvbW1lbnQpIHtcbiAgICAgIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudFN0YXJ0TGluZSArIDEpIHtcbiAgICAgICAgdHJpcE5hbWUgPSBsaW5lICYmIGxpbmUudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPT09IHRyaXBDb21tZW50U3RhcnRMaW5lICsgMikge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9eKC4rPylcXHMqWy0uXVxccyooXFxkKylcXC8oXFxkKylcXC8oXFxkKykkLy5leGVjKFxuICAgICAgICAgIGxpbmUgJiYgbGluZS50cmltKClcbiAgICAgICAgKVxuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsZXQgayA9IDFcbiAgICAgICAgICBjb25zdCB0ZWFtID0gbWF0Y2hbaysrXVxuICAgICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbaysrXSlcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtrKytdKVxuICAgICAgICAgIHRyaXBEYXRlID0gbmV3IERhdGUoeWVhciA8IDcwID8geWVhciArIDIwMDAgOiB5ZWFyLCBtb250aCAtIDEsIGRheSlcbiAgICAgICAgICB0cmlwVGVhbSA9IHRlYW0uc3BsaXQoXG4gICAgICAgICAgICB0ZWFtLmluZGV4T2YoJzsnKSA+PSAwID8gL1xccyo7XFxzKi9nIDogL1xccyosXFxzKi9nXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGxpbmVOdW1iZXIgPiAxKSB7XG4gICAgICAgIHRyaXBDb21tZW50LnB1c2gobGluZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGNoID0gL15cXCpcXCpcXCooW14qXSlcXCpcXCpcXCovLmV4ZWMobGluZSlcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBzZWN0aW9uID0gbWF0Y2hbMV0udHJpbSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsaW5lLmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICBpbkJsb2NrQ29tbWVudCA9ICFpbkJsb2NrQ29tbWVudFxuICAgICAgaWYgKGluQmxvY2tDb21tZW50KSBjb21tZW50TGluZXMgPSBbXVxuICAgICAgZWxzZSBpZiAoY29tbWVudExpbmVzKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBsaW5lLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgaWYgKHBhcnQgJiYgY29tbWVudExpbmVzKSBjb21tZW50TGluZXMucHVzaChwYXJ0KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5CbG9ja0NvbW1lbnQpIHtcbiAgICAgIGlmIChjb21tZW50TGluZXMpIGNvbW1lbnRMaW5lcy5wdXNoKGxpbmUpXG4gICAgfSBlbHNlIGlmIChsaW5lTnVtYmVyID09PSB0cmlwQ29tbWVudEVuZExpbmUgKyAxKSB7XG4gICAgICAvLyBGVCBDQyBERFxuICAgICAgLy8gMDEyMzQ1NjdcbiAgICAgIGxldCBkaXN0YW5jZVVuaXQgPSBwYXJzZUxlbmd0aFVuaXQobGluZS5zbGljZSgwLCAyKSlcbiAgICAgIGlmICghZGlzdGFuY2VVbml0KSB7XG4gICAgICAgIGRpc3RhbmNlVW5pdCA9IExlbmd0aC5mZWV0XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIHVuaXQnLCAwLCAyKVxuICAgICAgfVxuICAgICAgbGV0IGF6aW11dGhVbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs2XSlcbiAgICAgIGlmICghYXppbXV0aFVuaXQpIHtcbiAgICAgICAgYXppbXV0aFVuaXQgPSBBbmdsZS5kZWdyZWVzXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGF6aW11dGggdW5pdCcsIDYsIDcpXG4gICAgICB9XG4gICAgICBsZXQgaW5jbGluYXRpb25Vbml0ID0gcGFyc2VBbmdsZVVuaXQobGluZVs3XSlcbiAgICAgIGlmICghaW5jbGluYXRpb25Vbml0KSB7XG4gICAgICAgIGluY2xpbmF0aW9uVW5pdCA9IEFuZ2xlLmRlZ3JlZXNcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgaW5jbGluYXRpb24gdW5pdCcsIDcsIDgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrc2lnaHRBemltdXRoQ29ycmVjdGVkID0gbGluZVszXSA9PT0gJ0MnXG4gICAgICBjb25zdCBiYWNrc2lnaHRJbmNsaW5hdGlvbkNvcnJlY3RlZCA9IGxpbmVbNF0gPT09ICdDJ1xuICAgICAgY29uc3QgaGFzQmFja3NpZ2h0QXppbXV0aCA9IGxpbmVbM10gIT09ICcgJyAmJiBsaW5lWzNdICE9PSAnLSdcbiAgICAgIGNvbnN0IGhhc0JhY2tzaWdodEluY2xpbmF0aW9uID0gbGluZVs0XSAhPT0gJyAnICYmIGxpbmVbNF0gIT09ICctJ1xuXG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVszXSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGF6aW11dGggdHlwZScsIDMsIDQpXG4gICAgICB9XG4gICAgICBpZiAoIS9bLUNCIF0vLnRlc3QobGluZVs0XSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYmFja3NpZ2h0IGluY2xpbmF0aW9uIHR5cGUnLCA0LCA1KVxuICAgICAgfVxuXG4gICAgICB0cmlwID0ge1xuICAgICAgICBoZWFkZXI6IHtcbiAgICAgICAgICBuYW1lOiB0cmlwTmFtZSB8fCAnJyxcbiAgICAgICAgICBjb21tZW50OiAodHJpcENvbW1lbnQgJiYgdHJpcENvbW1lbnQuam9pbignXFxuJykpIHx8IG51bGwsXG4gICAgICAgICAgc2VjdGlvbixcbiAgICAgICAgICBkYXRlOiB0cmlwRGF0ZSxcbiAgICAgICAgICB0ZWFtOiB0cmlwVGVhbSxcbiAgICAgICAgICBkaXN0YW5jZVVuaXQsXG4gICAgICAgICAgYXppbXV0aFVuaXQsXG4gICAgICAgICAgaW5jbGluYXRpb25Vbml0LFxuICAgICAgICAgIGJhY2tzaWdodEF6aW11dGhDb3JyZWN0ZWQsXG4gICAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb25Db3JyZWN0ZWQsXG4gICAgICAgICAgaGFzQmFja3NpZ2h0QXppbXV0aCxcbiAgICAgICAgICBoYXNCYWNrc2lnaHRJbmNsaW5hdGlvbixcbiAgICAgICAgfSxcbiAgICAgICAgc2hvdHM6IFtdLFxuICAgICAgfVxuICAgICAgdHJpcHMucHVzaCh0cmlwKVxuICAgIH0gZWxzZSBpZiAodHJpcCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaG90cyxcbiAgICAgICAgaGVhZGVyOiB7IGF6aW11dGhVbml0LCBpbmNsaW5hdGlvblVuaXQgfSxcbiAgICAgIH0gPSB0cmlwXG4gICAgICBsZXQgeyBkaXN0YW5jZVVuaXQgfSA9IHRyaXAuaGVhZGVyXG5cbiAgICAgIGNvbnN0IGluY2hlcyA9IGRpc3RhbmNlVW5pdCA9PT0gTGVuZ3RoLmluY2hlc1xuICAgICAgaWYgKGluY2hlcykgZGlzdGFuY2VVbml0ID0gTGVuZ3RoLmZlZXRcblxuICAgICAgLy8gcmlnb3JvdXNseSBjaGVjayB0aGUgdmFsdWVzIGluIGFsbCB0aGUgY29sdW1ucyB0byBtYWtlIHN1cmUgdGhpc1xuICAgICAgLy8gaXMgcmVhbGx5IGEgc3VydmV5IHNob3QgbGluZSwganVzdCBpbiBjYXNlIGFueSBzdHJheSBjb21tZW50cyBhcmVcbiAgICAgIC8vIG5vdCBwcm9wZXJseSBkZWxpbWl0ZWQuXG5cbiAgICAgIC8vIGZyb20gc3RhdGlvbiBuYW1lXG4gICAgICBpZiAoIS9cXFMvLnRlc3QobGluZS5zdWJzdHJpbmcoNSwgMTApKSkgY29udGludWVcbiAgICAgIGNvbnN0IGZyb21TdHIgPSB2YWxpZGF0ZSg1LCAxMCwgJ2Zyb20gc3RhdGlvbicsIGlzVmFsaWRTdGF0aW9uKVxuXG4gICAgICAvLyBTYWRseSBJIGhhdmUgZm91bmQgbmVnYXRpdmUgTFJVRCB2YWx1ZXMgaW4gQ2hpcCdzIGZvcm1hdCBhbmQgYXBwYXJlbnRseVxuICAgICAgLy8gaGlzIHByb2dyYW0gZG9lc24ndCBmYWlsIG9uIHRoZW0sIHNvIEkgaGF2ZSB0byBhY2NlcHQgdGhlbSBoZXJlXG4gICAgICAvLyBpc1ZhbGlkT3B0RmxvYXQgaW5zdGVhZCBvZiBpc1ZhbGlkT3B0VUZsb2F0XG4gICAgICBjb25zdCBsU3RyID0gdmFsaWRhdGUoNDAsIDQzLCAnbGVmdCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHJTdHIgPSB2YWxpZGF0ZSg0MywgNDYsICdyaWdodCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IHVTdHIgPSB2YWxpZGF0ZSg0NiwgNDksICd1cCcsIGlzVmFsaWRPcHRGbG9hdClcbiAgICAgIGNvbnN0IGRTdHIgPSB2YWxpZGF0ZSg0OSwgNTIsICdkb3duJywgaXNWYWxpZE9wdEZsb2F0KVxuXG4gICAgICBpZiAoZXJyb3JlZCkgY29udGludWVcblxuICAgICAgY29uc3QgdXAgPSBwYXJzZUxydWQodVN0ciwgZGlzdGFuY2VVbml0KVxuICAgICAgY29uc3QgZG93biA9IHBhcnNlTHJ1ZChkU3RyLCBkaXN0YW5jZVVuaXQpXG4gICAgICBjb25zdCBsZWZ0ID0gcGFyc2VMcnVkKGxTdHIsIGRpc3RhbmNlVW5pdClcbiAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VMcnVkKHJTdHIsIGRpc3RhbmNlVW5pdClcblxuICAgICAgLy8gdG8gc3RhdGlvbiBuYW1lXG4gICAgICBjb25zdCB0b1N0ciA9IGxpbmUuc3Vic3RyaW5nKDAsIDUpXG4gICAgICBpZiAoIXRvU3RyLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBzaG90OiBGcmNzU2hvdCA9IHtcbiAgICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgICB0bzogbnVsbCxcbiAgICAgICAgICBraW5kOiBGcmNzU2hvdEtpbmQuTm9ybWFsLFxuICAgICAgICAgIGRpc3RhbmNlOiBuZXcgVW5pdGl6ZWROdW1iZXIoMCwgZGlzdGFuY2VVbml0KSxcbiAgICAgICAgICBmcm9udHNpZ2h0QXppbXV0aDogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRBemltdXRoOiBudWxsLFxuICAgICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbjogbnVsbCxcbiAgICAgICAgICBmcm9tTHJ1ZHM6IHtcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgIHVwLFxuICAgICAgICAgICAgZG93bixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV4Y2x1ZGVEaXN0YW5jZTogdHJ1ZSxcbiAgICAgICAgICBjb21tZW50OiBnZXRDb21tZW50KCksXG4gICAgICAgIH1cbiAgICAgICAgc2hvdHMucHVzaChzaG90KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKCFpc1ZhbGlkU3RhdGlvbih0b1N0cikpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgc3RhdGlvbiBuYW1lJywgMCwgNSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUxydWRNYXRjaCA9IG5ldyBSZWdFeHAoXG4gICAgICAgIGBeXFxcXHMrJHtmcm9tU3RyXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLFxuICAgICAgICAgICAgJ1xcXFwkJidcbiAgICAgICAgICApfSgoXFxcXHMrKFxcXFxkKyhcXFxcLlxcXFxkKik/fFxcXFwuXFxcXGQrKSl7NH0pYFxuICAgICAgKS5leGVjKGxpbmUuc3Vic3RyaW5nKDUyKSlcbiAgICAgIGxldCBmcm9tTHJ1ZHNcbiAgICAgIGlmIChmcm9tTHJ1ZE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IFtsZWZ0LCByaWdodCwgdXAsIGRvd25dID0gZnJvbUxydWRNYXRjaFsxXVxuICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAuc3BsaXQoL1xccysvZylcbiAgICAgICAgICAubWFwKHMgPT4gcGFyc2VMcnVkKHMsIGRpc3RhbmNlVW5pdCkpXG4gICAgICAgIGZyb21McnVkcyA9IHsgbGVmdCwgcmlnaHQsIHVwLCBkb3duIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXppbXV0aCBhbmQgaW5jbGluYXRpb25cbiAgICAgIGNvbnN0IGF6bUZzU3RyID0gdmFsaWRhdGUoMTksIDI1LCAnYXppbXV0aCcsIGlzVmFsaWRPcHRVRmxvYXQpXG4gICAgICBjb25zdCBhem1Cc1N0ciA9IHZhbGlkYXRlKDI1LCAzMCwgJ2F6aW11dGgnLCBpc1ZhbGlkT3B0VUZsb2F0KVxuICAgICAgY29uc3QgaW5jRnNTdHIgPSBsaW5lLnN1YnN0cmluZygzMCwgMzUpXG4gICAgICBjb25zdCBpbmNCc1N0ciA9IGxpbmUuc3Vic3RyaW5nKDM1LCA0MClcblxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGxldCBraW5kOiBGcmNzU2hvdEtpbmRcbiAgICAgIGxldCBkaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPlxuICAgICAgbGV0IGhvcml6b250YWxEaXN0YW5jZTogVW5pdGl6ZWROdW1iZXI8TGVuZ3RoPiB8IHVuZGVmaW5lZFxuICAgICAgbGV0IHZlcnRpY2FsRGlzdGFuY2U6IFVuaXRpemVkTnVtYmVyPExlbmd0aD4gfCB1bmRlZmluZWRcbiAgICAgIGxldCBmcm9udHNpZ2h0SW5jbGluYXRpb246IFVuaXRpemVkTnVtYmVyPEFuZ2xlPiB8IG51bGxcbiAgICAgIGxldCBiYWNrc2lnaHRJbmNsaW5hdGlvbjogVW5pdGl6ZWROdW1iZXI8QW5nbGU+IHwgbnVsbFxuICAgICAgbGV0IGV4Y2x1ZGVEaXN0YW5jZTogYm9vbGVhblxuICAgICAgbGV0IGlzU3BsYXk6IGJvb2xlYW5cblxuICAgICAgLy8gcGFyc2UgZGlzdGFuY2VcbiAgICAgIGlmIChpbmNoZXMpIHtcbiAgICAgICAgY29uc3QgZmVldFN0ciA9IGxpbmUuc3Vic3RyaW5nKDEwLCAxNClcbiAgICAgICAgY29uc3QgaW5jaGVzU3RyID0gbGluZS5zdWJzdHJpbmcoMTQsIDE3KVxuICAgICAgICAvLyBmZWV0IGFuZCBpbmNoZXMgYXJlIG5vdCBib3RoIG9wdGlvbmFsXG4gICAgICAgIGlmICghaXNWYWxpZFVJbnQoZmVldFN0cikgJiYgIWlzVmFsaWRVSW50KGluY2hlc1N0cikpIHtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkID0gZmVldFN0ci50cmltKCkgfHwgaW5jaGVzU3RyLnRyaW0oKVxuICAgICAgICAgIGVycm9yKGludmFsaWQgPyAnSW52YWxpZCBkaXN0YW5jZScgOiAnTWlzc2luZyBkaXN0YW5jZScsIDEwLCAxNylcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc29tZXRpbWVzIGluY2hlcyBhcmUgb21pdHRlZCwgaGVuY2UgdGhlIHx8IDAuLi5JJ20gYXNzdW1pbmcgaXQncyBwb3NzaWJsZVxuICAgICAgICAvLyBmb3IgZmVldCB0byBiZSBvbWl0dGVkIGFzIHdlbGxcbiAgICAgICAgZGlzdGFuY2UgPSBVbml0aXplLmluY2hlcyhwYXJzZUZsb2F0KGluY2hlc1N0cikgfHwgMCkuYWRkKFxuICAgICAgICAgIFVuaXRpemUuZmVldChwYXJzZUZsb2F0KGZlZXRTdHIpIHx8IDApXG4gICAgICAgIClcblxuICAgICAgICBraW5kID0gcGFyc2VLaW5kKGxpbmVbMTddKVxuICAgICAgICAvLyBOT1RFIHRoZXJlIGFyZSB0d28gY29sdW1ucyBhcm91bmQgaGVyZSB0aGF0IGNhbiBjb250YWluIGEgKi5cbiAgICAgICAgLy8gSSB0aGluayB0aGV5IG1pZ2h0IHJlcHJlc2VudCBkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhpc2lzIGNvbmZ1c2VkIGJ5XG4gICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgZm9yIGZ0L2luIHNob3RzLCBpZiB0aGVyZSBpcyBhIEQgb3IgSCBmbGFnIGl0IG9jY3VwaWVzIHRoZVxuICAgICAgICAvLyBmaXJzdCBjb2x1bW4gdGhhdCBjYW4gY29udGFpbiBhICogZm9yIGRlY2ltYWwgZmVldCBzaG90c1xuICAgICAgICBleGNsdWRlRGlzdGFuY2UgPSBsaW5lWzE4XSA9PT0gJyonIHx8IGxpbmVbMThdID09PSAncydcbiAgICAgICAgaXNTcGxheSA9IGxpbmVbMThdID09PSAncydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlY2ltYWwgZmVldCBhcmUgbm90IG9wdGlvbmFsXG4gICAgICAgIGNvbnN0IGZlZXRTdHIgPSB2YWxpZGF0ZSgxMCwgMTYsICdkaXN0YW5jZScsIGlzVmFsaWRVRmxvYXQpXG4gICAgICAgIGRpc3RhbmNlID0gbmV3IFVuaXRpemVkTnVtYmVyKHBhcnNlRmxvYXQoZmVldFN0ciksIGRpc3RhbmNlVW5pdClcbiAgICAgICAga2luZCA9IHBhcnNlS2luZChsaW5lWzE2XSlcbiAgICAgICAgZXhjbHVkZURpc3RhbmNlID0gbGluZVsxN10gPT09ICcqJyB8fCBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICAgIGlzU3BsYXkgPSBsaW5lWzE3XSA9PT0gJ3MnXG4gICAgICB9XG5cbiAgICAgIGlmIChraW5kICE9PSBGcmNzU2hvdEtpbmQuTm9ybWFsKSB7XG4gICAgICAgIHZhbGlkYXRlKDMwLCAzNSwgJ3ZlcnRpY2FsLWRpc3RhbmNlJywgaXNWYWxpZEZsb2F0KVxuICAgICAgfVxuXG4gICAgICAvLyBjb252ZXJ0IGhvcml6b250YWwgYW5kIGRpYWdvbmFsIHNob3RzIHRvIHN0YW5kYXJkXG4gICAgICAvLyBpbiB0aGlzIGNhc2UgaW5jRnMgaXMgdGhlIHZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIHN0YXRpb25zXG4gICAgICAvLyBmb3J0dW5hdGVseSBpdCBhcHBlYXJzIHdlIGNhbiBhbHdheXMgY291bnQgb24gaW5jRnMgYmVpbmcgc3BlY2lmaWVkXG4gICAgICAvLyBhbmQgaW5jQnMgbm90IGJlaW5nIHNwZWNpZmllZCBmb3IgdGhlc2UgdHlwZXMgb2Ygc2hvdHNcbiAgICAgIGlmIChraW5kID09PSBGcmNzU2hvdEtpbmQuSG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBkaXN0YW5jZSBpcyBob3Jpem9udGFsIG9mZnNldCBhbmQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGhvcml6b250YWxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgIGNvbnN0IGggPSBob3Jpem9udGFsRGlzdGFuY2UuZ2V0KGRpc3RhbmNlVW5pdClcbiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoaW5jRnNTdHIpXG4gICAgICAgIHZlcnRpY2FsRGlzdGFuY2UgPSBuZXcgVW5pdGl6ZWROdW1iZXIodiwgZGlzdGFuY2VVbml0KVxuICAgICAgICBkaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcihNYXRoLnNxcnQoaCAqIGggKyB2ICogdiksIGRpc3RhbmNlVW5pdClcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gQW5nbGUuYXRhbjIoXG4gICAgICAgICAgdmVydGljYWxEaXN0YW5jZSxcbiAgICAgICAgICBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgICAgKVxuICAgICAgICBiYWNrc2lnaHRJbmNsaW5hdGlvbiA9IG51bGxcbiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gRnJjc1Nob3RLaW5kLkRpYWdvbmFsKSB7XG4gICAgICAgIC8vIGRpc3RhbmNlIGlzIGFzIHVzdWFsLCBidXQgaW5jRnNTdHIgaXMgdmVydGljYWwgb2Zmc2V0XG4gICAgICAgIGNvbnN0IGQgPSBkaXN0YW5jZS5nZXQoZGlzdGFuY2VVbml0KVxuICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChpbmNGc1N0cilcbiAgICAgICAgdmVydGljYWxEaXN0YW5jZSA9IG5ldyBVbml0aXplZE51bWJlcih2LCBkaXN0YW5jZVVuaXQpXG4gICAgICAgIGZyb250c2lnaHRJbmNsaW5hdGlvbiA9IEFuZ2xlLmFzaW4odiAvIGQpXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzMCwgMzUsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgLy8gZnJvbnRzaWdodCBpbmNsaW5hdGlvblxuICAgICAgICB2YWxpZGF0ZSgzNSwgNDAsICdpbmNsaW5hdGlvbicsIGlzVmFsaWRPcHRJbmNsaW5hdGlvbilcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gcGFyc2VOdW1iZXIoaW5jRnNTdHIsIGluY2xpbmF0aW9uVW5pdClcbiAgICAgICAgYmFja3NpZ2h0SW5jbGluYXRpb24gPSBwYXJzZU51bWJlcihpbmNCc1N0ciwgaW5jbGluYXRpb25Vbml0KVxuICAgICAgfVxuICAgICAgaWYgKGVycm9yZWQpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZyb250c2lnaHRBemltdXRoID0gcGFyc2VBemltdXRoKGF6bUZzU3RyLCBhemltdXRoVW5pdClcbiAgICAgIGNvbnN0IGJhY2tzaWdodEF6aW11dGggPSBwYXJzZUF6aW11dGgoYXptQnNTdHIsIGF6aW11dGhVbml0KVxuXG4gICAgICBpZiAoIWZyb250c2lnaHRJbmNsaW5hdGlvbiAmJiAhYmFja3NpZ2h0SW5jbGluYXRpb24pIHtcbiAgICAgICAgZnJvbnRzaWdodEluY2xpbmF0aW9uID0gVW5pdGl6ZS5kZWdyZWVzKDApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNob3Q6IEZyY3NTaG90ID0ge1xuICAgICAgICBmcm9tOiBmcm9tU3RyLnRyaW0oKSxcbiAgICAgICAgdG86IHRvU3RyLnRyaW0oKSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGZyb250c2lnaHRBemltdXRoLFxuICAgICAgICBiYWNrc2lnaHRBemltdXRoLFxuICAgICAgICBmcm9udHNpZ2h0SW5jbGluYXRpb24sXG4gICAgICAgIGJhY2tzaWdodEluY2xpbmF0aW9uLFxuICAgICAgICB0b0xydWRzOiB7XG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICByaWdodCxcbiAgICAgICAgICB1cCxcbiAgICAgICAgICBkb3duLFxuICAgICAgICB9LFxuICAgICAgICBleGNsdWRlRGlzdGFuY2UsXG4gICAgICAgIGNvbW1lbnQ6IGdldENvbW1lbnQoKSxcbiAgICAgIH1cbiAgICAgIGlmIChpc1NwbGF5KSBzaG90LmlzU3BsYXkgPSB0cnVlXG4gICAgICBpZiAoZnJvbUxydWRzKSBzaG90LmZyb21McnVkcyA9IGZyb21McnVkc1xuICAgICAgaWYgKGhvcml6b250YWxEaXN0YW5jZSkgc2hvdC5ob3Jpem9udGFsRGlzdGFuY2UgPSBob3Jpem9udGFsRGlzdGFuY2VcbiAgICAgIGlmICh2ZXJ0aWNhbERpc3RhbmNlKSBzaG90LnZlcnRpY2FsRGlzdGFuY2UgPSB2ZXJ0aWNhbERpc3RhbmNlXG4gICAgICBzaG90cy5wdXNoKHNob3QpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjYXZlLFxuICAgIGxvY2F0aW9uLFxuICAgIHRyaXBzLFxuICAgIGVycm9ycyxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxJQUFBQSxhQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFRQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQSxTQUFTRyxXQUFXQSxDQUNsQkMsQ0FBUyxFQUNUQyxJQUFhLEVBQ2E7RUFDMUIsTUFBTUMsS0FBSyxHQUFHQyxVQUFVLENBQUNILENBQUMsQ0FBQztFQUMzQixJQUFJSSxLQUFLLENBQUNGLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUM3QixPQUFPLElBQUlHLHdCQUFjLENBQUNILEtBQUssRUFBRUQsSUFBSSxDQUFDO0FBQ3hDO0FBRUEsU0FBU0ssWUFBWUEsQ0FDbkJOLENBQVMsRUFDVEMsSUFBaUIsRUFDYTtFQUM5QixNQUFNTSxNQUFNLEdBQUdSLFdBQVcsQ0FBQ0MsQ0FBQyxFQUFFQyxJQUFJLENBQUM7RUFDbkMsT0FBTyxDQUFBTSxNQUFNLGFBQU5BLE1BQU0sdUJBQU5BLE1BQU0sQ0FBRUMsR0FBRyxDQUFDQyxlQUFLLENBQUNDLE9BQU8sQ0FBQyxNQUFLLEdBQUcsR0FBR0MsaUJBQU8sQ0FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHSCxNQUFNO0FBQ3pFO0FBRUEsU0FBU0ssU0FBU0EsQ0FBQ0Ms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