obsidian-integration-testing 15.0.0 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/lib/cjs/adb.cjs +2 -2
  2. package/dist/lib/cjs/adb.d.cts +10 -0
  3. package/dist/lib/cjs/avd-name-channel.cjs +74 -0
  4. package/dist/lib/cjs/avd-name-channel.d.cts +152 -0
  5. package/dist/lib/cjs/avd-probe-verdict.cjs +11 -4
  6. package/dist/lib/cjs/avd-probe-verdict.d.cts +7 -0
  7. package/dist/lib/cjs/device-screenshot.cjs +1 -1
  8. package/dist/lib/cjs/device-screenshot.d.cts +3 -1
  9. package/dist/lib/cjs/emulator-backend.cjs +22 -1
  10. package/dist/lib/cjs/emulator-backend.d.cts +81 -0
  11. package/dist/lib/cjs/emulator-reclaim.cjs +78 -34
  12. package/dist/lib/cjs/emulator-reclaim.d.cts +57 -9
  13. package/dist/lib/cjs/enable-plugin.cjs +17 -8
  14. package/dist/lib/cjs/enable-plugin.d.cts +3 -1
  15. package/dist/lib/cjs/host-process-query-verdict.cjs +103 -0
  16. package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
  17. package/dist/lib/cjs/index.cjs +14 -1
  18. package/dist/lib/cjs/index.d.cts +3 -1
  19. package/dist/lib/cjs/label-screenshot.cjs +2 -2
  20. package/dist/lib/cjs/launched-device-selection.cjs +46 -0
  21. package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
  22. package/dist/lib/cjs/library.cjs +1 -1
  23. package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
  24. package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
  25. package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
  26. package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
  27. package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
  28. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  29. package/dist/lib/cjs/sharp-loader.d.cts +67 -2
  30. package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
  31. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
  32. package/dist/lib/cjs/soft-keyboard.cjs +130 -28
  33. package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
  34. package/dist/lib/cjs/transport-appium.cjs +74 -4
  35. package/dist/lib/cjs/transport-appium.d.cts +49 -2
  36. package/dist/lib/cjs/transport-factory.cjs +162 -42
  37. package/dist/lib/esm/adb.d.mts +10 -0
  38. package/dist/lib/esm/adb.mjs +2 -2
  39. package/dist/lib/esm/avd-name-channel.d.mts +152 -0
  40. package/dist/lib/esm/avd-name-channel.mjs +45 -0
  41. package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
  42. package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
  43. package/dist/lib/esm/device-screenshot.d.mts +3 -1
  44. package/dist/lib/esm/device-screenshot.mjs +1 -1
  45. package/dist/lib/esm/emulator-backend.d.mts +81 -0
  46. package/dist/lib/esm/emulator-backend.mjs +19 -1
  47. package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
  48. package/dist/lib/esm/emulator-reclaim.mjs +84 -36
  49. package/dist/lib/esm/enable-plugin.d.mts +3 -1
  50. package/dist/lib/esm/enable-plugin.mjs +17 -8
  51. package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
  52. package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
  53. package/dist/lib/esm/index.d.mts +3 -1
  54. package/dist/lib/esm/index.mjs +15 -1
  55. package/dist/lib/esm/label-screenshot.mjs +2 -2
  56. package/dist/lib/esm/launched-device-selection.d.mts +112 -0
  57. package/dist/lib/esm/launched-device-selection.mjs +21 -0
  58. package/dist/lib/esm/library.mjs +1 -1
  59. package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
  60. package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
  61. package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
  62. package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
  63. package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
  64. package/dist/lib/esm/sharp-loader.d.mts +67 -2
  65. package/dist/lib/esm/sharp-loader.mjs +1 -1
  66. package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
  67. package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
  68. package/dist/lib/esm/soft-keyboard.d.mts +65 -6
  69. package/dist/lib/esm/soft-keyboard.mjs +131 -28
  70. package/dist/lib/esm/transport-appium.d.mts +49 -2
  71. package/dist/lib/esm/transport-appium.mjs +74 -4
  72. package/dist/lib/esm/transport-factory.mjs +176 -44
  73. package/package.json +1 -1
@@ -32,6 +32,16 @@ export interface RunAdbParams {
32
32
  * The device to address, as `adb devices` lists it.
33
33
  */
34
34
  readonly deviceId: string;
35
+ /**
36
+ * How long to give the call before killing it, in milliseconds.
37
+ *
38
+ * Omitted — the default — the call waits indefinitely, which is right for the
39
+ * capture helpers: a screencap of a big framebuffer is slow, not stuck. A
40
+ * caller that is *identifying* a device it may not own passes one, because
41
+ * there the whole point is to give up on a wedged guest rather than hang the
42
+ * run behind it.
43
+ */
44
+ readonly timeoutInMilliseconds?: number | undefined;
35
45
  }
