obsidian-integration-testing 8.3.0 → 9.0.0

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 (97) hide show
  1. package/README.md +52 -11
  2. package/dist/lib/cjs/asar-fallback-detection.cjs +48 -0
  3. package/dist/lib/cjs/asar-fallback-detection.d.cts +75 -0
  4. package/dist/lib/cjs/avd-list.cjs +36 -0
  5. package/dist/lib/cjs/avd-list.d.cts +38 -0
  6. package/dist/lib/cjs/compatibility-options.cjs +18 -1
  7. package/dist/lib/cjs/compatibility-options.d.cts +41 -0
  8. package/dist/lib/cjs/connect-to-cdp.cjs +17 -18
  9. package/dist/lib/cjs/connect-to-cdp.d.cts +25 -0
  10. package/dist/lib/cjs/demo-vault-tree.cjs +52 -0
  11. package/dist/lib/cjs/demo-vault-tree.d.cts +34 -0
  12. package/dist/lib/cjs/ecmascript-version.cjs +63 -0
  13. package/dist/lib/cjs/ecmascript-version.d.cts +28 -0
  14. package/dist/lib/cjs/global-setup-core.cjs +44 -27
  15. package/dist/lib/cjs/global-setup-core.d.cts +15 -3
  16. package/dist/lib/cjs/index.cjs +10 -1
  17. package/dist/lib/cjs/index.d.cts +7 -1
  18. package/dist/lib/cjs/installer-asset.cjs +18 -3
  19. package/dist/lib/cjs/installer-asset.d.cts +26 -0
  20. package/dist/lib/cjs/jest/global-setup-no-plugin.cjs +41 -0
  21. package/dist/lib/cjs/jest/global-setup-no-plugin.d.cts +26 -0
  22. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  23. package/dist/lib/cjs/jest/global-setup.d.cts +11 -1
  24. package/dist/lib/cjs/jest/global-teardown-no-plugin.cjs +26 -0
  25. package/dist/lib/cjs/jest/global-teardown-no-plugin.d.cts +11 -0
  26. package/dist/lib/cjs/library.cjs +1 -1
  27. package/dist/lib/cjs/namespace-bootstrap.cjs +44 -7
  28. package/dist/lib/cjs/normalize-optional-properties.cjs +31 -0
  29. package/dist/lib/cjs/normalize-optional-properties.d.cts +26 -0
  30. package/dist/lib/cjs/obsidian-installer.cjs +6 -1
  31. package/dist/lib/cjs/obsidian-metadata.cjs +3775 -302
  32. package/dist/lib/cjs/obsidian-metadata.d.cts +71 -0
  33. package/dist/lib/cjs/obsidian-version-switch.cjs +5 -2
  34. package/dist/lib/cjs/owned-vault-seed.cjs +38 -0
  35. package/dist/lib/cjs/owned-vault-seed.d.cts +67 -0
  36. package/dist/lib/cjs/process-exit-message.cjs +47 -0
  37. package/dist/lib/cjs/process-exit-message.d.cts +48 -0
  38. package/dist/lib/cjs/silent-asar-fallback-error.cjs +48 -0
  39. package/dist/lib/cjs/silent-asar-fallback-error.d.cts +40 -0
  40. package/dist/lib/cjs/transport-desktop-cdp.cjs +197 -73
  41. package/dist/lib/cjs/transport-desktop-cdp.d.cts +74 -15
  42. package/dist/lib/cjs/transport-factory.cjs +135 -34
  43. package/dist/lib/cjs/transport-options.cjs +1 -1
  44. package/dist/lib/cjs/transport-options.d.cts +16 -0
  45. package/dist/lib/cjs/vitest/global-setup-no-plugin.cjs +37 -0
  46. package/dist/lib/cjs/vitest/global-setup-no-plugin.d.cts +26 -0
  47. package/dist/lib/cjs/vitest/global-setup.cjs +2 -2
  48. package/dist/lib/cjs/vitest/global-setup.d.cts +11 -1
  49. package/dist/lib/esm/asar-fallback-detection.d.mts +75 -0
  50. package/dist/lib/esm/asar-fallback-detection.mjs +24 -0
  51. package/dist/lib/esm/avd-list.d.mts +38 -0
  52. package/dist/lib/esm/avd-list.mjs +11 -0
  53. package/dist/lib/esm/compatibility-options.d.mts +41 -0
  54. package/dist/lib/esm/compatibility-options.mjs +16 -1
  55. package/dist/lib/esm/connect-to-cdp.d.mts +25 -0
  56. package/dist/lib/esm/connect-to-cdp.mjs +17 -18
  57. package/dist/lib/esm/demo-vault-tree.d.mts +34 -0
  58. package/dist/lib/esm/demo-vault-tree.mjs +35 -0
  59. package/dist/lib/esm/ecmascript-version.d.mts +28 -0
  60. package/dist/lib/esm/ecmascript-version.mjs +39 -0
  61. package/dist/lib/esm/global-setup-core.d.mts +15 -3
  62. package/dist/lib/esm/global-setup-core.mjs +44 -27
  63. package/dist/lib/esm/index.d.mts +7 -1
  64. package/dist/lib/esm/index.mjs +7 -1
  65. package/dist/lib/esm/installer-asset.d.mts +26 -0
  66. package/dist/lib/esm/installer-asset.mjs +16 -2
  67. package/dist/lib/esm/jest/global-setup-no-plugin.d.mts +26 -0
  68. package/dist/lib/esm/jest/global-setup-no-plugin.mjs +17 -0
  69. package/dist/lib/esm/jest/global-setup.d.mts +11 -1
  70. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  71. package/dist/lib/esm/jest/global-teardown-no-plugin.d.mts +11 -0
  72. package/dist/lib/esm/jest/global-teardown-no-plugin.mjs +6 -0
  73. package/dist/lib/esm/library.mjs +1 -1
  74. package/dist/lib/esm/namespace-bootstrap.mjs +44 -7
  75. package/dist/lib/esm/normalize-optional-properties.d.mts +26 -0
  76. package/dist/lib/esm/normalize-optional-properties.mjs +7 -0
  77. package/dist/lib/esm/obsidian-installer.mjs +8 -2
  78. package/dist/lib/esm/obsidian-metadata.d.mts +71 -0
  79. package/dist/lib/esm/obsidian-metadata.mjs +3775 -302
  80. package/dist/lib/esm/obsidian-version-switch.mjs +5 -2
  81. package/dist/lib/esm/owned-vault-seed.d.mts +67 -0
  82. package/dist/lib/esm/owned-vault-seed.mjs +14 -0
  83. package/dist/lib/esm/process-exit-message.d.mts +48 -0
  84. package/dist/lib/esm/process-exit-message.mjs +23 -0
  85. package/dist/lib/esm/silent-asar-fallback-error.d.mts +40 -0
  86. package/dist/lib/esm/silent-asar-fallback-error.mjs +24 -0
  87. package/dist/lib/esm/transport-desktop-cdp.d.mts +74 -15
  88. package/dist/lib/esm/transport-desktop-cdp.mjs +197 -73
  89. package/dist/lib/esm/transport-factory.mjs +139 -34
  90. package/dist/lib/esm/transport-options.d.mts +16 -0
  91. package/dist/lib/esm/vitest/global-setup-no-plugin.d.mts +26 -0
  92. package/dist/lib/esm/vitest/global-setup-no-plugin.mjs +11 -0
  93. package/dist/lib/esm/vitest/global-setup.d.mts +11 -1
  94. package/dist/lib/esm/vitest/global-setup.mjs +2 -2
  95. package/dist/obsidian-integration-testing-9.0.0.tgz +0 -0
  96. package/package.json +40 -8
  97. package/dist/obsidian-integration-testing-8.3.0.tgz +0 -0
@@ -23,9 +23,14 @@ import {
23
23
  resolveAppiumStartTimeoutInMilliseconds,
24
24
  resolveSessionConnectionRetryTimeoutInMilliseconds
25
25
  } from "./appium-session-config.mjs";
26
+ import {
27
+ checkAvdExists,
28
+ listAvailableAvds
29
+ } from "./avd-list.mjs";
26
30
  import {
27
31
  resolveInstallerCompatibilityAction,
28
32
  resolveShouldThrowOnIncompatibleInstaller,
33
+ resolveShouldThrowOnSilentAsarFallback,
29
34
  resolveShouldWarnOnCompatibilityIssues
30
35
  } from "./compatibility-options.mjs";
