appium-adb 9.10.11 → 9.10.13

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 (35) hide show
  1. package/build/index.js +1 -5
  2. package/build/lib/adb.js +1 -26
  3. package/build/lib/adb.js.map +1 -1
  4. package/build/lib/helpers.js +7 -211
  5. package/build/lib/helpers.js.map +1 -1
  6. package/build/lib/logcat.js +1 -46
  7. package/build/lib/logcat.js.map +1 -1
  8. package/build/lib/logger.js +1 -5
  9. package/build/lib/logger.js.map +1 -1
  10. package/build/lib/tools/aab-utils.js +1 -42
  11. package/build/lib/tools/aab-utils.js.map +1 -1
  12. package/build/lib/tools/adb-commands.js +6 -163
  13. package/build/lib/tools/adb-commands.js.map +1 -1
  14. package/build/lib/tools/adb-emu-commands.js +2 -66
  15. package/build/lib/tools/adb-emu-commands.js.map +1 -1
  16. package/build/lib/tools/android-manifest.js +1 -60
  17. package/build/lib/tools/android-manifest.js.map +1 -1
  18. package/build/lib/tools/apk-signing.js +1 -77
  19. package/build/lib/tools/apk-signing.js.map +1 -1
  20. package/build/lib/tools/apk-utils.js +4 -229
  21. package/build/lib/tools/apk-utils.js.map +1 -1
  22. package/build/lib/tools/apks-utils.js +1 -53
  23. package/build/lib/tools/apks-utils.js.map +1 -1
  24. package/build/lib/tools/index.js +1 -17
  25. package/build/lib/tools/index.js.map +1 -1
  26. package/build/lib/tools/keyboard-commands.js +1 -12
  27. package/build/lib/tools/keyboard-commands.js.map +1 -1
  28. package/build/lib/tools/lockmgmt.js +1 -46
  29. package/build/lib/tools/lockmgmt.js.map +1 -1
  30. package/build/lib/tools/settings-client-commands.js +3 -71
  31. package/build/lib/tools/settings-client-commands.js.map +1 -1
  32. package/build/lib/tools/system-calls.js +5 -190
  33. package/build/lib/tools/system-calls.js.map +1 -1
  34. package/lib/tools/settings-client-commands.js +2 -2
  35. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -35,23 +34,14 @@ exports.requireSdkRoot = requireSdkRoot;
35
34
  exports.toAvdLocaleArgs = toAvdLocaleArgs;
36
35
  exports.unsignApk = unsignApk;
37
36
  exports.unzipFile = unzipFile;
38
-
39
37
  require("source-map-support/register");
40
-
41
38
  var _path = _interopRequireDefault(require("path"));
42
-
43
39
  var _support = require("@appium/support");
44
-
45
40
  var _logger = _interopRequireDefault(require("./logger.js"));
46
-
47
41
  var _lodash = _interopRequireDefault(require("lodash"));
48
-
49
42
  var _bluebird = _interopRequireDefault(require("bluebird"));
50
-
51
43
  var _semver = _interopRequireDefault(require("semver"));
52
-
53
44
  var _os = _interopRequireDefault(require("os"));
54
-
55
45
  const APKS_EXTENSION = '.apks';
56
46
  exports.APKS_EXTENSION = APKS_EXTENSION;
57
47
  const APK_EXTENSION = '.apk';
@@ -68,16 +58,13 @@ const MODULE_NAME = 'appium-adb';
68
58
 
69
59
  const getModuleRoot = _lodash.default.memoize(function getModuleRoot() {
70
60
  const root = _support.node.getModuleRootSync(MODULE_NAME, __filename);
71
-
72
61
  if (!root) {
73
62
  throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);
74
63
  }
75
-
76
64
  return root;
77
65
  });
78
66
 
79
67
  exports.getModuleRoot = getModuleRoot;
80
-
81
68
  function getSdkRootFromEnv() {
82
69
  return process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
83
70
  }
@@ -85,21 +72,16 @@ function getSdkRootFromEnv() {
85
72
  async function requireSdkRoot(customRoot = null) {
86
73
  const sdkRoot = customRoot || getSdkRootFromEnv();
87
74
  const docMsg = 'Read https://developer.android.com/studio/command-line/variables for more details';
88
-
89
75
  if (_lodash.default.isEmpty(sdkRoot)) {
90
76
  throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);
91
77
  }
92
-
93
78
  if (!(await _support.fs.exists(sdkRoot))) {
94
79
  throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);
95
80
  }
96
-
97
81
  const stats = await _support.fs.stat(sdkRoot);
98
-
99
82
  if (!stats.isDirectory()) {
100
83
  throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);
101
84
  }
102
-
103
85
  return sdkRoot;
104
86
  }
105
87
 
@@ -109,59 +91,42 @@ async function getAndroidPlatformAndPath(sdkRoot) {
109
91
  absolute: true
110
92
  });
111
93
  const platformsMapping = {};
112
-
113
94
  for (const propsPath of propsPaths) {
114
95
  const propsContent = await _support.fs.readFile(propsPath, 'utf-8');
115
-
116
96
  const platformPath = _path.default.dirname(propsPath);
117
-
118
97
  const platform = _path.default.basename(platformPath);
119
-
120
98
  const match = /ro\.build\.version\.sdk=(\d+)/.exec(propsContent);
121
-
122
99
  if (!match) {
123
100
  _logger.default.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);
124
-
125
101
  continue;
126
102
  }
127
-
128
103
  platformsMapping[parseInt(match[1], 10)] = {
129
104
  platform,
130
105
  platformPath
131
106
  };
132
107
  }
133
-
134
108
  if (_lodash.default.isEmpty(platformsMapping)) {
135
109
  _logger.default.warn(`Found zero platform folders at '${_path.default.resolve(sdkRoot, 'platforms')}'. ` + `Do you have any Android SDKs installed?`);
136
-
137
110
  return {
138
111
  platform: null,
139
112
  platformPath: null
140
113
  };
141
114
  }
142
-
143
115
  const recentSdkVersion = _lodash.default.keys(platformsMapping).sort().reverse()[0];
144
-
145
116
  const result = platformsMapping[recentSdkVersion];
146
-
147
117
  _logger.default.debug(`Found the most recent Android platform: ${JSON.stringify(result)}`);
148
-
149
118
  return result;
150
119
  }
151
-
152
120
  async function unzipFile(zipPath, dstRoot = _path.default.dirname(zipPath)) {
153
121
  _logger.default.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);
154
-
155
122
  await _support.zip.assertValidZip(zipPath);
156
123
  await _support.zip.extractAllTo(zipPath, dstRoot);
157
-
158
124
  _logger.default.debug('Unzip successful');
159
125
  }
160
126
 
