obsidian-integration-testing 8.3.0 → 8.4.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 (60) hide show
  1. package/dist/lib/cjs/asar-fallback-detection.cjs +48 -0
  2. package/dist/lib/cjs/asar-fallback-detection.d.cts +75 -0
  3. package/dist/lib/cjs/compatibility-options.cjs +18 -1
  4. package/dist/lib/cjs/compatibility-options.d.cts +41 -0
  5. package/dist/lib/cjs/connect-to-cdp.cjs +17 -18
  6. package/dist/lib/cjs/connect-to-cdp.d.cts +25 -0
  7. package/dist/lib/cjs/ecmascript-version.cjs +63 -0
  8. package/dist/lib/cjs/ecmascript-version.d.cts +28 -0
  9. package/dist/lib/cjs/index.cjs +7 -1
  10. package/dist/lib/cjs/index.d.cts +5 -1
  11. package/dist/lib/cjs/installer-asset.cjs +18 -3
  12. package/dist/lib/cjs/installer-asset.d.cts +26 -0
  13. package/dist/lib/cjs/library.cjs +1 -1
  14. package/dist/lib/cjs/namespace-bootstrap.cjs +44 -7
  15. package/dist/lib/cjs/normalize-optional-properties.cjs +31 -0
  16. package/dist/lib/cjs/normalize-optional-properties.d.cts +26 -0
  17. package/dist/lib/cjs/obsidian-installer.cjs +6 -1
  18. package/dist/lib/cjs/obsidian-metadata.cjs +3775 -302
  19. package/dist/lib/cjs/obsidian-metadata.d.cts +71 -0
  20. package/dist/lib/cjs/obsidian-version-switch.cjs +5 -2
  21. package/dist/lib/cjs/owned-vault-seed.cjs +38 -0
  22. package/dist/lib/cjs/owned-vault-seed.d.cts +67 -0
  23. package/dist/lib/cjs/silent-asar-fallback-error.cjs +48 -0
  24. package/dist/lib/cjs/silent-asar-fallback-error.d.cts +40 -0
  25. package/dist/lib/cjs/transport-desktop-cdp.cjs +197 -73
  26. package/dist/lib/cjs/transport-desktop-cdp.d.cts +74 -15
  27. package/dist/lib/cjs/transport-factory.cjs +14 -12
  28. package/dist/lib/cjs/transport-options.cjs +1 -1
  29. package/dist/lib/cjs/transport-options.d.cts +16 -0
  30. package/dist/lib/esm/asar-fallback-detection.d.mts +75 -0
  31. package/dist/lib/esm/asar-fallback-detection.mjs +24 -0
  32. package/dist/lib/esm/compatibility-options.d.mts +41 -0
  33. package/dist/lib/esm/compatibility-options.mjs +16 -1
  34. package/dist/lib/esm/connect-to-cdp.d.mts +25 -0
  35. package/dist/lib/esm/connect-to-cdp.mjs +17 -18
  36. package/dist/lib/esm/ecmascript-version.d.mts +28 -0
  37. package/dist/lib/esm/ecmascript-version.mjs +39 -0
  38. package/dist/lib/esm/index.d.mts +5 -1
  39. package/dist/lib/esm/index.mjs +5 -1
  40. package/dist/lib/esm/installer-asset.d.mts +26 -0
  41. package/dist/lib/esm/installer-asset.mjs +16 -2
  42. package/dist/lib/esm/library.mjs +1 -1
  43. package/dist/lib/esm/namespace-bootstrap.mjs +44 -7
  44. package/dist/lib/esm/normalize-optional-properties.d.mts +26 -0
  45. package/dist/lib/esm/normalize-optional-properties.mjs +7 -0
  46. package/dist/lib/esm/obsidian-installer.mjs +8 -2
  47. package/dist/lib/esm/obsidian-metadata.d.mts +71 -0
  48. package/dist/lib/esm/obsidian-metadata.mjs +3775 -302
  49. package/dist/lib/esm/obsidian-version-switch.mjs +5 -2
  50. package/dist/lib/esm/owned-vault-seed.d.mts +67 -0
  51. package/dist/lib/esm/owned-vault-seed.mjs +14 -0
  52. package/dist/lib/esm/silent-asar-fallback-error.d.mts +40 -0
  53. package/dist/lib/esm/silent-asar-fallback-error.mjs +24 -0
  54. package/dist/lib/esm/transport-desktop-cdp.d.mts +74 -15
  55. package/dist/lib/esm/transport-desktop-cdp.mjs +197 -73
  56. package/dist/lib/esm/transport-factory.mjs +15 -12
  57. package/dist/lib/esm/transport-options.d.mts +16 -0
  58. package/dist/obsidian-integration-testing-8.4.0.tgz +0 -0
  59. package/package.json +3 -1
  60. package/dist/obsidian-integration-testing-8.3.0.tgz +0 -0
@@ -16,6 +16,7 @@
16
16
  *
17
17
  * Requirements: Node.js 22+ (uses built-in `WebSocket` and `fetch` globals).
18
18
  */
19
+ import type { AsarFallback } from './asar-fallback-detection.cjs';
19
20
  import type { ElectronCompatibility } from './electron-compatibility.cjs';
20
21
  import type { InstallerCompatibility } from './installer-compatibility.cjs';
21
22
  import type { ObsidianTransport, TransportEvalOptions } from './transport.cjs';