31
36
  import {
@@ -38,6 +43,7 @@ import { IncompatibleInstallerVersionError } from "./incompatible-installer-vers
38
43
  import { checkInstallerCompatibility } from "./installer-compatibility.mjs";
39
44
  import { killProcessTree } from "./kill-process-tree.mjs";
40
45
  import { log } from "./log.mjs";
46
+ import { normalizeOptionalProperties } from "./normalize-optional-properties.mjs";
41
47
  import { getObsidianConfigDir } from "./obsidian-config.mjs";
42
48
  import { resolveObsidianExecutable } from "./obsidian-executable.mjs";
43
49
  import {
@@ -51,6 +57,7 @@ import {
51
57
  resolveConcreteVersion
52
58
  } from "./obsidian-version-switch.mjs";
53
59
  import { compareVersions } from "./obsidian-version.mjs";
60
+ import { buildProcessExitMessage } from "./process-exit-message.mjs";
54
61
  import { resolveDeadBootGraceInMilliseconds } from "./renderer-boot-detection.mjs";
55
62
  import {
56
63
  resolveAppiumSpawnFlags,
@@ -67,6 +74,7 @@ const APP_PACKAGE = "md.obsidian";
67
74
  const APP_ACTIVITY = `${APP_PACKAGE}.MainActivity`;
68
75
  const ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS = 5e3;
69
76
  const APPIUM_CONNECTION_RETRY_COUNT = 3;
77
+ const APPIUM_OUTPUT_TAIL_MAX_LENGTH = 8e3;
70
78
  const APPIUM_PREFLIGHT_TIMEOUT_IN_MILLISECONDS = 5e3;
71
79
  const APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS = 500;
72
80
  const OWNED_USER_DATA_PREFIX = "userdata-";
@@ -76,6 +84,7 @@ const DEFAULT_TRANSPORT_TYPE = "obsidian-cdp";
76
84
  const DEVICE_IDLE_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
77
85
  const EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
78
86
  const EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS = 12e4;
87
+ const EMULATOR_LIST_TIMEOUT_IN_MILLISECONDS = 1e4;
79
88
  const EMULATOR_OUTPUT_TAIL_MAX_LENGTH = 8e3;
80
89
  const KEYCODE_MENU = 82;
81
90
  const KEYCODE_WAKEUP = 224;
@@ -280,7 +289,52 @@ class AppiumTransportFactory {
280
289
  }
281
290
  this.log("Appium is not installed. Installing globally via `npm install -g appium`...");
282
291
  await exec("npm install -g appium");
283
- this.log("Appium installed.");
292
+ const verify = await exec("npx --no-install appium --version", {
293
+ isQuiet: true,
294
+ shouldIgnoreExitCode: true,
295
+ shouldIncludeDetails: true
296
+ });
297
+ if (verify.exitCode !== 0) {
298
+ throw new Error(
299
+ "Appium was installed via `npm install -g appium` but is still not resolvable via `npx --no-install appium`. The npm global bin directory (see `npm config get prefix`) is likely not on PATH. Add it to PATH, or set `shouldAutoInstallAppiumDependencies: false` and install/manage Appium yourself."
300
+ );
301
+ }
302
+ this.log(`Appium installed (version ${verify.stdout.trim() || "unknown"}).`);
303
+ }
304
+ /**
305
+ * Fails fast when the requested AVD does not exist, before an emulator is
306
+ * spawned.
307
+ *
308
+ * Without this preflight a missing AVD name is only discovered after
309
+ * {@link startEmulator} spawns `emulator -avd <name>` and the boot never
310
+ * completes — a full {@link EMULATOR_BOOT_TIMEOUT_IN_MILLISECONDS} spin ending
311
+ * in a generic "no new device appeared". Instead this lists the configured
312
+ * AVDs up front and throws an actionable error naming the available ones. AVD
313
+ * creation is deliberately not automated (it requires a system-image download,
314
+ * license acceptance, and hardware/API-level choices).
315
+ *
316
+ * @param avdName - The requested AVD name.
317
+ */
318
+ async ensureAvdExists(avdName) {
319
+ const emulatorBinary = this.resolveEmulatorBinary();
320
+ this.log(`Verifying AVD "${avdName}" exists (${emulatorBinary} -list-avds)...`);
321
+ const [error, stdout] = await new Promise((resolve) => {
322
+ execFile(emulatorBinary, ["-list-avds"], { timeout: EMULATOR_LIST_TIMEOUT_IN_MILLISECONDS }, (execError, execStdout) => {
323
+ resolve([execError, execStdout]);
324
+ });
325
+ });
326
+ if (error) {
327
+ throw new Error(
328
+ `Failed to list AVDs via \`${emulatorBinary} -list-avds\`: ${error.message}. Is the Android SDK emulator installed and ANDROID_HOME/ANDROID_SDK_ROOT correct?`
329
+ );
330
+ }
331
+ if (!checkAvdExists({ avdListOutput: stdout, avdName })) {
332
+ const available = listAvailableAvds(stdout);
333
+ throw new Error(
334
+ `Android AVD "${avdName}" not found. Available AVDs: ${available.length > 0 ? available.join(", ") : "(none)"}. Create it (e.g. in the Android Studio Device Manager, or via \`avdmanager create avd\`), or set \`avdName\` to an existing AVD.`
335
+ );
336
+ }
337
+ this.log(`AVD "${avdName}" exists.`);
284
338
  }
285
339
  async ensureDeviceConnected(params) {
286
340
  const { avdName, deviceIdleTimeoutInMilliseconds, isEmulatorVisible } = params;
@@ -293,6 +347,7 @@ class AppiumTransportFactory {
293
347
  return { actualDeviceId: existingDeviceId };
294
348
  }
295
349
  this.log(`AVD "${avdName}" not found on any existing device, starting a new emulator...`);
350
+ await this.ensureAvdExists(avdName);
296
351
  const emulator = this.startEmulator(avdName, isEmulatorVisible);
297
352
  let actualDeviceId;
298
353
  try {
@@ -418,17 +473,18 @@ class AppiumTransportFactory {
418
473
  }
419
474
  needsAppiumStart = true;
420
475
  }
421
- let appiumProcess;
476
+ let appiumLaunch;
422
477
  if (needsAppiumStart) {
423
478
  if (shouldAutoInstallAppiumDependencies) {
424
479
  await this.ensureAppiumDependencies();
425
480
  }
426
481
  this.log(`Appium not reachable, auto-starting on port ${String(port)}...`);
427
- appiumProcess = this.startAppiumServer(port, isAppiumConsoleVisible);
482
+ appiumLaunch = this.startAppiumServer(port, isAppiumConsoleVisible);
428
483
  }
484
+ const appiumProcess = appiumLaunch?.process;
429
485
  try {
430
486
  const [, deviceResult] = await Promise.all([
431
- needsAppiumStart ? this.waitForAppiumReady(appiumUrl, appiumStartTimeoutInMilliseconds).then(() => {
487
+ appiumLaunch ? this.waitForAppiumReady(appiumUrl, appiumStartTimeoutInMilliseconds, appiumLaunch).then(() => {
432
488
  this.log("Auto-started Appium server is ready.");
433
489
  }) : Promise.resolve(),
434
490
  this.ensureDeviceConnected({ avdName, deviceIdleTimeoutInMilliseconds, isEmulatorVisible })
@@ -449,14 +505,38 @@ class AppiumTransportFactory {
449
505
  startAppiumServer(port, isAppiumConsoleVisible) {
450
506
  const isConsoleHidden = shouldHideAppiumConsole(isAppiumConsoleVisible);
451
507
  const { detached, windowsHide } = resolveAppiumSpawnFlags(isConsoleHidden);
452
- const child = spawn(`npx appium --log-timestamp --port ${String(port)} --allow-insecure=${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}`, {
508
+ const child = spawn(`npx --no-install appium --log-timestamp --port ${String(port)} --allow-insecure=${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}`, {
453
509
  detached,
454
510
  shell: true,
455
- stdio: isConsoleHidden ? "ignore" : ["ignore", "inherit", "inherit"],
511
+ stdio: isConsoleHidden ? ["ignore", "pipe", "pipe"] : ["ignore", "inherit", "inherit"],
456
512
  windowsHide
457
513
  });
514
+ let capturedOutput = "";
515
+ let exitInfo;
516
+ let isCapturing = true;
517
+ child.stdout?.on("data", appendOutput);
518
+ child.stderr?.on("data", appendOutput);
519
+ child.once("exit", (code, signal) => {
520
+ exitInfo = { code, signal };
521
+ });
522
+ child.once("error", (error) => {
523
+ exitInfo = { code: null, signal: null, spawnError: error.message };
524
+ });
458
525
  child.unref();
459
- return child;
526
+ return {
527
+ process: child,
528
+ readExitInfo: () => exitInfo,
529
+ readOutput: () => capturedOutput,
530
+ stopCapture: () => {
531
+ isCapturing = false;
532
+ }
533
+ };
534
+ function appendOutput(chunk) {
535
+ if (!isCapturing) {
536
+ return;
537
+ }
538
+ capturedOutput = (capturedOutput + chunk.toString()).slice(-APPIUM_OUTPUT_TAIL_MAX_LENGTH);
539
+ }
460
540
  }
461
541
  startEmulator(avdName, isEmulatorVisible) {
462
542
  const emulatorBinary = this.resolveEmulatorBinary();
@@ -477,6 +557,9 @@ class AppiumTransportFactory {
477
557
  child.once("exit", (code, signal) => {
478
558
  exitInfo = { code, signal };
479
559
  });
560
+ child.once("error", (error) => {
561
+ exitInfo = { code: null, signal: null, spawnError: error.message };
562
+ });
480
563
  child.unref();
481
564
  return {
482
565
  process: child,
@@ -531,15 +614,20 @@ class AppiumTransportFactory {
531
614
  );
532
615
  });
533
616
  }
534
- async waitForAppiumReady(url, timeoutInMilliseconds) {
617
+ async waitForAppiumReady(url, timeoutInMilliseconds, launch) {
535
618
  const start = Date.now();
536
619
  this.log(
537
620
  `Waiting for Appium at ${url.href} (timeout: ${String(timeoutInMilliseconds)}ms, poll: ${String(APPIUM_START_POLL_INTERVAL_IN_MILLISECONDS)}ms)...`
538
621
  );
539
622
  const deadline = start + timeoutInMilliseconds;
540
623
  while (Date.now() < deadline) {
624
+ const exitInfo = launch.readExitInfo();
625
+ if (exitInfo) {
626
+ throw buildDeathError(exitInfo);
627
+ }
541
628
  try {
542
629
  await this.checkAppiumReachable(url);
630
+ launch.stopCapture();
543
631
  this.log(`Appium server ready after ${String(Date.now() - start)}ms.`);
544
632
  return;
545
633
  } catch {
@@ -549,9 +637,24 @@ class AppiumTransportFactory {
549
637
  });
550
638
  }
551
639
  }
552
- throw new Error(
553
- `Auto-started Appium server did not become ready within ${String(timeoutInMilliseconds)}ms`
554
- );
640
+ const finalExitInfo = launch.readExitInfo();
641
+ if (finalExitInfo) {
642
+ throw buildDeathError(finalExitInfo);
643
+ }
644
+ const outputTail = launch.readOutput().trim();
645
+ const outputSection = outputTail.length > 0 ? `
646
+
647
+ Appium server output (tail):
648
+ ${outputTail}` : "";
649
+ throw new Error(`Auto-started Appium server did not become ready within ${String(timeoutInMilliseconds)}ms.${outputSection}`);
650
+ function buildDeathError(exitInfo) {
651
+ return new Error(buildProcessExitMessage({
652
+ exitInfo,
653
+ output: launch.readOutput(),
654
+ outputLabel: "Appium server output",
655
+ subject: "Auto-started Appium server"
656
+ }));
657
+ }
555
658
  }
556
659
  async waitForBoot(deviceId, deadline, emulator) {
557
660
  const remainingMs = Math.max(0, deadline - Date.now());
@@ -575,7 +678,12 @@ class AppiumTransportFactory {
575
678
  }
576
679
  const exitInfo = emulator.readExitInfo();
577
680
  if (exitInfo) {
578
- throw new Error(buildEmulatorExitMessage(exitInfo, emulator.readOutput()));
681
+ throw new Error(buildProcessExitMessage({
682
+ exitInfo,
683
+ output: emulator.readOutput(),
684
+ outputLabel: "Emulator output",
685
+ subject: "Android emulator"
686
+ }));
579
687
  }
580
688
  await new Promise((resolve) => {
581
689
  setTimeout(resolve, EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS);
@@ -649,7 +757,12 @@ class AppiumTransportFactory {
649
757
  }
650
758
  const exitInfo = emulator.readExitInfo();
651
759
  if (exitInfo) {
652
- throw new Error(buildEmulatorExitMessage(exitInfo, emulator.readOutput()));
760
+ throw new Error(buildProcessExitMessage({
761
+ exitInfo,
762
+ output: emulator.readOutput(),
763
+ outputLabel: "Emulator output",
764
+ subject: "Android emulator"
765
+ }));
653
766
  }
654
767
  await new Promise((resolve) => {
655
768
  setTimeout(resolve, EMULATOR_BOOT_POLL_INTERVAL_IN_MILLISECONDS);
@@ -682,15 +795,6 @@ async function getOrCreateTransport(options) {
682
795
  cachedTransport = result;
683
796
  return result;
684
797
  }
685
- function buildEmulatorExitMessage(exitInfo, output) {
686
- const reason = exitInfo.signal === null ? `exited prematurely with code ${String(exitInfo.code)}` : `was terminated by signal ${exitInfo.signal}`;
687
- const trimmedOutput = output.trim();
688
- const details = trimmedOutput.length > 0 ? `
689
-
690
- Emulator output (tail):
691
- ${trimmedOutput}` : "";
692
- return `Android emulator ${reason} during startup.${details}`;
693
- }
694
798
  function checkAndReportCompatibility(params) {
695
799
  const { appVersion, installerVersion, shouldThrowOnIncompatibleInstaller, shouldWarnOnCompatibilityIssues } = params;
696
800
  if (appVersion === void 0) {
@@ -727,24 +831,25 @@ async function createCdpTransport(options) {
727
831
  if (options?.port !== void 0) {
728
832
  const ownedSuffix = options.isHarnessOwnedInstance ? " (harness-owned)" : "";
729
833
  log(`[transport-factory:obsidian-cdp] Attaching to running Obsidian${ownedSuffix} (host=${options.host ?? "localhost"}, port=${String(options.port)})`);
730
- return new DesktopCdpTransport({
731
- ...options.host !== void 0 && { cdpHost: options.host },
834
+ return new DesktopCdpTransport(normalizeOptionalProperties({
835
+ cdpHost: options.host,
732
836
  cdpPort: options.port,
733
- ...options.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds },
734
- ...options.isHarnessOwnedInstance !== void 0 && { isHarnessOwnedInstance: options.isHarnessOwnedInstance }
735
- });
837
+ commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds,
838
+ isHarnessOwnedInstance: options.isHarnessOwnedInstance
839
+ }));
736
840
  }
737
841
  log("[transport-factory:obsidian-cdp] Creating owned isolated Obsidian instance");
738
842
  const ownedInstance = await resolveOwnedInstanceConfig(options);
739
- return new DesktopCdpTransport({
740
- ...options?.host !== void 0 && { cdpHost: options.host },
741
- ...options?.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds },
843
+ return new DesktopCdpTransport(normalizeOptionalProperties({
844
+ cdpHost: options?.host,
845
+ commandTimeoutInMilliseconds: options?.commandTimeoutInMilliseconds,
742
846
  deadBootGraceInMilliseconds: resolveDeadBootGraceInMilliseconds(options),
743
- ...options?.isObsidianAppVisible !== void 0 && { isObsidianAppVisible: options.isObsidianAppVisible },
847
+ isObsidianAppVisible: options?.isObsidianAppVisible,
744
848
  ownedInstance,
745
- ...options?.shouldDisableSandbox !== void 0 && { shouldDisableSandbox: options.shouldDisableSandbox },
849
+ shouldDisableSandbox: options?.shouldDisableSandbox,
850
+ shouldThrowOnSilentAsarFallback: resolveShouldThrowOnSilentAsarFallback(options?.shouldThrowOnSilentAsarFallback),
746
851
  shouldWarnOnCompatibilityIssues: resolveShouldWarnOnCompatibilityIssues(options?.shouldWarnOnCompatibilityIssues)
747
- });
852
+ }));
748
853
  }
749
854
  function createOwnedUserDataDir() {
750
855
  const root = join(tmpdir(), "obsidian-integration-testing");
@@ -821,4 +926,4 @@ export {
821
926
  createTransportFromOptions,
822
927
  getOrCreateTransport
823
928
  };
824
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eUFjdGlvbixcbiAgcmVzb2x2ZVNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gIHJlc29sdmVTaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzXG59IGZyb20gJy4vY29tcGF0aWJpbGl0eS1vcHRpb25zLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0RldmljZUlkbGUsXG4gIHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vZGV2aWNlLXJlYWRpbmVzcy5tanMnO1xuaW1wb3J0IHsgYnVpbGRFbXVsYXRvckFyZ3MgfSBmcm9tICcuL2VtdWxhdG9yLWFyZ3MubWpzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMubWpzJztcbmltcG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgeyBraWxsUHJvY2Vzc1RyZWUgfSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5Db25maWdEaXIgfSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5tanMnO1xuaW1wb3J0IHtcbiAgZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uLFxuICBlbnN1cmVTaGVsbENhY2hlZFxufSBmcm9tICcuL29ic2lkaWFuLWluc3RhbGxlci5tanMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlQXNhckNhY2hlZCxcbiAgZmluZE5ld2VzdEFzYXIsXG4gIHJlc29sdmVDb25jcmV0ZVZlcnNpb25cbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5tanMnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVNwYXduRmxhZ3MsXG4gIHJlc29sdmVFbXVsYXRvclNwYXduRmxhZ3Ncbn0gZnJvbSAnLi9zcGF3bi1vcHRpb25zLm1qcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5pbXBvcnQge1xuICBzaG91bGRIaWRlQXBwaXVtQ29uc29sZSxcbiAgc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93XG59IGZyb20gJy4vdmlzaWJpbGl0eS5tanMnO1xuXG5jb25zdCBBUFBfUEFDS0FHRSA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBUFBfQUNUSVZJVFkgPSBgJHtBUFBfUEFDS0FHRX0uTWFpbkFjdGl2aXR5YDtcbmNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBPV05FRF9VU0VSX0RBVEFfUFJFRklYID0gJ3VzZXJkYXRhLSc7XG4vLyBBcHBpdW0gaW5zZWN1cmUgZmVhdHVyZSBsZXR0aW5nIHRoZSBVaUF1dG9tYXRvcjIgZHJpdmVyIGF1dG8tZG93bmxvYWQgYVxuLy8gQ2hyb21lZHJpdmVyIG1hdGNoaW5nIE9ic2lkaWFuJ3MgV2ViVmlldyBDaHJvbWUgdmVyc2lvbi4gRW5hYmxpbmcgaXQgb24gdGhlXG4vLyBBcHBpdW0gc2VydmVyIChpdCBoYXMgbm8gZWZmZWN0IGFzIGEgY2FwYWJpbGl0eSkgYXZvaWRzIHRoZSBmYWlsdXJlXG4vLyBcIk5vIENocm9tZWRyaXZlciBmb3VuZCB0aGF0IGNhbiBhdXRvbWF0ZSBDaHJvbWUgLi4uXCIuXG5jb25zdCBDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUgPSAndWlhdXRvbWF0b3IyOmNocm9tZWRyaXZlcl9hdXRvZG93bmxvYWQnO1xuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDtcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IEVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcblxuLyoqXG4gKiBIb3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkIGluc3RhbmNlOyBhdFxuICogbW9zdCBvbmUgZmllbGQgaXMgc2V0IChzZWUge0BsaW5rIHJlc29sdmVBc2FyUGxhbn0pLlxuICovXG5pbnRlcmZhY2UgQXNhclBsYW4ge1xuICAvKiogVGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgdG8gcHJvdmlzaW9uIGFzLWlzIChubyBkb3dubG9hZCkuICovXG4gIHJlYWRvbmx5IGFzYXI/OiBPd25lZEluc3RhbmNlQ29uZmlnWydhc2FyJ107XG5cbiAgLyoqIFRoZSBhcHAgdmVyc2lvbiB0byBkb3dubG9hZCBhbmQgYXNhci1zd2FwIG9udG8gdGhlIHNoZWxsLiAqL1xuICByZWFkb25seSBhc2FyVmVyc2lvblRvU3dhcD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHdob3NlIG93biBpbnN0YWxsZXIgc2hlbGwgdG8gZG93bmxvYWQgKGEgZG93bmdyYWRlKS4gKi9cbiAgcmVhZG9ubHkgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIG9mIGFuIGVtdWxhdG9yIHByb2Nlc3MgdGhhdCBoYXMgZXhpdGVkLlxuICovXG5pbnRlcmZhY2UgRW11bGF0b3JFeGl0SW5mbyB7XG4gIC8qKiBFeGl0IGNvZGUsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyB3YXMgdGVybWluYXRlZCBieSBhIHNpZ25hbC4gKi9cbiAgY29kZTogbnVsbCB8IG51bWJlcjtcblxuICAvKiogVGVybWluYXRpbmcgc2lnbmFsLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3MgZXhpdGVkIG5vcm1hbGx5LiAqL1xuICBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBBIHNwYXduZWQgZW11bGF0b3IgcHJvY2VzcyB0b2dldGhlciB3aXRoIGhlbHBlcnMgdG8gaW5zcGVjdCBpdHMgY2FwdHVyZWRcbiAqIG91dHB1dCBhbmQgZXhpdCBzdGF0dXMuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckxhdW5jaCB7XG4gIC8qKiBUaGUgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzLiAqL1xuICBwcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgLyoqIFJldHVybnMgdGhlIGV4aXQgZGV0YWlscyBvbmNlIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZEV4aXRJbmZvOiAoKSA9PiBFbXVsYXRvckV4aXRJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIChib3VuZGVkIHRvIHRoZSBtb3N0IHJlY2VudCBvdXRwdXQpLiAqL1xuICByZWFkT3V0cHV0OiAoKSA9PiBzdHJpbmc7XG5cbiAgLyoqIFN0b3BzIGFjY3VtdWxhdGluZyBvdXRwdXQuIENhbGwgb25jZSBzdGFydHVwIGhhcyBzdWNjZWVkZWQuICovXG4gIHN0b3BDYXB0dXJlOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMge1xuICAvKiogQVZEIG5hbWUgdG8gY29ubmVjdCB0byAoc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IgaWYgbm90IGFscmVhZHkgcnVubmluZykuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCByZXNvbHZlZCBieSB7QGxpbmsgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxlZFNoZWxsIHtcbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGluc3RhbGxlZCBzaGVsbCBleGVjdXRhYmxlLiAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBkZXRlY3RlZCBzaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICByZWFkb25seSBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuICovXG4gIHJlYWRvbmx5IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIHN0YXJ0LiAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuICovXG4gIHJlYWRvbmx5IGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKiogV2hldGhlciBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgbWF5IGJlIGF1dG8taW5zdGFsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHtcbiAgLyoqIFRoZSBhY3R1YWwgZGV2aWNlIElEIHRoYXQgaXMgY29ubmVjdGVkIChtYXkgZGlmZmVyIGZyb20gdGhlIHJlcXVlc3RlZCBvbmUpLiAqL1xuICByZWFkb25seSBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHl9LlxuICovXG5pbnRlcmZhY2UgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHAgKGFzYXIpIHZlcnNpb24gdGhhdCB3aWxsIGJlIHN3YXBwZWQgb250byB0aGUgc2hlbGwsIG9yIGB1bmRlZmluZWRgXG4gICAqIHdoZW4gbm8gYXNhci1zd2FwIHdpbGwgaGFwcGVuIChub3RoaW5nIGlzIGNoZWNrZWQgdGhlbikuXG4gICAqL1xuICByZWFkb25seSBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfVxuICAgKiAoYHRydWVgKSBvciBwcm9jZWVkcyB0byBsYXVuY2ggd2l0aCB0aGUgdmVyZGljdCBzdXJmYWNlZCBhcyBkYXRhIChgZmFsc2VgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgYSBgJ25hZ2dlZCdgIChvciBwcm9jZWVkaW5nLWAndW5ydW5uYWJsZSdgKSB2ZXJkaWN0IGlzIGxvZ2dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIEFwcGl1bSB0b29sY2hhaW4gaXMgcHJlc2VudCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQ6XG4gICAqIEFwcGl1bSBpdHNlbGYsIHRoZW4gdGhlIGB1aWF1dG9tYXRvcjJgIGRyaXZlci4gRWFjaCBpcyBjaGVja2VkIGZpcnN0IGFuZFxuICAgKiBpbnN0YWxsZWQgb25seSB3aGVuIG1pc3NpbmcsIHNvIGEgZnVsbHktcHJvdmlzaW9uZWQgbWFjaGluZSBpbmN1cnMganVzdCB0d29cbiAgICogZmFzdCB2ZXJzaW9uL2xpc3QgcHJvYmVzLlxuICAgKlxuICAgKiBPbmx5IGludm9rZWQgd2hlbiB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kXG4gICAqIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzfVxuICAgKiBpcyBlbmFibGVkLiBDb21tYW5kcyBhcmUgcGFzc2VkIGFzIHN0cmluZ3Mgc28gYGV4ZWNgIHJ1bnMgdGhlbSB0aHJvdWdoIHRoZVxuICAgKiBzaGVsbCwgd2hpY2ggcmVzb2x2ZXMgdGhlIGBucG1gL2BucHhgIGAuY21kYCBzaGltcyBvbiBXaW5kb3dzICh0aGUgYXJyYXlcbiAgICogcGF0aCBzcGF3bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBjYW5ub3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1EZXBlbmRlbmNpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVVpYXV0b21hdG9yMkRyaXZlckluc3RhbGxlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coJ0NoZWNraW5nIHdoZXRoZXIgQXBwaXVtIGlzIGluc3RhbGxlZC4uLicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIGlzIGluc3RhbGxlZCAodmVyc2lvbiAke3Jlc3VsdC5zdGRvdXQudHJpbSgpIHx8ICd1bmtub3duJ30pLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKCdBcHBpdW0gaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyBnbG9iYWxseSB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWAuLi4nKTtcbiAgICBhd2FpdCBleGVjKCducG0gaW5zdGFsbCAtZyBhcHBpdW0nKTtcbiAgICB0aGlzLmxvZygnQXBwaXVtIGluc3RhbGxlZC4nKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHBhcmFtczogRW5zdXJlRGV2aWNlQ29ubmVjdGVkUGFyYW1zKTogUHJvbWlzZTxFbnN1cmVEZXZpY2VDb25uZWN0ZWRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZGV2aWNlSWRzQmVmb3JlID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgZXhpc3RpbmcgZGV2aWNlcyBmb3IgQVZEIFwiJHthdmROYW1lfVwiLi4uIChjb25uZWN0ZWQ6IFske2RldmljZUlkc0JlZm9yZS5qb2luKCcsICcpfV0pYCk7XG5cbiAgICBjb25zdCBleGlzdGluZ0RldmljZUlkID0gYXdhaXQgdGhpcy5maW5kRGV2aWNlQnlBdmROYW1lKGF2ZE5hbWUsIGRldmljZUlkc0JlZm9yZSk7XG5cbiAgICBpZiAoZXhpc3RpbmdEZXZpY2VJZCkge1xuICAgICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBpcyBhbHJlYWR5IHJ1bm5pbmcgb24gZGV2aWNlICR7ZXhpc3RpbmdEZXZpY2VJZH0sIHJldXNpbmcuYCk7XG4gICAgICBhd2FpdCB0aGlzLnN1cHByZXNzRXJyb3JEaWFsb2dzKGV4aXN0aW5nRGV2aWNlSWQpO1xuICAgICAgcmV0dXJuIHsgYWN0dWFsRGV2aWNlSWQ6IGV4aXN0aW5nRGV2aWNlSWQgfTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIG5vdCBmb3VuZCBvbiBhbnkgZXhpc3RpbmcgZGV2aWNlLCBzdGFydGluZyBhIG5ldyBlbXVsYXRvci4uLmApO1xuICAgIGNvbnN0IGVtdWxhdG9yID0gdGhpcy5zdGFydEVtdWxhdG9yKGF2ZE5hbWUsIGlzRW11bGF0b3JWaXNpYmxlKTtcblxuICAgIGxldCBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBhY3R1YWxEZXZpY2VJZCA9IGF3YWl0IHRoaXMud2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmUsIGVtdWxhdG9yLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW11bGF0b3Iuc3RvcENhcHR1cmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGlzIGNvbm5lY3RlZC5gKTtcbiAgICBhd2FpdCB0aGlzLnN1cHByZXNzRXJyb3JEaWFsb2dzKGFjdHVhbERldmljZUlkKTtcbiAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZCwgZW11bGF0b3JQcm9jZXNzOiBlbXVsYXRvci5wcm9jZXNzIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVVpYXV0b21hdG9yMkRyaXZlckluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgd2hldGhlciB0aGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBpbnN0YWxsZWQuLi5gKTtcbiAgICBjb25zdCBkcml2ZXJMaXN0SnNvbiA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIGRyaXZlciBsaXN0IC0taW5zdGFsbGVkIC0tanNvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKGNoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWQoeyBkcml2ZXJMaXN0SnNvbiwgZHJpdmVyTmFtZTogVUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FIH0pKSB7XG4gICAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgaW5zdGFsbGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIHZpYSBcXGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9XFxgLi4uYCk7XG4gICAgYXdhaXQgZXhlYyhgbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gZHJpdmVyIGluc3RhbGwgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9YCk7XG4gICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGluc3RhbGxlZC5gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBydW5uaW5nQXZkID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnNwbGl0KCdcXG4nKVswXT8udHJpbSgpID8/ICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJ1bm5pbmdBdmQgPT09IGF2ZE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRldmljZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWydkZXZpY2VzJ10sIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiBkZXZpY2VzJzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgQURCIHN0ZGVycjogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xcbicpLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpLmZpbHRlcigobGluZSkgPT4gbGluZS5sZW5ndGggPiAwKTtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuaW5jbHVkZXMoJ1xcdGRldmljZScpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zcGxpdCgnXFx0JylbMF0gPz8gJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXZpY2VQcm9wKGRldmljZUlkOiBzdHJpbmcsIHByb3A6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCBwcm9wXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIChub3QgcGFydGlhbCBzdGRvdXQpIHNvIGEgbm9uLXJlc3BvbnNpdmUgZ3Vlc3QgcmVhZHMgYXMgXCJub3QgaWRsZVwiLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7dGhpcy50eXBlfV0gJHttZXNzYWdlfWApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRW11bGF0b3JCaW5hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZGtSb290ID0gcHJvY2Vzcy5lbnZbJ0FORFJPSURfSE9NRSddID8/IHByb2Nlc3MuZW52WydBTkRST0lEX1NES19ST09UJ107XG4gICAgaWYgKCFzZGtSb290KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgZmluZCBBbmRyb2lkIGVtdWxhdG9yOiBuZWl0aGVyIEFORFJPSURfSE9NRSBub3IgQU5EUk9JRF9TREtfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGpvaW4oc2RrUm9vdCwgJ2VtdWxhdG9yJywgJ2VtdWxhdG9yJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIHBvcnQsIHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLCBzaG91bGRBdXRvU3RhcnRBcHBpdW0gfSA9IHBhcmFtcztcblxuICAgIGxldCBuZWVkc0FwcGl1bVN0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgQXBwaXVtIHNlcnZlciBhdCAke2FwcGl1bVVybC5ocmVmfS4uLmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKGFwcGl1bVVybCk7XG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChzaG91bGRBdXRvU3RhcnRBcHBpdW0gPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgbmVlZHNBcHBpdW1TdGFydCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChuZWVkc0FwcGl1bVN0YXJ0KSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBpdW1EZXBlbmRlbmNpZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gbm90IHJlYWNoYWJsZSwgYXV0by1zdGFydGluZyBvbiBwb3J0ICR7U3RyaW5nKHBvcnQpfS4uLmApO1xuICAgICAgYXBwaXVtUHJvY2VzcyA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFssIGRldmljZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnRcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGlzIHJlYWR5LicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5lbnN1cmVEZXZpY2VDb25uZWN0ZWQoeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9KVxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGFwcGl1bVByb2Nlc3MsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0LmVtdWxhdG9yUHJvY2Vzc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAga2lsbFByb2Nlc3NUcmVlKGFwcGl1bVByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGFmdGVyIHN0YXJ0dXAgZmFpbHVyZS4nKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydDogbnVtYmVyLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlPzogYm9vbGVhbik6IENoaWxkUHJvY2VzcyB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzKGlzQ29uc29sZUhpZGRlbik7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihgbnB4IGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gJ2lnbm9yZScgOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcsIGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbik6IEVtdWxhdG9yTGF1bmNoIHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHRoaXMucmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gICAgY29uc3QgaXNXaW5kb3dIaWRkZW4gPSBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3coaXNFbXVsYXRvclZpc2libGUpO1xuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEVtdWxhdG9yQXJncyh7IGF2ZE5hbWUsIGlzSGlkZGVuOiBpc1dpbmRvd0hpZGRlbiB9KTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFncyhpc1dpbmRvd0hpZGRlbik7XG4gICAgdGhpcy5sb2coYFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgLypcbiAgICAgKiBQaXBlIChyYXRoZXIgdGhhbiBpZ25vcmUpIHN0ZG91dC9zdGRlcnIgc28gYW4gZWFybHkgZmFpbHVyZSBzdWNoIGFzXG4gICAgICogXCJ4ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb25cIiBjYW4gYmVcbiAgICAgKiBzdXJmYWNlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBhcmdzLCB7XG4gICAgICBkZXRhY2hlZCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGlzQ2FwdHVyaW5nID0gdHJ1ZTtcblxuICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGUsIHNpZ25hbCB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIHJlYWR5IGFmdGVyICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBub3QgcmVhZHkgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tc2BcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQm9vdChkZXZpY2VJZDogc3RyaW5nLCBkZWFkbGluZTogbnVtYmVyLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogRW11bGF0b3JMYXVuY2gsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgYSBuZXcgZGV2aWNlIHRvIGFwcGVhciBpbiBBREIgKHRpbWVvdXQ6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgY3VycmVudElkcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgICBjb25zdCBuZXdJZHMgPSBjdXJyZW50SWRzLmZpbHRlcigoaWQpID0+ICFkZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoaWQpKTtcblxuICAgICAgaWYgKG5ld0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gbmV3SWRzWzBdID8/ICcnO1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGFwcGVhcmVkIGluIEFEQiwgd2FpdGluZyBmb3IgYm9vdCB0byBjb21wbGV0ZS4uLmApO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VJZGxlKGFjdHVhbERldmljZUlkLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWtlU2NyZWVuKGFjdHVhbERldmljZUlkKTtcbiAgICAgICAgcmV0dXJuIGFjdHVhbERldmljZUlkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZEVtdWxhdG9yRXhpdE1lc3NhZ2UoZXhpdEluZm8sIGVtdWxhdG9yLnJlYWRPdXRwdXQoKSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBDTEkgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZSBmb3IgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGV4aXRlZCBkdXJpbmdcbiAqIHN0YXJ0dXAsIGFwcGVuZGluZyB0aGUgY2FwdHVyZWQgb3V0cHV0IHRhaWwgd2hlbiBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIGV4aXRJbmZvIC0gVGhlIGVtdWxhdG9yJ3MgZXhpdCBkZXRhaWxzLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIHRhaWwuXG4gKiBAcmV0dXJucyBBIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWFzb24gPSBleGl0SW5mby5zaWduYWwgPT09IG51bGxcbiAgICA/IGBleGl0ZWQgcHJlbWF0dXJlbHkgd2l0aCBjb2RlICR7U3RyaW5nKGV4aXRJbmZvLmNvZGUpfWBcbiAgICA6IGB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJHtleGl0SW5mby5zaWduYWx9YDtcbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGNvbnN0IGRldGFpbHMgPSB0cmltbWVkT3V0cHV0Lmxlbmd0aCA+IDBcbiAgICA/IGBcXG5cXG5FbXVsYXRvciBvdXRwdXQgKHRhaWwpOlxcbiR7dHJpbW1lZE91dHB1dH1gXG4gICAgOiAnJztcbiAgcmV0dXJuIGBBbmRyb2lkIGVtdWxhdG9yICR7cmVhc29ufSBkdXJpbmcgc3RhcnR1cC4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2sgZm9yIGFuIGFzYXItc3dhcCBhbmQgYWN0c1xuICogb24gdGhlIHZlcmRpY3Q6IGZvciBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciBlaXRoZXIgdGhyb3dzXG4gKiB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSAod2hlblxuICoge0BsaW5rIENoZWNrQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcy5zaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSlcbiAqIG9yIHByb2NlZWRzIHRvIGxhdW5jaCB3aXRoIGEgd2FybmluZzsgZm9yIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIEJvdGggd2FybmluZ3MgYXJlIHN1cHByZXNzZWQgd2hlblxuICoge0BsaW5rIENoZWNrQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzfSBpc1xuICogYGZhbHNlYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlc29sdmVkIHZlcnNpb25zIGFuZCB0aGUgd2Fybi90aHJvdyBrbm9icy5cbiAqIEByZXR1cm5zIFRoZSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIGFzYXItc3dhcCB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHBhcmFtczogQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zKTogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYXBwVmVyc2lvbiwgaW5zdGFsbGVyVmVyc2lvbiwgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciwgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyB9ID0gcGFyYW1zO1xuICBpZiAoYXBwVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhdGliaWxpdHkgPSBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHkoe1xuICAgIGFwcFZlcnNpb24sXG4gICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICBtZXRhZGF0YTogZ2V0VmVyc2lvbk1ldGFkYXRhKGFwcFZlcnNpb24pXG4gIH0pO1xuXG4gIGNvbnN0IGFjdGlvbiA9IHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5QWN0aW9uKHtcbiAgICBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdGllcjogY29tcGF0aWJpbGl0eS50aWVyXG4gIH0pO1xuXG4gIGlmIChhY3Rpb24gPT09ICd0aHJvdycpIHtcbiAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yKHtcbiAgICAgIGFwcFZlcnNpb246IGNvbXBhdGliaWxpdHkuYXBwVmVyc2lvbixcbiAgICAgIGluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkuaW5zdGFsbGVyVmVyc2lvbiksXG4gICAgICBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3dhcm4tdW5ydW5uYWJsZScpIHtcbiAgICBsb2coXG4gICAgICBgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gT2JzaWRpYW4gaW5zdGFsbGVyICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKX0gaXMgYmVsb3cgdGhlIGBcbiAgICAgICAgKyBgcnVuIGZsb29yICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pfSBmb3IgT2JzaWRpYW4gJHtjb21wYXRpYmlsaXR5LmFwcFZlcnNpb259OyBgXG4gICAgICAgICsgJ3Byb2NlZWRpbmcgdG8gbGF1bmNoIChzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyIGlzIGZhbHNlKSBcdTIwMTQgdGhlIGJvb3Qgd2lsbCBsaWtlbHkgZGVhZC1ib290LidcbiAgICApO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3dhcm4tbmFnZ2VkJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1lc3NhZ2UpfWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBhdGliaWxpdHk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC4gV2hlbiBhbiBleHBsaWNpdCBgcG9ydGAgaXMgZ2l2ZW4gdGhlXG4gKiB0cmFuc3BvcnQgYXR0YWNoZXMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIG9uIHRoYXQgcG9ydDsgb3RoZXJ3aXNlIGl0XG4gKiBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBpbnN0YW5jZSAodGhlIGRlZmF1bHQsIGhlcm1ldGljIG1vZGUpLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgQSBjb25maWd1cmVkIENEUCB0cmFuc3BvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNkcFRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgb3duZWRTdWZmaXggPSBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPyAnIChoYXJuZXNzLW93bmVkKScgOiAnJztcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIEF0dGFjaGluZyB0byBydW5uaW5nIE9ic2lkaWFuJHtvd25lZFN1ZmZpeH0gKGhvc3Q9JHtvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCd9LCBwb3J0PSR7U3RyaW5nKG9wdGlvbnMucG9ydCl9KWApO1xuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydCh7XG4gICAgICAuLi4ob3B0aW9ucy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICAuLi4ob3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlICE9PSB1bmRlZmluZWQgJiYgeyBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2UgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQ3JlYXRpbmcgb3duZWQgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UnKTtcbiAgY29uc3Qgb3duZWRJbnN0YW5jZSA9IGF3YWl0IHJlc29sdmVPd25lZEluc3RhbmNlQ29uZmlnKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQoe1xuICAgIC4uLihvcHRpb25zPy5ob3N0ICE9PSB1bmRlZmluZWQgJiYgeyBjZHBIb3N0OiBvcHRpb25zLmhvc3QgfSksXG4gICAgLi4uKG9wdGlvbnM/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgLi4uKG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlICE9PSB1bmRlZmluZWQgJiYgeyBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucy5pc09ic2lkaWFuQXBwVmlzaWJsZSB9KSxcbiAgICBvd25lZEluc3RhbmNlLFxuICAgIC4uLihvcHRpb25zPy5zaG91bGREaXNhYmxlU2FuZGJveCAhPT0gdW5kZWZpbmVkICYmIHsgc2hvdWxkRGlzYWJsZVNhbmRib3g6IG9wdGlvbnMuc2hvdWxkRGlzYWJsZVNhbmRib3ggfSksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZyZXNoLCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGZvciBhbiBvd25lZCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbmV3IGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3duZWRVc2VyRGF0YURpcigpOiBzdHJpbmcge1xuICBjb25zdCByb290ID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgbWtkaXJTeW5jKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICByZXR1cm4gbWtkdGVtcFN5bmMoam9pbihyb290LCBPV05FRF9VU0VSX0RBVEFfUFJFRklYKSk7XG59XG5cbi8qKlxuICogRGVjaWRlcyBob3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkXG4gKiBpbnN0YW5jZSwgd2l0aG91dCBkb3dubG9hZGluZyBhbnl0aGluZyB5ZXQ6IGFuIHVwZ3JhZGUtb25seSBhc2FyLXN3YXAgb250byB0aGVcbiAqIHNoZWxsLCBhIGRvd25ncmFkZSB0byB0aGUgYXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgb3IgdGhlIHVzZXIncyBuZXdlc3RcbiAqIGluc3RhbGxlZCBhc2FyIHdoZW4gbmVpdGhlciB2ZXJzaW9uIGlzIHBpbm5lZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEBwYXJhbSBzaGVsbFZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIGFzYXIgcGxhbiAoYXQgbW9zdCBvbmUgb2YgaXRzIGZpZWxkcyBpcyBzZXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXNhclBsYW4oXG4gIG9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgc2hlbGxWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8QXNhclBsYW4+IHtcbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgYXNhclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5WZXJzaW9uKTtcbiAgICBpZiAoc2hlbGxWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZVZlcnNpb25zKGFzYXJWZXJzaW9uLCBzaGVsbFZlcnNpb24pID49IDApIHtcbiAgICAgIHJldHVybiB7IGFzYXJWZXJzaW9uVG9Td2FwOiBhc2FyVmVyc2lvbiB9O1xuICAgIH1cblxuICAgIC8vIEFzYXItc3dhcCBpcyB1cGdyYWRlLW9ubHksIHNvIGl0IGNhbm5vdCBhcHBseSBhIHZlcnNpb24gb2xkZXIgdGhhbiB0aGVcbiAgICAvLyBTaGVsbCdzIGJ1bmRsZWQgb25lIFx1MjAxNCBhbmQgd2hlbiB0aGUgc2hlbGwgdmVyc2lvbiBpcyB1bmtub3duIChhIExpbnV4XG4gICAgLy8gUGF0aC1wYXJzZSBtaXNzKSB3ZSBjYW5ub3QgcHJvdmUgdGhlIHN3YXAgd291bGQgYXBwbHkgYXQgYWxsLiBJbiBib3RoXG4gICAgLy8gQ2FzZXMgdXNlIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbidzIG93biBpbnN0YWxsZXIgc2hlbGwsIHdob3NlIGJ1bmRsZWQgYXNhclxuICAgIC8vIElzIGV4YWN0bHkgdGhpcyB2ZXJzaW9uLCBzbyB0aGUgcGluIGlzIGFsd2F5cyBob25vcmVkLlxuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gVXNpbmcgdGhlICR7YXNhclZlcnNpb259IGluc3RhbGxlciBzaGVsbCAoc2hlbGwgdmVyc2lvbiAke3NoZWxsVmVyc2lvbiA/PyAndW5rbm93bid9OyBhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5KS5gKTtcbiAgICByZXR1cm4geyBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uOiBhc2FyVmVyc2lvbiB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gZmluZE5ld2VzdEFzYXIoZ2V0T2JzaWRpYW5Db25maWdEaXIoKSk7XG4gICAgaWYgKG5ld2VzdCAmJiAoc2hlbGxWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgY29tcGFyZVZlcnNpb25zKG5ld2VzdC52ZXJzaW9uLCBzaGVsbFZlcnNpb24pID49IDApKSB7XG4gICAgICByZXR1cm4geyBhc2FyOiB7IHBhdGg6IG5ld2VzdC5wYXRoLCB2ZXJzaW9uOiBuZXdlc3QudmVyc2lvbiB9IH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCwgdG9sZXJhdGluZyBpdHMgYWJzZW5jZS5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGV9ICh3aGljaCB0aHJvd3Mgd2hlbiBPYnNpZGlhbiBpcyBub3RcbiAqIGluc3RhbGxlZCksIHRoaXMgcmV0dXJucyBgdW5kZWZpbmVkYCBpbiB0aGF0IGNhc2UsIHNvIGEgY2FsbGVyIHBpbm5pbmcgYW5cbiAqIGluc3RhbGxlciB2ZXJzaW9uIGNhbiBmYWxsIGJhY2sgdG8gZG93bmxvYWRpbmcgdGhlIHBpbm5lZCBzaGVsbCBpbnN0ZWFkIG9mXG4gKiBmYWlsaW5nIG9uIGEgaG9zdCB3aXRoIG5vIE9ic2lkaWFuIGluc3RhbGxlZCAoZS5nLiBDSSkuXG4gKlxuICogQHJldHVybnMgVGhlIGluc3RhbGxlZCBzaGVsbCdzIHBhdGggYW5kIGRldGVjdGVkIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW5cbiAqICAgbm8gT2JzaWRpYW4gaXMgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTogUHJvbWlzZTxJbnN0YWxsZWRTaGVsbCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgcmV0dXJuIHsgZXhlUGF0aCwgc2hlbGxWZXJzaW9uOiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aCkgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzaGVsbCBleGVjdXRhYmxlLCBhc2FyIHByb3Zpc2lvbmluZywgYW5kIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJcbiAqIGZvciBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgZnJvbSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ga25vYnMuXG4gKlxuICogLSBgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uYCBwaW5zIHRoZSBFbGVjdHJvbiBzaGVsbCAoZG93bmxvYWRzICsgZXh0cmFjdHMgYVxuICogICBwb3J0YWJsZSBidWlsZCB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgaW5zdGFsbGVkIHNoZWxsKS5cbiAqIC0gYG9ic2lkaWFuVmVyc2lvbmAgcGlucyB0aGUgYXBwOiBhbiBhc2FyLXN3YXAgd2hlbiBpdCBpcyA+PSB0aGUgc2hlbGwgdmVyc2lvblxuICogICAoY2hlYXApLCBvdGhlcndpc2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbCBpcyB1c2VkIChkb3duZ3JhZGUpLlxuICogLSBXaGVuIG5laXRoZXIgaXMgc2V0LCB0aGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciBpcyBjb3BpZWQgaW4gKHNvIHRoZVxuICogICBvd25lZCBpbnN0YW5jZSBtYXRjaGVzIHRoZSB2ZXJzaW9uIHRoZSB1c2VyIGN1cnJlbnRseSBydW5zKSB3aXRoIHplcm8gbmV0d29yay5cbiAqXG4gKiBUaGUgY29uY3JldGUgKGFwcCwgaW5zdGFsbGVyKSB2ZXJzaW9uIHBhaXIgaXMgcmVzb2x2ZWQgKmJlZm9yZSogYW55IHNoZWxsL2FzYXJcbiAqIGRvd25sb2FkLCBzbyBhIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVja1xuICogKHtAbGluayBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHl9KSBjYW4gZmFpbCBmYXN0OiBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlXG4gKiBhcHAncyBydW4gZmxvb3IgdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9IGJlZm9yZVxuICogYW55dGhpbmcgaXMgZG93bmxvYWRlZCBvciBsYXVuY2hlZCAoc3VwZXJzZWRpbmcgdGhlIHJlYWN0aXZlIGRlYWQtYm9vdFxuICogZmFzdC1mYWlsIGZvciB0YWJsZS1rbm93biBjb21ib3MpLCBhbmQgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gVGhlIHZlcmRpY3QgaXMgdGhyZWFkZWQgb250byB0aGUgcmV0dXJuZWQgY29uZmlnIHNvXG4gKiB0aGUgdHJhbnNwb3J0IGNhbiBzdXJmYWNlIGl0IGFzIGRhdGEuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgb3duZWQtaW5zdGFuY2UgY29uZmlnLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zPzogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPd25lZEluc3RhbmNlQ29uZmlnPiB7XG4gIC8vIFJlc29sdmUgdGhlIGNvbmNyZXRlIHNoZWxsIChpbnN0YWxsZXIpIHZlcnNpb24gZmlyc3QsIGJ1dCBmb3IgYSBwaW5uZWRcbiAgLy8gSW5zdGFsbGVyIERFRkVSIHJlc29sdmluZy9kb3dubG9hZGluZyB0aGUgYWN0dWFsIHNoZWxsIHVudGlsIGFmdGVyIHRoZVxuICAvLyBQcm9hY3RpdmUgY29tcGF0aWJpbGl0eSBjaGVjaywgc28gYW4gdW5ydW5uYWJsZSBwaW4gZmFpbHMgZmFzdCBcdTIwMTQgYmVmb3JlIHRoZVxuICAvLyAocG9zc2libHkgc2xvdykgaW5zdGFsbGVkLXNoZWxsIGRldGVjdGlvbiBhbmQgYW55IGRvd25sb2FkLlxuICBsZXQgZXhlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgc2hlbGxWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgICBzaGVsbFZlcnNpb24gPSBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQSBwaW5uZWQgaW5zdGFsbGVyIHZlcnNpb24gZnVsbHkgZGV0ZXJtaW5lcyB0aGUgc2hlbGwgdmVyc2lvbiB1cCBmcm9udCxcbiAgICAvLyBXaXRob3V0IHJlcXVpcmluZyBhIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIChhIENJIHJ1bm5lciBoYXMgbm9uZSkuXG4gICAgcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA9IGF3YWl0IHJlc29sdmVDb25jcmV0ZVZlcnNpb24ob3B0aW9ucy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24pO1xuICAgIHNoZWxsVmVyc2lvbiA9IHBpbm5lZEluc3RhbGxlclZlcnNpb247XG4gIH1cblxuICAvLyBEZWNpZGUgaG93IHRoZSBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkLCBzdGlsbCBXSVRIT1VUIGRvd25sb2FkaW5nLlxuICBjb25zdCBwbGFuID0gYXdhaXQgcmVzb2x2ZUFzYXJQbGFuKG9wdGlvbnMsIHNoZWxsVmVyc2lvbik7XG5cbiAgLy8gVGhlIGFwcCB2ZXJzaW9uIHRoYXQgd2lsbCBydW4gYXMgYW4gYXNhci1zd2FwIG9udG8gYHNoZWxsVmVyc2lvbmAgXHUyMDE0IHRoZSBvbmx5XG4gIC8vIENvbWJpbmF0aW9uIHRoYXQgY2FuIGRlYWQtYm9vdC4gVGhlIGRvd25ncmFkZSAvIG93bi1pbnN0YWxsZXIgcGF0aHMgcnVuIHRoZVxuICAvLyBBcHAncyBvd24gaW5zdGFsbGVyIHNoZWxsLCBzbyB0aGV5IGFsd2F5cyBib290IGFuZCBhcmUgbm90IGNoZWNrZWQuXG4gIGNvbnN0IHN3YXBBcHBWZXJzaW9uID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA/PyBwbGFuLmFzYXI/LnZlcnNpb247XG4gIGNvbnN0IGNvbXBhdGliaWxpdHkgPSBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkoe1xuICAgIGFwcFZlcnNpb246IHN3YXBBcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb246IHNoZWxsVmVyc2lvbixcbiAgICBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyOiByZXNvbHZlU2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcihvcHRpb25zPy5zaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyKSxcbiAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiByZXNvbHZlU2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyhvcHRpb25zPy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKVxuICB9KTtcblxuICAvLyBUaGUgcGluIGlzIGtub3duIHJ1bm5hYmxlIFx1MjAxNCByZXNvbHZlL2Rvd25sb2FkIHRoZSBkZWZlcnJlZCBzaGVsbCArIGFzYXIgbm93LlxuICAvLyBSZXVzZSB0aGUgaW5zdGFsbGVkIHNoZWxsIG9ubHkgd2hlbiBpdCBhbHJlYWR5IG1hdGNoZXMgdGhlIHBpbiAoc2F2ZXMgdGhlXG4gIC8vIERvd25sb2FkKTsgb3RoZXJ3aXNlIGRvd25sb2FkIGFuZCBleHRyYWN0IHRoZSBwaW5uZWQgaW5zdGFsbGVyLlxuICBpZiAocGlubmVkSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaW5zdGFsbGVkID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk7XG4gICAgZXhlUGF0aCA9IGluc3RhbGxlZD8uc2hlbGxWZXJzaW9uID09PSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uID8gaW5zdGFsbGVkLmV4ZVBhdGggOiBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uKTtcbiAgfVxuICBpZiAocGxhbi5kb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVQYXRoID0gYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGxhbi5kb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uKTtcbiAgfVxuXG4gIGNvbnN0IGFzYXIgPSBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwID09PSB1bmRlZmluZWRcbiAgICA/IHBsYW4uYXNhclxuICAgIDogeyBwYXRoOiBhd2FpdCBlbnN1cmVBc2FyQ2FjaGVkKHBsYW4uYXNhclZlcnNpb25Ub1N3YXApLCB2ZXJzaW9uOiBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oYXNhciAmJiB7IGFzYXIgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIGV4ZVBhdGg6IGVuc3VyZU5vbk51bGxhYmxlKGV4ZVBhdGgpLFxuICAgIHVzZXJEYXRhRGlyOiBjcmVhdGVPd25lZFVzZXJEYXRhRGlyKClcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBDb25uZWN0aW9uYCBhbmQgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIGEgV2ViRHJpdmVyIHJlcXVlc3QncyBoZWFkZXJzLlxuICpcbiAqIFRoZSBidW5kbGVkIGB3ZWJkcml2ZXJgIHBhY2thZ2Ugc2V0cyBib3RoIGhlYWRlcnMgZXhwbGljaXRseS4gVGhleSBhcmVcbiAqIGZvcmJpZGRlbiByZXF1ZXN0IGhlYWRlcnMgcGVyIHRoZSBGZXRjaCBzcGVjOiBOb2RlIHVwIHRvIDI1IGFjY2VwdGVkIHRoZW1cbiAqIHNpbGVudGx5LCBidXQgTm9kZSAyNiByZWplY3RzIHRoZW0gd2l0aCBgVU5EX0VSUl9JTlZBTElEX0FSR2AsIGJyZWFraW5nIHRoZVxuICogQXBwaXVtIGAvc2Vzc2lvbmAgcmVxdWVzdC4gVGhlIHRyYW5zcG9ydCBsYXllciBtYW5hZ2VzIGNvbm5lY3Rpb24gcmV1c2UgYW5kXG4gKiB0aGUgRmV0Y2ggQVBJIGNvbXB1dGVzIGBDb250ZW50LUxlbmd0aGAgZnJvbSB0aGUgYm9keSwgc28gZHJvcHBpbmcgYm90aCBpc1xuICogc2FmZSBvbiBldmVyeSBOb2RlIHZlcnNpb24uIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3dlYmRyaXZlcmlvL3dlYmRyaXZlcmlvL2lzc3Vlcy8xNTI2NX0uXG4gKlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIC0gVGhlIHJlcXVlc3Qgb3B0aW9ucyBhYm91dCB0byBiZSBzZW50IGJ5IFdlYkRyaXZlcklPLlxuICogQHJldHVybnMgVGhlIHNhbWUgcmVxdWVzdCBvcHRpb25zIHdpdGggdGhlIGZvcmJpZGRlbiBoZWFkZXJzIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzKHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0SW5pdCk6IFJlcXVlc3RJbml0IHtcbiAgaWYgKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0Nvbm5lY3Rpb24nKTtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29udGVudC1MZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0T3B0aW9ucztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQVVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7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QTRCLE9BQU8sRUFBRTtBQUFBLEVBQ3ZFLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBeUJBLGVBQWUsMkJBQTJCLFNBQXFFO0FBSzdHLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUksU0FBUyw2QkFBNkIsUUFBVztBQUNuRCxjQUFVLE1BQU0sMEJBQTBCO0FBQzFDLG1CQUFlLDRCQUE0QixPQUFPO0FBQUEsRUFDcEQsT0FBTztBQUdMLDZCQUF5QixNQUFNLHVCQUF1QixRQUFRLHdCQUF3QjtBQUN0RixtQkFBZTtBQUFBLEVBQ2pCO0FBR0EsUUFBTSxPQUFPLE1BQU0sZ0JBQWdCLFNBQVMsWUFBWTtBQUt4RCxRQUFNLGlCQUFpQixLQUFLLHFCQUFxQixLQUFLLE1BQU07QUFDNUQsUUFBTSxnQkFBZ0IsNEJBQTRCO0FBQUEsSUFDaEQsWUFBWTtBQUFBLElBQ1osa0JBQWtCO0FBQUEsSUFDbEIsb0NBQW9DLDBDQUEwQyxTQUFTLGtDQUFrQztBQUFBLElBQ3pILGlDQUFpQyx1Q0FBdUMsU0FBUywrQkFBK0I7QUFBQSxFQUNsSCxDQUFDO0FBS0QsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxVQUFNLFlBQVksTUFBTSw0QkFBNEI7QUFDcEQsY0FBVSxXQUFXLGlCQUFpQix5QkFBeUIsVUFBVSxVQUFVLE1BQU0sa0JBQWtCLHNCQUFzQjtBQUFBLEVBQ25JO0FBQ0EsTUFBSSxLQUFLLDhCQUE4QixRQUFXO0FBQ2hELGNBQVUsTUFBTSxrQkFBa0IsS0FBSyx5QkFBeUI7QUFBQSxFQUNsRTtBQUVBLFFBQU0sT0FBTyxLQUFLLHNCQUFzQixTQUNwQyxLQUFLLE9BQ0wsRUFBRSxNQUFNLE1BQU0saUJBQWlCLEtBQUssaUJBQWlCLEdBQUcsU0FBUyxLQUFLLGtCQUFrQjtBQUU1RixTQUFPO0FBQUEsSUFDTCxHQUFJLFFBQVEsRUFBRSxLQUFLO0FBQUEsSUFDbkIsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsU0FBUyxrQkFBa0IsT0FBTztBQUFBLElBQ2xDLGFBQWEsdUJBQXVCO0FBQUEsRUFDdEM7QUFDRjtBQWVBLFNBQVMsMkJBQTJCLGdCQUEwQztBQUM1RSxNQUFJLGVBQWUsbUJBQW1CLFNBQVM7QUFDN0MsbUJBQWUsUUFBUSxPQUFPLFlBQVk7QUFDMUMsbUJBQWUsUUFBUSxPQUFPLGdCQUFnQjtBQUFBLEVBQ2hEO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiXQp9Cg==
929
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NFeGl0SW5mbyB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUNvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLm1qcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLm1qcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpciB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzLFxuICByZXNvbHZlRW11bGF0b3JTcGF3bkZsYWdzXG59IGZyb20gJy4vc3Bhd24tb3B0aW9ucy5tanMnO1xuaW1wb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5tanMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUsXG4gIHNob3VsZEhpZGVFbXVsYXRvcldpbmRvd1xufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG5jb25zdCBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgT1dORURfVVNFUl9EQVRBX1BSRUZJWCA9ICd1c2VyZGF0YS0nO1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIENocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBFTVVMQVRPUl9MSVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5jb25zdCBFTVVMQVRPUl9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIID0gODAwMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IFNFUlZFUl9MQVVOQ0hfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5cbi8qKlxuICogSG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZCBpbnN0YW5jZTsgYXRcbiAqIG1vc3Qgb25lIGZpZWxkIGlzIHNldCAoc2VlIHtAbGluayByZXNvbHZlQXNhclBsYW59KS5cbiAqL1xuaW50ZXJmYWNlIEFzYXJQbGFuIHtcbiAgLyoqIFRoZSB1c2VyJ3MgbmV3ZXN0IGluc3RhbGxlZCBhc2FyIHRvIHByb3Zpc2lvbiBhcy1pcyAobm8gZG93bmxvYWQpLiAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUNvbmZpZ1snYXNhciddO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gdG8gZG93bmxvYWQgYW5kIGFzYXItc3dhcCBvbnRvIHRoZSBzaGVsbC4gKi9cbiAgcmVhZG9ubHkgYXNhclZlcnNpb25Ub1N3YXA/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBhcHAgdmVyc2lvbiB3aG9zZSBvd24gaW5zdGFsbGVyIHNoZWxsIHRvIGRvd25sb2FkIChhIGRvd25ncmFkZSkuICovXG4gIHJlYWRvbmx5IGRvd25ncmFkZUluc3RhbGxlclZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBjaGlsZCBwcm9jZXNzICh0aGUgQW5kcm9pZCBlbXVsYXRvciBvciB0aGUgQXBwaXVtIHNlcnZlcikgdG9nZXRoZXJcbiAqIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZCBvdXRwdXQgYW5kIGV4aXQgc3RhdHVzLlxuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xhdW5jaCB7XG4gIC8qKiBUaGUgc3Bhd25lZCBwcm9jZXNzLiAqL1xuICBwcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgLyoqIFJldHVybnMgdGhlIGV4aXQgLyBzcGF3bi1mYWlsdXJlIGRldGFpbHMgb25jZSB0aGUgcHJvY2VzcyBpcyBubyBsb25nZXIgcnVubmluZywgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcblxuICAvKiogUmV0dXJucyB0aGUgY2FwdHVyZWQgc3Rkb3V0K3N0ZGVyciAoYm91bmRlZCB0byB0aGUgbW9zdCByZWNlbnQgb3V0cHV0KS4gKi9cbiAgcmVhZE91dHB1dDogKCkgPT4gc3RyaW5nO1xuXG4gIC8qKiBTdG9wcyBhY2N1bXVsYXRpbmcgb3V0cHV0LiBDYWxsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLiAqL1xuICBzdG9wQ2FwdHVyZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuICovXG4gIHJlYWRvbmx5IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIFVSTC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBVUkw7XG5cbiAgLyoqIEFWRCBuYW1lIHRvIHN0YXJ0LiAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuICovXG4gIHJlYWRvbmx5IGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgZW11bGF0b3Igd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLiAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKiogV2hldGhlciBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgbWF5IGJlIGF1dG8taW5zdGFsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgQXBwaXVtIGF1dG8tc3RhcnQgaXMgYWxsb3dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHtcbiAgLyoqIFRoZSBhY3R1YWwgZGV2aWNlIElEIHRoYXQgaXMgY29ubmVjdGVkIChtYXkgZGlmZmVyIGZyb20gdGhlIHJlcXVlc3RlZCBvbmUpLiAqL1xuICByZWFkb25seSBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHl9LlxuICovXG5pbnRlcmZhY2UgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhcHAgKGFzYXIpIHZlcnNpb24gdGhhdCB3aWxsIGJlIHN3YXBwZWQgb250byB0aGUgc2hlbGwsIG9yIGB1bmRlZmluZWRgXG4gICAqIHdoZW4gbm8gYXNhci1zd2FwIHdpbGwgaGFwcGVuIChub3RoaW5nIGlzIGNoZWNrZWQgdGhlbikuXG4gICAqL1xuICByZWFkb25seSBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhbiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfVxuICAgKiAoYHRydWVgKSBvciBwcm9jZWVkcyB0byBsYXVuY2ggd2l0aCB0aGUgdmVyZGljdCBzdXJmYWNlZCBhcyBkYXRhIChgZmFsc2VgKS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgYSBgJ25hZ2dlZCdgIChvciBwcm9jZWVkaW5nLWAndW5ydW5uYWJsZSdgKSB2ZXJkaWN0IGlzIGxvZ2dlZC4gKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFbmNhcHN1bGF0ZXMgYWxsIEFwcGl1bSB0cmFuc3BvcnQgY3JlYXRpb24gbG9naWMsIGluY2x1ZGluZyBBcHBpdW0gc2VydmVyXG4gKiBzdGFydHVwLCBlbXVsYXRvciBtYW5hZ2VtZW50LCBhbmQgV2ViRHJpdmVySU8gc2Vzc2lvbiBlc3RhYmxpc2htZW50LlxuICpcbiAqIFVzaW5nIGEgY2xhc3MgYXZvaWRzIHRocmVhZGluZyB0aGUgdHJhbnNwb3J0IGB0eXBlYCBsYWJlbCB0aHJvdWdoIGV2ZXJ5XG4gKiBoZWxwZXIgZnVuY3Rpb24gXHUyMDE0IGB0aGlzLmxvZygpYCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIGl0LlxuICovXG5jbGFzcyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBBcHBpdW0gdHJhbnNwb3J0IGJ5IGVzdGFibGlzaGluZyBhIFdlYkRyaXZlcklPIHNlc3Npb24uXG4gICAqXG4gICAqIElmIGBvcHRpb25zLnNlc3Npb25JZGAgaXMgcHJlc2VudCwgcmVhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvblxuICAgKiBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhpcyBhdm9pZHMgZHVwbGljYXRlIEFwcGl1bS9BREIgY29ubmVjdGlvbnNcbiAgICogd2hlbiB0ZXN0IHdvcmtlcnMgcmV1c2UgdGhlIGdsb2JhbCBzZXR1cCdzIHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBBcHBpdW0gdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZShvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25JZCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGV2aWNlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24ob3B0aW9ucy5zZXNzaW9uSWQsIG9wdGlvbnMuZGV2aWNlSWQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIGRldmljZUlkOiBzdHJpbmcsXG4gICAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICApOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zLmFwcGl1bVVybCk7XG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgdGhpcy5sb2coYFJlYXR0YWNoaW5nIHRvIGV4aXN0aW5nIEFwcGl1bSBzZXNzaW9uICR7c2Vzc2lvbklkfSAoZGV2aWNlPSR7ZGV2aWNlSWR9KWApO1xuXG4gICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IGF0dGFjaCh7XG4gICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgcGxhdGZvcm1OYW1lOiAnQW5kcm9pZCdcbiAgICAgIH0sXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgIH0pO1xuXG4gICAgdGhpcy5sb2coJ1JlYXR0YWNoZWQgdG8gQXBwaXVtIHNlc3Npb24uJyk7XG5cbiAgICByZXR1cm4gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICBhcHBJZCxcbiAgICAgIGJyb3dzZXIsXG4gICAgICBkZXZpY2VJZCxcbiAgICAgIGlzU2Vzc2lvbk93bmVyOiBmYWxzZSxcbiAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsOiBVUkwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdHVzVXJsID0gbmV3IFVSTCgnL3N0YXR1cycsIHVybCk7XG4gICAgICBjb25zdCByZXEgPSBodHRwLmdldChzdGF0dXNVcmwsIHsgdGltZW91dDogQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAocmVzKSA9PiB7XG4gICAgICAgIHJlcy5yZXN1bWUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59IGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gJHtTdHJpbmcoQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIElzIHRoZSBBcHBpdW0gc2VydmVyIHJ1bm5pbmc/YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVhY2ggQXBwaXVtIHNlcnZlciBhdCAke3VybC5vcmlnaW59OiAke2Vyci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU5ld1Nlc3Npb24ob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICB0aGlzLmxvZyhgQ3JlYXRpbmcgQXBwaXVtVHJhbnNwb3J0ICh1cmw9JHtvcHRpb25zLmFwcGl1bVVybH0sIGF2ZD0ke29wdGlvbnMuYXZkTmFtZX0pYCk7XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgIGlmIChpc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBvcnQgaW4gYXBwaXVtVXJsOiAke3VybC5wb3J0fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZCA/PyBBUFBfUEFDS0FHRTtcblxuICAgIGxldCBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVtdWxhdG9yUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcih7XG4gICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGFwcGl1bVVybDogdXJsLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlOiBvcHRpb25zLmlzQXBwaXVtQ29uc29sZVZpc2libGUsXG4gICAgICAgIGlzRW11bGF0b3JWaXNpYmxlOiBvcHRpb25zLmlzRW11bGF0b3JWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtXG4gICAgICB9KTtcblxuICAgICAgYXBwaXVtUHJvY2VzcyA9IHJlc3VsdC5hcHBpdW1Qcm9jZXNzO1xuICAgICAgZW11bGF0b3JQcm9jZXNzID0gcmVzdWx0LmVtdWxhdG9yUHJvY2VzcztcbiAgICAgIGNvbnN0IGFjdHVhbERldmljZUlkID0gcmVzdWx0LmFjdHVhbERldmljZUlkO1xuXG4gICAgICBjb25zdCBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCA9IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpO1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgIGBDb25uZWN0aW5nIHRvIEFwcGl1bSAoZGV2aWNlPSR7YWN0dWFsRGV2aWNlSWR9LCBhcHA9JHthcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcoc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICAgICk7XG4gICAgICBjb25zdCBicm93c2VyID0gYXdhaXQgcmVtb3RlKHtcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgJ2FwcGl1bTphcHBBY3Rpdml0eSc6IEFQUF9BQ1RJVklUWSxcbiAgICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBhcHBJZCxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9HcmFudFBlcm1pc3Npb25zJzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICAgJ2FwcGl1bTpuZXdDb21tYW5kVGltZW91dCc6IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTpub1Jlc2V0JzogdHJ1ZSxcbiAgICAgICAgICAnYXBwaXVtOnVkaWQnOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckluc3RhbGxUaW1lb3V0JzogU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJMYXVuY2hUaW1lb3V0JzogU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5VGltZW91dDogc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXQsXG4gICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZygnQXBwaXVtIHNlc3Npb24gZXN0YWJsaXNoZWQuJyk7XG4gICAgICBjb25zdCBhcHBpdW1UcmFuc3BvcnQgPSBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgICAgYXBwSWQsXG4gICAgICAgIGJyb3dzZXIsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgICAgLi4uKG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy52YXVsdEJhc2VQYXRoICE9PSB1bmRlZmluZWQgJiYgeyB2YXVsdEJhc2VQYXRoOiBvcHRpb25zLnZhdWx0QmFzZVBhdGggfSksXG4gICAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9yaWdpbmFsRGlzcG9zZSA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlLmJpbmQoYXBwaXVtVHJhbnNwb3J0KTtcbiAgICAgIGNvbnN0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgPSBhcHBpdW1UcmFuc3BvcnQ7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcmlnaW5hbERpc3Bvc2UoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2VTeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMoKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG5cbiAgICAgIGZ1bmN0aW9uIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFwcGl1bVByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLmxvZyBpbnNpZGUgbmVzdGVkIGZ1bmN0aW9uIFx1MjAxNCBgdGhpc2AgaXMgbm90IGNhcHR1cmVkLlxuICAgICAgICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5OiR7b3B0aW9ucy50eXBlfV0gQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlKGVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igc3RvcHBlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgZW11bGF0b3IgYWZ0ZXIgY29ubmVjdGlvbiBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIEFwcGl1bSB0b29sY2hhaW4gaXMgcHJlc2VudCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQ6XG4gICAqIEFwcGl1bSBpdHNlbGYsIHRoZW4gdGhlIGB1aWF1dG9tYXRvcjJgIGRyaXZlci4gRWFjaCBpcyBjaGVja2VkIGZpcnN0IGFuZFxuICAgKiBpbnN0YWxsZWQgb25seSB3aGVuIG1pc3NpbmcsIHNvIGEgZnVsbHktcHJvdmlzaW9uZWQgbWFjaGluZSBpbmN1cnMganVzdCB0d29cbiAgICogZmFzdCB2ZXJzaW9uL2xpc3QgcHJvYmVzLlxuICAgKlxuICAgKiBPbmx5IGludm9rZWQgd2hlbiB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBzZXJ2ZXIgYW5kXG4gICAqIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzfVxuICAgKiBpcyBlbmFibGVkLiBDb21tYW5kcyBhcmUgcGFzc2VkIGFzIHN0cmluZ3Mgc28gYGV4ZWNgIHJ1bnMgdGhlbSB0aHJvdWdoIHRoZVxuICAgKiBzaGVsbCwgd2hpY2ggcmVzb2x2ZXMgdGhlIGBucG1gL2BucHhgIGAuY21kYCBzaGltcyBvbiBXaW5kb3dzICh0aGUgYXJyYXlcbiAgICogcGF0aCBzcGF3bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBjYW5ub3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1EZXBlbmRlbmNpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVVpYXV0b21hdG9yMkRyaXZlckluc3RhbGxlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBcHBpdW1JbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coJ0NoZWNraW5nIHdoZXRoZXIgQXBwaXVtIGlzIGluc3RhbGxlZC4uLicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIGlzIGluc3RhbGxlZCAodmVyc2lvbiAke3Jlc3VsdC5zdGRvdXQudHJpbSgpIHx8ICd1bmtub3duJ30pLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKCdBcHBpdW0gaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyBnbG9iYWxseSB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWAuLi4nKTtcbiAgICBhd2FpdCBleGVjKCducG0gaW5zdGFsbCAtZyBhcHBpdW0nKTtcblxuICAgIC8qXG4gICAgICogUmUtdmVyaWZ5OiBhIGdsb2JhbCBpbnN0YWxsIGNhbiBsYW5kIHVuZGVyIGFuIG5wbSBwcmVmaXggd2hvc2UgYmluIGRpciBpc1xuICAgICAqIG5vdCBvbiB0aGUgc3Bhd24gUEFUSCAoZS5nLiBhIHNjb29wL252bS1tYW5hZ2VkIHByZWZpeCksIGluIHdoaWNoIGNhc2VcbiAgICAgKiBgbnB4IC0tbm8taW5zdGFsbCBhcHBpdW1gIHN0aWxsIGNhbm5vdCByZXNvbHZlIGl0LiBGYWlsIGZhc3Qgd2l0aCBhblxuICAgICAqIGFjdGlvbmFibGUgbWVzc2FnZSByYXRoZXIgdGhhbiBwcm9jZWVkaW5nIHRvIGF1dG8tc3RhcnQgYSBzZXJ2ZXIgdGhhdCBjYW5cbiAgICAgKiBuZXZlciBjb21lIHVwICh3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3BpbiBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzIHRpbWVvdXQpLlxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeSA9IGF3YWl0IGV4ZWMoJ25weCAtLW5vLWluc3RhbGwgYXBwaXVtIC0tdmVyc2lvbicsIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSxcbiAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKHZlcmlmeS5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQXBwaXVtIHdhcyBpbnN0YWxsZWQgdmlhIGBucG0gaW5zdGFsbCAtZyBhcHBpdW1gIGJ1dCBpcyBzdGlsbCBub3QgcmVzb2x2YWJsZSB2aWEgYG5weCAtLW5vLWluc3RhbGwgYXBwaXVtYC4gJ1xuICAgICAgICAgICsgJ1RoZSBucG0gZ2xvYmFsIGJpbiBkaXJlY3RvcnkgKHNlZSBgbnBtIGNvbmZpZyBnZXQgcHJlZml4YCkgaXMgbGlrZWx5IG5vdCBvbiBQQVRILiBBZGQgaXQgdG8gUEFUSCwgb3Igc2V0ICdcbiAgICAgICAgICArICdgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXM6IGZhbHNlYCBhbmQgaW5zdGFsbC9tYW5hZ2UgQXBwaXVtIHlvdXJzZWxmLidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nKGBBcHBpdW0gaW5zdGFsbGVkICh2ZXJzaW9uICR7dmVyaWZ5LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gIH1cblxuICAvKipcbiAgICogRmFpbHMgZmFzdCB3aGVuIHRoZSByZXF1ZXN0ZWQgQVZEIGRvZXMgbm90IGV4aXN0LCBiZWZvcmUgYW4gZW11bGF0b3IgaXNcbiAgICogc3Bhd25lZC5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIHByZWZsaWdodCBhIG1pc3NpbmcgQVZEIG5hbWUgaXMgb25seSBkaXNjb3ZlcmVkIGFmdGVyXG4gICAqIHtAbGluayBzdGFydEVtdWxhdG9yfSBzcGF3bnMgYGVtdWxhdG9yIC1hdmQgPG5hbWU+YCBhbmQgdGhlIGJvb3QgbmV2ZXJcbiAgICogY29tcGxldGVzIFx1MjAxNCBhIGZ1bGwge0BsaW5rIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFN9IHNwaW4gZW5kaW5nXG4gICAqIGluIGEgZ2VuZXJpYyBcIm5vIG5ldyBkZXZpY2UgYXBwZWFyZWRcIi4gSW5zdGVhZCB0aGlzIGxpc3RzIHRoZSBjb25maWd1cmVkXG4gICAqIEFWRHMgdXAgZnJvbnQgYW5kIHRocm93cyBhbiBhY3Rpb25hYmxlIGVycm9yIG5hbWluZyB0aGUgYXZhaWxhYmxlIG9uZXMuIEFWRFxuICAgKiBjcmVhdGlvbiBpcyBkZWxpYmVyYXRlbHkgbm90IGF1dG9tYXRlZCAoaXQgcmVxdWlyZXMgYSBzeXN0ZW0taW1hZ2UgZG93bmxvYWQsXG4gICAqIGxpY2Vuc2UgYWNjZXB0YW5jZSwgYW5kIGhhcmR3YXJlL0FQSS1sZXZlbCBjaG9pY2VzKS5cbiAgICpcbiAgICogQHBhcmFtIGF2ZE5hbWUgLSBUaGUgcmVxdWVzdGVkIEFWRCBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVBdmRFeGlzdHMoYXZkTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW11bGF0b3JCaW5hcnkgPSB0aGlzLnJlc29sdmVFbXVsYXRvckJpbmFyeSgpO1xuICAgIHRoaXMubG9nKGBWZXJpZnlpbmcgQVZEIFwiJHthdmROYW1lfVwiIGV4aXN0cyAoJHtlbXVsYXRvckJpbmFyeX0gLWxpc3QtYXZkcykuLi5gKTtcblxuICAgIGNvbnN0IFtlcnJvciwgc3Rkb3V0XSA9IGF3YWl0IG5ldyBQcm9taXNlPFtFcnJvciB8IG51bGwsIHN0cmluZ10+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShlbXVsYXRvckJpbmFyeSwgWyctbGlzdC1hdmRzJ10sIHsgdGltZW91dDogRU1VTEFUT1JfTElTVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LCAoZXhlY0Vycm9yLCBleGVjU3Rkb3V0KSA9PiB7XG4gICAgICAgIHJlc29sdmUoW2V4ZWNFcnJvciwgZXhlY1N0ZG91dF0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsaXN0IEFWRHMgdmlhIFxcYCR7ZW11bGF0b3JCaW5hcnl9IC1saXN0LWF2ZHNcXGA6ICR7ZXJyb3IubWVzc2FnZX0uIGBcbiAgICAgICAgICArICdJcyB0aGUgQW5kcm9pZCBTREsgZW11bGF0b3IgaW5zdGFsbGVkIGFuZCBBTkRST0lEX0hPTUUvQU5EUk9JRF9TREtfUk9PVCBjb3JyZWN0PydcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjaGVja0F2ZEV4aXN0cyh7IGF2ZExpc3RPdXRwdXQ6IHN0ZG91dCwgYXZkTmFtZSB9KSkge1xuICAgICAgY29uc3QgYXZhaWxhYmxlID0gbGlzdEF2YWlsYWJsZUF2ZHMoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFuZHJvaWQgQVZEIFwiJHthdmROYW1lfVwiIG5vdCBmb3VuZC4gQXZhaWxhYmxlIEFWRHM6ICR7YXZhaWxhYmxlLmxlbmd0aCA+IDAgPyBhdmFpbGFibGUuam9pbignLCAnKSA6ICcobm9uZSknfS4gYFxuICAgICAgICAgICsgJ0NyZWF0ZSBpdCAoZS5nLiBpbiB0aGUgQW5kcm9pZCBTdHVkaW8gRGV2aWNlIE1hbmFnZXIsIG9yIHZpYSBgYXZkbWFuYWdlciBjcmVhdGUgYXZkYCksIG9yIHNldCBgYXZkTmFtZWAgdG8gYW4gZXhpc3RpbmcgQVZELidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBleGlzdHMuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZURldmljZUNvbm5lY3RlZChwYXJhbXM6IEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyk6IFByb21pc2U8RW5zdXJlRGV2aWNlQ29ubmVjdGVkUmVzdWx0PiB7XG4gICAgY29uc3QgeyBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0VtdWxhdG9yVmlzaWJsZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGRldmljZUlkc0JlZm9yZSA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIGV4aXN0aW5nIGRldmljZXMgZm9yIEFWRCBcIiR7YXZkTmFtZX1cIi4uLiAoY29ubmVjdGVkOiBbJHtkZXZpY2VJZHNCZWZvcmUuam9pbignLCAnKX1dKWApO1xuXG4gICAgY29uc3QgZXhpc3RpbmdEZXZpY2VJZCA9IGF3YWl0IHRoaXMuZmluZERldmljZUJ5QXZkTmFtZShhdmROYW1lLCBkZXZpY2VJZHNCZWZvcmUpO1xuXG4gICAgaWYgKGV4aXN0aW5nRGV2aWNlSWQpIHtcbiAgICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2V4aXN0aW5nRGV2aWNlSWR9LCByZXVzaW5nLmApO1xuICAgICAgYXdhaXQgdGhpcy5zdXBwcmVzc0Vycm9yRGlhbG9ncyhleGlzdGluZ0RldmljZUlkKTtcbiAgICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkOiBleGlzdGluZ0RldmljZUlkIH07XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lLCBpc0VtdWxhdG9yVmlzaWJsZSk7XG5cbiAgICBsZXQgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgYWN0dWFsRGV2aWNlSWQgPSBhd2FpdCB0aGlzLndhaXRGb3JOZXdEZXZpY2UoZGV2aWNlSWRzQmVmb3JlLCBlbXVsYXRvciwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVtdWxhdG9yLnN0b3BDYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHthdmROYW1lfVwiIHN0YXJ0ZWQsIGRldmljZSAke2FjdHVhbERldmljZUlkfSBpcyBjb25uZWN0ZWQuYCk7XG4gICAgYXdhaXQgdGhpcy5zdXBwcmVzc0Vycm9yRGlhbG9ncyhhY3R1YWxEZXZpY2VJZCk7XG4gICAgcmV0dXJuIHsgYWN0dWFsRGV2aWNlSWQsIGVtdWxhdG9yUHJvY2VzczogZW11bGF0b3IucHJvY2VzcyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVaWF1dG9tYXRvcjJEcml2ZXJJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYENoZWNraW5nIHdoZXRoZXIgdGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgaW5zdGFsbGVkLi4uYCk7XG4gICAgY29uc3QgZHJpdmVyTGlzdEpzb24gPSBhd2FpdCBleGVjKCducHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgbGlzdCAtLWluc3RhbGxlZCAtLWpzb24nLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjaGVja0lzQXBwaXVtRHJpdmVySW5zdGFsbGVkKHsgZHJpdmVyTGlzdEpzb24sIGRyaXZlck5hbWU6IFVJQVVUT01BVE9SMl9EUklWRVJfTkFNRSB9KSkge1xuICAgICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaXMgbm90IGluc3RhbGxlZC4gSW5zdGFsbGluZyB2aWEgXFxgYXBwaXVtIGRyaXZlciBpbnN0YWxsICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfVxcYC4uLmApO1xuICAgIGF3YWl0IGV4ZWMoYG5weCAtLW5vLWluc3RhbGwgYXBwaXVtIGRyaXZlciBpbnN0YWxsICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfWApO1xuICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpbnN0YWxsZWQuYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBmb3IgKGNvbnN0IGRldmljZUlkIG9mIGRldmljZUlkcykge1xuICAgICAgY29uc3QgcnVubmluZ0F2ZCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnZW11JywgJ2F2ZCcsICduYW1lJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC5zcGxpdCgnXFxuJylbMF0/LnRyaW0oKSA/PyAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChydW5uaW5nQXZkID09PSBhdmROYW1lKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb25uZWN0ZWREZXZpY2VJZHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2coYEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIGxpbmVzXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKCdcXHRkZXZpY2UnKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc3BsaXQoJ1xcdCcpWzBdID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGV2aWNlUHJvcChkZXZpY2VJZDogc3RyaW5nLCBwcm9wOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgcHJvcF0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiBubyBvdXRwdXQgb24gdGltZW91dC9lcnJvciAobm90IHBhcnRpYWwgc3Rkb3V0KSBzbyBhIG5vbi1yZXNwb25zaXZlIGd1ZXN0IHJlYWRzIGFzIFwibm90IGlkbGVcIi5cbiAgICAgICAgICByZXNvbHZlKGVycm9yID8gJycgOiBzdGRvdXQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2NtZCcsICdwYWNrYWdlJywgJ2xpc3QnLCAncGFja2FnZXMnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gUmV0dXJuIG5vIG91dHB1dCBvbiB0aW1lb3V0L2Vycm9yIHNvIGEgY2h1cm5pbmcgZ3Vlc3QncyBzbG93L3BhcnRpYWwgcGFja2FnZSBsaXN0IGNhbid0IGZhbHNlbHkgcmVhZCBhcyBpZGxlLlxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke3RoaXMudHlwZX1dICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2RrUm9vdCA9IHByb2Nlc3MuZW52WydBTkRST0lEX0hPTUUnXSA/PyBwcm9jZXNzLmVudlsnQU5EUk9JRF9TREtfUk9PVCddO1xuICAgIGlmICghc2RrUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ2Fubm90IGZpbmQgQW5kcm9pZCBlbXVsYXRvcjogbmVpdGhlciBBTkRST0lEX0hPTUUgbm9yIEFORFJPSURfU0RLX1JPT1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBqb2luKHNka1Jvb3QsICdlbXVsYXRvcicsICdlbXVsYXRvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kS2V5RXZlbnQoZGV2aWNlSWQ6IHN0cmluZywga2V5Q29kZTogbnVtYmVyLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnaW5wdXQnLCAna2V5ZXZlbnQnLCBTdHJpbmcoa2V5Q29kZSldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICAgICAgYFdhcm5pbmc6IGZhaWxlZCB0byAke2Rlc2NyaXB0aW9ufSAoa2V5ZXZlbnQgJHtTdHJpbmcoa2V5Q29kZSl9KTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhcnRBcHBpdW1BbmRFbXVsYXRvcihwYXJhbXM6IFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBhcHBpdW1VcmwsIGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzQXBwaXVtQ29uc29sZVZpc2libGUsIGlzRW11bGF0b3JWaXNpYmxlLCBwb3J0LCBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcywgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtIH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuXG4gICAgdGhpcy5sb2coYENoZWNraW5nIEFwcGl1bSBzZXJ2ZXIgYXQgJHthcHBpdW1VcmwuaHJlZn0uLi5gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZShhcHBpdW1VcmwpO1xuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXJ2ZXIgaXMgcmVhY2hhYmxlLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1MYXVuY2g6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgaWYgKHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwaXVtRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bUxhdW5jaCA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwaXVtUHJvY2VzcyA9IGFwcGl1bUxhdW5jaD8ucHJvY2VzcztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBbLCBkZXZpY2VSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcHBpdW1MYXVuY2hcbiAgICAgICAgICA/IHRoaXMud2FpdEZvckFwcGl1bVJlYWR5KGFwcGl1bVVybCwgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bUxhdW5jaCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLmVuc3VyZURldmljZUNvbm5lY3RlZCh7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0pXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogUHJvY2Vzc0xhdW5jaCB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzKGlzQ29uc29sZUhpZGRlbik7XG4gICAgLypcbiAgICAgKiBgLS1uby1pbnN0YWxsYDogQXBwaXVtIGlzIGd1YXJhbnRlZWQgcHJlc2VudCBieSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYFxuICAgICAqIGJlZm9yZSB3ZSByZWFjaCBoZXJlLCBzbyBwaW4gbnB4IHRvIHRoZSBpbnN0YWxsZWQgY29weS4gV2l0aG91dCBpdCwgbnB4XG4gICAgICogd291bGQgc2lsZW50bHkgdHJ5IHRvIGRvd25sb2FkIEFwcGl1bSBmcmVzaCBmcm9tIHRoZSByZWdpc3RyeSBcdTIwMTQgYVxuICAgICAqIHNsb3cvaHVuZyBmYWlsdXJlIGluIGEgaGlkZGVuIGNvbnNvbGUgXHUyMDE0IHdoZW5ldmVyIGl0IGNvdWxkIG5vdCByZXNvbHZlIHRoZVxuICAgICAqIGdsb2JhbCBpbnN0YWxsIChlLmcuIGEgZ2xvYmFsIHByZWZpeCBub3Qgb24gUEFUSCkuIFNlZSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYC5cbiAgICAgKlxuICAgICAqIFBpcGUgc3Rkb3V0L3N0ZGVyciBldmVuIHdoZW4gaGlkZGVuIChyYXRoZXIgdGhhbiBkaXNjYXJkaW5nKSBzbyBhbiBlYXJseVxuICAgICAqIGZhaWx1cmUgc3VjaCBhcyBhIGNyYXNoIG9yIGEgbWlzc2luZyBkcml2ZXIgaXMgY2FwdHVyZWQgYW5kIHN1cmZhY2VkXG4gICAgICogaW1tZWRpYXRlbHkgYnkgYHdhaXRGb3JBcHBpdW1SZWFkeWAsIG1pcnJvcmluZyBgc3RhcnRFbXVsYXRvcmA7XG4gICAgICogYHdpbmRvd3NIaWRlYCBzdGlsbCBzdXBwcmVzc2VzIHRoZSBjb25zb2xlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUFQUElVTV9PVVRQVVRfVEFJTF9NQVhfTEVOR1RIKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RW11bGF0b3IoYXZkTmFtZTogc3RyaW5nLCBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4pOiBQcm9jZXNzTGF1bmNoIHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHRoaXMucmVzb2x2ZUVtdWxhdG9yQmluYXJ5KCk7XG4gICAgY29uc3QgaXNXaW5kb3dIaWRkZW4gPSBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3coaXNFbXVsYXRvclZpc2libGUpO1xuICAgIGNvbnN0IGFyZ3MgPSBidWlsZEVtdWxhdG9yQXJncyh7IGF2ZE5hbWUsIGlzSGlkZGVuOiBpc1dpbmRvd0hpZGRlbiB9KTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFncyhpc1dpbmRvd0hpZGRlbik7XG4gICAgdGhpcy5sb2coYFJ1bm5pbmc6ICR7ZW11bGF0b3JCaW5hcnl9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgLypcbiAgICAgKiBQaXBlIChyYXRoZXIgdGhhbiBpZ25vcmUpIHN0ZG91dC9zdGRlcnIgc28gYW4gZWFybHkgZmFpbHVyZSBzdWNoIGFzXG4gICAgICogXCJ4ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb25cIiBjYW4gYmVcbiAgICAgKiBzdXJmYWNlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBhcmdzLCB7XG4gICAgICBkZXRhY2hlZCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG4gICAgLypcbiAgICAgKiBBIHNwYXduIGZhaWx1cmUgKGUuZy4gRU5PRU5UIGZvciBhIG1pc3NpbmcvYnJva2VuIGVtdWxhdG9yIGJpbmFyeSkgZW1pdHNcbiAgICAgKiAnZXJyb3InLCBub3QgJ2V4aXQnLiBSZWNvcmQgaXQgYXMgYSBzeW50aGV0aWMgZXhpdCBzbyB0aGUgYm9vdC9uZXctZGV2aWNlXG4gICAgICogcG9sbHMgZmFpbCBmYXN0IGluc3RlYWQgb2Ygc3Bpbm5pbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzOiBjaGlsZCxcbiAgICAgIHJlYWRFeGl0SW5mbzogKCkgPT4gZXhpdEluZm8sXG4gICAgICByZWFkT3V0cHV0OiAoKSA9PiBjYXB0dXJlZE91dHB1dCxcbiAgICAgIHN0b3BDYXB0dXJlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgICAqIExlYXZlIHRoZSBgZGF0YWAgbGlzdGVuZXJzIGF0dGFjaGVkIHNvIHRoZSBwaXBlcyBrZWVwIGRyYWluaW5nIChhXG4gICAgICAgICAqIGZ1bGwgT1MgcGlwZSBidWZmZXIgd291bGQgYmxvY2sgdGhlIGxvbmctcnVubmluZyBlbXVsYXRvcik7IHRoZSBmbGFnXG4gICAgICAgICAqIGp1c3QgZnJlZXplcyB0aGUgY2FwdHVyZWQgdGFpbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC5cbiAgICAgICAgICovXG4gICAgICAgIGlzQ2FwdHVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGFwcGVuZE91dHB1dChjaHVuazogQnVmZmVyKTogdm9pZCB7XG4gICAgICBpZiAoIWlzQ2FwdHVyaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhcHR1cmVkT3V0cHV0ID0gKGNhcHR1cmVkT3V0cHV0ICsgY2h1bmsudG9TdHJpbmcoKSkuc2xpY2UoLUVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyB0aGUgZ3Vlc3QncyBjcmFzaC9BTlIgZGlhbG9ncyBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuICAgKlxuICAgKiBBIHJlc291cmNlLXN0YXJ2ZWQgZW11bGF0b3IgY2FuIHJhaXNlIGEgXCJQcm9jZXNzIHN5c3RlbSBpc24ndCByZXNwb25kaW5nXCJcbiAgICogQU5SIChhbiBgQWN0aXZpdHlNYW5hZ2VyU2VydmljZWAgdGltZW91dCkgd2hvc2UgZGlhbG9nIG92ZXJsYXlzIHRoZSBVSS4gSWZcbiAgICogaXQgYXBwZWFycyBiZWZvcmUgQXBwaXVtIGF0dGFjaGVzLCBub3RoaW5nIGNhbiBkaXNtaXNzIGl0IGFuZCB0aGUgcnVuIGhhbmdzXG4gICAqIG9yIGZhaWxzIGludGVybWl0dGVudGx5LiBTZXR0aW5nIHRoZSBgaGlkZV9lcnJvcl9kaWFsb2dzYCBnbG9iYWwgXHUyMDE0IHRoZSBzYW1lXG4gICAqIGZsYWcgQW5kcm9pZCdzIG93biB0ZXN0IGluZnJhIHVzZXMgXHUyMDE0IHRlbGxzIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0b1xuICAgKiBuZXZlciBkcmF3IGNyYXNoL0FOUiBkaWFsb2dzLCBzbyB0aGUgQU5SIGNhbiBubyBsb25nZXIgYmxvY2sgYXV0b21hdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZWFybGllc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGZsYWcgY2FuIGJlIHNldDogdGhlIGZyYW1ld29ya1xuICAgKiAoYHN5c3RlbV9zZXJ2ZXJgKSBtdXN0IGJlIHVwIGJlZm9yZSBgc2V0dGluZ3MgcHV0YCB3b3Jrcywgc28gY2FsbGVycyBpbnZva2VcbiAgICogaXQgb25seSBhZnRlciBgc3lzLmJvb3RfY29tcGxldGVkYC4gSXQgbmFycm93cyBcdTIwMTQgYnV0IGNhbm5vdCBmdWxseSBjbG9zZSBcdTIwMTRcbiAgICogdGhlIHJhY2Ugd2l0aCBhbiBBTlIgdGhhdCBmaXJlcyBiZXR3ZWVuIGJvb3QgY29tcGxldGluZyBhbmQgdGhpcyBjYWxsOyBhXG4gICAqIHByZS1iYWtlZCBzbmFwc2hvdCB3aXRoIHRoZSBmbGFnIGFscmVhZHkgc2V0IGlzIHRoZSBvbmx5IHdheSB0byBlbGltaW5hdGVcbiAgICogaXQgZW50aXJlbHkuIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzaW5jZSBpdCBvbmx5XG4gICAqIHN1cHByZXNzZXMgYSBzeW1wdG9tLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdXBwcmVzc0Vycm9yRGlhbG9ncyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYERpc2FibGluZyBjcmFzaC9BTlIgZGlhbG9ncyBvbiBkZXZpY2UgJHtkZXZpY2VJZH0gKHNldHRpbmdzIHB1dCBnbG9iYWwgaGlkZV9lcnJvcl9kaWFsb2dzIDEpLi4uYCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdzZXR0aW5ncycsICdwdXQnLCAnZ2xvYmFsJywgJ2hpZGVfZXJyb3JfZGlhbG9ncycsICcxJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvIGRpc2FibGUgY3Jhc2gvQU5SIGRpYWxvZ3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1SZWFkeSh1cmw6IFVSTCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIsIGxhdW5jaDogUHJvY2Vzc0xhdW5jaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJZiB0aGUgc2VydmVyIHByb2Nlc3MgYWxyZWFkeSBkaWVkIChjcmFzaGVkLCBvciBuZXZlciBzdGFydGVkKSwgc3RvcFxuICAgICAgICogcG9sbGluZyBhbmQgc3VyZmFjZSB3aHkgXHUyMDE0IG90aGVyd2lzZSBhIGRvb21lZCBzZXJ2ZXIgc3BpbnMgb3V0IHRoZSB3aG9sZVxuICAgICAgICogcmVhZGluZXNzIHRpbWVvdXQgd2l0aCBubyBkaWFnbm9zdGljcyAodGhlIG9yaWdpbmFsIFQ4NCBzeW1wdG9tKS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZXhpdEluZm8gPSBsYXVuY2gucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgYnVpbGREZWF0aEVycm9yKGV4aXRJbmZvKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0FwcGl1bVJlYWNoYWJsZSh1cmwpO1xuICAgICAgICBsYXVuY2guc3RvcENhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ6ICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxFeGl0SW5mbyA9IGxhdW5jaC5yZWFkRXhpdEluZm8oKTtcbiAgICBpZiAoZmluYWxFeGl0SW5mbykge1xuICAgICAgdGhyb3cgYnVpbGREZWF0aEVycm9yKGZpbmFsRXhpdEluZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dFRhaWwgPSBsYXVuY2gucmVhZE91dHB1dCgpLnRyaW0oKTtcbiAgICBjb25zdCBvdXRwdXRTZWN0aW9uID0gb3V0cHV0VGFpbC5sZW5ndGggPiAwID8gYFxcblxcbkFwcGl1bSBzZXJ2ZXIgb3V0cHV0ICh0YWlsKTpcXG4ke291dHB1dFRhaWx9YCA6ICcnO1xuICAgIHRocm93IG5ldyBFcnJvcihgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuJHtvdXRwdXRTZWN0aW9ufWApO1xuXG4gICAgZnVuY3Rpb24gYnVpbGREZWF0aEVycm9yKGV4aXRJbmZvOiBQcm9jZXNzRXhpdEluZm8pOiBFcnJvciB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgZXhpdEluZm8sXG4gICAgICAgIG91dHB1dDogbGF1bmNoLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgb3V0cHV0TGFiZWw6ICdBcHBpdW0gc2VydmVyIG91dHB1dCcsXG4gICAgICAgIHN1YmplY3Q6ICdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlcidcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIsIGVtdWxhdG9yOiBQcm9jZXNzTGF1bmNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVtYWluaW5nTXMgPSBNYXRoLm1heCgwLCBkZWFkbGluZSAtIERhdGUubm93KCkpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYFdhaXRpbmcgZm9yIGRldmljZSAke2RldmljZUlkfSB0byBmaW5pc2ggYm9vdGluZyAocmVtYWluaW5nOiAke1N0cmluZyhyZW1haW5pbmdNcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuXG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgY29uc3QgaXNCb290ZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgJ3N5cy5ib290X2NvbXBsZXRlZCddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpID09PSAnMScpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNCb290ZWQpIHtcbiAgICAgICAgdGhpcy5sb2coYERldmljZSAke2RldmljZUlkfSBib290IGNvbXBsZXRlZC5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGVtdWxhdG9yLnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSh7XG4gICAgICAgICAgZXhpdEluZm8sXG4gICAgICAgICAgb3V0cHV0OiBlbXVsYXRvci5yZWFkT3V0cHV0KCksXG4gICAgICAgICAgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnLFxuICAgICAgICAgIHN1YmplY3Q6ICdBbmRyb2lkIGVtdWxhdG9yJ1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciBhIGZyZXNobHktYm9vdGVkIGVtdWxhdG9yIHRvIGJlY29tZSBpZGxlIGJlZm9yZSB0aGUgc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgYmVmb3JlIHRoZSBndWVzdCBpcyBhY3R1YWxseSBpZGxlIFx1MjAxNCBwYWNrYWdlXG4gICAqIG9wdGltaXphdGlvbiBhbmQgc2VydmljZXMga2VlcCBjaHVybmluZyBcdTIwMTQgc28gZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW1cbiAgICogc2Vzc2lvbiBpbW1lZGlhdGVseSBtYWtlcyBldmVyeSBzZXJpYWxpemVkIFVpQXV0b21hdG9yMiBgYWRiYCByb3VuZC10cmlwXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoaXMgcG9sbHNcbiAgICogYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKGJvb3QgYW5pbWF0aW9uIHN0b3BwZWQgKyBwYWNrYWdlIG1hbmFnZXIgc2VydmluZyxcbiAgICogdmlhIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBhbmQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGlzIHNhdGlzZmllZC5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5nZXREZXZpY2VQcm9wKGRldmljZUlkLCAnaW5pdC5zdmMuYm9vdGFuaW0nKSxcbiAgICAgICAgdGhpcy5saXN0SW5zdGFsbGVkUGFja2FnZXMoZGV2aWNlSWQpXG4gICAgICBdKTtcblxuICAgICAgaWYgKGNoZWNrRGV2aWNlSWRsZSh7IGJvb3RBbmltYXRpb25Qcm9wLCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck5ld0RldmljZShkZXZpY2VJZHNCZWZvcmU6IHN0cmluZ1tdLCBlbXVsYXRvcjogUHJvY2Vzc0xhdW5jaCwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoYWN0dWFsRGV2aWNlSWQsIGRlYWRsaW5lLCBlbXVsYXRvcik7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZUlkbGUoYWN0dWFsRGV2aWNlSWQsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgICBvdXRwdXQ6IGVtdWxhdG9yLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgICBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcsXG4gICAgICAgICAgc3ViamVjdDogJ0FuZHJvaWQgZW11bGF0b3InXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBuZXcgZW11bGF0b3IgZGV2aWNlIGFwcGVhcmVkIHdpdGhpbiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FrZVNjcmVlbihkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2coYFdha2luZyBzY3JlZW4gb24gZGV2aWNlICR7ZGV2aWNlSWR9Li4uYCk7XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9XQUtFVVAsICd3YWtlIHNjcmVlbicpO1xuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX01FTlUsICdkaXNtaXNzIGxvY2sgc2NyZWVuJyk7XG5cbiAgICB0aGlzLmxvZyhgU2NyZWVuIHdha2UgY29tcGxldGUgb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBhbiBvd25lZCBkZXNrdG9wIENEUCB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBBIG5ldyB0cmFuc3BvcnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBjb25zdCB0eXBlID0gb3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuXG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNkcFRyYW5zcG9ydChvcHRpb25zKTtcbiAgfVxuXG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSh0eXBlKTtcbiAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjYWNoZWQgdHJhbnNwb3J0IGluc3RhbmNlLCBjcmVhdGluZyBvbmUgZnJvbSB0aGUgZ2l2ZW4gb3B0aW9uc1xuICogaWYgbm90IGFscmVhZHkgY2FjaGVkLlxuICpcbiAqIFRoZSB0cmFuc3BvcnQgaXMgY2FjaGVkIHBlciB3b3JrZXIgcHJvY2VzcyBzbyBXZWJTb2NrZXQvQXBwaXVtIHNlc3Npb25zXG4gKiBhcmUgcmV1c2VkIGFjcm9zcyBjYWxscyB3aXRoaW4gdGhlIHNhbWUgdGVzdCB3b3JrZXIuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gQ0xJIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgY3JlYXRlZCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPckNyZWF0ZVRyYW5zcG9ydChvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICBpZiAoY2FjaGVkVHJhbnNwb3J0KSB7XG4gICAgcmV0dXJuIGNhY2hlZFRyYW5zcG9ydDtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBTaW5nbGUtdGhyZWFkZWQgd29ya2VyOyBubyBjb25jdXJyZW50IHdyaXRlcy5cbiAgY2FjaGVkVHJhbnNwb3J0ID0gcmVzdWx0O1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogZm9yIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIGVpdGhlciB0aHJvd3NcbiAqIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9ICh3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KVxuICogb3IgcHJvY2VlZHMgdG8gbGF1bmNoIHdpdGggYSB3YXJuaW5nOyBmb3IgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gQm90aCB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZCB3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXN9IGlzXG4gKiBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSB3YXJuL3Rocm93IGtub2JzLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkocGFyYW1zOiBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uLCBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLCBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzIH0gPSBwYXJhbXM7XG4gIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24oe1xuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0aWVyOiBjb21wYXRpYmlsaXR5LnRpZXJcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi11bnJ1bm5hYmxlJykge1xuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBPYnNpZGlhbiBpbnN0YWxsZXIgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lmluc3RhbGxlclZlcnNpb24pfSBpcyBiZWxvdyB0aGUgYFxuICAgICAgICArIGBydW4gZmxvb3IgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbil9IGZvciBPYnNpZGlhbiAke2NvbXBhdGliaWxpdHkuYXBwVmVyc2lvbn07IGBcbiAgICAgICAgKyAncHJvY2VlZGluZyB0byBsYXVuY2ggKHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIgaXMgZmFsc2UpIFx1MjAxNCB0aGUgYm9vdCB3aWxsIGxpa2VseSBkZWFkLWJvb3QuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi1uYWdnZWQnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSAke2Vuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWVzc2FnZSl9YCk7XG4gIH1cblxuICByZXR1cm4gY29tcGF0aWJpbGl0eTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVza3RvcCBDRFAgdHJhbnNwb3J0LiBXaGVuIGFuIGV4cGxpY2l0IGBwb3J0YCBpcyBnaXZlbiB0aGVcbiAqIHRyYW5zcG9ydCBhdHRhY2hlcyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gb24gdGhhdCBwb3J0OyBvdGhlcndpc2UgaXRcbiAqIGxhdW5jaGVzIGFuZCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlICh0aGUgZGVmYXVsdCwgaGVybWV0aWMgbW9kZSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvd25lZFN1ZmZpeCA9IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/ICcgKGhhcm5lc3Mtb3duZWQpJyA6ICcnO1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQXR0YWNoaW5nIHRvIHJ1bm5pbmcgT2JzaWRpYW4ke293bmVkU3VmZml4fSAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0KX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgICBjZHBIb3N0OiBvcHRpb25zLmhvc3QsXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2VcbiAgICB9KSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgY2RwSG9zdDogb3B0aW9ucz8uaG9zdCxcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUsXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogcmVzb2x2ZVNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sob3B0aW9ucz8uc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uOiBzd2FwQXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uOiBzaGVsbFZlcnNpb24sXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogcmVzb2x2ZVNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIob3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSk7XG5cbiAgLy8gVGhlIHBpbiBpcyBrbm93biBydW5uYWJsZSBcdTIwMTQgcmVzb2x2ZS9kb3dubG9hZCB0aGUgZGVmZXJyZWQgc2hlbGwgKyBhc2FyIG5vdy5cbiAgLy8gUmV1c2UgdGhlIGluc3RhbGxlZCBzaGVsbCBvbmx5IHdoZW4gaXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBwaW4gKHNhdmVzIHRoZVxuICAvLyBEb3dubG9hZCk7IG90aGVyd2lzZSBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGlubmVkIGluc3RhbGxlci5cbiAgaWYgKHBpbm5lZEluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpO1xuICAgIGV4ZVBhdGggPSBpbnN0YWxsZWQ/LnNoZWxsVmVyc2lvbiA9PT0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcbiAgICB1c2VyRGF0YURpcjogY3JlYXRlT3duZWRVc2VyRGF0YURpcigpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgQ29ubmVjdGlvbmAgYW5kIGBDb250ZW50LUxlbmd0aGAgZnJvbSBhIFdlYkRyaXZlciByZXF1ZXN0J3MgaGVhZGVycy5cbiAqXG4gKiBUaGUgYnVuZGxlZCBgd2ViZHJpdmVyYCBwYWNrYWdlIHNldHMgYm90aCBoZWFkZXJzIGV4cGxpY2l0bHkuIFRoZXkgYXJlXG4gKiBmb3JiaWRkZW4gcmVxdWVzdCBoZWFkZXJzIHBlciB0aGUgRmV0Y2ggc3BlYzogTm9kZSB1cCB0byAyNSBhY2NlcHRlZCB0aGVtXG4gKiBzaWxlbnRseSwgYnV0IE5vZGUgMjYgcmVqZWN0cyB0aGVtIHdpdGggYFVORF9FUlJfSU5WQUxJRF9BUkdgLCBicmVha2luZyB0aGVcbiAqIEFwcGl1bSBgL3Nlc3Npb25gIHJlcXVlc3QuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWFuYWdlcyBjb25uZWN0aW9uIHJldXNlIGFuZFxuICogdGhlIEZldGNoIEFQSSBjb21wdXRlcyBgQ29udGVudC1MZW5ndGhgIGZyb20gdGhlIGJvZHksIHNvIGRyb3BwaW5nIGJvdGggaXNcbiAqIHNhZmUgb24gZXZlcnkgTm9kZSB2ZXJzaW9uLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJkcml2ZXJpby93ZWJkcml2ZXJpby9pc3N1ZXMvMTUyNjV9LlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyAtIFRoZSByZXF1ZXN0IG9wdGlvbnMgYWJvdXQgdG8gYmUgc2VudCBieSBXZWJEcml2ZXJJTy5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIHJlcXVlc3Qgb3B0aW9ucyB3aXRoIHRoZSBmb3JiaWRkZW4gaGVhZGVycyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVycyhyZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQpOiBSZXF1ZXN0SW5pdCB7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb25uZWN0aW9uJyk7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFVQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBZVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsWUFBWTtBQUNyQixTQUFTLHlDQUF5QztBQUNsRCxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFdBQVc7QUFDcEIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLCtCQUErQjtBQUN4QyxTQUFTLDBDQUEwQztBQUNuRDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMseUJBQXlCO0FBQ2xDO0FB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WUFBWSxLQUFLLElBQUk7QUFDaEcsYUFBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sTUFBTSxTQUFTLE9BQU8sUUFBUSxFQUFFO0FBQUEsSUFDaEU7QUFBQSxFQUNGO0FBRUEsU0FBTyxDQUFDO0FBQ1Y7QUFhQSxlQUFlLDhCQUFtRTtBQUNoRixNQUFJO0FBQ0YsVUFBTSxVQUFVLE1BQU0sMEJBQTBCO0FBQ2hELFdBQU8sRUFBRSxTQUFTLGNBQWMsNEJBQTRCLE9BQU8sRUFBRTtBQUFBLEVBQ3ZFLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBeUJBLGVBQWUsMkJBQTJCLFNBQXFFO0FBSzdHLE1BQUk7QUFDSixNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUksU0FBUyw2QkFBNkIsUUFBVztBQUNuRCxjQUFVLE1BQU0sMEJBQTBCO0FBQzFDLG1CQUFlLDRCQUE0QixPQUFPO0FBQUEsRUFDcEQsT0FBTztBQUdMLDZCQUF5QixNQUFNLHVCQUF1QixRQUFRLHdCQUF3QjtBQUN0RixtQkFBZTtBQUFBLEVBQ2pCO0FBR0EsUUFBTSxPQUFPLE1BQU0sZ0JBQWdCLFNBQVMsWUFBWTtBQUt4RCxRQUFNLGlCQUFpQixLQUFLLHFCQUFxQixLQUFLLE1BQU07QUFDNUQsUUFBTSxnQkFBZ0IsNEJBQTRCO0FBQUEsSUFDaEQsWUFBWTtBQUFBLElBQ1osa0JBQWtCO0FBQUEsSUFDbEIsb0NBQW9DLDBDQUEwQyxTQUFTLGtDQUFrQztBQUFBLElBQ3pILGlDQUFpQyx1Q0FBdUMsU0FBUywrQkFBK0I7QUFBQSxFQUNsSCxDQUFDO0FBS0QsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxVQUFNLFlBQVksTUFBTSw0QkFBNEI7QUFDcEQsY0FBVSxXQUFXLGlCQUFpQix5QkFBeUIsVUFBVSxVQUFVLE1BQU0sa0JBQWtCLHNCQUFzQjtBQUFBLEVBQ25JO0FBQ0EsTUFBSSxLQUFLLDhCQUE4QixRQUFXO0FBQ2hELGNBQVUsTUFBTSxrQkFBa0IsS0FBSyx5QkFBeUI7QUFBQSxFQUNsRTtBQUVBLFFBQU0sT0FBTyxLQUFLLHNCQUFzQixTQUNwQyxLQUFLLE9BQ0wsRUFBRSxNQUFNLE1BQU0saUJBQWlCLEtBQUssaUJBQWlCLEdBQUcsU0FBUyxLQUFLLGtCQUFrQjtBQUU1RixTQUFPO0FBQUEsSUFDTCxHQUFJLFFBQVEsRUFBRSxLQUFLO0FBQUEsSUFDbkIsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsU0FBUyxrQkFBa0IsT0FBTztBQUFBLElBQ2xDLGFBQWEsdUJBQXVCO0FBQUEsRUFDdEM7QUFDRjtBQWVBLFNBQVMsMkJBQTJCLGdCQUEwQztBQUM1RSxNQUFJLGVBQWUsbUJBQW1CLFNBQVM7QUFDN0MsbUJBQWUsUUFBUSxPQUFPLFlBQVk7QUFDMUMsbUJBQWUsUUFBUSxPQUFPLGdCQUFnQjtBQUFBLEVBQ2hEO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJraWxsQXV0b1N0YXJ0ZWRQcm9jZXNzZXMiXQp9Cg==