36
46
  /**
37
47
  * Runs `adb -s <deviceId> <commandArguments>` and returns stdout **undecoded**.
@@ -3,7 +3,7 @@ const OUTPUT_MAX_BUFFER_IN_BYTES = 67108864;
3
3
  async function runAdbBinary(params) {
4
4
  const commandArguments = ["-s", params.deviceId, ...params.commandArguments];
5
5
  return await new Promise((resolve, reject) => {
6
- execFile("adb", commandArguments, { encoding: "buffer", maxBuffer: OUTPUT_MAX_BUFFER_IN_BYTES }, (error, stdout) => {
6
+ execFile("adb", commandArguments, { encoding: "buffer", maxBuffer: OUTPUT_MAX_BUFFER_IN_BYTES, timeout: params.timeoutInMilliseconds }, (error, stdout) => {
7
7
  if (error) {
8
8
  reject(new Error(`Failed to run 'adb ${commandArguments.join(" ")}': ${error.message}. Is ADB installed and in PATH?`));
9
9
  return;
@@ -32,4 +32,4 @@ export {
32
32
  runAdbText,
33
33
  runAdbTextWithoutDevice
34
34
  };
35
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FkYi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJ1bnMgYGFkYmAgYW5kIGhhbmRzIGJhY2sgd2hhdCBpdCBwcmludGVkIFx1MjAxNCBhcyB0ZXh0LCBvciBhcyByYXcgYnl0ZXMuXG4gKlxuICogVGhlIGhhcm5lc3MgYWxyZWFkeSBzaGVsbHMgb3V0IHRvIGBhZGJgIGluIGhhbGYgYSBkb3plbiBwbGFjZXMgaW5zaWRlXG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIC8gYHRyYW5zcG9ydC1hcHBpdW1gLCBidXQgYWx3YXlzIHRocm91Z2ggYGV4ZWNgLCB3aGljaFxuICogZGVjb2RlcyBzdGRvdXQgYXMgVVRGLTguIFRoYXQgaXMgZmluZSBmb3IgYGRldmljZXNgIGFuZCBgc2V0dGluZ3MgZ2V0YCBhbmRcbiAqIGZhdGFsbHkgd3JvbmcgZm9yIGBleGVjLW91dCBzY3JlZW5jYXAgLXBgLCB3aG9zZSBzdGRvdXQgaXMgYSBQTkc6IGRlY29kaW5nIGl0XG4gKiBhcyB0ZXh0IGNvcnJ1cHRzIGV2ZXJ5IGJ5dGUgYWJvdmUgMHg3Ri4gSGVuY2UgdGhlIHR3byBydW5uZXJzIGhlcmUgXHUyMDE0IHRoZSBzYW1lXG4gKiBjb21tYW5kIHNoYXBlLCBkaWZmZXJpbmcgb25seSBpbiB3aGV0aGVyIHRoZSBvdXRwdXQgaXMgZGVjb2RlZC5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIHByb2Nlc3MgbGF5ZXIgZm9yIHRoZSBkZXZpY2UtZmFjaW5nIGhlbHBlcnMgYSBjYXB0dXJlIHN1aXRlXG4gKiB1c2VzIChgZGV2aWNlLXNjcmVlbnNob3RgLCBgZGV2aWNlLXNldHRpbmdzYCwgYHNvZnQta2V5Ym9hcmRgKTsgdGhleSBhcmUgbm90IGFcbiAqIGdlbmVyYWwtcHVycG9zZSBhZGIgd3JhcHBlciBhbmQgZGVsaWJlcmF0ZWx5IGRvIG5vdCB0cnkgdG8gYmVjb21lIG9uZS5cbiAqXG4gKiBFdmVyeSBmdW5jdGlvbiBoZXJlIHNoZWxscyBvdXQsIHNvIHRoZSB3aG9sZSBtb2R1bGUgaXMgaW50ZWdyYXRpb24tdGltZSBjb2RlLlxuICogVGhhdCBpcyBhbHNvIHdoeSB0aGUgcGFyc2luZyBhbmQgZ2VvbWV0cnkgdGhlc2UgaGVscGVycyBkZXBlbmQgb24gbGl2ZSBpblxuICogdGhlaXIgb3duIG1vZHVsZXMgXHUyMDE0IHRoZSBzYW1lIHNwbGl0IGBhZGItZGV2aWNlLWxpc3RgIGFscmVhZHkgaGFzIGZyb20gdGhlXG4gKiB0cmFuc3BvcnQgZmFjdG9yeSwgc28gYSBzb3J0IHJ1bGUgY2FuIG5ldmVyIG1vdmUgYSB1bml0LXRlc3RlZCBmdW5jdGlvblxuICogaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jay5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChzaGVsbHMgb3V0IHRvIGEgcmVhbCBkZXZpY2UpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bkFkYkJpbmFyeX0gYW5kIHtAbGluayBydW5BZGJUZXh0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5BZGJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBwYXNzIGFmdGVyIGAtcyA8ZGV2aWNlSWQ+YCwgZS5nLiBgWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCAnMTAnLCAnMjAnXWAuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLCBhcyBgYWRiIGRldmljZXNgIGxpc3RzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNjcmVlbmNhcCBvZiBhIDkwMHgxNjAwIGRldmljZSBydW5zIHRvIGFib3V0IDEwMCBLQiwgYnV0IGEgdGFibGV0IEFWRCdzIGZyYW1lYnVmZmVyIGlzIHNldmVyYWwgTUIgYW5kXG4gKiB0aGUgZGVmYXVsdCAxIE1pQiBgbWF4QnVmZmVyYCBmYWlscyB0aGUgY2FsbCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSB1c2FibGUgaW1hZ2UuXG4gKi9cbmNvbnN0IE9VVFBVVF9NQVhfQlVGRkVSX0lOX0JZVEVTID0gNjdfMTA4Xzg2NDtcblxuLyoqXG4gKiBSdW5zIGBhZGIgLXMgPGRldmljZUlkPiA8Y29tbWFuZEFyZ3VtZW50cz5gIGFuZCByZXR1cm5zIHN0ZG91dCAqKnVuZGVjb2RlZCoqLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyBzdGRvdXQgYnl0ZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFkYiBjb3VsZCBub3QgYmUgcnVuLCBvciBleGl0ZWQgbm9uLXplcm8uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBSdW5BZGJQYXJhbXNgIGlzIG9uZSBiYWcgc2hhcmVkIGJ5IGBydW5BZGJCaW5hcnlgIGFuZCBgcnVuQWRiVGV4dGAsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWRiQmluYXJ5KHBhcmFtczogUnVuQWRiUGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGNvbW1hbmRBcmd1bWVudHMgPSBbJy1zJywgcGFyYW1zLmRldmljZUlkLCAuLi5wYXJhbXMuY29tbWFuZEFyZ3VtZW50c107XG5cbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnYWRiJywgY29tbWFuZEFyZ3VtZW50cywgeyBlbmNvZGluZzogJ2J1ZmZlcicsIG1heEJ1ZmZlcjogT1VUUFVUX01BWF9CVUZGRVJfSU5fQllURVMgfSwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgJHtjb21tYW5kQXJndW1lbnRzLmpvaW4oJyAnKX0nOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1bnMgYGFkYiAtcyA8ZGV2aWNlSWQ+IDxjb21tYW5kQXJndW1lbnRzPmAgYW5kIHJldHVybnMgc3Rkb3V0IGFzIHRyaW1tZWQgdGV4dC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgdGhlIGFyZ3VtZW50cyB0byBydW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHN0ZG91dCwgd2l0aCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFkYiBjb3VsZCBub3QgYmUgcnVuLCBvciBleGl0ZWQgbm9uLXplcm8uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBSdW5BZGJQYXJhbXNgIGlzIG9uZSBiYWcgc2hhcmVkIGJ5IGBydW5BZGJCaW5hcnlgIGFuZCBgcnVuQWRiVGV4dGAsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IGJvdGguXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWRiVGV4dChwYXJhbXM6IFJ1bkFkYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHJ1bkFkYkJpbmFyeShwYXJhbXMpO1xuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHN0ZG91dCkudHJpbSgpO1xufVxuXG4vKipcbiAqIFJ1bnMgYGFkYiA8Y29tbWFuZEFyZ3VtZW50cz5gIHdpdGggbm8gZGV2aWNlIHNlbGVjdGVkLlxuICpcbiAqIE9ubHkgYGRldmljZXNgIG5lZWRzIHRoaXMgXHUyMDE0IGV2ZXJ5IG90aGVyIGNhbGwgaW4gdGhpcyBmYW1pbHkgYWRkcmVzc2VzIG9uZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIGNvbW1hbmRBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gc3Rkb3V0LCB3aXRoIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFkYlRleHRXaXRob3V0RGV2aWNlKGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnYWRiJywgWy4uLmNvbW1hbmRBcmd1bWVudHNdLCB7IGVuY29kaW5nOiAndXRmLTgnLCBtYXhCdWZmZXI6IE9VVFBVVF9NQVhfQlVGRkVSX0lOX0JZVEVTIH0sIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiICR7Y29tbWFuZEFyZ3VtZW50cy5qb2luKCcgJyl9JzogJHtlcnJvci5tZXNzYWdlfS4gSXMgQURCIGluc3RhbGxlZCBhbmQgaW4gUEFUSD9gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShzdGRvdXQudHJpbSgpKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUF5QkEsU0FBUyxnQkFBZ0I7QUFxQnpCLE1BQU0sNkJBQTZCO0FBVW5DLGVBQXNCLGFBQWEsUUFBMkM7QUFDNUUsUUFBTSxtQkFBbUIsQ0FBQyxNQUFNLE9BQU8sVUFBVSxHQUFHLE9BQU8sZ0JBQWdCO0FBRTNFLFNBQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUMsYUFBUyxPQUFPLGtCQUFrQixFQUFFLFVBQVUsVUFBVSxXQUFXLDJCQUEyQixHQUFHLENBQUMsT0FBTyxXQUFXO0FBQ2xILFVBQUksT0FBTztBQUNULGVBQU8sSUFBSSxNQUFNLHNCQUFzQixpQkFBaUIsS0FBSyxHQUFHLENBQUMsTUFBTSxNQUFNLE9BQU8saUNBQWlDLENBQUM7QUFDdEg7QUFBQSxNQUNGO0FBRUEsY0FBUSxNQUFNO0FBQUEsSUFDaEIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBVUEsZUFBc0IsV0FBVyxRQUF1QztBQUN0RSxRQUFNLFNBQVMsTUFBTSxhQUFhLE1BQU07QUFDeEMsU0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLE1BQU0sRUFBRSxLQUFLO0FBQy9DO0FBV0EsZUFBc0Isd0JBQXdCLGtCQUFzRDtBQUNsRyxTQUFPLE1BQU0sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQzVDLGFBQVMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsRUFBRSxVQUFVLFNBQVMsV0FBVywyQkFBMkIsR0FBRyxDQUFDLE9BQU8sV0FBVztBQUN0SCxVQUFJLE9BQU87QUFDVCxlQUFPLElBQUksTUFBTSxzQkFBc0IsaUJBQWlCLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxPQUFPLGlDQUFpQyxDQUFDO0FBQ3RIO0FBQUEsTUFDRjtBQUVBLGNBQVEsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUN2QixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FkYi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJ1bnMgYGFkYmAgYW5kIGhhbmRzIGJhY2sgd2hhdCBpdCBwcmludGVkIFx1MjAxNCBhcyB0ZXh0LCBvciBhcyByYXcgYnl0ZXMuXG4gKlxuICogVGhlIGhhcm5lc3MgYWxyZWFkeSBzaGVsbHMgb3V0IHRvIGBhZGJgIGluIGhhbGYgYSBkb3plbiBwbGFjZXMgaW5zaWRlXG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIC8gYHRyYW5zcG9ydC1hcHBpdW1gLCBidXQgYWx3YXlzIHRocm91Z2ggYGV4ZWNgLCB3aGljaFxuICogZGVjb2RlcyBzdGRvdXQgYXMgVVRGLTguIFRoYXQgaXMgZmluZSBmb3IgYGRldmljZXNgIGFuZCBgc2V0dGluZ3MgZ2V0YCBhbmRcbiAqIGZhdGFsbHkgd3JvbmcgZm9yIGBleGVjLW91dCBzY3JlZW5jYXAgLXBgLCB3aG9zZSBzdGRvdXQgaXMgYSBQTkc6IGRlY29kaW5nIGl0XG4gKiBhcyB0ZXh0IGNvcnJ1cHRzIGV2ZXJ5IGJ5dGUgYWJvdmUgMHg3Ri4gSGVuY2UgdGhlIHR3byBydW5uZXJzIGhlcmUgXHUyMDE0IHRoZSBzYW1lXG4gKiBjb21tYW5kIHNoYXBlLCBkaWZmZXJpbmcgb25seSBpbiB3aGV0aGVyIHRoZSBvdXRwdXQgaXMgZGVjb2RlZC5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIHByb2Nlc3MgbGF5ZXIgZm9yIHRoZSBkZXZpY2UtZmFjaW5nIGhlbHBlcnMgYSBjYXB0dXJlIHN1aXRlXG4gKiB1c2VzIChgZGV2aWNlLXNjcmVlbnNob3RgLCBgZGV2aWNlLXNldHRpbmdzYCwgYHNvZnQta2V5Ym9hcmRgKTsgdGhleSBhcmUgbm90IGFcbiAqIGdlbmVyYWwtcHVycG9zZSBhZGIgd3JhcHBlciBhbmQgZGVsaWJlcmF0ZWx5IGRvIG5vdCB0cnkgdG8gYmVjb21lIG9uZS5cbiAqXG4gKiBFdmVyeSBmdW5jdGlvbiBoZXJlIHNoZWxscyBvdXQsIHNvIHRoZSB3aG9sZSBtb2R1bGUgaXMgaW50ZWdyYXRpb24tdGltZSBjb2RlLlxuICogVGhhdCBpcyBhbHNvIHdoeSB0aGUgcGFyc2luZyBhbmQgZ2VvbWV0cnkgdGhlc2UgaGVscGVycyBkZXBlbmQgb24gbGl2ZSBpblxuICogdGhlaXIgb3duIG1vZHVsZXMgXHUyMDE0IHRoZSBzYW1lIHNwbGl0IGBhZGItZGV2aWNlLWxpc3RgIGFscmVhZHkgaGFzIGZyb20gdGhlXG4gKiB0cmFuc3BvcnQgZmFjdG9yeSwgc28gYSBzb3J0IHJ1bGUgY2FuIG5ldmVyIG1vdmUgYSB1bml0LXRlc3RlZCBmdW5jdGlvblxuICogaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jay5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChzaGVsbHMgb3V0IHRvIGEgcmVhbCBkZXZpY2UpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bkFkYkJpbmFyeX0gYW5kIHtAbGluayBydW5BZGJUZXh0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5BZGJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBwYXNzIGFmdGVyIGAtcyA8ZGV2aWNlSWQ+YCwgZS5nLiBgWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCAnMTAnLCAnMjAnXWAuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLCBhcyBgYWRiIGRldmljZXNgIGxpc3RzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gZ2l2ZSB0aGUgY2FsbCBiZWZvcmUga2lsbGluZyBpdCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBPbWl0dGVkIFx1MjAxNCB0aGUgZGVmYXVsdCBcdTIwMTQgdGhlIGNhbGwgd2FpdHMgaW5kZWZpbml0ZWx5LCB3aGljaCBpcyByaWdodCBmb3IgdGhlXG4gICAqIGNhcHR1cmUgaGVscGVyczogYSBzY3JlZW5jYXAgb2YgYSBiaWcgZnJhbWVidWZmZXIgaXMgc2xvdywgbm90IHN0dWNrLiBBXG4gICAqIGNhbGxlciB0aGF0IGlzICppZGVudGlmeWluZyogYSBkZXZpY2UgaXQgbWF5IG5vdCBvd24gcGFzc2VzIG9uZSwgYmVjYXVzZVxuICAgKiB0aGVyZSB0aGUgd2hvbGUgcG9pbnQgaXMgdG8gZ2l2ZSB1cCBvbiBhIHdlZGdlZCBndWVzdCByYXRoZXIgdGhhbiBoYW5nIHRoZVxuICAgKiBydW4gYmVoaW5kIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc2NyZWVuY2FwIG9mIGEgOTAweDE2MDAgZGV2aWNlIHJ1bnMgdG8gYWJvdXQgMTAwIEtCLCBidXQgYSB0YWJsZXQgQVZEJ3MgZnJhbWVidWZmZXIgaXMgc2V2ZXJhbCBNQiBhbmRcbiAqIHRoZSBkZWZhdWx0IDEgTWlCIGBtYXhCdWZmZXJgIGZhaWxzIHRoZSBjYWxsIHJhdGhlciB0aGFuIHJldHVybmluZyBhIHVzYWJsZSBpbWFnZS5cbiAqL1xuY29uc3QgT1VUUFVUX01BWF9CVUZGRVJfSU5fQllURVMgPSA2N18xMDhfODY0O1xuXG4vKipcbiAqIFJ1bnMgYGFkYiAtcyA8ZGV2aWNlSWQ+IDxjb21tYW5kQXJndW1lbnRzPmAgYW5kIHJldHVybnMgc3Rkb3V0ICoqdW5kZWNvZGVkKiouXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBhcmd1bWVudHMgdG8gcnVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmF3IHN0ZG91dCBieXRlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYFJ1bkFkYlBhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgYHJ1bkFkYkJpbmFyeWAgYW5kIGBydW5BZGJUZXh0YCwgc28gbm8gcGVyLW93bmVyIG5hbWUgY2FuIHNhdGlzZnkgYm90aC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BZGJCaW5hcnkocGFyYW1zOiBSdW5BZGJQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgY29tbWFuZEFyZ3VtZW50cyA9IFsnLXMnLCBwYXJhbXMuZGV2aWNlSWQsIC4uLnBhcmFtcy5jb21tYW5kQXJndW1lbnRzXTtcblxuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBjb21tYW5kQXJndW1lbnRzLCB7IGVuY29kaW5nOiAnYnVmZmVyJywgbWF4QnVmZmVyOiBPVVRQVVRfTUFYX0JVRkZFUl9JTl9CWVRFUywgdGltZW91dDogcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9LCAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiAke2NvbW1hbmRBcmd1bWVudHMuam9pbignICcpfSc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUnVucyBgYWRiIC1zIDxkZXZpY2VJZD4gPGNvbW1hbmRBcmd1bWVudHM+YCBhbmQgcmV0dXJucyBzdGRvdXQgYXMgdHJpbW1lZCB0ZXh0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gc3Rkb3V0LCB3aXRoIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYFJ1bkFkYlBhcmFtc2AgaXMgb25lIGJhZyBzaGFyZWQgYnkgYHJ1bkFkYkJpbmFyeWAgYW5kIGBydW5BZGJUZXh0YCwgc28gbm8gcGVyLW93bmVyIG5hbWUgY2FuIHNhdGlzZnkgYm90aC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BZGJUZXh0KHBhcmFtczogUnVuQWRiUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgcnVuQWRiQmluYXJ5KHBhcmFtcyk7XG4gIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoc3Rkb3V0KS50cmltKCk7XG59XG5cbi8qKlxuICogUnVucyBgYWRiIDxjb21tYW5kQXJndW1lbnRzPmAgd2l0aCBubyBkZXZpY2Ugc2VsZWN0ZWQuXG4gKlxuICogT25seSBgZGV2aWNlc2AgbmVlZHMgdGhpcyBcdTIwMTQgZXZlcnkgb3RoZXIgY2FsbCBpbiB0aGlzIGZhbWlseSBhZGRyZXNzZXMgb25lIGRldmljZS5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgdG8gcnVuLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBzdGRvdXQsIHdpdGggc3Vycm91bmRpbmcgd2hpdGVzcGFjZSByZW1vdmVkLlxuICogQHRocm93cyBFcnJvciBpZiBhZGIgY291bGQgbm90IGJlIHJ1biwgb3IgZXhpdGVkIG5vbi16ZXJvLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQWRiVGV4dFdpdGhvdXREZXZpY2UoY29tbWFuZEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBbLi4uY29tbWFuZEFyZ3VtZW50c10sIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIG1heEJ1ZmZlcjogT1VUUFVUX01BWF9CVUZGRVJfSU5fQllURVMgfSwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgJHtjb21tYW5kQXJndW1lbnRzLmpvaW4oJyAnKX0nOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQSxTQUFTLGdCQUFnQjtBQWdDekIsTUFBTSw2QkFBNkI7QUFVbkMsZUFBc0IsYUFBYSxRQUEyQztBQUM1RSxRQUFNLG1CQUFtQixDQUFDLE1BQU0sT0FBTyxVQUFVLEdBQUcsT0FBTyxnQkFBZ0I7QUFFM0UsU0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1QyxhQUFTLE9BQU8sa0JBQWtCLEVBQUUsVUFBVSxVQUFVLFdBQVcsNEJBQTRCLFNBQVMsT0FBTyxzQkFBc0IsR0FBRyxDQUFDLE9BQU8sV0FBVztBQUN6SixVQUFJLE9BQU87QUFDVCxlQUFPLElBQUksTUFBTSxzQkFBc0IsaUJBQWlCLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxPQUFPLGlDQUFpQyxDQUFDO0FBQ3RIO0FBQUEsTUFDRjtBQUVBLGNBQVEsTUFBTTtBQUFBLElBQ2hCLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQVVBLGVBQXNCLFdBQVcsUUFBdUM7QUFDdEUsUUFBTSxTQUFTLE1BQU0sYUFBYSxNQUFNO0FBQ3hDLFNBQU8sSUFBSSxZQUFZLEVBQUUsT0FBTyxNQUFNLEVBQUUsS0FBSztBQUMvQztBQVdBLGVBQXNCLHdCQUF3QixrQkFBc0Q7QUFDbEcsU0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1QyxhQUFTLE9BQU8sQ0FBQyxHQUFHLGdCQUFnQixHQUFHLEVBQUUsVUFBVSxTQUFTLFdBQVcsMkJBQTJCLEdBQUcsQ0FBQyxPQUFPLFdBQVc7QUFDdEgsVUFBSSxPQUFPO0FBQ1QsZUFBTyxJQUFJLE1BQU0sc0JBQXNCLGlCQUFpQixLQUFLLEdBQUcsQ0FBQyxNQUFNLE1BQU0sT0FBTyxpQ0FBaUMsQ0FBQztBQUN0SDtBQUFBLE1BQ0Y7QUFFQSxjQUFRLE9BQU8sS0FBSyxDQUFDO0FBQUEsSUFDdkIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The channels a run can ask *"which AVD is this device serving?"*, and the
5
+ * order to ask them in.
6
+ *
7
+ * **L47** made the adoption probe refuse rather than collide when a device did
8
+ * not answer. It asked that question over the emulator's **console** — a second
9
+ * TCP port, with its own auth token and its own ways of wedging, entirely
10
+ * separate from the `adbd` channel every other call in the run travels. So a
11
+ * single emulator whose console is wedged — routinely **another project's**,
12
+ * with the bulk runner sweeping several projects at once — took every Obsidian
13
+ * Android suite on the machine out of service:
14
+ *
15
+ * ```text
16
+ * [transport-factory:obsidian-android-appium] AVD probe: emulator-5570=no-answer.
17
+ * Error: AVD "obsidian_test": device emulator-5570 did not answer `adb -s emulator-5570 emu avd name` ...
18
+ * ```
19
+ *
20
+ * `adb devices` listed `emulator-5570` as `device` and adb itself was perfectly
21
+ * responsive throughout; only its console was gone. The refusal was right —
22
+ * launching a second copy of an AVD hits `FATAL | Running multiple emulators
23
+ * with the same AVD is an experimental feature` — but it was keyed on the one
24
+ * channel the run does **not** otherwise depend on.
25
+ *
26
+ * The AVD name is also a guest system property, readable over the same `adbd`
27
+ * channel the run needs anyway, so it cannot be wedged independently of the
28
+ * connection the run is about to use:
29
+ *
30
+ * ```text
31
+ * adb -s <device> shell getprop ro.boot.qemu.avd_name # modern images
32
+ * adb -s <device> shell getprop ro.kernel.qemu.avd_name # older images
33
+ * ```
34
+ *
35
+ * Hence this ordering: property first, console only as a fallback for an image
36
+ * that reports neither. The hard refusal stays for the genuinely-unknowable
37
+ * device — a silent one may well be the AVD's holder — it is simply reached far
38
+ * less often.
39
+ *
40
+ * **A dead channel is not asked twice.** When the `adb shell` call itself fails
41
+ * or times out, the second property key is skipped: it travels the same channel
42
+ * that has just proved unusable, and would only spend another full timeout to
43
+ * learn the same thing. An *answered* but empty property is the opposite — the
44
+ * channel is alive and the image simply does not carry that key — so the
45
+ * cheaper sibling key is worth asking. That distinction is what keeps a wedged
46
+ * device's worst case at two timeouts per attempt rather than three.
47
+ *
48
+ * Pure and unit-tested; the `adb` round-trips live in `transport-factory` and
49
+ * `resolve-emulator-device-id`, which are integration-time code.
50
+ */
51
+ /**
52
+ * One way of asking a device which AVD it was started from.
53
+ *
54
+ * `getprop-boot` and `getprop-kernel` travel `adbd` — the channel the run
55
+ * depends on anyway; `console` is the emulator's own TCP console, which can
56
+ * wedge on its own.
57
+ */
58
+ export type AvdNameChannel = 'console' | 'getprop-boot' | 'getprop-kernel';
59
+ /**
60
+ * What one channel answered.
61
+ *
62
+ * The two fields are deliberately independent: a channel can respond and report
63
+ * **nothing** (an image without that property), which is a fact about the
64
+ * image, while a channel that did not respond is a fact about the channel.
65
+ * Collapsing them is the defect **L47** fixed one level up.
66
+ */
67
+ export interface AvdNameChannelAnswer {
68
+ /**
69
+ Whether the command itself completed — regardless of what it reported.
70
+ */
71
+ readonly didRespond: boolean;
72
+ /**
73
+ The AVD name it reported, or `''` when it reported none.
74
+ */
75
+ readonly reportedAvdName: string;
76
+ }
77
+ /**
78
+ * Parameters for {@link buildAvdNameChannelArguments}.
79
+ */
80
+ export interface BuildAvdNameChannelArgumentsParams {
81
+ /**
82
+ The channel to ask.
83
+ */
84
+ readonly channel: AvdNameChannel;
85
+ /**
86
+ The device to address, or a placeholder such as `<device>` when building a message about several.
87
+ */
88
+ readonly deviceId: string;
89
+ }
90
+ /**
91
+ * Parameters for {@link resolveNextAvdNameChannel}.
92
+ */
93
+ export interface ResolveNextAvdNameChannelParams {
94
+ /**
95
+ The channel that was just asked.
96
+ */
97
+ readonly channel: AvdNameChannel;
98
+ /**
99
+ Whether that channel's command completed at all.
100
+ */
101
+ readonly didChannelRespond: boolean;
102
+ }
103
+ /**
104
+ * The channel a probe starts with: the guest property, over `adbd`.
105
+ */
106
+ export declare const FIRST_AVD_NAME_CHANNEL: AvdNameChannel;
107
+ /**
108
+ * Builds the `adb` arguments that ask one channel for the AVD name.
109
+ *
110
+ * @param params - The channel to ask and the device to address.
111
+ * @returns The arguments to pass to `adb`, starting with `-s <deviceId>`.
112
+ */
113
+ export declare function buildAvdNameChannelArguments(params: BuildAvdNameChannelArgumentsParams): string[];
114
+ /**
115
+ * Builds the `adb` arguments that follow `-s <deviceId>`.
116
+ *
117
+ * Split from {@link buildAvdNameChannelArguments} because the two callers
118
+ * address their device differently: `transport-factory` shells out to `adb`
119
+ * itself, while `resolve-emulator-device-id` goes through `adb.ts`, which
120
+ * prepends `-s <deviceId>` of its own.
121
+ *
122
+ * @param channel - The channel to ask.
123
+ * @returns The command arguments, without any device selection.
124
+ */
125
+ export declare function buildAvdNameChannelCommand(channel: AvdNameChannel): string[];
126
+ /**
127
+ * Renders `adb` arguments as the command line a reader can paste.
128
+ *
129
+ * Built from the arguments the run actually passes rather than written out a
130
+ * second time, so a message can never quote a command the code does not run.
131
+ *
132
+ * @param commandArguments - The arguments passed to `adb`.
133
+ * @returns The full command line.
134
+ */
135
+ export declare function describeAdbCommand(commandArguments: readonly string[]): string;
136
+ /**
137
+ * Reads the AVD name out of what a channel printed.
138
+ *
139
+ * Both channels answer on the first line — `getprop` prints the value (an empty
140
+ * line when the property is unset), the console prints the name and then `OK`.
141
+ *
142
+ * @param stdout - What the command printed.
143
+ * @returns The reported AVD name, or `''` when it reported none.
144
+ */
145
+ export declare function parseAvdNameAnswer(stdout: string): string;
146
+ /**
147
+ * Picks the next channel to ask after one failed to identify the device.
148
+ *
149
+ * @param params - The channel just asked, and whether its command completed.
150
+ * @returns The next channel, or `undefined` once every channel has been asked.
151
+ */
152
+ export declare function resolveNextAvdNameChannel(params: ResolveNextAvdNameChannelParams): AvdNameChannel | undefined;
@@ -0,0 +1,45 @@
1
+ import { assertNever } from "./type-guards.mjs";
2
+ const FIRST_AVD_NAME_CHANNEL = "getprop-boot";
3
+ const AVD_NAME_PROPERTY_BY_CHANNEL = {
4
+ "getprop-boot": "ro.boot.qemu.avd_name",
5
+ "getprop-kernel": "ro.kernel.qemu.avd_name"
6
+ };
7
+ function buildAvdNameChannelArguments(params) {
8
+ return ["-s", params.deviceId, ...buildAvdNameChannelCommand(params.channel)];
9
+ }
10
+ function buildAvdNameChannelCommand(channel) {
11
+ return channel === "console" ? ["emu", "avd", "name"] : ["shell", "getprop", AVD_NAME_PROPERTY_BY_CHANNEL[channel]];
12
+ }
13
+ function describeAdbCommand(commandArguments) {
14
+ return `adb ${commandArguments.join(" ")}`;
15
+ }
16
+ function parseAvdNameAnswer(stdout) {
17
+ const lineBreakIndex = stdout.indexOf("\n");
18
+ const firstLine = lineBreakIndex === -1 ? stdout : stdout.slice(0, lineBreakIndex);
19
+ return firstLine.trim();
20
+ }
21
+ function resolveNextAvdNameChannel(params) {
22
+ switch (params.channel) {
23
+ case "console": {
24
+ return void 0;
25
+ }
26
+ case "getprop-boot": {
27
+ return params.didChannelRespond ? "getprop-kernel" : "console";
28
+ }
29
+ case "getprop-kernel": {
30
+ return "console";
31
+ }
32
+ default: {
33
+ return assertNever(params.channel);
34
+ }
35
+ }
36
+ }
37
+ export {
38
+ FIRST_AVD_NAME_CHANNEL,
39
+ buildAvdNameChannelArguments,
40
+ buildAvdNameChannelCommand,
41
+ describeAdbCommand,
42
+ parseAvdNameAnswer,
43
+ resolveNextAvdNameChannel
44
+ };
45
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1uYW1lLWNoYW5uZWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgY2hhbm5lbHMgYSBydW4gY2FuIGFzayAqXCJ3aGljaCBBVkQgaXMgdGhpcyBkZXZpY2Ugc2VydmluZz9cIiosIGFuZCB0aGVcbiAqIG9yZGVyIHRvIGFzayB0aGVtIGluLlxuICpcbiAqICoqTDQ3KiogbWFkZSB0aGUgYWRvcHRpb24gcHJvYmUgcmVmdXNlIHJhdGhlciB0aGFuIGNvbGxpZGUgd2hlbiBhIGRldmljZSBkaWRcbiAqIG5vdCBhbnN3ZXIuIEl0IGFza2VkIHRoYXQgcXVlc3Rpb24gb3ZlciB0aGUgZW11bGF0b3IncyAqKmNvbnNvbGUqKiBcdTIwMTQgYSBzZWNvbmRcbiAqIFRDUCBwb3J0LCB3aXRoIGl0cyBvd24gYXV0aCB0b2tlbiBhbmQgaXRzIG93biB3YXlzIG9mIHdlZGdpbmcsIGVudGlyZWx5XG4gKiBzZXBhcmF0ZSBmcm9tIHRoZSBgYWRiZGAgY2hhbm5lbCBldmVyeSBvdGhlciBjYWxsIGluIHRoZSBydW4gdHJhdmVscy4gU28gYVxuICogc2luZ2xlIGVtdWxhdG9yIHdob3NlIGNvbnNvbGUgaXMgd2VkZ2VkIFx1MjAxNCByb3V0aW5lbHkgKiphbm90aGVyIHByb2plY3QncyoqLFxuICogd2l0aCB0aGUgYnVsayBydW5uZXIgc3dlZXBpbmcgc2V2ZXJhbCBwcm9qZWN0cyBhdCBvbmNlIFx1MjAxNCB0b29rIGV2ZXJ5IE9ic2lkaWFuXG4gKiBBbmRyb2lkIHN1aXRlIG9uIHRoZSBtYWNoaW5lIG91dCBvZiBzZXJ2aWNlOlxuICpcbiAqIGBgYHRleHRcbiAqIFt0cmFuc3BvcnQtZmFjdG9yeTpvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bV0gQVZEIHByb2JlOiBlbXVsYXRvci01NTcwPW5vLWFuc3dlci5cbiAqIEVycm9yOiBBVkQgXCJvYnNpZGlhbl90ZXN0XCI6IGRldmljZSBlbXVsYXRvci01NTcwIGRpZCBub3QgYW5zd2VyIGBhZGIgLXMgZW11bGF0b3ItNTU3MCBlbXUgYXZkIG5hbWVgIC4uLlxuICogYGBgXG4gKlxuICogYGFkYiBkZXZpY2VzYCBsaXN0ZWQgYGVtdWxhdG9yLTU1NzBgIGFzIGBkZXZpY2VgIGFuZCBhZGIgaXRzZWxmIHdhcyBwZXJmZWN0bHlcbiAqIHJlc3BvbnNpdmUgdGhyb3VnaG91dDsgb25seSBpdHMgY29uc29sZSB3YXMgZ29uZS4gVGhlIHJlZnVzYWwgd2FzIHJpZ2h0IFx1MjAxNFxuICogbGF1bmNoaW5nIGEgc2Vjb25kIGNvcHkgb2YgYW4gQVZEIGhpdHMgYEZBVEFMIHwgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnNcbiAqIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCBcdTIwMTQgYnV0IGl0IHdhcyBrZXllZCBvbiB0aGUgb25lXG4gKiBjaGFubmVsIHRoZSBydW4gZG9lcyAqKm5vdCoqIG90aGVyd2lzZSBkZXBlbmQgb24uXG4gKlxuICogVGhlIEFWRCBuYW1lIGlzIGFsc28gYSBndWVzdCBzeXN0ZW0gcHJvcGVydHksIHJlYWRhYmxlIG92ZXIgdGhlIHNhbWUgYGFkYmRgXG4gKiBjaGFubmVsIHRoZSBydW4gbmVlZHMgYW55d2F5LCBzbyBpdCBjYW5ub3QgYmUgd2VkZ2VkIGluZGVwZW5kZW50bHkgb2YgdGhlXG4gKiBjb25uZWN0aW9uIHRoZSBydW4gaXMgYWJvdXQgdG8gdXNlOlxuICpcbiAqIGBgYHRleHRcbiAqIGFkYiAtcyA8ZGV2aWNlPiBzaGVsbCBnZXRwcm9wIHJvLmJvb3QucWVtdS5hdmRfbmFtZSAgICAgIyBtb2Rlcm4gaW1hZ2VzXG4gKiBhZGIgLXMgPGRldmljZT4gc2hlbGwgZ2V0cHJvcCByby5rZXJuZWwucWVtdS5hdmRfbmFtZSAgICMgb2xkZXIgaW1hZ2VzXG4gKiBgYGBcbiAqXG4gKiBIZW5jZSB0aGlzIG9yZGVyaW5nOiBwcm9wZXJ0eSBmaXJzdCwgY29uc29sZSBvbmx5IGFzIGEgZmFsbGJhY2sgZm9yIGFuIGltYWdlXG4gKiB0aGF0IHJlcG9ydHMgbmVpdGhlci4gVGhlIGhhcmQgcmVmdXNhbCBzdGF5cyBmb3IgdGhlIGdlbnVpbmVseS11bmtub3dhYmxlXG4gKiBkZXZpY2UgXHUyMDE0IGEgc2lsZW50IG9uZSBtYXkgd2VsbCBiZSB0aGUgQVZEJ3MgaG9sZGVyIFx1MjAxNCBpdCBpcyBzaW1wbHkgcmVhY2hlZCBmYXJcbiAqIGxlc3Mgb2Z0ZW4uXG4gKlxuICogKipBIGRlYWQgY2hhbm5lbCBpcyBub3QgYXNrZWQgdHdpY2UuKiogV2hlbiB0aGUgYGFkYiBzaGVsbGAgY2FsbCBpdHNlbGYgZmFpbHNcbiAqIG9yIHRpbWVzIG91dCwgdGhlIHNlY29uZCBwcm9wZXJ0eSBrZXkgaXMgc2tpcHBlZDogaXQgdHJhdmVscyB0aGUgc2FtZSBjaGFubmVsXG4gKiB0aGF0IGhhcyBqdXN0IHByb3ZlZCB1bnVzYWJsZSwgYW5kIHdvdWxkIG9ubHkgc3BlbmQgYW5vdGhlciBmdWxsIHRpbWVvdXQgdG9cbiAqIGxlYXJuIHRoZSBzYW1lIHRoaW5nLiBBbiAqYW5zd2VyZWQqIGJ1dCBlbXB0eSBwcm9wZXJ0eSBpcyB0aGUgb3Bwb3NpdGUgXHUyMDE0IHRoZVxuICogY2hhbm5lbCBpcyBhbGl2ZSBhbmQgdGhlIGltYWdlIHNpbXBseSBkb2VzIG5vdCBjYXJyeSB0aGF0IGtleSBcdTIwMTQgc28gdGhlXG4gKiBjaGVhcGVyIHNpYmxpbmcga2V5IGlzIHdvcnRoIGFza2luZy4gVGhhdCBkaXN0aW5jdGlvbiBpcyB3aGF0IGtlZXBzIGEgd2VkZ2VkXG4gKiBkZXZpY2UncyB3b3JzdCBjYXNlIGF0IHR3byB0aW1lb3V0cyBwZXIgYXR0ZW1wdCByYXRoZXIgdGhhbiB0aHJlZS5cbiAqXG4gKiBQdXJlIGFuZCB1bml0LXRlc3RlZDsgdGhlIGBhZGJgIHJvdW5kLXRyaXBzIGxpdmUgaW4gYHRyYW5zcG9ydC1mYWN0b3J5YCBhbmRcbiAqIGByZXNvbHZlLWVtdWxhdG9yLWRldmljZS1pZGAsIHdoaWNoIGFyZSBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbi8qKlxuICogT25lIHdheSBvZiBhc2tpbmcgYSBkZXZpY2Ugd2hpY2ggQVZEIGl0IHdhcyBzdGFydGVkIGZyb20uXG4gKlxuICogYGdldHByb3AtYm9vdGAgYW5kIGBnZXRwcm9wLWtlcm5lbGAgdHJhdmVsIGBhZGJkYCBcdTIwMTQgdGhlIGNoYW5uZWwgdGhlIHJ1blxuICogZGVwZW5kcyBvbiBhbnl3YXk7IGBjb25zb2xlYCBpcyB0aGUgZW11bGF0b3IncyBvd24gVENQIGNvbnNvbGUsIHdoaWNoIGNhblxuICogd2VkZ2Ugb24gaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgQXZkTmFtZUNoYW5uZWwgPSAnY29uc29sZScgfCAnZ2V0cHJvcC1ib290JyB8ICdnZXRwcm9wLWtlcm5lbCc7XG5cbi8qKlxuICogV2hhdCBvbmUgY2hhbm5lbCBhbnN3ZXJlZC5cbiAqXG4gKiBUaGUgdHdvIGZpZWxkcyBhcmUgZGVsaWJlcmF0ZWx5IGluZGVwZW5kZW50OiBhIGNoYW5uZWwgY2FuIHJlc3BvbmQgYW5kIHJlcG9ydFxuICogKipub3RoaW5nKiogKGFuIGltYWdlIHdpdGhvdXQgdGhhdCBwcm9wZXJ0eSksIHdoaWNoIGlzIGEgZmFjdCBhYm91dCB0aGVcbiAqIGltYWdlLCB3aGlsZSBhIGNoYW5uZWwgdGhhdCBkaWQgbm90IHJlc3BvbmQgaXMgYSBmYWN0IGFib3V0IHRoZSBjaGFubmVsLlxuICogQ29sbGFwc2luZyB0aGVtIGlzIHRoZSBkZWZlY3QgKipMNDcqKiBmaXhlZCBvbmUgbGV2ZWwgdXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkTmFtZUNoYW5uZWxBbnN3ZXIge1xuICAvKipcbiAgV2hldGhlciB0aGUgY29tbWFuZCBpdHNlbGYgY29tcGxldGVkIFx1MjAxNCByZWdhcmRsZXNzIG9mIHdoYXQgaXQgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSBkaWRSZXNwb25kOiBib29sZWFuO1xuXG4gIC8qKlxuICBUaGUgQVZEIG5hbWUgaXQgcmVwb3J0ZWQsIG9yIGAnJ2Agd2hlbiBpdCByZXBvcnRlZCBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0ZWRBdmROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHNQYXJhbXMge1xuICAvKipcbiAgVGhlIGNoYW5uZWwgdG8gYXNrLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbm5lbDogQXZkTmFtZUNoYW5uZWw7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2UgdG8gYWRkcmVzcywgb3IgYSBwbGFjZWhvbGRlciBzdWNoIGFzIGA8ZGV2aWNlPmAgd2hlbiBidWlsZGluZyBhIG1lc3NhZ2UgYWJvdXQgc2V2ZXJhbC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWxQYXJhbXMge1xuICAvKipcbiAgVGhlIGNoYW5uZWwgdGhhdCB3YXMganVzdCBhc2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWw6IEF2ZE5hbWVDaGFubmVsO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoYXQgY2hhbm5lbCdzIGNvbW1hbmQgY29tcGxldGVkIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IGRpZENoYW5uZWxSZXNwb25kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBjaGFubmVsIGEgcHJvYmUgc3RhcnRzIHdpdGg6IHRoZSBndWVzdCBwcm9wZXJ0eSwgb3ZlciBgYWRiZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBGSVJTVF9BVkRfTkFNRV9DSEFOTkVMOiBBdmROYW1lQ2hhbm5lbCA9ICdnZXRwcm9wLWJvb3QnO1xuXG4vKipcbiAqIFRoZSBzeXN0ZW0gcHJvcGVydHkgZWFjaCBgZ2V0cHJvcGAgY2hhbm5lbCByZWFkcy5cbiAqXG4gKiBgcm8uYm9vdC5xZW11LmF2ZF9uYW1lYCBpcyB3aGF0IGN1cnJlbnQgc3lzdGVtIGltYWdlcyBjYXJyeTtcbiAqIGByby5rZXJuZWwucWVtdS5hdmRfbmFtZWAgaXMgdGhlIG9sZGVyIHNwZWxsaW5nLCBzdGlsbCBwcmVzZW50IG9uIGltYWdlcyB0aGVcbiAqIGhhcm5lc3Mgc3VwcG9ydHMuXG4gKi9cbmNvbnN0IEFWRF9OQU1FX1BST1BFUlRZX0JZX0NIQU5ORUwgPSB7XG4gICdnZXRwcm9wLWJvb3QnOiAncm8uYm9vdC5xZW11LmF2ZF9uYW1lJyxcbiAgJ2dldHByb3Ata2VybmVsJzogJ3JvLmtlcm5lbC5xZW11LmF2ZF9uYW1lJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGBhZGJgIGFyZ3VtZW50cyB0aGF0IGFzayBvbmUgY2hhbm5lbCBmb3IgdGhlIEFWRCBuYW1lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY2hhbm5lbCB0byBhc2sgYW5kIHRoZSBkZXZpY2UgdG8gYWRkcmVzcy5cbiAqIEByZXR1cm5zIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byBgYWRiYCwgc3RhcnRpbmcgd2l0aCBgLXMgPGRldmljZUlkPmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZE5hbWVDaGFubmVsQXJndW1lbnRzKHBhcmFtczogQnVpbGRBdmROYW1lQ2hhbm5lbEFyZ3VtZW50c1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnLXMnLCBwYXJhbXMuZGV2aWNlSWQsIC4uLmJ1aWxkQXZkTmFtZUNoYW5uZWxDb21tYW5kKHBhcmFtcy5jaGFubmVsKV07XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBgYWRiYCBhcmd1bWVudHMgdGhhdCBmb2xsb3cgYC1zIDxkZXZpY2VJZD5gLlxuICpcbiAqIFNwbGl0IGZyb20ge0BsaW5rIGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHN9IGJlY2F1c2UgdGhlIHR3byBjYWxsZXJzXG4gKiBhZGRyZXNzIHRoZWlyIGRldmljZSBkaWZmZXJlbnRseTogYHRyYW5zcG9ydC1mYWN0b3J5YCBzaGVsbHMgb3V0IHRvIGBhZGJgXG4gKiBpdHNlbGYsIHdoaWxlIGByZXNvbHZlLWVtdWxhdG9yLWRldmljZS1pZGAgZ29lcyB0aHJvdWdoIGBhZGIudHNgLCB3aGljaFxuICogcHJlcGVuZHMgYC1zIDxkZXZpY2VJZD5gIG9mIGl0cyBvd24uXG4gKlxuICogQHBhcmFtIGNoYW5uZWwgLSBUaGUgY2hhbm5lbCB0byBhc2suXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBhcmd1bWVudHMsIHdpdGhvdXQgYW55IGRldmljZSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZE5hbWVDaGFubmVsQ29tbWFuZChjaGFubmVsOiBBdmROYW1lQ2hhbm5lbCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNoYW5uZWwgPT09ICdjb25zb2xlJyA/IFsnZW11JywgJ2F2ZCcsICduYW1lJ10gOiBbJ3NoZWxsJywgJ2dldHByb3AnLCBBVkRfTkFNRV9QUk9QRVJUWV9CWV9DSEFOTkVMW2NoYW5uZWxdXTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGBhZGJgIGFyZ3VtZW50cyBhcyB0aGUgY29tbWFuZCBsaW5lIGEgcmVhZGVyIGNhbiBwYXN0ZS5cbiAqXG4gKiBCdWlsdCBmcm9tIHRoZSBhcmd1bWVudHMgdGhlIHJ1biBhY3R1YWxseSBwYXNzZXMgcmF0aGVyIHRoYW4gd3JpdHRlbiBvdXQgYVxuICogc2Vjb25kIHRpbWUsIHNvIGEgbWVzc2FnZSBjYW4gbmV2ZXIgcXVvdGUgYSBjb21tYW5kIHRoZSBjb2RlIGRvZXMgbm90IHJ1bi5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGBhZGJgLlxuICogQHJldHVybnMgVGhlIGZ1bGwgY29tbWFuZCBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVBZGJDb21tYW5kKGNvbW1hbmRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBhZGIgJHtjb21tYW5kQXJndW1lbnRzLmpvaW4oJyAnKX1gO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBBVkQgbmFtZSBvdXQgb2Ygd2hhdCBhIGNoYW5uZWwgcHJpbnRlZC5cbiAqXG4gKiBCb3RoIGNoYW5uZWxzIGFuc3dlciBvbiB0aGUgZmlyc3QgbGluZSBcdTIwMTQgYGdldHByb3BgIHByaW50cyB0aGUgdmFsdWUgKGFuIGVtcHR5XG4gKiBsaW5lIHdoZW4gdGhlIHByb3BlcnR5IGlzIHVuc2V0KSwgdGhlIGNvbnNvbGUgcHJpbnRzIHRoZSBuYW1lIGFuZCB0aGVuIGBPS2AuXG4gKlxuICogQHBhcmFtIHN0ZG91dCAtIFdoYXQgdGhlIGNvbW1hbmQgcHJpbnRlZC5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnRlZCBBVkQgbmFtZSwgb3IgYCcnYCB3aGVuIGl0IHJlcG9ydGVkIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF2ZE5hbWVBbnN3ZXIoc3Rkb3V0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvKlxuICAgKiBTbGljZWQgcmF0aGVyIHRoYW4gYW4gaW5kZXhlZCByZWFkIHdpdGggYSBgPz8gJydgIGZhbGxiYWNrOiBubyBpbnB1dCBjYW5cbiAgICogcmVhY2ggdGhhdCBmYWxsYmFjaywgYW5kIHRoZSBwZXItZmlsZSBjb3ZlcmFnZSBnYXRlIHRoZW4gcmVwb3J0cyBpdCBhcyBhblxuICAgKiB1bmNvdmVyZWQgYnJhbmNoIGZvciB0aGUgcmVzdCBvZiB0aGUgZmlsZSdzIGxpZmUuXG4gICAqL1xuICBjb25zdCBsaW5lQnJlYWtJbmRleCA9IHN0ZG91dC5pbmRleE9mKCdcXG4nKTtcbiAgY29uc3QgZmlyc3RMaW5lID0gbGluZUJyZWFrSW5kZXggPT09IC0xID8gc3Rkb3V0IDogc3Rkb3V0LnNsaWNlKDAsIGxpbmVCcmVha0luZGV4KTtcblxuICByZXR1cm4gZmlyc3RMaW5lLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgbmV4dCBjaGFubmVsIHRvIGFzayBhZnRlciBvbmUgZmFpbGVkIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjaGFubmVsIGp1c3QgYXNrZWQsIGFuZCB3aGV0aGVyIGl0cyBjb21tYW5kIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIFRoZSBuZXh0IGNoYW5uZWwsIG9yIGB1bmRlZmluZWRgIG9uY2UgZXZlcnkgY2hhbm5lbCBoYXMgYmVlbiBhc2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWwocGFyYW1zOiBSZXNvbHZlTmV4dEF2ZE5hbWVDaGFubmVsUGFyYW1zKTogQXZkTmFtZUNoYW5uZWwgfCB1bmRlZmluZWQge1xuICBzd2l0Y2ggKHBhcmFtcy5jaGFubmVsKSB7XG4gICAgY2FzZSAnY29uc29sZSc6IHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhc2UgJ2dldHByb3AtYm9vdCc6IHtcbiAgICAgIC8qXG4gICAgICAgKiBBIGBnZXRwcm9wYCB0aGF0IG5ldmVyIGNhbWUgYmFjayBzYXlzIHRoZSBgYWRiZGAgY2hhbm5lbCBpcyB1bnVzYWJsZSxcbiAgICAgICAqIHNvIHRoZSBzaWJsaW5nIGtleSBcdTIwMTQgd2hpY2ggdHJhdmVscyB0aGF0IHNhbWUgY2hhbm5lbCBcdTIwMTQgd291bGQgb25seSBzcGVuZFxuICAgICAgICogYW5vdGhlciBmdWxsIHRpbWVvdXQuIEEgY2hhbm5lbCB0aGF0IGFuc3dlcmVkIG5vdGhpbmcgc2F5cyBvbmx5IHRoYXRcbiAgICAgICAqIHRoaXMgaW1hZ2UgZG9lcyBub3QgY2FycnkgdGhhdCBrZXksIHdoaWNoIHRoZSBzaWJsaW5nIG1heSB3ZWxsIGNhcnJ5LlxuICAgICAgICovXG4gICAgICByZXR1cm4gcGFyYW1zLmRpZENoYW5uZWxSZXNwb25kID8gJ2dldHByb3Ata2VybmVsJyA6ICdjb25zb2xlJztcbiAgICB9XG4gICAgY2FzZSAnZ2V0cHJvcC1rZXJuZWwnOiB7XG4gICAgICByZXR1cm4gJ2NvbnNvbGUnO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIocGFyYW1zLmNoYW5uZWwpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBbURBLFNBQVMsbUJBQW1CO0FBZ0VyQixNQUFNLHlCQUF5QztBQVN0RCxNQUFNLCtCQUErQjtBQUFBLEVBQ25DLGdCQUFnQjtBQUFBLEVBQ2hCLGtCQUFrQjtBQUNwQjtBQVFPLFNBQVMsNkJBQTZCLFFBQXNEO0FBQ2pHLFNBQU8sQ0FBQyxNQUFNLE9BQU8sVUFBVSxHQUFHLDJCQUEyQixPQUFPLE9BQU8sQ0FBQztBQUM5RTtBQWFPLFNBQVMsMkJBQTJCLFNBQW1DO0FBQzVFLFNBQU8sWUFBWSxZQUFZLENBQUMsT0FBTyxPQUFPLE1BQU0sSUFBSSxDQUFDLFNBQVMsV0FBVyw2QkFBNkIsT0FBTyxDQUFDO0FBQ3BIO0FBV08sU0FBUyxtQkFBbUIsa0JBQTZDO0FBQzlFLFNBQU8sT0FBTyxpQkFBaUIsS0FBSyxHQUFHLENBQUM7QUFDMUM7QUFXTyxTQUFTLG1CQUFtQixRQUF3QjtBQU16RCxRQUFNLGlCQUFpQixPQUFPLFFBQVEsSUFBSTtBQUMxQyxRQUFNLFlBQVksbUJBQW1CLEtBQUssU0FBUyxPQUFPLE1BQU0sR0FBRyxjQUFjO0FBRWpGLFNBQU8sVUFBVSxLQUFLO0FBQ3hCO0FBUU8sU0FBUywwQkFBMEIsUUFBcUU7QUFDN0csVUFBUSxPQUFPLFNBQVM7QUFBQSxJQUN0QixLQUFLLFdBQVc7QUFDZCxhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxnQkFBZ0I7QUFPbkIsYUFBTyxPQUFPLG9CQUFvQixtQkFBbUI7QUFBQSxJQUN2RDtBQUFBLElBQ0EsS0FBSyxrQkFBa0I7QUFDckIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLFlBQVksT0FBTyxPQUFPO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -26,6 +26,13 @@
26
26
  * to answer it — a wedged emulator times out every `adb` call — which is the