161
127
  async function unsignApk(apkPath) {
162
128
  const tmpRoot = await _support.tempDir.openDir();
163
129
  const metaInfFolderName = 'META-INF';
164
-
165
130
  try {
166
131
  let hasMetaInf = false;
167
132
  await _support.zip.readEntries(apkPath, ({
@@ -170,18 +135,13 @@ async function unsignApk(apkPath) {
170
135
  hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);
171
136
  return !hasMetaInf;
172
137
  });
173
-
174
138
  if (!hasMetaInf) {
175
139
  return false;
176
140
  }
177
-
178
141
  const tmpZipRoot = _path.default.resolve(tmpRoot, 'apk');
179
-
180
142
  await _support.zip.extractAllTo(apkPath, tmpZipRoot);
181
143
  await _support.fs.rimraf(_path.default.resolve(tmpZipRoot, metaInfFolderName));
182
-
183
144
  const tmpResultPath = _path.default.resolve(tmpRoot, _path.default.basename(apkPath));
184
-
185
145
  await _support.zip.toArchive(tmpResultPath, {
186
146
  cwd: tmpZipRoot
187
147
  });
@@ -192,73 +152,53 @@ async function unsignApk(apkPath) {
192
152
  await _support.fs.rimraf(tmpRoot);
193
153
  }
194
154
  }
195
-
196
155
  function getIMEListFromOutput(stdout) {
197
156
  let engines = [];
198
-
199
157
  for (let line of stdout.split('\n')) {
200
158
  if (line.length > 0 && line[0] !== ' ') {
201
159
  engines.push(line.trim().replace(/:$/, ''));
202
160
  }
203
161
  }
204
-
205
162
  return engines;
206
163
  }
207
-
208
164
  const getJavaHome = _lodash.default.memoize(async function getJavaHome() {
209
165
  const result = process.env.JAVA_HOME;
210
-
211
166
  if (!result) {
212
167
  throw new Error('The JAVA_HOME environment variable is not set for the current process');
213
168
  }
214
-
215
169
  if (!(await _support.fs.exists(result))) {
216
170
  throw new Error(`The JAVA_HOME location '${result}' must exist`);
217
171
  }
218
-
219
172
  const stats = await _support.fs.stat(result);
220
-
221
173
  if (!stats.isDirectory()) {
222
174
  throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);
223
175
  }
224
-
225
176
  return result;
226
177
  });
227
-
228
178
  exports.getJavaHome = getJavaHome;
229
-
230
179
  const getJavaForOs = _lodash.default.memoize(async function getJavaForOs() {
231
180
  let javaHome;
232
181
  let errMsg;
233
-
234
182
  try {
235
183
  javaHome = await getJavaHome();
236
184
  } catch (err) {
237
185
  errMsg = err.message;
238
186
  }
239
-
240
187
  const executableName = `java${_support.system.isWindows() ? '.exe' : ''}`;
241
-
242
188
  if (javaHome) {
243
189
  const resultPath = _path.default.resolve(javaHome, 'bin', executableName);
244
-
245
190
  if (await _support.fs.exists(resultPath)) {
246
191
  return resultPath;
247
192
  }
248
193
  }
249
-
250
194
  try {
251
195
  return await _support.fs.which(executableName);
252
196
  } catch (ign) {}
253
-
254
197
  throw new Error(`The '${executableName}' binary could not be found ` + `neither in PATH nor under JAVA_HOME (${errMsg || _path.default.resolve(javaHome, 'bin')})`);
255
198
  });
256
-
257
199
  exports.getJavaForOs = getJavaForOs;
258
-
259
200
  const getOpenSslForOs = async function () {
260
201
  const binaryName = `openssl${_support.system.isWindows() ? '.exe' : ''}`;
261
-
262
202
  try {
263
203
  return await _support.fs.which(binaryName);
264
204
  } catch (err) {
@@ -267,7 +207,6 @@ const getOpenSslForOs = async function () {
267
207
  };
268
208
 
269
209
  exports.getOpenSslForOs = getOpenSslForOs;
270
-
271
210
  async function getApksignerForOs(sysHelpers) {
272
211
  return await sysHelpers.getBinaryFromSdkRoot('apksigner.jar');
273
212
  }
@@ -277,7 +216,8 @@ async function getApkanalyzerForOs(sysHelpers) {
277
216
  }
278
217
 
279
218
  function isShowingLockscreen(dumpsys) {
280
- return _lodash.default.some(['mShowingLockscreen=true', 'mDreamingLockscreen=true'], x => dumpsys.includes(x)) || _lodash.default.every([/KeyguardStateMonitor[\n\s]+mIsShowing=true/, /\s+mInputRestricted=true/], x => x.test(dumpsys));
219
+ return _lodash.default.some(['mShowingLockscreen=true', 'mDreamingLockscreen=true'], x => dumpsys.includes(x))
220
+ || _lodash.default.every([/KeyguardStateMonitor[\n\s]+mIsShowing=true/, /\s+mInputRestricted=true/], x => x.test(dumpsys));
281
221
  }
282
222
 
283
223
  function isCurrentFocusOnKeyguard(dumpsys) {
@@ -292,7 +232,8 @@ function getSurfaceOrientation(dumpsys) {
292
232
 
293
233
  function isScreenOnFully(dumpsys) {
294
234
  let m = /mScreenOnFully=\w+/gi.exec(dumpsys);
295
- return !m || m && m.length > 0 && m[0].split('=')[1] === 'true' || false;
235
+ return !m ||
236
+ m && m.length > 0 && m[0].split('=')[1] === 'true' || false;
296
237
  }
297
238
 
298
239
  function buildStartCmd(startAppOptions, apiLevel) {
@@ -307,40 +248,32 @@ function buildStartCmd(startAppOptions, apiLevel) {
307
248
  flags
308
249
  } = startAppOptions;
309
250
  const cmd = ['am', 'start'];
310
-
311
251
  if (_support.util.hasValue(user)) {
312
252
  cmd.push('--user', user);
313
253
  }
314
-
315
254
  if (waitForLaunch) {
316
255
  cmd.push('-W');
317
256
  }
318
-
319
257
  if (activity && pkg) {
320
258
  cmd.push('-n', `${pkg}/${activity}`);
321
259
  }
322
-
323
260
  if (stopApp && apiLevel >= 15) {
324
261
  cmd.push('-S');
325
262
  }
326
-
327
263
  if (action) {
328
264
  cmd.push('-a', action);
329
265
  }
330
-
331
266
  if (category) {
332
267
  cmd.push('-c', category);
333
268
  }
334
-
335
269
  if (flags) {
336
270
  cmd.push('-f', flags);
337
271
  }
338
-
339
272
  if (startAppOptions.optionalIntentArguments) {
273
+
340
274
  let parseKeyValue = function (str) {
341
275
  str = str.trim();
342
276
  let space = str.indexOf(' ');
343
-
344
277
  if (space === -1) {
345
278
  return str.length ? [str] : [];
346
279
  } else {
@@ -350,53 +283,42 @@ function buildStartCmd(startAppOptions, apiLevel) {
350
283
 
351
284
  let optionalIntentArguments = ` ${startAppOptions.optionalIntentArguments}`;
352
285
  let re = / (-[^\s]+) (.+)/;
353
-
354
286
  while (true) {
355
287
  let args = re.exec(optionalIntentArguments);
356
-
357
288
  if (!args) {
358
289
  if (optionalIntentArguments.length) {
359
290
  cmd.push.apply(cmd, parseKeyValue(optionalIntentArguments));
360
291
  }
361
-
362
292
  break;
363
293
  }
364
294
 
365
295
  let flag = args[1];
366
296
  let flagPos = optionalIntentArguments.indexOf(flag);
367
-
368
297
  if (flagPos !== 0) {
369
298
  let prevArgs = optionalIntentArguments.substring(0, flagPos);
370
299
  cmd.push.apply(cmd, parseKeyValue(prevArgs));
371
300
  }
372
301
 
373
302
  cmd.push(flag);
303
+
374
304
  optionalIntentArguments = args[2];
375
305
  }
376
306
  }
377
-
378
307
  return cmd;
379
308
  }
380
-
381
309
  const getSdkToolsVersion = _lodash.default.memoize(async function getSdkToolsVersion() {
382
310
  const androidHome = process.env.ANDROID_HOME;
383
-
384
311
  if (!androidHome) {
385
312
  throw new Error('ANDROID_HOME environment variable is expected to be set');
386
313
  }
387
-
388
314
  const propertiesPath = _path.default.resolve(androidHome, 'tools', 'source.properties');
389
-
390
315
  if (!(await _support.fs.exists(propertiesPath))) {
391
316
  _logger.default.warn(`Cannot find ${propertiesPath} file to read SDK version from`);
392
-
393
317
  return;
394
318
  }
395
-
396
319
  const propertiesContent = await _support.fs.readFile(propertiesPath, 'utf8');
397
320
  const versionMatcher = new RegExp(/Pkg\.Revision=(\d+)\.?(\d+)?\.?(\d+)?/);
398
321
  const match = versionMatcher.exec(propertiesContent);
399
-
400
322
  if (match) {
401
323
  return {
402
324
  major: parseInt(match[1], 10),
@@ -404,93 +326,68 @@ const getSdkToolsVersion = _lodash.default.memoize(async function getSdkToolsVer
404
326
  build: match[3] ? parseInt(match[3], 10) : 0
405
327
  };
406
328
  }
407
-
408
329
  _logger.default.warn(`Cannot parse "Pkg.Revision" value from ${propertiesPath}`);
409
330
  });
410
331
 
411
332
  exports.getSdkToolsVersion = getSdkToolsVersion;
412
-
413
333
  const getBuildToolsDirs = _lodash.default.memoize(async function getBuildToolsDirs(sdkRoot) {
414
334
  let buildToolsDirs = await _support.fs.glob('*/', {
415
335
  cwd: _path.default.resolve(sdkRoot, 'build-tools'),
416
336
  absolute: true
417
337
  });
418
-
419
338
  try {
420
339
  buildToolsDirs = buildToolsDirs.map(dir => [_path.default.basename(dir), dir]).sort((a, b) => _semver.default.rcompare(a[0], b[0])).map(pair => pair[1]);
421
340
  } catch (err) {
422
341
  _logger.default.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map(dir => _path.default.basename(dir)))} ` + `by semantic version names.`);
423
-
424
342
  _logger.default.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);
425
-
426
343
  const pairs = await _bluebird.default.map(buildToolsDirs, async dir => [(await _support.fs.stat(dir)).mtime.valueOf(), dir]);
427
344
  buildToolsDirs = pairs.sort((a, b) => a[0] < b[0]).map(pair => pair[1]);
428
345
  }
429
-
430
346
  _logger.default.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);
431
-
432
347
  for (let dir of buildToolsDirs) {
433
348
  _logger.default.info(` ${dir}`);
434
349
  }
435
-
436
350
  return buildToolsDirs;
437
351
  });
438
352
 
439
353
  exports.getBuildToolsDirs = getBuildToolsDirs;
440
-
441
354
  const extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedState = null) {
442
355
  const groupPatternByName = groupName => new RegExp(`^(\\s*${_lodash.default.escapeRegExp(groupName)} permissions:[\\s\\S]+)`, 'm');
443
-
444
356
  const indentPattern = /\S|$/;
445
357
  const permissionNamePattern = /android\.\w*\.?permission\.\w+/;
446
358
  const grantedStatePattern = /\bgranted=(\w+)/;
447
359
  const result = [];
448
-
449
360
  for (const groupName of groupNames) {
450
361
  const groupMatch = groupPatternByName(groupName).exec(dumpsysOutput);
451
-
452
362
  if (!groupMatch) {
453
363
  continue;
454
364
  }
455
-
456
365
  const lines = groupMatch[1].split('\n');
457
-
458
366
  if (lines.length < 2) {
459
367
  continue;
460
368
  }
461
-
462
369
  const titleIndent = lines[0].search(indentPattern);
463
-
464
370
  for (const line of lines.slice(1)) {
465
371
  const currentIndent = line.search(indentPattern);
466
-
467
372
  if (currentIndent <= titleIndent) {
468
373
  break;
469
374
  }
470
-
471
375
  const permissionNameMatch = permissionNamePattern.exec(line);
472
-
473
376
  if (!permissionNameMatch) {
474
377
  continue;
475
378
  }
476
-
477
379
  const item = {
478
380
  permission: permissionNameMatch[0]
479
381
  };
480
382
  const grantedStateMatch = grantedStatePattern.exec(line);
481
-
482
383
  if (grantedStateMatch) {
483
384
  item.granted = grantedStateMatch[1] === 'true';
484
385
  }
485
-
486
386
  result.push(item);
487
387
  }
488
388
  }
489
-
490
389
  const filteredResult = result.filter(item => !_lodash.default.isBoolean(grantedState) || item.granted === grantedState).map(item => item.permission);
491
-
492
390
  _logger.default.debug(`Retrieved ${_support.util.pluralize('permission', filteredResult.length, true)} ` + `from ${groupNames} ${_support.util.pluralize('group', groupNames.length, false)}`);
493
-
494
391
  return filteredResult;
495
392
  };
496
393
 
@@ -498,19 +395,15 @@ exports.extractMatchingPermissions = extractMatchingPermissions;
498
395
 
499
396
  function buildInstallArgs(apiLevel, options = {}) {
500
397
  const result = [];
501
-
502
398
  if (!_support.util.hasValue(options.replace) || options.replace) {
503
399
  result.push('-r');
504
400
  }
505
-
506
401
  if (options.allowTestPackages) {
507
402
  result.push('-t');
508
403
  }
509
-
510
404
  if (options.useSdcard) {
511
405
  result.push('-s');
512
406
  }
513
-
514
407
  if (options.grantPermissions) {
515
408
  if (apiLevel < 23) {
516
409
  _logger.default.debug(`Skipping permissions grant option, since ` + `the current API level ${apiLevel} does not support applications ` + `permissions customization`);
@@ -518,11 +411,9 @@ function buildInstallArgs(apiLevel, options = {}) {
518
411
  result.push('-g');
519
412
  }
520
413
  }
521
-
522
414
  if (options.partialInstall) {
523
415
  result.push('-p');
524
416
  }
525
-
526
417
  return result;
527
418
  }
528
419
 
@@ -532,7 +423,6 @@ function parseManifest(manifest) {
532
423
  versionCode: parseInt(manifest.versionCode, 10),
533
424
  versionName: manifest.versionName || null
534
425
  };
535
-
536
426
  if (!manifest.application) {
537
427
  return result;
538
428
  }
@@ -541,7 +431,6 @@ function parseManifest(manifest) {
541
431
  if (activity.enabled === false || _lodash.default.isEmpty(activity.intentFilters)) {
542
432
  continue;
543
433
  }
544
-
545
434
  for (const {
546
435
  actions,
547
436
  categories
@@ -549,21 +438,18 @@ function parseManifest(manifest) {
549
438
  if (_lodash.default.isEmpty(actions) || _lodash.default.isEmpty(categories)) {
550
439
  continue;
551
440
  }
552
-
553
441
  const isMainAction = actions.some(({
554
442
  name
555
443
  }) => name === MAIN_ACTION);
556
444
  const isLauncherCategory = categories.some(({
557
445
  name
558
446
  }) => name === LAUNCHER_CATEGORY);
559
-
560
447
  if (isMainAction && isLauncherCategory) {
561
448
  result.activity = activity.name;
562
449
  return result;
563
450
  }
564
451
  }
565
452
  }
566
-
567
453
  return result;
568
454
  }
569
455
 
@@ -571,130 +457,99 @@ function parseAaptStrings(rawOutput, configMarker) {
571
457
  const normalizeStringMatch = function (s) {
572
458
  return s.replace(/"$/, '').replace(/^"/, '').replace(/\\"/g, '"');
573
459
  };
574
-
575
460
  const apkStrings = {};
576
461
  let isInConfig = false;
577
462
  let currentResourceId = null;
578
463
  let isInPluralGroup = false;
579
464
  const quotedStringPattern = /"[^"\\]*(?:\\.[^"\\]*)*"/;
580
-
581
465
  for (const line of rawOutput.split(_os.default.EOL)) {
582
466
  const trimmedLine = line.trim();
583
-
584
467
  if (_lodash.default.isEmpty(trimmedLine)) {
585
468
  continue;
586
469
  }
587
-
588
470
  if (['config', 'type', 'spec', 'Package'].some(x => trimmedLine.startsWith(x))) {
589
471
  isInConfig = trimmedLine.startsWith(`config ${configMarker}:`);
590
472
  currentResourceId = null;
591
473
  isInPluralGroup = false;
592
474
  continue;
593
475
  }
594
-
595
476
  if (!isInConfig) {
596
477
  continue;
597
478
  }
598
-
599
479
  if (trimmedLine.startsWith('resource')) {
600
480
  isInPluralGroup = false;
601
481
  currentResourceId = null;
602
-
603
482
  if (trimmedLine.includes(':string/')) {
604
483
  const match = /:string\/(\S+):/.exec(trimmedLine);
605
-
606
484
  if (match) {
607
485
  currentResourceId = match[1];
608
486
  }
609
487
  } else if (trimmedLine.includes(':plurals/')) {
610
488
  const match = /:plurals\/(\S+):/.exec(trimmedLine);
611
-
612
489
  if (match) {
613
490
  currentResourceId = match[1];
614
491
  isInPluralGroup = true;
615
492
  }
616
493
  }
617
-
618
494
  continue;
619
495
  }
620
-
621
496
  if (currentResourceId && trimmedLine.startsWith('(string')) {
622
497
  const match = quotedStringPattern.exec(trimmedLine);
623
-
624
498
  if (match) {
625
499
  apkStrings[currentResourceId] = normalizeStringMatch(match[0]);
626
500
  }
627
-
628
501
  currentResourceId = null;
629
502
  continue;
630
503
  }
631
-
632
504
  if (currentResourceId && isInPluralGroup && trimmedLine.includes(': (string')) {
633
505
  const match = quotedStringPattern.exec(trimmedLine);
634
-
635
506
  if (match) {
636
507
  apkStrings[currentResourceId] = [...(apkStrings[currentResourceId] || []), normalizeStringMatch(match[0])];
637
508
  }
638
-
639
509
  continue;
640
510
  }
641
511
  }
642
-
643
512
  return apkStrings;
644
513
  }
645
514
 
646
515
  function parseAapt2Strings(rawOutput, configMarker) {
647
516
  const allLines = rawOutput.split(_os.default.EOL);
648
-
649
517
  function extractContent(startIdx) {
650
518
  let idx = startIdx;
651
519
  const startCharPos = allLines[startIdx].indexOf('"');
652
-
653
520
  if (startCharPos < 0) {
654
521
  return [null, idx];
655
522
  }
656
-
657
523
  let result = '';
658
-
659
524
  while (idx < allLines.length) {
660
525
  const terminationCharMatch = /"$/.exec(allLines[idx]);
661
-
662
526
  if (terminationCharMatch) {
663
527
  const terminationCharPos = terminationCharMatch.index;
664
-
665
528
  if (startIdx === idx) {
666
529
  return [allLines[idx].substring(startCharPos + 1, terminationCharPos), idx];
667
530
  }
668
-
669
531
  return [`${result}\\n${_lodash.default.trimStart(allLines[idx].substring(0, terminationCharPos))}`, idx];
670
532
  }
671
-
672
533
  if (idx > startIdx) {
673
534
  result += `\\n${_lodash.default.trimStart(allLines[idx])}`;
674
535
  } else {
675
536
  result += allLines[idx].substring(startCharPos + 1);
676
537
  }
677
-
678
538
  ++idx;
679
539
  }
680
-
681
540
  return [result, idx];
682
541
  }
683
-
684
542
  const apkStrings = {};
685
543
  let currentResourceId = null;
686
544
  let isInPluralGroup = false;
687
545
  let isInCurrentConfig = false;
688
546
  let lineIndex = 0;
689
-
690
547
  while (lineIndex < allLines.length) {
691
548
  const trimmedLine = allLines[lineIndex].trim();
692
-
693
549
  if (_lodash.default.isEmpty(trimmedLine)) {
694
550
  ++lineIndex;
695
551
  continue;
696
552
  }
697
-
698
553
  if (['type', 'Package'].some(x => trimmedLine.startsWith(x))) {
699
554
  currentResourceId = null;
700
555
  isInPluralGroup = false;
@@ -702,31 +557,25 @@ function parseAapt2Strings(rawOutput, configMarker) {
702
557
  ++lineIndex;
703
558
  continue;
704
559
  }
705
-
706
560
  if (trimmedLine.startsWith('resource')) {
707
561
  isInPluralGroup = false;
708
562
  currentResourceId = null;
709
563
  isInCurrentConfig = false;
710
-
711
564
  if (trimmedLine.includes('string/')) {
712
565
  const match = /string\/(\S+)/.exec(trimmedLine);
713
-
714
566
  if (match) {
715
567
  currentResourceId = match[1];
716
568
  }
717
569
  } else if (trimmedLine.includes('plurals/')) {
718
570
  const match = /plurals\/(\S+)/.exec(trimmedLine);
719
-
720
571
  if (match) {
721
572
  currentResourceId = match[1];
722
573
  isInPluralGroup = true;
723
574
  }
724
575
  }
725
-
726
576
  ++lineIndex;
727
577
  continue;
728
578
  }
729
-
730
579
  if (currentResourceId) {
731
580
  if (isInPluralGroup) {
732
581
  if (trimmedLine.startsWith('(')) {
@@ -734,11 +583,9 @@ function parseAapt2Strings(rawOutput, configMarker) {
734
583
  ++lineIndex;
735
584
  continue;
736
585
  }
737
-
738
586
  if (isInCurrentConfig) {
739
587
  const [content, idx] = extractContent(lineIndex);
740
588
  lineIndex = idx;
741
-
742
589
  if (_lodash.default.isString(content)) {
743
590
  apkStrings[currentResourceId] = [...(apkStrings[currentResourceId] || []), content];
744
591
  }
@@ -746,82 +593,61 @@ function parseAapt2Strings(rawOutput, configMarker) {
746
593
  } else if (trimmedLine.startsWith(`(${configMarker})`)) {
747
594
  const [content, idx] = extractContent(lineIndex);
748
595
  lineIndex = idx;
749
-
750
596
  if (_lodash.default.isString(content)) {
751
597
  apkStrings[currentResourceId] = content;
752
598
  }
753
-
754
599
  currentResourceId = null;
755
600
  }
756
601
  }
757
-
758
602
  ++lineIndex;
759
603
  }
760
-
761
604
  return apkStrings;
762
605
  }
763
606
 
764
607
  async function formatConfigMarker(configsGetter, desiredMarker, defaultMarker) {
765
608
  let configMarker = desiredMarker || defaultMarker;
766
-
767
609
  if (configMarker.includes('-') && !configMarker.includes('-r')) {
768
610
  configMarker = configMarker.replace('-', '-r');
769
611
  }
770
-
771
612
  const configs = await configsGetter();
772
-
773
613
  _logger.default.debug(`Resource configurations: ${JSON.stringify(configs)}`);
774
-
775
614
  if (configMarker.toLowerCase().startsWith('en') && !configs.some(x => x.trim() === configMarker)) {
776
615
  _logger.default.debug(`Resource configuration name '${configMarker}' is unknown. ` + `Replacing it with '${defaultMarker}'`);
777
-
778
616
  configMarker = defaultMarker;
779
617
  } else {
780
618
  _logger.default.debug(`Selected configuration: '${configMarker}'`);
781
619
  }
782
-
783
620
  return configMarker;
784
621
  }
785
622
 
786
623
  function parseJsonData(output, entityName) {
787
624
  if (!/\bresult=-1\b/.test(output) || !/\bdata="/.test(output)) {
788
625
  _logger.default.debug(output);
789
-
790
626
  throw new Error(`Cannot retrieve ${entityName} from the device. ` + 'Check the server log for more details');
791
627
  }
792
-
793
628
  const match = /\bdata=(".+)/.exec(output);
794
-
795
629
  if (!match) {
796
630
  _logger.default.debug(output);
797
-
798
631
  throw new Error(`Cannot parse ${entityName} from the command output. ` + 'Check the server log for more details');
799
632
  }
800
-
801
633
  const jsonStr = _lodash.default.trim(match[1]).replace(/(^")|("$)/g, '');
802
-
803
634
  try {
804
635
  return JSON.parse(jsonStr);
805
636
  } catch (e) {
806
637
  _logger.default.debug(jsonStr);
807
-
808
638
  throw new Error(`Cannot parse ${entityName} from the resulting data string. ` + 'Check the server log for more details');
809
639
  }
810
640
  }
811
641
 
812
642
  function toAvdLocaleArgs(language, country) {
813
643
  const result = [];
814
-
815
644
  if (language && _lodash.default.isString(language)) {
816
645
  result.push('-prop', `persist.sys.language=${language.toLowerCase()}`);
817
646
  }
818
-
819
647
  if (country && _lodash.default.isString(country)) {
820
648
  result.push('-prop', `persist.sys.country=${country.toUpperCase()}`);
821
649
  }
822
-
823
650
  let locale;
824
-
825
651
  if (_lodash.default.isString(language) && _lodash.default.isString(country) && language && country) {
826
652
  locale = language.toLowerCase() + '-' + country.toUpperCase();
827
653
  } else if (language && _lodash.default.isString(language)) {
@@ -829,37 +655,28 @@ function toAvdLocaleArgs(language, country) {
829
655
  } else if (country && _lodash.default.isString(country)) {
830
656
  locale = country;
831
657
  }
832
-
833
658
  if (locale) {
834
659
  result.push('-prop', `persist.sys.locale=${locale}`);
835
660
  }
836
-
837
661
  return result;
838
662
  }
839
663
 
840
664
  async function getAndroidPrefsRoot() {
841
665
  let location = process.env.ANDROID_EMULATOR_HOME;
842
-
843
666
  if (await dirExists(location)) {
844
667
  return location;
845
668
  }
846
-
847
669
  if (location) {
848
670
  _logger.default.warn(`The value of the ANDROID_EMULATOR_HOME environment variable '${location}' is not an existing directory`);
849
671
  }
850
-
851
672
  const home = process.env.HOME || process.env.USERPROFILE;
852
-
853
673
  if (home) {
854
674
  location = _path.default.resolve(home, '.android');
855
675
  }
856
-
857
676
  if (!(await dirExists(location))) {
858
677
  _logger.default.debug(`Android config root '${location}' is not an existing directory`);
859
-
860
678
  return null;
861
679
  }
862
-
863
680
  return location;
864
681
  }
865
682
 
@@ -869,11 +686,9 @@ async function dirExists(location) {
869
686
 
870
687
  function escapeShellArg(arg) {
871
688
  arg = `${arg}`;
872
-
873
689
  if (_support.system.isWindows()) {
874
690
  return /[&|^\s]/.test(arg) ? `"${arg.replace(/"/g, '""')}"` : arg;
875
691
  }
876
-
877
692
  return arg.replace(/&/g, '\\&');
878
693
  }
879
694
 
@@ -883,25 +698,19 @@ function parseLaunchableActivityNames(dumpsys) {
883
698
  const blocks = [];
884
699
  let blockStartIndent;
885
700
  let block = [];
886
-
887
701
  for (const line of dumpsys.split('\n').map(_lodash.default.trimEnd)) {
888
702
  const currentIndent = line.length - _lodash.default.trimStart(line).length;
889
-
890
703
  if (mainActivityNameRe.test(line)) {
891
704
  blockStartIndent = currentIndent;
892
-
893
705
  if (!_lodash.default.isEmpty(block)) {
894
706
  blocks.push(block);
895
707
  block = [];
896
708
  }
897
-
898
709
  continue;
899
710
  }
900
-
901
711
  if (_lodash.default.isNil(blockStartIndent)) {
902
712
  continue;
903
713
  }
904
-
905
714
  if (currentIndent > blockStartIndent) {
906
715
  block.push(line);
907
716
  } else {
@@ -909,56 +718,43 @@ function parseLaunchableActivityNames(dumpsys) {
909
718
  blocks.push(block);
910
719
  block = [];
911
720
  }
912
-
913
721
  blockStartIndent = null;
914
722
  }
915
723
  }
916
-
917
724
  if (!_lodash.default.isEmpty(block)) {
918
725
  blocks.push(block);
919
726
  }
920
-
921
727
  const result = [];
922
-
923
728
  for (const item of blocks) {
924
729
  let hasCategory = false;
925
730
  let isLauncherCategory = false;
926
-
927
731
  for (const line of item) {
928
732
  const match = categoryNameRe.exec(line);
929
-
930
733
  if (!match) {
931
734
  continue;
932
735
  }
933
-
934
736
  hasCategory = true;
935
737
  isLauncherCategory = match[1] === LAUNCHER_CATEGORY;
936
738
  break;
937
739
  }
938
-
939
740
  if (hasCategory && !isLauncherCategory) {
940
741
  continue;
941
742
  }
942
-
943
743
  for (const activityNameStr of item.map(_lodash.default.trim).filter(Boolean)) {
944
744
  const fqActivityName = activityNameStr.split(/\s+/)[1];
945
-
946
745
  if (!matchComponentName(fqActivityName)) {
947
746
  continue;
948
747
  }
949
-
950
748
  if (isLauncherCategory) {
951
749
  return [fqActivityName];
952
750
  }
953
-
954
751
  result.push(fqActivityName);
955
752
  }
956
753
  }
957
-
958
754
  return result;
959
755
  }
960
756
 
961
757
  function matchComponentName(classString) {
962
758
  return /^[a-z0-9./_]+$/i.exec(classString);
963
759
  }
964
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUEtTX0VYVEVOU0lPTiIsIkFQS19FWFRFTlNJT04iLCJBUEtfSU5TVEFMTF9USU1FT1VUIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJNQUlOX0FDVElPTiIsIkxBVU5DSEVSX0NBVEVHT1JZIiwiTU9EVUxFX05BTUUiLCJnZXRNb2R1bGVSb290IiwiXyIsIm1lbW9pemUiLCJyb290Iiwibm9kZSIsImdldE1vZHVsZVJvb3RTeW5jIiwiX19maWxlbmFtZSIsIkVycm9yIiwiZ2V0U2RrUm9vdEZyb21FbnYiLCJwcm9jZXNzIiwiZW52IiwiQU5EUk9JRF9IT01FIiwiQU5EUk9JRF9TREtfUk9PVCIsInJlcXVpcmVTZGtSb290IiwiY3VzdG9tUm9vdCIsInNka1Jvb3QiLCJkb2NNc2ciLCJpc0VtcHR5IiwiZnMiLCJleGlzdHMiLCJzdGF0cyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgiLCJwcm9wc1BhdGhzIiwiZ2xvYiIsImN3ZCIsInBhdGgiLCJyZXNvbHZlIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJkaXJuYW1lIiwicGxhdGZvcm0iLCJiYXNlbmFtZSIsIm1hdGNoIiwiZXhlYyIsImxvZyIsIndhcm4iLCJwYXJzZUludCIsInJlY2VudFNka1ZlcnNpb24iLCJrZXlzIiwic29ydCIsInJldmVyc2UiLCJyZXN1bHQiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bnppcEZpbGUiLCJ6aXBQYXRoIiwiZHN0Um9vdCIsInppcCIsImFzc2VydFZhbGlkWmlwIiwiZXh0cmFjdEFsbFRvIiwidW5zaWduQXBrIiwiYXBrUGF0aCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsIm1ldGFJbmZGb2xkZXJOYW1lIiwiaGFzTWV0YUluZiIsInJlYWRFbnRyaWVzIiwiZW50cnkiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJ0bXBaaXBSb290IiwicmltcmFmIiwidG1wUmVzdWx0UGF0aCIsInRvQXJjaGl2ZSIsInVubGluayIsIm12IiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJzdGRvdXQiLCJlbmdpbmVzIiwibGluZSIsInNwbGl0IiwibGVuZ3RoIiwicHVzaCIsInRyaW0iLCJyZXBsYWNlIiwiZ2V0SmF2YUhvbWUiLCJKQVZBX0hPTUUiLCJnZXRKYXZhRm9yT3MiLCJqYXZhSG9tZSIsImVyck1zZyIsImVyciIsIm1lc3NhZ2UiLCJleGVjdXRhYmxlTmFtZSIsInN5c3RlbSIsImlzV2luZG93cyIsInJlc3VsdFBhdGgiLCJ3aGljaCIsImlnbiIsImdldE9wZW5Tc2xGb3JPcyIsImJpbmFyeU5hbWUiLCJnZXRBcGtzaWduZXJGb3JPcyIsInN5c0hlbHBlcnMiLCJnZXRCaW5hcnlGcm9tU2RrUm9vdCIsImdldEFwa2FuYWx5emVyRm9yT3MiLCJpc1Nob3dpbmdMb2Nrc2NyZWVuIiwiZHVtcHN5cyIsInNvbWUiLCJ4IiwiaW5jbHVkZXMiLCJldmVyeSIsInRlc3QiLCJpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQiLCJtIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwiaXNTY3JlZW5PbkZ1bGx5IiwiYnVpbGRTdGFydENtZCIsInN0YXJ0QXBwT3B0aW9ucyIsImFwaUxldmVsIiwidXNlciIsIndhaXRGb3JMYXVuY2giLCJwa2ciLCJhY3Rpdml0eSIsImFjdGlvbiIsImNhdGVnb3J5Iiwic3RvcEFwcCIsImZsYWdzIiwiY21kIiwidXRpbCIsImhhc1ZhbHVlIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJwYXJzZUtleVZhbHVlIiwic3RyIiwic3BhY2UiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwicmUiLCJhcmdzIiwiYXBwbHkiLCJmbGFnIiwiZmxhZ1BvcyIsInByZXZBcmdzIiwiZ2V0U2RrVG9vbHNWZXJzaW9uIiwiYW5kcm9pZEhvbWUiLCJwcm9wZXJ0aWVzUGF0aCIsInByb3BlcnRpZXNDb250ZW50IiwidmVyc2lvbk1hdGNoZXIiLCJSZWdFeHAiLCJtYWpvciIsIm1pbm9yIiwiYnVpbGQiLCJnZXRCdWlsZFRvb2xzRGlycyIsImJ1aWxkVG9vbHNEaXJzIiwibWFwIiwiZGlyIiwiYSIsImIiLCJzZW12ZXIiLCJyY29tcGFyZSIsInBhaXIiLCJwYWlycyIsIkIiLCJtdGltZSIsInZhbHVlT2YiLCJpbmZvIiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJkdW1wc3lzT3V0cHV0IiwiZ3JvdXBOYW1lcyIsImdyYW50ZWRTdGF0ZSIsImdyb3VwUGF0dGVybkJ5TmFtZSIsImdyb3VwTmFtZSIsImVzY2FwZVJlZ0V4cCIsImluZGVudFBhdHRlcm4iLCJwZXJtaXNzaW9uTmFtZVBhdHRlcm4iLCJncmFudGVkU3RhdGVQYXR0ZXJuIiwiZ3JvdXBNYXRjaCIsImxpbmVzIiwidGl0bGVJbmRlbnQiLCJzZWFyY2giLCJzbGljZSIsImN1cnJlbnRJbmRlbnQiLCJwZXJtaXNzaW9uTmFtZU1hdGNoIiwiaXRlbSIsInBlcm1pc3Npb24iLCJncmFudGVkU3RhdGVNYXRjaCIsImdyYW50ZWQiLCJmaWx0ZXJlZFJlc3VsdCIsImZpbHRlciIsImlzQm9vbGVhbiIsInBsdXJhbGl6ZSIsImJ1aWxkSW5zdGFsbEFyZ3MiLCJvcHRpb25zIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJ1c2VTZGNhcmQiLCJncmFudFBlcm1pc3Npb25zIiwicGFydGlhbEluc3RhbGwiLCJwYXJzZU1hbmlmZXN0IiwibWFuaWZlc3QiLCJwYWNrYWdlIiwidmVyc2lvbkNvZGUiLCJ2ZXJzaW9uTmFtZSIsImFwcGxpY2F0aW9uIiwiYWN0aXZpdGllcyIsImFjdGl2aXR5QWxpYXNlcyIsImVuYWJsZWQiLCJpbnRlbnRGaWx0ZXJzIiwiYWN0aW9ucyIsImNhdGVnb3JpZXMiLCJpc01haW5BY3Rpb24iLCJuYW1lIiwiaXNMYXVuY2hlckNhdGVnb3J5IiwicGFyc2VBYXB0U3RyaW5ncyIsInJhd091dHB1dCIsImNvbmZpZ01hcmtlciIsIm5vcm1hbGl6ZVN0cmluZ01hdGNoIiwicyIsImFwa1N0cmluZ3MiLCJpc0luQ29uZmlnIiwiY3VycmVudFJlc291cmNlSWQiLCJpc0luUGx1cmFsR3JvdXAiLCJxdW90ZWRTdHJpbmdQYXR0ZXJuIiwib3MiLCJFT0wiLCJ0cmltbWVkTGluZSIsInBhcnNlQWFwdDJTdHJpbmdzIiwiYWxsTGluZXMiLCJleHRyYWN0Q29udGVudCIsInN0YXJ0SWR4IiwiaWR4Iiwic3RhcnRDaGFyUG9zIiwidGVybWluYXRpb25DaGFyTWF0Y2giLCJ0ZXJtaW5hdGlvbkNoYXJQb3MiLCJpbmRleCIsInRyaW1TdGFydCIsImlzSW5DdXJyZW50Q29uZmlnIiwibGluZUluZGV4IiwiY29udGVudCIsImlzU3RyaW5nIiwiZm9ybWF0Q29uZmlnTWFya2VyIiwiY29uZmlnc0dldHRlciIsImRlc2lyZWRNYXJrZXIiLCJkZWZhdWx0TWFya2VyIiwiY29uZmlncyIsInRvTG93ZXJDYXNlIiwicGFyc2VKc29uRGF0YSIsIm91dHB1dCIsImVudGl0eU5hbWUiLCJqc29uU3RyIiwicGFyc2UiLCJlIiwidG9BdmRMb2NhbGVBcmdzIiwibGFuZ3VhZ2UiLCJjb3VudHJ5IiwidG9VcHBlckNhc2UiLCJsb2NhbGUiLCJnZXRBbmRyb2lkUHJlZnNSb290IiwibG9jYXRpb24iLCJBTkRST0lEX0VNVUxBVE9SX0hPTUUiLCJkaXJFeGlzdHMiLCJob21lIiwiSE9NRSIsIlVTRVJQUk9GSUxFIiwiZXNjYXBlU2hlbGxBcmciLCJhcmciLCJwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIiwibWFpbkFjdGl2aXR5TmFtZVJlIiwiY2F0ZWdvcnlOYW1lUmUiLCJibG9ja3MiLCJibG9ja1N0YXJ0SW5kZW50IiwiYmxvY2siLCJ0cmltRW5kIiwiaXNOaWwiLCJoYXNDYXRlZ29yeSIsImFjdGl2aXR5TmFtZVN0ciIsIkJvb2xlYW4iLCJmcUFjdGl2aXR5TmFtZSIsIm1hdGNoQ29tcG9uZW50TmFtZSIsImNsYXNzU3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCB6aXAsIHV0aWwsIHRlbXBEaXIsIG5vZGUgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBNQUlOX0FDVElPTiA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTic7XG5jb25zdCBMQVVOQ0hFUl9DQVRFR09SWSA9ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUic7XG5jb25zdCBNT0RVTEVfTkFNRSA9ICdhcHBpdW0tYWRiJztcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBjb25zdCByb290ID0gbm9kZS5nZXRNb2R1bGVSb290U3luYyhNT0RVTEVfTkFNRSwgX19maWxlbmFtZSk7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSAke01PRFVMRV9OQU1FfSBOb2RlLmpzIG1vZHVsZWApO1xuICB9XG4gIHJldHVybiByb290O1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhY3R1YWwgcGF0aCB0byBTREsgcm9vdCBmb2xkZXIgZnJvbSB0aGUgc3lzdGVtIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNka1Jvb3RGcm9tRW52ICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkFORFJPSURfSE9NRSB8fCBwcm9jZXNzLmVudi5BTkRST0lEX1NES19ST09UO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBTREsgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhcmlhYmxlIGlzIHVuc2V0IG9yIGlzXG4gKiBwb2ludGluZyB0byBhbiBpbnZhbGlkIGZpbGUgc3lzdGVtIGVudHJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTZGtSb290IChjdXN0b21Sb290ID0gbnVsbCkge1xuICBjb25zdCBzZGtSb290ID0gY3VzdG9tUm9vdCB8fCBnZXRTZGtSb290RnJvbUVudigpO1xuICBjb25zdCBkb2NNc2cgPSAnUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL3ZhcmlhYmxlcyBmb3IgbW9yZSBkZXRhaWxzJztcbiAgaWYgKF8uaXNFbXB0eShzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIGV4cG9ydGVkLiAke2RvY01zZ31gKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXIgJyR7c2RrUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNka1Jvb3QpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBbmRyb2lkIFNESyByb290ICcke3Nka1Jvb3R9JyBtdXN0IGJlIGEgZm9sZGVyLiAke2RvY01zZ31gKTtcbiAgfVxuICByZXR1cm4gc2RrUm9vdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbGF0Zm9ybUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm0gLSBUaGUgcGxhdGZvcm0gbmFtZSwgZm9yIGV4YW1wbGUgYGFuZHJvaWQtMjRgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIHBsYXRmb3JtIFNESyBmb2xkZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBhdGggdG8gdGhlIHJlY2VudCBpbnN0YWxsZWQgQW5kcm9pZCBwbGF0Zm9ybS5cbiAqXG4gKiBAcmV0dXJuIHtQbGF0Zm9ybUluZm99IFRoZSByZXN1bHRpbmcgcGF0aCB0byB0aGUgbmV3ZXN0IGluc3RhbGxlZCBwbGF0Zm9ybS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCAoc2RrUm9vdCkge1xuICBjb25zdCBwcm9wc1BhdGhzID0gYXdhaXQgZnMuZ2xvYignKi9idWlsZC5wcm9wJywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHBsYXRmb3Jtc01hcHBpbmcgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wc1BhdGggb2YgcHJvcHNQYXRocykge1xuICAgIGNvbnN0IHByb3BzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGxhdGZvcm1QYXRoID0gcGF0aC5kaXJuYW1lKHByb3BzUGF0aCk7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBwYXRoLmJhc2VuYW1lKHBsYXRmb3JtUGF0aCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvcm9cXC5idWlsZFxcLnZlcnNpb25cXC5zZGs9KFxcZCspLy5leGVjKHByb3BzQ29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBTREsgdmVyc2lvbiBmcm9tICcke3Byb3BzUGF0aH0nLiBTa2lwcGluZyAnJHtwbGF0Zm9ybX0nYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGxhdGZvcm1zTWFwcGluZ1twYXJzZUludChtYXRjaFsxXSwgMTApXSA9IHtcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgcGxhdGZvcm1QYXRoLFxuICAgIH07XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwbGF0Zm9ybXNNYXBwaW5nKSkge1xuICAgIGxvZy53YXJuKGBGb3VuZCB6ZXJvIHBsYXRmb3JtIGZvbGRlcnMgYXQgJyR7cGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKX0nLiBgICtcbiAgICAgIGBEbyB5b3UgaGF2ZSBhbnkgQW5kcm9pZCBTREtzIGluc3RhbGxlZD9gKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhdGZvcm06IG51bGwsXG4gICAgICBwbGF0Zm9ybVBhdGg6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY2VudFNka1ZlcnNpb24gPSBfLmtleXMocGxhdGZvcm1zTWFwcGluZykuc29ydCgpLnJldmVyc2UoKVswXTtcbiAgY29uc3QgcmVzdWx0ID0gcGxhdGZvcm1zTWFwcGluZ1tyZWNlbnRTZGtWZXJzaW9uXTtcbiAgbG9nLmRlYnVnKGBGb3VuZCB0aGUgbW9zdCByZWNlbnQgQW5kcm9pZCBwbGF0Zm9ybTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bnppcEZpbGUgKHppcFBhdGgsIGRzdFJvb3QgPSBwYXRoLmRpcm5hbWUoemlwUGF0aCkpIHtcbiAgbG9nLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nIHRvICcke2RzdFJvb3R9J2ApO1xuICBhd2FpdCB6aXAuYXNzZXJ0VmFsaWRaaXAoemlwUGF0aCk7XG4gIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oemlwUGF0aCwgZHN0Um9vdCk7XG4gIGxvZy5kZWJ1ZygnVW56aXAgc3VjY2Vzc2Z1bCcpO1xufVxuXG4vKipcbiAqIFVuc2lnbnMgdGhlIGdpdmVuIGFwayBieSByZW1vdmluZyB0aGVcbiAqIE1FVEEtSU5GIGZvbGRlciByZWN1cnNpdmVseSBmcm9tIHRoZSBhcmNoaXZlLlxuICogISEhIFRoZSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBnaXZlbiBhcGsgYWZ0ZXIgc3VjY2Vzc2Z1bCB1bnNpZ25pbmcgISEhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwa1BhdGggVGhlIHBhdGggdG8gdGhlIGFwa1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYXBrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdW5zaWduZWQgYW5kIG92ZXJ3cml0dGVuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgdW5zaWduIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiB1bnNpZ25BcGsgKGFwa1BhdGgpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBtZXRhSW5mRm9sZGVyTmFtZSA9ICdNRVRBLUlORic7XG4gIHRyeSB7XG4gICAgbGV0IGhhc01ldGFJbmYgPSBmYWxzZTtcbiAgICBhd2FpdCB6aXAucmVhZEVudHJpZXMoYXBrUGF0aCwgKHtlbnRyeX0pID0+IHtcbiAgICAgIGhhc01ldGFJbmYgPSBlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKGAke21ldGFJbmZGb2xkZXJOYW1lfS9gKTtcbiAgICAgIC8vIGVudHJpZXMgaXRlcmF0aW9uIHN0b3BzIGFmdGVyIGBmYWxzZWAgaXMgcmV0dXJuZWRcbiAgICAgIHJldHVybiAhaGFzTWV0YUluZjtcbiAgICB9KTtcbiAgICBpZiAoIWhhc01ldGFJbmYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG1wWmlwUm9vdCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAnYXBrJyk7XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcGtQYXRoLCB0bXBaaXBSb290KTtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHRtcFppcFJvb3QsIG1ldGFJbmZGb2xkZXJOYW1lKSk7XG4gICAgY29uc3QgdG1wUmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwa1BhdGgpKTtcbiAgICBhd2FpdCB6aXAudG9BcmNoaXZlKHRtcFJlc3VsdFBhdGgsIHtcbiAgICAgIGN3ZDogdG1wWmlwUm9vdCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy51bmxpbmsoYXBrUGF0aCk7XG4gICAgYXdhaXQgZnMubXYodG1wUmVzdWx0UGF0aCwgYXBrUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElNRUxpc3RGcm9tT3V0cHV0IChzdGRvdXQpIHtcbiAgbGV0IGVuZ2luZXMgPSBbXTtcbiAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID4gMCAmJiBsaW5lWzBdICE9PSAnICcpIHtcbiAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIGFuZCB0cmFpbGluZyBjb2xvbiwgYW5kIGFkZCB0byB0aGUgbGlzdFxuICAgICAgZW5naW5lcy5wdXNoKGxpbmUudHJpbSgpLnJlcGxhY2UoLzokLywgJycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVuZ2luZXM7XG59XG5cbmNvbnN0IGdldEphdmFIb21lID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFIb21lICgpIHtcbiAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzcy5lbnYuSkFWQV9IT01FO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzJyk7XG4gIH1cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGV4aXN0YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHJlc3VsdCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGJlIGEgdmFsaWQgZm9sZGVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5jb25zdCBnZXRKYXZhRm9yT3MgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUZvck9zICgpIHtcbiAgbGV0IGphdmFIb21lO1xuICBsZXQgZXJyTXNnO1xuICB0cnkge1xuICAgIGphdmFIb21lID0gYXdhaXQgZ2V0SmF2YUhvbWUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyTXNnID0gZXJyLm1lc3NhZ2U7XG4gIH1cbiAgY29uc3QgZXhlY3V0YWJsZU5hbWUgPSBgamF2YSR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgaWYgKGphdmFIb21lKSB7XG4gICAgY29uc3QgcmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicsIGV4ZWN1dGFibGVOYW1lKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goZXhlY3V0YWJsZU5hbWUpO1xuICB9IGNhdGNoIChpZ24pIHt9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlICcke2V4ZWN1dGFibGVOYW1lfScgYmluYXJ5IGNvdWxkIG5vdCBiZSBmb3VuZCBgICtcbiAgICBgbmVpdGhlciBpbiBQQVRIIG5vciB1bmRlciBKQVZBX0hPTUUgKCR7ZXJyTXNnIHx8IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicpfSlgKTtcbn0pO1xuXG5jb25zdCBnZXRPcGVuU3NsRm9yT3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpbmFyeU5hbWUgPSBgb3BlbnNzbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZW5zc2wgdG9vbCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgb24gdGhlIHBhdGgnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2xcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGtzaWduZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrc2lnbmVyLmphcicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9hcGthbmFseXplci5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGthbmFseXplckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGthbmFseXplcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBtU2hvd2luZ0xvY2tzY3JlZW4gb3IgbURyZWFtaW5nTG9ja3NjcmVlbiBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmVcbiAqIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmdcbiAqXG4gKiBBIG5vdGU6IGBhZGIgc2hlbGwgZHVtcHN5cyB0cnVzdGAgcGVyZm9ybXMgYmV0dGVyIHdoaWxlIGRldGVjdGluZyB0aGUgbG9ja2VkIHNjcmVlbiBzdGF0ZVxuICogaW4gY29tcGFyaXNvbiB0byBgYWRiIGR1bXBzeXMgd2luZG93YCBvdXRwdXQgcGFyc2luZy5cbiAqIEJ1dCB0aGUgdHJ1c3QgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGZvciBgU3dpcGVgIHVubG9jayBwYXR0ZXJuLlxuICpcbiAqIEluIHNvbWUgQW5kcm9pZCBkZXZpY2VzIChQcm9iYWJseSBhcm91bmQgQW5kcm9pZCAxMCspLCBgbVNob3dpbmdMb2Nrc2NyZWVuYCBhbmQgYG1EcmVhbWluZ0xvY2tzY3JlZW5gXG4gKiBkbyBub3Qgd29yayB0byBkZXRlY3QgbG9jayBzdGF0dXMuIEluc3RlYWQsIGtleWd1YXJkIHByZWZlcmVuY2VzIGhlbHBzIHRvIGRldGVjdCB0aGUgbG9jayBjb25kaXRpb24uXG4gKiBTb21lIGRldmljZXMgc3VjaCBhcyBBbmRyb2lkIFRWIGRvIG5vdCBoYXZlIGtleWd1YXJkLCBzbyB3ZSBzaG91bGQga2VlcFxuICogc2NyZWVuIGNvbmRpdGlvbiBhcyB0aGlzIHByaW1hcnkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzIC0gVGhlIG91dHB1dCBvZiBkdW1wc3lzIHdpbmRvdyBjb21tYW5kLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nLlxuICovXG5mdW5jdGlvbiBpc1Nob3dpbmdMb2Nrc2NyZWVuIChkdW1wc3lzKSB7XG4gIHJldHVybiBfLnNvbWUoWydtU2hvd2luZ0xvY2tzY3JlZW49dHJ1ZScsICdtRHJlYW1pbmdMb2Nrc2NyZWVuPXRydWUnXSwgKHgpID0+IGR1bXBzeXMuaW5jbHVkZXMoeCkpXG4gICAgLy8gYG1Jc1Nob3dpbmdgIGFuZCBgbUlucHV0UmVzdHJpY3RlZGAgYXJlIGB0cnVlYCBpbiBsb2NrIGNvbmRpdGlvbi4gYGZhbHNlYCBpcyB1bmxvY2sgY29uZGl0aW9uLlxuICAgIHx8IF8uZXZlcnkoWy9LZXlndWFyZFN0YXRlTW9uaXRvcltcXG5cXHNdK21Jc1Nob3dpbmc9dHJ1ZS8sIC9cXHMrbUlucHV0UmVzdHJpY3RlZD10cnVlL10sICh4KSA9PiB4LnRlc3QoZHVtcHN5cykpO1xufVxuXG4vKlxuICogQ2hlY2tzIG1DdXJyZW50Rm9jdXMgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIEtleWd1YXJkIGlzIGFjdGl2YXRlZFxuICovXG5mdW5jdGlvbiBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbUN1cnJlbnRGb2N1cy4rS2V5Z3VhcmQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIChtICYmIG0ubGVuZ3RoICYmIG1bMF0pID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKlxuICogUmVhZHMgU3VyZmFjZU9yaWVudGF0aW9uIGluIGR1bXBzeXMgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGdldFN1cmZhY2VPcmllbnRhdGlvbiAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9TdXJmYWNlT3JpZW50YXRpb246IFxcZC9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gbSAmJiBwYXJzZUludChtWzBdLnNwbGl0KCc6JylbMV0sIDEwKTtcbn1cblxuLypcbiAqIENoZWNrcyBtU2NyZWVuT25GdWxseSBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmUgaWYgc2NyZWVuIGlzIHNob3dpbmdcbiAqIERlZmF1bHQgaXMgdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1NjcmVlbk9uRnVsbHkgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbVNjcmVlbk9uRnVsbHk9XFx3Ky9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gIW0gfHwgLy8gaWYgaW5mb3JtYXRpb24gaXMgbWlzc2luZyB3ZSBhc3N1bWUgc2NyZWVuIGlzIGZ1bGx5IG9uXG4gICAgICAgICAobSAmJiBtLmxlbmd0aCA+IDAgJiYgbVswXS5zcGxpdCgnPScpWzFdID09PSAndHJ1ZScpIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlblxuICogYXBwbGljYXRpb24gc3RhcnR1cCBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtTdGFydEFwcE9wdGlvbnN9IHN0YXJ0QXBwT3B0aW9ucyAtIEFwcGxpY2F0aW9uIG9wdGlvbnMgbWFwcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGFjdHVhbCBPUyBBUEkgbGV2ZWxcbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYWN0dWFsIGNvbW1hbmQgbGluZSBhcnJheVxuICovXG5mdW5jdGlvbiBidWlsZFN0YXJ0Q21kIChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gICAgcGtnLFxuICAgIGFjdGl2aXR5LFxuICAgIGFjdGlvbixcbiAgICBjYXRlZ29yeSxcbiAgICBzdG9wQXBwLFxuICAgIGZsYWdzLFxuICB9ID0gc3RhcnRBcHBPcHRpb25zO1xuICBjb25zdCBjbWQgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgY21kLnB1c2goJy1XJyk7XG4gIH1cbiAgaWYgKGFjdGl2aXR5ICYmIHBrZykge1xuICAgIGNtZC5wdXNoKCctbicsIGAke3BrZ30vJHthY3Rpdml0eX1gKTtcbiAgfVxuICBpZiAoc3RvcEFwcCAmJiBhcGlMZXZlbCA+PSAxNSkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmIChhY3Rpb24pIHtcbiAgICBjbWQucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmIChjYXRlZ29yeSkge1xuICAgIGNtZC5wdXNoKCctYycsIGNhdGVnb3J5KTtcbiAgfVxuICBpZiAoZmxhZ3MpIHtcbiAgICBjbWQucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgaWYgKHN0YXJ0QXBwT3B0aW9ucy5vcHRpb25hbEludGVudEFyZ3VtZW50cykge1xuICAgIC8vIGV4cGVjdCBvcHRpb25hbEludGVudEFyZ3VtZW50cyB0byBiZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm06XG4gICAgLy8gICAgIFwiLWZsYWcga2V5XCJcbiAgICAvLyAgICAgXCItZmxhZyBrZXkgdmFsdWVcIlxuICAgIC8vIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgKGUuZy4sIFwiLWZsYWcxIGtleTEgLWZsYWcyIGtleTIgdmFsdWUyXCIpXG5cbiAgICAvLyB0YWtlIGEgc3RyaW5nIGFuZCBwYXJzZSBvdXQgdGhlIHBhcnQgYmVmb3JlIGFueSBzcGFjZXMsIGFuZCBhbnl0aGluZyBhZnRlclxuICAgIC8vIHRoZSBmaXJzdCBzcGFjZVxuICAgIGxldCBwYXJzZUtleVZhbHVlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgIGxldCBzcGFjZSA9IHN0ci5pbmRleE9mKCcgJyk7XG4gICAgICBpZiAoc3BhY2UgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoID8gW3N0cl0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBzcGFjZSkudHJpbSgpLCBzdHIuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY3ljbGUgdGhyb3VnaCB0aGUgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgYW5kIHB1bGwgb3V0IHRoZSBhcmd1bWVudHNcbiAgICAvLyBhZGQgYSBzcGFjZSBpbml0aWFsbHkgc28gZmxhZ3MgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBhcmd1bWVudHMgdGhhdFxuICAgIC8vIGhhdmUgaW50ZXJuYWwgaHlwaGVuc1xuICAgIGxldCBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGAgJHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHN9YDtcbiAgICBsZXQgcmUgPSAvICgtW15cXHNdKykgKC4rKS87XG4gICAgd2hpbGUgKHRydWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgIGxldCBhcmdzID0gcmUuZXhlYyhvcHRpb25hbEludGVudEFyZ3VtZW50cyk7XG4gICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgZmxhZ3MsIHNvIHRoZSByZW1haW5kZXIgY2FuIGJlIHRyZWF0ZWQgYXMgJ2tleScgb3IgJ2tleSB2YWx1ZSdcbiAgICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gdGFrZSB0aGUgZmxhZyBhbmQgc2VlIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgLy8gaWYgaXQgaXMgbm90LCB0aGVuIGl0IG1lYW5zIHdlIGhhdmUgYmVlbiB0aHJvdWdoIGFscmVhZHksIGFuZFxuICAgICAgLy8gd2hhdCBpcyBiZWZvcmUgdGhlIGZsYWcgaXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgcHJldmlvdXMgZmxhZ1xuICAgICAgbGV0IGZsYWcgPSBhcmdzWzFdO1xuICAgICAgbGV0IGZsYWdQb3MgPSBvcHRpb25hbEludGVudEFyZ3VtZW50cy5pbmRleE9mKGZsYWcpO1xuICAgICAgaWYgKGZsYWdQb3MgIT09IDApIHtcbiAgICAgICAgbGV0IHByZXZBcmdzID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuc3Vic3RyaW5nKDAsIGZsYWdQb3MpO1xuICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUocHJldkFyZ3MpKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmbGFnLCBhcyB0aGVyZSBhcmUgbm8gbW9yZSBlYXJsaWVyIGFyZ3VtZW50c1xuICAgICAgY21kLnB1c2goZmxhZyk7XG5cbiAgICAgIC8vIG1ha2Ugb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgaG9sZCB0aGUgcmVtYWluZGVyXG4gICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGFyZ3NbMl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjbWQ7XG59XG5cbmNvbnN0IGdldFNka1Rvb2xzVmVyc2lvbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTZGtUb29sc1ZlcnNpb24gKCkge1xuICBjb25zdCBhbmRyb2lkSG9tZSA9IHByb2Nlc3MuZW52LkFORFJPSURfSE9NRTtcbiAgaWYgKCFhbmRyb2lkSG9tZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EUk9JRF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIGJlIHNldCcpO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKGFuZHJvaWRIb21lLCAndG9vbHMnLCAnc291cmNlLnByb3BlcnRpZXMnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocHJvcGVydGllc1BhdGgpKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBmaW5kICR7cHJvcGVydGllc1BhdGh9IGZpbGUgdG8gcmVhZCBTREsgdmVyc2lvbiBmcm9tYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcGVydGllc1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHZlcnNpb25NYXRjaGVyID0gbmV3IFJlZ0V4cCgvUGtnXFwuUmV2aXNpb249KFxcZCspXFwuPyhcXGQrKT9cXC4/KFxcZCspPy8pO1xuICBjb25zdCBtYXRjaCA9IHZlcnNpb25NYXRjaGVyLmV4ZWMocHJvcGVydGllc0NvbnRlbnQpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICBtaW5vcjogbWF0Y2hbMl0gPyBwYXJzZUludChtYXRjaFsyXSwgMTApIDogMCxcbiAgICAgIGJ1aWxkOiBtYXRjaFszXSA/IHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgOiAwXG4gICAgfTtcbiAgfVxuICBsb2cud2FybihgQ2Fubm90IHBhcnNlIFwiUGtnLlJldmlzaW9uXCIgdmFsdWUgZnJvbSAke3Byb3BlcnRpZXNQYXRofWApO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIGZ1bGwgcGF0aHMgdG8gYWxsICdidWlsZC10b29scycgc3ViZm9sZGVycyB1bmRlciB0aGUgcGFydGljdWxhclxuICogU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNka1Jvb3QgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIFNESyByb290IGZvbGRlclxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBmdWxsIHBhdGhzIHRvIHRoZSByZXN1bHRpbmcgZm9sZGVycyBzb3J0ZWQgYnlcbiAqIG1vZGlmaWNhdGlvbiBkYXRlICh0aGUgbmV3ZXN0IGNvbWVzIGZpcnN0KSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hY3RoZXMgd2VyZSBmb3VuZFxuICovXG5jb25zdCBnZXRCdWlsZFRvb2xzRGlycyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRCdWlsZFRvb2xzRGlycyAoc2RrUm9vdCkge1xuICBsZXQgYnVpbGRUb29sc0RpcnMgPSBhd2FpdCBmcy5nbG9iKCcqLycsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAnYnVpbGQtdG9vbHMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBidWlsZFRvb2xzRGlyc1xuICAgICAgLm1hcCgoZGlyKSA9PiBbcGF0aC5iYXNlbmFtZShkaXIpLCBkaXJdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHNlbXZlci5yY29tcGFyZShhWzBdLCBiWzBdKSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHNvcnQgYnVpbGQtdG9vbHMgZm9sZGVycyAke0pTT04uc3RyaW5naWZ5KGJ1aWxkVG9vbHNEaXJzLm1hcCgoZGlyKSA9PiBwYXRoLmJhc2VuYW1lKGRpcikpKX0gYCArXG4gICAgICBgYnkgc2VtYW50aWMgdmVyc2lvbiBuYW1lcy5gKTtcbiAgICBsb2cud2FybihgRmFsbGluZyBiYWNrIHRvIHNvcnRpbmcgYnkgbW9kaWZpY2F0aW9uIGRhdGUuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHBhaXJzID0gYXdhaXQgQi5tYXAoYnVpbGRUb29sc0RpcnMsIGFzeW5jIChkaXIpID0+IFsoYXdhaXQgZnMuc3RhdChkaXIpKS5tdGltZS52YWx1ZU9mKCksIGRpcl0pO1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gcGFpcnNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9XG4gIGxvZy5pbmZvKGBGb3VuZCAke2J1aWxkVG9vbHNEaXJzLmxlbmd0aH0gJ2J1aWxkLXRvb2xzJyBmb2xkZXJzIHVuZGVyICcke3Nka1Jvb3R9JyAobmV3ZXN0IGZpcnN0KTpgKTtcbiAgZm9yIChsZXQgZGlyIG9mIGJ1aWxkVG9vbHNEaXJzKSB7XG4gICAgbG9nLmluZm8oYCAgICAke2Rpcn1gKTtcbiAgfVxuICByZXR1cm4gYnVpbGRUb29sc0RpcnM7XG59KTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbiBuYW1lcyBlbmNvZGVkIGluIGBkdW1wc3lzIHBhY2thZ2VgIGNvbW1hbmQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzT3V0cHV0IC0gVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZ3JvdXBOYW1lcyAtIFRoZSBsaXN0IG9mIGdyb3VwIG5hbWVzIHRvIGxpc3QgcGVybWlzc2lvbnMgZm9yLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZ3JhbnRlZFN0YXRlIC0gVGhlIGV4cGVjdGVkIHN0YXRlIG9mIGBncmFudGVkYCBhdHRyaWJ1dGUgdG8gZmlsdGVyIHdpdGguXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBmaWx0ZXJpbmcgaXMgZG9uZSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwZXJtaXNzaW9uIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kLlxuICovXG5jb25zdCBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uIChkdW1wc3lzT3V0cHV0LCBncm91cE5hbWVzLCBncmFudGVkU3RhdGUgPSBudWxsKSB7XG4gIGNvbnN0IGdyb3VwUGF0dGVybkJ5TmFtZSA9IChncm91cE5hbWUpID0+IG5ldyBSZWdFeHAoYF4oXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChncm91cE5hbWUpfSBwZXJtaXNzaW9uczpbXFxcXHNcXFxcU10rKWAsICdtJyk7XG4gIGNvbnN0IGluZGVudFBhdHRlcm4gPSAvXFxTfCQvO1xuICBjb25zdCBwZXJtaXNzaW9uTmFtZVBhdHRlcm4gPSAvYW5kcm9pZFxcLlxcdypcXC4/cGVybWlzc2lvblxcLlxcdysvO1xuICBjb25zdCBncmFudGVkU3RhdGVQYXR0ZXJuID0gL1xcYmdyYW50ZWQ9KFxcdyspLztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIGdyb3VwTmFtZXMpIHtcbiAgICBjb25zdCBncm91cE1hdGNoID0gZ3JvdXBQYXR0ZXJuQnlOYW1lKGdyb3VwTmFtZSkuZXhlYyhkdW1wc3lzT3V0cHV0KTtcbiAgICBpZiAoIWdyb3VwTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gZ3JvdXBNYXRjaFsxXS5zcGxpdCgnXFxuJyk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlSW5kZW50ID0gbGluZXNbMF0uc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgY3VycmVudEluZGVudCA9IGxpbmUuc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gdGl0bGVJbmRlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25OYW1lTWF0Y2ggPSBwZXJtaXNzaW9uTmFtZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghcGVybWlzc2lvbk5hbWVNYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb25OYW1lTWF0Y2hbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JhbnRlZFN0YXRlTWF0Y2ggPSBncmFudGVkU3RhdGVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoZ3JhbnRlZFN0YXRlTWF0Y2gpIHtcbiAgICAgICAgaXRlbS5ncmFudGVkID0gZ3JhbnRlZFN0YXRlTWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgLmZpbHRlcigoaXRlbSkgPT4gIV8uaXNCb29sZWFuKGdyYW50ZWRTdGF0ZSkgfHwgaXRlbS5ncmFudGVkID09PSBncmFudGVkU3RhdGUpXG4gICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5wZXJtaXNzaW9uKTtcbiAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgJHt1dGlsLnBsdXJhbGl6ZSgncGVybWlzc2lvbicsIGZpbHRlcmVkUmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgIGBmcm9tICR7Z3JvdXBOYW1lc30gJHt1dGlsLnBsdXJhbGl6ZSgnZ3JvdXAnLCBncm91cE5hbWVzLmxlbmd0aCwgZmFsc2UpfWApO1xuICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFydGlhbEluc3RhbGwgW2ZhbHNlXSAtIEluc3RhbGwgYXBrcyBwYXJ0aWFsbHkuIEl0IGlzIHVzZWQgZm9yICdpbnN0YWxsLW11bHRpcGxlJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9hbmRyb2lkLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMTEwNjQvd2hhdC1pcy1hLXBhcnRpYWwtYXBwbGljYXRpb24taW5zdGFsbC12aWEtYWRiXG4gKi9cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGdpdmVuIG9wdGlvbnMgaW50byB0aGUgbGlzdCBvZiBgYWRiIGluc3RhbGwuaW5zdGFsbC1tdWx0aXBsZWAgY29tbWFuZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgY3VycmVudCBBUEkgbGV2ZWxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgbWFwcGluZyB0byB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbEFyZ3MgKGFwaUxldmVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG9wdGlvbnMucmVwbGFjZSkgfHwgb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1yJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYWxsb3dUZXN0UGFja2FnZXMpIHtcbiAgICByZXN1bHQucHVzaCgnLXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy51c2VTZGNhcmQpIHtcbiAgICByZXN1bHQucHVzaCgnLXMnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5ncmFudFBlcm1pc3Npb25zKSB7XG4gICAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2tpcHBpbmcgcGVybWlzc2lvbnMgZ3JhbnQgb3B0aW9uLCBzaW5jZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgQVBJIGxldmVsICR7YXBpTGV2ZWx9IGRvZXMgbm90IHN1cHBvcnQgYXBwbGljYXRpb25zIGAgK1xuICAgICAgICAgICAgICAgIGBwZXJtaXNzaW9ucyBjdXN0b21pemF0aW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKCctZycpO1xuICAgIH1cbiAgfVxuICAvLyBGb3IgbXVsdGlwbGUtaW5zdGFsbFxuICBpZiAob3B0aW9ucy5wYXJ0aWFsSW5zdGFsbCkge1xuICAgIHJlc3VsdC5wdXNoKCctcCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYW5pZmVzdEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2cgLSBUaGUgYXBwbGljYXRpb24gaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gcGFja2FnZSBhY3Rpdml0eVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFRoZSB2ZXJzaW9uIGNvZGUgbnVtYmVyIChtaWdodCBiZSBgTmFOYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbk5hbWUgLSBUaGUgdmVyc2lvbiBuYW1lIChtaWdodCBiZSBgbnVsbGApXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtIHBhcnNpbmcgb2YgdGhlIG1hbmlmZXN0IG9iamVjdCBpbiBvcmRlclxuICogdG8gZXh0cmFjdCBzb21lIHZpdGFsIHZhbHVlcyBmcm9tIGl0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1hbmlmZXN0IFRoZSBtYW5pZmVzdCBjb250ZW50IGZvcm1hdHRlZCBhcyBKU09OXG4gKiBTZWUgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYWRia2l0LWFwa3JlYWRlciBmb3IgZGV0YWlsZWQgZm9ybWF0IGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7TWFuaWZlc3RJbmZvfVxuICovXG5mdW5jdGlvbiBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgcGtnOiBtYW5pZmVzdC5wYWNrYWdlLFxuICAgIHZlcnNpb25Db2RlOiBwYXJzZUludChtYW5pZmVzdC52ZXJzaW9uQ29kZSwgMTApLFxuICAgIHZlcnNpb25OYW1lOiBtYW5pZmVzdC52ZXJzaW9uTmFtZSB8fCBudWxsLFxuICB9O1xuICBpZiAoIW1hbmlmZXN0LmFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIExvb2sgZm9yIGVuYWJsZWQgYWN0aXZpdHkgb3IgYWN0aXZpdHktYWxpYXMgd2l0aFxuICAvLyBhY3Rpb24gPT0gYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gYW5kXG4gIC8vIGNhdGVnb3J5ID09IGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSXG4gIGZvciAoY29uc3QgYWN0aXZpdHkgb2YgW1xuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXRpZXMsXG4gICAgLi4ubWFuaWZlc3QuYXBwbGljYXRpb24uYWN0aXZpdHlBbGlhc2VzLFxuICBdKSB7XG4gICAgaWYgKGFjdGl2aXR5LmVuYWJsZWQgPT09IGZhbHNlIHx8IF8uaXNFbXB0eShhY3Rpdml0eS5pbnRlbnRGaWx0ZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9ucywgY2F0ZWdvcmllc30gb2YgYWN0aXZpdHkuaW50ZW50RmlsdGVycykge1xuICAgICAgaWYgKF8uaXNFbXB0eShhY3Rpb25zKSB8fCBfLmlzRW1wdHkoY2F0ZWdvcmllcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTWFpbkFjdGlvbiA9IGFjdGlvbnMuc29tZSgoe25hbWV9KSA9PiBuYW1lID09PSBNQUlOX0FDVElPTik7XG4gICAgICBjb25zdCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gTEFVTkNIRVJfQ0FURUdPUlkpO1xuICAgICAgaWYgKGlzTWFpbkFjdGlvbiAmJiBpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gYWN0aXZpdHkubmFtZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYXBrIHN0cmluZ3MgZnJvbSBhYXB0IHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBgKGRlZmF1bHQpYFxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHRTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBub3JtYWxpemVTdHJpbmdNYXRjaCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXCIkLywgJycpLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gIH07XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgaXNJbkNvbmZpZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIC8vIFRoZSBwYXR0ZXJuIG1hdGNoZXMgYW55IHF1b3RlZCBjb250ZW50IGluY2x1ZGluZyBlc2NhcGVkIHF1b3Rlc1xuICBjb25zdCBxdW90ZWRTdHJpbmdQYXR0ZXJuID0gL1wiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIvO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3T3V0cHV0LnNwbGl0KG9zLkVPTCkpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmIChfLmlzRW1wdHkodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWydjb25maWcnLCAndHlwZScsICdzcGVjJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgaXNJbkNvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYGNvbmZpZyAke2NvbmZpZ01hcmtlcn06YCk7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkNvbmZpZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJzpzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnN0cmluZ1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6cGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC86cGx1cmFsc1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoc3RyaW5nJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcXVvdGVkU3RyaW5nUGF0dGVybi5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IG5vcm1hbGl6ZVN0cmluZ01hdGNoKG1hdGNoWzBdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiBpc0luUGx1cmFsR3JvdXAgJiYgdHJpbW1lZExpbmUuaW5jbHVkZXMoJzogKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgLi4uKGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdIHx8IFtdKSxcbiAgICAgICAgICBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFwa1N0cmluZ3M7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdDIgdG9vbCBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3T3V0cHV0IFRoZSBhY3R1YWwgdG9vbCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdNYXJrZXIgVGhlIGNvbmZpZyBtYXJrZXIuIFVzdWFsbHlcbiAqIGEgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uIG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgb25lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJpbmdzIGlkcyB0byB2YWx1ZXMgbWFwcGluZy4gUGx1cmFsXG4gKiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cy4gSWYgbm8gY29uZmlnIGZvdW5kIGZvciB0aGVcbiAqIGdpdmVuIG1hcmtlciB0aGVuIGFuIGVtcHR5IG1hcHBpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWFwdDJTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBhbGxMaW5lcyA9IHJhd091dHB1dC5zcGxpdChvcy5FT0wpO1xuICBmdW5jdGlvbiBleHRyYWN0Q29udGVudCAoc3RhcnRJZHgpIHtcbiAgICBsZXQgaWR4ID0gc3RhcnRJZHg7XG4gICAgY29uc3Qgc3RhcnRDaGFyUG9zID0gYWxsTGluZXNbc3RhcnRJZHhdLmluZGV4T2YoJ1wiJyk7XG4gICAgaWYgKHN0YXJ0Q2hhclBvcyA8IDApIHtcbiAgICAgIHJldHVybiBbbnVsbCwgaWR4XTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlIChpZHggPCBhbGxMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0aW9uQ2hhck1hdGNoID0gL1wiJC8uZXhlYyhhbGxMaW5lc1tpZHhdKTtcbiAgICAgIGlmICh0ZXJtaW5hdGlvbkNoYXJNYXRjaCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJQb3MgPSB0ZXJtaW5hdGlvbkNoYXJNYXRjaC5pbmRleDtcbiAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSBpZHgpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSwgdGVybWluYXRpb25DaGFyUG9zKSxcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHtyZXN1bHR9XFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKDAsIHRlcm1pbmF0aW9uQ2hhclBvcykpfWAsXG4gICAgICAgICAgaWR4LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCA+IHN0YXJ0SWR4KSB7XG4gICAgICAgIHJlc3VsdCArPSBgXFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSk7XG4gICAgICB9XG4gICAgICArK2lkeDtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIGlkeF07XG4gIH1cblxuICBjb25zdCBhcGtTdHJpbmdzID0ge307XG4gIGxldCBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gIGxldCBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgbGV0IGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG4gIGxldCBsaW5lSW5kZXggPSAwO1xuICB3aGlsZSAobGluZUluZGV4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBhbGxMaW5lc1tsaW5lSW5kZXhdLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWyd0eXBlJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgncmVzb3VyY2UnKSkge1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJ3N0cmluZy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9zdHJpbmdcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdwbHVyYWxzLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL3BsdXJhbHNcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkKSB7XG4gICAgICBpZiAoaXNJblBsdXJhbEdyb3VwKSB7XG4gICAgICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoJykpIHtcbiAgICAgICAgICBpc0luQ3VycmVudENvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYCgke2NvbmZpZ01hcmtlcn0pYCk7XG4gICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5DdXJyZW50Q29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgW2NvbnRlbnQsIGlkeF0gPSBleHRyYWN0Q29udGVudChsaW5lSW5kZXgpO1xuICAgICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApKSB7XG4gICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgbGluZUluZGV4ID0gaWR4O1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgICsrbGluZUluZGV4O1xuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGNvbmZpZyBtYXJrZXIsIHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvIHBhcnNlLi4gbWV0aG9kc1xuICogdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcmVzb3VyY2UgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgYWFwdCgyKSB0b29sXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uZmlnc0dldHRlciBUaGUgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgbGlzdFxuICogb2YgYXBrIGNvbmZpZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNpcmVkTWFya2VyIFRoZSBkZXNpcmVkIGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0TWFya2VyIFRoZSBkZWZhdWx0IGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25maWcgbWFya2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvbmZpZ01hcmtlciAoY29uZmlnc0dldHRlciwgZGVzaXJlZE1hcmtlciwgZGVmYXVsdE1hcmtlcikge1xuICBsZXQgY29uZmlnTWFya2VyID0gZGVzaXJlZE1hcmtlciB8fCBkZWZhdWx0TWFya2VyO1xuICBpZiAoY29uZmlnTWFya2VyLmluY2x1ZGVzKCctJykgJiYgIWNvbmZpZ01hcmtlci5pbmNsdWRlcygnLXInKSkge1xuICAgIGNvbmZpZ01hcmtlciA9IGNvbmZpZ01hcmtlci5yZXBsYWNlKCctJywgJy1yJyk7XG4gIH1cbiAgY29uc3QgY29uZmlncyA9IGF3YWl0IGNvbmZpZ3NHZXR0ZXIoKTtcbiAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uczogJHtKU09OLnN0cmluZ2lmeShjb25maWdzKX1gKTtcbiAgLy8gQXNzdW1lIHRoZSAnZW4nIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGRlZmF1bHQgb25lXG4gIGlmIChjb25maWdNYXJrZXIudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdlbicpXG4gICAgJiYgIWNvbmZpZ3Muc29tZSgoeCkgPT4geC50cmltKCkgPT09IGNvbmZpZ01hcmtlcikpIHtcbiAgICBsb2cuZGVidWcoYFJlc291cmNlIGNvbmZpZ3VyYXRpb24gbmFtZSAnJHtjb25maWdNYXJrZXJ9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBSZXBsYWNpbmcgaXQgd2l0aCAnJHtkZWZhdWx0TWFya2VyfSdgKTtcbiAgICBjb25maWdNYXJrZXIgPSBkZWZhdWx0TWFya2VyO1xuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgY29uZmlndXJhdGlvbjogJyR7Y29uZmlnTWFya2VyfSdgKTtcbiAgfVxuICByZXR1cm4gY29uZmlnTWFya2VyO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgb3V0cHV0IGluIEpTT04gZm9ybWF0IHJldHJpZXZlZCBmcm9tXG4gKiB0aGUgY29ycmVzcG9uZGluZyBBcHBpdW0gU2V0dGluZ3MgYnJvYWRjYXN0IGNhbGxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCBUaGUgYWN0dWFsIGNvbW1hbmQgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gZW50aXR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHdoaWNoIGlzXG4gKiBnb2luZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgb3V0cHV0IGNhbm5vdCBiZSBwYXJzZWRcbiAqIGFzIGEgdmFsaWQgSlNPTlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25EYXRhIChvdXRwdXQsIGVudGl0eU5hbWUpIHtcbiAgaWYgKCEvXFxicmVzdWx0PS0xXFxiLy50ZXN0KG91dHB1dCkgfHwgIS9cXGJkYXRhPVwiLy50ZXN0KG91dHB1dCkpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gL1xcYmRhdGE9KFwiLispLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbiAgY29uc3QganNvblN0ciA9IF8udHJpbShtYXRjaFsxXSkucmVwbGFjZSgvKF5cIil8KFwiJCkvZywgJycpO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGpzb25TdHIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgcmVzdWx0aW5nIGRhdGEgc3RyaW5nLiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgY291bnRyeSBhYmJyZXZpYXRpb25zXG4gKiB0byBBVkQgYXJndW1lbnRzIGFycmF5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsYW5ndWFnZSBMYW5ndWFnZSBuYW1lLCBmb3IgZXhhbXBsZSAnZnInXG4gKiBAcGFyYW0gez9zdHJpbmd9IGNvdW50cnkgQ291bnRyeSBuYW1lLCBmb3IgZXhhbXBsZSAnQ0EnXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGdlbmVyYXRlZCBhcmd1bWVudHMuIFRoZVxuICogcmVzdWx0aW5nIGFycmF5IG1pZ2h0IGJlIGVtcHR5IGlmIGJvdGggYXJndW1lbnRzIGFyZSBlbXB0eVxuICovXG5mdW5jdGlvbiB0b0F2ZExvY2FsZUFyZ3MgKGxhbmd1YWdlLCBjb3VudHJ5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMubGFuZ3VhZ2U9JHtsYW5ndWFnZS50b0xvd2VyQ2FzZSgpfWApO1xuICB9XG4gIGlmIChjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMuY291bnRyeT0ke2NvdW50cnkudG9VcHBlckNhc2UoKX1gKTtcbiAgfVxuICBsZXQgbG9jYWxlO1xuICBpZiAoXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSAmJiBsYW5ndWFnZSAmJiBjb3VudHJ5KSB7XG4gICAgbG9jYWxlID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSArICctJyArIGNvdW50cnkudG9VcHBlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9jYWxlID0gY291bnRyeTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxvY2FsZT0ke2xvY2FsZX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIHByZWZlcmVuY2VzIHJvb3RcbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGBudWxsYCBpZiB0aGUgZm9sZGVyIGNhbm5vdCBiZSBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUHJlZnNSb290ICgpIHtcbiAgbGV0IGxvY2F0aW9uID0gcHJvY2Vzcy5lbnYuQU5EUk9JRF9FTVVMQVRPUl9IT01FO1xuICBpZiAoYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxvZy53YXJuKGBUaGUgdmFsdWUgb2YgdGhlIEFORFJPSURfRU1VTEFUT1JfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgfVxuXG4gIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5IT01FIHx8IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFO1xuICBpZiAoaG9tZSkge1xuICAgIGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGhvbWUsICcuYW5kcm9pZCcpO1xuICB9XG5cbiAgaWYgKCFhd2FpdCBkaXJFeGlzdHMobG9jYXRpb24pKSB7XG4gICAgbG9nLmRlYnVnKGBBbmRyb2lkIGNvbmZpZyByb290ICcke2xvY2F0aW9ufScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aCBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0gYW5kIGlzIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsb2NhdGlvbiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBkaXJFeGlzdHMgKGxvY2F0aW9uKSB7XG4gIHJldHVybiBsb2NhdGlvblxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhsb2NhdGlvbilcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChsb2NhdGlvbikpLmlzRGlyZWN0b3J5KCk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cbiAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHBvc3NpYmxlIGlzc3VlcyB3aXRoIGhvdyBzeXN0ZW0gYHNwYXduYFxuICogY2FsbCBoYW5kbGVzIHRoZW0uXG4gKiBTZWUgaHR0cHM6Ly9kaXNjdXNzLmFwcGl1bS5pby90L2hvdy10by1tb2RpZnktd2QtcHJveHktYW5kLXVpYXV0b21hdG9yMi1zb3VyY2UtY29kZS10by1zdXBwb3J0LXVuaWNvZGUvMzM0NjZcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZyBOb24tZXNjYXBlZCBhcmd1bWVudCBzdHJpbmdcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVNoZWxsQXJnIChhcmcpIHtcbiAgYXJnID0gYCR7YXJnfWA7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gL1smfF5cXHNdLy50ZXN0KGFyZykgPyBgXCIke2FyZy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IGFyZztcbiAgfVxuICByZXR1cm4gYXJnLnJlcGxhY2UoLyYvZywgJ1xcXFwmJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBuYW1lIG9mIGxhdW5jaGFibGUgcGFja2FnZSBhY3Rpdml0eVxuICogZnJvbSBkdW1wc3lzIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5cyB0aGUgYWN0dWFsIGR1bXBzeXMgb3V0cHV0XG4gKiBAcmV0dXJucyB7c3RyaW5nW119IEVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBhY3Rpdml0eSBuYW1lIGFzIGEgc2luZ2xlIGxpc3QgaXRlbSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vdGhpbmcgY291bGQgYmUgcGFyc2VkLlxuICogSW4gQW5kcm9pZCA2IGFuZCBvbGRlciB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lXG4gKiB0aGUgY2F0ZWdvcnkgbmFtZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LCBzbyB0aGlzIEFQSSBqdXN0XG4gKiByZXR1cm5zIGFsbCBhY3Rpdml0eSBuYW1lcyBiZWxvbmdpbmcgdG8gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJ1xuICogd2l0aCB0aGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgYXBwIG1hbmlmZXN0IGNvdWxkIGJlIHBhcnNlZCBuZXh0XG4gKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgY2F0ZWdvcnkgbmFtZXMgZm9yIHRoZXNlLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIChkdW1wc3lzKSB7XG4gIGNvbnN0IG1haW5BY3Rpdml0eU5hbWVSZSA9IG5ldyBSZWdFeHAoYF5cXFxccyoke18uZXNjYXBlUmVnRXhwKE1BSU5fQUNUSU9OKX06JGApO1xuICBjb25zdCBjYXRlZ29yeU5hbWVSZSA9IC9eXFxzKkNhdGVnb3J5OlxccytcIihbYS16QS1aMC05Ll8vLV0rKVwiJC87XG4gIGNvbnN0IGJsb2NrcyA9IFtdO1xuICBsZXQgYmxvY2tTdGFydEluZGVudDtcbiAgbGV0IGJsb2NrID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBkdW1wc3lzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAobWFpbkFjdGl2aXR5TmFtZVJlLnRlc3QobGluZSkpIHtcbiAgICAgIGJsb2NrU3RhcnRJbmRlbnQgPSBjdXJyZW50SW5kZW50O1xuICAgICAgaWYgKCFfLmlzRW1wdHkoYmxvY2spKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgYmxvY2sgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXy5pc05pbChibG9ja1N0YXJ0SW5kZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRJbmRlbnQgPiBibG9ja1N0YXJ0SW5kZW50KSB7XG4gICAgICBibG9jay5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eShibG9jaykpIHtcbiAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICBibG9jayA9IFtdO1xuICAgICAgfVxuICAgICAgYmxvY2tTdGFydEluZGVudCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGJsb2NrKSkge1xuICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYmxvY2tzKSB7XG4gICAgbGV0IGhhc0NhdGVnb3J5ID0gZmFsc2U7XG4gICAgbGV0IGlzTGF1bmNoZXJDYXRlZ29yeSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBpdGVtKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGNhdGVnb3J5TmFtZVJlLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBoYXNDYXRlZ29yeSA9IHRydWU7XG4gICAgICBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBtYXRjaFsxXSA9PT0gTEFVTkNIRVJfQ0FURUdPUlk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gT24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucyB0aGUgY2F0ZWdvcnkgbmFtZVxuICAgIC8vIG1pZ2h0IG5vdCBiZSBsaXN0ZWQsIHNvIHdlIGp1c3QgdHJ5IHRvIGZldGNoXG4gICAgLy8gYWxsIG1hdGNoZXMgaW5zdGVhZFxuICAgIGlmIChoYXNDYXRlZ29yeSAmJiAhaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2aXR5TmFtZVN0ciBvZiBpdGVtLm1hcChfLnRyaW0pLmZpbHRlcihCb29sZWFuKSkge1xuICAgICAgY29uc3QgZnFBY3Rpdml0eU5hbWUgPSBhY3Rpdml0eU5hbWVTdHIuc3BsaXQoL1xccysvKVsxXTtcbiAgICAgIGlmICghbWF0Y2hDb21wb25lbnROYW1lKGZxQWN0aXZpdHlOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gW2ZxQWN0aXZpdHlOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGZxQWN0aXZpdHlOYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgY29tcG9uZW50IG5hbWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgVGhlIHN0cmluZyB0byB2ZXJpZnlcbiAqIEByZXR1cm4gez9BcnJheTxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmRcbiAqL1xuZnVuY3Rpb24gbWF0Y2hDb21wb25lbnROYW1lIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiAvXlthLXowLTkuL19dKyQvaS5leGVjKGNsYXNzU3RyaW5nKTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCwgdW56aXBGaWxlLFxuICBnZXRJTUVMaXN0RnJvbU91dHB1dCwgZ2V0SmF2YUZvck9zLCBpc1Nob3dpbmdMb2Nrc2NyZWVuLCBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQsXG4gIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgaXNTY3JlZW5PbkZ1bGx5LCBidWlsZFN0YXJ0Q21kLCBnZXRKYXZhSG9tZSxcbiAgZ2V0U2RrVG9vbHNWZXJzaW9uLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0QnVpbGRUb29sc0RpcnMsXG4gIGdldEFwa2FuYWx5emVyRm9yT3MsIGdldE9wZW5Tc2xGb3JPcywgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsIEFQS1NfRVhURU5TSU9OLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBBUEtTX0lOU1RBTExfVElNRU9VVCwgYnVpbGRJbnN0YWxsQXJncywgQVBLX0VYVEVOU0lPTixcbiAgREVGQVVMVF9BREJfRVhFQ19USU1FT1VULCBwYXJzZU1hbmlmZXN0LCBwYXJzZUFhcHRTdHJpbmdzLCBwYXJzZUFhcHQyU3RyaW5ncyxcbiAgZm9ybWF0Q29uZmlnTWFya2VyLCBwYXJzZUpzb25EYXRhLCB1bnNpZ25BcGssIHRvQXZkTG9jYWxlQXJncywgcmVxdWlyZVNka1Jvb3QsXG4gIGdldFNka1Jvb3RGcm9tRW52LCBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMsIGVzY2FwZVNoZWxsQXJnLFxuICBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzLCBtYXRjaENvbXBvbmVudE5hbWUsIGdldE1vZHVsZVJvb3Rcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxjQUFjLEdBQUcsT0FBdkI7O0FBQ0EsTUFBTUMsYUFBYSxHQUFHLE1BQXRCOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLEtBQTVCOztBQUNBLE1BQU1DLG9CQUFvQixHQUFHRCxtQkFBbUIsR0FBRyxDQUFuRDs7QUFDQSxNQUFNRSx3QkFBd0IsR0FBRyxLQUFqQzs7QUFDQSxNQUFNQyxXQUFXLEdBQUcsNEJBQXBCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsa0NBQTFCO0FBQ0EsTUFBTUMsV0FBVyxHQUFHLFlBQXBCOztBQVFBLE1BQU1DLGFBQWEsR0FBR0MsZUFBQSxDQUFFQyxPQUFGLENBQVUs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
760
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBUEtTX0VYVEVOU0lPTiIsIkFQS19FWFRFTlNJT04iLCJBUEtfSU5TVEFMTF9USU1FT1VUIiwiQVBLU19JTlNUQUxMX1RJTUVPVVQiLCJERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQiLCJNQUlOX0FDVElPTiIsIkxBVU5DSEVSX0NBVEVHT1JZIiwiTU9EVUxFX05BTUUiLCJnZXRNb2R1bGVSb290IiwiXyIsIm1lbW9pemUiLCJyb290Iiwibm9kZSIsImdldE1vZHVsZVJvb3RTeW5jIiwiX19maWxlbmFtZSIsIkVycm9yIiwiZ2V0U2RrUm9vdEZyb21FbnYiLCJwcm9jZXNzIiwiZW52IiwiQU5EUk9JRF9IT01FIiwiQU5EUk9JRF9TREtfUk9PVCIsInJlcXVpcmVTZGtSb290IiwiY3VzdG9tUm9vdCIsInNka1Jvb3QiLCJkb2NNc2ciLCJpc0VtcHR5IiwiZnMiLCJleGlzdHMiLCJzdGF0cyIsInN0YXQiLCJpc0RpcmVjdG9yeSIsImdldEFuZHJvaWRQbGF0Zm9ybUFuZFBhdGgiLCJwcm9wc1BhdGhzIiwiZ2xvYiIsImN3ZCIsInBhdGgiLCJyZXNvbHZlIiwiYWJzb2x1dGUiLCJwbGF0Zm9ybXNNYXBwaW5nIiwicHJvcHNQYXRoIiwicHJvcHNDb250ZW50IiwicmVhZEZpbGUiLCJwbGF0Zm9ybVBhdGgiLCJkaXJuYW1lIiwicGxhdGZvcm0iLCJiYXNlbmFtZSIsIm1hdGNoIiwiZXhlYyIsImxvZyIsIndhcm4iLCJwYXJzZUludCIsInJlY2VudFNka1ZlcnNpb24iLCJrZXlzIiwic29ydCIsInJldmVyc2UiLCJyZXN1bHQiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bnppcEZpbGUiLCJ6aXBQYXRoIiwiZHN0Um9vdCIsInppcCIsImFzc2VydFZhbGlkWmlwIiwiZXh0cmFjdEFsbFRvIiwidW5zaWduQXBrIiwiYXBrUGF0aCIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsIm1ldGFJbmZGb2xkZXJOYW1lIiwiaGFzTWV0YUluZiIsInJlYWRFbnRyaWVzIiwiZW50cnkiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJ0bXBaaXBSb290IiwicmltcmFmIiwidG1wUmVzdWx0UGF0aCIsInRvQXJjaGl2ZSIsInVubGluayIsIm12IiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJzdGRvdXQiLCJlbmdpbmVzIiwibGluZSIsInNwbGl0IiwibGVuZ3RoIiwicHVzaCIsInRyaW0iLCJyZXBsYWNlIiwiZ2V0SmF2YUhvbWUiLCJKQVZBX0hPTUUiLCJnZXRKYXZhRm9yT3MiLCJqYXZhSG9tZSIsImVyck1zZyIsImVyciIsIm1lc3NhZ2UiLCJleGVjdXRhYmxlTmFtZSIsInN5c3RlbSIsImlzV2luZG93cyIsInJlc3VsdFBhdGgiLCJ3aGljaCIsImlnbiIsImdldE9wZW5Tc2xGb3JPcyIsImJpbmFyeU5hbWUiLCJnZXRBcGtzaWduZXJGb3JPcyIsInN5c0hlbHBlcnMiLCJnZXRCaW5hcnlGcm9tU2RrUm9vdCIsImdldEFwa2FuYWx5emVyRm9yT3MiLCJpc1Nob3dpbmdMb2Nrc2NyZWVuIiwiZHVtcHN5cyIsInNvbWUiLCJ4IiwiaW5jbHVkZXMiLCJldmVyeSIsInRlc3QiLCJpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQiLCJtIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwiaXNTY3JlZW5PbkZ1bGx5IiwiYnVpbGRTdGFydENtZCIsInN0YXJ0QXBwT3B0aW9ucyIsImFwaUxldmVsIiwidXNlciIsIndhaXRGb3JMYXVuY2giLCJwa2ciLCJhY3Rpdml0eSIsImFjdGlvbiIsImNhdGVnb3J5Iiwic3RvcEFwcCIsImZsYWdzIiwiY21kIiwidXRpbCIsImhhc1ZhbHVlIiwib3B0aW9uYWxJbnRlbnRBcmd1bWVudHMiLCJwYXJzZUtleVZhbHVlIiwic3RyIiwic3BhY2UiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwicmUiLCJhcmdzIiwiYXBwbHkiLCJmbGFnIiwiZmxhZ1BvcyIsInByZXZBcmdzIiwiZ2V0U2RrVG9vbHNWZXJzaW9uIiwiYW5kcm9pZEhvbWUiLCJwcm9wZXJ0aWVzUGF0aCIsInByb3BlcnRpZXNDb250ZW50IiwidmVyc2lvbk1hdGNoZXIiLCJSZWdFeHAiLCJtYWpvciIsIm1pbm9yIiwiYnVpbGQiLCJnZXRCdWlsZFRvb2xzRGlycyIsImJ1aWxkVG9vbHNEaXJzIiwibWFwIiwiZGlyIiwiYSIsImIiLCJzZW12ZXIiLCJyY29tcGFyZSIsInBhaXIiLCJwYWlycyIsIkIiLCJtdGltZSIsInZhbHVlT2YiLCJpbmZvIiwiZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMiLCJkdW1wc3lzT3V0cHV0IiwiZ3JvdXBOYW1lcyIsImdyYW50ZWRTdGF0ZSIsImdyb3VwUGF0dGVybkJ5TmFtZSIsImdyb3VwTmFtZSIsImVzY2FwZVJlZ0V4cCIsImluZGVudFBhdHRlcm4iLCJwZXJtaXNzaW9uTmFtZVBhdHRlcm4iLCJncmFudGVkU3RhdGVQYXR0ZXJuIiwiZ3JvdXBNYXRjaCIsImxpbmVzIiwidGl0bGVJbmRlbnQiLCJzZWFyY2giLCJzbGljZSIsImN1cnJlbnRJbmRlbnQiLCJwZXJtaXNzaW9uTmFtZU1hdGNoIiwiaXRlbSIsInBlcm1pc3Npb24iLCJncmFudGVkU3RhdGVNYXRjaCIsImdyYW50ZWQiLCJmaWx0ZXJlZFJlc3VsdCIsImZpbHRlciIsImlzQm9vbGVhbiIsInBsdXJhbGl6ZSIsImJ1aWxkSW5zdGFsbEFyZ3MiLCJvcHRpb25zIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJ1c2VTZGNhcmQiLCJncmFudFBlcm1pc3Npb25zIiwicGFydGlhbEluc3RhbGwiLCJwYXJzZU1hbmlmZXN0IiwibWFuaWZlc3QiLCJwYWNrYWdlIiwidmVyc2lvbkNvZGUiLCJ2ZXJzaW9uTmFtZSIsImFwcGxpY2F0aW9uIiwiYWN0aXZpdGllcyIsImFjdGl2aXR5QWxpYXNlcyIsImVuYWJsZWQiLCJpbnRlbnRGaWx0ZXJzIiwiYWN0aW9ucyIsImNhdGVnb3JpZXMiLCJpc01haW5BY3Rpb24iLCJuYW1lIiwiaXNMYXVuY2hlckNhdGVnb3J5IiwicGFyc2VBYXB0U3RyaW5ncyIsInJhd091dHB1dCIsImNvbmZpZ01hcmtlciIsIm5vcm1hbGl6ZVN0cmluZ01hdGNoIiwicyIsImFwa1N0cmluZ3MiLCJpc0luQ29uZmlnIiwiY3VycmVudFJlc291cmNlSWQiLCJpc0luUGx1cmFsR3JvdXAiLCJxdW90ZWRTdHJpbmdQYXR0ZXJuIiwib3MiLCJFT0wiLCJ0cmltbWVkTGluZSIsInBhcnNlQWFwdDJTdHJpbmdzIiwiYWxsTGluZXMiLCJleHRyYWN0Q29udGVudCIsInN0YXJ0SWR4IiwiaWR4Iiwic3RhcnRDaGFyUG9zIiwidGVybWluYXRpb25DaGFyTWF0Y2giLCJ0ZXJtaW5hdGlvbkNoYXJQb3MiLCJpbmRleCIsInRyaW1TdGFydCIsImlzSW5DdXJyZW50Q29uZmlnIiwibGluZUluZGV4IiwiY29udGVudCIsImlzU3RyaW5nIiwiZm9ybWF0Q29uZmlnTWFya2VyIiwiY29uZmlnc0dldHRlciIsImRlc2lyZWRNYXJrZXIiLCJkZWZhdWx0TWFya2VyIiwiY29uZmlncyIsInRvTG93ZXJDYXNlIiwicGFyc2VKc29uRGF0YSIsIm91dHB1dCIsImVudGl0eU5hbWUiLCJqc29uU3RyIiwicGFyc2UiLCJlIiwidG9BdmRMb2NhbGVBcmdzIiwibGFuZ3VhZ2UiLCJjb3VudHJ5IiwidG9VcHBlckNhc2UiLCJsb2NhbGUiLCJnZXRBbmRyb2lkUHJlZnNSb290IiwibG9jYXRpb24iLCJBTkRST0lEX0VNVUxBVE9SX0hPTUUiLCJkaXJFeGlzdHMiLCJob21lIiwiSE9NRSIsIlVTRVJQUk9GSUxFIiwiZXNjYXBlU2hlbGxBcmciLCJhcmciLCJwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIiwibWFpbkFjdGl2aXR5TmFtZVJlIiwiY2F0ZWdvcnlOYW1lUmUiLCJibG9ja3MiLCJibG9ja1N0YXJ0SW5kZW50IiwiYmxvY2siLCJ0cmltRW5kIiwiaXNOaWwiLCJoYXNDYXRlZ29yeSIsImFjdGl2aXR5TmFtZVN0ciIsIkJvb2xlYW4iLCJmcUFjdGl2aXR5TmFtZSIsIm1hdGNoQ29tcG9uZW50TmFtZSIsImNsYXNzU3RyaW5nIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2hlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCB6aXAsIHV0aWwsIHRlbXBEaXIsIG5vZGUgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcblxuY29uc3QgQVBLU19FWFRFTlNJT04gPSAnLmFwa3MnO1xuY29uc3QgQVBLX0VYVEVOU0lPTiA9ICcuYXBrJztcbmNvbnN0IEFQS19JTlNUQUxMX1RJTUVPVVQgPSA2MDAwMDtcbmNvbnN0IEFQS1NfSU5TVEFMTF9USU1FT1VUID0gQVBLX0lOU1RBTExfVElNRU9VVCAqIDI7XG5jb25zdCBERUZBVUxUX0FEQl9FWEVDX1RJTUVPVVQgPSAyMDAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBNQUlOX0FDVElPTiA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTic7XG5jb25zdCBMQVVOQ0hFUl9DQVRFR09SWSA9ICdhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUic7XG5jb25zdCBNT0RVTEVfTkFNRSA9ICdhcHBpdW0tYWRiJztcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBjb25zdCByb290ID0gbm9kZS5nZXRNb2R1bGVSb290U3luYyhNT0RVTEVfTkFNRSwgX19maWxlbmFtZSk7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSAke01PRFVMRV9OQU1FfSBOb2RlLmpzIG1vZHVsZWApO1xuICB9XG4gIHJldHVybiByb290O1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhY3R1YWwgcGF0aCB0byBTREsgcm9vdCBmb2xkZXIgZnJvbSB0aGUgc3lzdGVtIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgU0RLIHJvb3QgZm9sZGVyXG4gKi9cbmZ1bmN0aW9uIGdldFNka1Jvb3RGcm9tRW52ICgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkFORFJPSURfSE9NRSB8fCBwcm9jZXNzLmVudi5BTkRST0lEX1NES19ST09UO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYWN0dWFsIHBhdGggdG8gU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBTREsgcm9vdCBmb2xkZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBlaXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgZW52IHZhcmlhYmxlIGlzIHVuc2V0IG9yIGlzXG4gKiBwb2ludGluZyB0byBhbiBpbnZhbGlkIGZpbGUgc3lzdGVtIGVudHJ5XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVTZGtSb290IChjdXN0b21Sb290ID0gbnVsbCkge1xuICBjb25zdCBzZGtSb290ID0gY3VzdG9tUm9vdCB8fCBnZXRTZGtSb290RnJvbUVudigpO1xuICBjb25zdCBkb2NNc2cgPSAnUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zdHVkaW8vY29tbWFuZC1saW5lL3ZhcmlhYmxlcyBmb3IgbW9yZSBkZXRhaWxzJztcbiAgaWYgKF8uaXNFbXB0eShzZGtSb290KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIGV4cG9ydGVkLiAke2RvY01zZ31gKTtcbiAgfVxuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHNka1Jvb3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgQW5kcm9pZCBTREsgcm9vdCBmb2xkZXIgJyR7c2RrUm9vdH0nIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4gJHtkb2NNc2d9YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNka1Jvb3QpO1xuICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBbmRyb2lkIFNESyByb290ICcke3Nka1Jvb3R9JyBtdXN0IGJlIGEgZm9sZGVyLiAke2RvY01zZ31gKTtcbiAgfVxuICByZXR1cm4gc2RrUm9vdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQbGF0Zm9ybUluZm9cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGxhdGZvcm0gLSBUaGUgcGxhdGZvcm0gbmFtZSwgZm9yIGV4YW1wbGUgYGFuZHJvaWQtMjRgXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwbGF0Zm9ybVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIHBsYXRmb3JtIFNESyBmb2xkZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBhdGggdG8gdGhlIHJlY2VudCBpbnN0YWxsZWQgQW5kcm9pZCBwbGF0Zm9ybS5cbiAqXG4gKiBAcmV0dXJuIHtQbGF0Zm9ybUluZm99IFRoZSByZXN1bHRpbmcgcGF0aCB0byB0aGUgbmV3ZXN0IGluc3RhbGxlZCBwbGF0Zm9ybS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCAoc2RrUm9vdCkge1xuICBjb25zdCBwcm9wc1BhdGhzID0gYXdhaXQgZnMuZ2xvYignKi9idWlsZC5wcm9wJywge1xuICAgIGN3ZDogcGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIGNvbnN0IHBsYXRmb3Jtc01hcHBpbmcgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wc1BhdGggb2YgcHJvcHNQYXRocykge1xuICAgIGNvbnN0IHByb3BzQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BzUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGxhdGZvcm1QYXRoID0gcGF0aC5kaXJuYW1lKHByb3BzUGF0aCk7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBwYXRoLmJhc2VuYW1lKHBsYXRmb3JtUGF0aCk7XG4gICAgY29uc3QgbWF0Y2ggPSAvcm9cXC5idWlsZFxcLnZlcnNpb25cXC5zZGs9KFxcZCspLy5leGVjKHByb3BzQ29udGVudCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nLndhcm4oYENhbm5vdCByZWFkIHRoZSBTREsgdmVyc2lvbiBmcm9tICcke3Byb3BzUGF0aH0nLiBTa2lwcGluZyAnJHtwbGF0Zm9ybX0nYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcGxhdGZvcm1zTWFwcGluZ1twYXJzZUludChtYXRjaFsxXSwgMTApXSA9IHtcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgcGxhdGZvcm1QYXRoLFxuICAgIH07XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShwbGF0Zm9ybXNNYXBwaW5nKSkge1xuICAgIGxvZy53YXJuKGBGb3VuZCB6ZXJvIHBsYXRmb3JtIGZvbGRlcnMgYXQgJyR7cGF0aC5yZXNvbHZlKHNka1Jvb3QsICdwbGF0Zm9ybXMnKX0nLiBgICtcbiAgICAgIGBEbyB5b3UgaGF2ZSBhbnkgQW5kcm9pZCBTREtzIGluc3RhbGxlZD9gKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGxhdGZvcm06IG51bGwsXG4gICAgICBwbGF0Zm9ybVBhdGg6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY2VudFNka1ZlcnNpb24gPSBfLmtleXMocGxhdGZvcm1zTWFwcGluZykuc29ydCgpLnJldmVyc2UoKVswXTtcbiAgY29uc3QgcmVzdWx0ID0gcGxhdGZvcm1zTWFwcGluZ1tyZWNlbnRTZGtWZXJzaW9uXTtcbiAgbG9nLmRlYnVnKGBGb3VuZCB0aGUgbW9zdCByZWNlbnQgQW5kcm9pZCBwbGF0Zm9ybTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1bnppcEZpbGUgKHppcFBhdGgsIGRzdFJvb3QgPSBwYXRoLmRpcm5hbWUoemlwUGF0aCkpIHtcbiAgbG9nLmRlYnVnKGBVbnppcHBpbmcgJyR7emlwUGF0aH0nIHRvICcke2RzdFJvb3R9J2ApO1xuICBhd2FpdCB6aXAuYXNzZXJ0VmFsaWRaaXAoemlwUGF0aCk7XG4gIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oemlwUGF0aCwgZHN0Um9vdCk7XG4gIGxvZy5kZWJ1ZygnVW56aXAgc3VjY2Vzc2Z1bCcpO1xufVxuXG4vKipcbiAqIFVuc2lnbnMgdGhlIGdpdmVuIGFwayBieSByZW1vdmluZyB0aGVcbiAqIE1FVEEtSU5GIGZvbGRlciByZWN1cnNpdmVseSBmcm9tIHRoZSBhcmNoaXZlLlxuICogISEhIFRoZSBmdW5jdGlvbiBvdmVyd3JpdGVzIHRoZSBnaXZlbiBhcGsgYWZ0ZXIgc3VjY2Vzc2Z1bCB1bnNpZ25pbmcgISEhXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwa1BhdGggVGhlIHBhdGggdG8gdGhlIGFwa1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgYXBrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseVxuICogdW5zaWduZWQgYW5kIG92ZXJ3cml0dGVuXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgdW5zaWduIG9wZXJhdGlvblxuICovXG5hc3luYyBmdW5jdGlvbiB1bnNpZ25BcGsgKGFwa1BhdGgpIHtcbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICBjb25zdCBtZXRhSW5mRm9sZGVyTmFtZSA9ICdNRVRBLUlORic7XG4gIHRyeSB7XG4gICAgbGV0IGhhc01ldGFJbmYgPSBmYWxzZTtcbiAgICBhd2FpdCB6aXAucmVhZEVudHJpZXMoYXBrUGF0aCwgKHtlbnRyeX0pID0+IHtcbiAgICAgIGhhc01ldGFJbmYgPSBlbnRyeS5maWxlTmFtZS5zdGFydHNXaXRoKGAke21ldGFJbmZGb2xkZXJOYW1lfS9gKTtcbiAgICAgIC8vIGVudHJpZXMgaXRlcmF0aW9uIHN0b3BzIGFmdGVyIGBmYWxzZWAgaXMgcmV0dXJuZWRcbiAgICAgIHJldHVybiAhaGFzTWV0YUluZjtcbiAgICB9KTtcbiAgICBpZiAoIWhhc01ldGFJbmYpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdG1wWmlwUm9vdCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCAnYXBrJyk7XG4gICAgYXdhaXQgemlwLmV4dHJhY3RBbGxUbyhhcGtQYXRoLCB0bXBaaXBSb290KTtcbiAgICBhd2FpdCBmcy5yaW1yYWYocGF0aC5yZXNvbHZlKHRtcFppcFJvb3QsIG1ldGFJbmZGb2xkZXJOYW1lKSk7XG4gICAgY29uc3QgdG1wUmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZSh0bXBSb290LCBwYXRoLmJhc2VuYW1lKGFwa1BhdGgpKTtcbiAgICBhd2FpdCB6aXAudG9BcmNoaXZlKHRtcFJlc3VsdFBhdGgsIHtcbiAgICAgIGN3ZDogdG1wWmlwUm9vdCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy51bmxpbmsoYXBrUGF0aCk7XG4gICAgYXdhaXQgZnMubXYodG1wUmVzdWx0UGF0aCwgYXBrUGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElNRUxpc3RGcm9tT3V0cHV0IChzdGRvdXQpIHtcbiAgbGV0IGVuZ2luZXMgPSBbXTtcbiAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID4gMCAmJiBsaW5lWzBdICE9PSAnICcpIHtcbiAgICAgIC8vIHJlbW92ZSBuZXdsaW5lIGFuZCB0cmFpbGluZyBjb2xvbiwgYW5kIGFkZCB0byB0aGUgbGlzdFxuICAgICAgZW5naW5lcy5wdXNoKGxpbmUudHJpbSgpLnJlcGxhY2UoLzokLywgJycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVuZ2luZXM7XG59XG5cbmNvbnN0IGdldEphdmFIb21lID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldEphdmFIb21lICgpIHtcbiAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzcy5lbnYuSkFWQV9IT01FO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0IGZvciB0aGUgY3VycmVudCBwcm9jZXNzJyk7XG4gIH1cbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocmVzdWx0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGV4aXN0YCk7XG4gIH1cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHJlc3VsdCk7XG4gIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEpBVkFfSE9NRSBsb2NhdGlvbiAnJHtyZXN1bHR9JyBtdXN0IGJlIGEgdmFsaWQgZm9sZGVyYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuXG5jb25zdCBnZXRKYXZhRm9yT3MgPSBfLm1lbW9pemUoYXN5bmMgZnVuY3Rpb24gZ2V0SmF2YUZvck9zICgpIHtcbiAgbGV0IGphdmFIb21lO1xuICBsZXQgZXJyTXNnO1xuICB0cnkge1xuICAgIGphdmFIb21lID0gYXdhaXQgZ2V0SmF2YUhvbWUoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyTXNnID0gZXJyLm1lc3NhZ2U7XG4gIH1cbiAgY29uc3QgZXhlY3V0YWJsZU5hbWUgPSBgamF2YSR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgaWYgKGphdmFIb21lKSB7XG4gICAgY29uc3QgcmVzdWx0UGF0aCA9IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicsIGV4ZWN1dGFibGVOYW1lKTtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKHJlc3VsdFBhdGgpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0UGF0aDtcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goZXhlY3V0YWJsZU5hbWUpO1xuICB9IGNhdGNoIChpZ24pIHt9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlICcke2V4ZWN1dGFibGVOYW1lfScgYmluYXJ5IGNvdWxkIG5vdCBiZSBmb3VuZCBgICtcbiAgICBgbmVpdGhlciBpbiBQQVRIIG5vciB1bmRlciBKQVZBX0hPTUUgKCR7ZXJyTXNnIHx8IHBhdGgucmVzb2x2ZShqYXZhSG9tZSwgJ2JpbicpfSlgKTtcbn0pO1xuXG5jb25zdCBnZXRPcGVuU3NsRm9yT3MgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGJpbmFyeU5hbWUgPSBgb3BlbnNzbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9wZW5zc2wgdG9vbCBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgb24gdGhlIHBhdGgnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2xcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3lzSGVscGVycyAtIEFuIGluc3RhbmNlIGNvbnRhaW5pbmcgc3lzdGVtQ2FsbE1ldGhvZHMgaGVscGVyIG1ldGhvZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggdG8gYXBrc2lnbmVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGtzaWduZXJGb3JPcyAoc3lzSGVscGVycykge1xuICByZXR1cm4gYXdhaXQgc3lzSGVscGVycy5nZXRCaW5hcnlGcm9tU2RrUm9vdCgnYXBrc2lnbmVyLmphcicpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCB0byBhcGthbmFseXplciB0b29sLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc3R1ZGlvL2NvbW1hbmQtbGluZS9hcGthbmFseXplci5odG1sXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHN5c0hlbHBlcnMgLSBBbiBpbnN0YW5jZSBjb250YWluaW5nIHN5c3RlbUNhbGxNZXRob2RzIGhlbHBlciBtZXRob2RzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBBbiBhYnNvbHV0ZSBwYXRoIHRvIGFwa2FuYWx5emVyIHRvb2wuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRvb2wgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBcGthbmFseXplckZvck9zIChzeXNIZWxwZXJzKSB7XG4gIHJldHVybiBhd2FpdCBzeXNIZWxwZXJzLmdldEJpbmFyeUZyb21TZGtSb290KCdhcGthbmFseXplcicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBtU2hvd2luZ0xvY2tzY3JlZW4gb3IgbURyZWFtaW5nTG9ja3NjcmVlbiBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmVcbiAqIGlmIGxvY2sgc2NyZWVuIGlzIHNob3dpbmdcbiAqXG4gKiBBIG5vdGU6IGBhZGIgc2hlbGwgZHVtcHN5cyB0cnVzdGAgcGVyZm9ybXMgYmV0dGVyIHdoaWxlIGRldGVjdGluZyB0aGUgbG9ja2VkIHNjcmVlbiBzdGF0ZVxuICogaW4gY29tcGFyaXNvbiB0byBgYWRiIGR1bXBzeXMgd2luZG93YCBvdXRwdXQgcGFyc2luZy5cbiAqIEJ1dCB0aGUgdHJ1c3QgY29tbWFuZCBkb2VzIG5vdCB3b3JrIGZvciBgU3dpcGVgIHVubG9jayBwYXR0ZXJuLlxuICpcbiAqIEluIHNvbWUgQW5kcm9pZCBkZXZpY2VzIChQcm9iYWJseSBhcm91bmQgQW5kcm9pZCAxMCspLCBgbVNob3dpbmdMb2Nrc2NyZWVuYCBhbmQgYG1EcmVhbWluZ0xvY2tzY3JlZW5gXG4gKiBkbyBub3Qgd29yayB0byBkZXRlY3QgbG9jayBzdGF0dXMuIEluc3RlYWQsIGtleWd1YXJkIHByZWZlcmVuY2VzIGhlbHBzIHRvIGRldGVjdCB0aGUgbG9jayBjb25kaXRpb24uXG4gKiBTb21lIGRldmljZXMgc3VjaCBhcyBBbmRyb2lkIFRWIGRvIG5vdCBoYXZlIGtleWd1YXJkLCBzbyB3ZSBzaG91bGQga2VlcFxuICogc2NyZWVuIGNvbmRpdGlvbiBhcyB0aGlzIHByaW1hcnkgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzIC0gVGhlIG91dHB1dCBvZiBkdW1wc3lzIHdpbmRvdyBjb21tYW5kLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBsb2NrIHNjcmVlbiBpcyBzaG93aW5nLlxuICovXG5mdW5jdGlvbiBpc1Nob3dpbmdMb2Nrc2NyZWVuIChkdW1wc3lzKSB7XG4gIHJldHVybiBfLnNvbWUoWydtU2hvd2luZ0xvY2tzY3JlZW49dHJ1ZScsICdtRHJlYW1pbmdMb2Nrc2NyZWVuPXRydWUnXSwgKHgpID0+IGR1bXBzeXMuaW5jbHVkZXMoeCkpXG4gICAgLy8gYG1Jc1Nob3dpbmdgIGFuZCBgbUlucHV0UmVzdHJpY3RlZGAgYXJlIGB0cnVlYCBpbiBsb2NrIGNvbmRpdGlvbi4gYGZhbHNlYCBpcyB1bmxvY2sgY29uZGl0aW9uLlxuICAgIHx8IF8uZXZlcnkoWy9LZXlndWFyZFN0YXRlTW9uaXRvcltcXG5cXHNdK21Jc1Nob3dpbmc9dHJ1ZS8sIC9cXHMrbUlucHV0UmVzdHJpY3RlZD10cnVlL10sICh4KSA9PiB4LnRlc3QoZHVtcHN5cykpO1xufVxuXG4vKlxuICogQ2hlY2tzIG1DdXJyZW50Rm9jdXMgaW4gZHVtcHN5cyBvdXRwdXQgdG8gZGV0ZXJtaW5lIGlmIEtleWd1YXJkIGlzIGFjdGl2YXRlZFxuICovXG5mdW5jdGlvbiBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbUN1cnJlbnRGb2N1cy4rS2V5Z3VhcmQvZ2kuZXhlYyhkdW1wc3lzKTtcbiAgcmV0dXJuIChtICYmIG0ubGVuZ3RoICYmIG1bMF0pID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG4vKlxuICogUmVhZHMgU3VyZmFjZU9yaWVudGF0aW9uIGluIGR1bXBzeXMgb3V0cHV0XG4gKi9cbmZ1bmN0aW9uIGdldFN1cmZhY2VPcmllbnRhdGlvbiAoZHVtcHN5cykge1xuICBsZXQgbSA9IC9TdXJmYWNlT3JpZW50YXRpb246IFxcZC9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gbSAmJiBwYXJzZUludChtWzBdLnNwbGl0KCc6JylbMV0sIDEwKTtcbn1cblxuLypcbiAqIENoZWNrcyBtU2NyZWVuT25GdWxseSBpbiBkdW1wc3lzIG91dHB1dCB0byBkZXRlcm1pbmUgaWYgc2NyZWVuIGlzIHNob3dpbmdcbiAqIERlZmF1bHQgaXMgdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1NjcmVlbk9uRnVsbHkgKGR1bXBzeXMpIHtcbiAgbGV0IG0gPSAvbVNjcmVlbk9uRnVsbHk9XFx3Ky9naS5leGVjKGR1bXBzeXMpO1xuICByZXR1cm4gIW0gfHwgLy8gaWYgaW5mb3JtYXRpb24gaXMgbWlzc2luZyB3ZSBhc3N1bWUgc2NyZWVuIGlzIGZ1bGx5IG9uXG4gICAgICAgICAobSAmJiBtLmxlbmd0aCA+IDAgJiYgbVswXS5zcGxpdCgnPScpWzFdID09PSAndHJ1ZScpIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBjb21tYW5kIGxpbmUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlblxuICogYXBwbGljYXRpb24gc3RhcnR1cCBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtTdGFydEFwcE9wdGlvbnN9IHN0YXJ0QXBwT3B0aW9ucyAtIEFwcGxpY2F0aW9uIG9wdGlvbnMgbWFwcGluZ1xuICogQHBhcmFtIHtudW1iZXJ9IGFwaUxldmVsIC0gVGhlIGFjdHVhbCBPUyBBUEkgbGV2ZWxcbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYWN0dWFsIGNvbW1hbmQgbGluZSBhcnJheVxuICovXG5mdW5jdGlvbiBidWlsZFN0YXJ0Q21kIChzdGFydEFwcE9wdGlvbnMsIGFwaUxldmVsKSB7XG4gIGNvbnN0IHtcbiAgICB1c2VyLFxuICAgIHdhaXRGb3JMYXVuY2gsXG4gICAgcGtnLFxuICAgIGFjdGl2aXR5LFxuICAgIGFjdGlvbixcbiAgICBjYXRlZ29yeSxcbiAgICBzdG9wQXBwLFxuICAgIGZsYWdzLFxuICB9ID0gc3RhcnRBcHBPcHRpb25zO1xuICBjb25zdCBjbWQgPSBbJ2FtJywgJ3N0YXJ0J107XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHVzZXIpKSB7XG4gICAgY21kLnB1c2goJy0tdXNlcicsIHVzZXIpO1xuICB9XG4gIGlmICh3YWl0Rm9yTGF1bmNoKSB7XG4gICAgY21kLnB1c2goJy1XJyk7XG4gIH1cbiAgaWYgKGFjdGl2aXR5ICYmIHBrZykge1xuICAgIGNtZC5wdXNoKCctbicsIGAke3BrZ30vJHthY3Rpdml0eX1gKTtcbiAgfVxuICBpZiAoc3RvcEFwcCAmJiBhcGlMZXZlbCA+PSAxNSkge1xuICAgIGNtZC5wdXNoKCctUycpO1xuICB9XG4gIGlmIChhY3Rpb24pIHtcbiAgICBjbWQucHVzaCgnLWEnLCBhY3Rpb24pO1xuICB9XG4gIGlmIChjYXRlZ29yeSkge1xuICAgIGNtZC5wdXNoKCctYycsIGNhdGVnb3J5KTtcbiAgfVxuICBpZiAoZmxhZ3MpIHtcbiAgICBjbWQucHVzaCgnLWYnLCBmbGFncyk7XG4gIH1cbiAgaWYgKHN0YXJ0QXBwT3B0aW9ucy5vcHRpb25hbEludGVudEFyZ3VtZW50cykge1xuICAgIC8vIGV4cGVjdCBvcHRpb25hbEludGVudEFyZ3VtZW50cyB0byBiZSBhIHNpbmdsZSBzdHJpbmcgb2YgdGhlIGZvcm06XG4gICAgLy8gICAgIFwiLWZsYWcga2V5XCJcbiAgICAvLyAgICAgXCItZmxhZyBrZXkgdmFsdWVcIlxuICAgIC8vIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgKGUuZy4sIFwiLWZsYWcxIGtleTEgLWZsYWcyIGtleTIgdmFsdWUyXCIpXG5cbiAgICAvLyB0YWtlIGEgc3RyaW5nIGFuZCBwYXJzZSBvdXQgdGhlIHBhcnQgYmVmb3JlIGFueSBzcGFjZXMsIGFuZCBhbnl0aGluZyBhZnRlclxuICAgIC8vIHRoZSBmaXJzdCBzcGFjZVxuICAgIGxldCBwYXJzZUtleVZhbHVlID0gZnVuY3Rpb24gKHN0cikge1xuICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgIGxldCBzcGFjZSA9IHN0ci5pbmRleE9mKCcgJyk7XG4gICAgICBpZiAoc3BhY2UgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBzdHIubGVuZ3RoID8gW3N0cl0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbc3RyLnN1YnN0cmluZygwLCBzcGFjZSkudHJpbSgpLCBzdHIuc3Vic3RyaW5nKHNwYWNlICsgMSkudHJpbSgpXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY3ljbGUgdGhyb3VnaCB0aGUgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgYW5kIHB1bGwgb3V0IHRoZSBhcmd1bWVudHNcbiAgICAvLyBhZGQgYSBzcGFjZSBpbml0aWFsbHkgc28gZmxhZ3MgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBhcmd1bWVudHMgdGhhdFxuICAgIC8vIGhhdmUgaW50ZXJuYWwgaHlwaGVuc1xuICAgIGxldCBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGAgJHtzdGFydEFwcE9wdGlvbnMub3B0aW9uYWxJbnRlbnRBcmd1bWVudHN9YDtcbiAgICBsZXQgcmUgPSAvICgtW15cXHNdKykgKC4rKS87XG4gICAgd2hpbGUgKHRydWUpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgIGxldCBhcmdzID0gcmUuZXhlYyhvcHRpb25hbEludGVudEFyZ3VtZW50cyk7XG4gICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgZmxhZ3MsIHNvIHRoZSByZW1haW5kZXIgY2FuIGJlIHRyZWF0ZWQgYXMgJ2tleScgb3IgJ2tleSB2YWx1ZSdcbiAgICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUob3B0aW9uYWxJbnRlbnRBcmd1bWVudHMpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gdGFrZSB0aGUgZmxhZyBhbmQgc2VlIGlmIGl0IGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZ1xuICAgICAgLy8gaWYgaXQgaXMgbm90LCB0aGVuIGl0IG1lYW5zIHdlIGhhdmUgYmVlbiB0aHJvdWdoIGFscmVhZHksIGFuZFxuICAgICAgLy8gd2hhdCBpcyBiZWZvcmUgdGhlIGZsYWcgaXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgcHJldmlvdXMgZmxhZ1xuICAgICAgbGV0IGZsYWcgPSBhcmdzWzFdO1xuICAgICAgbGV0IGZsYWdQb3MgPSBvcHRpb25hbEludGVudEFyZ3VtZW50cy5pbmRleE9mKGZsYWcpO1xuICAgICAgaWYgKGZsYWdQb3MgIT09IDApIHtcbiAgICAgICAgbGV0IHByZXZBcmdzID0gb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMuc3Vic3RyaW5nKDAsIGZsYWdQb3MpO1xuICAgICAgICBjbWQucHVzaC5hcHBseShjbWQsIHBhcnNlS2V5VmFsdWUocHJldkFyZ3MpKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHRoZSBmbGFnLCBhcyB0aGVyZSBhcmUgbm8gbW9yZSBlYXJsaWVyIGFyZ3VtZW50c1xuICAgICAgY21kLnB1c2goZmxhZyk7XG5cbiAgICAgIC8vIG1ha2Ugb3B0aW9uYWxJbnRlbnRBcmd1bWVudHMgaG9sZCB0aGUgcmVtYWluZGVyXG4gICAgICBvcHRpb25hbEludGVudEFyZ3VtZW50cyA9IGFyZ3NbMl07XG4gICAgfVxuICB9XG4gIHJldHVybiBjbWQ7XG59XG5cbmNvbnN0IGdldFNka1Rvb2xzVmVyc2lvbiA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRTZGtUb29sc1ZlcnNpb24gKCkge1xuICBjb25zdCBhbmRyb2lkSG9tZSA9IHByb2Nlc3MuZW52LkFORFJPSURfSE9NRTtcbiAgaWYgKCFhbmRyb2lkSG9tZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQU5EUk9JRF9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGV4cGVjdGVkIHRvIGJlIHNldCcpO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKGFuZHJvaWRIb21lLCAndG9vbHMnLCAnc291cmNlLnByb3BlcnRpZXMnKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMocHJvcGVydGllc1BhdGgpKSB7XG4gICAgbG9nLndhcm4oYENhbm5vdCBmaW5kICR7cHJvcGVydGllc1BhdGh9IGZpbGUgdG8gcmVhZCBTREsgdmVyc2lvbiBmcm9tYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHByb3BlcnRpZXNDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvcGVydGllc1BhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHZlcnNpb25NYXRjaGVyID0gbmV3IFJlZ0V4cCgvUGtnXFwuUmV2aXNpb249KFxcZCspXFwuPyhcXGQrKT9cXC4/KFxcZCspPy8pO1xuICBjb25zdCBtYXRjaCA9IHZlcnNpb25NYXRjaGVyLmV4ZWMocHJvcGVydGllc0NvbnRlbnQpO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgICBtaW5vcjogbWF0Y2hbMl0gPyBwYXJzZUludChtYXRjaFsyXSwgMTApIDogMCxcbiAgICAgIGJ1aWxkOiBtYXRjaFszXSA/IHBhcnNlSW50KG1hdGNoWzNdLCAxMCkgOiAwXG4gICAgfTtcbiAgfVxuICBsb2cud2FybihgQ2Fubm90IHBhcnNlIFwiUGtnLlJldmlzaW9uXCIgdmFsdWUgZnJvbSAke3Byb3BlcnRpZXNQYXRofWApO1xufSk7XG5cbi8qKlxuICogUmV0cmlldmVzIGZ1bGwgcGF0aHMgdG8gYWxsICdidWlsZC10b29scycgc3ViZm9sZGVycyB1bmRlciB0aGUgcGFydGljdWxhclxuICogU0RLIHJvb3QgZm9sZGVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNka1Jvb3QgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIFNESyByb290IGZvbGRlclxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBmdWxsIHBhdGhzIHRvIHRoZSByZXN1bHRpbmcgZm9sZGVycyBzb3J0ZWQgYnlcbiAqIG1vZGlmaWNhdGlvbiBkYXRlICh0aGUgbmV3ZXN0IGNvbWVzIGZpcnN0KSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIG1hY3RoZXMgd2VyZSBmb3VuZFxuICovXG5jb25zdCBnZXRCdWlsZFRvb2xzRGlycyA9IF8ubWVtb2l6ZShhc3luYyBmdW5jdGlvbiBnZXRCdWlsZFRvb2xzRGlycyAoc2RrUm9vdCkge1xuICBsZXQgYnVpbGRUb29sc0RpcnMgPSBhd2FpdCBmcy5nbG9iKCcqLycsIHtcbiAgICBjd2Q6IHBhdGgucmVzb2x2ZShzZGtSb290LCAnYnVpbGQtdG9vbHMnKSxcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYnVpbGRUb29sc0RpcnMgPSBidWlsZFRvb2xzRGlyc1xuICAgICAgLm1hcCgoZGlyKSA9PiBbcGF0aC5iYXNlbmFtZShkaXIpLCBkaXJdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHNlbXZlci5yY29tcGFyZShhWzBdLCBiWzBdKSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHNvcnQgYnVpbGQtdG9vbHMgZm9sZGVycyAke0pTT04uc3RyaW5naWZ5KGJ1aWxkVG9vbHNEaXJzLm1hcCgoZGlyKSA9PiBwYXRoLmJhc2VuYW1lKGRpcikpKX0gYCArXG4gICAgICBgYnkgc2VtYW50aWMgdmVyc2lvbiBuYW1lcy5gKTtcbiAgICBsb2cud2FybihgRmFsbGluZyBiYWNrIHRvIHNvcnRpbmcgYnkgbW9kaWZpY2F0aW9uIGRhdGUuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIGNvbnN0IHBhaXJzID0gYXdhaXQgQi5tYXAoYnVpbGRUb29sc0RpcnMsIGFzeW5jIChkaXIpID0+IFsoYXdhaXQgZnMuc3RhdChkaXIpKS5tdGltZS52YWx1ZU9mKCksIGRpcl0pO1xuICAgIGJ1aWxkVG9vbHNEaXJzID0gcGFpcnNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSlcbiAgICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICB9XG4gIGxvZy5pbmZvKGBGb3VuZCAke2J1aWxkVG9vbHNEaXJzLmxlbmd0aH0gJ2J1aWxkLXRvb2xzJyBmb2xkZXJzIHVuZGVyICcke3Nka1Jvb3R9JyAobmV3ZXN0IGZpcnN0KTpgKTtcbiAgZm9yIChsZXQgZGlyIG9mIGJ1aWxkVG9vbHNEaXJzKSB7XG4gICAgbG9nLmluZm8oYCAgICAke2Rpcn1gKTtcbiAgfVxuICByZXR1cm4gYnVpbGRUb29sc0RpcnM7XG59KTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGVybWlzc2lvbiBuYW1lcyBlbmNvZGVkIGluIGBkdW1wc3lzIHBhY2thZ2VgIGNvbW1hbmQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdW1wc3lzT3V0cHV0IC0gVGhlIGFjdHVhbCBjb21tYW5kIG91dHB1dC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZ3JvdXBOYW1lcyAtIFRoZSBsaXN0IG9mIGdyb3VwIG5hbWVzIHRvIGxpc3QgcGVybWlzc2lvbnMgZm9yLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gZ3JhbnRlZFN0YXRlIC0gVGhlIGV4cGVjdGVkIHN0YXRlIG9mIGBncmFudGVkYCBhdHRyaWJ1dGUgdG8gZmlsdGVyIHdpdGguXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBmaWx0ZXJpbmcgaXMgZG9uZSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwZXJtaXNzaW9uIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QgaWYgbm8gbWF0Y2hlcyB3ZXJlIGZvdW5kLlxuICovXG5jb25zdCBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uIChkdW1wc3lzT3V0cHV0LCBncm91cE5hbWVzLCBncmFudGVkU3RhdGUgPSBudWxsKSB7XG4gIGNvbnN0IGdyb3VwUGF0dGVybkJ5TmFtZSA9IChncm91cE5hbWUpID0+IG5ldyBSZWdFeHAoYF4oXFxcXHMqJHtfLmVzY2FwZVJlZ0V4cChncm91cE5hbWUpfSBwZXJtaXNzaW9uczpbXFxcXHNcXFxcU10rKWAsICdtJyk7XG4gIGNvbnN0IGluZGVudFBhdHRlcm4gPSAvXFxTfCQvO1xuICBjb25zdCBwZXJtaXNzaW9uTmFtZVBhdHRlcm4gPSAvYW5kcm9pZFxcLlxcdypcXC4/cGVybWlzc2lvblxcLlxcdysvO1xuICBjb25zdCBncmFudGVkU3RhdGVQYXR0ZXJuID0gL1xcYmdyYW50ZWQ9KFxcdyspLztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgZ3JvdXBOYW1lIG9mIGdyb3VwTmFtZXMpIHtcbiAgICBjb25zdCBncm91cE1hdGNoID0gZ3JvdXBQYXR0ZXJuQnlOYW1lKGdyb3VwTmFtZSkuZXhlYyhkdW1wc3lzT3V0cHV0KTtcbiAgICBpZiAoIWdyb3VwTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gZ3JvdXBNYXRjaFsxXS5zcGxpdCgnXFxuJyk7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlSW5kZW50ID0gbGluZXNbMF0uc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcy5zbGljZSgxKSkge1xuICAgICAgY29uc3QgY3VycmVudEluZGVudCA9IGxpbmUuc2VhcmNoKGluZGVudFBhdHRlcm4pO1xuICAgICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gdGl0bGVJbmRlbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25OYW1lTWF0Y2ggPSBwZXJtaXNzaW9uTmFtZVBhdHRlcm4uZXhlYyhsaW5lKTtcbiAgICAgIGlmICghcGVybWlzc2lvbk5hbWVNYXRjaCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb25OYW1lTWF0Y2hbMF0sXG4gICAgICB9O1xuICAgICAgY29uc3QgZ3JhbnRlZFN0YXRlTWF0Y2ggPSBncmFudGVkU3RhdGVQYXR0ZXJuLmV4ZWMobGluZSk7XG4gICAgICBpZiAoZ3JhbnRlZFN0YXRlTWF0Y2gpIHtcbiAgICAgICAgaXRlbS5ncmFudGVkID0gZ3JhbnRlZFN0YXRlTWF0Y2hbMV0gPT09ICd0cnVlJztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkUmVzdWx0ID0gcmVzdWx0XG4gICAgLmZpbHRlcigoaXRlbSkgPT4gIV8uaXNCb29sZWFuKGdyYW50ZWRTdGF0ZSkgfHwgaXRlbS5ncmFudGVkID09PSBncmFudGVkU3RhdGUpXG4gICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5wZXJtaXNzaW9uKTtcbiAgbG9nLmRlYnVnKGBSZXRyaWV2ZWQgJHt1dGlsLnBsdXJhbGl6ZSgncGVybWlzc2lvbicsIGZpbHRlcmVkUmVzdWx0Lmxlbmd0aCwgdHJ1ZSl9IGAgK1xuICAgIGBmcm9tICR7Z3JvdXBOYW1lc30gJHt1dGlsLnBsdXJhbGl6ZSgnZ3JvdXAnLCBncm91cE5hbWVzLmxlbmd0aCwgZmFsc2UpfWApO1xuICByZXR1cm4gZmlsdGVyZWRSZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluc3RhbGxPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFsbG93VGVzdFBhY2thZ2VzIFtmYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBhbGxvdyB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcyBpbnN0YWxsYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVNkY2FyZCBbZmFsc2VdIC0gU2V0IHRvIHRydWUgdG8gaW5zdGFsbCB0aGUgYXBwIG9uIHNkY2FyZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGRldmljZSBtZW1vcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGdyYW50UGVybWlzc2lvbnMgW2ZhbHNlXSAtIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIGdyYW50IGFsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGluIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXIgQW5kcm9pZCA2Ky5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwbGFjZSBbdHJ1ZV0gLSBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvbid0IHdhbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gYmUgdXBncmFkZWQvcmVpbnN0YWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGRldmljZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcGFydGlhbEluc3RhbGwgW2ZhbHNlXSAtIEluc3RhbGwgYXBrcyBwYXJ0aWFsbHkuIEl0IGlzIHVzZWQgZm9yICdpbnN0YWxsLW11bHRpcGxlJy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9hbmRyb2lkLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMTEwNjQvd2hhdC1pcy1hLXBhcnRpYWwtYXBwbGljYXRpb24taW5zdGFsbC12aWEtYWRiXG4gKi9cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGdpdmVuIG9wdGlvbnMgaW50byB0aGUgbGlzdCBvZiBgYWRiIGluc3RhbGwuaW5zdGFsbC1tdWx0aXBsZWAgY29tbWFuZCBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gYXBpTGV2ZWwgLSBUaGUgY3VycmVudCBBUEkgbGV2ZWxcbiAqIEBwYXJhbSB7P0luc3RhbGxPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgbWFwcGluZyB0byB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkSW5zdGFsbEFyZ3MgKGFwaUxldmVsLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG9wdGlvbnMucmVwbGFjZSkgfHwgb3B0aW9ucy5yZXBsYWNlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1yJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuYWxsb3dUZXN0UGFja2FnZXMpIHtcbiAgICByZXN1bHQucHVzaCgnLXQnKTtcbiAgfVxuICBpZiAob3B0aW9ucy51c2VTZGNhcmQpIHtcbiAgICByZXN1bHQucHVzaCgnLXMnKTtcbiAgfVxuICBpZiAob3B0aW9ucy5ncmFudFBlcm1pc3Npb25zKSB7XG4gICAgaWYgKGFwaUxldmVsIDwgMjMpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgU2tpcHBpbmcgcGVybWlzc2lvbnMgZ3JhbnQgb3B0aW9uLCBzaW5jZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIGN1cnJlbnQgQVBJIGxldmVsICR7YXBpTGV2ZWx9IGRvZXMgbm90IHN1cHBvcnQgYXBwbGljYXRpb25zIGAgK1xuICAgICAgICAgICAgICAgIGBwZXJtaXNzaW9ucyBjdXN0b21pemF0aW9uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKCctZycpO1xuICAgIH1cbiAgfVxuICAvLyBGb3IgbXVsdGlwbGUtaW5zdGFsbFxuICBpZiAob3B0aW9ucy5wYXJ0aWFsSW5zdGFsbCkge1xuICAgIHJlc3VsdC5wdXNoKCctcCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYW5pZmVzdEluZm9cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwa2cgLSBUaGUgYXBwbGljYXRpb24gaWRlbnRpZmllclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gcGFja2FnZSBhY3Rpdml0eVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB2ZXJzaW9uQ29kZSAtIFRoZSB2ZXJzaW9uIGNvZGUgbnVtYmVyIChtaWdodCBiZSBgTmFOYClcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbk5hbWUgLSBUaGUgdmVyc2lvbiBuYW1lIChtaWdodCBiZSBgbnVsbGApXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtIHBhcnNpbmcgb2YgdGhlIG1hbmlmZXN0IG9iamVjdCBpbiBvcmRlclxuICogdG8gZXh0cmFjdCBzb21lIHZpdGFsIHZhbHVlcyBmcm9tIGl0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1hbmlmZXN0IFRoZSBtYW5pZmVzdCBjb250ZW50IGZvcm1hdHRlZCBhcyBKU09OXG4gKiBTZWUgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYWRia2l0LWFwa3JlYWRlciBmb3IgZGV0YWlsZWQgZm9ybWF0IGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyB7TWFuaWZlc3RJbmZvfVxuICovXG5mdW5jdGlvbiBwYXJzZU1hbmlmZXN0IChtYW5pZmVzdCkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgcGtnOiBtYW5pZmVzdC5wYWNrYWdlLFxuICAgIHZlcnNpb25Db2RlOiBwYXJzZUludChtYW5pZmVzdC52ZXJzaW9uQ29kZSwgMTApLFxuICAgIHZlcnNpb25OYW1lOiBtYW5pZmVzdC52ZXJzaW9uTmFtZSB8fCBudWxsLFxuICB9O1xuICBpZiAoIW1hbmlmZXN0LmFwcGxpY2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIExvb2sgZm9yIGVuYWJsZWQgYWN0aXZpdHkgb3IgYWN0aXZpdHktYWxpYXMgd2l0aFxuICAvLyBhY3Rpb24gPT0gYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4gYW5kXG4gIC8vIGNhdGVnb3J5ID09IGFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSXG4gIGZvciAoY29uc3QgYWN0aXZpdHkgb2YgW1xuICAgIC4uLm1hbmlmZXN0LmFwcGxpY2F0aW9uLmFjdGl2aXRpZXMsXG4gICAgLi4ubWFuaWZlc3QuYXBwbGljYXRpb24uYWN0aXZpdHlBbGlhc2VzLFxuICBdKSB7XG4gICAgaWYgKGFjdGl2aXR5LmVuYWJsZWQgPT09IGZhbHNlIHx8IF8uaXNFbXB0eShhY3Rpdml0eS5pbnRlbnRGaWx0ZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7YWN0aW9ucywgY2F0ZWdvcmllc30gb2YgYWN0aXZpdHkuaW50ZW50RmlsdGVycykge1xuICAgICAgaWYgKF8uaXNFbXB0eShhY3Rpb25zKSB8fCBfLmlzRW1wdHkoY2F0ZWdvcmllcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTWFpbkFjdGlvbiA9IGFjdGlvbnMuc29tZSgoe25hbWV9KSA9PiBuYW1lID09PSBNQUlOX0FDVElPTik7XG4gICAgICBjb25zdCBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLnNvbWUoKHtuYW1lfSkgPT4gbmFtZSA9PT0gTEFVTkNIRVJfQ0FURUdPUlkpO1xuICAgICAgaWYgKGlzTWFpbkFjdGlvbiAmJiBpc0xhdW5jaGVyQ2F0ZWdvcnkpIHtcbiAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gYWN0aXZpdHkubmFtZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYXBrIHN0cmluZ3MgZnJvbSBhYXB0IHRvb2wgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJhd091dHB1dCBUaGUgYWN0dWFsIHRvb2wgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnTWFya2VyIFRoZSBjb25maWcgbWFya2VyLiBVc3VhbGx5XG4gKiBhIGxhbmd1YWdlIGFiYnJldmlhdGlvbiBvciBgKGRlZmF1bHQpYFxuICogQHJldHVybnMge09iamVjdH0gU3RyaW5ncyBpZHMgdG8gdmFsdWVzIG1hcHBpbmcuIFBsdXJhbFxuICogdmFsdWVzIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMuIElmIG5vIGNvbmZpZyBmb3VuZCBmb3IgdGhlXG4gKiBnaXZlbiBtYXJrZXIgdGhlbiBhbiBlbXB0eSBtYXBwaW5nIGlzIHJldHVybmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUFhcHRTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBub3JtYWxpemVTdHJpbmdNYXRjaCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZSgvXCIkLywgJycpLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG4gIH07XG5cbiAgY29uc3QgYXBrU3RyaW5ncyA9IHt9O1xuICBsZXQgaXNJbkNvbmZpZyA9IGZhbHNlO1xuICBsZXQgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICBsZXQgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gIC8vIFRoZSBwYXR0ZXJuIG1hdGNoZXMgYW55IHF1b3RlZCBjb250ZW50IGluY2x1ZGluZyBlc2NhcGVkIHF1b3Rlc1xuICBjb25zdCBxdW90ZWRTdHJpbmdQYXR0ZXJuID0gL1wiW15cIlxcXFxdKig/OlxcXFwuW15cIlxcXFxdKikqXCIvO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgcmF3T3V0cHV0LnNwbGl0KG9zLkVPTCkpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmIChfLmlzRW1wdHkodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWydjb25maWcnLCAndHlwZScsICdzcGVjJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgaXNJbkNvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYGNvbmZpZyAke2NvbmZpZ01hcmtlcn06YCk7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkNvbmZpZykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoJ3Jlc291cmNlJykpIHtcbiAgICAgIGlzSW5QbHVyYWxHcm91cCA9IGZhbHNlO1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJzpzdHJpbmcvJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvOnN0cmluZ1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCc6cGx1cmFscy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC86cGx1cmFsc1xcLyhcXFMrKTovLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiB0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoc3RyaW5nJykpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gcXVvdGVkU3RyaW5nUGF0dGVybi5leGVjKHRyaW1tZWRMaW5lKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSA9IG5vcm1hbGl6ZVN0cmluZ01hdGNoKG1hdGNoWzBdKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRSZXNvdXJjZUlkID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50UmVzb3VyY2VJZCAmJiBpc0luUGx1cmFsR3JvdXAgJiYgdHJpbW1lZExpbmUuaW5jbHVkZXMoJzogKHN0cmluZycpKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IHF1b3RlZFN0cmluZ1BhdHRlcm4uZXhlYyh0cmltbWVkTGluZSk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgLi4uKGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdIHx8IFtdKSxcbiAgICAgICAgICBub3JtYWxpemVTdHJpbmdNYXRjaChtYXRjaFswXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFwa1N0cmluZ3M7XG59XG5cbi8qKlxuICogUGFyc2VzIGFwayBzdHJpbmdzIGZyb20gYWFwdDIgdG9vbCBvdXRwdXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmF3T3V0cHV0IFRoZSBhY3R1YWwgdG9vbCBvdXRwdXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb25maWdNYXJrZXIgVGhlIGNvbmZpZyBtYXJrZXIuIFVzdWFsbHlcbiAqIGEgbGFuZ3VhZ2UgYWJicmV2aWF0aW9uIG9yIGFuIGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgb25lXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTdHJpbmdzIGlkcyB0byB2YWx1ZXMgbWFwcGluZy4gUGx1cmFsXG4gKiB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFycmF5cy4gSWYgbm8gY29uZmlnIGZvdW5kIGZvciB0aGVcbiAqIGdpdmVuIG1hcmtlciB0aGVuIGFuIGVtcHR5IG1hcHBpbmcgaXMgcmV0dXJuZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQWFwdDJTdHJpbmdzIChyYXdPdXRwdXQsIGNvbmZpZ01hcmtlcikge1xuICBjb25zdCBhbGxMaW5lcyA9IHJhd091dHB1dC5zcGxpdChvcy5FT0wpO1xuICBmdW5jdGlvbiBleHRyYWN0Q29udGVudCAoc3RhcnRJZHgpIHtcbiAgICBsZXQgaWR4ID0gc3RhcnRJZHg7XG4gICAgY29uc3Qgc3RhcnRDaGFyUG9zID0gYWxsTGluZXNbc3RhcnRJZHhdLmluZGV4T2YoJ1wiJyk7XG4gICAgaWYgKHN0YXJ0Q2hhclBvcyA8IDApIHtcbiAgICAgIHJldHVybiBbbnVsbCwgaWR4XTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIHdoaWxlIChpZHggPCBhbGxMaW5lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmF0aW9uQ2hhck1hdGNoID0gL1wiJC8uZXhlYyhhbGxMaW5lc1tpZHhdKTtcbiAgICAgIGlmICh0ZXJtaW5hdGlvbkNoYXJNYXRjaCkge1xuICAgICAgICBjb25zdCB0ZXJtaW5hdGlvbkNoYXJQb3MgPSB0ZXJtaW5hdGlvbkNoYXJNYXRjaC5pbmRleDtcbiAgICAgICAgaWYgKHN0YXJ0SWR4ID09PSBpZHgpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSwgdGVybWluYXRpb25DaGFyUG9zKSxcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBgJHtyZXN1bHR9XFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0uc3Vic3RyaW5nKDAsIHRlcm1pbmF0aW9uQ2hhclBvcykpfWAsXG4gICAgICAgICAgaWR4LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgaWYgKGlkeCA+IHN0YXJ0SWR4KSB7XG4gICAgICAgIHJlc3VsdCArPSBgXFxcXG4ke18udHJpbVN0YXJ0KGFsbExpbmVzW2lkeF0pfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYWxsTGluZXNbaWR4XS5zdWJzdHJpbmcoc3RhcnRDaGFyUG9zICsgMSk7XG4gICAgICB9XG4gICAgICArK2lkeDtcbiAgICB9XG4gICAgcmV0dXJuIFtyZXN1bHQsIGlkeF07XG4gIH1cblxuICBjb25zdCBhcGtTdHJpbmdzID0ge307XG4gIGxldCBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gIGxldCBpc0luUGx1cmFsR3JvdXAgPSBmYWxzZTtcbiAgbGV0IGlzSW5DdXJyZW50Q29uZmlnID0gZmFsc2U7XG4gIGxldCBsaW5lSW5kZXggPSAwO1xuICB3aGlsZSAobGluZUluZGV4IDwgYWxsTGluZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBhbGxMaW5lc1tsaW5lSW5kZXhdLnRyaW0oKTtcbiAgICBpZiAoXy5pc0VtcHR5KHRyaW1tZWRMaW5lKSkge1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoWyd0eXBlJywgJ1BhY2thZ2UnXS5zb21lKCh4KSA9PiB0cmltbWVkTGluZS5zdGFydHNXaXRoKHgpKSkge1xuICAgICAgY3VycmVudFJlc291cmNlSWQgPSBudWxsO1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuICAgICAgKytsaW5lSW5kZXg7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aCgncmVzb3VyY2UnKSkge1xuICAgICAgaXNJblBsdXJhbEdyb3VwID0gZmFsc2U7XG4gICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICBpc0luQ3VycmVudENvbmZpZyA9IGZhbHNlO1xuXG4gICAgICBpZiAodHJpbW1lZExpbmUuaW5jbHVkZXMoJ3N0cmluZy8nKSkge1xuICAgICAgICBjb25zdCBtYXRjaCA9IC9zdHJpbmdcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyaW1tZWRMaW5lLmluY2x1ZGVzKCdwbHVyYWxzLycpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gL3BsdXJhbHNcXC8oXFxTKykvLmV4ZWModHJpbW1lZExpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG1hdGNoWzFdO1xuICAgICAgICAgIGlzSW5QbHVyYWxHcm91cCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICsrbGluZUluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRSZXNvdXJjZUlkKSB7XG4gICAgICBpZiAoaXNJblBsdXJhbEdyb3VwKSB7XG4gICAgICAgIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKCcoJykpIHtcbiAgICAgICAgICBpc0luQ3VycmVudENvbmZpZyA9IHRyaW1tZWRMaW5lLnN0YXJ0c1dpdGgoYCgke2NvbmZpZ01hcmtlcn0pYCk7XG4gICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzSW5DdXJyZW50Q29uZmlnKSB7XG4gICAgICAgICAgY29uc3QgW2NvbnRlbnQsIGlkeF0gPSBleHRyYWN0Q29udGVudChsaW5lSW5kZXgpO1xuICAgICAgICAgIGxpbmVJbmRleCA9IGlkeDtcbiAgICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgYXBrU3RyaW5nc1tjdXJyZW50UmVzb3VyY2VJZF0gPSBbXG4gICAgICAgICAgICAgIC4uLihhcGtTdHJpbmdzW2N1cnJlbnRSZXNvdXJjZUlkXSB8fCBbXSksXG4gICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0cmltbWVkTGluZS5zdGFydHNXaXRoKGAoJHtjb25maWdNYXJrZXJ9KWApKSB7XG4gICAgICAgIGNvbnN0IFtjb250ZW50LCBpZHhdID0gZXh0cmFjdENvbnRlbnQobGluZUluZGV4KTtcbiAgICAgICAgbGluZUluZGV4ID0gaWR4O1xuICAgICAgICBpZiAoXy5pc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgIGFwa1N0cmluZ3NbY3VycmVudFJlc291cmNlSWRdID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50UmVzb3VyY2VJZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgICsrbGluZUluZGV4O1xuICB9XG4gIHJldHVybiBhcGtTdHJpbmdzO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgdGhlIGNvbmZpZyBtYXJrZXIsIHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvIHBhcnNlLi4gbWV0aG9kc1xuICogdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggcmVzb3VyY2UgZm9ybWF0cyBnZW5lcmF0ZWQgYnkgYWFwdCgyKSB0b29sXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29uZmlnc0dldHRlciBUaGUgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgbGlzdFxuICogb2YgYXBrIGNvbmZpZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNpcmVkTWFya2VyIFRoZSBkZXNpcmVkIGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0TWFya2VyIFRoZSBkZWZhdWx0IGNvbmZpZyBtYXJrZXIgdmFsdWVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBjb25maWcgbWFya2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdENvbmZpZ01hcmtlciAoY29uZmlnc0dldHRlciwgZGVzaXJlZE1hcmtlciwgZGVmYXVsdE1hcmtlcikge1xuICBsZXQgY29uZmlnTWFya2VyID0gZGVzaXJlZE1hcmtlciB8fCBkZWZhdWx0TWFya2VyO1xuICBpZiAoY29uZmlnTWFya2VyLmluY2x1ZGVzKCctJykgJiYgIWNvbmZpZ01hcmtlci5pbmNsdWRlcygnLXInKSkge1xuICAgIGNvbmZpZ01hcmtlciA9IGNvbmZpZ01hcmtlci5yZXBsYWNlKCctJywgJy1yJyk7XG4gIH1cbiAgY29uc3QgY29uZmlncyA9IGF3YWl0IGNvbmZpZ3NHZXR0ZXIoKTtcbiAgbG9nLmRlYnVnKGBSZXNvdXJjZSBjb25maWd1cmF0aW9uczogJHtKU09OLnN0cmluZ2lmeShjb25maWdzKX1gKTtcbiAgLy8gQXNzdW1lIHRoZSAnZW4nIGNvbmZpZ3VyYXRpb24gaXMgdGhlIGRlZmF1bHQgb25lXG4gIGlmIChjb25maWdNYXJrZXIudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdlbicpXG4gICAgJiYgIWNvbmZpZ3Muc29tZSgoeCkgPT4geC50cmltKCkgPT09IGNvbmZpZ01hcmtlcikpIHtcbiAgICBsb2cuZGVidWcoYFJlc291cmNlIGNvbmZpZ3VyYXRpb24gbmFtZSAnJHtjb25maWdNYXJrZXJ9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBSZXBsYWNpbmcgaXQgd2l0aCAnJHtkZWZhdWx0TWFya2VyfSdgKTtcbiAgICBjb25maWdNYXJrZXIgPSBkZWZhdWx0TWFya2VyO1xuICB9IGVsc2Uge1xuICAgIGxvZy5kZWJ1ZyhgU2VsZWN0ZWQgY29uZmlndXJhdGlvbjogJyR7Y29uZmlnTWFya2VyfSdgKTtcbiAgfVxuICByZXR1cm4gY29uZmlnTWFya2VyO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgb3V0cHV0IGluIEpTT04gZm9ybWF0IHJldHJpZXZlZCBmcm9tXG4gKiB0aGUgY29ycmVzcG9uZGluZyBBcHBpdW0gU2V0dGluZ3MgYnJvYWRjYXN0IGNhbGxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dCBUaGUgYWN0dWFsIGNvbW1hbmQgb3V0cHV0XG4gKiBAcGFyYW0ge3N0cmluZ30gZW50aXR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHdoaWNoIGlzXG4gKiBnb2luZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgb3V0cHV0IGNhbm5vdCBiZSBwYXJzZWRcbiAqIGFzIGEgdmFsaWQgSlNPTlxuICovXG5mdW5jdGlvbiBwYXJzZUpzb25EYXRhIChvdXRwdXQsIGVudGl0eU5hbWUpIHtcbiAgaWYgKCEvXFxicmVzdWx0PS0xXFxiLy50ZXN0KG91dHB1dCkgfHwgIS9cXGJkYXRhPVwiLy50ZXN0KG91dHB1dCkpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXRyaWV2ZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICAnQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscycpO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gL1xcYmRhdGE9KFwiLispLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSAke2VudGl0eU5hbWV9IGZyb20gdGhlIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbiAgY29uc3QganNvblN0ciA9IF8udHJpbShtYXRjaFsxXSkucmVwbGFjZSgvKF5cIil8KFwiJCkvZywgJycpO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmRlYnVnKGpzb25TdHIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlICR7ZW50aXR5TmFtZX0gZnJvbSB0aGUgcmVzdWx0aW5nIGRhdGEgc3RyaW5nLiBgICtcbiAgICAgICdDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgY291bnRyeSBhYmJyZXZpYXRpb25zXG4gKiB0byBBVkQgYXJndW1lbnRzIGFycmF5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsYW5ndWFnZSBMYW5ndWFnZSBuYW1lLCBmb3IgZXhhbXBsZSAnZnInXG4gKiBAcGFyYW0gez9zdHJpbmd9IGNvdW50cnkgQ291bnRyeSBuYW1lLCBmb3IgZXhhbXBsZSAnQ0EnXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGdlbmVyYXRlZCBhcmd1bWVudHMuIFRoZVxuICogcmVzdWx0aW5nIGFycmF5IG1pZ2h0IGJlIGVtcHR5IGlmIGJvdGggYXJndW1lbnRzIGFyZSBlbXB0eVxuICovXG5mdW5jdGlvbiB0b0F2ZExvY2FsZUFyZ3MgKGxhbmd1YWdlLCBjb3VudHJ5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAobGFuZ3VhZ2UgJiYgXy5pc1N0cmluZyhsYW5ndWFnZSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMubGFuZ3VhZ2U9JHtsYW5ndWFnZS50b0xvd2VyQ2FzZSgpfWApO1xuICB9XG4gIGlmIChjb3VudHJ5ICYmIF8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICByZXN1bHQucHVzaCgnLXByb3AnLCBgcGVyc2lzdC5zeXMuY291bnRyeT0ke2NvdW50cnkudG9VcHBlckNhc2UoKX1gKTtcbiAgfVxuICBsZXQgbG9jYWxlO1xuICBpZiAoXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgXy5pc1N0cmluZyhjb3VudHJ5KSAmJiBsYW5ndWFnZSAmJiBjb3VudHJ5KSB7XG4gICAgbG9jYWxlID0gbGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSArICctJyArIGNvdW50cnkudG9VcHBlckNhc2UoKTtcbiAgfSBlbHNlIGlmIChsYW5ndWFnZSAmJiBfLmlzU3RyaW5nKGxhbmd1YWdlKSkge1xuICAgIGxvY2FsZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAoY291bnRyeSAmJiBfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9jYWxlID0gY291bnRyeTtcbiAgfVxuICBpZiAobG9jYWxlKSB7XG4gICAgcmVzdWx0LnB1c2goJy1wcm9wJywgYHBlcnNpc3Quc3lzLmxvY2FsZT0ke2xvY2FsZX1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBBbmRyb2lkIHByZWZlcmVuY2VzIHJvb3RcbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGBudWxsYCBpZiB0aGUgZm9sZGVyIGNhbm5vdCBiZSBmb3VuZFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRBbmRyb2lkUHJlZnNSb290ICgpIHtcbiAgbGV0IGxvY2F0aW9uID0gcHJvY2Vzcy5lbnYuQU5EUk9JRF9FTVVMQVRPUl9IT01FO1xuICBpZiAoYXdhaXQgZGlyRXhpc3RzKGxvY2F0aW9uKSkge1xuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuXG4gIGlmIChsb2NhdGlvbikge1xuICAgIGxvZy53YXJuKGBUaGUgdmFsdWUgb2YgdGhlIEFORFJPSURfRU1VTEFUT1JfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnJHtsb2NhdGlvbn0nIGlzIG5vdCBhbiBleGlzdGluZyBkaXJlY3RvcnlgKTtcbiAgfVxuXG4gIGNvbnN0IGhvbWUgPSBwcm9jZXNzLmVudi5IT01FIHx8IHByb2Nlc3MuZW52LlVTRVJQUk9GSUxFO1xuICBpZiAoaG9tZSkge1xuICAgIGxvY2F0aW9uID0gcGF0aC5yZXNvbHZlKGhvbWUsICcuYW5kcm9pZCcpO1xuICB9XG5cbiAgaWYgKCFhd2FpdCBkaXJFeGlzdHMobG9jYXRpb24pKSB7XG4gICAgbG9nLmRlYnVnKGBBbmRyb2lkIGNvbmZpZyByb290ICcke2xvY2F0aW9ufScgaXMgbm90IGFuIGV4aXN0aW5nIGRpcmVjdG9yeWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGxvY2F0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGF0aCBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0gYW5kIGlzIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsb2NhdGlvbiBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiBkaXJFeGlzdHMgKGxvY2F0aW9uKSB7XG4gIHJldHVybiBsb2NhdGlvblxuICAgICYmIGF3YWl0IGZzLmV4aXN0cyhsb2NhdGlvbilcbiAgICAmJiAoYXdhaXQgZnMuc3RhdChsb2NhdGlvbikpLmlzRGlyZWN0b3J5KCk7XG59XG5cbi8qKlxuICogRXNjYXBlcyBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cbiAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHBvc3NpYmxlIGlzc3VlcyB3aXRoIGhvdyBzeXN0ZW0gYHNwYXduYFxuICogY2FsbCBoYW5kbGVzIHRoZW0uXG4gKiBTZWUgaHR0cHM6Ly9kaXNjdXNzLmFwcGl1bS5pby90L2hvdy10by1tb2RpZnktd2QtcHJveHktYW5kLXVpYXV0b21hdG9yMi1zb3VyY2UtY29kZS10by1zdXBwb3J0LXVuaWNvZGUvMzM0NjZcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZyBOb24tZXNjYXBlZCBhcmd1bWVudCBzdHJpbmdcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIGFyZ3VtZW50XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVNoZWxsQXJnIChhcmcpIHtcbiAgYXJnID0gYCR7YXJnfWA7XG4gIGlmIChzeXN0ZW0uaXNXaW5kb3dzKCkpIHtcbiAgICByZXR1cm4gL1smfF5cXHNdLy50ZXN0KGFyZykgPyBgXCIke2FyZy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYCA6IGFyZztcbiAgfVxuICByZXR1cm4gYXJnLnJlcGxhY2UoLyYvZywgJ1xcXFwmJyk7XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBuYW1lIG9mIGxhdW5jaGFibGUgcGFja2FnZSBhY3Rpdml0eVxuICogZnJvbSBkdW1wc3lzIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZHVtcHN5cyB0aGUgYWN0dWFsIGR1bXBzeXMgb3V0cHV0XG4gKiBAcmV0dXJucyB7c3RyaW5nW119IEVpdGhlciB0aGUgZnVsbHkgcXVhbGlmaWVkXG4gKiBhY3Rpdml0eSBuYW1lIGFzIGEgc2luZ2xlIGxpc3QgaXRlbSBvciBhbiBlbXB0eSBsaXN0IGlmIG5vdGhpbmcgY291bGQgYmUgcGFyc2VkLlxuICogSW4gQW5kcm9pZCA2IGFuZCBvbGRlciB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGV0ZXJtaW5lXG4gKiB0aGUgY2F0ZWdvcnkgbmFtZSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LCBzbyB0aGlzIEFQSSBqdXN0XG4gKiByZXR1cm5zIGFsbCBhY3Rpdml0eSBuYW1lcyBiZWxvbmdpbmcgdG8gJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJ1xuICogd2l0aCB0aGUgZXhwZWN0YXRpb24gdGhhdCB0aGUgYXBwIG1hbmlmZXN0IGNvdWxkIGJlIHBhcnNlZCBuZXh0XG4gKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgY2F0ZWdvcnkgbmFtZXMgZm9yIHRoZXNlLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIChkdW1wc3lzKSB7XG4gIGNvbnN0IG1haW5BY3Rpdml0eU5hbWVSZSA9IG5ldyBSZWdFeHAoYF5cXFxccyoke18uZXNjYXBlUmVnRXhwKE1BSU5fQUNUSU9OKX06JGApO1xuICBjb25zdCBjYXRlZ29yeU5hbWVSZSA9IC9eXFxzKkNhdGVnb3J5OlxccytcIihbYS16QS1aMC05Ll8vLV0rKVwiJC87XG4gIGNvbnN0IGJsb2NrcyA9IFtdO1xuICBsZXQgYmxvY2tTdGFydEluZGVudDtcbiAgbGV0IGJsb2NrID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBkdW1wc3lzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBsaW5lLmxlbmd0aCAtIF8udHJpbVN0YXJ0KGxpbmUpLmxlbmd0aDtcbiAgICBpZiAobWFpbkFjdGl2aXR5TmFtZVJlLnRlc3QobGluZSkpIHtcbiAgICAgIGJsb2NrU3RhcnRJbmRlbnQgPSBjdXJyZW50SW5kZW50O1xuICAgICAgaWYgKCFfLmlzRW1wdHkoYmxvY2spKSB7XG4gICAgICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICAgICAgYmxvY2sgPSBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXy5pc05pbChibG9ja1N0YXJ0SW5kZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRJbmRlbnQgPiBibG9ja1N0YXJ0SW5kZW50KSB7XG4gICAgICBibG9jay5wdXNoKGxpbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNFbXB0eShibG9jaykpIHtcbiAgICAgICAgYmxvY2tzLnB1c2goYmxvY2spO1xuICAgICAgICBibG9jayA9IFtdO1xuICAgICAgfVxuICAgICAgYmxvY2tTdGFydEluZGVudCA9IG51bGw7XG4gICAgfVxuICB9XG4gIGlmICghXy5pc0VtcHR5KGJsb2NrKSkge1xuICAgIGJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgYmxvY2tzKSB7XG4gICAgbGV0IGhhc0NhdGVnb3J5ID0gZmFsc2U7XG4gICAgbGV0IGlzTGF1bmNoZXJDYXRlZ29yeSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBpdGVtKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGNhdGVnb3J5TmFtZVJlLmV4ZWMobGluZSk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBoYXNDYXRlZ29yeSA9IHRydWU7XG4gICAgICBpc0xhdW5jaGVyQ2F0ZWdvcnkgPSBtYXRjaFsxXSA9PT0gTEFVTkNIRVJfQ0FURUdPUlk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gT24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9ucyB0aGUgY2F0ZWdvcnkgbmFtZVxuICAgIC8vIG1pZ2h0IG5vdCBiZSBsaXN0ZWQsIHNvIHdlIGp1c3QgdHJ5IHRvIGZldGNoXG4gICAgLy8gYWxsIG1hdGNoZXMgaW5zdGVhZFxuICAgIGlmIChoYXNDYXRlZ29yeSAmJiAhaXNMYXVuY2hlckNhdGVnb3J5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGl2aXR5TmFtZVN0ciBvZiBpdGVtLm1hcChfLnRyaW0pLmZpbHRlcihCb29sZWFuKSkge1xuICAgICAgY29uc3QgZnFBY3Rpdml0eU5hbWUgPSBhY3Rpdml0eU5hbWVTdHIuc3BsaXQoL1xccysvKVsxXTtcbiAgICAgIGlmICghbWF0Y2hDb21wb25lbnROYW1lKGZxQWN0aXZpdHlOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGF1bmNoZXJDYXRlZ29yeSkge1xuICAgICAgICByZXR1cm4gW2ZxQWN0aXZpdHlOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGZxQWN0aXZpdHlOYW1lKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgY29tcG9uZW50IG5hbWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgVGhlIHN0cmluZyB0byB2ZXJpZnlcbiAqIEByZXR1cm4gez9BcnJheTxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmRcbiAqL1xuZnVuY3Rpb24gbWF0Y2hDb21wb25lbnROYW1lIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiAvXlthLXowLTkuL19dKyQvaS5leGVjKGNsYXNzU3RyaW5nKTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0QW5kcm9pZFBsYXRmb3JtQW5kUGF0aCwgdW56aXBGaWxlLFxuICBnZXRJTUVMaXN0RnJvbU91dHB1dCwgZ2V0SmF2YUZvck9zLCBpc1Nob3dpbmdMb2Nrc2NyZWVuLCBpc0N1cnJlbnRGb2N1c09uS2V5Z3VhcmQsXG4gIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgaXNTY3JlZW5PbkZ1bGx5LCBidWlsZFN0YXJ0Q21kLCBnZXRKYXZhSG9tZSxcbiAgZ2V0U2RrVG9vbHNWZXJzaW9uLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0QnVpbGRUb29sc0RpcnMsXG4gIGdldEFwa2FuYWx5emVyRm9yT3MsIGdldE9wZW5Tc2xGb3JPcywgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsIEFQS1NfRVhURU5TSU9OLFxuICBBUEtfSU5TVEFMTF9USU1FT1VULCBBUEtTX0lOU1RBTExfVElNRU9VVCwgYnVpbGRJbnN0YWxsQXJncywgQVBLX0VYVEVOU0lPTixcbiAgREVGQVVMVF9BREJfRVhFQ19USU1FT1VULCBwYXJzZU1hbmlmZXN0LCBwYXJzZUFhcHRTdHJpbmdzLCBwYXJzZUFhcHQyU3RyaW5ncyxcbiAgZm9ybWF0Q29uZmlnTWFya2VyLCBwYXJzZUpzb25EYXRhLCB1bnNpZ25BcGssIHRvQXZkTG9jYWxlQXJncywgcmVxdWlyZVNka1Jvb3QsXG4gIGdldFNka1Jvb3RGcm9tRW52LCBnZXRBbmRyb2lkUHJlZnNSb290LCBkaXJFeGlzdHMsIGVzY2FwZVNoZWxsQXJnLFxuICBwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzLCBtYXRjaENvbXBvbmVudE5hbWUsIGdldE1vZHVsZVJvb3Rcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLE1BQU1BLGNBQWMsR0FBRyxPQUFPO0FBQUM7QUFDL0IsTUFBTUMsYUFBYSxHQUFHLE1BQU07QUFBQztBQUM3QixNQUFNQyxtQkFBbUIsR0FBRyxLQUFLO0FBQUM7QUFDbEMsTUFBTUMsb0JBQW9CLEdBQUdELG1CQUFtQixHQUFHLENBQUM7QUFBQztBQUNyRCxNQUFNRSx3QkFBd0IsR0FBRyxLQUFLO0FBQUM7QUFDdkMsTUFBTUMsV0FBVyxHQUFHLDRCQUE0QjtBQUNoRCxNQUFNQyxpQkFBaUIsR0FBRyxrQ0FBa0M7QUFDNUQsTUFBTUMsV0FBVyxHQUFHLFlBQVk7O0FBUWhDLE1BQU1DLGFBQWEsR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUMsU0FBU0YsYUFBYSxHQUFJO0VBQ3hELE1BQU1HLElBQUksR0FBR0MsYUFBSSxDQUFDQyxpQkFBaUIsQ0FBQ04sV0FBVyxFQUFFTyxVQUFVLENBQUM7RUFDNUQsSUFBSSxDQUFDSCxJQUFJLEVBQUU7SUFDVCxNQUFNLElBQUlJLEtBQUssQ0FBRSxzQ0FBcUNSLFdBQVksaUJBQWdCLENBQUM7RUFDckY7RUFDQSxPQUFPSSxJQUFJO0FBQ2IsQ0FBQyxDQUFDOztBQUFDO0FBT0gsU0FBU0ssaUJBQWlCLEdBQUk7RUFDNUIsT0FBT0MsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFlBQVksSUFBSUYsT0FBTyxDQUFDQyxHQUFHLENBQUNFLGdCQUFnQjtBQUNqRTs7QUFTQSxlQUFlQyxjQUFjLENBQUVDLFVBQVUsR0FBRyxJQUFJLEVBQUU7RUFDaEQsTUFBTUMsT0FBTyxHQUFHRCxVQUFVLElBQUlOLGlCQUFpQixFQUFFO0VBQ2pELE1BQU1RLE1BQU0sR0FBRyxtRkFBbUY7RUFDbEcsSUFBSWYsZUFBQyxDQUFDZ0IsT0FBTyxDQUFDRixPQUFPLENBQUMsRUFBRTtJQUN0QixNQUFNLElBQUlSLEtBQUssQ0FBRSxnRkFBK0VTLE1BQU8sRUFBQyxDQUFDO0VBQzNHO0VBRUEsSUFBSSxFQUFDLE1BQU1FLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDSixPQUFPLENBQUMsR0FBRTtJQUM3QixNQUFNLElBQUlSLEtBQUssQ0FBRSxnQ0FBK0JRLE9BQVEsOENBQTZDQyxNQUFPLEVBQUMsQ0FBQztFQUNoSDtFQUNBLE1BQU1JLEtBQUssR0FBRyxNQUFNRixXQUFFLENBQUNHLElBQUksQ0FBQ04sT0FBTyxDQUFDO0VBQ3BDLElBQUksQ0FBQ0ssS0FBSyxDQUFDRSxXQUFXLEVBQUUsRUFBRTtJQUN4QixNQUFNLElBQUlmLEtBQUssQ0FBRSx5QkFBd0JRLE9BQVEsdUJBQXNCQyxNQUFPLEVBQUMsQ0FBQztFQUNsRjtFQUNBLE9BQU9ELE9BQU87QUFDaEI7O0FBZUEsZUFBZVEseUJBQXlCLENBQUVSLE9BQU8sRUFBRTtFQUNqRCxNQUFNUyxVQUFVLEdBQUcsTUFBTU4sV0FBRSxDQUFDTyxJQUFJLENBQUMsY0FBYyxFQUFFO0lBQy9DQyxHQUFHLEVBQUVDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDYixPQUFPLEVBQUUsV0FBVyxDQUFDO0lBQ3ZDYyxRQUFRLEVBQUU7RUFDWixDQUFDLENBQUM7RUFDRixNQUFNQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7RUFDM0IsS0FBSyxNQUFNQyxTQUFTLElBQUlQLFVBQVUsRUFBRTtJQUNsQyxNQUFNUSxZQUFZLEdBQUcsTUFBTWQsV0FBRSxDQUFDZSxRQUFRLENBQUNGLFNBQVMsRUFBRSxPQUFPLENBQUM7SUFDMUQsTUFBTUcsWUFBWSxHQUFHUCxhQUFJLENBQUNRLE9BQU8sQ0FBQ0osU0FBUyxDQUFDO0lBQzVDLE1BQU1LLFFBQVEsR0FBR1QsYUFBSSxDQUFDVSxRQUFRLENBQUNILFlBQVksQ0FBQztJQUM1QyxNQUFNSSxLQUFLLEdBQUcsK0JBQStCLENBQUNDLElBQUksQ0FBQ1AsWUFBWSxDQUFDO0lBQ2hFLElBQUksQ0FBQ00sS0FBSyxFQUFFO01BQ1ZFLGVBQUcsQ0FBQ0MsSUFBSSxDQUFFLHFDQUFvQ1YsU0FBVSxnQkFBZUssUUFBUyxHQUFFLENBQUM7TUFDbkY7SUFDRjtJQUNBTixnQkFBZ0IsQ0FBQ1ksUUFBUSxDQUFDSixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRztNQUN6Q0YsUUFBUTtNQUNSRjtJQUNGLENBQUM7RUFDSDtFQUNBLElBQUlqQyxlQUFDLENBQUNnQixPQUFPLENBQUNhLGdCQUFnQixDQUFDLEVBQUU7SUFDL0JVLGVBQUcsQ0FBQ0MsSUFBSSxDQUFFLG1DQUFrQ2QsYUFBSSxDQUFDQyxPQUFPLENBQUNiLE9BQU8sRUFBRSxXQUFXLENBQUUsS0FBSSxHQUNoRix5Q0FBd0MsQ0FBQztJQUM1QyxPQUFPO01BQ0xxQixRQUFRLEVBQUUsSUFBSTtNQUNkRixZQUFZLEVBQUU7SUFDaEIsQ0FBQztFQUNIO0VBRUEsTUFBTVMsZ0JBQWdCLEdBQUcxQyxlQUFDLENBQUMyQyxJQUFJLENBQUNkLGdCQUFnQixDQUFDLENBQUNlLElBQUksRUFBRSxDQUFDQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDckUsTUFBTUMsTUFBTSxHQUFHakIsZ0JBQWdCLENBQUNhLGdCQUFnQixDQUFDO0VBQ2pESCxlQUFHLENBQUNRLEtBQUssQ0FBRSwyQ0FBMENDLElBQUksQ0FBQ0MsU0FBUyxDQUFDSCxNQUFNLENBQUUsRUFBQyxDQUFDO0VBQzlFLE9BQU9BLE1BQU07QUFDZjtBQUVBLGVBQWVJLFNBQVMsQ0FBRUMsT0FBTyxFQUFFQyxPQUFPLEdBQUcxQixhQUFJLENBQUNRLE9BQU8sQ0FBQ2lCLE9BQU8sQ0FBQyxFQUFFO0VBQ2xFWixlQUFHLENBQUNRLEtBQUssQ0FBRSxjQUFhSSxPQUFRLFNBQVFDLE9BQVEsR0FBRSxDQUFDO0VBQ25ELE1BQU1DLFlBQUcsQ0FBQ0MsY0FBYyxDQUFDSCxPQUFPLENBQUM7RUFDakMsTUFBTUUsWUFBRyxDQUFDRSxZQUFZLENBQUNKLE9BQU8sRUFBRUMsT0FBTyxDQUFDO0VBQ3hDYixlQUFHLENBQUNRLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztBQUMvQjs7QUFZQSxlQUFlUyxTQUFTLENBQUVDLE9BQU8sRUFBRTtFQUNqQyxNQUFNQyxPQUFPLEdBQUcsTUFBTUMsZ0JBQU8sQ0FBQ0MsT0FBTyxFQUFFO0VBQ3ZDLE1BQU1DLGlCQUFpQixHQUFHLFVBQVU7RUFDcEMsSUFBSTtJQUNGLElBQUlDLFVBQVUsR0FBRyxLQUFLO0lBQ3RCLE1BQU1ULFlBQUcsQ0FBQ1UsV0FBVyxDQUFDTixPQUFPLEVBQUUsQ0FBQztNQUFDTztJQUFLLENBQUMsS0FBSztNQUMxQ0YsVUFBVSxHQUFHRSxLQUFLLENBQUNDLFFBQVEsQ0FBQ0MsVUFBVSxDQUFFLEdBQUVMLGlCQUFrQixHQUFFLENBQUM7TUFFL0QsT0FBTyxDQUFDQyxVQUFVO0lBQ3BCLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQ0EsVUFBVSxFQUFFO01BQ2YsT0FBTyxLQUFLO0lBQ2Q7SUFDQSxNQUFNSyxVQUFVLEdBQUd6QyxhQUFJLENBQUNDLE9BQU8sQ0FBQytCLE9BQU8sRUFBRSxLQUFLLENBQUM7SUFDL0MsTUFBTUwsWUFBRyxDQUFDRSxZQUFZLENBQUNFLE9BQU8sRUFBRVUsVUFBVSxDQUFDO0lBQzNDLE1BQU1sRCxXQUFFLENBQUNtRCxNQUFNLENBQUMxQyxhQUFJLENBQUNDLE9BQU8sQ0FBQ3dDLFVBQVUsRUFBRU4saUJBQWlCLENBQUMsQ0FBQztJQUM1RCxNQUFNUSxhQUFhLEdBQUczQyxhQUFJLENBQUNDLE9BQU8sQ0FBQytCLE9BQU8sRUFBRWhDLGFBQUksQ0FBQ1UsUUFBUSxDQUFDcUIsT0FBTyxDQUFDLENBQUM7SUFDbkUsTUFBTUosWUFBRyxDQUFDaUIsU0FBUyxDQUFDRCxhQUFhLEVBQUU7TUFDakM1QyxHQUFHLEVBQUUwQztJQUNQLENBQUMsQ0FBQztJQUNGLE1BQU1sRCxXQUFFLENBQUNzRCxNQUFNLENBQUNkLE9BQU8sQ0FBQztJQUN4QixNQUFNeEMsV0FBRSxDQUFDdUQsRUFBRSxDQUFDSCxhQUFhLEVBQUVaLE9BQU8sQ0FBQztJQUNuQyxPQUFPLElBQUk7RUFDYixDQUFDLFNBQVM7SUFDUixNQUFNeEMsV0FBRSxDQUFDbUQsTUFBTSxDQUFDVixPQUFPLENBQUM7RUFDMUI7QUFDRjtBQUVBLFNBQVNlLG9CQUFvQixDQUFFQyxNQUFNLEVBQUU7RUFDckMsSUFBSUMsT0FBTyxHQUFHLEVBQUU7RUFDaEIsS0FBSyxJQUFJQyxJQUFJLElBQUlGLE1BQU0sQ0FBQ0csS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ25DLElBQUlELElBQUksQ0FBQ0UsTUFBTSxHQUFHLENBQUMsSUFBSUYsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtNQUV0Q0QsT0FBTyxDQUFDSSxJQUFJLENBQUNILElBQUksQ0FBQ0ksSUFBSSxFQUFFLENBQUNDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0M7RUFDRjtFQUNBLE9BQU9OLE9BQU87QUFDaEI7QUFFQSxNQUFNTyxXQUFXLEdBQUdsRixlQUFDLENBQUNDLE9BQU8sQ0FBQyxlQUFlaUYsV0FBVyxHQUFJO0VBQzFELE1BQU1wQyxNQUFNLEdBQUd0QyxPQUFPLENBQUNDLEdBQUcsQ0FBQzBFLFNBQVM7RUFDcEMsSUFBSSxDQUFDckMsTUFBTSxFQUFFO0lBQ1gsTUFBTSxJQUFJeEMsS0FBSyxDQUFDLHVFQUF1RSxDQUFDO0VBQzFGO0VBQ0EsSUFBSSxFQUFDLE1BQU1XLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDNEIsTUFBTSxDQUFDLEdBQUU7SUFDNUIsTUFBTSxJQUFJeEMsS0FBSyxDQUFFLDJCQUEwQndDLE1BQU8sY0FBYSxDQUFDO0VBQ2xFO0VBQ0EsTUFBTTNCLEtBQUssR0FBRyxNQUFNRixXQUFFLENBQUNHLElBQUksQ0FBQzBCLE1BQU0sQ0FBQztFQUNuQyxJQUFJLENBQUMzQixLQUFLLENBQUNFLFdBQVcsRUFBRSxFQUFFO0lBQ3hCLE1BQU0sSUFBSWYsS0FBSyxDQUFFLDJCQUEwQndDLE1BQU8sMEJBQXlCLENBQUM7RUFDOUU7RUFDQSxPQUFPQSxNQUFNO0FBQ2YsQ0FBQyxDQUFDO0FBQUM7QUFFSCxNQUFNc0MsWUFBWSxHQUFHcEYsZUFBQyxDQUFDQyxPQUFPLENBQUMsZUFBZW1GLFlBQVksR0FBSTtFQUM1RCxJQUFJQyxRQUFRO0VBQ1osSUFBSUMsTUFBTTtFQUNWLElBQUk7SUFDRkQsUUFBUSxHQUFHLE1BQU1ILFdBQVcsRUFBRTtFQUNoQyxDQUFDLENBQUMsT0FBT0ssR0FBRyxFQUFFO0lBQ1pELE1BQU0sR0FBR0MsR0FBRyxDQUFDQyxPQUFPO0VBQ3RCO0VBQ0EsTUFBTUMsY0FBYyxHQUFJLE9BQU1DLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztFQUNoRSxJQUFJTixRQUFRLEVBQUU7SUFDWixNQUFNTyxVQUFVLEdBQUdsRSxhQUFJLENBQUNDLE9BQU8sQ0FBQzBELFFBQVEsRUFBRSxLQUFLLEVBQUVJLGNBQWMsQ0FBQztJQUNoRSxJQUFJLE1BQU14RSxXQUFFLENBQUNDLE1BQU0sQ0FBQzBFLFVBQVUsQ0FBQyxFQUFFO01BQy9CLE9BQU9BLFVBQVU7SUFDbkI7RUFDRjtFQUNBLElBQUk7SUFDRixPQUFPLE1BQU0zRSxXQUFFLENBQUM0RSxLQUFLLENBQUNKLGNBQWMsQ0FBQztFQUN2QyxDQUFDLENBQUMsT0FBT0ssR0FBRyxFQUFFLENBQUM7RUFDZixNQUFNLElBQUl4RixLQUFLLENBQUUsUUFBT21GLGNBQWUsOEJBQTZCLEdBQ2pFLHdDQUF1Q0gsTUFBTSxJQUFJNUQsYUFBSSxDQUFDQyxPQUFPLENBQUMwRCxRQUFRLEVBQUUsS0FBSyxDQUFFLEdBQUUsQ0FBQztBQUN2RixDQUFDLENBQUM7QUFBQztBQUVILE1BQU1VLGVBQWUsR0FBRyxrQkFBa0I7RUFDeEMsTUFBTUMsVUFBVSxHQUFJLFVBQVNOLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztFQUMvRCxJQUFJO0lBQ0YsT0FBTyxNQUFNMUUsV0FBRSxDQUFDNEUsS0FBSyxDQUFDRyxVQUFVLENBQUM7RUFDbkMsQ0FBQyxDQUFDLE9BQU9ULEdBQUcsRUFBRTtJQUNaLE1BQU0sSUFBSWpGLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQztFQUMvRjtBQUNGLENBQUM7O0FBQUM7QUFTRixlQUFlMkYsaUJBQWlCLENBQUVDLFVBQVUsRUFBRTtFQUM1QyxPQUFPLE1BQU1BLFVBQVUsQ0FBQ0Msb0JBQW9CLENBQUMsZUFBZSxDQUFDO0FBQy9EOztBQVVBLGVBQWVDLG1CQUFtQixDQUFFRixVQUFVLEVBQUU7RUFDOUMsT0FBTyxNQUFNQSxVQUFVLENBQUNDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQztBQUM3RDs7QUFrQkEsU0FBU0UsbUJBQW1CLENBQUVDLE9BQU8sRUFBRTtFQUNyQyxPQUFPdEcsZUFBQyxDQUFDdUcsSUFBSSxDQUFDLENBQUMseUJBQXlCLEVBQUUsMEJBQTBCLENBQUMsRUFBR0MsQ0FBQyxJQUFLRixPQUFPLENBQUNHLFFBQVEsQ0FBQ0QsQ0FBQyxDQUFDO0VBQUMsR0FFN0Z4RyxlQUFDLENBQUMwRyxLQUFLLENBQUMsQ0FBQyw0Q0FBNEMsRUFBRSwwQkFBMEIsQ0FBQyxFQUFHRixDQUFDLElBQUtBLENBQUMsQ0FBQ0csSUFBSSxDQUFDTCxPQUFPLENBQUMsQ0FBQztBQUNsSDs7QUFLQSxTQUFTTSx3QkFBd0IsQ0FBRU4sT0FBTyxFQUFFO0VBQzFDLElBQUlPLENBQUMsR0FBRywyQkFBMkIsQ0FBQ3ZFLElBQUksQ0FBQ2dFLE9BQU8sQ0FBQztFQUNqRCxPQUFRTyxDQUFDLElBQUlBLENBQUMsQ0FBQy9CLE1BQU0sSUFBSStCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBSSxJQUFJLEdBQUcsS0FBSztBQUMvQzs7QUFLQSxTQUFTQyxxQkFBcUIsQ0FBRVIsT0FBTyxFQUFFO0VBQ3ZDLElBQUlPLENBQUMsR0FBRywwQkFBMEIsQ0FBQ3ZFLElBQUksQ0FBQ2dFLE9BQU8sQ0FBQztFQUNoRCxPQUFPTyxDQUFDLElBQUlwRSxRQUFRLENBQUNvRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQzlDOztBQU1BLFNBQVNrQyxlQUFlLENBQUVULE9BQU8sRUFBRTtFQUNqQyxJQUFJTyxDQUFDLEdBQUcsc0JBQXNCLENBQUN2RSxJQUFJLENBQUNnRSxPQUFPLENBQUM7RUFDNUMsT0FBTyxDQUFDTyxDQUFDO0VBQ0RBLENBQUMsSUFBSUEsQ0FBQyxDQUFDL0IsTUFBTSxHQUFHLENBQUMsSUFBSStCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ2hDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFPLElBQUksS0FBSztBQUN0RTs7QUFVQSxTQUFTbUMsYUFBYSxDQUFFQyxlQUFlLEVBQUVDLFFBQVEsRUFBRTtFQUNqRCxNQUFNO0lBQ0pDLElBQUk7SUFDSkMsYUFBYTtJQUNiQyxHQUFHO0lBQ0hDLFFBQVE7SUFDUkMsTUFBTTtJQUNOQyxRQUFRO0lBQ1JDLE9BQU87SUFDUEM7RUFDRixDQUFDLEdBQUdULGVBQWU7RUFDbkIsTUFBTVUsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztFQUMzQixJQUFJQyxhQUFJLENBQUNDLFFBQVEsQ0FBQ1YsSUFBSSxDQUFDLEVBQUU7SUFDdkJRLEdBQUcsQ0FBQzVDLElBQUksQ0FBQyxRQUFRLEVBQUVvQyxJQUFJLENBQUM7RUFDMUI7RUFDQSxJQUFJQyxhQUFhLEVBQUU7SUFDakJPLEdBQUcsQ0FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDaEI7RUFDQSxJQUFJdUMsUUFBUSxJQUFJRCxHQUFHLEVBQUU7SUFDbkJNLEdBQUcsQ0FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUcsR0FBRXNDLEdBQUksSUFBR0MsUUFBUyxFQUFDLENBQUM7RUFDdEM7RUFDQSxJQUFJRyxPQUFPLElBQUlQLFFBQVEsSUFBSSxFQUFFLEVBQUU7SUFDN0JTLEdBQUcsQ0FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDaEI7RUFDQSxJQUFJd0MsTUFBTSxFQUFFO0lBQ1ZJLEdBQUcsQ0FBQzVDLElBQUksQ0FBQyxJQUFJLEVBQUV3QyxNQUFNLENBQUM7RUFDeEI7RUFDQSxJQUFJQyxRQUFRLEVBQUU7SUFDWkcsR0FBRyxDQUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRXlDLFFBQVEsQ0FBQztFQUMxQjtFQUNBLElBQUlFLEtBQUssRUFBRTtJQUNUQyxHQUFHLENBQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFMkMsS0FBSyxDQUFDO0VBQ3ZCO0VBQ0EsSUFBSVQsZUFBZSxDQUFDYSx1QkFBdUIsRUFBRTs7SUFRM0MsSUFBSUMsYUFBYSxHQUFHLFVBQVVDLEdBQUcsRUFBRTtNQUNqQ0EsR0FBRyxHQUFHQSxHQUFHLENBQUNoRCxJQUFJLEVBQUU7TUFDaEIsSUFBSWlELEtBQUssR0FBR0QsR0FBRyxDQUFDRSxPQUFPLENBQUMsR0FBRyxDQUFDO01BQzVCLElBQUlELEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNoQixPQUFPRCxHQUFHLENBQUNsRCxNQUFNLEdBQUcsQ0FBQ2tELEdBQUcsQ0FBQyxHQUFHLEVBQUU7TUFDaEMsQ0FBQyxNQUFNO1FBQ0wsT0FBTyxDQUFDQSxHQUFHLENBQUNHLFNBQVMsQ0FBQyxDQUFDLEVBQUVGLEtBQUssQ0FBQyxDQUFDakQsSUFBSSxFQUFFLEVBQUVnRCxHQUFHLENBQUNHLFNBQVMsQ0FBQ0YsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDakQsSUFBSSxFQUFFLENBQUM7TUFDMUU7SUFDRixDQUFDOztJQUtELElBQUk4Qyx1QkFBdUIsR0FBSSxJQUFHYixlQUFlLENBQUNhLHVCQUF3QixFQUFDO0lBQzNFLElBQUlNLEVBQUUsR0FBRyxpQkFBaUI7SUFDMUIsT0FBTyxJQUFJLEVBQUU7TUFDWCxJQUFJQyxJQUFJLEdBQUdELEVBQUUsQ0FBQzlGLElBQUksQ0FBQ3dGLHVCQUF1QixDQUFDO01BQzNDLElBQUksQ0FBQ08sSUFBSSxFQUFFO1FBQ1QsSUFBSVAsdUJBQXVCLENBQUNoRCxNQUFNLEVBQUU7VUFFbEM2QyxHQUFHLENBQUM1QyxJQUFJLENBQUN1RCxLQUFLLENBQUNYLEdBQUcsRUFBRUksYUFBYSxDQUFDRCx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdEO1FBRUE7TUFDRjs7TUFLQSxJQUFJUyxJQUFJLEdBQUdGLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDbEIsSUFBSUcsT0FBTyxHQUFHVix1QkFBdUIsQ0FBQ0ksT0FBTyxDQUFDSyxJQUFJLENBQUM7TUFDbkQsSUFBSUMsT0FBTyxLQUFLLENBQUMsRUFBRTtRQUNqQixJQUFJQyxRQUFRLEdBQUdYLHVCQUF1QixDQUFDSyxTQUFTLENBQUMsQ0FBQyxFQUFFSyxPQUFPLENBQUM7UUFDNURiLEdBQUcsQ0FBQzVDLElBQUksQ0FBQ3VELEtBQUssQ0FBQ1gsR0FBRyxFQUFFSSxhQUFhLENBQUNVLFFBQVEsQ0FBQyxDQUFDO01BQzlDOztNQUdBZCxHQUFHLENBQUM1QyxJQUFJLENBQUN3RCxJQUFJLENBQUM7O01BR2RULHVCQUF1QixHQUFHTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25DO0VBQ0Y7RUFDQSxPQUFPVixHQUFHO0FBQ1o7QUFFQSxNQUFNZSxrQkFBa0IsR0FBRzFJLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDLGVBQWV5SSxrQkFBa0IsR0FBSTtFQUN4RSxNQUFNQyxXQUFXLEdBQUduSSxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsWUFBWTtFQUM1QyxJQUFJLENBQUNpSSxXQUFXLEVBQUU7SUFDaEIsTUFBTSxJQUFJckksS0FBSyxDQUFDLHlEQUF5RCxDQUFDO0VBQzVFO0VBQ0EsTUFBTXNJLGNBQWMsR0FBR2xILGFBQUksQ0FBQ0MsT0FBTyxDQUFDZ0gsV0FBVyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQztFQUM5RSxJQUFJLEVBQUMsTUFBTTFILFdBQUUsQ0FBQ0MsTUFBTSxDQUFDMEgsY0FBYyxDQUFDLEdBQUU7SUFDcENyRyxlQUFHLENBQUNDLElBQUksQ0FBRSxlQUFjb0csY0FBZSxnQ0FBK0IsQ0FBQztJQUN2RTtFQUNGO0VBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsTUFBTTVILFdBQUUsQ0FBQ2UsUUFBUSxDQUFDNEcsY0FBYyxFQUFFLE1BQU0sQ0FBQztFQUNuRSxNQUFNRSxjQUFjLEdBQUcsSUFBSUMsTUFBTSxDQUFDLHVDQUF1QyxDQUFDO0VBQzFFLE1BQU0xRyxLQUFLLEdBQUd5RyxjQUFjLENBQUN4RyxJQUFJLENBQUN1RyxpQkFBaUIsQ0FBQztFQUNwRCxJQUFJeEcsS0FBSyxFQUFFO0lBQ1QsT0FBTztNQUNMMkcsS0FBSyxFQUFFdkcsUUFBUSxDQUFDSixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO01BQzdCNEcsS0FBSyxFQUFFNUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHSSxRQUFRLENBQUNKLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO01BQzVDNkcsS0FBSyxFQUFFN0csS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHSSxRQUFRLENBQUNKLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRztJQUM3QyxDQUFDO0VBQ0g7RUFDQUUsZUFBRyxDQUFDQyxJQUFJLENBQUUsMENBQXlDb0csY0FBZSxFQUFDLENBQUM7QUFDdEUsQ0FBQyxDQUFDOztBQUFDO0FBVUgsTUFBTU8saUJBQWlCLEdBQUduSixlQUFDLENBQUNDLE9BQU8sQ0FBQyxlQUFla0osaUJBQWlCLENBQUVySSxPQUFPLEVBQUU7RUFDN0UsSUFBSXNJLGNBQWMsR0FBRyxNQUFNbkksV0FBRSxDQUFDTyxJQUFJLENBQUMsSUFBSSxFQUFFO0lBQ3ZDQyxHQUFHLEVBQUVDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDYixPQUFPLEVBQUUsYUFBYSxDQUFDO0lBQ3pDYyxRQUFRLEVBQUU7RUFDWixDQUFDLENBQUM7RUFDRixJQUFJO0lBQ0Z3SCxjQUFjLEdBQUdBLGNBQWMsQ0FDNUJDLEdBQUcsQ0FBRUMsR0FBRyxJQUFLLENBQUM1SCxhQUFJLENBQUNVLFFBQVEsQ0FBQ2tILEdBQUcsQ0FBQyxFQUFFQSxHQUFHLENBQUMsQ0FBQyxDQUN2QzFHLElBQUksQ0FBQyxDQUFDMkcsQ0FBQyxFQUFFQyxDQUFDLEtBQUtDLGVBQU0sQ0FBQ0MsUUFBUSxDQUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNDSCxHQUFHLENBQUVNLElBQUksSUFBS0EsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzNCLENBQUMsQ0FBQyxPQUFPcEUsR0FBRyxFQUFFO0lBQ1poRCxlQUFHLENBQUNDLElBQUksQ0FBRSxtQ0FBa0NRLElBQUksQ0FBQ0MsU0FBUyxDQUFDbUcsY0FBYyxDQUFDQyxHQUFHLENBQUVDLEdBQUcsSUFBSzVILGFBQUksQ0FBQ1UsUUFBUSxDQUFDa0gsR0FBRyxDQUFDLENBQUMsQ0FBRSxHQUFFLEdBQzNHLDRCQUEyQixDQUFDO0lBQy9CL0csZUFBRyxDQUFDQyxJQUFJLENBQUUsaUVBQWdFK0MsR0FBRyxDQUFDQyxPQUFRLEVBQUMsQ0FBQztJQUN4RixNQUFNb0UsS0FBSyxHQUFHLE1BQU1DLGlCQUFDLENBQUNSLEdBQUcsQ0FBQ0QsY0FBYyxFQUFFLE1BQU9FLEdBQUcsSUFBSyxDQUFDLENBQUMsTUFBTXJJLFdBQUUsQ0FBQ0csSUFBSSxDQUFDa0ksR0FBRyxDQUFDLEVBQUVRLEtBQUssQ0FBQ0MsT0FBTyxFQUFFLEVBQUVULEdBQUcsQ0FBQyxDQUFDO0lBQ3JHRixjQUFjLEdBQUdRLEtBQUssQ0FDbkJoSCxJQUFJLENBQUMsQ0FBQzJHLENBQUMsRUFBRUMsQ0FBQyxLQUFLRCxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUMzQkgsR0FBRyxDQUFFTSxJQUFJLElBQUtBLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMzQjtFQUNBcEgsZUFBRyxDQUFDeUgsSUFBSSxDQUFFLFNBQVFaLGNBQWMsQ0FBQ3RFLE1BQU8saUNBQWdDaEUsT0FBUSxtQkFBa0IsQ0FBQztFQUNuRyxLQUFLLElBQUl3SSxHQUFHLElBQUlGLGNBQWMsRUFBRTtJQUM5QjdHLGVBQUcsQ0FBQ3lILElBQUksQ0FBRSxPQUFNVixHQUFJLEVBQUMsQ0FBQztFQUN4QjtFQUNBLE9BQU9GLGNBQWM7QUFDdkIsQ0FBQyxDQUFDOztBQUFDO0FBV0gsTUFBTWEsMEJBQTBCLEdBQUcsVUFBVUMsYUFBYSxFQUFFQyxVQUFVLEVBQUVDLFlBQVksR0FBRyxJQUFJLEVBQUU7RUFDM0YsTUFBTUMsa0JBQWtCLEdBQUlDLFNBQVMsSUFBSyxJQUFJdkIsTUFBTSxDQUFFLFNBQVEvSSxlQUFDLENBQUN1SyxZQUFZLENBQUNELFNBQVMsQ0FBRSx5QkFBd0IsRUFBRSxHQUFHLENBQUM7RUFDdEgsTUFBTUUsYUFBYSxHQUFHLE1BQU07RUFDNUIsTUFBTUMscUJBQXFCLEdBQUcsZ0NBQWdDO0VBQzlELE1BQU1DLG1CQUFtQixHQUFHLGlCQUFpQjtFQUM3QyxNQUFNNUgsTUFBTSxHQUFHLEVBQUU7RUFDakIsS0FBSyxNQUFNd0gsU0FBUyxJQUFJSCxVQUFVLEVBQUU7SUFDbEMsTUFBTVEsVUFBVSxHQUFHTixrQkFBa0IsQ0FBQ0MsU0FBUyxDQUFDLENBQUNoSSxJQUFJLENBQUM0SCxhQUFhLENBQUM7SUFDcEUsSUFBSSxDQUFDUyxVQUFVLEVBQUU7TUFDZjtJQUNGO0lBRUEsTUFBTUMsS0FBSyxHQUFHRCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM5RixLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3ZDLElBQUkrRixLQUFLLENBQUM5RixNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQ3BCO0lBQ0Y7SUFFQSxNQUFNK0YsV0FBVyxHQUFHRCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNFLE1BQU0sQ0FBQ04sYUFBYSxDQUFDO0lBQ2xELEtBQUssTUFBTTVGLElBQUksSUFBSWdHLEtBQUssQ0FBQ0csS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ2pDLE1BQU1DLGFBQWEsR0FBR3BHLElBQUksQ0FBQ2tHLE1BQU0sQ0FBQ04sYUFBYSxDQUFDO01BQ2hELElBQUlRLGFBQWEsSUFBSUgsV0FBVyxFQUFFO1FBQ2hDO01BQ0Y7TUFFQSxNQUFNSSxtQkFBbUIsR0FBR1IscUJBQXFCLENBQUNuSSxJQUFJLENBQUNzQyxJQUFJLENBQUM7TUFDNUQsSUFBSSxDQUFDcUcsbUJBQW1CLEVBQUU7UUFDeEI7TUFDRjtNQUNBLE1BQU1DLElBQUksR0FBRztRQUNYQyxVQUFVLEVBQUVGLG1CQUFtQixDQUFDLENBQUM7TUFDbkMsQ0FBQztNQUNELE1BQU1HLGlCQUFpQixHQUFHVixtQkFBbUIsQ0FBQ3BJLElBQUksQ0FBQ3NDLElBQUksQ0FBQztNQUN4RCxJQUFJd0csaUJBQWlCLEVBQUU7UUFDckJGLElBQUksQ0FBQ0csT0FBTyxHQUFHRCxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNO01BQ2hEO01BQ0F0SSxNQUFNLENBQUNpQyxJQUFJLENBQUNtRyxJQUFJLENBQUM7SUFDbkI7RUFDRjtFQUVBLE1BQU1JLGNBQWMsR0FBR3hJLE1BQU0sQ0FDMUJ5SSxNQUFNLENBQUVMLElBQUksSUFBSyxDQUFDbEwsZUFBQyxDQUFDd0wsU0FBUyxDQUFDcEIsWUFBWSxDQUFDLElBQUljLElBQUksQ0FBQ0csT0FBTyxLQUFLakIsWUFBWSxDQUFDLENBQzdFZixHQUFHLENBQUU2QixJQUFJLElBQUtBLElBQUksQ0FBQ0MsVUFBVSxDQUFDO0VBQ2pDNUksZUFBRyxDQUFDUSxLQUFLLENBQUUsYUFBWTZFLGFBQUksQ0FBQzZELFNBQVMsQ0FBQyxZQUFZLEVBQUVILGNBQWMsQ0FBQ3hHLE1BQU0sRUFBRSxJQUFJLENBQUUsR0FBRSxHQUNoRixRQUFPcUYsVUFBVyxJQUFHdkMsYUFBSSxDQUFDNkQsU0FBUyxDQUFDLE9BQU8sRUFBRXRCLFVBQVUsQ0FBQ3JGLE1BQU0sRUFBRSxLQUFLLENBQUUsRUFBQyxDQUFDO0VBQzVFLE9BQU93RyxjQUFjO0FBQ3ZCLENBQUM7O0FBQUM7O0FBMEJGLFNBQVNJLGdCQUFnQixDQUFFeEUsUUFBUSxFQUFFeUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2pELE1BQU03SSxNQUFNLEdBQUcsRUFBRTtFQUVqQixJQUFJLENBQUM4RSxhQUFJLENBQUNDLFFBQVEsQ0FBQzhELE9BQU8sQ0FBQzFHLE9BQU8sQ0FBQyxJQUFJMEcsT0FBTyxDQUFDMUcsT0FBTyxFQUFFO0lBQ3REbkMsTUFBTSxDQUFDaUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNuQjtFQUNBLElBQUk0RyxPQUFPLENBQUNDLGlCQUFpQixFQUFFO0lBQzdCOUksTUFBTSxDQUFDaUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNuQjtFQUNBLElBQUk0RyxPQUFPLENBQUNFLFNBQVMsRUFBRTtJQUNyQi9JLE1BQU0sQ0FBQ2lDLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDbkI7RUFDQSxJQUFJNEcsT0FBTyxDQUFDRyxnQkFBZ0IsRUFBRTtJQUM1QixJQUFJNUUsUUFBUSxHQUFHLEVBQUUsRUFBRTtNQUNqQjNFLGVBQUcsQ0FBQ1EsS0FBSyxDQUFFLDJDQUEwQyxHQUMxQyx5QkFBd0JtRSxRQUFTLGlDQUFnQyxHQUNqRSwyQkFBMEIsQ0FBQztJQUN4QyxDQUFDLE1BQU07TUFDTHBFLE1BQU0sQ0FBQ2lDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkI7RUFDRjtFQUVBLElBQUk0RyxPQUFPLENBQUNJLGNBQWMsRUFBRTtJQUMxQmpKLE1BQU0sQ0FBQ2lDLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDbkI7RUFFQSxPQUFPakMsTUFBTTtBQUNmOztBQWtCQSxTQUFTa0osYUFBYSxDQUFFQyxRQUFRLEVBQUU7RUFDaEMsTUFBTW5KLE1BQU0sR0FBRztJQUNidUUsR0FBRyxFQUFFNEUsUUFBUSxDQUFDQyxPQUFPO0lBQ3JCQyxXQUFXLEVBQUUxSixRQUFRLENBQUN3SixRQUFRLENBQUNFLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDL0NDLFdBQVcsRUFBRUgsUUFBUSxDQUFDRyxXQUFXLElBQUk7RUFDdkMsQ0FBQztFQUNELElBQUksQ0FBQ0gsUUFBUSxDQUFDSSxXQUFXLEVBQUU7SUFDekIsT0FBT3ZKLE1BQU07RUFDZjs7RUFLQSxLQUFLLE1BQU13RSxRQUFRLElBQUksQ0FDckIsR0FBRzJFLFFBQVEsQ0FBQ0ksV0FBVyxDQUFDQyxVQUFVLEVBQ2xDLEdBQUdMLFFBQVEsQ0FBQ0ksV0FBVyxDQUFDRSxlQUFlLENBQ3hDLEVBQUU7SUFDRCxJQUFJakYsUUFBUSxDQUFDa0YsT0FBTyxLQUFLLEtBQUssSUFBSXhNLGVBQUMsQ0FBQ2dCLE9BQU8sQ0FBQ3NHLFFBQVEsQ0FBQ21GLGFBQWEsQ0FBQyxFQUFFO01BQ25FO0lBQ0Y7SUFFQSxLQUFLLE1BQU07TUFBQ0MsT0FBTztNQUFFQztJQUFVLENBQUMsSUFBSXJGLFFBQVEsQ0FBQ21GLGFBQWEsRUFBRTtNQUMxRCxJQUFJek0sZUFBQyxDQUFDZ0IsT0FBTyxDQUFDMEwsT0FBTyxDQUFDLElBQUkxTSxlQUFDLENBQUNnQixPQUFPLENBQUMyTCxVQUFVLENBQUMsRUFBRTtRQUMvQztNQUNGO01BRUEsTUFBTUMsWUFBWSxHQUFHRixPQUFPLENBQUNuRyxJQUFJLENBQUMsQ0FBQztRQUFDc0c7TUFBSSxDQUFDLEtBQUtBLElBQUksS0FBS2pOLFdBQVcsQ0FBQztNQUNuRSxNQUFNa04sa0JBQWtCLEdBQUdILFVBQVUsQ0FBQ3BHLElBQUksQ0FBQyxDQUFDO1FBQUNzRztNQUFJLENBQUMsS0FBS0EsSUFBSSxLQUFLaE4saUJBQWlCLENBQUM7TUFDbEYsSUFBSStNLFlBQVksSUFBSUUsa0JBQWtCLEVBQUU7UUFDdENoSyxNQUFNLENBQUN3RSxRQUFRLEdBQUdBLFFBQVEsQ0FBQ3VGLElBQUk7UUFDL0IsT0FBTy9KLE1BQU07TUFDZjtJQUNGO0VBQ0Y7RUFDQSxPQUFPQSxNQUFNO0FBQ2Y7O0FBWUEsU0FBU2lLLGdCQUFnQixDQUFFQyxTQUFTLEVBQUVDLFlBQVksRUFBRTtFQUNsRCxNQUFNQyxvQkFBb0IsR0FBRyxVQUFVQyxDQUFDLEVBQUU7SUFDeEMsT0FBT0EsQ0FBQyxDQUFDbEksT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQ0EsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7RUFDbkUsQ0FBQztFQUVELE1BQU1tSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLElBQUlDLFVBQVUsR0FBRyxLQUFLO0VBQ3RCLElBQUlDLGlCQUFpQixHQUFHLElBQUk7RUFDNUIsSUFBSUMsZUFBZSxHQUFHLEtBQUs7RUFFM0IsTUFBTUMsbUJBQW1CLEdBQUcsMEJBQTBCO0VBQ3RELEtBQUssTUFBTTVJLElBQUksSUFBSW9JLFNBQVMsQ0FBQ25JLEtBQUssQ0FBQzRJLFdBQUUsQ0FBQ0MsR0FBRyxDQUFDLEVBQUU7SUFDMUMsTUFBTUMsV0FBVyxHQUFHL0ksSUFBSSxDQUFDSSxJQUFJLEVBQUU7SUFDL0IsSUFBSWhGLGVBQUMsQ0FBQ2dCLE9BQU8sQ0FBQzJNLFdBQVcsQ0FBQyxFQUFFO01BQzFCO0lBQ0Y7SUFFQSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUNwSCxJQUFJLENBQUVDLENBQUMsSUFBS21ILFdBQVcsQ0FBQ3pKLFVBQVUsQ0FBQ3NDLENBQUMsQ0FBQyxDQUFDLEVBQUU7TUFDaEY2RyxVQUFVLEdBQUdNLFdBQVcsQ0FBQ3pKLFVBQVUsQ0FBRSxVQUFTK0ksWUFBYSxHQUFFLENBQUM7TUFDOURLLGlCQUFpQixHQUFHLElBQUk7TUFDeEJDLGVBQWUsR0FBRyxLQUFLO01BQ3ZCO0lBQ0Y7SUFFQSxJQUFJLENBQUNGLFVBQVUsRUFBRTtNQUNmO0lBQ0Y7SUFFQSxJQUFJTSxXQUFXLENBQUN6SixVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7TUFDdENxSixlQUFlLEdBQUcsS0FBSztNQUN2QkQsaUJBQWlCLEdBQUcsSUFBSTtNQUV4QixJQUFJSyxXQUFXLENBQUNsSCxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDcEMsTUFBTXBFLEtBQUssR0FBRyxpQkFBaUIsQ0FBQ0MsSUFBSSxDQUFDcUwsV0FBVyxDQUFDO1FBQ2pELElBQUl0TCxLQUFLLEVBQUU7VUFDVGlMLGlCQUFpQixHQUFHakwsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM5QjtNQUNGLENBQUMsTUFBTSxJQUFJc0wsV0FBVyxDQUFDbEgsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQzVDLE1BQU1wRSxLQUFLLEdBQUcsa0JBQWtCLENBQUNDLElBQUksQ0FBQ3FMLFdBQVcsQ0FBQztRQUNsRCxJQUFJdEwsS0FBSyxFQUFFO1VBQ1RpTCxpQkFBaUIsR0FBR2pMLEtBQUssQ0FBQyxDQUFDLENBQUM7VUFDNUJrTCxlQUFlLEdBQUcsSUFBSTtRQUN4QjtNQUNGO01BQ0E7SUFDRjtJQUVBLElBQUlELGlCQUFpQixJQUFJSyxXQUFXLENBQUN6SixVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7TUFDMUQsTUFBTTdCLEtBQUssR0FBR21MLG1CQUFtQixDQUFDbEwsSUFBSSxDQUFDcUwsV0FBVyxDQUFDO01BQ25ELElBQUl0TCxLQUFLLEVBQUU7UUFDVCtLLFVBQVUsQ0FBQ0UsaUJBQWlCLENBQUMsR0FBR0osb0JBQW9CLENBQUM3SyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDaEU7TUFDQWlMLGlCQUFpQixHQUFHLElBQUk7TUFDeEI7SUFDRjtJQUVBLElBQUlBLGlCQUFpQixJQUFJQyxlQUFlLElBQUlJLFdBQVcsQ0FBQ2xILFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtNQUM3RSxNQUFNcEUsS0FBSyxHQUFHbUwsbUJBQW1CLENBQUNsTCxJQUFJLENBQUNxTCxXQUFXLENBQUM7TUFDbkQsSUFBSXRMLEtBQUssRUFBRTtRQUNUK0ssVUFBVSxDQUFDRSxpQkFBaUIsQ0FBQyxHQUFHLENBQzlCLElBQUlGLFVBQVUsQ0FBQ0UsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFDeENKLG9CQUFvQixDQUFDN0ssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQy9CO01BQ0g7TUFDQTtJQUNGO0VBQ0Y7RUFDQSxPQUFPK0ssVUFBVTtBQUNuQjs7QUFZQSxTQUFTUSxpQkFBaUIsQ0FBRVosU0FBUyxFQUFFQyxZQUFZLEVBQUU7RUFDbkQsTUFBTVksUUFBUSxHQUFHYixTQUFTLENBQUNuSSxLQUFLLENBQUM0SSxXQUFFLENBQUNDLEdBQUcsQ0FBQztFQUN4QyxTQUFTSSxjQUFjLENBQUVDLFFBQVEsRUFBRTtJQUNqQyxJQUFJQyxHQUFHLEdBQUdELFFBQVE7SUFDbEIsTUFBTUUsWUFBWSxHQUFHSixRQUFRLENBQUNFLFFBQVEsQ0FBQyxDQUFDN0YsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNwRCxJQUFJK0YsWUFBWSxHQUFHLENBQUMsRUFBRTtNQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFRCxHQUFHLENBQUM7SUFDcEI7SUFDQSxJQUFJbEwsTUFBTSxHQUFHLEVBQUU7SUFDZixPQUFPa0wsR0FBRyxHQUFHSCxRQUFRLENBQUMvSSxNQUFNLEVBQUU7TUFDNUIsTUFBTW9KLG9CQUFvQixHQUFHLElBQUksQ0FBQzVMLElBQUksQ0FBQ3VMLFFBQVEsQ0FBQ0csR0FBRyxDQUFDLENBQUM7TUFDckQsSUFBSUUsb0JBQW9CLEVBQUU7UUFDeEIsTUFBTUMsa0JBQWtCLEdBQUdELG9CQUFvQixDQUFDRSxLQUFLO1FBQ3JELElBQUlMLFFBQVEsS0FBS0MsR0FBRyxFQUFFO1VBQ3BCLE9BQU8sQ0FDTEgsUUFBUSxDQUFDRyxHQUFHLENBQUMsQ0FBQzdGLFNBQVMsQ0FBQzhGLFlBQVksR0FBRyxDQUFDLEVBQUVFLGtCQUFrQixDQUFDLEVBQzdESCxHQUFHLENBQ0o7UUFDSDtRQUNBLE9BQU8sQ0FDSixHQUFFbEwsTUFBTyxNQUFLOUMsZUFBQyxDQUFDcU8sU0FBUyxDQUFDUixRQUFRLENBQUNHLEdBQUcsQ0FBQyxDQUFDN0YsU0FBUyxDQUFDLENBQUMsRUFBRWdHLGtCQUFrQixDQUFDLENBQUUsRUFBQyxFQUM1RUgsR0FBRyxDQUNKO01BQ0g7TUFDQSxJQUFJQSxHQUFHLEdBQUdELFFBQVEsRUFBRTtRQUNsQmpMLE1BQU0sSUFBSyxNQUFLOUMsZUFBQyxDQUFDcU8sU0FBUyxDQUFDUixRQUFRLENBQUNHLEdBQUcsQ0FBQyxDQUFFLEVBQUM7TUFDOUMsQ0FBQyxNQUFNO1FBQ0xsTCxNQUFNLElBQUkrSyxRQUFRLENBQUNHLEdBQUcsQ0FBQyxDQUFDN0YsU0FBUyxDQUFDOEYsWUFBWSxHQUFHLENBQUMsQ0FBQztNQUNyRDtNQUNBLEVBQUVELEdBQUc7SUFDUDtJQUNBLE9BQU8sQ0FBQ2xMLE1BQU0sRUFBRWtMLEdBQUcsQ0FBQztFQUN0QjtFQUVBLE1BQU1aLFVBQVUsR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSUUsaUJBQWlCLEdBQUcsSUFBSTtFQUM1QixJQUFJQyxlQUFlLEdBQUcsS0FBSztFQUMzQixJQUFJZSxpQkFBaUIsR0FBRyxLQUFLO0VBQzdCLElBQUlDLFNBQVMsR0FBRyxDQUFDO0VBQ2pCLE9BQU9BLFNBQVMsR0FBR1YsUUFBUSxDQUFDL0ksTUFBTSxFQUFFO0lBQ2xDLE1BQU02SSxXQUFXLEdBQUdFLFFBQVEsQ0FBQ1UsU0FBUyxDQUFDLENBQUN2SixJQUFJLEVBQUU7SUFDOUMsSUFBSWhGLGVBQUMsQ0FBQ2dCLE9BQU8sQ0FBQzJNLFdBQVcsQ0FBQyxFQUFFO01BQzFCLEVBQUVZLFNBQVM7TUFDWDtJQUNGO0lBRUEsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQ2hJLElBQUksQ0FBRUMsQ0FBQyxJQUFLbUgsV0FBVyxDQUFDekosVUFBVSxDQUFDc0MsQ0FBQyxDQUFDLENBQUMsRUFBRTtNQUM5RDhHLGlCQUFpQixHQUFHLElBQUk7TUFDeEJDLGVBQWUsR0FBRyxLQUFLO01BQ3ZCZSxpQkFBaUIsR0FBRyxLQUFLO01BQ3pCLEVBQUVDLFNBQVM7TUFDWDtJQUNGO0lBRUEsSUFBSVosV0FBVyxDQUFDekosVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO01BQ3RDcUosZUFBZSxHQUFHLEtBQUs7TUFDdkJELGlCQUFpQixHQUFHLElBQUk7TUFDeEJnQixpQkFBaUIsR0FBRyxLQUFLO01BRXpCLElBQUlYLFdBQVcsQ0FBQ2xILFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNuQyxNQUFNcEUsS0FBSyxHQUFHLGVBQWUsQ0FBQ0MsSUFBSSxDQUFDcUwsV0FBVyxDQUFDO1FBQy9DLElBQUl0TCxLQUFLLEVBQUU7VUFDVGlMLGlCQUFpQixHQUFHakwsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM5QjtNQUNGLENBQUMsTUFBTSxJQUFJc0wsV0FBVyxDQUFDbEgsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzNDLE1BQU1wRSxLQUFLLEdBQUcsZ0JBQWdCLENBQUNDLElBQUksQ0FBQ3FMLFdBQVcsQ0FBQztRQUNoRCxJQUFJdEwsS0FBSyxFQUFFO1VBQ1RpTCxpQkFBaUIsR0FBR2pMLEtBQUssQ0FBQyxDQUFDLENBQUM7VUFDNUJrTCxlQUFlLEdBQUcsSUFBSTtRQUN4QjtNQUNGO01BQ0EsRUFBRWdCLFNBQVM7TUFDWDtJQUNGO0lBRUEsSUFBSWpCLGlCQUFpQixFQUFFO01BQ3JCLElBQUlDLGVBQWUsRUFBRTtRQUNuQixJQUFJSSxXQUFXLENBQUN6SixVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7VUFDL0JvSyxpQkFBaUIsR0FBR1gsV0FBVyxDQUFDekosVUFBVSxDQUFFLElBQUcrSSxZQUFhLEdBQUUsQ0FBQztVQUMvRCxFQUFFc0IsU0FBUztVQUNYO1FBQ0Y7UUFDQSxJQUFJRCxpQkFBaUIsRUFBRTtVQUNyQixNQUFNLENBQUNFLE9BQU8sRUFBRVIsR0FBRyxDQUFDLEdBQUdGLGNBQWMsQ0FBQ1MsU0FBUyxDQUFDO1VBQ2hEQSxTQUFTLEdBQUdQLEdBQUc7VUFDZixJQUFJaE8sZUFBQyxDQUFDeU8sUUFBUSxDQUFDRCxPQUFPLENBQUMsRUFBRTtZQUN2QnBCLFVBQVUsQ0FBQ0UsaUJBQWlCLENBQUMsR0FBRyxDQUM5QixJQUFJRixVQUFVLENBQUNFLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQ3hDa0IsT0FBTyxDQUNSO1VBQ0g7UUFDRjtNQUNGLENBQUMsTUFBTSxJQUFJYixXQUFXLENBQUN6SixVQUFVLENBQUUsSUFBRytJLFlBQWEsR0FBRSxDQUFDLEVBQUU7UUFDdEQsTUFBTSxDQUFDdUIsT0FBTyxFQUFFUixHQUFHLENBQUMsR0FBR0YsY0FBYyxDQUFDUyxTQUFTLENBQUM7UUFDaERBLFNBQVMsR0FBR1AsR0FBRztRQUNmLElBQUloTyxlQUFDLENBQUN5TyxRQUFRLENBQUNELE9BQU8sQ0FBQyxFQUFFO1VBQ3ZCcEIsVUFBVSxDQUFDRSxpQkFBaUIsQ0FBQyxHQUFHa0IsT0FBTztRQUN6QztRQUNBbEIsaUJBQWlCLEdBQUcsSUFBSTtNQUMxQjtJQUNGO0lBQ0EsRUFBRWlCLFNBQVM7RUFDYjtFQUNBLE9BQU9uQixVQUFVO0FBQ25COztBQVlBLGVBQWVzQixrQkFBa0IsQ0FBRUMsYUFBYSxFQUFFQyxhQUFhLEVBQUVDLGFBQWEsRUFBRTtFQUM5RSxJQUFJNUIsWUFBWSxHQUFHMkIsYUFBYSxJQUFJQyxhQUFhO0VBQ2pELElBQUk1QixZQUFZLENBQUN4RyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQ3dHLFlBQVksQ0FBQ3hHLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUM5RHdHLFlBQVksR0FBR0EsWUFBWSxDQUFDaEksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUM7RUFDaEQ7RUFDQSxNQUFNNkosT0FBTyxHQUFHLE1BQU1ILGFBQWEsRUFBRTtFQUNyQ3BNLGVBQUcsQ0FBQ1EsS0FBSyxDQUFFLDRCQUEyQkMsSUFBSSxDQUFDQyxTQUFTLENBQUM2TCxPQUFPLENBQUUsRUFBQyxDQUFDO0VBRWhFLElBQUk3QixZQUFZLENBQUM4QixXQUFXLEVBQUUsQ0FBQzdLLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFDMUMsQ0FBQzRLLE9BQU8sQ0FBQ3ZJLElBQUksQ0FBRUMsQ0FBQyxJQUFLQSxDQUFDLENBQUN4QixJQUFJLEVBQUUsS0FBS2lJLFlBQVksQ0FBQyxFQUFFO0lBQ3BEMUssZUFBRyxDQUFDUSxLQUFLLENBQUUsZ0NBQStCa0ssWUFBYSxnQkFBZSxHQUNuRSxzQkFBcUI0QixhQUFjLEdBQUUsQ0FBQztJQUN6QzVCLFlBQVksR0FBRzRCLGFBQWE7RUFDOUIsQ0FBQyxNQUFNO0lBQ0x0TSxlQUFHLENBQUNRLEtBQUssQ0FBRSw0QkFBMkJrSyxZQUFhLEdBQUUsQ0FBQztFQUN4RDtFQUNBLE9BQU9BLFlBQVk7QUFDckI7O0FBYUEsU0FBUytCLGFBQWEsQ0FBRUMsTUFBTSxFQUFFQyxVQUFVLEVBQUU7RUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQ3ZJLElBQUksQ0FBQ3NJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDdEksSUFBSSxDQUFDc0ksTUFBTSxDQUFDLEVBQUU7SUFDN0QxTSxlQUFHLENBQUNRLEtBQUssQ0FBQ2tNLE1BQU0sQ0FBQztJQUNqQixNQUFNLElBQUkzTyxLQUFLLENBQUUsbUJBQWtCNE8sVUFBVyxvQkFBbUIsR0FDL0QsdUNBQXVDLENBQUM7RUFDNUM7RUFDQSxNQUFNN00sS0FBSyxHQUFHLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDMk0sTUFBTSxDQUFDO0VBQ3pDLElBQUksQ0FBQzVNLEtBQUssRUFBRTtJQUNWRSxlQUFHLENBQUNRLEtBQUssQ0FBQ2tNLE1BQU0sQ0FBQztJQUNqQixNQUFNLElBQUkzTyxLQUFLLENBQUUsZ0JBQWU0TyxVQUFXLDRCQUEyQixHQUNwRSx1Q0FBdUMsQ0FBQztFQUM1QztFQUNBLE1BQU1DLE9BQU8sR0FBR25QLGVBQUMsQ0FBQ2dGLElBQUksQ0FBQzNDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDNEMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7RUFDMUQsSUFBSTtJQUNGLE9BQU9qQyxJQUFJLENBQUNvTSxLQUFLLENBQUNELE9BQU8sQ0FBQztFQUM1QixDQUFDLENBQUMsT0FBT0UsQ0FBQyxFQUFFO0lBQ1Y5TSxlQUFHLENBQUNRLEtBQUssQ0FBQ29NLE9BQU8sQ0FBQztJQUNsQixNQUFNLElBQUk3TyxLQUFLLENBQUUsZ0JBQWU0TyxVQUFXLG1DQUFrQyxHQUMzRSx1Q0FBdUMsQ0FBQztFQUM1QztBQUNGOztBQVdBLFNBQVNJLGVBQWUsQ0FBRUMsUUFBUSxFQUFFQyxPQUFPLEVBQUU7RUFDM0MsTUFBTTFNLE1BQU0sR0FBRyxFQUFFO0VBQ2pCLElBQUl5TSxRQUFRLElBQUl2UCxlQUFDLENBQUN5TyxRQUFRLENBQUNjLFFBQVEsQ0FBQyxFQUFFO0lBQ3BDek0sTUFBTSxDQUFDaUMsSUFBSSxDQUFDLE9BQU8sRUFBRyx3QkFBdUJ3SyxRQUFRLENBQUNSLFdBQVcsRUFBRyxFQUFDLENBQUM7RUFDeEU7RUFDQSxJQUFJUyxPQUFPLElBQUl4UCxlQUFDLENBQUN5TyxRQUFRLENBQUNlLE9BQU8sQ0FBQyxFQUFFO0lBQ2xDMU0sTUFBTSxDQUFDaUMsSUFBSSxDQUFDLE9BQU8sRUFBRyx1QkFBc0J5SyxPQUFPLENBQUNDLFdBQVcsRUFBRyxFQUFDLENBQUM7RUFDdEU7RUFDQSxJQUFJQyxNQUFNO0VBQ1YsSUFBSTFQLGVBQUMsQ0FBQ3lPLFFBQVEsQ0FBQ2MsUUFBUSxDQUFDLElBQUl2UCxlQUFDLENBQUN5TyxRQUFRLENBQUNlLE9BQU8sQ0FBQyxJQUFJRCxRQUFRLElBQUlDLE9BQU8sRUFBRTtJQUN0RUUsTUFBTSxHQUFHSCxRQUFRLENBQUNSLFdBQVcsRUFBRSxHQUFHLEdBQUcsR0FBR1MsT0FBTyxDQUFDQyxXQUFXLEVBQUU7RUFDL0QsQ0FBQyxNQUFNLElBQUlGLFFBQVEsSUFBSXZQLGVBQUMsQ0FBQ3lPLFFBQVEsQ0FBQ2MsUUFBUSxDQUFDLEVBQUU7SUFDM0NHLE1BQU0sR0FBR0gsUUFBUSxDQUFDUixXQUFXLEVBQUU7RUFDakMsQ0FBQyxNQUFNLElBQUlTLE9BQU8sSUFBSXhQLGVBQUMsQ0FBQ3lPLFFBQVEsQ0FBQ2UsT0FBTyxDQUFDLEVBQUU7SUFDekNFLE1BQU0sR0FBR0YsT0FBTztFQUNsQjtFQUNBLElBQUlFLE1BQU0sRUFBRTtJQUNWNU0sTUFBTSxDQUFDaUMsSUFBSSxDQUFDLE9BQU8sRUFBRyxzQkFBcUIySyxNQUFPLEVBQUMsQ0FBQztFQUN0RDtFQUNBLE9BQU81TSxNQUFNO0FBQ2Y7O0FBT0EsZUFBZTZNLG1CQUFtQixHQUFJO0VBQ3BDLElBQUlDLFFBQVEsR0FBR3BQLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDb1AscUJBQXFCO0VBQ2hELElBQUksTUFBTUMsU0FBUyxDQUFDRixRQUFRLENBQUMsRUFBRTtJQUM3QixPQUFPQSxRQUFRO0VBQ2pCO0VBRUEsSUFBSUEsUUFBUSxFQUFFO0lBQ1pyTixlQUFHLENBQUNDLElBQUksQ0FBRSxnRUFBK0RvTixRQUFTLGdDQUErQixDQUFDO0VBQ3BIO0VBRUEsTUFBTUcsSUFBSSxHQUFHdlAsT0FBTyxDQUFDQyxHQUFHLENBQUN1UCxJQUFJLElBQUl4UCxPQUFPLENBQUNDLEdBQUcsQ0FBQ3dQLFdBQVc7RUFDeEQsSUFBSUYsSUFBSSxFQUFFO0lBQ1JILFFBQVEsR0FBR2xPLGFBQUksQ0FBQ0MsT0FBTyxDQUFDb08sSUFBSSxFQUFFLFVBQVUsQ0FBQztFQUMzQztFQUVBLElBQUksRUFBQyxNQUFNRCxTQUFTLENBQUNGLFFBQVEsQ0FBQyxHQUFFO0lBQzlCck4sZUFBRyxDQUFDUSxLQUFLLENBQUUsd0JBQXVCNk0sUUFBUyxnQ0FBK0IsQ0FBQztJQUMzRSxPQUFPLElBQUk7RUFDYjtFQUVBLE9BQU9BLFFBQVE7QUFDakI7O0FBUUEsZUFBZUUsU0FBUyxDQUFFRixRQUFRLEVBQUU7RUFDbEMsT0FBT0EsUUFBUSxLQUNWLE1BQU0zTyxXQUFFLENBQUNDLE1BQU0sQ0FBQzBPLFFBQVEsQ0FBQyxLQUN6QixDQUFDLE1BQU0zTyxXQUFFLENBQUNHLElBQUksQ0FBQ3dPLFFBQVEsQ0FBQyxFQUFFdk8sV0FBVyxFQUFFO0FBQzlDOztBQVlBLFNBQVM2TyxjQUFjLENBQUVDLEdBQUcsRUFBRTtFQUM1QkEsR0FBRyxHQUFJLEdBQUVBLEdBQUksRUFBQztFQUNkLElBQUl6SyxlQUFNLENBQUNDLFNBQVMsRUFBRSxFQUFFO0lBQ3RCLE9BQU8sU0FBUyxDQUFDZ0IsSUFBSSxDQUFDd0osR0FBRyxDQUFDLEdBQUksSUFBR0EsR0FBRyxDQUFDbEwsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUUsR0FBRSxHQUFHa0wsR0FBRztFQUNuRTtFQUNBLE9BQU9BLEdBQUcsQ0FBQ2xMLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ2pDOztBQWVBLFNBQVNtTCw0QkFBNEIsQ0FBRTlKLE9BQU8sRUFBRTtFQUM5QyxNQUFNK0osa0JBQWtCLEdBQUcsSUFBSXRILE1BQU0sQ0FBRSxRQUFPL0ksZUFBQyxDQUFDdUssWUFBWSxDQUFDM0ssV0FBVyxDQUFFLElBQUcsQ0FBQztFQUM5RSxNQUFNMFEsY0FBYyxHQUFHLHVDQUF1QztFQUM5RCxNQUFNQyxNQUFNLEdBQUcsRUFBRTtFQUNqQixJQUFJQyxnQkFBZ0I7RUFDcEIsSUFBSUMsS0FBSyxHQUFHLEVBQUU7RUFDZCxLQUFLLE1BQU03TCxJQUFJLElBQUkwQixPQUFPLENBQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUN3RSxHQUFHLENBQUNySixlQUFDLENBQUMwUSxPQUFPLENBQUMsRUFBRTtJQUNyRCxNQUFNMUYsYUFBYSxHQUFHcEcsSUFBSSxDQUFDRSxNQUFNLEdBQUc5RSxlQUFDLENBQUNxTyxTQUFTLENBQUN6SixJQUFJLENBQUMsQ0FBQ0UsTUFBTTtJQUM1RCxJQUFJdUwsa0JBQWtCLENBQUMxSixJQUFJLENBQUMvQixJQUFJLENBQUMsRUFBRTtNQUNqQzRMLGdCQUFnQixHQUFHeEYsYUFBYTtNQUNoQyxJQUFJLENBQUNoTCxlQUFDLENBQUNnQixPQUFPLENBQUN5UCxLQUFLLENBQUMsRUFBRTtRQUNyQkYsTUFBTSxDQUFDeEwsSUFBSSxDQUFDMEwsS0FBSyxDQUFDO1FBQ2xCQSxLQUFLLEdBQUcsRUFBRTtNQUNaO01BQ0E7SUFDRjtJQUNBLElBQUl6USxlQUFDLENBQUMyUSxLQUFLLENBQUNILGdCQUFnQixDQUFDLEVBQUU7TUFDN0I7SUFDRjtJQUVBLElBQUl4RixhQUFhLEdBQUd3RixnQkFBZ0IsRUFBRTtNQUNwQ0MsS0FBSyxDQUFDMUwsSUFBSSxDQUFDSCxJQUFJLENBQUM7SUFDbEIsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDNUUsZUFBQyxDQUFDZ0IsT0FBTyxDQUFDeVAsS0FBSyxDQUFDLEVBQUU7UUFDckJGLE1BQU0sQ0FBQ3hMLElBQUksQ0FBQzBMLEtBQUssQ0FBQztRQUNsQkEsS0FBSyxHQUFHLEVBQUU7TUFDWjtNQUNBRCxnQkFBZ0IsR0FBRyxJQUFJO0lBQ3pCO0VBQ0Y7RUFDQSxJQUFJLENBQUN4USxlQUFDLENBQUNnQixPQUFPLENBQUN5UCxLQUFLLENBQUMsRUFBRTtJQUNyQkYsTUFBTSxDQUFDeEwsSUFBSSxDQUFDMEwsS0FBSyxDQUFDO0VBQ3BCO0VBRUEsTUFBTTNOLE1BQU0sR0FBRyxFQUFFO0VBQ2pCLEtBQUssTUFBTW9JLElBQUksSUFBSXFGLE1BQU0sRUFBRTtJQUN6QixJQUFJSyxXQUFXLEdBQUcsS0FBSztJQUN2QixJQUFJOUQsa0JBQWtCLEdBQUcsS0FBSztJQUM5QixLQUFLLE1BQU1sSSxJQUFJLElBQUlzRyxJQUFJLEVBQUU7TUFDdkIsTUFBTTdJLEtBQUssR0FBR2lPLGNBQWMsQ0FBQ2hPLElBQUksQ0FBQ3NDLElBQUksQ0FBQztNQUN2QyxJQUFJLENBQUN2QyxLQUFLLEVBQUU7UUFDVjtNQUNGO01BRUF1TyxXQUFXLEdBQUcsSUFBSTtNQUNsQjlELGtCQUFrQixHQUFHekssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLeEMsaUJBQWlCO01BQ25EO0lBQ0Y7SUFJQSxJQUFJK1EsV0FBVyxJQUFJLENBQUM5RCxrQkFBa0IsRUFBRTtNQUN0QztJQUNGO0lBRUEsS0FBSyxNQUFNK0QsZUFBZSxJQUFJM0YsSUFBSSxDQUFDN0IsR0FBRyxDQUFDckosZUFBQyxDQUFDZ0YsSUFBSSxDQUFDLENBQUN1RyxNQUFNLENBQUN1RixPQUFPLENBQUMsRUFBRTtNQUM5RCxNQUFNQyxjQUFjLEdBQUdGLGVBQWUsQ0FBQ2hNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDdEQsSUFBSSxDQUFDbU0sa0JBQWtCLENBQUNELGNBQWMsQ0FBQyxFQUFFO1FBQ3ZDO01BQ0Y7TUFFQSxJQUFJakUsa0JBQWtCLEVBQUU7UUFDdEIsT0FBTyxDQUFDaUUsY0FBYyxDQUFDO01BQ3pCO01BQ0FqTyxNQUFNLENBQUNpQyxJQUFJLENBQUNnTSxjQUFjLENBQUM7SUFDN0I7RUFDRjtFQUNBLE9BQU9qTyxNQUFNO0FBQ2Y7O0FBU0EsU0FBU2tPLGtCQUFrQixDQUFFQyxXQUFXLEVBQUU7RUFFeEMsT0FBTyxpQkFBaUIsQ0FBQzNPLElBQUksQ0FBQzJPLFdBQVcsQ0FBQztBQUM1QyJ9