@@ -75,6 +76,16 @@ export interface DesktopCdpTransportConfig {
75
76
  * @default `false`
76
77
  */
77
78
  shouldDisableSandbox?: boolean;
79
+ /**
80
+ * Whether a post-boot **silent asar fallback** (the running app version differs
81
+ * from the swapped-in pin) fails fast with {@link SilentAsarFallbackError}. The
82
+ * verdict is always computed and surfaced via
83
+ * {@link DesktopCdpTransport.getAsarFallback}; this gates only the throw. Only
84
+ * meaningful in owned mode running a swapped-in asar.
85
+ *
86
+ * @default `true`
87
+ */
88
+ shouldThrowOnSilentAsarFallback?: boolean;
78
89
  /**
79
90
  * Whether the post-boot runtime-Electron compatibility nag warning is emitted
80
91
  * when the live Electron is below the app's recommended minimum. The verdict is
@@ -141,6 +152,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
141
152
  */
142
153
  readonly isMobile = false;
143
154
  private activeVaultPath;
155
+ private asarFallback;
144
156
  private readonly cdpHost;
145
157
  private cdpPort;
146
158
  private cdpUrl;
@@ -153,6 +165,7 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
153
165
  private readonly ownedConfig;
154
166
  private ownedInstance;
155
167
  private readonly shouldDisableSandbox;
168
+ private readonly shouldThrowOnSilentAsarFallback;
156
169
  private readonly shouldWarnOnCompatibilityIssues;
157
170
  private ws;
158
171
  /**
@@ -185,6 +198,19 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
185
198
  * @returns The normalized result string.
186
199
  */
187
200
  evaluate(expression: string, options: TransportEvalOptions): Promise<string>;
201
+ /**
202
+ * Returns the silent-asar-fallback verdict for this owned instance — whether the
203
+ * app version it is actually running matches the swapped-in pin, or the installer
204
+ * silently reverted to its own bundled asar (read live post-boot). Returns
205
+ * `undefined` when this is not an owned instance, the instance has not booted
206
+ * yet, or the verdict could not be determined (no asar was swapped, or the live
207
+ * version was unreadable). A `'fallback'` verdict reaches this surface only when
208
+ * the throw is disabled ({@link DesktopCdpTransportConfig.shouldThrowOnSilentAsarFallback}
209
+ * `false`); otherwise it throws `SilentAsarFallbackError`.
210
+ *
211
+ * @returns The silent-asar-fallback verdict, or `undefined`.
212
+ */
213
+ getAsarFallback(): AsarFallback | undefined;
188
214
  /**
189
215
  * Returns the resolved installer↔app compatibility verdict for this owned
190
216
  * instance, so callers can assert on it. Returns `undefined` when this is not
@@ -239,24 +265,46 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
239
265
  */
240
266
  unregisterVault(vaultPath: string): Promise<void>;
241
267
  /**
242
- * Best-effort tier-2 runtime nag: reads the live Electron version and running
243
- * app version from the booted owned renderer and warns when the Electron the
244
- * instance is actually running is older than the app's recommended minimum.
245
- * Stores the verdict on {@link getElectronCompatibility}.
246
- *
247
- * The app version is read **live** — the running app version from the main
248
- * process (`ipcRenderer.sendSync('version')`, the same IPC channel the namespace
249
- * bootstrap uses) rather than from the resolved config — so the nag reflects the
250
- * version genuinely running across every owned sub-path (asar-swap / downgrade /
251
- * own-installer) and stays truthful even under a silent asar fallback.
252
- * `process.versions.electron` gives the shell's live Electron. Both are read at
253
- * the renderer top level (no `require('obsidian')`, which resolves only inside a
254
- * plugin-load context). Never throws a read failure is logged and ignored, so
255
- * it cannot break an otherwise-ready boot.
268
+ * Computes and stores the runtime-Electron compatibility verdict (on
269
+ * {@link getElectronCompatibility}) from an already-read version pair, warning
270
+ * when the live Electron is below the app's recommended minimum. Never throws; a
271
+ * boot whose running app version was unreadable is skipped (nothing to judge).
272
+ *
273
+ * @param appVersion - The live running app version, or `undefined` when unreadable.
274
+ * @param actualElectronVersion - The live Electron version, or `undefined` when unreadable.
275
+ */
276
+ private applyElectronCompatibility;
277
+ /**
278
+ * Verifies the running app (asar) version matches the swapped-in pin, storing the
279
+ * verdict on {@link getAsarFallback}. On a **silent fallback** (the installer ran
280
+ * its own bundled asar instead of the pin) it throws {@link SilentAsarFallbackError}
281
+ * when the throw is enabled, otherwise warns (when warnings are on) and lets the
282
+ * boot proceed. A boot with no swapped-in asar, or an unreadable running version,
283
+ * is `'unknown'` — nothing is thrown or warned. This is the healthy-UI companion to
284
+ * the black-screen {@link RendererFailedToInitializeError} dead-boot fast-fail.
285
+ *
286
+ * @param runningApiVersion - The live running app version, or `undefined` when unreadable.
287
+ */
288
+ private checkRuntimeAsarFallback;
289
+ /**
290
+ * Runs the post-boot runtime compatibility checks for an owned instance, once the
291
+ * vault is ready. Reads the live running app version and Electron version **once**
292
+ * from the booted renderer's main process, then: (1) verifies the running app
293
+ * version matches the swapped-in pin — throwing {@link SilentAsarFallbackError} on
294
+ * a silent fallback (when enabled); and (2) runs the best-effort runtime-Electron
295
+ * nag. Only the asar-fallback check can throw, so this must run outside the
296
+ * readiness poll's try/catch (a swallowed throw would loop until timeout).
297
+ *
298
+ * Both are read at the renderer top level: `ipcRenderer.sendSync('version')` (the
299
+ * running app version, truthful even under a silent asar fallback) and
300
+ * `process.versions.electron` (the live shell Electron); neither uses
301
+ * `require('obsidian')`, which resolves only inside a plugin-load context. A read
302
+ * failure leaves both unknown (logged, non-fatal) — an unreadable running version
303
+ * cannot be judged a fallback, so the boot is not broken by a flaky read.
256
304
  *
257
305
  * @param vaultPath - The vault path to evaluate in.
258
306
  */
259
- private checkRuntimeElectronCompatibility;
307
+ private checkRuntimeCompatibility;
260
308
  /**
261
309
  * Connects to a CDP target's WebSocket endpoint.
262
310
  *
@@ -320,6 +368,17 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
320
368
  * @returns The list of page targets.
321
369
  */
322
370
  private getPageTargets;
371
+ /**
372
+ * Kills the currently-running owned instance (if any) and waits for it to exit,
373
+ * so the next launch gets a pristine single-window instance.
374
+ *
375
+ * Relaunching over a live instance is forwarded by Electron's single-instance
376
+ * lock on the shared user-data dir and surfaces the vault picker, and opening a
377
+ * second window via IPC leaves stale windows that break vault-target routing —
378
+ * hence a full kill + wait-for-exit (releasing the lock) between launches. A
379
+ * no-op on the first attempt, when no instance is running yet.
380
+ */
381
+ private killRunningOwnedInstance;
323
382
  /**
324
383
  * Moves the owned instance's window off-screen so a hidden run never steals
325
384
  * focus. Uses Electron's remote bridge (`window.electron.remote`) — the only
@@ -49,6 +49,7 @@ var import_incompatible_installer_version_error = require("./incompatible-instal
49
49
  var import_installer_compatibility = require("./installer-compatibility.cjs");
50
50
  var import_kill_process_tree = require("./kill-process-tree.cjs");
51
51
  var import_log = require("./log.cjs");
52
+ var import_normalize_optional_properties = require("./normalize-optional-properties.cjs");
52
53
  var import_obsidian_config = require("./obsidian-config.cjs");
53
54
  var import_obsidian_executable = require("./obsidian-executable.cjs");
54
55
  var import_obsidian_installer = require("./obsidian-installer.cjs");
@@ -725,24 +726,25 @@ async function createCdpTransport(options) {
725
726
  if (options?.port !== void 0) {
726
727
  const ownedSuffix = options.isHarnessOwnedInstance ? " (harness-owned)" : "";
727
728
  (0, import_log.log)(`[transport-factory:obsidian-cdp] Attaching to running Obsidian${ownedSuffix} (host=${options.host ?? "localhost"}, port=${String(options.port)})`);
728
- return new import_transport_desktop_cdp.DesktopCdpTransport({
729
- ...options.host !== void 0 && { cdpHost: options.host },
729
+ return new import_transport_desktop_cdp.DesktopCdpTransport((0, import_normalize_optional_properties.normalizeOptionalProperties)({
730
+ cdpHost: options.host,
730
731
  cdpPort: options.port,
731
- ...options.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds },
732
- ...options.isHarnessOwnedInstance !== void 0 && { isHarnessOwnedInstance: options.isHarnessOwnedInstance }
733
- });
732
+ commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds,
733
+ isHarnessOwnedInstance: options.isHarnessOwnedInstance
734
+ }));
734
735
  }
735
736
  (0, import_log.log)("[transport-factory:obsidian-cdp] Creating owned isolated Obsidian instance");
736
737
  const ownedInstance = await resolveOwnedInstanceConfig(options);
737
- return new import_transport_desktop_cdp.DesktopCdpTransport({
738
- ...options?.host !== void 0 && { cdpHost: options.host },
739
- ...options?.commandTimeoutInMilliseconds !== void 0 && { commandTimeoutInMilliseconds: options.commandTimeoutInMilliseconds },
738
+ return new import_transport_desktop_cdp.DesktopCdpTransport((0, import_normalize_optional_properties.normalizeOptionalProperties)({
739
+ cdpHost: options?.host,
740
+ commandTimeoutInMilliseconds: options?.commandTimeoutInMilliseconds,
740
741
  deadBootGraceInMilliseconds: (0, import_renderer_boot_detection.resolveDeadBootGraceInMilliseconds)(options),
741
- ...options?.isObsidianAppVisible !== void 0 && { isObsidianAppVisible: options.isObsidianAppVisible },
742
+ isObsidianAppVisible: options?.isObsidianAppVisible,
742
743
  ownedInstance,
743
- ...options?.shouldDisableSandbox !== void 0 && { shouldDisableSandbox: options.shouldDisableSandbox },
744
+ shouldDisableSandbox: options?.shouldDisableSandbox,
745
+ shouldThrowOnSilentAsarFallback: (0, import_compatibility_options.resolveShouldThrowOnSilentAsarFallback)(options?.shouldThrowOnSilentAsarFallback),
744
746
  shouldWarnOnCompatibilityIssues: (0, import_compatibility_options.resolveShouldWarnOnCompatibilityIssues)(options?.shouldWarnOnCompatibilityIssues)
745
- });
747
+ }));
746
748
  }
747
749
  function createOwnedUserDataDir() {
748
750
  const root = (0, import_node_path.join)((0, import_node_os.tmpdir)(), "obsidian-integration-testing");
@@ -820,4 +822,4 @@ function stripForbiddenFetchHeaders(requestOptions) {
820
822
  createTransportFromOptions,
821
823
  getOrCreateTransport
822
824
  });
823
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCxcbiAgcmVzb2x2ZVNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzLFxuICBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUVcbn0gZnJvbSAnLi9hcHBpdW0tZGVwZW5kZW5jaWVzLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eUFjdGlvbixcbiAgcmVzb2x2ZVNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gIHJlc29sdmVTaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzXG59IGZyb20gJy4vY29tcGF0aWJpbGl0eS1vcHRpb25zLmNqcyc7XG5pbXBvcnQge1xuICBjaGVja0RldmljZUlkbGUsXG4gIHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vZGV2aWNlLXJlYWRpbmVzcy5janMnO1xuaW1wb3J0IHsgYnVpbGRFbXVsYXRvckFyZ3MgfSBmcm9tICcuL2VtdWxhdG9yLWFyZ3MuY2pzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMuY2pzJztcbmltcG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLmNqcyc7XG5pbXBvcnQgeyBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgeyBraWxsUHJvY2Vzc1RyZWUgfSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5Db25maWdEaXIgfSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5janMnO1xuaW1wb3J0IHsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSB9IGZyb20gJy4vb2JzaWRpYW4tZXhlY3V0YWJsZS5janMnO1xuaW1wb3J0IHtcbiAgZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uLFxuICBlbnN1cmVTaGVsbENhY2hlZFxufSBmcm9tICcuL29ic2lkaWFuLWluc3RhbGxlci5janMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5janMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlQXNhckNhY2hlZCxcbiAgZmluZE5ld2VzdEFzYXIsXG4gIHJlc29sdmVDb25jcmV0ZVZlcnNpb25cbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLXN3aXRjaC5janMnO1xuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVNwYXduRmxhZ3MsXG4gIHJlc29sdmVFbXVsYXRvclNwYXduRmxhZ3Ncbn0gZnJvbSAnLi9zcGF3bi1vcHRpb25zLmNqcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQge1xuICBzaG91bGRIaWRlQXBwaXVtQ29uc29sZSxcbiAgc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93XG59IGZyb20gJy4vdmlzaWJpbGl0eS5janMnO1xuXG5jb25zdCBBUFBfUEFDS0FHRSA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBUFBfQUNUSVZJVFkgPSBgJHtBUFBfUEFDS0FHRX0uTWFpbkFjdGl2aXR5YDtcbmNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuY29uc3QgQVBQSVVNX0NPTk5FQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgQVBQSVVNX1BSRUZMSUdIVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBPV05FRF9VU0VSX0RBVEFfUFJFRklYID0gJ3VzZXJkYXRhLSc7XG4vLyBBcHBpdW0gaW5zZWN1cmUgZmVhdHVyZSBsZXR0aW5nIHRoZSBVaUF1dG9tYXRvcjIgZHJpdmVyIGF1dG8tZG93bmxvYWQgYVxuLy8gQ2hyb21lZHJpdmVyIG1hdGNoaW5nIE9ic2lkaWFuJ3MgV2ViVmlldyBDaHJvbWUgdmVyc2lvbi4gRW5hYmxpbmcgaXQgb24gdGhlXG4vLyBBcHBpdW0gc2VydmVyIChpdCBoYXMgbm8gZWZmZWN0IGFzIGEgY2FwYWJpbGl0eSkgYXZvaWRzIHRoZSBmYWlsdXJlXG4vLyBcIk5vIENocm9tZWRyaXZlciBmb3VuZCB0aGF0IGNhbiBhdXRvbWF0ZSBDaHJvbWUgLi4uXCIuXG5jb25zdCBDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUgPSAndWlhdXRvbWF0b3IyOmNocm9tZWRyaXZlcl9hdXRvZG93bmxvYWQnO1xuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDtcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcbmNvbnN0IEVNVUxBVE9SX09VVFBVVF9UQUlMX01BWF9MRU5HVEggPSA4MDAwO1xuY29uc3QgS0VZQ09ERV9NRU5VID0gODI7XG5jb25zdCBLRVlDT0RFX1dBS0VVUCA9IDIyNDtcbmNvbnN0IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMDAwMDtcblxuLyoqXG4gKiBIb3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkIGluc3RhbmNlOyBhdFxuICogbW9zdCBvbmUgZmllbGQgaXMgc2V0IChzZWUge0BsaW5rIHJlc29sdmVBc2FyUGxhbn0pLlxuICovXG5pbnRlcmZhY2UgQXNhclBsYW4ge1xuICAvKiogVGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgdG8gcHJvdmlzaW9uIGFzLWlzIChubyBkb3dubG9hZCkuICovXG4gIHJlYWRvbmx5IGFzYXI/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/IHBsYW4uYXNhclxuICAgIDogeyBwYXRoOiBhd2FpdCBlbnN1cmVBc2FyQ2FjaGVkKHBsYW4uYXNhclZlcnNpb25Ub1N3YXApLCB2ZXJzaW9uOiBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oYXNhciAmJiB7IGFzYXIgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIGV4ZVBhdGg6IGVuc3VyZU5vbk51bGxhYmxlKGV4ZVBhdGgpLFxuICAgIHVzZXJEYXRhRGlyOiBjcmVhdGVPd25lZFVzZXJEYXRhRGlyKClcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBDb25uZWN0aW9uYCBhbmQgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIGEgV2ViRHJpdmVyIHJlcXVlc3QncyBoZWFkZXJzLlxuICpcbiAqIFRoZSBidW5kbGVkIGB3ZWJkcml2ZXJgIHBhY2thZ2Ugc2V0cyBib3RoIGhlYWRlcnMgZXhwbGljaXRseS4gVGhleSBhcmVcbiAqIGZvcmJpZGRlbiByZXF1ZXN0IGhlYWRlcnMgcGVyIHRoZSBGZXRjaCBzcGVjOiBOb2RlIHVwIHRvIDI1IGFjY2VwdGVkIHRoZW1cbiAqIHNpbGVudGx5LCBidXQgTm9kZSAyNiByZWplY3RzIHRoZW0gd2l0aCBgVU5EX0VSUl9JTlZBTElEX0FSR2AsIGJyZWFraW5nIHRoZVxuICogQXBwaXVtIGAvc2Vzc2lvbmAgcmVxdWVzdC4gVGhlIHRyYW5zcG9ydCBsYXllciBtYW5hZ2VzIGNvbm5lY3Rpb24gcmV1c2UgYW5kXG4gKiB0aGUgRmV0Y2ggQVBJIGNvbXB1dGVzIGBDb250ZW50LUxlbmd0aGAgZnJvbSB0aGUgYm9keSwgc28gZHJvcHBpbmcgYm90aCBpc1xuICogc2FmZSBvbiBldmVyeSBOb2RlIHZlcnNpb24uIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3dlYmRyaXZlcmlvL3dlYmRyaXZlcmlvL2lzc3Vlcy8xNTI2NX0uXG4gKlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIC0gVGhlIHJlcXVlc3Qgb3B0aW9ucyBhYm91dCB0byBiZSBzZW50IGJ5IFdlYkRyaXZlcklPLlxuICogQHJldHVybnMgVGhlIHNhbWUgcmVxdWVzdCBvcHRpb25zIHdpdGggdGhlIGZvcmJpZGRlbiBoZWFkZXJzIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzKHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0SW5pdCk6IFJlcXVlc3RJbml0IHtcbiAgaWYgKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0Nvbm5lY3Rpb24nKTtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29udGVudC1MZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0T3B0aW9ucztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVQSxnQ0FHTztB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
825
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHtcbiAgZXhlY0ZpbGUsXG4gIHNwYXduXG59IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7XG4gIGNoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWQsXG4gIHJlc29sdmVTaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcyxcbiAgVUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FXG59IGZyb20gJy4vYXBwaXVtLWRlcGVuZGVuY2llcy5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2FwcGl1bS1zZXNzaW9uLWNvbmZpZy5janMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24sXG4gIHJlc29sdmVTaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICByZXNvbHZlU2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXNcbn0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbn0gZnJvbSAnLi9kZXZpY2UtcmVhZGluZXNzLmNqcyc7XG5pbXBvcnQgeyBidWlsZEVtdWxhdG9yQXJncyB9IGZyb20gJy4vZW11bGF0b3ItYXJncy5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IuY2pzJztcbmltcG9ydCB7IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB7IGtpbGxQcm9jZXNzVHJlZSB9IGZyb20gJy4va2lsbC1wcm9jZXNzLXRyZWUuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLmNqcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpciB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLmNqcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcbmltcG9ydCB7IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyxcbiAgcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFnc1xufSBmcm9tICcuL3NwYXduLW9wdGlvbnMuY2pzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMuY2pzJztcbmltcG9ydCB7XG4gIHNob3VsZEhpZGVBcHBpdW1Db25zb2xlLFxuICBzaG91bGRIaWRlRW11bGF0b3JXaW5kb3dcbn0gZnJvbSAnLi92aXNpYmlsaXR5LmNqcyc7XG5cbmNvbnN0IEFQUF9QQUNLQUdFID0gJ21kLm9ic2lkaWFuJztcbmNvbnN0IEFQUF9BQ1RJVklUWSA9IGAke0FQUF9QQUNLQUdFfS5NYWluQWN0aXZpdHlgO1xuY29uc3QgQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCA9IDM7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1VTRVJfREFUQV9QUkVGSVggPSAndXNlcmRhdGEtJztcbi8vIEFwcGl1bSBpbnNlY3VyZSBmZWF0dXJlIGxldHRpbmcgdGhlIFVpQXV0b21hdG9yMiBkcml2ZXIgYXV0by1kb3dubG9hZCBhXG4vLyBDaHJvbWVkcml2ZXIgbWF0Y2hpbmcgT2JzaWRpYW4ncyBXZWJWaWV3IENocm9tZSB2ZXJzaW9uLiBFbmFibGluZyBpdCBvbiB0aGVcbi8vIEFwcGl1bSBzZXJ2ZXIgKGl0IGhhcyBubyBlZmZlY3QgYXMgYSBjYXBhYmlsaXR5KSBhdm9pZHMgdGhlIGZhaWx1cmVcbi8vIFwiTm8gQ2hyb21lZHJpdmVyIGZvdW5kIHRoYXQgY2FuIGF1dG9tYXRlIENocm9tZSAuLi5cIi5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICd1aWF1dG9tYXRvcjI6Y2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuY29uc3QgREVGQVVMVF9UUkFOU1BPUlRfVFlQRSA9ICdvYnNpZGlhbi1jZHAnO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBFTVVMQVRPUl9CT09UX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBLRVlDT0RFX01FTlUgPSA4MjtcbmNvbnN0IEtFWUNPREVfV0FLRVVQID0gMjI0O1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjAwMDA7XG5jb25zdCBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwMDAwO1xuXG4vKipcbiAqIEhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWQgaW5zdGFuY2U7IGF0XG4gKiBtb3N0IG9uZSBmaWVsZCBpcyBzZXQgKHNlZSB7QGxpbmsgcmVzb2x2ZUFzYXJQbGFufSkuXG4gKi9cbmludGVyZmFjZSBBc2FyUGxhbiB7XG4gIC8qKiBUaGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciB0byBwcm92aXNpb24gYXMtaXMgKG5vIGRvd25sb2FkKS4gKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VDb25maWdbJ2FzYXInXTtcblxuICAvKiogVGhlIGFwcCB2ZXJzaW9uIHRvIGRvd25sb2FkIGFuZCBhc2FyLXN3YXAgb250byB0aGUgc2hlbGwuICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLiAqL1xuICByZWFkb25seSBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgYW4gZW11bGF0b3IgcHJvY2VzcyB0aGF0IGhhcyBleGl0ZWQuXG4gKi9cbmludGVyZmFjZSBFbXVsYXRvckV4aXRJbmZvIHtcbiAgLyoqIEV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLiAqL1xuICBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKiBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCBpZiB0aGUgcHJvY2VzcyBleGl0ZWQgbm9ybWFsbHkuICovXG4gIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBlbXVsYXRvciBwcm9jZXNzIHRvZ2V0aGVyIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZFxuICogb3V0cHV0IGFuZCBleGl0IHN0YXR1cy5cbiAqL1xuaW50ZXJmYWNlIEVtdWxhdG9yTGF1bmNoIHtcbiAgLyoqIFRoZSBzcGF3bmVkIGVtdWxhdG9yIHByb2Nlc3MuICovXG4gIHByb2Nlc3M6IENoaWxkUHJvY2VzcztcblxuICAvKiogUmV0dXJucyB0aGUgZXhpdCBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLiAqL1xuICByZWFkRXhpdEluZm86ICgpID0+IEVtdWxhdG9yRXhpdEluZm8gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgKGJvdW5kZWQgdG8gdGhlIG1vc3QgcmVjZW50IG91dHB1dCkuICovXG4gIHJlYWRPdXRwdXQ6ICgpID0+IHN0cmluZztcblxuICAvKiogU3RvcHMgYWNjdW11bGF0aW5nIG91dHB1dC4gQ2FsbCBvbmNlIHN0YXJ0dXAgaGFzIHN1Y2NlZWRlZC4gKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFBhcmFtcyB7XG4gIC8qKiBBVkQgbmFtZSB0byBjb25uZWN0IHRvIChzdGFydGluZyBhIG5ldyBlbXVsYXRvciBpZiBub3QgYWxyZWFkeSBydW5uaW5nKS4gKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IChgMGAgc2tpcHMgaXQpLiAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKiBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS4gKi9cbiAgcmVhZG9ubHkgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZztcblxuICAvKiogVGhlIGVtdWxhdG9yIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsIHJlc29sdmVkIGJ5IHtAbGluayByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGx9LlxuICovXG5pbnRlcmZhY2UgSW5zdGFsbGVkU2hlbGwge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaW5zdGFsbGVkIHNoZWxsIGV4ZWN1dGFibGUuICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKiogVGhlIGRldGVjdGVkIHNoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY2Fubm90IGJlIGRldGVybWluZWQuICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LnN0YXJ0QXBwaXVtQW5kRW11bGF0b3J9LlxuICovXG5pbnRlcmZhY2UgU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyB7XG4gIC8qKiBSZXNvbHZlZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIHRvIGJlY29tZSByZWFkeS4gKi9cbiAgcmVhZG9ubHkgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLiAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKiogQVZEIG5hbWUgdG8gc3RhcnQuICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKiogUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCAoYDBgIHNraXBzIGl0KS4gKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93biAob21pdHRlZCBcdTIxOTIgaGlkZGVuKS4gKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuICovXG4gIHJlYWRvbmx5IGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIEFwcGl1bSBzZXJ2ZXIgcG9ydC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKiBXaGV0aGVyIG1pc3NpbmcgQXBwaXVtIGRlcGVuZGVuY2llcyBtYXkgYmUgYXV0by1pbnN0YWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgaXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciBBcHBpdW0gYXV0by1zdGFydCBpcyBhbGxvd2VkLiAqL1xuICByZWFkb25seSBzaG91bGRBdXRvU3RhcnRBcHBpdW0/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQge1xuICAvKiogVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBBcHBpdW0gc2VydmVyIHByb2Nlc3MsIGlmIG9uZSB3YXMgYXV0by1zdGFydGVkLiAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUaGUgZW11bGF0b3IgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbn1cblxubGV0IGNhY2hlZFRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrQW5kUmVwb3J0Q29tcGF0aWJpbGl0eX0uXG4gKi9cbmludGVyZmFjZSBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFwcCAoYXNhcikgdmVyc2lvbiB0aGF0IHdpbGwgYmUgc3dhcHBlZCBvbnRvIHRoZSBzaGVsbCwgb3IgYHVuZGVmaW5lZGBcbiAgICogd2hlbiBubyBhc2FyLXN3YXAgd2lsbCBoYXBwZW4gKG5vdGhpbmcgaXMgY2hlY2tlZCB0aGVuKS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC4gKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9XG4gICAqIChgdHJ1ZWApIG9yIHByb2NlZWRzIHRvIGxhdW5jaCB3aXRoIHRoZSB2ZXJkaWN0IHN1cmZhY2VkIGFzIGRhdGEgKGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogYm9vbGVhbjtcblxuICAvKiogV2hldGhlciBhIGAnbmFnZ2VkJ2AgKG9yIHByb2NlZWRpbmctYCd1bnJ1bm5hYmxlJ2ApIHZlcmRpY3QgaXMgbG9nZ2VkLiAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVuY2Fwc3VsYXRlcyBhbGwgQXBwaXVtIHRyYW5zcG9ydCBjcmVhdGlvbiBsb2dpYywgaW5jbHVkaW5nIEFwcGl1bSBzZXJ2ZXJcbiAqIHN0YXJ0dXAsIGVtdWxhdG9yIG1hbmFnZW1lbnQsIGFuZCBXZWJEcml2ZXJJTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQuXG4gKlxuICogVXNpbmcgYSBjbGFzcyBhdm9pZHMgdGhyZWFkaW5nIHRoZSB0cmFuc3BvcnQgYHR5cGVgIGxhYmVsIHRocm91Z2ggZXZlcnlcbiAqIGhlbHBlciBmdW5jdGlvbiBcdTIwMTQgYHRoaXMubG9nKClgIGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgaXQuXG4gKi9cbmNsYXNzIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHlwZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEFwcGl1bSB0cmFuc3BvcnQgYnkgZXN0YWJsaXNoaW5nIGEgV2ViRHJpdmVySU8gc2Vzc2lvbi5cbiAgICpcbiAgICogSWYgYG9wdGlvbnMuc2Vzc2lvbklkYCBpcyBwcmVzZW50LCByZWF0dGFjaGVzIHRvIHRoZSBleGlzdGluZyBzZXNzaW9uXG4gICAqIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLiBUaGlzIGF2b2lkcyBkdXBsaWNhdGUgQXBwaXVtL0FEQiBjb25uZWN0aW9uc1xuICAgKiB3aGVuIHRlc3Qgd29ya2VycyByZXVzZSB0aGUgZ2xvYmFsIHNldHVwJ3Mgc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAgICogQHJldHVybnMgQSBjb25maWd1cmVkIEFwcGl1bSB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gICAgaWYgKG9wdGlvbnMuc2Vzc2lvbklkICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kZXZpY2VJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRhY2hUb0V4aXN0aW5nU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgb3B0aW9ucy5kZXZpY2VJZCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24oXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgZGV2aWNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gICk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICB0aGlzLmxvZyhgUmVhdHRhY2hpbmcgdG8gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gJHtzZXNzaW9uSWR9IChkZXZpY2U9JHtkZXZpY2VJZH0pYCk7XG5cbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgYXR0YWNoKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZygnUmVhdHRhY2hlZCB0byBBcHBpdW0gc2Vzc2lvbi4nKTtcblxuICAgIHJldHVybiBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNTZXNzaW9uT3duZXI6IGZhbHNlLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIGNvbnN0IHJlcSA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyB0aW1lb3V0OiBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChyZXMpID0+IHtcbiAgICAgICAgcmVzLnJlc3VtZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn0gZGlkIG5vdCByZXNwb25kIHdpdGhpbiAke1N0cmluZyhBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCByZWFjaCBBcHBpdW0gc2VydmVyIGF0ICR7dXJsLm9yaWdpbn06ICR7ZXJyLm1lc3NhZ2V9LiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgYXZkPSR7b3B0aW9ucy5hdmROYW1lfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKGlzTmFOKHBvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcG9ydCBpbiBhcHBpdW1Vcmw6ICR7dXJsLnBvcnR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwSWQgPSBvcHRpb25zLmFwcElkID8/IEFQUF9QQUNLQUdFO1xuXG4gICAgbGV0IGFwcGl1bVByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW11bGF0b3JQcm9jZXNzOiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zdGFydEFwcGl1bUFuZEVtdWxhdG9yKHtcbiAgICAgICAgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVBcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICAgICAgYXBwaXVtVXJsOiB1cmwsXG4gICAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIGlzQXBwaXVtQ29uc29sZVZpc2libGU6IG9wdGlvbnMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSxcbiAgICAgICAgaXNFbXVsYXRvclZpc2libGU6IG9wdGlvbnMuaXNFbXVsYXRvclZpc2libGUsXG4gICAgICAgIHBvcnQsXG4gICAgICAgIHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzOiByZXNvbHZlU2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMob3B0aW9ucyksXG4gICAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW1cbiAgICAgIH0pO1xuXG4gICAgICBhcHBpdW1Qcm9jZXNzID0gcmVzdWx0LmFwcGl1bVByb2Nlc3M7XG4gICAgICBlbXVsYXRvclByb2Nlc3MgPSByZXN1bHQuZW11bGF0b3JQcm9jZXNzO1xuICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSByZXN1bHQuYWN0dWFsRGV2aWNlSWQ7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0ID0gcmVzb2x2ZVNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyk7XG4gICAgICB0aGlzLmxvZyhcbiAgICAgICAgYENvbm5lY3RpbmcgdG8gQXBwaXVtIChkZXZpY2U9JHthY3R1YWxEZXZpY2VJZH0sIGFwcD0ke2FwcElkfSwgcmV0cnlUaW1lb3V0OiAke1N0cmluZyhzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCl9bXMsIHJldHJpZXM6ICR7U3RyaW5nKEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UKX0pLi4uYFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCByZW1vdGUoe1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAgICdhcHBpdW06YXBwUGFja2FnZSc6IGFwcElkLFxuICAgICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06YXV0b21hdGlvbk5hbWUnOiAnVWlBdXRvbWF0b3IyJyxcbiAgICAgICAgICAnYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0JzogQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOm5vUmVzZXQnOiB0cnVlLFxuICAgICAgICAgICdhcHBpdW06dWRpZCc6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICdhcHBpdW06dWlhdXRvbWF0b3IyU2VydmVySW5zdGFsbFRpbWVvdXQnOiBTRVJWRVJfSU5TVEFMTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgICdwbGF0Zm9ybU5hbWUnOiAnQW5kcm9pZCdcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5ULFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiBzZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dCxcbiAgICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgICBwb3J0LFxuICAgICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVyc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2Vzc2lvbiBlc3RhYmxpc2hlZC4nKTtcbiAgICAgIGNvbnN0IGFwcGl1bVRyYW5zcG9ydCA9IG5ldyBBcHBpdW1UcmFuc3BvcnQoe1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYnJvd3NlcixcbiAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICBwbGF0Zm9ybTogJ2FuZHJvaWQnLFxuICAgICAgICAuLi4ob3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlID0gYXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2UuYmluZChhcHBpdW1UcmFuc3BvcnQpO1xuICAgICAgY29uc3QgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCA9IGFwcGl1bVRyYW5zcG9ydDtcbiAgICAgIHRyYW5zcG9ydC5kaXNwb3NlID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9yaWdpbmFsRGlzcG9zZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGtpbGxBdXRvU3RhcnRlZFByb2Nlc3NlcygpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRyYW5zcG9ydDtcblxuICAgICAgZnVuY3Rpb24ga2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzKCk6IHZvaWQge1xuICAgICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgICAvLyBDYW5ub3QgdXNlIHRoaXMubG9nIGluc2lkZSBuZXN0ZWQgZnVuY3Rpb24gXHUyMDE0IGB0aGlzYCBpcyBub3QgY2FwdHVyZWQuXG4gICAgICAgICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtvcHRpb25zLnR5cGV9XSBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbXVsYXRvclByb2Nlc3MpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWUoZW11bGF0b3JQcm9jZXNzKTtcbiAgICAgICAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke29wdGlvbnMudHlwZX1dIEF1dG8tc3RhcnRlZCBlbXVsYXRvciBzdG9wcGVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChhcHBpdW1Qcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShhcHBpdW1Qcm9jZXNzKTtcbiAgICAgICAgdGhpcy5sb2coJ0tpbGxlZCBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICBpZiAoZW11bGF0b3JQcm9jZXNzKSB7XG4gICAgICAgIGtpbGxQcm9jZXNzVHJlZShlbXVsYXRvclByb2Nlc3MpO1xuICAgICAgICB0aGlzLmxvZygnS2lsbGVkIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBhZnRlciBjb25uZWN0aW9uIGZhaWx1cmUuJyk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgQXBwaXVtIHRvb2xjaGFpbiBpcyBwcmVzZW50IGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZDpcbiAgICogQXBwaXVtIGl0c2VsZiwgdGhlbiB0aGUgYHVpYXV0b21hdG9yMmAgZHJpdmVyLiBFYWNoIGlzIGNoZWNrZWQgZmlyc3QgYW5kXG4gICAqIGluc3RhbGxlZCBvbmx5IHdoZW4gbWlzc2luZywgc28gYSBmdWxseS1wcm92aXNpb25lZCBtYWNoaW5lIGluY3VycyBqdXN0IHR3b1xuICAgKiBmYXN0IHZlcnNpb24vbGlzdCBwcm9iZXMuXG4gICAqXG4gICAqIE9ubHkgaW52b2tlZCB3aGVuIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGF1dG8tc3RhcnQgdGhlIHNlcnZlciBhbmRcbiAgICoge0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXN9XG4gICAqIGlzIGVuYWJsZWQuIENvbW1hbmRzIGFyZSBwYXNzZWQgYXMgc3RyaW5ncyBzbyBgZXhlY2AgcnVucyB0aGVtIHRocm91Z2ggdGhlXG4gICAqIHNoZWxsLCB3aGljaCByZXNvbHZlcyB0aGUgYG5wbWAvYG5weGAgYC5jbWRgIHNoaW1zIG9uIFdpbmRvd3MgKHRoZSBhcnJheVxuICAgKiBwYXRoIHNwYXducyB3aXRob3V0IGEgc2hlbGwgYW5kIGNhbm5vdCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bUluc3RhbGxlZCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZygnQ2hlY2tpbmcgd2hldGhlciBBcHBpdW0gaXMgaW5zdGFsbGVkLi4uJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gaXMgaW5zdGFsbGVkICh2ZXJzaW9uICR7cmVzdWx0LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coJ0FwcGl1bSBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIGdsb2JhbGx5IHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYC4uLicpO1xuICAgIGF3YWl0IGV4ZWMoJ25wbSBpbnN0YWxsIC1nIGFwcGl1bScpO1xuICAgIHRoaXMubG9nKCdBcHBpdW0gaW5zdGFsbGVkLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBkZXZpY2VJZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIHRoaXMubG9nKGBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCIke2F2ZE5hbWV9XCIuLi4gKGNvbm5lY3RlZDogWyR7ZGV2aWNlSWRzQmVmb3JlLmpvaW4oJywgJyl9XSlgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nRGV2aWNlSWQgPSBhd2FpdCB0aGlzLmZpbmREZXZpY2VCeUF2ZE5hbWUoYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlKTtcblxuICAgIGlmIChleGlzdGluZ0RldmljZUlkKSB7XG4gICAgICB0aGlzLmxvZyhgQVZEIFwiJHthdmROYW1lfVwiIGlzIGFscmVhZHkgcnVubmluZyBvbiBkZXZpY2UgJHtleGlzdGluZ0RldmljZUlkfSwgcmV1c2luZy5gKTtcbiAgICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoZXhpc3RpbmdEZXZpY2VJZCk7XG4gICAgICByZXR1cm4geyBhY3R1YWxEZXZpY2VJZDogZXhpc3RpbmdEZXZpY2VJZCB9O1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uYCk7XG4gICAgY29uc3QgZW11bGF0b3IgPSB0aGlzLnN0YXJ0RW11bGF0b3IoYXZkTmFtZSwgaXNFbXVsYXRvclZpc2libGUpO1xuXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlbXVsYXRvci5zdG9wQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBFbXVsYXRvciBcIiR7YXZkTmFtZX1cIiBzdGFydGVkLCBkZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gaXMgY29ubmVjdGVkLmApO1xuICAgIGF3YWl0IHRoaXMuc3VwcHJlc3NFcnJvckRpYWxvZ3MoYWN0dWFsRGV2aWNlSWQpO1xuICAgIHJldHVybiB7IGFjdHVhbERldmljZUlkLCBlbXVsYXRvclByb2Nlc3M6IGVtdWxhdG9yLnByb2Nlc3MgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBDaGVja2luZyB3aGV0aGVyIHRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC4uLmApO1xuICAgIGNvbnN0IGRyaXZlckxpc3RKc29uID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gZHJpdmVyIGxpc3QgLS1pbnN0YWxsZWQgLS1qc29uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCh7IGRyaXZlckxpc3RKc29uLCBkcml2ZXJOYW1lOiBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUUgfSkpIHtcbiAgICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBpbnN0YWxsZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGxpbmcgdmlhIFxcYGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1cXGAuLi5gKTtcbiAgICBhd2FpdCBleGVjKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1gKTtcbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kRGV2aWNlQnlBdmROYW1lKGF2ZE5hbWU6IHN0cmluZywgZGV2aWNlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChjb25zdCBkZXZpY2VJZCBvZiBkZXZpY2VJZHMpIHtcbiAgICAgIGNvbnN0IHJ1bm5pbmdBdmQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ2VtdScsICdhdmQnLCAnbmFtZSddLFxuICAgICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAgIChfZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQuc3BsaXQoJ1xcbicpWzBdPy50cmltKCkgPz8gJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocnVubmluZ0F2ZCA9PT0gYXZkTmFtZSkge1xuICAgICAgICByZXR1cm4gZGV2aWNlSWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiIGRldmljZXMnOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHRoaXMubG9nKGBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsaW5lcyA9IG91dHB1dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIHJldHVybiBsaW5lc1xuICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygnXFx0ZGV2aWNlJykpXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNwbGl0KCdcXHQnKVswXSA/PyAnJyk7XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZVByb3AoZGV2aWNlSWQ6IHN0cmluZywgcHJvcDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsIHByb3BdLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3IgKG5vdCBwYXJ0aWFsIHN0ZG91dCkgc28gYSBub24tcmVzcG9uc2l2ZSBndWVzdCByZWFkcyBhcyBcIm5vdCBpZGxlXCIuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdEluc3RhbGxlZFBhY2thZ2VzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdjbWQnLCAncGFja2FnZScsICdsaXN0JywgJ3BhY2thZ2VzJ10sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgIC8vIFJldHVybiBubyBvdXRwdXQgb24gdGltZW91dC9lcnJvciBzbyBhIGNodXJuaW5nIGd1ZXN0J3Mgc2xvdy9wYXJ0aWFsIHBhY2thZ2UgbGlzdCBjYW4ndCBmYWxzZWx5IHJlYWQgYXMgaWRsZS5cbiAgICAgICAgICByZXNvbHZlKGVycm9yID8gJycgOiBzdGRvdXQpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0aGlzLnR5cGV9XSAke21lc3NhZ2V9YCk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVFbXVsYXRvckJpbmFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNka1Jvb3QgPSBwcm9jZXNzLmVudlsnQU5EUk9JRF9IT01FJ10gPz8gcHJvY2Vzcy5lbnZbJ0FORFJPSURfU0RLX1JPT1QnXTtcbiAgICBpZiAoIXNka1Jvb3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBmaW5kIEFuZHJvaWQgZW11bGF0b3I6IG5laXRoZXIgQU5EUk9JRF9IT01FIG5vciBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gam9pbihzZGtSb290LCAnZW11bGF0b3InLCAnZW11bGF0b3InKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZEtleUV2ZW50KGRldmljZUlkOiBzdHJpbmcsIGtleUNvZGU6IG51bWJlciwgZGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgU3RyaW5nKGtleUNvZGUpXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gJHtkZXNjcmlwdGlvbn0gKGtleWV2ZW50ICR7U3RyaW5nKGtleUNvZGUpfSk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN0YXJ0QXBwaXVtQW5kRW11bGF0b3IocGFyYW1zOiBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUGFyYW1zKTogUHJvbWlzZTxTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0PiB7XG4gICAgY29uc3QgeyBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcywgYXBwaXVtVXJsLCBhdmROYW1lLCBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzLCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlLCBpc0VtdWxhdG9yVmlzaWJsZSwgcG9ydCwgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMsIHNob3VsZEF1dG9TdGFydEFwcGl1bSB9ID0gcGFyYW1zO1xuXG4gICAgbGV0IG5lZWRzQXBwaXVtU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIHRoaXMubG9nKCdBcHBpdW0gc2VydmVyIGlzIHJlYWNoYWJsZS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3VsZEF1dG9TdGFydEFwcGl1bSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBuZWVkc0FwcGl1bVN0YXJ0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5lZWRzQXBwaXVtU3RhcnQpIHtcbiAgICAgIGlmIChzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcykge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2coYEFwcGl1bSBub3QgcmVhY2hhYmxlLCBhdXRvLXN0YXJ0aW5nIG9uIHBvcnQgJHtTdHJpbmcocG9ydCl9Li4uYCk7XG4gICAgICBhcHBpdW1Qcm9jZXNzID0gdGhpcy5zdGFydEFwcGl1bVNlcnZlcihwb3J0LCBpc0FwcGl1bUNvbnNvbGVWaXNpYmxlKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgWywgZGV2aWNlUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgbmVlZHNBcHBpdW1TdGFydFxuICAgICAgICAgID8gdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkoYXBwaXVtVXJsLCBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZygnQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgICB0aGlzLmVuc3VyZURldmljZUNvbm5lY3RlZCh7IGF2ZE5hbWUsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGlzRW11bGF0b3JWaXNpYmxlIH0pXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQ6IGRldmljZVJlc3VsdC5hY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoYXBwaXVtUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUoYXBwaXVtUHJvY2Vzcyk7XG4gICAgICAgIHRoaXMubG9nKCdLaWxsZWQgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgYWZ0ZXIgc3RhcnR1cCBmYWlsdXJlLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogQ2hpbGRQcm9jZXNzIHtcbiAgICBjb25zdCBpc0NvbnNvbGVIaWRkZW4gPSBzaG91bGRIaWRlQXBwaXVtQ29uc29sZShpc0FwcGl1bUNvbnNvbGVWaXNpYmxlKTtcbiAgICBjb25zdCB7IGRldGFjaGVkLCB3aW5kb3dzSGlkZSB9ID0gcmVzb2x2ZUFwcGl1bVNwYXduRmxhZ3MoaXNDb25zb2xlSGlkZGVuKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggYXBwaXVtIC0tbG9nLXRpbWVzdGFtcCAtLXBvcnQgJHtTdHJpbmcocG9ydCl9IC0tYWxsb3ctaW5zZWN1cmU9JHtDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkV9YCwge1xuICAgICAgZGV0YWNoZWQsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBpc0NvbnNvbGVIaWRkZW4gPyAnaWdub3JlJyA6IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGNoaWxkLnVucmVmKCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEVtdWxhdG9yKGF2ZE5hbWU6IHN0cmluZywgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuKTogRW11bGF0b3JMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gdGhpcy5yZXNvbHZlRW11bGF0b3JCaW5hcnkoKTtcbiAgICBjb25zdCBpc1dpbmRvd0hpZGRlbiA9IHNob3VsZEhpZGVFbXVsYXRvcldpbmRvdyhpc0VtdWxhdG9yVmlzaWJsZSk7XG4gICAgY29uc3QgYXJncyA9IGJ1aWxkRW11bGF0b3JBcmdzKHsgYXZkTmFtZSwgaXNIaWRkZW46IGlzV2luZG93SGlkZGVuIH0pO1xuICAgIGNvbnN0IHsgZGV0YWNoZWQsIHdpbmRvd3NIaWRlIH0gPSByZXNvbHZlRW11bGF0b3JTcGF3bkZsYWdzKGlzV2luZG93SGlkZGVuKTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAvKlxuICAgICAqIFBpcGUgKHJhdGhlciB0aGFuIGlnbm9yZSkgc3Rkb3V0L3N0ZGVyciBzbyBhbiBlYXJseSBmYWlsdXJlIHN1Y2ggYXNcbiAgICAgKiBcIng4Nl82NCBlbXVsYXRpb24gY3VycmVudGx5IHJlcXVpcmVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvblwiIGNhbiBiZVxuICAgICAqIHN1cmZhY2VkIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZW11bGF0b3JCaW5hcnksIGFyZ3MsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogRW11bGF0b3JFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgYXBwZW5kT3V0cHV0KTtcbiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZSwgc2lnbmFsIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBndWVzdCdzIGNyYXNoL0FOUiBkaWFsb2dzIG9uIHRoZSBnaXZlbiBkZXZpY2UuXG4gICAqXG4gICAqIEEgcmVzb3VyY2Utc3RhcnZlZCBlbXVsYXRvciBjYW4gcmFpc2UgYSBcIlByb2Nlc3Mgc3lzdGVtIGlzbid0IHJlc3BvbmRpbmdcIlxuICAgKiBBTlIgKGFuIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0aW1lb3V0KSB3aG9zZSBkaWFsb2cgb3ZlcmxheXMgdGhlIFVJLiBJZlxuICAgKiBpdCBhcHBlYXJzIGJlZm9yZSBBcHBpdW0gYXR0YWNoZXMsIG5vdGhpbmcgY2FuIGRpc21pc3MgaXQgYW5kIHRoZSBydW4gaGFuZ3NcbiAgICogb3IgZmFpbHMgaW50ZXJtaXR0ZW50bHkuIFNldHRpbmcgdGhlIGBoaWRlX2Vycm9yX2RpYWxvZ3NgIGdsb2JhbCBcdTIwMTQgdGhlIHNhbWVcbiAgICogZmxhZyBBbmRyb2lkJ3Mgb3duIHRlc3QgaW5mcmEgdXNlcyBcdTIwMTQgdGVsbHMgYEFjdGl2aXR5TWFuYWdlclNlcnZpY2VgIHRvXG4gICAqIG5ldmVyIGRyYXcgY3Jhc2gvQU5SIGRpYWxvZ3MsIHNvIHRoZSBBTlIgY2FuIG5vIGxvbmdlciBibG9jayBhdXRvbWF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBlYXJsaWVzdCBwb2ludCBhdCB3aGljaCB0aGUgZmxhZyBjYW4gYmUgc2V0OiB0aGUgZnJhbWV3b3JrXG4gICAqIChgc3lzdGVtX3NlcnZlcmApIG11c3QgYmUgdXAgYmVmb3JlIGBzZXR0aW5ncyBwdXRgIHdvcmtzLCBzbyBjYWxsZXJzIGludm9rZVxuICAgKiBpdCBvbmx5IGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLiBJdCBuYXJyb3dzIFx1MjAxNCBidXQgY2Fubm90IGZ1bGx5IGNsb3NlIFx1MjAxNFxuICAgKiB0aGUgcmFjZSB3aXRoIGFuIEFOUiB0aGF0IGZpcmVzIGJldHdlZW4gYm9vdCBjb21wbGV0aW5nIGFuZCB0aGlzIGNhbGw7IGFcbiAgICogcHJlLWJha2VkIHNuYXBzaG90IHdpdGggdGhlIGZsYWcgYWxyZWFkeSBzZXQgaXMgdGhlIG9ubHkgd2F5IHRvIGVsaW1pbmF0ZVxuICAgKiBpdCBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNpbmNlIGl0IG9ubHlcbiAgICogc3VwcHJlc3NlcyBhIHN5bXB0b20uXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBjb25maWd1cmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgRGlzYWJsaW5nIGNyYXNoL0FOUiBkaWFsb2dzIG9uIGRldmljZSAke2RldmljZUlkfSAoc2V0dGluZ3MgcHV0IGdsb2JhbCBoaWRlX2Vycm9yX2RpYWxvZ3MgMSkuLi5gKTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ3NldHRpbmdzJywgJ3B1dCcsICdnbG9iYWwnLCAnaGlkZV9lcnJvcl9kaWFsb2dzJywgJzEnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gZGlzYWJsZSBjcmFzaC9BTlIgZGlhbG9nczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckFwcGl1bVJlYWR5KHVybDogVVJMLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBBcHBpdW0gYXQgJHt1cmwuaHJlZn0gKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgcmVhZHkgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMubG9nKGBBcHBpdW0gc2VydmVyIG5vdCByZWFkeSB5ZXQgKGVsYXBzZWQ6ICR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMpLiBSZXRyeWluZy4uLmApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JCb290KGRldmljZUlkOiBzdHJpbmcsIGRlYWRsaW5lOiBudW1iZXIsIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlbWFpbmluZ01zID0gTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gZmluaXNoIGJvb3RpbmcgKHJlbWFpbmluZzogJHtTdHJpbmcocmVtYWluaW5nTXMpfW1zLCBwb2xsOiAke1N0cmluZyhFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGlzQm9vdGVkID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICAgJ2FkYicsXG4gICAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnZ2V0cHJvcCcsICdzeXMuYm9vdF9jb21wbGV0ZWQnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoX2Vycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSA9PT0gJzEnKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzQm9vdGVkKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gYm9vdCBjb21wbGV0ZWQuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpdEluZm8gPSBlbXVsYXRvci5yZWFkRXhpdEluZm8oKTtcbiAgICAgIGlmIChleGl0SW5mbykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRFbXVsYXRvckV4aXRNZXNzYWdlKGV4aXRJbmZvLCBlbXVsYXRvci5yZWFkT3V0cHV0KCkpKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEZXZpY2UgXCIke2RldmljZUlkfVwiIGNvbm5lY3RlZCBidXQgZGlkIG5vdCBmaW5pc2ggYm9vdGluZyB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIGEgZnJlc2hseS1ib290ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLlxuICAgKlxuICAgKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyBiZWZvcmUgdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGUgXHUyMDE0IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzZXJ2aWNlcyBrZWVwIGNodXJuaW5nIFx1MjAxNCBzbyBlc3RhYmxpc2hpbmcgdGhlIEFwcGl1bVxuICAgKiBzZXNzaW9uIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IHNlcmlhbGl6ZWQgVWlBdXRvbWF0b3IyIGBhZGJgIHJvdW5kLXRyaXBcbiAgICogY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZXMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IH4zeC4gVGhpcyBwb2xsc1xuICAgKiBhIGxhdGVyLCBxdWlldGVyIHNpZ25hbCAoYm9vdCBhbmltYXRpb24gc3RvcHBlZCArIHBhY2thZ2UgbWFuYWdlciBzZXJ2aW5nLFxuICAgKiB2aWEge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGFuZCByZXR1cm5zIGFzIHNvb24gYXMgaXQgaXMgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydDogaWYgdGhlIGd1ZXN0IGRvZXMgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiB0aGUgYnVkZ2V0IGl0IGxvZ3MgYVxuICAgKiB3YXJuaW5nIGFuZCBwcm9jZWVkcyAoYSBzbG93IHNlc3Npb24gaXMgYmV0dGVyIHRoYW4gYSBmYWlsZWQgcnVuKSwgYW5kIGFcbiAgICogYnVkZ2V0IG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIHBvbGwuXG4gICAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBNYXhpbXVtIHRpbWUgdG8gd2FpdDsgYDBgIHNraXBzIHRoZSB3YWl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlSWRsZShkZXZpY2VJZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aW1lb3V0SW5NaWxsaXNlY29uZHMgPD0gMCkge1xuICAgICAgdGhpcy5sb2coYFNraXBwaW5nIHBvc3QtYm9vdCBpZGxlIHdhaXQgZm9yIGRldmljZSAke2RldmljZUlkfSAodGltZW91dCBpcyAwKS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gdG8gYmVjb21lIGlkbGUgKHRpbWVvdXQ6ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMsIHBvbGw6ICR7U3RyaW5nKERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IFtib290QW5pbWF0aW9uUHJvcCwgcGFja2FnZUxpc3RPdXRwdXRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLmdldERldmljZVByb3AoZGV2aWNlSWQsICdpbml0LnN2Yy5ib290YW5pbScpLFxuICAgICAgICB0aGlzLmxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZClcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoY2hlY2tEZXZpY2VJZGxlKHsgYm9vdEFuaW1hdGlvblByb3AsIHBhY2thZ2VMaXN0T3V0cHV0IH0pKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gaXMgaWRsZSBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gbm90IGlkbGUgeWV0IChlbGFwc2VkOiAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zKS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FybmluZzogZGV2aWNlICR7ZGV2aWNlSWR9IGRpZCBub3QgcmVwb3J0IGlkbGUgd2l0aGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM7IHByb2NlZWRpbmcgd2l0aCBzZXNzaW9uIGVzdGFibGlzaG1lbnQgYW55d2F5LmBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZTogc3RyaW5nW10sIGVtdWxhdG9yOiBFbXVsYXRvckxhdW5jaCwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckJvb3QoYWN0dWFsRGV2aWNlSWQsIGRlYWRsaW5lLCBlbXVsYXRvcik7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZUlkbGUoYWN0dWFsRGV2aWNlSWQsIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkRW11bGF0b3JFeGl0TWVzc2FnZShleGl0SW5mbywgZW11bGF0b3IucmVhZE91dHB1dCgpKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTm8gbmV3IGVtdWxhdG9yIGRldmljZSBhcHBlYXJlZCB3aXRoaW4gJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdha2VTY3JlZW4oZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBXYWtpbmcgc2NyZWVuIG9uIGRldmljZSAke2RldmljZUlkfS4uLmApO1xuXG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfV0FLRVVQLCAnd2FrZSBzY3JlZW4nKTtcbiAgICBhd2FpdCB0aGlzLnNlbmRLZXlFdmVudChkZXZpY2VJZCwgS0VZQ09ERV9NRU5VLCAnZGlzbWlzcyBsb2NrIHNjcmVlbicpO1xuXG4gICAgdGhpcy5sb2coYFNjcmVlbiB3YWtlIGNvbXBsZXRlIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gYW4gb3duZWQgZGVza3RvcCBDRFAgdHJhbnNwb3J0LlxuICogQHJldHVybnMgQSBuZXcgdHJhbnNwb3J0IGluc3RhbmNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcblxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIHJldHVybiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkodHlwZSk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIENMSSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGZvciBhbiBlbXVsYXRvciBwcm9jZXNzIHRoYXQgZXhpdGVkIGR1cmluZ1xuICogc3RhcnR1cCwgYXBwZW5kaW5nIHRoZSBjYXB0dXJlZCBvdXRwdXQgdGFpbCB3aGVuIGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0gZXhpdEluZm8gLSBUaGUgZW11bGF0b3IncyBleGl0IGRldGFpbHMuXG4gKiBAcGFyYW0gb3V0cHV0IC0gVGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgdGFpbC5cbiAqIEByZXR1cm5zIEEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRFbXVsYXRvckV4aXRNZXNzYWdlKGV4aXRJbmZvOiBFbXVsYXRvckV4aXRJbmZvLCBvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlYXNvbiA9IGV4aXRJbmZvLnNpZ25hbCA9PT0gbnVsbFxuICAgID8gYGV4aXRlZCBwcmVtYXR1cmVseSB3aXRoIGNvZGUgJHtTdHJpbmcoZXhpdEluZm8uY29kZSl9YFxuICAgIDogYHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAke2V4aXRJbmZvLnNpZ25hbH1gO1xuICBjb25zdCB0cmltbWVkT3V0cHV0ID0gb3V0cHV0LnRyaW0oKTtcbiAgY29uc3QgZGV0YWlscyA9IHRyaW1tZWRPdXRwdXQubGVuZ3RoID4gMFxuICAgID8gYFxcblxcbkVtdWxhdG9yIG91dHB1dCAodGFpbCk6XFxuJHt0cmltbWVkT3V0cHV0fWBcbiAgICA6ICcnO1xuICByZXR1cm4gYEFuZHJvaWQgZW11bGF0b3IgJHtyZWFzb259IGR1cmluZyBzdGFydHVwLiR7ZGV0YWlsc31gO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogZm9yIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIGVpdGhlciB0aHJvd3NcbiAqIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9ICh3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KVxuICogb3IgcHJvY2VlZHMgdG8gbGF1bmNoIHdpdGggYSB3YXJuaW5nOyBmb3IgYSBydW5uYWJsZS1idXQtYmVsb3ctcmVjb21tZW5kZWRcbiAqIGluc3RhbGxlciBsb2dzIGEgd2FybmluZy4gQm90aCB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZCB3aGVuXG4gKiB7QGxpbmsgQ2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXN9IGlzXG4gKiBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSB3YXJuL3Rocm93IGtub2JzLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiBjaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHkocGFyYW1zOiBDaGVja0FuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uLCBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLCBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzIH0gPSBwYXJhbXM7XG4gIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24oe1xuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0aWVyOiBjb21wYXRpYmlsaXR5LnRpZXJcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi11bnJ1bm5hYmxlJykge1xuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBPYnNpZGlhbiBpbnN0YWxsZXIgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lmluc3RhbGxlclZlcnNpb24pfSBpcyBiZWxvdyB0aGUgYFxuICAgICAgICArIGBydW4gZmxvb3IgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbil9IGZvciBPYnNpZGlhbiAke2NvbXBhdGliaWxpdHkuYXBwVmVyc2lvbn07IGBcbiAgICAgICAgKyAncHJvY2VlZGluZyB0byBsYXVuY2ggKHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIgaXMgZmFsc2UpIFx1MjAxNCB0aGUgYm9vdCB3aWxsIGxpa2VseSBkZWFkLWJvb3QuJ1xuICAgICk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi1uYWdnZWQnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSAke2Vuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWVzc2FnZSl9YCk7XG4gIH1cblxuICByZXR1cm4gY29tcGF0aWJpbGl0eTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVza3RvcCBDRFAgdHJhbnNwb3J0LiBXaGVuIGFuIGV4cGxpY2l0IGBwb3J0YCBpcyBnaXZlbiB0aGVcbiAqIHRyYW5zcG9ydCBhdHRhY2hlcyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gb24gdGhhdCBwb3J0OyBvdGhlcndpc2UgaXRcbiAqIGxhdW5jaGVzIGFuZCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlICh0aGUgZGVmYXVsdCwgaGVybWV0aWMgbW9kZSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvd25lZFN1ZmZpeCA9IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/ICcgKGhhcm5lc3Mtb3duZWQpJyA6ICcnO1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQXR0YWNoaW5nIHRvIHJ1bm5pbmcgT2JzaWRpYW4ke293bmVkU3VmZml4fSAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0KX0pYCk7XG4gICAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgICBjZHBIb3N0OiBvcHRpb25zLmhvc3QsXG4gICAgICBjZHBQb3J0OiBvcHRpb25zLnBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiBvcHRpb25zLmlzSGFybmVzc093bmVkSW5zdGFuY2VcbiAgICB9KSk7XG4gIH1cblxuICBsb2coJ1t0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIENyZWF0aW5nIG93bmVkIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlJyk7XG4gIGNvbnN0IG93bmVkSW5zdGFuY2UgPSBhd2FpdCByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZyhvcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBEZXNrdG9wQ2RwVHJhbnNwb3J0KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnPih7XG4gICAgY2RwSG9zdDogb3B0aW9ucz8uaG9zdCxcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogcmVzb2x2ZURlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyhvcHRpb25zKSxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUsXG4gICAgb3duZWRJbnN0YW5jZSxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogcmVzb2x2ZVNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sob3B0aW9ucz8uc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmcmVzaCwgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBmb3IgYW4gb3duZWQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG5ldyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU93bmVkVXNlckRhdGFEaXIoKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gIG1rZGlyU3luYyhyb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIG1rZHRlbXBTeW5jKGpvaW4ocm9vdCwgT1dORURfVVNFUl9EQVRBX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZXF1ZXN0ZWQgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCB0byBhbiBvd25lZFxuICogaW5zdGFuY2UsIHdpdGhvdXQgZG93bmxvYWRpbmcgYW55dGhpbmcgeWV0OiBhbiB1cGdyYWRlLW9ubHkgYXNhci1zd2FwIG9udG8gdGhlXG4gKiBzaGVsbCwgYSBkb3duZ3JhZGUgdG8gdGhlIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIG9yIHRoZSB1c2VyJ3MgbmV3ZXN0XG4gKiBpbnN0YWxsZWQgYXNhciB3aGVuIG5laXRoZXIgdmVyc2lvbiBpcyBwaW5uZWQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gc2hlbGxWZXJzaW9uIC0gVGhlIHJlc29sdmVkIGluc3RhbGxlci9zaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIFRoZSBhc2FyIHBsYW4gKGF0IG1vc3Qgb25lIG9mIGl0cyBmaWVsZHMgaXMgc2V0KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUFzYXJQbGFuKFxuICBvcHRpb25zOiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPEFzYXJQbGFuPiB7XG4gIGlmIChvcHRpb25zPy5vYnNpZGlhblZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFzYXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuVmVyc2lvbik7XG4gICAgaWYgKHNoZWxsVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhhc2FyVmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSB7XG4gICAgICByZXR1cm4geyBhc2FyVmVyc2lvblRvU3dhcDogYXNhclZlcnNpb24gfTtcbiAgICB9XG5cbiAgICAvLyBBc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5LCBzbyBpdCBjYW5ub3QgYXBwbHkgYSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlXG4gICAgLy8gU2hlbGwncyBidW5kbGVkIG9uZSBcdTIwMTQgYW5kIHdoZW4gdGhlIHNoZWxsIHZlcnNpb24gaXMgdW5rbm93biAoYSBMaW51eFxuICAgIC8vIFBhdGgtcGFyc2UgbWlzcykgd2UgY2Fubm90IHByb3ZlIHRoZSBzd2FwIHdvdWxkIGFwcGx5IGF0IGFsbC4gSW4gYm90aFxuICAgIC8vIENhc2VzIHVzZSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ncyBvd24gaW5zdGFsbGVyIHNoZWxsLCB3aG9zZSBidW5kbGVkIGFzYXJcbiAgICAvLyBJcyBleGFjdGx5IHRoaXMgdmVyc2lvbiwgc28gdGhlIHBpbiBpcyBhbHdheXMgaG9ub3JlZC5cbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1jZHBdIFVzaW5nIHRoZSAke2FzYXJWZXJzaW9ufSBpbnN0YWxsZXIgc2hlbGwgKHNoZWxsIHZlcnNpb24gJHtzaGVsbFZlcnNpb24gPz8gJ3Vua25vd24nfTsgYXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSkuYCk7XG4gICAgcmV0dXJuIHsgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbjogYXNhclZlcnNpb24gfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG5ld2VzdCA9IGZpbmROZXdlc3RBc2FyKGdldE9ic2lkaWFuQ29uZmlnRGlyKCkpO1xuICAgIGlmIChuZXdlc3QgJiYgKHNoZWxsVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGNvbXBhcmVWZXJzaW9ucyhuZXdlc3QudmVyc2lvbiwgc2hlbGxWZXJzaW9uKSA+PSAwKSkge1xuICAgICAgcmV0dXJuIHsgYXNhcjogeyBwYXRoOiBuZXdlc3QucGF0aCwgdmVyc2lvbjogbmV3ZXN0LnZlcnNpb24gfSB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gc2hlbGwsIHRvbGVyYXRpbmcgaXRzIGFic2VuY2UuXG4gKlxuICogVW5saWtlIHtAbGluayByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlfSAod2hpY2ggdGhyb3dzIHdoZW4gT2JzaWRpYW4gaXMgbm90XG4gKiBpbnN0YWxsZWQpLCB0aGlzIHJldHVybnMgYHVuZGVmaW5lZGAgaW4gdGhhdCBjYXNlLCBzbyBhIGNhbGxlciBwaW5uaW5nIGFuXG4gKiBpbnN0YWxsZXIgdmVyc2lvbiBjYW4gZmFsbCBiYWNrIHRvIGRvd25sb2FkaW5nIHRoZSBwaW5uZWQgc2hlbGwgaW5zdGVhZCBvZlxuICogZmFpbGluZyBvbiBhIGhvc3Qgd2l0aCBubyBPYnNpZGlhbiBpbnN0YWxsZWQgKGUuZy4gQ0kpLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgc2hlbGwncyBwYXRoIGFuZCBkZXRlY3RlZCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuXG4gKiAgIG5vIE9ic2lkaWFuIGlzIGluc3RhbGxlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk6IFByb21pc2U8SW5zdGFsbGVkU2hlbGwgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHJldHVybiB7IGV4ZVBhdGgsIHNoZWxsVmVyc2lvbjogZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgc2hlbGwgZXhlY3V0YWJsZSwgYXNhciBwcm92aXNpb25pbmcsIGFuZCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyXG4gKiBmb3IgYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIGtub2JzLlxuICpcbiAqIC0gYG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbmAgcGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGRvd25sb2FkcyArIGV4dHJhY3RzIGFcbiAqICAgcG9ydGFibGUgYnVpbGQgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGluc3RhbGxlZCBzaGVsbCkuXG4gKiAtIGBvYnNpZGlhblZlcnNpb25gIHBpbnMgdGhlIGFwcDogYW4gYXNhci1zd2FwIHdoZW4gaXQgaXMgPj0gdGhlIHNoZWxsIHZlcnNpb25cbiAqICAgKGNoZWFwKSwgb3RoZXJ3aXNlIHRoZSBtYXRjaGluZyBpbnN0YWxsZXIgc2hlbGwgaXMgdXNlZCAoZG93bmdyYWRlKS5cbiAqIC0gV2hlbiBuZWl0aGVyIGlzIHNldCwgdGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgaXMgY29waWVkIGluIChzbyB0aGVcbiAqICAgb3duZWQgaW5zdGFuY2UgbWF0Y2hlcyB0aGUgdmVyc2lvbiB0aGUgdXNlciBjdXJyZW50bHkgcnVucykgd2l0aCB6ZXJvIG5ldHdvcmsuXG4gKlxuICogVGhlIGNvbmNyZXRlIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyIGlzIHJlc29sdmVkICpiZWZvcmUqIGFueSBzaGVsbC9hc2FyXG4gKiBkb3dubG9hZCwgc28gYSBwcm9hY3RpdmUgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgY2hlY2tcbiAqICh7QGxpbmsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gY2hlY2tBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uOiBzd2FwQXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uOiBzaGVsbFZlcnNpb24sXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogcmVzb2x2ZVNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIob3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogcmVzb2x2ZVNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSk7XG5cbiAgLy8gVGhlIHBpbiBpcyBrbm93biBydW5uYWJsZSBcdTIwMTQgcmVzb2x2ZS9kb3dubG9hZCB0aGUgZGVmZXJyZWQgc2hlbGwgKyBhc2FyIG5vdy5cbiAgLy8gUmV1c2UgdGhlIGluc3RhbGxlZCBzaGVsbCBvbmx5IHdoZW4gaXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBwaW4gKHNhdmVzIHRoZVxuICAvLyBEb3dubG9hZCk7IG90aGVyd2lzZSBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGlubmVkIGluc3RhbGxlci5cbiAgaWYgKHBpbm5lZEluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpO1xuICAgIGV4ZVBhdGggPSBpbnN0YWxsZWQ/LnNoZWxsVmVyc2lvbiA9PT0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcbiAgICB1c2VyRGF0YURpcjogY3JlYXRlT3duZWRVc2VyRGF0YURpcigpXG4gIH07XG59XG5cbi8qKlxuICogUmVtb3ZlcyBgQ29ubmVjdGlvbmAgYW5kIGBDb250ZW50LUxlbmd0aGAgZnJvbSBhIFdlYkRyaXZlciByZXF1ZXN0J3MgaGVhZGVycy5cbiAqXG4gKiBUaGUgYnVuZGxlZCBgd2ViZHJpdmVyYCBwYWNrYWdlIHNldHMgYm90aCBoZWFkZXJzIGV4cGxpY2l0bHkuIFRoZXkgYXJlXG4gKiBmb3JiaWRkZW4gcmVxdWVzdCBoZWFkZXJzIHBlciB0aGUgRmV0Y2ggc3BlYzogTm9kZSB1cCB0byAyNSBhY2NlcHRlZCB0aGVtXG4gKiBzaWxlbnRseSwgYnV0IE5vZGUgMjYgcmVqZWN0cyB0aGVtIHdpdGggYFVORF9FUlJfSU5WQUxJRF9BUkdgLCBicmVha2luZyB0aGVcbiAqIEFwcGl1bSBgL3Nlc3Npb25gIHJlcXVlc3QuIFRoZSB0cmFuc3BvcnQgbGF5ZXIgbWFuYWdlcyBjb25uZWN0aW9uIHJldXNlIGFuZFxuICogdGhlIEZldGNoIEFQSSBjb21wdXRlcyBgQ29udGVudC1MZW5ndGhgIGZyb20gdGhlIGJvZHksIHNvIGRyb3BwaW5nIGJvdGggaXNcbiAqIHNhZmUgb24gZXZlcnkgTm9kZSB2ZXJzaW9uLiBTZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJkcml2ZXJpby93ZWJkcml2ZXJpby9pc3N1ZXMvMTUyNjV9LlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyAtIFRoZSByZXF1ZXN0IG9wdGlvbnMgYWJvdXQgdG8gYmUgc2VudCBieSBXZWJEcml2ZXJJTy5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIHJlcXVlc3Qgb3B0aW9ucyB3aXRoIHRoZSBmb3JiaWRkZW4gaGVhZGVycyByZW1vdmVkLlxuICovXG5mdW5jdGlvbiBzdHJpcEZvcmJpZGRlbkZldGNoSGVhZGVycyhyZXF1ZXN0T3B0aW9uczogUmVxdWVzdEluaXQpOiBSZXF1ZXN0SW5pdCB7XG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykge1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb25uZWN0aW9uJyk7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdE9wdGlvbnM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7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Qix3Q0FBb0Msd0VBQTBDLFNBQVMsa0NBQWtDO0FBQUEsSUFDekgscUNBQWlDLHFFQUF1QyxTQUFTLCtCQUErQjtBQUFBLEVBQ2xILENBQUM7QUFLRCxNQUFJLDJCQUEyQixRQUFXO0FBQ3hDLFVBQU0sWUFBWSxNQUFNLDRCQUE0QjtBQUNwRCxjQUFVLFdBQVcsaUJBQWlCLHlCQUF5QixVQUFVLFVBQVUsVUFBTSw2Q0FBa0Isc0JBQXNCO0FBQUEsRUFDbkk7QUFDQSxNQUFJLEtBQUssOEJBQThCLFFBQVc7QUFDaEQsY0FBVSxVQUFNLDZDQUFrQixLQUFLLHlCQUF5QjtBQUFBLEVBQ2xFO0FBRUEsUUFBTSxPQUFPLEtBQUssc0JBQXNCLFNBQ3BDLEtBQUssT0FDTCxFQUFFLE1BQU0sVUFBTSxpREFBaUIsS0FBSyxpQkFBaUIsR0FBRyxTQUFTLEtBQUssa0JBQWtCO0FBRTVGLFNBQU87QUFBQSxJQUNMLEdBQUksUUFBUSxFQUFFLEtBQUs7QUFBQSxJQUNuQixHQUFJLGlCQUFpQixFQUFFLGNBQWM7QUFBQSxJQUNyQyxhQUFTLHNDQUFrQixPQUFPO0FBQUEsSUFDbEMsYUFBYSx1QkFBdUI7QUFBQSxFQUN0QztBQUNGO0FBZUEsU0FBUywyQkFBMkIsZ0JBQTBDO0FBQzVFLE1BQUksZUFBZSxtQkFBbUIsU0FBUztBQUM3QyxtQkFBZSxRQUFRLE9BQU8sWUFBWTtBQUMxQyxtQkFBZSxRQUFRLE9BQU8sZ0JBQWdCO0FBQUEsRUFDaEQ7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImh0dHAiLCAia2lsbEF1dG9TdGFydGVkUHJvY2Vzc2VzIiwgInByb2Nlc3MiXQp9Cg==