27
27
  * condition under which a colliding launch does the most damage.
28
28
  *
29
+ * **What the probe ASKS moved since; what it decides did not.** The question
30
+ * now travels the guest property over `adbd` first and the emulator console only
31
+ * as a fallback (`avd-name-channel.ts`), because keying a machine-wide refusal
32
+ * on the console alone let one wedged emulator — usually another project's —
33
+ * stop every Android run on the host. The four outcomes and the three verdicts
34
+ * here are unchanged: silence is still not a skip, it is simply far rarer.
35
+ *
29
36
  * Kept separate from the integration-only `transport-factory` (excluded from
30
37
  * unit tests) so the classification stays unit-testable — the factory itself
31
38
  * shells out to `adb`.
@@ -1,3 +1,8 @@
1
+ import {
2
+ buildAvdNameChannelArguments,
3
+ describeAdbCommand,
4
+ FIRST_AVD_NAME_CHANNEL
5
+ } from "./avd-name-channel.mjs";
1
6
  import { assertNever } from "./type-guards.mjs";
2
7
  const EMULATOR_DEVICE_ID_PATTERN = /^emulator-\d+$/;
3
8
  function buildAvdProbeSummary(results) {
@@ -7,10 +12,16 @@ function buildUnreadableDevicesMessage(params) {
7
12
  const deviceList = params.unreadableDeviceIds.join(", ");
8
13
  const isSingle = params.unreadableDeviceIds.length === 1;
9
14
  const subject = isSingle ? `device ${deviceList}` : `devices ${deviceList}`;
10
- const command = isSingle ? `adb -s ${deviceList} emu avd name` : "adb -s <device> emu avd name";
15
+ const deviceLabel = isSingle ? deviceList : "<device>";
16
+ const propertyCommand = describeAdbCommand(buildAvdNameChannelArguments({ channel: FIRST_AVD_NAME_CHANNEL, deviceId: deviceLabel }));
17
+ const consoleCommand = describeAdbCommand(buildAvdNameChannelArguments({ channel: "console", deviceId: deviceLabel }));
11
18
  const holder = isSingle ? "it is" : "one of them is";
12
- const remedy = isSingle ? "Kill the unresponsive device" : "Kill the unresponsive devices";
13
- return `AVD "${params.avdName}": ${subject} did not answer \`${command}\` within ${String(params.probeTimeoutInMilliseconds)}ms (retried once), so this run cannot tell whether ${holder} already serving that AVD. Starting an emulator anyway would collide (\`FATAL | Running multiple emulators with the same AVD is an experimental feature\`), which the emulator reports only to its own stdout. ${remedy}, or run \`adb kill-server\`, then retry.`;
19
+ const identified = isSingle ? "identified itself" : "identified themselves";
20
+ const owner = isSingle ? "A device this run cannot read is most likely ANOTHER run's" : "Devices this run cannot read are most likely OTHER runs'";
21
+ const killing = isSingle ? "killing it" : "killing them";
22
+ const ownership = isSingle ? "the device is yours" : "the devices are yours";
23
+ const otherRun = isSingle ? "that run" : "those runs";
24
+ return `AVD "${params.avdName}": ${subject} ${identified} over neither \`${propertyCommand}\` (the guest property, over adbd) nor \`${consoleCommand}\` (the emulator's own console) within ${String(params.probeTimeoutInMilliseconds)}ms each (retried once), so this run cannot tell whether ${holder} already serving that AVD. Starting an emulator anyway would collide (\`FATAL | Running multiple emulators with the same AVD is an experimental feature\`), which the emulator reports only to its own stdout. ${owner}: ${killing}, or running \`adb kill-server\`, destroys work this run cannot see, so do that only once you know ${ownership}. Otherwise wait for ${otherRun} to finish, and retry once \`adb devices\` no longer lists it.`;
14
25
  }
15
26
  function checkIsEmulatorDeviceId(deviceId) {
16
27
  return EMULATOR_DEVICE_ID_PATTERN.test(deviceId);
@@ -53,4 +64,4 @@ export {
53
64
  classifyAvdProbe,
54
65
  resolveAvdProbeVerdict
55
66
  };
56
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1wcm9iZS12ZXJkaWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgQVZEIGFkb3B0aW9uIHByb2JlIFx1MjAxNCBkZWNpZGluZywgZnJvbSB3aGF0IGVhY2hcbiAqIGNvbm5lY3RlZCBkZXZpY2UgYW5zd2VyZWQsIHdoZXRoZXIgdGhpcyBydW4gbWF5IHJldXNlIG9uZSwgbXVzdCBzdGFydCBpdHNcbiAqIG93biBlbXVsYXRvciwgb3IgY2Fubm90IHNhZmVseSBkbyBlaXRoZXIuXG4gKlxuICogVGhlIHByb2JlIChgYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZWApIHVzZWQgdG8gZGlzY2FyZCBpdHMgZXJyb3IgYW5kXG4gKiByZXNvbHZlIGAnJ2AsIHNvIGEgY2FsbCB0aGF0ICoqbmV2ZXIgYW5zd2VyZWQqKiB3YXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAqIHRoYXQgYW5zd2VyZWQgKlwiYSBkaWZmZXJlbnQgQVZEXCIqLiBCb3RoIGZlbGwgdGhyb3VnaCB0byBcInN0YXJ0IGEgbmV3XG4gKiBlbXVsYXRvclwiLCB3aGljaCBjb2xsaWRlcyB3aXRoIHRoZSBlbXVsYXRvciBhbHJlYWR5IHNlcnZpbmcgdGhhdCBBVkQ6XG4gKlxuICogYGBgdGV4dFxuICogMTQ6Mjc6NTIuMTE0ICBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCJvYnNpZGlhbl90ZXN0XCIuLi4gKGNvbm5lY3RlZDogW2VtdWxhdG9yLTU1NTRdKVxuICogMTQ6Mjc6NTcuMTcwICBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uXG4gKiBgYGBcbiAqXG4gKiA1LjA1NnMgYXBhcnQgXHUyMDE0IGV4YWN0bHkgdGhlIHByb2JlJ3Mgb3duIHRpbWVvdXQuIFRoZSBsYXVuY2ggdGhhdCBmb2xsb3dlZCBoaXRcbiAqIGBGQVRBTCB8IFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbFxuICogZmVhdHVyZWAsIHdoaWNoIHRoZSBlbXVsYXRvciB3cml0ZXMgdG8gaXRzIG93biBzdGRvdXQuICoqQSBwcm9iZSB0aGF0IG5ldmVyXG4gKiBhbnN3ZXJlZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYW5zd2VyIGlzIG5vKiogXHUyMDE0IHRoZSBzYW1lIGRpc3RpbmN0aW9uXG4gKiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3cyBiZXR3ZWVuIGBvZmZsaW5lYCBhbmQgYWJzZW50LCBhbmQgdGhlIHNhbWUgb25lXG4gKiB0aGUgY29ubmVjdGl2aXR5IHByb2JlIGRyYXdzIGJldHdlZW4gYSBmYWlsZWQgZHVtcCBhbmQgYSBtaXNzaW5nIG5ldHdvcmsuXG4gKlxuICogV29yc2UsIHRoZSBwcm9iZSBpcyBhc2tlZCBpdHMgcXVlc3Rpb24gcHJlY2lzZWx5IHdoZW4gdGhlIGd1ZXN0IGlzIGxlYXN0IGFibGVcbiAqIHRvIGFuc3dlciBpdCBcdTIwMTQgYSB3ZWRnZWQgZW11bGF0b3IgdGltZXMgb3V0IGV2ZXJ5IGBhZGJgIGNhbGwgXHUyMDE0IHdoaWNoIGlzIHRoZVxuICogY29uZGl0aW9uIHVuZGVyIHdoaWNoIGEgY29sbGlkaW5nIGxhdW5jaCBkb2VzIHRoZSBtb3N0IGRhbWFnZS5cbiAqXG4gKiBLZXB0IHNlcGFyYXRlIGZyb20gdGhlIGludGVncmF0aW9uLW9ubHkgYHRyYW5zcG9ydC1mYWN0b3J5YCAoZXhjbHVkZWQgZnJvbVxuICogdW5pdCB0ZXN0cykgc28gdGhlIGNsYXNzaWZpY2F0aW9uIHN0YXlzIHVuaXQtdGVzdGFibGUgXHUyMDE0IHRoZSBmYWN0b3J5IGl0c2VsZlxuICogc2hlbGxzIG91dCB0byBgYWRiYC5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuLyoqXG4gKiBXaGF0IG9uZSBkZXZpY2UgYW5zd2VyZWQgd2hlbiBhc2tlZCB3aGljaCBBVkQgaXQgaXMgc2VydmluZy5cbiAqXG4gKiBgbm90LWFuLWVtdWxhdG9yYCBhbmQgYG90aGVyLWF2ZGAgYXJlIGJvdGggbGVnaXRpbWF0ZSBza2lwczsgb25seVxuICogYG5vLWFuc3dlcmAgaXMgdGhlIHNpbGVuY2UgdGhhdCBtdXN0IG5ldmVyIGJlIHJlYWQgYXMgb25lLlxuICovXG5leHBvcnQgdHlwZSBBdmRQcm9iZU91dGNvbWUgPSAnbWF0Y2gnIHwgJ25vLWFuc3dlcicgfCAnbm90LWFuLWVtdWxhdG9yJyB8ICdvdGhlci1hdmQnO1xuXG4vKipcbiAqIFRoZSBydW4gY2Fubm90IHRlbGwgd2hldGhlciB0aGUgQVZEIGlzIGFscmVhZHkgcnVubmluZywgc28gaXQgbXVzdCBub3QgbGF1bmNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlUmVmdXNlVmVyZGljdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlcyB0aGF0IGNvdWxkIG5vdCBiZSByZWFkLCBhbmQgdGhlcmVmb3JlIGNhbm5vdCBiZSBydWxlZCBvdXQgYXMgdGhlIEFWRCdzIGhvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHVucmVhZGFibGVEZXZpY2VJZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAncmVmdXNlJztcbn1cblxuLyoqXG4gKiBPbmUgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVJlc3VsdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIFVESUQsIGUuZy4gYGVtdWxhdG9yLTU1NTRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgV2hhdCB0aGUgZGV2aWNlIGFuc3dlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0Y29tZTogQXZkUHJvYmVPdXRjb21lO1xufVxuXG4vKipcbiAqIFRoZSBBVkQgaXMgYWxyZWFkeSBydW5uaW5nLCBvbiBhIGRldmljZSB0aGlzIHJ1biBtYXkgYWRvcHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkUHJvYmVSZXVzZVZlcmRpY3Qge1xuICAvKipcbiAgVGhlIGRldmljZSBhbHJlYWR5IHNlcnZpbmcgdGhlIHJlcXVlc3RlZCBBVkQuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAncmV1c2UnO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGRldmljZSBhbnN3ZXJlZCwgbm9uZSBpcyBzZXJ2aW5nIHRoZSBBVkQsIHNvIGxhdW5jaGluZyBjYW5ub3QgY29sbGlkZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVN0YXJ0TmV3VmVyZGljdCB7XG4gIC8qKlxuICBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSB2ZXJkaWN0OiAnc3RhcnQtbmV3Jztcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBydW4gbWF5IGRvLCBnaXZlbiBldmVyeSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICovXG5leHBvcnQgdHlwZSBBdmRQcm9iZVZlcmRpY3QgPSBBdmRQcm9iZVJlZnVzZVZlcmRpY3QgfCBBdmRQcm9iZVJldXNlVmVyZGljdCB8IEF2ZFByb2JlU3RhcnROZXdWZXJkaWN0O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB0aGUgcnVuIHdhbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGJ1ZGdldCBlYWNoIHByb2JlIGF0dGVtcHQgd2FzIGdpdmVuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlcyB0aGF0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZURldmljZUlkczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNsYXNzaWZ5QXZkUHJvYmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsYXNzaWZ5QXZkUHJvYmVQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB0aGUgcnVuIHdhbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoYXQgd2FzIHByb2JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBBVkQgbmFtZSB0aGUgZGV2aWNlIGFuc3dlcmVkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGRpZCBub3QgYW5zd2VyIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JlZEF2ZE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZGV2aWNlIElEcyBhZGIgZ2l2ZXMgZW11bGF0b3JzIHN0YXJ0ZWQgdGhlIHdheSB0aGlzIGhhcm5lc3NcbiAqIHN0YXJ0cyB0aGVtOiBgZW11bGF0b3IgLWF2ZCA8bmFtZT5gLCB3aG9zZSBjb25zb2xlIGxhbmRzIG9uIGEgbG9jYWwgcG9ydC5cbiAqXG4gKiBPbmx5IHN1Y2ggYSBkZXZpY2UgY2FuIGNvbGxpZGUgd2l0aCB0aGlzIHJ1bidzIGxhdW5jaCwgc28gb25seSBzdWNoIGEgZGV2aWNlJ3NcbiAqIHNpbGVuY2UgaXMgd29ydGggcmVmdXNpbmcgb3Zlci4gQSBwaHlzaWNhbCBoYW5kc2V0IChhbiBhcmJpdHJhcnkgc2VyaWFsKSBvciBhXG4gKiBUQ1AtYXR0YWNoZWQgZGV2aWNlIGFuc3dlcnMgYGFkYiBcdTIwMjYgZW11IGF2ZCBuYW1lYCB3aXRoIGFuIGVycm9yIGhvd2V2ZXIgaGVhbHRoeVxuICogaXQgaXM7IHJlYWRpbmcgdGhhdCBhcyBcImRpZCBub3QgYW5zd2VyXCIgd291bGQgYmxvY2sgZXZlcnkgcnVuIG9uIGEgaG9zdCB3aXRoIGFcbiAqIHBob25lIHBsdWdnZWQgaW4sIHdoaWNoIGlzIGEgd29yc2UgZGVmZWN0IHRoYW4gdGhlIG9uZSB0aGlzIG1vZHVsZSBmaXhlcy5cbiAqL1xuY29uc3QgRU1VTEFUT1JfREVWSUNFX0lEX1BBVFRFUk4gPSAvXmVtdWxhdG9yLVxcZCskLztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIHN1bW1hcnkgbGluZSBuYW1pbmcgd2hhdCBlYWNoIGRldmljZSBhbnN3ZXJlZC5cbiAqXG4gKiBUaGUgb2xkIGxvZyBwcmludGVkIG9ubHkgdGhlIGNvbmNsdXNpb24gKGBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZWApLFxuICogd2hpY2ggaXMgZXhhY3RseSB0aGUgbGluZSB0aGF0IHdhcyB3cm9uZzsgcHJpbnRpbmcgdGhlIGV2aWRlbmNlIG5leHQgdG8gaXQgaXNcbiAqIHdoYXQgbWFrZXMgYSBiYWQgY29uY2x1c2lvbiB2aXNpYmxlIHdpdGhvdXQgYSBzZWNvbmQgcnVuLlxuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gRXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqIEByZXR1cm5zIFRoZSBzdW1tYXJ5LCBvciBgbm8gZGV2aWNlc2Agd2hlbiBub3RoaW5nIHdhcyBjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEF2ZFByb2JlU3VtbWFyeShyZXN1bHRzOiByZWFkb25seSBBdmRQcm9iZVJlc3VsdFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc3VsdHMubGVuZ3RoID09PSAwID8gJ25vIGRldmljZXMnIDogcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gYCR7cmVzdWx0LmRldmljZUlkfT0ke3Jlc3VsdC5vdXRjb21lfWApLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSByZWZ1c2FsIG1lc3NhZ2UgZm9yIGRldmljZXMgdGhhdCBjb3VsZCBub3QgYmUgcmVhZC5cbiAqXG4gKiBOYW1lcyB0aGUgZGV2aWNlLCB0aGUgQVZELCB0aGUgYnVkZ2V0LCB0aGUgY29uc2VxdWVuY2UgYW5kIHRoZSByZWNvdmVyeSBcdTIwMTQgdGhlXG4gKiBzaGFwZSBgdGVhcmRvd24tdmVyZGljdC50c2AgdXNlcyBmb3IgaXRzIG93biB3YXJuaW5nLCBiZWNhdXNlIGEgbWVzc2FnZSB0aGF0XG4gKiBzdG9wcyBhIHJ1biBoYXMgdG8gbGVhdmUgdGhlIHJlYWRlciBhYmxlIHRvIHVuYmxvY2sgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQsIHRoZSBwcm9iZSBidWRnZXQsIGFuZCB0aGUgZGV2aWNlcyB0aGF0IGRpZCBub3QgYW5zd2VyLlxuICogQHJldHVybnMgVGhlIHJlZnVzYWwgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlKHBhcmFtczogQnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICAvKlxuICAgKiBXaGVuIHRoZXJlIGlzIGV4YWN0bHkgb25lIGRldmljZSB0aGUgam9pbmVkIGxpc3QgSVMgaXRzIElELCBzbyB0aGUgc2luZ3VsYXJcbiAgICogd29yZGluZyBuZWVkcyBubyBpbmRleCBhY2Nlc3MgXHUyMDE0IGFuZCBubyB1bnJlYWNoYWJsZSBmYWxsYmFjayBmb3Igb25lLlxuICAgKi9cbiAgY29uc3QgZGV2aWNlTGlzdCA9IHBhcmFtcy51bnJlYWRhYmxlRGV2aWNlSWRzLmpvaW4oJywgJyk7XG4gIGNvbnN0IGlzU2luZ2xlID0gcGFyYW1zLnVucmVhZGFibGVEZXZpY2VJZHMubGVuZ3RoID09PSAxO1xuXG4gIGNvbnN0IHN1YmplY3QgPSBpc1NpbmdsZSA/IGBkZXZpY2UgJHtkZXZpY2VMaXN0fWAgOiBgZGV2aWNlcyAke2RldmljZUxpc3R9YDtcbiAgY29uc3QgY29tbWFuZCA9IGlzU2luZ2xlID8gYGFkYiAtcyAke2RldmljZUxpc3R9IGVtdSBhdmQgbmFtZWAgOiAnYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZSc7XG4gIGNvbnN0IGhvbGRlciA9IGlzU2luZ2xlID8gJ2l0IGlzJyA6ICdvbmUgb2YgdGhlbSBpcyc7XG4gIGNvbnN0IHJlbWVkeSA9IGlzU2luZ2xlID8gJ0tpbGwgdGhlIHVucmVzcG9uc2l2ZSBkZXZpY2UnIDogJ0tpbGwgdGhlIHVucmVzcG9uc2l2ZSBkZXZpY2VzJztcblxuICByZXR1cm4gYEFWRCBcIiR7cGFyYW1zLmF2ZE5hbWV9XCI6ICR7c3ViamVjdH0gZGlkIG5vdCBhbnN3ZXIgXFxgJHtjb21tYW5kfVxcYCB3aXRoaW4gJHtTdHJpbmcocGFyYW1zLnByb2JlVGltZW91dEluTWlsbGlzZWNvbmRzKX1tcyAocmV0cmllZCBvbmNlKSwgYFxuICAgICsgYHNvIHRoaXMgcnVuIGNhbm5vdCB0ZWxsIHdoZXRoZXIgJHtob2xkZXJ9IGFscmVhZHkgc2VydmluZyB0aGF0IEFWRC4gU3RhcnRpbmcgYW4gZW11bGF0b3IgYW55d2F5IHdvdWxkIGNvbGxpZGUgYFxuICAgICsgJyhgRkFUQUwgfCBSdW5uaW5nIG11bHRpcGxlIGVtdWxhdG9ycyB3aXRoIHRoZSBzYW1lIEFWRCBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZWApLCB3aGljaCB0aGUgZW11bGF0b3IgcmVwb3J0cyBvbmx5IHRvIGl0cyBvd24gc3Rkb3V0LiAnXG4gICAgKyBgJHtyZW1lZHl9LCBvciBydW4gXFxgYWRiIGtpbGwtc2VydmVyXFxgLCB0aGVuIHJldHJ5LmA7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgZGV2aWNlIGNhbiBob2xkIGFuIEFWRCB0aGlzIHJ1biBjb3VsZCBjb2xsaWRlIHdpdGguXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSBVRElEIHRvIGp1ZGdlLlxuICogQHJldHVybnMgYHRydWVgIGZvciBhIGxvY2FsbHkgc3RhcnRlZCBlbXVsYXRvciwgd2hvc2UgY29uc29sZSB0aGlzIHJ1biBjYW4gYXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0VtdWxhdG9yRGV2aWNlSWQoZGV2aWNlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU1VTEFUT1JfREVWSUNFX0lEX1BBVFRFUk4udGVzdChkZXZpY2VJZCk7XG59XG5cbi8qKlxuICogQ2xhc3NpZmllcyBvbmUgZGV2aWNlJ3MgcHJvYmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQgd2FudGVkLCB0aGUgZGV2aWNlIHByb2JlZCwgYW5kIHdoYXQgaXQgYW5zd2VyZWQuXG4gKiBAcmV0dXJucyBUaGUgb3V0Y29tZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5QXZkUHJvYmUocGFyYW1zOiBDbGFzc2lmeUF2ZFByb2JlUGFyYW1zKTogQXZkUHJvYmVPdXRjb21lIHtcbiAgaWYgKCFjaGVja0lzRW11bGF0b3JEZXZpY2VJZChwYXJhbXMuZGV2aWNlSWQpKSB7XG4gICAgcmV0dXJuICdub3QtYW4tZW11bGF0b3InO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5wcm9iZWRBdmROYW1lID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLnByb2JlZEF2ZE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICduby1hbnN3ZXInO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5wcm9iZWRBdmROYW1lID09PSBwYXJhbXMuYXZkTmFtZSA/ICdtYXRjaCcgOiAnb3RoZXItYXZkJztcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoYXQgdGhlIHJ1biBtYXkgZG8sIGZyb20gZXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqXG4gKiAqKkEgbWF0Y2ggd2lucyBvdmVyIGFuIHVucmVhZGFibGUgc2libGluZy4qKiBPbmNlIHRoZSByZXF1ZXN0ZWQgQVZEIGlzIGZvdW5kXG4gKiBhbmQgcmV1c2FibGUsIGFuIHVucmVsYXRlZCB3ZWRnZWQgZGV2aWNlIGlzIHNvbWVib2R5IGVsc2UncyBwcm9ibGVtIGFuZCBtdXN0XG4gKiBub3QgYmxvY2sgYSBydW4gdGhhdCBoYXMgZXZlcnl0aGluZyBpdCBuZWVkcyBcdTIwMTQgdGhlIHNhbWUgcmVzdHJhaW50XG4gKiBgZW11bGF0b3ItYmFja2VuZC50c2Agc2hvd3MgaW4gbmV2ZXIgc3dlZXBpbmcgYSBgcWVtdSpgIGl0IGRvZXMgbm90IG93bi4gT25seVxuICogd2hlbiBub3RoaW5nIG1hdGNoZWQgZG9lcyBzaWxlbmNlIGJlY29tZSBkZWNpc2l2ZSwgYmVjYXVzZSBvbmx5IHRoZW4gd291bGQgdGhlXG4gKiBydW4gZ28gb24gdG8gbGF1bmNoLlxuICpcbiAqIEBwYXJhbSByZXN1bHRzIC0gRXZlcnkgZGV2aWNlJ3MgcHJvYmUgb3V0Y29tZS5cbiAqIEByZXR1cm5zIFRoZSB2ZXJkaWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF2ZFByb2JlVmVyZGljdChyZXN1bHRzOiByZWFkb25seSBBdmRQcm9iZVJlc3VsdFtdKTogQXZkUHJvYmVWZXJkaWN0IHtcbiAgY29uc3QgdW5yZWFkYWJsZURldmljZUlkczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgc3dpdGNoIChyZXN1bHQub3V0Y29tZSkge1xuICAgICAgY2FzZSAnbWF0Y2gnOiB7XG4gICAgICAgIHJldHVybiB7IGRldmljZUlkOiByZXN1bHQuZGV2aWNlSWQsIHZlcmRpY3Q6ICdyZXVzZScgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vLWFuc3dlcic6IHtcbiAgICAgICAgdW5yZWFkYWJsZURldmljZUlkcy5wdXNoKHJlc3VsdC5kZXZpY2VJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90LWFuLWVtdWxhdG9yJzpcbiAgICAgIGNhc2UgJ290aGVyLWF2ZCc6IHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBhc3NlcnROZXZlcihyZXN1bHQub3V0Y29tZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVucmVhZGFibGVEZXZpY2VJZHMubGVuZ3RoID4gMCA/IHsgdW5yZWFkYWJsZURldmljZUlkcywgdmVyZGljdDogJ3JlZnVzZScgfSA6IHsgdmVyZGljdDogJ3N0YXJ0LW5ldycgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWlDQSxTQUFTLG1CQUFtQjtBQXdINUIsTUFBTSw2QkFBNkI7QUFZNUIsU0FBUyxxQkFBcUIsU0FBNEM7QUFDL0UsU0FBTyxRQUFRLFdBQVcsSUFBSSxlQUFlLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLFFBQVEsSUFBSSxPQUFPLE9BQU8sRUFBRSxFQUFFLEtBQUssSUFBSTtBQUN4SDtBQVlPLFNBQVMsOEJBQThCLFFBQXFEO0FBS2pHLFFBQU0sYUFBYSxPQUFPLG9CQUFvQixLQUFLLElBQUk7QUFDdkQsUUFBTSxXQUFXLE9BQU8sb0JBQW9CLFdBQVc7QUFFdkQsUUFBTSxVQUFVLFdBQVcsVUFBVSxVQUFVLEtBQUssV0FBVyxVQUFVO0FBQ3pFLFFBQU0sVUFBVSxXQUFXLFVBQVUsVUFBVSxrQkFBa0I7QUFDakUsUUFBTSxTQUFTLFdBQVcsVUFBVTtBQUNwQyxRQUFNLFNBQVMsV0FBVyxpQ0FBaUM7QUFFM0QsU0FBTyxRQUFRLE9BQU8sT0FBTyxNQUFNLE9BQU8scUJBQXFCLE9BQU8sYUFBYSxPQUFPLE9BQU8sMEJBQTBCLENBQUMsc0RBQ3JGLE1BQU0sa05BRXRDLE1BQU07QUFDZjtBQVFPLFNBQVMsd0JBQXdCLFVBQTJCO0FBQ2pFLFNBQU8sMkJBQTJCLEtBQUssUUFBUTtBQUNqRDtBQVFPLFNBQVMsaUJBQWlCLFFBQWlEO0FBQ2hGLE1BQUksQ0FBQyx3QkFBd0IsT0FBTyxRQUFRLEdBQUc7QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLE9BQU8sa0JBQWtCLFVBQWEsT0FBTyxjQUFjLFdBQVcsR0FBRztBQUMzRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sT0FBTyxrQkFBa0IsT0FBTyxVQUFVLFVBQVU7QUFDN0Q7QUFlTyxTQUFTLHVCQUF1QixTQUFxRDtBQUMxRixRQUFNLHNCQUFnQyxDQUFDO0FBRXZDLGFBQVcsVUFBVSxTQUFTO0FBQzVCLFlBQVEsT0FBTyxTQUFTO0FBQUEsTUFDdEIsS0FBSyxTQUFTO0FBQ1osZUFBTyxFQUFFLFVBQVUsT0FBTyxVQUFVLFNBQVMsUUFBUTtBQUFBLE1BQ3ZEO0FBQUEsTUFDQSxLQUFLLGFBQWE7QUFDaEIsNEJBQW9CLEtBQUssT0FBTyxRQUFRO0FBQ3hDO0FBQUEsTUFDRjtBQUFBLE1BQ0EsS0FBSztBQUFBLE1BQ0wsS0FBSyxhQUFhO0FBQ2hCO0FBQUEsTUFDRjtBQUFBLE1BQ0EsU0FBUztBQUNQLGVBQU8sWUFBWSxPQUFPLE9BQU87QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxvQkFBb0IsU0FBUyxJQUFJLEVBQUUscUJBQXFCLFNBQVMsU0FBUyxJQUFJLEVBQUUsU0FBUyxZQUFZO0FBQzlHOyIsCiAgIm5hbWVzIjogW10KfQo=
67
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2F2ZC1wcm9iZS12ZXJkaWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgQVZEIGFkb3B0aW9uIHByb2JlIFx1MjAxNCBkZWNpZGluZywgZnJvbSB3aGF0IGVhY2hcbiAqIGNvbm5lY3RlZCBkZXZpY2UgYW5zd2VyZWQsIHdoZXRoZXIgdGhpcyBydW4gbWF5IHJldXNlIG9uZSwgbXVzdCBzdGFydCBpdHNcbiAqIG93biBlbXVsYXRvciwgb3IgY2Fubm90IHNhZmVseSBkbyBlaXRoZXIuXG4gKlxuICogVGhlIHByb2JlIChgYWRiIC1zIDxkZXZpY2U+IGVtdSBhdmQgbmFtZWApIHVzZWQgdG8gZGlzY2FyZCBpdHMgZXJyb3IgYW5kXG4gKiByZXNvbHZlIGAnJ2AsIHNvIGEgY2FsbCB0aGF0ICoqbmV2ZXIgYW5zd2VyZWQqKiB3YXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBvbmVcbiAqIHRoYXQgYW5zd2VyZWQgKlwiYSBkaWZmZXJlbnQgQVZEXCIqLiBCb3RoIGZlbGwgdGhyb3VnaCB0byBcInN0YXJ0IGEgbmV3XG4gKiBlbXVsYXRvclwiLCB3aGljaCBjb2xsaWRlcyB3aXRoIHRoZSBlbXVsYXRvciBhbHJlYWR5IHNlcnZpbmcgdGhhdCBBVkQ6XG4gKlxuICogYGBgdGV4dFxuICogMTQ6Mjc6NTIuMTE0ICBDaGVja2luZyBleGlzdGluZyBkZXZpY2VzIGZvciBBVkQgXCJvYnNpZGlhbl90ZXN0XCIuLi4gKGNvbm5lY3RlZDogW2VtdWxhdG9yLTU1NTRdKVxuICogMTQ6Mjc6NTcuMTcwICBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2UsIHN0YXJ0aW5nIGEgbmV3IGVtdWxhdG9yLi4uXG4gKiBgYGBcbiAqXG4gKiA1LjA1NnMgYXBhcnQgXHUyMDE0IGV4YWN0bHkgdGhlIHByb2JlJ3Mgb3duIHRpbWVvdXQuIFRoZSBsYXVuY2ggdGhhdCBmb2xsb3dlZCBoaXRcbiAqIGBGQVRBTCB8IFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbFxuICogZmVhdHVyZWAsIHdoaWNoIHRoZSBlbXVsYXRvciB3cml0ZXMgdG8gaXRzIG93biBzdGRvdXQuICoqQSBwcm9iZSB0aGF0IG5ldmVyXG4gKiBhbnN3ZXJlZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYW5zd2VyIGlzIG5vKiogXHUyMDE0IHRoZSBzYW1lIGRpc3RpbmN0aW9uXG4gKiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3cyBiZXR3ZWVuIGBvZmZsaW5lYCBhbmQgYWJzZW50LCBhbmQgdGhlIHNhbWUgb25lXG4gKiB0aGUgY29ubmVjdGl2aXR5IHByb2JlIGRyYXdzIGJldHdlZW4gYSBmYWlsZWQgZHVtcCBhbmQgYSBtaXNzaW5nIG5ldHdvcmsuXG4gKlxuICogV29yc2UsIHRoZSBwcm9iZSBpcyBhc2tlZCBpdHMgcXVlc3Rpb24gcHJlY2lzZWx5IHdoZW4gdGhlIGd1ZXN0IGlzIGxlYXN0IGFibGVcbiAqIHRvIGFuc3dlciBpdCBcdTIwMTQgYSB3ZWRnZWQgZW11bGF0b3IgdGltZXMgb3V0IGV2ZXJ5IGBhZGJgIGNhbGwgXHUyMDE0IHdoaWNoIGlzIHRoZVxuICogY29uZGl0aW9uIHVuZGVyIHdoaWNoIGEgY29sbGlkaW5nIGxhdW5jaCBkb2VzIHRoZSBtb3N0IGRhbWFnZS5cbiAqXG4gKiAqKldoYXQgdGhlIHByb2JlIEFTS1MgbW92ZWQgc2luY2U7IHdoYXQgaXQgZGVjaWRlcyBkaWQgbm90LioqIFRoZSBxdWVzdGlvblxuICogbm93IHRyYXZlbHMgdGhlIGd1ZXN0IHByb3BlcnR5IG92ZXIgYGFkYmRgIGZpcnN0IGFuZCB0aGUgZW11bGF0b3IgY29uc29sZSBvbmx5XG4gKiBhcyBhIGZhbGxiYWNrIChgYXZkLW5hbWUtY2hhbm5lbC50c2ApLCBiZWNhdXNlIGtleWluZyBhIG1hY2hpbmUtd2lkZSByZWZ1c2FsXG4gKiBvbiB0aGUgY29uc29sZSBhbG9uZSBsZXQgb25lIHdlZGdlZCBlbXVsYXRvciBcdTIwMTQgdXN1YWxseSBhbm90aGVyIHByb2plY3QncyBcdTIwMTRcbiAqIHN0b3AgZXZlcnkgQW5kcm9pZCBydW4gb24gdGhlIGhvc3QuIFRoZSBmb3VyIG91dGNvbWVzIGFuZCB0aGUgdGhyZWUgdmVyZGljdHNcbiAqIGhlcmUgYXJlIHVuY2hhbmdlZDogc2lsZW5jZSBpcyBzdGlsbCBub3QgYSBza2lwLCBpdCBpcyBzaW1wbHkgZmFyIHJhcmVyLlxuICpcbiAqIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIChleGNsdWRlZCBmcm9tXG4gKiB1bml0IHRlc3RzKSBzbyB0aGUgY2xhc3NpZmljYXRpb24gc3RheXMgdW5pdC10ZXN0YWJsZSBcdTIwMTQgdGhlIGZhY3RvcnkgaXRzZWxmXG4gKiBzaGVsbHMgb3V0IHRvIGBhZGJgLlxuICovXG5cbmltcG9ydCB7XG4gIGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHMsXG4gIGRlc2NyaWJlQWRiQ29tbWFuZCxcbiAgRklSU1RfQVZEX05BTUVfQ0hBTk5FTFxufSBmcm9tICcuL2F2ZC1uYW1lLWNoYW5uZWwubWpzJztcbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5tanMnO1xuXG4vKipcbiAqIFdoYXQgb25lIGRldmljZSBhbnN3ZXJlZCB3aGVuIGFza2VkIHdoaWNoIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICpcbiAqIGBub3QtYW4tZW11bGF0b3JgIGFuZCBgb3RoZXItYXZkYCBhcmUgYm90aCBsZWdpdGltYXRlIHNraXBzOyBvbmx5XG4gKiBgbm8tYW5zd2VyYCBpcyB0aGUgc2lsZW5jZSB0aGF0IG11c3QgbmV2ZXIgYmUgcmVhZCBhcyBvbmUuXG4gKi9cbmV4cG9ydCB0eXBlIEF2ZFByb2JlT3V0Y29tZSA9ICdtYXRjaCcgfCAnbm8tYW5zd2VyJyB8ICdub3QtYW4tZW11bGF0b3InIHwgJ290aGVyLWF2ZCc7XG5cbi8qKlxuICogVGhlIHJ1biBjYW5ub3QgdGVsbCB3aGV0aGVyIHRoZSBBVkQgaXMgYWxyZWFkeSBydW5uaW5nLCBzbyBpdCBtdXN0IG5vdCBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXZkUHJvYmVSZWZ1c2VWZXJkaWN0IHtcbiAgLyoqXG4gIFRoZSBkZXZpY2VzIHRoYXQgY291bGQgbm90IGJlIHJlYWQsIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIHJ1bGVkIG91dCBhcyB0aGUgQVZEJ3MgaG9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZURldmljZUlkczogc3RyaW5nW107XG5cbiAgLyoqXG4gIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdyZWZ1c2UnO1xufVxuXG4vKipcbiAqIE9uZSBkZXZpY2UncyBwcm9iZSBvdXRjb21lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlUmVzdWx0IHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCwgZS5nLiBgZW11bGF0b3ItNTU1NGAuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGF0IHRoZSBkZXZpY2UgYW5zd2VyZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiBBdmRQcm9iZU91dGNvbWU7XG59XG5cbi8qKlxuICogVGhlIEFWRCBpcyBhbHJlYWR5IHJ1bm5pbmcsIG9uIGEgZGV2aWNlIHRoaXMgcnVuIG1heSBhZG9wdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdmRQcm9iZVJldXNlVmVyZGljdCB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIGFscmVhZHkgc2VydmluZyB0aGUgcmVxdWVzdGVkIEFWRC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdyZXVzZSc7XG59XG5cbi8qKlxuICogRXZlcnkgZGV2aWNlIGFuc3dlcmVkLCBub25lIGlzIHNlcnZpbmcgdGhlIEFWRCwgc28gbGF1bmNoaW5nIGNhbm5vdCBjb2xsaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF2ZFByb2JlU3RhcnROZXdWZXJkaWN0IHtcbiAgLyoqXG4gIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdzdGFydC1uZXcnO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJ1biBtYXkgZG8sIGdpdmVuIGV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKi9cbmV4cG9ydCB0eXBlIEF2ZFByb2JlVmVyZGljdCA9IEF2ZFByb2JlUmVmdXNlVmVyZGljdCB8IEF2ZFByb2JlUmV1c2VWZXJkaWN0IHwgQXZkUHJvYmVTdGFydE5ld1ZlcmRpY3Q7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHRoZSBydW4gd2FudGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYnVkZ2V0IGVhY2ggcHJvYmUgYXR0ZW1wdCB3YXMgZ2l2ZW4sIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2VzIHRoYXQgZGlkIG5vdCBhbnN3ZXIuXG4gICAqL1xuICByZWFkb25seSB1bnJlYWRhYmxlRGV2aWNlSWRzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2xhc3NpZnlBdmRQcm9iZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NpZnlBdmRQcm9iZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHRoZSBydW4gd2FudHMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2UgdGhhdCB3YXMgcHJvYmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIEFWRCBuYW1lIHRoZSBkZXZpY2UgYW5zd2VyZWQsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZGlkIG5vdCBhbnN3ZXIgYXQgYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmVkQXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBNYXRjaGVzIHRoZSBkZXZpY2UgSURzIGFkYiBnaXZlcyBlbXVsYXRvcnMgc3RhcnRlZCB0aGUgd2F5IHRoaXMgaGFybmVzc1xuICogc3RhcnRzIHRoZW06IGBlbXVsYXRvciAtYXZkIDxuYW1lPmAsIHdob3NlIGNvbnNvbGUgbGFuZHMgb24gYSBsb2NhbCBwb3J0LlxuICpcbiAqIE9ubHkgc3VjaCBhIGRldmljZSBjYW4gY29sbGlkZSB3aXRoIHRoaXMgcnVuJ3MgbGF1bmNoLCBzbyBvbmx5IHN1Y2ggYSBkZXZpY2Unc1xuICogc2lsZW5jZSBpcyB3b3J0aCByZWZ1c2luZyBvdmVyLiBBIHBoeXNpY2FsIGhhbmRzZXQgKGFuIGFyYml0cmFyeSBzZXJpYWwpIG9yIGFcbiAqIFRDUC1hdHRhY2hlZCBkZXZpY2UgY2FycmllcyBubyBgcWVtdWAgQVZEIHByb3BlcnR5IGFuZCBlcnJvcnMgb24gYGFkYiBcdTIwMjYgZW11XG4gKiBhdmQgbmFtZWAgaG93ZXZlciBoZWFsdGh5IGl0IGlzOyByZWFkaW5nIGVpdGhlciBhcyBcImRpZCBub3QgYW5zd2VyXCIgd291bGRcbiAqIGJsb2NrIGV2ZXJ5IHJ1biBvbiBhIGhvc3Qgd2l0aCBhIHBob25lIHBsdWdnZWQgaW4sIHdoaWNoIGlzIGEgd29yc2UgZGVmZWN0XG4gKiB0aGFuIHRoZSBvbmUgdGhpcyBtb2R1bGUgZml4ZXMuXG4gKi9cbmNvbnN0IEVNVUxBVE9SX0RFVklDRV9JRF9QQVRURVJOID0gL15lbXVsYXRvci1cXGQrJC87XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzdW1tYXJ5IGxpbmUgbmFtaW5nIHdoYXQgZWFjaCBkZXZpY2UgYW5zd2VyZWQuXG4gKlxuICogVGhlIG9sZCBsb2cgcHJpbnRlZCBvbmx5IHRoZSBjb25jbHVzaW9uIChgbm90IGZvdW5kIG9uIGFueSBleGlzdGluZyBkZXZpY2VgKSxcbiAqIHdoaWNoIGlzIGV4YWN0bHkgdGhlIGxpbmUgdGhhdCB3YXMgd3Jvbmc7IHByaW50aW5nIHRoZSBldmlkZW5jZSBuZXh0IHRvIGl0IGlzXG4gKiB3aGF0IG1ha2VzIGEgYmFkIGNvbmNsdXNpb24gdmlzaWJsZSB3aXRob3V0IGEgc2Vjb25kIHJ1bi5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKiBAcmV0dXJucyBUaGUgc3VtbWFyeSwgb3IgYG5vIGRldmljZXNgIHdoZW4gbm90aGluZyB3YXMgY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBdmRQcm9iZVN1bW1hcnkocmVzdWx0czogcmVhZG9ubHkgQXZkUHJvYmVSZXN1bHRbXSk6IHN0cmluZyB7XG4gIHJldHVybiByZXN1bHRzLmxlbmd0aCA9PT0gMCA/ICdubyBkZXZpY2VzJyA6IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IGAke3Jlc3VsdC5kZXZpY2VJZH09JHtyZXN1bHQub3V0Y29tZX1gKS5qb2luKCcsICcpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVmdXNhbCBtZXNzYWdlIGZvciBkZXZpY2VzIHRoYXQgY291bGQgbm90IGJlIHJlYWQuXG4gKlxuICogTmFtZXMgdGhlIGRldmljZSwgdGhlIEFWRCwgdGhlIGJ1ZGdldCwgdGhlIGNvbnNlcXVlbmNlIGFuZCB0aGUgcmVjb3ZlcnkgXHUyMDE0IHRoZVxuICogc2hhcGUgYHRlYXJkb3duLXZlcmRpY3QudHNgIHVzZXMgZm9yIGl0cyBvd24gd2FybmluZywgYmVjYXVzZSBhIG1lc3NhZ2UgdGhhdFxuICogc3RvcHMgYSBydW4gaGFzIHRvIGxlYXZlIHRoZSByZWFkZXIgYWJsZSB0byB1bmJsb2NrIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZELCB0aGUgcHJvYmUgYnVkZ2V0LCBhbmQgdGhlIGRldmljZXMgdGhhdCBkaWQgbm90IGFuc3dlci5cbiAqIEByZXR1cm5zIFRoZSByZWZ1c2FsIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVucmVhZGFibGVEZXZpY2VzTWVzc2FnZShwYXJhbXM6IEJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgLypcbiAgICogV2hlbiB0aGVyZSBpcyBleGFjdGx5IG9uZSBkZXZpY2UgdGhlIGpvaW5lZCBsaXN0IElTIGl0cyBJRCwgc28gdGhlIHNpbmd1bGFyXG4gICAqIHdvcmRpbmcgbmVlZHMgbm8gaW5kZXggYWNjZXNzIFx1MjAxNCBhbmQgbm8gdW5yZWFjaGFibGUgZmFsbGJhY2sgZm9yIG9uZS5cbiAgICovXG4gIGNvbnN0IGRldmljZUxpc3QgPSBwYXJhbXMudW5yZWFkYWJsZURldmljZUlkcy5qb2luKCcsICcpO1xuICBjb25zdCBpc1NpbmdsZSA9IHBhcmFtcy51bnJlYWRhYmxlRGV2aWNlSWRzLmxlbmd0aCA9PT0gMTtcblxuICBjb25zdCBzdWJqZWN0ID0gaXNTaW5nbGUgPyBgZGV2aWNlICR7ZGV2aWNlTGlzdH1gIDogYGRldmljZXMgJHtkZXZpY2VMaXN0fWA7XG4gIGNvbnN0IGRldmljZUxhYmVsID0gaXNTaW5nbGUgPyBkZXZpY2VMaXN0IDogJzxkZXZpY2U+JztcbiAgY29uc3QgcHJvcGVydHlDb21tYW5kID0gZGVzY3JpYmVBZGJDb21tYW5kKGJ1aWxkQXZkTmFtZUNoYW5uZWxBcmd1bWVudHMoeyBjaGFubmVsOiBGSVJTVF9BVkRfTkFNRV9DSEFOTkVMLCBkZXZpY2VJZDogZGV2aWNlTGFiZWwgfSkpO1xuICBjb25zdCBjb25zb2xlQ29tbWFuZCA9IGRlc2NyaWJlQWRiQ29tbWFuZChidWlsZEF2ZE5hbWVDaGFubmVsQXJndW1lbnRzKHsgY2hhbm5lbDogJ2NvbnNvbGUnLCBkZXZpY2VJZDogZGV2aWNlTGFiZWwgfSkpO1xuICBjb25zdCBob2xkZXIgPSBpc1NpbmdsZSA/ICdpdCBpcycgOiAnb25lIG9mIHRoZW0gaXMnO1xuICBjb25zdCBpZGVudGlmaWVkID0gaXNTaW5nbGUgPyAnaWRlbnRpZmllZCBpdHNlbGYnIDogJ2lkZW50aWZpZWQgdGhlbXNlbHZlcyc7XG4gIGNvbnN0IG93bmVyID0gaXNTaW5nbGUgPyAnQSBkZXZpY2UgdGhpcyBydW4gY2Fubm90IHJlYWQgaXMgbW9zdCBsaWtlbHkgQU5PVEhFUiBydW5cXCdzJyA6ICdEZXZpY2VzIHRoaXMgcnVuIGNhbm5vdCByZWFkIGFyZSBtb3N0IGxpa2VseSBPVEhFUiBydW5zXFwnJztcbiAgY29uc3Qga2lsbGluZyA9IGlzU2luZ2xlID8gJ2tpbGxpbmcgaXQnIDogJ2tpbGxpbmcgdGhlbSc7XG4gIGNvbnN0IG93bmVyc2hpcCA9IGlzU2luZ2xlID8gJ3RoZSBkZXZpY2UgaXMgeW91cnMnIDogJ3RoZSBkZXZpY2VzIGFyZSB5b3Vycyc7XG4gIGNvbnN0IG90aGVyUnVuID0gaXNTaW5nbGUgPyAndGhhdCBydW4nIDogJ3Rob3NlIHJ1bnMnO1xuXG4gIHJldHVybiBgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIjogJHtzdWJqZWN0fSAke2lkZW50aWZpZWR9IG92ZXIgbmVpdGhlciBcXGAke3Byb3BlcnR5Q29tbWFuZH1cXGAgKHRoZSBndWVzdCBwcm9wZXJ0eSwgb3ZlciBhZGJkKSBgXG4gICAgKyBgbm9yIFxcYCR7Y29uc29sZUNvbW1hbmR9XFxgICh0aGUgZW11bGF0b3IncyBvd24gY29uc29sZSkgd2l0aGluICR7U3RyaW5nKHBhcmFtcy5wcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMgZWFjaCAocmV0cmllZCBvbmNlKSwgYFxuICAgICsgYHNvIHRoaXMgcnVuIGNhbm5vdCB0ZWxsIHdoZXRoZXIgJHtob2xkZXJ9IGFscmVhZHkgc2VydmluZyB0aGF0IEFWRC4gU3RhcnRpbmcgYW4gZW11bGF0b3IgYW55d2F5IHdvdWxkIGNvbGxpZGUgYFxuICAgICsgJyhgRkFUQUwgfCBSdW5uaW5nIG11bHRpcGxlIGVtdWxhdG9ycyB3aXRoIHRoZSBzYW1lIEFWRCBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZWApLCB3aGljaCB0aGUgZW11bGF0b3IgcmVwb3J0cyBvbmx5IHRvIGl0cyBvd24gc3Rkb3V0LiAnXG4gICAgKyBgJHtvd25lcn06ICR7a2lsbGluZ30sIG9yIHJ1bm5pbmcgXFxgYWRiIGtpbGwtc2VydmVyXFxgLCBkZXN0cm95cyB3b3JrIHRoaXMgcnVuIGNhbm5vdCBzZWUsIHNvIGRvIHRoYXQgb25seSBvbmNlIHlvdSBrbm93ICR7b3duZXJzaGlwfS4gYFxuICAgICsgYE90aGVyd2lzZSB3YWl0IGZvciAke290aGVyUnVufSB0byBmaW5pc2gsIGFuZCByZXRyeSBvbmNlIFxcYGFkYiBkZXZpY2VzXFxgIG5vIGxvbmdlciBsaXN0cyBpdC5gO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciBhIGRldmljZSBjYW4gaG9sZCBhbiBBVkQgdGhpcyBydW4gY291bGQgY29sbGlkZSB3aXRoLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBqdWRnZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBmb3IgYSBsb2NhbGx5IHN0YXJ0ZWQgZW11bGF0b3IsIHdob3NlIGNvbnNvbGUgdGhpcyBydW4gY2FuIGFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNFbXVsYXRvckRldmljZUlkKGRldmljZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNVUxBVE9SX0RFVklDRV9JRF9QQVRURVJOLnRlc3QoZGV2aWNlSWQpO1xufVxuXG4vKipcbiAqIENsYXNzaWZpZXMgb25lIGRldmljZSdzIHByb2JlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZEIHdhbnRlZCwgdGhlIGRldmljZSBwcm9iZWQsIGFuZCB3aGF0IGl0IGFuc3dlcmVkLlxuICogQHJldHVybnMgVGhlIG91dGNvbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeUF2ZFByb2JlKHBhcmFtczogQ2xhc3NpZnlBdmRQcm9iZVBhcmFtcyk6IEF2ZFByb2JlT3V0Y29tZSB7XG4gIGlmICghY2hlY2tJc0VtdWxhdG9yRGV2aWNlSWQocGFyYW1zLmRldmljZUlkKSkge1xuICAgIHJldHVybiAnbm90LWFuLWVtdWxhdG9yJztcbiAgfVxuXG4gIGlmIChwYXJhbXMucHJvYmVkQXZkTmFtZSA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5wcm9iZWRBdmROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnbm8tYW5zd2VyJztcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMucHJvYmVkQXZkTmFtZSA9PT0gcGFyYW1zLmF2ZE5hbWUgPyAnbWF0Y2gnIDogJ290aGVyLWF2ZCc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGF0IHRoZSBydW4gbWF5IGRvLCBmcm9tIGV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKlxuICogKipBIG1hdGNoIHdpbnMgb3ZlciBhbiB1bnJlYWRhYmxlIHNpYmxpbmcuKiogT25jZSB0aGUgcmVxdWVzdGVkIEFWRCBpcyBmb3VuZFxuICogYW5kIHJldXNhYmxlLCBhbiB1bnJlbGF0ZWQgd2VkZ2VkIGRldmljZSBpcyBzb21lYm9keSBlbHNlJ3MgcHJvYmxlbSBhbmQgbXVzdFxuICogbm90IGJsb2NrIGEgcnVuIHRoYXQgaGFzIGV2ZXJ5dGhpbmcgaXQgbmVlZHMgXHUyMDE0IHRoZSBzYW1lIHJlc3RyYWludFxuICogYGVtdWxhdG9yLWJhY2tlbmQudHNgIHNob3dzIGluIG5ldmVyIHN3ZWVwaW5nIGEgYHFlbXUqYCBpdCBkb2VzIG5vdCBvd24uIE9ubHlcbiAqIHdoZW4gbm90aGluZyBtYXRjaGVkIGRvZXMgc2lsZW5jZSBiZWNvbWUgZGVjaXNpdmUsIGJlY2F1c2Ugb25seSB0aGVuIHdvdWxkIHRoZVxuICogcnVuIGdvIG9uIHRvIGxhdW5jaC5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEV2ZXJ5IGRldmljZSdzIHByb2JlIG91dGNvbWUuXG4gKiBAcmV0dXJucyBUaGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBdmRQcm9iZVZlcmRpY3QocmVzdWx0czogcmVhZG9ubHkgQXZkUHJvYmVSZXN1bHRbXSk6IEF2ZFByb2JlVmVyZGljdCB7XG4gIGNvbnN0IHVucmVhZGFibGVEZXZpY2VJZHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHN3aXRjaCAocmVzdWx0Lm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ21hdGNoJzoge1xuICAgICAgICByZXR1cm4geyBkZXZpY2VJZDogcmVzdWx0LmRldmljZUlkLCB2ZXJkaWN0OiAncmV1c2UnIH07XG4gICAgICB9XG4gICAgICBjYXNlICduby1hbnN3ZXInOiB7XG4gICAgICAgIHVucmVhZGFibGVEZXZpY2VJZHMucHVzaChyZXN1bHQuZGV2aWNlSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdC1hbi1lbXVsYXRvcic6XG4gICAgICBjYXNlICdvdGhlci1hdmQnOiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIocmVzdWx0Lm91dGNvbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bnJlYWRhYmxlRGV2aWNlSWRzLmxlbmd0aCA+IDAgPyB7IHVucmVhZGFibGVEZXZpY2VJZHMsIHZlcmRpY3Q6ICdyZWZ1c2UnIH0gOiB7IHZlcmRpY3Q6ICdzdGFydC1uZXcnIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUF3Q0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQkFBbUI7QUF5SDVCLE1BQU0sNkJBQTZCO0FBWTVCLFNBQVMscUJBQXFCLFNBQTRDO0FBQy9FLFNBQU8sUUFBUSxXQUFXLElBQUksZUFBZSxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxRQUFRLElBQUksT0FBTyxPQUFPLEVBQUUsRUFBRSxLQUFLLElBQUk7QUFDeEg7QUFZTyxTQUFTLDhCQUE4QixRQUFxRDtBQUtqRyxRQUFNLGFBQWEsT0FBTyxvQkFBb0IsS0FBSyxJQUFJO0FBQ3ZELFFBQU0sV0FBVyxPQUFPLG9CQUFvQixXQUFXO0FBRXZELFFBQU0sVUFBVSxXQUFXLFVBQVUsVUFBVSxLQUFLLFdBQVcsVUFBVTtBQUN6RSxRQUFNLGNBQWMsV0FBVyxhQUFhO0FBQzVDLFFBQU0sa0JBQWtCLG1CQUFtQiw2QkFBNkIsRUFBRSxTQUFTLHdCQUF3QixVQUFVLFlBQVksQ0FBQyxDQUFDO0FBQ25JLFFBQU0saUJBQWlCLG1CQUFtQiw2QkFBNkIsRUFBRSxTQUFTLFdBQVcsVUFBVSxZQUFZLENBQUMsQ0FBQztBQUNySCxRQUFNLFNBQVMsV0FBVyxVQUFVO0FBQ3BDLFFBQU0sYUFBYSxXQUFXLHNCQUFzQjtBQUNwRCxRQUFNLFFBQVEsV0FBVywrREFBZ0U7QUFDekYsUUFBTSxVQUFVLFdBQVcsZUFBZTtBQUMxQyxRQUFNLFlBQVksV0FBVyx3QkFBd0I7QUFDckQsUUFBTSxXQUFXLFdBQVcsYUFBYTtBQUV6QyxTQUFPLFFBQVEsT0FBTyxPQUFPLE1BQU0sT0FBTyxJQUFJLFVBQVUsbUJBQW1CLGVBQWUsNENBQzdFLGNBQWMsMENBQTBDLE9BQU8sT0FBTywwQkFBMEIsQ0FBQywyREFDdkUsTUFBTSxrTkFFdEMsS0FBSyxLQUFLLE9BQU8sc0dBQXNHLFNBQVMsd0JBQzdHLFFBQVE7QUFDcEM7QUFRTyxTQUFTLHdCQUF3QixVQUEyQjtBQUNqRSxTQUFPLDJCQUEyQixLQUFLLFFBQVE7QUFDakQ7QUFRTyxTQUFTLGlCQUFpQixRQUFpRDtBQUNoRixNQUFJLENBQUMsd0JBQXdCLE9BQU8sUUFBUSxHQUFHO0FBQzdDLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxPQUFPLGtCQUFrQixVQUFhLE9BQU8sY0FBYyxXQUFXLEdBQUc7QUFDM0UsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE9BQU8sa0JBQWtCLE9BQU8sVUFBVSxVQUFVO0FBQzdEO0FBZU8sU0FBUyx1QkFBdUIsU0FBcUQ7QUFDMUYsUUFBTSxzQkFBZ0MsQ0FBQztBQUV2QyxhQUFXLFVBQVUsU0FBUztBQUM1QixZQUFRLE9BQU8sU0FBUztBQUFBLE1BQ3RCLEtBQUssU0FBUztBQUNaLGVBQU8sRUFBRSxVQUFVLE9BQU8sVUFBVSxTQUFTLFFBQVE7QUFBQSxNQUN2RDtBQUFBLE1BQ0EsS0FBSyxhQUFhO0FBQ2hCLDRCQUFvQixLQUFLLE9BQU8sUUFBUTtBQUN4QztBQUFBLE1BQ0Y7QUFBQSxNQUNBLEtBQUs7QUFBQSxNQUNMLEtBQUssYUFBYTtBQUNoQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFNBQVM7QUFDUCxlQUFPLFlBQVksT0FBTyxPQUFPO0FBQUEsTUFDbkM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sb0JBQW9CLFNBQVMsSUFBSSxFQUFFLHFCQUFxQixTQUFTLFNBQVMsSUFBSSxFQUFFLFNBQVMsWUFBWTtBQUM5RzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -12,7 +12,9 @@
12
12
  * `adb exec-out screencap -p` reads the framebuffer instead, which is the same
13
13
  * route the trusted-input passes already use. The trade is deliberate and worth
14
14
  * writing down at every call site: a device capture carries the status-bar clock
15
- * and battery, so it is **not byte-reproducible** the way a page capture is.
15
+ * and battery, so it is **not byte-reproducible as captured** the way a page
16
+ * capture is. `paintOutStatusBar` is what makes one — it removes the band those
17
+ * live in — and a frame that is going to be committed has to go through it.
16
18
  * Reach for this only for the shots that need the keyboard; leave the rest on
17
19
  * `captureObsidianScreenshot`.
18
20
  */
@@ -15,4 +15,4 @@ async function captureDeviceScreenshot(params) {
15
15
  export {
16
16
  captureDeviceScreenshot
17
17
  };
18
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zY3JlZW5zaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGhvdG9ncmFwaHMgdGhlIERFVklDRSwgbm90IHRoZSB3ZWIgcGFnZS5cbiAqXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAgZ29lcyB0aHJvdWdoIEFwcGl1bSBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBzbyBvblxuICogQW5kcm9pZCBpdCBjYXB0dXJlcyB0aGUgcGFnZTogbm8gc3RhdHVzIGJhciwgYW5kIFx1MjAxNCB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIFx1MjAxNFxuICogbm8gc29mdCBrZXlib2FyZCwgYmVjYXVzZSB0aGUgSU1FIGlzIGEgc3lzdGVtIHdpbmRvdyBhbmQgbm90IHBhcnQgb2YgdGhlXG4gKiBwYWdlLiBBIGZyYW1lIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyB3aGF0IGEgcGhvbmUgbG9va3MgbGlrZSB0aGVyZWZvcmUgY2Fubm90XG4gKiBiZSB0YWtlbiB0aGF0IHdheS5cbiAqXG4gKiBgYWRiIGV4ZWMtb3V0IHNjcmVlbmNhcCAtcGAgcmVhZHMgdGhlIGZyYW1lYnVmZmVyIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiByb3V0ZSB0aGUgdHJ1c3RlZC1pbnB1dCBwYXNzZXMgYWxyZWFkeSB1c2UuIFRoZSB0cmFkZSBpcyBkZWxpYmVyYXRlIGFuZCB3b3J0aFxuICogd3JpdGluZyBkb3duIGF0IGV2ZXJ5IGNhbGwgc2l0ZTogYSBkZXZpY2UgY2FwdHVyZSBjYXJyaWVzIHRoZSBzdGF0dXMtYmFyIGNsb2NrXG4gKiBhbmQgYmF0dGVyeSwgc28gaXQgaXMgKipub3QgYnl0ZS1yZXByb2R1Y2libGUqKiB0aGUgd2F5IGEgcGFnZSBjYXB0dXJlIGlzLlxuICogUmVhY2ggZm9yIHRoaXMgb25seSBmb3IgdGhlIHNob3RzIHRoYXQgbmVlZCB0aGUga2V5Ym9hcmQ7IGxlYXZlIHRoZSByZXN0IG9uXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAuXG4gKi9cblxuaW1wb3J0IHsgcnVuQWRiQmluYXJ5IH0gZnJvbSAnLi9hZGIubWpzJztcbmltcG9ydCB7IGlzUG5nIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2FwdHVyZURldmljZVNjcmVlbnNob3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gcGhvdG9ncmFwaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKHNoZWxscyBvdXQgdG8gYSByZWFsIGRldmljZSkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQ2FwdHVyZXMgdGhlIGRldmljZSdzIGZyYW1lYnVmZmVyIGFzIGEgUE5HLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIHBob3RvZ3JhcGguXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB3aGF0IGNhbWUgYmFjayBpcyBub3QgYSBQTkcgXHUyMDE0IHdoaWNoIGlzIHdoYXQgYSB0cnVuY2F0ZWQgb3IgdGV4dC1kZWNvZGVkIGNhcHR1cmUgbG9va3NcbiAqICAgbGlrZSwgYW5kIGlzIGZhciBjaGVhcGVyIHRvIGNhdGNoIGhlcmUgdGhhbiBpbiBhbiBpbWFnZSBkaWZmLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FwdHVyZURldmljZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlRGV2aWNlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBieXRlcyA9IGF3YWl0IHJ1bkFkYkJpbmFyeSh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydleGVjLW91dCcsICdzY3JlZW5jYXAnLCAnLXAnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIGlmICghaXNQbmcoYnl0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90OiAke3BhcmFtcy5kZXZpY2VJZH0gcmV0dXJuZWQgJHtTdHJpbmcoYnl0ZXMubGVuZ3RoKX0gYnl0ZXMgdGhhdCBhcmUgbm90IGEgUE5HLiBgXG4gICAgICAgICsgJ0EgZGV2aWNlIHRoYXQgaXMgc3RpbGwgYm9vdGluZywgb3IgYW4gYWRiIHRyYW5zcG9ydCB0aGF0IGRlY29kZWQgdGhlIHN0cmVhbSBhcyB0ZXh0LCBib3RoIGxvb2sgbGlrZSB0aGlzLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUJBLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsYUFBYTtBQXNCdEIsZUFBc0Isd0JBQXdCLFFBQTREO0FBQ3hHLFFBQU0sUUFBUSxNQUFNLGFBQWE7QUFBQSxJQUMvQixrQkFBa0IsQ0FBQyxZQUFZLGFBQWEsSUFBSTtBQUFBLElBQ2hELFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFFRCxNQUFJLENBQUMsTUFBTSxLQUFLLEdBQUc7QUFDakIsVUFBTSxJQUFJO0FBQUEsTUFDUiw0QkFBNEIsT0FBTyxRQUFRLGFBQWEsT0FBTyxNQUFNLE1BQU0sQ0FBQztBQUFBLElBRTlFO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
18
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zY3JlZW5zaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGhvdG9ncmFwaHMgdGhlIERFVklDRSwgbm90IHRoZSB3ZWIgcGFnZS5cbiAqXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAgZ29lcyB0aHJvdWdoIEFwcGl1bSBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBzbyBvblxuICogQW5kcm9pZCBpdCBjYXB0dXJlcyB0aGUgcGFnZTogbm8gc3RhdHVzIGJhciwgYW5kIFx1MjAxNCB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIFx1MjAxNFxuICogbm8gc29mdCBrZXlib2FyZCwgYmVjYXVzZSB0aGUgSU1FIGlzIGEgc3lzdGVtIHdpbmRvdyBhbmQgbm90IHBhcnQgb2YgdGhlXG4gKiBwYWdlLiBBIGZyYW1lIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyB3aGF0IGEgcGhvbmUgbG9va3MgbGlrZSB0aGVyZWZvcmUgY2Fubm90XG4gKiBiZSB0YWtlbiB0aGF0IHdheS5cbiAqXG4gKiBgYWRiIGV4ZWMtb3V0IHNjcmVlbmNhcCAtcGAgcmVhZHMgdGhlIGZyYW1lYnVmZmVyIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiByb3V0ZSB0aGUgdHJ1c3RlZC1pbnB1dCBwYXNzZXMgYWxyZWFkeSB1c2UuIFRoZSB0cmFkZSBpcyBkZWxpYmVyYXRlIGFuZCB3b3J0aFxuICogd3JpdGluZyBkb3duIGF0IGV2ZXJ5IGNhbGwgc2l0ZTogYSBkZXZpY2UgY2FwdHVyZSBjYXJyaWVzIHRoZSBzdGF0dXMtYmFyIGNsb2NrXG4gKiBhbmQgYmF0dGVyeSwgc28gaXQgaXMgKipub3QgYnl0ZS1yZXByb2R1Y2libGUgYXMgY2FwdHVyZWQqKiB0aGUgd2F5IGEgcGFnZVxuICogY2FwdHVyZSBpcy4gYHBhaW50T3V0U3RhdHVzQmFyYCBpcyB3aGF0IG1ha2VzIG9uZSBcdTIwMTQgaXQgcmVtb3ZlcyB0aGUgYmFuZCB0aG9zZVxuICogbGl2ZSBpbiBcdTIwMTQgYW5kIGEgZnJhbWUgdGhhdCBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgaGFzIHRvIGdvIHRocm91Z2ggaXQuXG4gKiBSZWFjaCBmb3IgdGhpcyBvbmx5IGZvciB0aGUgc2hvdHMgdGhhdCBuZWVkIHRoZSBrZXlib2FyZDsgbGVhdmUgdGhlIHJlc3Qgb25cbiAqIGBjYXB0dXJlT2JzaWRpYW5TY3JlZW5zaG90YC5cbiAqL1xuXG5pbXBvcnQgeyBydW5BZGJCaW5hcnkgfSBmcm9tICcuL2FkYi5tanMnO1xuaW1wb3J0IHsgaXNQbmcgfSBmcm9tICcuL2NhcHR1cmUtc2NyZWVuc2hvdC5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FwdHVyZURldmljZVNjcmVlbnNob3RQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byBwaG90b2dyYXBoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoc2hlbGxzIG91dCB0byBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuLyoqXG4gKiBDYXB0dXJlcyB0aGUgZGV2aWNlJ3MgZnJhbWVidWZmZXIgYXMgYSBQTkcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgdG8gcGhvdG9ncmFwaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyBQTkcgYnl0ZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHdoYXQgY2FtZSBiYWNrIGlzIG5vdCBhIFBORyBcdTIwMTQgd2hpY2ggaXMgd2hhdCBhIHRydW5jYXRlZCBvciB0ZXh0LWRlY29kZWQgY2FwdHVyZSBsb29rc1xuICogICBsaWtlLCBhbmQgaXMgZmFyIGNoZWFwZXIgdG8gY2F0Y2ggaGVyZSB0aGFuIGluIGFuIGltYWdlIGRpZmYuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdChwYXJhbXM6IENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IGJ5dGVzID0gYXdhaXQgcnVuQWRiQmluYXJ5KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ2V4ZWMtb3V0JywgJ3NjcmVlbmNhcCcsICctcCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgY2FwdHVyZURldmljZVNjcmVlbnNob3Q6ICR7cGFyYW1zLmRldmljZUlkfSByZXR1cm5lZCAke1N0cmluZyhieXRlcy5sZW5ndGgpfSBieXRlcyB0aGF0IGFyZSBub3QgYSBQTkcuIGBcbiAgICAgICAgKyAnQSBkZXZpY2UgdGhhdCBpcyBzdGlsbCBib290aW5nLCBvciBhbiBhZGIgdHJhbnNwb3J0IHRoYXQgZGVjb2RlZCB0aGUgc3RyZWFtIGFzIHRleHQsIGJvdGggbG9vayBsaWtlIHRoaXMuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFxQkEsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxhQUFhO0FBc0J0QixlQUFzQix3QkFBd0IsUUFBNEQ7QUFDeEcsUUFBTSxRQUFRLE1BQU0sYUFBYTtBQUFBLElBQy9CLGtCQUFrQixDQUFDLFlBQVksYUFBYSxJQUFJO0FBQUEsSUFDaEQsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUVELE1BQUksQ0FBQyxNQUFNLEtBQUssR0FBRztBQUNqQixVQUFNLElBQUk7QUFBQSxNQUNSLDRCQUE0QixPQUFPLFFBQVEsYUFBYSxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQUEsSUFFOUU7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -24,6 +24,49 @@
24
24
  * integration-only `transport-factory` so the parsing and the selection stay
25
25
  * unit-testable.
26
26
  */
27
+ /**
28
+ * Parameters for {@link checkIsNoMatchReported}.
29
+ */
30
+ export interface CheckIsNoMatchReportedParams {
31
+ /**
32
+ The query's stdout.
33
+ */
34
+ readonly output: string;
35
+ /**
36
+ The query that produced it.
37
+ */
38
+ readonly query: EmulatorProcessQuery;
39
+ }
40
+ /**
41
+ * One command that lists (some of) the host's emulator processes.
42
+ */
43
+ export interface EmulatorProcessQuery {
44
+ /**
45
+ The executable.
46
+ */
47
+ readonly command: string;
48
+ /**
49
+ Its arguments.
50
+ */
51
+ readonly commandArguments: readonly string[];
52
+ /**
53
+ Whether the command asks only for emulator image names rather than for every process on the host — which is what makes an empty answer legitimate.
54
+ */
55
+ readonly isFiltered: boolean;
56
+ }
57
+ /**
58
+ * Parameters for {@link parseEmulatorProcessQueryOutput}.
59
+ */
60
+ export interface ParseEmulatorProcessQueryOutputParams {
61
+ /**
62
+ The query's stdout.
63
+ */
64
+ readonly output: string;
65
+ /**
66
+ The query that produced it.
67
+ */
68
+ readonly query: EmulatorProcessQuery;
69
+ }
27
70
  /**
28
71
  * One process from a host process listing.
29
72
  */
@@ -50,6 +93,44 @@ export interface SelectEmulatorBackendPidsParams {
50
93
  */
51
94
  readonly processes: readonly ProcessListEntry[];
52
95
  }
96
+ /**
97
+ * Builds the commands that list the host's emulator processes.
98
+ *
99
+ * **On Windows the query is filtered to the emulator image names, and that is a
100
+ * measured decision.** A whole-host `tasklist` does per-process work for every
101
+ * row, so it pays the host's contention once per process: during an emulator
102
+ * boot it measured p50 2.9s and max 92.2s over ~530 rows, and with every core
103
+ * saturated one call stalled for 120.9s — until the load exited — where the
104
+ * filtered call never exceeded 505ms (2026-09-23, n=8 each). The per-row cost is
105
+ * work the filter skips, so the filtered query does not inherit it.
106
+ *
107
+ * **On POSIX the whole-host `ps` is kept.** It reads `/proc` and was never
108
+ * measured slow, and a whole-host listing keeps the invariant that zero rows
109
+ * means a failed query — which `pgrep`'s exit 1 on no match would muddy.
110
+ *
111
+ * @param platform - The host platform, e.g. `process.platform`.
112
+ * @returns The queries to run; their parsed rows together are the answer.
113
+ */
114
+ export declare function buildEmulatorProcessQueries(platform: NodeJS.Platform): EmulatorProcessQuery[];
115
+ /**
116
+ * Checks whether a query affirmatively reported that nothing matched.
117
+ *
118
+ * Only a **filtered** query can say that: a whole-host listing always has rows,
119
+ * so an empty one is never an answer. A filtered query that printed nothing at
120
+ * all is not an answer either — silence and "no emulator is running" must stay
121
+ * distinguishable, or a failed query reads as a host with no emulator on it.
122
+ *
123
+ * @param params - The query and its stdout.
124
+ * @returns Whether the query's output carries its own no-match notice.
125
+ */
126
+ export declare function checkIsNoMatchReported(params: CheckIsNoMatchReportedParams): boolean;
127
+ /**
128
+ * Parses the output of one of {@link buildEmulatorProcessQueries}' commands.
129
+ *
130
+ * @param params - The query and its stdout.
131
+ * @returns One entry per parsable row, in listed order.
132
+ */
133
+ export declare function parseEmulatorProcessQueryOutput(params: ParseEmulatorProcessQueryOutputParams): ProcessListEntry[];
53
134
  /**
54
135
  * Parses `ps -eo pid=,comm=` output.
55
136
  *
@@ -1,7 +1,22 @@
1
1
  const EMULATOR_BACKEND_NAME_PATTERN = /^(?:emulator|emulator64-[\w.-]+|qemu-system-[\w.-]+)$/;
2
+ const EMULATOR_IMAGE_NAME_PREFIXES = ["emulator", "qemu-system"];
3
+ const TASK_LIST_NO_MATCH_NOTICE_PATTERN = /^INFO: /m;
2
4
  const EXECUTABLE_SUFFIX_PATTERN = /\.exe$/;
3
5
  const RADIX_DECIMAL = 10;
4
6
  const TASK_LIST_FIELDS_READ = 2;
7
+ function buildEmulatorProcessQueries(platform) {
8
+ return platform === "win32" ? EMULATOR_IMAGE_NAME_PREFIXES.map((prefix) => ({
9
+ command: "tasklist",
10
+ commandArguments: ["/FO", "CSV", "/NH", "/FI", `IMAGENAME eq ${prefix}*`],
11
+ isFiltered: true
12
+ })) : [{ command: "ps", commandArguments: ["-eo", "pid=,comm="], isFiltered: false }];
13
+ }
14
+ function checkIsNoMatchReported(params) {
15
+ return params.query.isFiltered && TASK_LIST_NO_MATCH_NOTICE_PATTERN.test(params.output);
16
+ }
17
+ function parseEmulatorProcessQueryOutput(params) {
18
+ return params.query.command === "tasklist" ? parseWindowsTaskList(params.output) : parsePosixProcessList(params.output);
19
+ }
5
20
  function parsePosixProcessList(processListOutput) {
6
21
  const entries = [];
7
22
  for (const rawLine of processListOutput.split("\n")) {
@@ -38,8 +53,11 @@ function checkIsEmulatorBackendName(name) {
38
53
  return EMULATOR_BACKEND_NAME_PATTERN.test(baseName.toLowerCase().replace(EXECUTABLE_SUFFIX_PATTERN, ""));
39
54
  }
40
55
  export {
56
+ buildEmulatorProcessQueries,
57
+ checkIsNoMatchReported,
58
+ parseEmulatorProcessQueryOutput,
41
59
  parsePosixProcessList,
42
60
  parseWindowsTaskList,
43
61
  selectEmulatorBackendPids
44
62
  };
45
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWJhY2tlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGZpbmRpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvY2VzcyB0aGF0ICoqb3V0bGl2ZXMgdGhlIHBpZFxuICogdGhlIGhhcm5lc3Mga2lsbGVkKiouXG4gKlxuICogVW5kZXIgYC1uby13aW5kb3dgIHRoZSBlbXVsYXRvcidzIGJhY2tlbmQgcHJvY2VzcyBpc1xuICogYHFlbXUtc3lzdGVtLXg4Nl82NC1oZWFkbGVzc2AgKGBxZW11LXN5c3RlbS14ODZfNjRgIHdoZW4gd2luZG93ZWQpLCBub3QgdGhlXG4gKiBgZW11bGF0b3JgIGxhdW5jaGVyIHRoZSBoYXJuZXNzIHNwYXduZWQgYW5kIGhvbGRzIGEgYENoaWxkUHJvY2Vzc2AgZm9yLiBUaGVcbiAqIGxhdW5jaGVyIGV4aXRzIG9yIGlzIGtpbGxlZCwgYW5kIHRoZSBiYWNrZW5kIGlzIHdoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIEFWRCdzXG4gKiBgbXVsdGlpbnN0YW5jZS5sb2NrYCBhbmQgdGhlIGNvbnNvbGUvYWRiIHBvcnRzIFx1MjAxNCBzbyBgdGFza2tpbGwgL0YgL1RgIGFnYWluc3RcbiAqIHRoZSBsYXVuY2hlcidzIHBpZCByZXBvcnRzIHN1Y2Nlc3Mgd2hpbGUgdGhlIGVtdWxhdG9yIGtlZXBzIHJ1bm5pbmcuIEV2ZXJ5XG4gKiBsYXRlciBydW4gYWdhaW5zdCB0aGF0IEFWRCB0aGVuIGRpZXMgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGVcbiAqIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCwgd2hpY2ggbmV2ZXIgcmVhY2hlcyB0aGUgdXNlciBiZWNhdXNlIHRoZVxuICogZW11bGF0b3Igd3JpdGVzIGl0IHRvIGl0cyBvd24gc3Rkb3V0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBmaWx0ZXIgXHUyMDE0IGAtTmFtZSBxZW11LXN5c3RlbS14ODZfNjRgIC8gbWF0Y2hpbmcgdGhhdFxuICogZXhhY3QgaW1hZ2UgbmFtZSBcdTIwMTQgZG9lcyAqKm5vdCoqIG1hdGNoIHRoZSBgLWhlYWRsZXNzYCBidWlsZCwgd2hpY2ggaXMgaG93IHRoZVxuICogbGVmdG92ZXIgc3RheXMgaW52aXNpYmxlIHRocm91Z2ggc2V2ZXJhbCByb3VuZHMgb2YgXCJubyBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgYSAqKnByZS1sYXVuY2ggc25hcHNob3QqKjogYSBiYWNrZW5kIGFscmVhZHkgcnVubmluZ1xuICogYmVmb3JlIHRoaXMgcnVuIHN0YXJ0ZWQgaXRzIG93biBiZWxvbmdzIHRvIHNvbWVib2R5IGVsc2UgKGFub3RoZXIgQVZELCBvciBvbmVcbiAqIHRoZSB1c2VyIGJvb3RlZCBieSBoYW5kKSBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZVxuICogaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCB0aGUgc2VsZWN0aW9uIHN0YXlcbiAqIHVuaXQtdGVzdGFibGUuXG4gKi9cblxuLyoqXG4gKiBPbmUgcHJvY2VzcyBmcm9tIGEgaG9zdCBwcm9jZXNzIGxpc3RpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0xpc3RFbnRyeSB7XG4gIC8qKlxuICBUaGUgcHJvY2Vzcy9pbWFnZSBuYW1lLCBhcyB0aGUgcGxhdGZvcm0ncyBsaXN0aW5nIHJlcG9ydHMgaXQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwcm9jZXNzIElELlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMge1xuICAvKipcbiAgRW11bGF0b3IgYmFja2VuZCBQSURzIHNlZW4gKipiZWZvcmUqKiB0aGlzIHJ1biBsYXVuY2hlZCBpdHMgZW11bGF0b3IsIHdoaWNoIGl0IHRoZXJlZm9yZSBkb2VzIG5vdCBvd24uXG4gICAqL1xuICByZWFkb25seSBrbm93blBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBUaGUgaG9zdCdzIGN1cnJlbnQgcHJvY2VzcyBsaXN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzTGlzdEVudHJ5W107XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZW11bGF0b3IgbGF1bmNoZXIgYW5kIGJvdGggUUVNVSBiYWNrZW5kIGJ1aWxkcyBcdTIwMTQgY3J1Y2lhbGx5XG4gKiBpbmNsdWRpbmcgdGhlIGAtaGVhZGxlc3NgIHN1ZmZpeCBgLW5vLXdpbmRvd2AgcnVucyBwcm9kdWNlLlxuICovXG5jb25zdCBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTiA9IC9eKD86ZW11bGF0b3J8ZW11bGF0b3I2NC1bXFx3Li1dK3xxZW11LXN5c3RlbS1bXFx3Li1dKykkLztcbmNvbnN0IEVYRUNVVEFCTEVfU1VGRklYX1BBVFRFUk4gPSAvXFwuZXhlJC87XG5jb25zdCBSQURJWF9ERUNJTUFMID0gMTA7XG4vKipcbiAqIE9ubHkgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgYXJlIHJlYWQsIHNvIHRoZSBzcGxpdCBzdG9wcyBhZnRlciB0aGVtLlxuICovXG5jb25zdCBUQVNLX0xJU1RfRklFTERTX1JFQUQgPSAyO1xuXG4vKipcbiAqIFBhcnNlcyBgcHMgLWVvIHBpZD0sY29tbT1gIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0xpc3RPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIHRoZSBgcHNgIGxpc3RpbmcuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIHBhcnNhYmxlIHJvdywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3NpeFByb2Nlc3NMaXN0KHByb2Nlc3NMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgcHJvY2Vzc0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCcgJyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGlkID0gTnVtYmVyLnBhcnNlSW50KGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLCBSQURJWF9ERUNJTUFMKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHBpZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudHJpZXMucHVzaCh7IG5hbWU6IGxpbmUuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCksIHBpZCB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBgdGFza2xpc3QgL0ZPIENTViAvTkhgIG91dHB1dC5cbiAqXG4gKiBPbmx5IHRoZSBmaXJzdCB0d28gZmllbGRzIGFyZSByZWFkIFx1MjAxNCB0aGUgaW1hZ2UgbmFtZSBhbmQgdGhlIFBJRCBcdTIwMTQgc28gdGhlXG4gKiBtZW1vcnkgY29sdW1uJ3Mgb3duIGNvbW1hcyBjYW5ub3QgY29uZnVzZSB0aGUgc3BsaXQuXG4gKlxuICogQHBhcmFtIHRhc2tMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB0aGUgYHRhc2tsaXN0YCBsaXN0aW5nLlxuICogQHJldHVybnMgT25lIGVudHJ5IHBlciBwYXJzYWJsZSByb3csIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2luZG93c1Rhc2tMaXN0KHRhc2tMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgdGFza0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgW3Jhd05hbWUgPSAnJywgcmF3UGlkID0gJyddID0gcmF3TGluZS50cmltKCkucmVwbGFjZUFsbCgnXCInLCAnJykuc3BsaXQoJywnLCBUQVNLX0xJU1RfRklFTERTX1JFQUQpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChyYXdQaWQsIFJBRElYX0RFQ0lNQUwpO1xuICAgIGlmIChyYXdOYW1lLmxlbmd0aCA9PT0gMCB8fCBOdW1iZXIuaXNOYU4ocGlkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZW50cmllcy5wdXNoKHsgbmFtZTogcmF3TmFtZSwgcGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZW11bGF0b3IgcHJvY2Vzc2VzIHRoaXMgcnVuIGlzIHJlc3BvbnNpYmxlIGZvciBraWxsaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY3VycmVudCBsaXN0aW5nIHBsdXMgdGhlIFBJRHMgdGhhdCBwcmVkYXRlIHRoaXMgcnVuJ3MgZW11bGF0b3IuXG4gKiBAcmV0dXJucyBUaGUgUElEcyBvZiBlbXVsYXRvciBwcm9jZXNzZXMgdGhpcyBydW4gb3ducywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyhwYXJhbXM6IFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMpOiBudW1iZXJbXSB7XG4gIHJldHVybiBwYXJhbXMucHJvY2Vzc2VzXG4gICAgLmZpbHRlcigoZW50cnkpID0+IGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKGVudHJ5Lm5hbWUpICYmICFwYXJhbXMua25vd25QaWRzLmluY2x1ZGVzKGVudHJ5LnBpZCkpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnBpZCk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlTmFtZSA9IG5hbWUuc2xpY2UoTWF0aC5tYXgobmFtZS5sYXN0SW5kZXhPZignLycpLCBuYW1lLmxhc3RJbmRleE9mKCdcXFxcJykpICsgMSk7XG4gIHJldHVybiBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTi50ZXN0KGJhc2VOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZShFWEVDVVRBQkxFX1NVRkZJWF9QQVRURVJOLCAnJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNkRBLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sZ0JBQWdCO0FBSXRCLE1BQU0sd0JBQXdCO0FBUXZCLFNBQVMsc0JBQXNCLG1CQUErQztBQUNuRixRQUFNLFVBQThCLENBQUM7QUFFckMsYUFBVyxXQUFXLGtCQUFrQixNQUFNLElBQUksR0FBRztBQUNuRCxVQUFNLE9BQU8sUUFBUSxLQUFLO0FBQzFCLFVBQU0saUJBQWlCLEtBQUssUUFBUSxHQUFHO0FBQ3ZDLFFBQUksbUJBQW1CLElBQUk7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNLE9BQU8sU0FBUyxLQUFLLE1BQU0sR0FBRyxjQUFjLEdBQUcsYUFBYTtBQUN4RSxRQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUc7QUFDckI7QUFBQSxJQUNGO0FBRUEsWUFBUSxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0saUJBQWlCLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQUEsRUFDbkU7QUFFQSxTQUFPO0FBQ1Q7QUFXTyxTQUFTLHFCQUFxQixnQkFBNEM7QUFDL0UsUUFBTSxVQUE4QixDQUFDO0FBRXJDLGFBQVcsV0FBVyxlQUFlLE1BQU0sSUFBSSxHQUFHO0FBQ2hELFVBQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLElBQUksUUFBUSxLQUFLLEVBQUUsV0FBVyxLQUFLLEVBQUUsRUFBRSxNQUFNLEtBQUsscUJBQXFCO0FBQ3ZHLFVBQU0sTUFBTSxPQUFPLFNBQVMsUUFBUSxhQUFhO0FBQ2pELFFBQUksUUFBUSxXQUFXLEtBQUssT0FBTyxNQUFNLEdBQUcsR0FBRztBQUM3QztBQUFBLElBQ0Y7QUFFQSxZQUFRLEtBQUssRUFBRSxNQUFNLFNBQVMsSUFBSSxDQUFDO0FBQUEsRUFDckM7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDBCQUEwQixRQUFtRDtBQUMzRixTQUFPLE9BQU8sVUFDWCxPQUFPLENBQUMsVUFBVSwyQkFBMkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLFVBQVUsU0FBUyxNQUFNLEdBQUcsQ0FBQyxFQUNqRyxJQUFJLENBQUMsVUFBVSxNQUFNLEdBQUc7QUFDN0I7QUFFQSxTQUFTLDJCQUEyQixNQUF1QjtBQUN6RCxRQUFNLFdBQVcsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLFlBQVksR0FBRyxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZGLFNBQU8sOEJBQThCLEtBQUssU0FBUyxZQUFZLEVBQUUsUUFBUSwyQkFBMkIsRUFBRSxDQUFDO0FBQ3pHOyIsCiAgIm5hbWVzIjogW10KfQo=
63
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWJhY2tlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGZpbmRpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvY2VzcyB0aGF0ICoqb3V0bGl2ZXMgdGhlIHBpZFxuICogdGhlIGhhcm5lc3Mga2lsbGVkKiouXG4gKlxuICogVW5kZXIgYC1uby13aW5kb3dgIHRoZSBlbXVsYXRvcidzIGJhY2tlbmQgcHJvY2VzcyBpc1xuICogYHFlbXUtc3lzdGVtLXg4Nl82NC1oZWFkbGVzc2AgKGBxZW11LXN5c3RlbS14ODZfNjRgIHdoZW4gd2luZG93ZWQpLCBub3QgdGhlXG4gKiBgZW11bGF0b3JgIGxhdW5jaGVyIHRoZSBoYXJuZXNzIHNwYXduZWQgYW5kIGhvbGRzIGEgYENoaWxkUHJvY2Vzc2AgZm9yLiBUaGVcbiAqIGxhdW5jaGVyIGV4aXRzIG9yIGlzIGtpbGxlZCwgYW5kIHRoZSBiYWNrZW5kIGlzIHdoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIEFWRCdzXG4gKiBgbXVsdGlpbnN0YW5jZS5sb2NrYCBhbmQgdGhlIGNvbnNvbGUvYWRiIHBvcnRzIFx1MjAxNCBzbyBgdGFza2tpbGwgL0YgL1RgIGFnYWluc3RcbiAqIHRoZSBsYXVuY2hlcidzIHBpZCByZXBvcnRzIHN1Y2Nlc3Mgd2hpbGUgdGhlIGVtdWxhdG9yIGtlZXBzIHJ1bm5pbmcuIEV2ZXJ5XG4gKiBsYXRlciBydW4gYWdhaW5zdCB0aGF0IEFWRCB0aGVuIGRpZXMgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGVcbiAqIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCwgd2hpY2ggbmV2ZXIgcmVhY2hlcyB0aGUgdXNlciBiZWNhdXNlIHRoZVxuICogZW11bGF0b3Igd3JpdGVzIGl0IHRvIGl0cyBvd24gc3Rkb3V0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBmaWx0ZXIgXHUyMDE0IGAtTmFtZSBxZW11LXN5c3RlbS14ODZfNjRgIC8gbWF0Y2hpbmcgdGhhdFxuICogZXhhY3QgaW1hZ2UgbmFtZSBcdTIwMTQgZG9lcyAqKm5vdCoqIG1hdGNoIHRoZSBgLWhlYWRsZXNzYCBidWlsZCwgd2hpY2ggaXMgaG93IHRoZVxuICogbGVmdG92ZXIgc3RheXMgaW52aXNpYmxlIHRocm91Z2ggc2V2ZXJhbCByb3VuZHMgb2YgXCJubyBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgYSAqKnByZS1sYXVuY2ggc25hcHNob3QqKjogYSBiYWNrZW5kIGFscmVhZHkgcnVubmluZ1xuICogYmVmb3JlIHRoaXMgcnVuIHN0YXJ0ZWQgaXRzIG93biBiZWxvbmdzIHRvIHNvbWVib2R5IGVsc2UgKGFub3RoZXIgQVZELCBvciBvbmVcbiAqIHRoZSB1c2VyIGJvb3RlZCBieSBoYW5kKSBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZVxuICogaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCB0aGUgc2VsZWN0aW9uIHN0YXlcbiAqIHVuaXQtdGVzdGFibGUuXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tJc05vTWF0Y2hSZXBvcnRlZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tJc05vTWF0Y2hSZXBvcnRlZFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgcXVlcnkncyBzdGRvdXQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHF1ZXJ5IHRoYXQgcHJvZHVjZWQgaXQuXG4gICAqL1xuICByZWFkb25seSBxdWVyeTogRW11bGF0b3JQcm9jZXNzUXVlcnk7XG59XG5cbi8qKlxuICogT25lIGNvbW1hbmQgdGhhdCBsaXN0cyAoc29tZSBvZikgdGhlIGhvc3QncyBlbXVsYXRvciBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW11bGF0b3JQcm9jZXNzUXVlcnkge1xuICAvKipcbiAgVGhlIGV4ZWN1dGFibGUuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gIEl0cyBhcmd1bWVudHMuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgV2hldGhlciB0aGUgY29tbWFuZCBhc2tzIG9ubHkgZm9yIGVtdWxhdG9yIGltYWdlIG5hbWVzIHJhdGhlciB0aGFuIGZvciBldmVyeSBwcm9jZXNzIG9uIHRoZSBob3N0IFx1MjAxNCB3aGljaCBpcyB3aGF0IG1ha2VzIGFuIGVtcHR5IGFuc3dlciBsZWdpdGltYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGaWx0ZXJlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcGFyc2VFbXVsYXRvclByb2Nlc3NRdWVyeU91dHB1dH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VFbXVsYXRvclByb2Nlc3NRdWVyeU91dHB1dFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgcXVlcnkncyBzdGRvdXQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHF1ZXJ5IHRoYXQgcHJvZHVjZWQgaXQuXG4gICAqL1xuICByZWFkb25seSBxdWVyeTogRW11bGF0b3JQcm9jZXNzUXVlcnk7XG59XG5cbi8qKlxuICogT25lIHByb2Nlc3MgZnJvbSBhIGhvc3QgcHJvY2VzcyBsaXN0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NMaXN0RW50cnkge1xuICAvKipcbiAgVGhlIHByb2Nlc3MvaW1hZ2UgbmFtZSwgYXMgdGhlIHBsYXRmb3JtJ3MgbGlzdGluZyByZXBvcnRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvY2VzcyBJRC5cbiAgICovXG4gIHJlYWRvbmx5IHBpZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzUGFyYW1zIHtcbiAgLyoqXG4gIEVtdWxhdG9yIGJhY2tlbmQgUElEcyBzZWVuICoqYmVmb3JlKiogdGhpcyBydW4gbGF1bmNoZWQgaXRzIGVtdWxhdG9yLCB3aGljaCBpdCB0aGVyZWZvcmUgZG9lcyBub3Qgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkga25vd25QaWRzOiByZWFkb25seSBudW1iZXJbXTtcblxuICAvKipcbiAgVGhlIGhvc3QncyBjdXJyZW50IHByb2Nlc3MgbGlzdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3NlczogcmVhZG9ubHkgUHJvY2Vzc0xpc3RFbnRyeVtdO1xufVxuXG4vKipcbiAqIE1hdGNoZXMgdGhlIGVtdWxhdG9yIGxhdW5jaGVyIGFuZCBib3RoIFFFTVUgYmFja2VuZCBidWlsZHMgXHUyMDE0IGNydWNpYWxseVxuICogaW5jbHVkaW5nIHRoZSBgLWhlYWRsZXNzYCBzdWZmaXggYC1uby13aW5kb3dgIHJ1bnMgcHJvZHVjZS5cbiAqL1xuY29uc3QgRU1VTEFUT1JfQkFDS0VORF9OQU1FX1BBVFRFUk4gPSAvXig/OmVtdWxhdG9yfGVtdWxhdG9yNjQtW1xcdy4tXSt8cWVtdS1zeXN0ZW0tW1xcdy4tXSspJC87XG4vKipcbiAqIFRoZSBpbWFnZS1uYW1lIHByZWZpeGVzIGB0YXNrbGlzdGAgaXMgYXNrZWQgZm9yIFx1MjAxNCBldmVyeSBuYW1lXG4gKiBgRU1VTEFUT1JfQkFDS0VORF9OQU1FX1BBVFRFUk5gIGFjY2VwdHMgc3RhcnRzIHdpdGggb25lIG9mIHRoZW0uXG4gKlxuICogT25lIGNhbGwgcGVyIHByZWZpeCwgYmVjYXVzZSBgdGFza2xpc3RgJ3MgYC9GSWAgY2xhdXNlcyBhcmUgQU5EZWQ6IHRoZXJlIGlzXG4gKiBubyB3YXkgdG8gT1IgdHdvIGltYWdlIG5hbWVzIGluIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmNvbnN0IEVNVUxBVE9SX0lNQUdFX05BTUVfUFJFRklYRVMgPSBbJ2VtdWxhdG9yJywgJ3FlbXUtc3lzdGVtJ10gYXMgY29uc3Q7XG5cbi8qKlxuICogVGhlIG5vdGljZSBgdGFza2xpc3RgIHByaW50cyBvbiBzdGRvdXQsIHdpdGggZXhpdCAwLCB3aGVuIGEgZmlsdGVyIG1hdGNoZWRcbiAqIG5vdGhpbmc6IGBJTkZPOiBObyB0YXNrcyBhcmUgcnVubmluZyB3aGljaCBtYXRjaCB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhLmBcbiAqIE9ubHkgdGhlIGBJTkZPOmAgcHJlZml4IGlzIG1hdGNoZWQ7IGEgbG9jYWxpemVkIFdpbmRvd3MgdGhhdCB3b3JkcyBpdFxuICogZGlmZmVyZW50bHkgcmVhZHMgYXMgYSBzaWxlbnQgZW1wdHkgYW5zd2VyLCB3aGljaCBpcyByZXBvcnRlZCBhcyBhIGZhaWxlZFxuICogcXVlcnkgXHUyMDE0IHRoZSBzYWZlIGRpcmVjdGlvbiwgc2luY2UgYSBmYWlsZWQgcXVlcnkga2lsbHMgbm90aGluZy5cbiAqL1xuY29uc3QgVEFTS19MSVNUX05PX01BVENIX05PVElDRV9QQVRURVJOID0gL15JTkZPOiAvbTtcbmNvbnN0IEVYRUNVVEFCTEVfU1VGRklYX1BBVFRFUk4gPSAvXFwuZXhlJC87XG5jb25zdCBSQURJWF9ERUNJTUFMID0gMTA7XG4vKipcbiAqIE9ubHkgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgYXJlIHJlYWQsIHNvIHRoZSBzcGxpdCBzdG9wcyBhZnRlciB0aGVtLlxuICovXG5jb25zdCBUQVNLX0xJU1RfRklFTERTX1JFQUQgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZHMgdGhhdCBsaXN0IHRoZSBob3N0J3MgZW11bGF0b3IgcHJvY2Vzc2VzLlxuICpcbiAqICoqT24gV2luZG93cyB0aGUgcXVlcnkgaXMgZmlsdGVyZWQgdG8gdGhlIGVtdWxhdG9yIGltYWdlIG5hbWVzLCBhbmQgdGhhdCBpcyBhXG4gKiBtZWFzdXJlZCBkZWNpc2lvbi4qKiBBIHdob2xlLWhvc3QgYHRhc2tsaXN0YCBkb2VzIHBlci1wcm9jZXNzIHdvcmsgZm9yIGV2ZXJ5XG4gKiByb3csIHNvIGl0IHBheXMgdGhlIGhvc3QncyBjb250ZW50aW9uIG9uY2UgcGVyIHByb2Nlc3M6IGR1cmluZyBhbiBlbXVsYXRvclxuICogYm9vdCBpdCBtZWFzdXJlZCBwNTAgMi45cyBhbmQgbWF4IDkyLjJzIG92ZXIgfjUzMCByb3dzLCBhbmQgd2l0aCBldmVyeSBjb3JlXG4gKiBzYXR1cmF0ZWQgb25lIGNhbGwgc3RhbGxlZCBmb3IgMTIwLjlzIFx1MjAxNCB1bnRpbCB0aGUgbG9hZCBleGl0ZWQgXHUyMDE0IHdoZXJlIHRoZVxuICogZmlsdGVyZWQgY2FsbCBuZXZlciBleGNlZWRlZCA1MDVtcyAoMjAyNi0wOS0yMywgbj04IGVhY2gpLiBUaGUgcGVyLXJvdyBjb3N0IGlzXG4gKiB3b3JrIHRoZSBmaWx0ZXIgc2tpcHMsIHNvIHRoZSBmaWx0ZXJlZCBxdWVyeSBkb2VzIG5vdCBpbmhlcml0IGl0LlxuICpcbiAqICoqT24gUE9TSVggdGhlIHdob2xlLWhvc3QgYHBzYCBpcyBrZXB0LioqIEl0IHJlYWRzIGAvcHJvY2AgYW5kIHdhcyBuZXZlclxuICogbWVhc3VyZWQgc2xvdywgYW5kIGEgd2hvbGUtaG9zdCBsaXN0aW5nIGtlZXBzIHRoZSBpbnZhcmlhbnQgdGhhdCB6ZXJvIHJvd3NcbiAqIG1lYW5zIGEgZmFpbGVkIHF1ZXJ5IFx1MjAxNCB3aGljaCBgcGdyZXBgJ3MgZXhpdCAxIG9uIG5vIG1hdGNoIHdvdWxkIG11ZGR5LlxuICpcbiAqIEBwYXJhbSBwbGF0Zm9ybSAtIFRoZSBob3N0IHBsYXRmb3JtLCBlLmcuIGBwcm9jZXNzLnBsYXRmb3JtYC5cbiAqIEByZXR1cm5zIFRoZSBxdWVyaWVzIHRvIHJ1bjsgdGhlaXIgcGFyc2VkIHJvd3MgdG9nZXRoZXIgYXJlIHRoZSBhbnN3ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVtdWxhdG9yUHJvY2Vzc1F1ZXJpZXMocGxhdGZvcm06IE5vZGVKUy5QbGF0Zm9ybSk6IEVtdWxhdG9yUHJvY2Vzc1F1ZXJ5W10ge1xuICByZXR1cm4gcGxhdGZvcm0gPT09ICd3aW4zMidcbiAgICA/IEVNVUxBVE9SX0lNQUdFX05BTUVfUFJFRklYRVMubWFwKChwcmVmaXgpID0+ICh7XG4gICAgICBjb21tYW5kOiAndGFza2xpc3QnLFxuICAgICAgY29tbWFuZEFyZ3VtZW50czogWycvRk8nLCAnQ1NWJywgJy9OSCcsICcvRkknLCBgSU1BR0VOQU1FIGVxICR7cHJlZml4fSpgXSxcbiAgICAgIGlzRmlsdGVyZWQ6IHRydWVcbiAgICB9KSlcbiAgICA6IFt7IGNvbW1hbmQ6ICdwcycsIGNvbW1hbmRBcmd1bWVudHM6IFsnLWVvJywgJ3BpZD0sY29tbT0nXSwgaXNGaWx0ZXJlZDogZmFsc2UgfV07XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBxdWVyeSBhZmZpcm1hdGl2ZWx5IHJlcG9ydGVkIHRoYXQgbm90aGluZyBtYXRjaGVkLlxuICpcbiAqIE9ubHkgYSAqKmZpbHRlcmVkKiogcXVlcnkgY2FuIHNheSB0aGF0OiBhIHdob2xlLWhvc3QgbGlzdGluZyBhbHdheXMgaGFzIHJvd3MsXG4gKiBzbyBhbiBlbXB0eSBvbmUgaXMgbmV2ZXIgYW4gYW5zd2VyLiBBIGZpbHRlcmVkIHF1ZXJ5IHRoYXQgcHJpbnRlZCBub3RoaW5nIGF0XG4gKiBhbGwgaXMgbm90IGFuIGFuc3dlciBlaXRoZXIgXHUyMDE0IHNpbGVuY2UgYW5kIFwibm8gZW11bGF0b3IgaXMgcnVubmluZ1wiIG11c3Qgc3RheVxuICogZGlzdGluZ3Vpc2hhYmxlLCBvciBhIGZhaWxlZCBxdWVyeSByZWFkcyBhcyBhIGhvc3Qgd2l0aCBubyBlbXVsYXRvciBvbiBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHF1ZXJ5IGFuZCBpdHMgc3Rkb3V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcXVlcnkncyBvdXRwdXQgY2FycmllcyBpdHMgb3duIG5vLW1hdGNoIG5vdGljZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNOb01hdGNoUmVwb3J0ZWQocGFyYW1zOiBDaGVja0lzTm9NYXRjaFJlcG9ydGVkUGFyYW1zKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXJhbXMucXVlcnkuaXNGaWx0ZXJlZCAmJiBUQVNLX0xJU1RfTk9fTUFUQ0hfTk9USUNFX1BBVFRFUk4udGVzdChwYXJhbXMub3V0cHV0KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIG91dHB1dCBvZiBvbmUgb2Yge0BsaW5rIGJ1aWxkRW11bGF0b3JQcm9jZXNzUXVlcmllc30nIGNvbW1hbmRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcXVlcnkgYW5kIGl0cyBzdGRvdXQuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIHBhcnNhYmxlIHJvdywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbXVsYXRvclByb2Nlc3NRdWVyeU91dHB1dChwYXJhbXM6IFBhcnNlRW11bGF0b3JQcm9jZXNzUXVlcnlPdXRwdXRQYXJhbXMpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICByZXR1cm4gcGFyYW1zLnF1ZXJ5LmNvbW1hbmQgPT09ICd0YXNrbGlzdCcgPyBwYXJzZVdpbmRvd3NUYXNrTGlzdChwYXJhbXMub3V0cHV0KSA6IHBhcnNlUG9zaXhQcm9jZXNzTGlzdChwYXJhbXMub3V0cHV0KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYHBzIC1lbyBwaWQ9LGNvbW09YCBvdXRwdXQuXG4gKlxuICogQHBhcmFtIHByb2Nlc3NMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB0aGUgYHBzYCBsaXN0aW5nLlxuICogQHJldHVybnMgT25lIGVudHJ5IHBlciBwYXJzYWJsZSByb3csIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG9zaXhQcm9jZXNzTGlzdChwcm9jZXNzTGlzdE91dHB1dDogc3RyaW5nKTogUHJvY2Vzc0xpc3RFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogUHJvY2Vzc0xpc3RFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIHByb2Nlc3NMaXN0T3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IGxpbmUgPSByYXdMaW5lLnRyaW0oKTtcbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignICcpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA9PT0gLTEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChsaW5lLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4KSwgUkFESVhfREVDSU1BTCk7XG4gICAgaWYgKE51bWJlci5pc05hTihwaWQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBlbnRyaWVzLnB1c2goeyBuYW1lOiBsaW5lLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSkudHJpbSgpLCBwaWQgfSk7XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuLyoqXG4gKiBQYXJzZXMgYHRhc2tsaXN0IC9GTyBDU1YgL05IYCBvdXRwdXQuXG4gKlxuICogT25seSB0aGUgZmlyc3QgdHdvIGZpZWxkcyBhcmUgcmVhZCBcdTIwMTQgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgXHUyMDE0IHNvIHRoZVxuICogbWVtb3J5IGNvbHVtbidzIG93biBjb21tYXMgY2Fubm90IGNvbmZ1c2UgdGhlIHNwbGl0LlxuICpcbiAqIEBwYXJhbSB0YXNrTGlzdE91dHB1dCAtIFJhdyBzdGRvdXQgb2YgdGhlIGB0YXNrbGlzdGAgbGlzdGluZy5cbiAqIEByZXR1cm5zIE9uZSBlbnRyeSBwZXIgcGFyc2FibGUgcm93LCBpbiBsaXN0ZWQgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdpbmRvd3NUYXNrTGlzdCh0YXNrTGlzdE91dHB1dDogc3RyaW5nKTogUHJvY2Vzc0xpc3RFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogUHJvY2Vzc0xpc3RFbnRyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIHRhc2tMaXN0T3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IFtyYXdOYW1lID0gJycsIHJhd1BpZCA9ICcnXSA9IHJhd0xpbmUudHJpbSgpLnJlcGxhY2VBbGwoJ1wiJywgJycpLnNwbGl0KCcsJywgVEFTS19MSVNUX0ZJRUxEU19SRUFEKTtcbiAgICBjb25zdCBwaWQgPSBOdW1iZXIucGFyc2VJbnQocmF3UGlkLCBSQURJWF9ERUNJTUFMKTtcbiAgICBpZiAocmF3TmFtZS5sZW5ndGggPT09IDAgfHwgTnVtYmVyLmlzTmFOKHBpZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudHJpZXMucHVzaCh7IG5hbWU6IHJhd05hbWUsIHBpZCB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFNlbGVjdHMgdGhlIGVtdWxhdG9yIHByb2Nlc3NlcyB0aGlzIHJ1biBpcyByZXNwb25zaWJsZSBmb3Iga2lsbGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGN1cnJlbnQgbGlzdGluZyBwbHVzIHRoZSBQSURzIHRoYXQgcHJlZGF0ZSB0aGlzIHJ1bidzIGVtdWxhdG9yLlxuICogQHJldHVybnMgVGhlIFBJRHMgb2YgZW11bGF0b3IgcHJvY2Vzc2VzIHRoaXMgcnVuIG93bnMsIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHMocGFyYW1zOiBTZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzUGFyYW1zKTogbnVtYmVyW10ge1xuICByZXR1cm4gcGFyYW1zLnByb2Nlc3Nlc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBjaGVja0lzRW11bGF0b3JCYWNrZW5kTmFtZShlbnRyeS5uYW1lKSAmJiAhcGFyYW1zLmtub3duUGlkcy5pbmNsdWRlcyhlbnRyeS5waWQpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5waWQpO1xufVxuXG5mdW5jdGlvbiBjaGVja0lzRW11bGF0b3JCYWNrZW5kTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZU5hbWUgPSBuYW1lLnNsaWNlKE1hdGgubWF4KG5hbWUubGFzdEluZGV4T2YoJy8nKSwgbmFtZS5sYXN0SW5kZXhPZignXFxcXCcpKSArIDEpO1xuICByZXR1cm4gRU1VTEFUT1JfQkFDS0VORF9OQU1FX1BBVFRFUk4udGVzdChiYXNlTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoRVhFQ1VUQUJMRV9TVUZGSVhfUEFUVEVSTiwgJycpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQStHQSxNQUFNLGdDQUFnQztBQVF0QyxNQUFNLCtCQUErQixDQUFDLFlBQVksYUFBYTtBQVMvRCxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLGdCQUFnQjtBQUl0QixNQUFNLHdCQUF3QjtBQW9CdkIsU0FBUyw0QkFBNEIsVUFBbUQ7QUFDN0YsU0FBTyxhQUFhLFVBQ2hCLDZCQUE2QixJQUFJLENBQUMsWUFBWTtBQUFBLElBQzlDLFNBQVM7QUFBQSxJQUNULGtCQUFrQixDQUFDLE9BQU8sT0FBTyxPQUFPLE9BQU8sZ0JBQWdCLE1BQU0sR0FBRztBQUFBLElBQ3hFLFlBQVk7QUFBQSxFQUNkLEVBQUUsSUFDQSxDQUFDLEVBQUUsU0FBUyxNQUFNLGtCQUFrQixDQUFDLE9BQU8sWUFBWSxHQUFHLFlBQVksTUFBTSxDQUFDO0FBQ3BGO0FBYU8sU0FBUyx1QkFBdUIsUUFBK0M7QUFDcEYsU0FBTyxPQUFPLE1BQU0sY0FBYyxrQ0FBa0MsS0FBSyxPQUFPLE1BQU07QUFDeEY7QUFRTyxTQUFTLGdDQUFnQyxRQUFtRTtBQUNqSCxTQUFPLE9BQU8sTUFBTSxZQUFZLGFBQWEscUJBQXFCLE9BQU8sTUFBTSxJQUFJLHNCQUFzQixPQUFPLE1BQU07QUFDeEg7QUFRTyxTQUFTLHNCQUFzQixtQkFBK0M7QUFDbkYsUUFBTSxVQUE4QixDQUFDO0FBRXJDLGFBQVcsV0FBVyxrQkFBa0IsTUFBTSxJQUFJLEdBQUc7QUFDbkQsVUFBTSxPQUFPLFFBQVEsS0FBSztBQUMxQixVQUFNLGlCQUFpQixLQUFLLFFBQVEsR0FBRztBQUN2QyxRQUFJLG1CQUFtQixJQUFJO0FBQ3pCO0FBQUEsSUFDRjtBQUVBLFVBQU0sTUFBTSxPQUFPLFNBQVMsS0FBSyxNQUFNLEdBQUcsY0FBYyxHQUFHLGFBQWE7QUFDeEUsUUFBSSxPQUFPLE1BQU0sR0FBRyxHQUFHO0FBQ3JCO0FBQUEsSUFDRjtBQUVBLFlBQVEsS0FBSyxFQUFFLE1BQU0sS0FBSyxNQUFNLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQztBQUFBLEVBQ25FO0FBRUEsU0FBTztBQUNUO0FBV08sU0FBUyxxQkFBcUIsZ0JBQTRDO0FBQy9FLFFBQU0sVUFBOEIsQ0FBQztBQUVyQyxhQUFXLFdBQVcsZUFBZSxNQUFNLElBQUksR0FBRztBQUNoRCxVQUFNLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFBRSxJQUFJLFFBQVEsS0FBSyxFQUFFLFdBQVcsS0FBSyxFQUFFLEVBQUUsTUFBTSxLQUFLLHFCQUFxQjtBQUN2RyxVQUFNLE1BQU0sT0FBTyxTQUFTLFFBQVEsYUFBYTtBQUNqRCxRQUFJLFFBQVEsV0FBVyxLQUFLLE9BQU8sTUFBTSxHQUFHLEdBQUc7QUFDN0M7QUFBQSxJQUNGO0FBRUEsWUFBUSxLQUFLLEVBQUUsTUFBTSxTQUFTLElBQUksQ0FBQztBQUFBLEVBQ3JDO0FBRUEsU0FBTztBQUNUO0FBUU8sU0FBUywwQkFBMEIsUUFBbUQ7QUFDM0YsU0FBTyxPQUFPLFVBQ1gsT0FBTyxDQUFDLFVBQVUsMkJBQTJCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxVQUFVLFNBQVMsTUFBTSxHQUFHLENBQUMsRUFDakcsSUFBSSxDQUFDLFVBQVUsTUFBTSxHQUFHO0FBQzdCO0FBRUEsU0FBUywyQkFBMkIsTUFBdUI7QUFDekQsUUFBTSxXQUFXLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxZQUFZLEdBQUcsR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQztBQUN2RixTQUFPLDhCQUE4QixLQUFLLFNBQVMsWUFBWSxFQUFFLFFBQVEsMkJBQTJCLEVBQUUsQ0FBQztBQUN6RzsiLAogICJuYW1lcyI6IFtdCn0K