obsidian-integration-testing 14.1.0 → 15.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 (114) hide show
  1. package/README.md +2 -0
  2. package/dist/lib/cjs/appium-dependencies.cjs +2 -5
  3. package/dist/lib/cjs/appium-server-marker.cjs +3 -9
  4. package/dist/lib/cjs/asar-fallback-detection.cjs +2 -5
  5. package/dist/lib/cjs/avd-probe-verdict.cjs +3 -9
  6. package/dist/lib/cjs/capture-obsidian-screenshot.cjs +9 -1
  7. package/dist/lib/cjs/capture-obsidian-screenshot.d.cts +21 -0
  8. package/dist/lib/cjs/capture-screenshot.cjs +2 -5
  9. package/dist/lib/cjs/cli.cjs +2 -5
  10. package/dist/lib/cjs/demo-vault-populate.cjs +7 -9
  11. package/dist/lib/cjs/device-setting-restore.cjs +2 -5
  12. package/dist/lib/cjs/electron-compatibility.cjs +8 -11
  13. package/dist/lib/cjs/emulator-arguments.cjs +14 -14
  14. package/dist/lib/cjs/emulator-marker.cjs +4 -13
  15. package/dist/lib/cjs/emulator-reaper.cjs +2 -5
  16. package/dist/lib/cjs/emulator-snapshot.cjs +3 -9
  17. package/dist/lib/cjs/eval-cap-exceeded-error.cjs +2 -5
  18. package/dist/lib/cjs/exec.cjs +12 -24
  19. package/dist/lib/cjs/function-expression.cjs +2 -5
  20. package/dist/lib/cjs/global-setup-core.cjs +53 -18
  21. package/dist/lib/cjs/hide-vault-name.cjs +45 -0
  22. package/dist/lib/cjs/hide-vault-name.d.cts +67 -0
  23. package/dist/lib/cjs/index.cjs +9 -1
  24. package/dist/lib/cjs/index.d.cts +6 -2
  25. package/dist/lib/cjs/installer-asset.cjs +3 -9
  26. package/dist/lib/cjs/installer-compatibility.cjs +9 -12
  27. package/dist/lib/cjs/label-screenshot.cjs +63 -4
  28. package/dist/lib/cjs/label-screenshot.d.cts +66 -2
  29. package/dist/lib/cjs/leftover-cleanup.cjs +2 -5
  30. package/dist/lib/cjs/library.cjs +1 -1
  31. package/dist/lib/cjs/mobile-input.cjs +17 -31
  32. package/dist/lib/cjs/namespace-bootstrap.cjs +3 -9
  33. package/dist/lib/cjs/obsidian-executable.cjs +2 -5
  34. package/dist/lib/cjs/obsidian-installer.cjs +3 -9
  35. package/dist/lib/cjs/obsidian-instance.cjs +1 -1
  36. package/dist/lib/cjs/obsidian-instance.d.cts +8 -0
  37. package/dist/lib/cjs/owned-instance-exit-marker.cjs +2 -5
  38. package/dist/lib/cjs/owned-instance-exited-error.cjs +13 -17
  39. package/dist/lib/cjs/process-exit-message.cjs +3 -9
  40. package/dist/lib/cjs/renderer-boot-detection.cjs +3 -9
  41. package/dist/lib/cjs/setup-lock.cjs +3 -9
  42. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  43. package/dist/lib/cjs/sharp-loader.d.cts +11 -0
  44. package/dist/lib/cjs/soft-keyboard-geometry.cjs +4 -9
  45. package/dist/lib/cjs/stale-build-detection.cjs +115 -0
  46. package/dist/lib/cjs/stale-build-detection.d.cts +108 -0
  47. package/dist/lib/cjs/stale-build-error.cjs +74 -0
  48. package/dist/lib/cjs/stale-build-error.d.cts +81 -0
  49. package/dist/lib/cjs/strict-proxy.cjs +3 -9
  50. package/dist/lib/cjs/transport-appium.cjs +3 -9
  51. package/dist/lib/cjs/transport-desktop-cdp.cjs +18 -32
  52. package/dist/lib/cjs/transport-factory.cjs +20 -25
  53. package/dist/lib/cjs/transport-options.cjs +2 -5
  54. package/dist/lib/cjs/transport-options.d.cts +36 -0
  55. package/dist/lib/cjs/vault-teardown-verdict.cjs +2 -5
  56. package/dist/lib/cjs/version-matrix.cjs +4 -13
  57. package/dist/lib/cjs/wedged-appium-server.cjs +3 -9
  58. package/dist/lib/esm/appium-dependencies.mjs +2 -5
  59. package/dist/lib/esm/appium-server-marker.mjs +3 -9
  60. package/dist/lib/esm/asar-fallback-detection.mjs +2 -5
  61. package/dist/lib/esm/avd-probe-verdict.mjs +3 -9
  62. package/dist/lib/esm/capture-obsidian-screenshot.d.mts +21 -0
  63. package/dist/lib/esm/capture-obsidian-screenshot.mjs +9 -1
  64. package/dist/lib/esm/capture-screenshot.mjs +2 -5
  65. package/dist/lib/esm/cli.mjs +2 -5
  66. package/dist/lib/esm/demo-vault-populate.mjs +7 -9
  67. package/dist/lib/esm/device-setting-restore.mjs +2 -5
  68. package/dist/lib/esm/electron-compatibility.mjs +8 -11
  69. package/dist/lib/esm/emulator-arguments.mjs +14 -14
  70. package/dist/lib/esm/emulator-marker.mjs +4 -13
  71. package/dist/lib/esm/emulator-reaper.mjs +2 -5
  72. package/dist/lib/esm/emulator-snapshot.mjs +3 -9
  73. package/dist/lib/esm/eval-cap-exceeded-error.mjs +2 -5
  74. package/dist/lib/esm/exec.mjs +12 -24
  75. package/dist/lib/esm/function-expression.mjs +2 -5
  76. package/dist/lib/esm/global-setup-core.mjs +60 -19
  77. package/dist/lib/esm/hide-vault-name.d.mts +67 -0
  78. package/dist/lib/esm/hide-vault-name.mjs +21 -0
  79. package/dist/lib/esm/index.d.mts +6 -2
  80. package/dist/lib/esm/index.mjs +8 -2
  81. package/dist/lib/esm/installer-asset.mjs +3 -9
  82. package/dist/lib/esm/installer-compatibility.mjs +9 -12
  83. package/dist/lib/esm/label-screenshot.d.mts +66 -2
  84. package/dist/lib/esm/label-screenshot.mjs +61 -3
  85. package/dist/lib/esm/leftover-cleanup.mjs +2 -5
  86. package/dist/lib/esm/library.mjs +1 -1
  87. package/dist/lib/esm/mobile-input.mjs +17 -31
  88. package/dist/lib/esm/namespace-bootstrap.mjs +3 -9
  89. package/dist/lib/esm/obsidian-executable.mjs +2 -5
  90. package/dist/lib/esm/obsidian-installer.mjs +3 -9
  91. package/dist/lib/esm/obsidian-instance.d.mts +8 -0
  92. package/dist/lib/esm/obsidian-instance.mjs +1 -1
  93. package/dist/lib/esm/owned-instance-exit-marker.mjs +2 -5
  94. package/dist/lib/esm/owned-instance-exited-error.mjs +13 -17
  95. package/dist/lib/esm/process-exit-message.mjs +3 -9
  96. package/dist/lib/esm/renderer-boot-detection.mjs +3 -9
  97. package/dist/lib/esm/setup-lock.mjs +3 -9
  98. package/dist/lib/esm/sharp-loader.d.mts +11 -0
  99. package/dist/lib/esm/sharp-loader.mjs +1 -1
  100. package/dist/lib/esm/soft-keyboard-geometry.mjs +4 -9
  101. package/dist/lib/esm/stale-build-detection.d.mts +108 -0
  102. package/dist/lib/esm/stale-build-detection.mjs +84 -0
  103. package/dist/lib/esm/stale-build-error.d.mts +81 -0
  104. package/dist/lib/esm/stale-build-error.mjs +50 -0
  105. package/dist/lib/esm/strict-proxy.mjs +3 -9
  106. package/dist/lib/esm/transport-appium.mjs +3 -9
  107. package/dist/lib/esm/transport-desktop-cdp.mjs +18 -32
  108. package/dist/lib/esm/transport-factory.mjs +20 -25
  109. package/dist/lib/esm/transport-options.d.mts +36 -0
  110. package/dist/lib/esm/transport-options.mjs +2 -5
  111. package/dist/lib/esm/vault-teardown-verdict.mjs +2 -5
  112. package/dist/lib/esm/version-matrix.mjs +4 -13
  113. package/dist/lib/esm/wedged-appium-server.mjs +3 -9
  114. package/package.json +20 -19
@@ -47,4 +47,4 @@ async function importSharp(caller) {
47
47
  0 && (module.exports = {
48
48
  importSharp
49
49
  });
50
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NoYXJwLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExhemlseSBsb2FkcyBgc2hhcnBgLCB0aGUgT1BUSU9OQUwgcGVlciBkZXBlbmRlbmN5IHRoZSBpbWFnZSBoZWxwZXJzIG5lZWQsIGFuZFxuICogZGVzY3JpYmVzIHRoZSBzbGljZSBvZiBpdHMgc3VyZmFjZSB0aGV5IHVzZS5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGBzaGFycGAnc1xuICogcGxhdGZvcm0tc3BlY2lmaWMgbmF0aXZlIGJpbmFyaWVzIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsXG4gKiB3aGVuIG9ubHkgc2NyZWVuc2hvdCBwb3N0LXByb2Nlc3NpbmcgbmVlZHMgdGhlbS4gVGhlIHR5cGUgaXMgc3RydWN0dXJhbCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhpcyBtb2R1bGUgdHlwZS1jaGVja3Mgd2l0aG91dCBgc2hhcnBgJ3Mgb3duIHR5cGVzIGJlaW5nXG4gKiByZXNvbHZhYmxlLlxuICovXG5cbi8qKlxuICogQSBsYXllciBwYXNzZWQgdG8gYHNoYXJwYCdzIGBjb21wb3NpdGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwQ29tcG9zaXRlTGF5ZXIge1xuICByZWFkb25seSBpbnB1dDogQnVmZmVyO1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBpbWFnZSBoZWxwZXJzIHVzZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcnBGYWN0b3J5ID0gKGlucHV0OiBVaW50OEFycmF5KSA9PiBTaGFycEluc3RhbmNlO1xuXG4vKipcbiAqIE9uZSBgc2hhcnBgIHBpcGVsaW5lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwSW5zdGFuY2Uge1xuICBibHVyOiAodGhpczogdm9pZCwgc2lnbWE6IG51bWJlcikgPT4gU2hhcnBJbnN0YW5jZTtcbiAgY29tcG9zaXRlOiAodGhpczogdm9pZCwgbGF5ZXJzOiBTaGFycENvbXBvc2l0ZUxheWVyW10pID0+IFNoYXJwSW5zdGFuY2U7XG4gIG1ldGFkYXRhOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxTaGFycE1ldGFkYXRhPjtcbiAgcG5nOiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmVzaXplOiAodGhpczogdm9pZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM/OiBTaGFycFJlc2l6ZU9wdGlvbnMpID0+IFNoYXJwSW5zdGFuY2U7XG4gIHRvQnVmZmVyOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxCdWZmZXI+O1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYHNoYXJwYCdzIG1ldGFkYXRhIHRoZSBpbWFnZSBoZWxwZXJzIHJlYWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcnBNZXRhZGF0YSB7XG4gIHJlYWRvbmx5IGhlaWdodD86IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgd2lkdGg/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgc2hhcnBgJ3MgcmVzaXplIG9wdGlvbnMgdGhlIGltYWdlIGhlbHBlcnMgc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwUmVzaXplT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZpdDogJ2NvdmVyJyB8ICdmaWxsJztcbn1cblxuLyoqXG4gKiBMb2FkcyBgc2hhcnBgIG9uIGRlbWFuZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGVyIC0gTmFtZSBvZiB0aGUgY2FsbGluZyBoZWxwZXIsIHNvIHRoZSBlcnJvciBzYXlzIHdoaWNoIG9uZSBuZWVkcyBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGBzaGFycGAgZmFjdG9yeS5cbiAqIEB0aHJvd3MgRXJyb3IgbmFtaW5nIHRoZSBtaXNzaW5nIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNoYXJwKGNhbGxlcjogc3RyaW5nKTogUHJvbWlzZTxTaGFycEZhY3Rvcnk+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gYHNoYXJwYCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyBpdCBtdXN0IGJlIGxvYWRlZCBsYXppbHk6IGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGl0cyBuYXRpdmUgYmluYXJpZXMgaW50byBldmVyeSBjb25zdW1lciBvZiB0aGlzIHBhY2thZ2UncyBpbmRleC5cbiAgICBjb25zdCBzaGFycE1vZHVsZSA9IGF3YWl0IGltcG9ydCgnc2hhcnAnKTtcbiAgICBjb25zdCBmYWN0b3J5OiB1bmtub3duID0gc2hhcnBNb2R1bGUuZGVmYXVsdDtcbiAgICByZXR1cm4gZmFjdG9yeSBhcyBTaGFycEZhY3Rvcnk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFJlYWNoZWQgb25seSB3aGVuIHRoZSBvcHRpb25hbCBwZWVyIGlzIGFic2VudCwgd2hpY2ggaXQgbmV2ZXIgaXMgaW4gdGhpcyBwYWNrYWdlJ3Mgb3duIHRlc3QgcnVuLiAqL1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NhbGxlcn0gbmVlZHMgdGhlIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSBcInNoYXJwXCIuIGBcbiAgICAgICAgKyAnSW5zdGFsbCBpdCBpbiB0aGUgY29uc3VtaW5nIHByb2plY3QgKG5wbSBpIC1EIHNoYXJwKS4nLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICk7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE2REEsZUFBc0IsWUFBWSxRQUF1QztBQUN2RSxNQUFJO0FBRUYsVUFBTSxjQUFjLE1BQU0sT0FBTyxPQUFPO0FBQ3hDLFVBQU0sVUFBbUIsWUFBWTtBQUNyQyxXQUFPO0FBQUEsRUFDVCxTQUFTLE9BQWdCO0FBRXZCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsR0FBRyxNQUFNO0FBQUEsTUFFVCxFQUFFLE9BQU8sTUFBTTtBQUFBLElBQ2pCO0FBQUEsRUFFRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
50
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NoYXJwLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExhemlseSBsb2FkcyBgc2hhcnBgLCB0aGUgT1BUSU9OQUwgcGVlciBkZXBlbmRlbmN5IHRoZSBpbWFnZSBoZWxwZXJzIG5lZWQsIGFuZFxuICogZGVzY3JpYmVzIHRoZSBzbGljZSBvZiBpdHMgc3VyZmFjZSB0aGV5IHVzZS5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGBzaGFycGAnc1xuICogcGxhdGZvcm0tc3BlY2lmaWMgbmF0aXZlIGJpbmFyaWVzIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsXG4gKiB3aGVuIG9ubHkgc2NyZWVuc2hvdCBwb3N0LXByb2Nlc3NpbmcgbmVlZHMgdGhlbS4gVGhlIHR5cGUgaXMgc3RydWN0dXJhbCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhpcyBtb2R1bGUgdHlwZS1jaGVja3Mgd2l0aG91dCBgc2hhcnBgJ3Mgb3duIHR5cGVzIGJlaW5nXG4gKiByZXNvbHZhYmxlLlxuICovXG5cbi8qKlxuICogQSBsYXllciBwYXNzZWQgdG8gYHNoYXJwYCdzIGBjb21wb3NpdGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwQ29tcG9zaXRlTGF5ZXIge1xuICByZWFkb25seSBpbnB1dDogQnVmZmVyO1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBpbWFnZSBoZWxwZXJzIHVzZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcnBGYWN0b3J5ID0gKGlucHV0OiBVaW50OEFycmF5KSA9PiBTaGFycEluc3RhbmNlO1xuXG4vKipcbiAqIE9uZSBgc2hhcnBgIHBpcGVsaW5lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwSW5zdGFuY2Uge1xuICBibHVyOiAodGhpczogdm9pZCwgc2lnbWE6IG51bWJlcikgPT4gU2hhcnBJbnN0YW5jZTtcbiAgY29tcG9zaXRlOiAodGhpczogdm9pZCwgbGF5ZXJzOiBTaGFycENvbXBvc2l0ZUxheWVyW10pID0+IFNoYXJwSW5zdGFuY2U7XG4gIG1ldGFkYXRhOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxTaGFycE1ldGFkYXRhPjtcbiAgcG5nOiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmVzaXplOiAodGhpczogdm9pZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM/OiBTaGFycFJlc2l6ZU9wdGlvbnMpID0+IFNoYXJwSW5zdGFuY2U7XG4gIHRvQnVmZmVyOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxCdWZmZXI+O1xuICB0cmltOiAodGhpczogdm9pZCwgb3B0aW9uczogU2hhcnBUcmltT3B0aW9ucykgPT4gU2hhcnBJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBzaGFycGAncyBtZXRhZGF0YSB0aGUgaW1hZ2UgaGVscGVycyByZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwTWV0YWRhdGEge1xuICByZWFkb25seSBoZWlnaHQ/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHdpZHRoPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYHNoYXJwYCdzIHJlc2l6ZSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFJlc2l6ZU9wdGlvbnMge1xuICByZWFkb25seSBmaXQ6ICdjb3ZlcicgfCAnZmlsbCc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgc2hhcnBgJ3MgdHJpbSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFRyaW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvdyBmYXIgYSBwaXhlbCBtYXkgZGlmZmVyIGZyb20gdGhlIHRyaW1tZWQtYXdheSBjb2xvciBiZWZvcmUgaXQgY291bnRzIGFzXG4gICAqIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMb2FkcyBgc2hhcnBgIG9uIGRlbWFuZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGVyIC0gTmFtZSBvZiB0aGUgY2FsbGluZyBoZWxwZXIsIHNvIHRoZSBlcnJvciBzYXlzIHdoaWNoIG9uZSBuZWVkcyBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGBzaGFycGAgZmFjdG9yeS5cbiAqIEB0aHJvd3MgRXJyb3IgbmFtaW5nIHRoZSBtaXNzaW5nIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNoYXJwKGNhbGxlcjogc3RyaW5nKTogUHJvbWlzZTxTaGFycEZhY3Rvcnk+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gYHNoYXJwYCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyBpdCBtdXN0IGJlIGxvYWRlZCBsYXppbHk6IGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGl0cyBuYXRpdmUgYmluYXJpZXMgaW50byBldmVyeSBjb25zdW1lciBvZiB0aGlzIHBhY2thZ2UncyBpbmRleC5cbiAgICBjb25zdCBzaGFycE1vZHVsZSA9IGF3YWl0IGltcG9ydCgnc2hhcnAnKTtcbiAgICBjb25zdCBmYWN0b3J5OiB1bmtub3duID0gc2hhcnBNb2R1bGUuZGVmYXVsdDtcbiAgICByZXR1cm4gZmFjdG9yeSBhcyBTaGFycEZhY3Rvcnk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFJlYWNoZWQgb25seSB3aGVuIHRoZSBvcHRpb25hbCBwZWVyIGlzIGFic2VudCwgd2hpY2ggaXQgbmV2ZXIgaXMgaW4gdGhpcyBwYWNrYWdlJ3Mgb3duIHRlc3QgcnVuLiAqL1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NhbGxlcn0gbmVlZHMgdGhlIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSBcInNoYXJwXCIuIGBcbiAgICAgICAgKyAnSW5zdGFsbCBpdCBpbiB0aGUgY29uc3VtaW5nIHByb2plY3QgKG5wbSBpIC1EIHNoYXJwKS4nLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICk7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5RUEsZUFBc0IsWUFBWSxRQUF1QztBQUN2RSxNQUFJO0FBRUYsVUFBTSxjQUFjLE1BQU0sT0FBTyxPQUFPO0FBQ3hDLFVBQU0sVUFBbUIsWUFBWTtBQUNyQyxXQUFPO0FBQUEsRUFDVCxTQUFTLE9BQWdCO0FBRXZCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsR0FBRyxNQUFNO0FBQUEsTUFFVCxFQUFFLE9BQU8sTUFBTTtBQUFBLElBQ2pCO0FBQUEsRUFFRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -32,6 +32,7 @@ export interface SharpInstance {
32
32
  png: (this: void) => SharpInstance;
33
33
  resize: (this: void, width: number, height: number, options?: SharpResizeOptions) => SharpInstance;
34
34
  toBuffer: (this: void) => Promise<Buffer>;
35
+ trim: (this: void, options: SharpTrimOptions) => SharpInstance;
35
36
  }
36
37
  /**
37
38
  * The subset of `sharp`'s metadata the image helpers read.
@@ -46,6 +47,16 @@ export interface SharpMetadata {
46
47
  export interface SharpResizeOptions {
47
48
  readonly fit: 'cover' | 'fill';
48
49
  }
50
+ /**
51
+ * The subset of `sharp`'s trim options the image helpers set.
52
+ */
53
+ export interface SharpTrimOptions {
54
+ /**
55
+ * How far a pixel may differ from the trimmed-away color before it counts as
56
+ * content.
57
+ */
58
+ readonly threshold: number;
59
+ }
49
60
  /**
50
61
  * Loads `sharp` on demand.
51
62
  *
@@ -35,11 +35,9 @@ function buildSoftKeyboardDiagnosticMessage(params) {
35
35
  const lines = [
36
36
  `raiseSoftKeyboard: the keyboard did not come up. Device framebuffer written to ${params.screenshotPath}.`,
37
37
  `page: innerHeight=${String(params.snapshot.innerHeight)} baselineInputTop=${formatMeasurement(baselineTop)} inputTop=${formatMeasurement(currentTop)} lift=${formatMeasurement(lift)}`,
38
- `device: ${params.inputMethodState || "(no input_method state reported)"}`
38
+ `device: ${params.inputMethodState || "(no input_method state reported)"}`,
39
+ ...lift === 0 ? ["The field did not move at all. If the device says the keyboard is showing, it was already up before the first touch \u2014 this check cannot tell that from a field that never lifts."] : []
39
40
  ];
40
- if (lift === 0) {
41
- lines.push("The field did not move at all. If the device says the keyboard is showing, it was already up before the first touch \u2014 this check cannot tell that from a field that never lifts.");
42
- }
43
41
  return lines.join("\n");
44
42
  }
45
43
  function checkIsSoftKeyboardUp(params) {
@@ -62,10 +60,7 @@ function resolveSoftKeyboardTapPoints(params) {
62
60
  const xInPixels = Math.round((inputRect.left + inputRect.width / CENTER_DIVISOR) * devicePixelRatio);
63
61
  const centerYInPixels = Math.round((inputRect.top + inputRect.height / CENTER_DIVISOR) * devicePixelRatio);
64
62
  const topOffsetInPixels = Math.round(screenY * devicePixelRatio);
65
- if (topOffsetInPixels === 0) {
66
- return [{ xInPixels, yInPixels: centerYInPixels }];
67
- }
68
- return [
63
+ return topOffsetInPixels === 0 ? [{ xInPixels, yInPixels: centerYInPixels }] : [
69
64
  { xInPixels, yInPixels: centerYInPixels + topOffsetInPixels },
70
65
  { xInPixels, yInPixels: centerYInPixels }
71
66
  ];
@@ -81,4 +76,4 @@ function formatMeasurement(value) {
81
76
  parseInputMethodState,
82
77
  resolveSoftKeyboardTapPoints
83
78
  });
84
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgYmVpbmcgdGhlIG9uZSByZWFkaW5nIHRoYXQgYW4gYWxyZWFkeS11cCBrZXlib2FyZCBhbHNvIHByb2R1Y2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gXG4gIF07XG5cbiAgaWYgKGxpZnQgPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCdUaGUgZmllbGQgZGlkIG5vdCBtb3ZlIGF0IGFsbC4gSWYgdGhlIGRldmljZSBzYXlzIHRoZSBrZXlib2FyZCBpcyBzaG93aW5nLCBpdCB3YXMgYWxyZWFkeSB1cCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoIFx1MjAxNCB0aGlzIGNoZWNrIGNhbm5vdCB0ZWxsIHRoYXQgZnJvbSBhIGZpZWxkIHRoYXQgbmV2ZXIgbGlmdHMuJyk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gaG93IGZhciB0aGUgZmllbGQgbW92ZWQuXG4gKlxuICogVGhlIHZlcmRpY3QgaXMgYSAqKmRlbHRhKio6IHRoZSBmaWVsZCBtdXN0IGhhdmUgcmlzZW4gZnJvbSB3aGVyZSBpdCBzYXQgYmVmb3JlIHRoZSB0b3VjaCwgYnkgYXQgbGVhc3RcbiAqIGBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsc2AuIE9ic2lkaWFuIE1vYmlsZSBsaWZ0cyB3aGF0ZXZlciBpcyBvbiBzY3JlZW4gdG8gbWFrZSByb29tIGZvciB0aGUgSU1FLFxuICogc28gYSBmaWVsZCB0aGF0IGhhcyBub3QgbW92ZWQgaGFzIGhhZCBubyBrZXlib2FyZCBhcnJpdmUgdW5kZXIgaXQgXHUyMDE0IHdoZXRoZXIgaXQgaXMgYSBib3R0b20tYW5jaG9yZWRcbiAqIHN1Z2dlc3RlciBvciBhIGNlbnRyZWQgbW9kYWwuXG4gKlxuICogKipUaGUgb25lIGNhc2UgdGhpcyBnZXRzIHdyb25nLCBkZWxpYmVyYXRlbHk6KiogYSBrZXlib2FyZCB0aGF0IHdhcyAqYWxyZWFkeSogdXAgYmVmb3JlIHRoZSBiYXNlbGluZSB3YXNcbiAqIHJlYWQuIFRoZSBmaWVsZCBoYXMgbm93aGVyZSBsZWZ0IHRvIGxpZnQgdG8sIHNvIHRoZSBhbnN3ZXIgaXMgYGZhbHNlYC4gTm8gYW1vdW50IG9mIGdlb21ldHJ5IHNlcGFyYXRlc1xuICogdGhhdCBmcm9tIGEgY2VudHJlZCBtb2RhbCB3aXRoIG5vIGtleWJvYXJkIFx1MjAxNCBib3RoIHJlYWQgYXMgXCJjbGVhciBvZiB0aGUgYm90dG9tIGFuZCBub3QgbW92aW5nXCIgXHUyMDE0IGFuZCBvZlxuICogdGhlIHR3byBwb3NzaWJsZSB3cm9uZyBhbnN3ZXJzLCBhIGxvdWQgYGZhbHNlYCBpcyB0aGUgb25lIHdvcnRoIGtlZXBpbmc6IGl0IGZhaWxzIGEgY2FwdHVyZSByYXRoZXIgdGhhblxuICogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2NyZWVuc2hvdCBvZiBhIGtleWJvYXJkIHRoYXQgaXMgbm90IHRoZXJlLiBSZWFkIHRoZSBiYXNlbGluZSB3aXRoIHRoZSBrZXlib2FyZFxuICogZG93biwgd2hpY2ggaXMgd2hhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICBpZiAodG9wT2Zmc2V0SW5QaXhlbHMgPT09IDApIHtcbiAgICByZXR1cm4gW3sgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyB9XTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgeyB4SW5QaXhlbHMsIHlJblBpeGVsczogY2VudGVyWUluUGl4ZWxzICsgdG9wT2Zmc2V0SW5QaXhlbHMgfSxcbiAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICBdO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBtZWFzdXJlbWVudCBmb3IgdGhlIGRpYWdub3N0aWMsIHNheWluZyBzbyByYXRoZXIgdGhhbiBwcmludGluZyBhIG51bWJlciB3aGVuIHRoZXJlIHdhcyBub25lLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtZWFzdXJlbWVudCwgb3IgYG51bGxgIHdoZW4gdGhlIGZpZWxkIHdhcyBub3Qgb24gc2NyZWVuIHRvIG1lYXN1cmUuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIHRleHQsIG9yIGAobm8gaW5wdXQpYC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TWVhc3VyZW1lbnQodmFsdWU6IG51bGwgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyAnKG5vIGlucHV0KScgOiBTdHJpbmcodmFsdWUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0tPLE1BQU0sNENBQTRDO0FBS3pELE1BQU0sNkJBQTZCO0FBS25DLE1BQU0saUJBQWlCO0FBYWhCLFNBQVMsbUNBQW1DLFFBQTBEO0FBQzNHLFFBQU0sY0FBYyxPQUFPLGlCQUFpQixXQUFXLE9BQU87QUFDOUQsUUFBTSxhQUFhLE9BQU8sU0FBUyxXQUFXLE9BQU87QUFDckQsUUFBTSxPQUFPLGdCQUFnQixRQUFRLGVBQWUsT0FBTyxPQUFPLGNBQWM7QUFFaEYsUUFBTSxRQUFRO0FBQUEsSUFDWixrRkFBa0YsT0FBTyxjQUFjO0FBQUEsSUFDdkcscUJBQXFCLE9BQU8sT0FBTyxTQUFTLFdBQVcsQ0FBQyxxQkFBcUIsa0JBQWtCLFdBQVcsQ0FBQyxhQUFhLGtCQUFrQixVQUFVLENBQUMsU0FBUyxrQkFBa0IsSUFBSSxDQUFDO0FBQUEsSUFDckwsV0FBVyxPQUFPLG9CQUFvQixrQ0FBa0M7QUFBQSxFQUMxRTtBQUVBLE1BQUksU0FBUyxHQUFHO0FBQ2QsVUFBTSxLQUFLLHVMQUFrTDtBQUFBLEVBQy9MO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQW9CTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxNQUFJLHNCQUFzQixHQUFHO0FBQzNCLFdBQU8sQ0FBQyxFQUFFLFdBQVcsV0FBVyxnQkFBZ0IsQ0FBQztBQUFBLEVBQ25EO0FBRUEsU0FBTztBQUFBLElBQ0wsRUFBRSxXQUFXLFdBQVcsa0JBQWtCLGtCQUFrQjtBQUFBLElBQzVELEVBQUUsV0FBVyxXQUFXLGdCQUFnQjtBQUFBLEVBQzFDO0FBQ0Y7QUFRQSxTQUFTLGtCQUFrQixPQUE4QjtBQUN2RCxTQUFPLFVBQVUsT0FBTyxlQUFlLE9BQU8sS0FBSztBQUNyRDsiLAogICJuYW1lcyI6IFtdCn0K
79
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgYmVpbmcgdGhlIG9uZSByZWFkaW5nIHRoYXQgYW4gYWxyZWFkeS11cCBrZXlib2FyZCBhbHNvIHByb2R1Y2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gLFxuICAgIC4uLihsaWZ0ID09PSAwID8gWydUaGUgZmllbGQgZGlkIG5vdCBtb3ZlIGF0IGFsbC4gSWYgdGhlIGRldmljZSBzYXlzIHRoZSBrZXlib2FyZCBpcyBzaG93aW5nLCBpdCB3YXMgYWxyZWFkeSB1cCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoIFx1MjAxNCB0aGlzIGNoZWNrIGNhbm5vdCB0ZWxsIHRoYXQgZnJvbSBhIGZpZWxkIHRoYXQgbmV2ZXIgbGlmdHMuJ10gOiBbXSlcbiAgXTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gaG93IGZhciB0aGUgZmllbGQgbW92ZWQuXG4gKlxuICogVGhlIHZlcmRpY3QgaXMgYSAqKmRlbHRhKio6IHRoZSBmaWVsZCBtdXN0IGhhdmUgcmlzZW4gZnJvbSB3aGVyZSBpdCBzYXQgYmVmb3JlIHRoZSB0b3VjaCwgYnkgYXQgbGVhc3RcbiAqIGBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsc2AuIE9ic2lkaWFuIE1vYmlsZSBsaWZ0cyB3aGF0ZXZlciBpcyBvbiBzY3JlZW4gdG8gbWFrZSByb29tIGZvciB0aGUgSU1FLFxuICogc28gYSBmaWVsZCB0aGF0IGhhcyBub3QgbW92ZWQgaGFzIGhhZCBubyBrZXlib2FyZCBhcnJpdmUgdW5kZXIgaXQgXHUyMDE0IHdoZXRoZXIgaXQgaXMgYSBib3R0b20tYW5jaG9yZWRcbiAqIHN1Z2dlc3RlciBvciBhIGNlbnRyZWQgbW9kYWwuXG4gKlxuICogKipUaGUgb25lIGNhc2UgdGhpcyBnZXRzIHdyb25nLCBkZWxpYmVyYXRlbHk6KiogYSBrZXlib2FyZCB0aGF0IHdhcyAqYWxyZWFkeSogdXAgYmVmb3JlIHRoZSBiYXNlbGluZSB3YXNcbiAqIHJlYWQuIFRoZSBmaWVsZCBoYXMgbm93aGVyZSBsZWZ0IHRvIGxpZnQgdG8sIHNvIHRoZSBhbnN3ZXIgaXMgYGZhbHNlYC4gTm8gYW1vdW50IG9mIGdlb21ldHJ5IHNlcGFyYXRlc1xuICogdGhhdCBmcm9tIGEgY2VudHJlZCBtb2RhbCB3aXRoIG5vIGtleWJvYXJkIFx1MjAxNCBib3RoIHJlYWQgYXMgXCJjbGVhciBvZiB0aGUgYm90dG9tIGFuZCBub3QgbW92aW5nXCIgXHUyMDE0IGFuZCBvZlxuICogdGhlIHR3byBwb3NzaWJsZSB3cm9uZyBhbnN3ZXJzLCBhIGxvdWQgYGZhbHNlYCBpcyB0aGUgb25lIHdvcnRoIGtlZXBpbmc6IGl0IGZhaWxzIGEgY2FwdHVyZSByYXRoZXIgdGhhblxuICogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2NyZWVuc2hvdCBvZiBhIGtleWJvYXJkIHRoYXQgaXMgbm90IHRoZXJlLiBSZWFkIHRoZSBiYXNlbGluZSB3aXRoIHRoZSBrZXlib2FyZFxuICogZG93biwgd2hpY2ggaXMgd2hhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICByZXR1cm4gdG9wT2Zmc2V0SW5QaXhlbHMgPT09IDBcbiAgICA/IFt7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfV1cbiAgICA6IFtcbiAgICAgIHsgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyArIHRvcE9mZnNldEluUGl4ZWxzIH0sXG4gICAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICAgIF07XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIG1lYXN1cmVtZW50IGZvciB0aGUgZGlhZ25vc3RpYywgc2F5aW5nIHNvIHJhdGhlciB0aGFuIHByaW50aW5nIGEgbnVtYmVyIHdoZW4gdGhlcmUgd2FzIG5vbmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG1lYXN1cmVtZW50LCBvciBgbnVsbGAgd2hlbiB0aGUgZmllbGQgd2FzIG5vdCBvbiBzY3JlZW4gdG8gbWVhc3VyZS5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgYXMgdGV4dCwgb3IgYChubyBpbnB1dClgLlxuICovXG5mdW5jdGlvbiBmb3JtYXRNZWFzdXJlbWVudCh2YWx1ZTogbnVsbCB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/ICcobm8gaW5wdXQpJyA6IFN0cmluZyh2YWx1ZSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrS08sTUFBTSw0Q0FBNEM7QUFLekQsTUFBTSw2QkFBNkI7QUFLbkMsTUFBTSxpQkFBaUI7QUFhaEIsU0FBUyxtQ0FBbUMsUUFBMEQ7QUFDM0csUUFBTSxjQUFjLE9BQU8saUJBQWlCLFdBQVcsT0FBTztBQUM5RCxRQUFNLGFBQWEsT0FBTyxTQUFTLFdBQVcsT0FBTztBQUNyRCxRQUFNLE9BQU8sZ0JBQWdCLFFBQVEsZUFBZSxPQUFPLE9BQU8sY0FBYztBQUVoRixRQUFNLFFBQVE7QUFBQSxJQUNaLGtGQUFrRixPQUFPLGNBQWM7QUFBQSxJQUN2RyxxQkFBcUIsT0FBTyxPQUFPLFNBQVMsV0FBVyxDQUFDLHFCQUFxQixrQkFBa0IsV0FBVyxDQUFDLGFBQWEsa0JBQWtCLFVBQVUsQ0FBQyxTQUFTLGtCQUFrQixJQUFJLENBQUM7QUFBQSxJQUNyTCxXQUFXLE9BQU8sb0JBQW9CLGtDQUFrQztBQUFBLElBQ3hFLEdBQUksU0FBUyxJQUFJLENBQUMsdUxBQWtMLElBQUksQ0FBQztBQUFBLEVBQzNNO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQW9CTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxTQUFPLHNCQUFzQixJQUN6QixDQUFDLEVBQUUsV0FBVyxXQUFXLGdCQUFnQixDQUFDLElBQzFDO0FBQUEsSUFDQSxFQUFFLFdBQVcsV0FBVyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDNUQsRUFBRSxXQUFXLFdBQVcsZ0JBQWdCO0FBQUEsRUFDMUM7QUFDSjtBQVFBLFNBQVMsa0JBQWtCLE9BQThCO0FBQ3ZELFNBQU8sVUFBVSxPQUFPLGVBQWUsT0FBTyxLQUFLO0FBQ3JEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var stale_build_detection_exports = {};
30
+ __export(stale_build_detection_exports, {
31
+ ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME: () => ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME,
32
+ checkIsBuildStale: () => checkIsBuildStale,
33
+ checkIsSourceFileName: () => checkIsSourceFileName,
34
+ findNewestSourceModification: () => findNewestSourceModification,
35
+ willFailOnStaleBuild: () => willFailOnStaleBuild
36
+ });
37
+ module.exports = __toCommonJS(stale_build_detection_exports);
38
+ var import_promises = require("node:fs/promises");
39
+ var import_node_path = require("node:path");
40
+ var import_node_process = __toESM(require("node:process"), 1);
41
+ const ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME = "OBSIDIAN_TEST_ALLOW_STALE_BUILD";
42
+ const ROOT_SOURCE_FILE_NAMES = ["manifest.json", "styles.css"];
43
+ const SOURCE_DIRECTORY_NAME = "src";
44
+ const EXCLUDED_DIRECTORY_NAMES = /* @__PURE__ */ new Set([".git", "node_modules"]);
45
+ function checkIsBuildStale(params) {
46
+ const { buildModifiedAtInMilliseconds, newestSource } = params;
47
+ return newestSource ? newestSource.modifiedAtInMilliseconds > buildModifiedAtInMilliseconds : false;
48
+ }
49
+ function checkIsSourceFileName(fileName) {
50
+ return !fileName.includes(".test.");
51
+ }
52
+ async function findNewestSourceModification(projectRoot) {
53
+ const paths = [
54
+ ...await listSourcePaths((0, import_node_path.join)(projectRoot, SOURCE_DIRECTORY_NAME)),
55
+ ...ROOT_SOURCE_FILE_NAMES.map((fileName) => (0, import_node_path.join)(projectRoot, fileName))
56
+ ];
57
+ let newestSource;
58
+ for (const path of paths) {
59
+ const modifiedAtInMilliseconds = await readModifiedAtInMilliseconds(path);
60
+ if (modifiedAtInMilliseconds === void 0 || newestSource && newestSource.modifiedAtInMilliseconds >= modifiedAtInMilliseconds) {
61
+ continue;
62
+ }
63
+ newestSource = {
64
+ modifiedAtInMilliseconds,
65
+ path: (0, import_node_path.relative)(projectRoot, path).split(import_node_path.sep).join("/")
66
+ };
67
+ }
68
+ return newestSource;
69
+ }
70
+ function willFailOnStaleBuild(options) {
71
+ return checkIsStaleBuildAllowedByEnvironment() ? false : options?.shouldFailOnStaleBuild ?? true;
72
+ }
73
+ function checkIsStaleBuildAllowedByEnvironment() {
74
+ const value = import_node_process.default.env[ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME]?.trim().toLowerCase() ?? "";
75
+ return value !== "" && value !== "0" && value !== "false";
76
+ }
77
+ async function listSourcePaths(directory) {
78
+ let entries;
79
+ try {
80
+ entries = await (0, import_promises.readdir)(directory, { withFileTypes: true });
81
+ } catch {
82
+ return [];
83
+ }
84
+ const paths = [];
85
+ for (const entry of entries) {
86
+ const path = (0, import_node_path.join)(directory, entry.name);
87
+ if (entry.isDirectory()) {
88
+ if (!EXCLUDED_DIRECTORY_NAMES.has(entry.name)) {
89
+ paths.push(...await listSourcePaths(path));
90
+ }
91
+ continue;
92
+ }
93
+ if (checkIsSourceFileName(entry.name)) {
94
+ paths.push(path);
95
+ }
96
+ }
97
+ return paths;
98
+ }
99
+ async function readModifiedAtInMilliseconds(path) {
100
+ try {
101
+ const stats = await (0, import_promises.stat)(path);
102
+ return stats.mtimeMs;
103
+ } catch {
104
+ return void 0;
105
+ }
106
+ }
107
+ // Annotate the CommonJS export names for ESM import in node:
108
+ 0 && (module.exports = {
109
+ ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME,
110
+ checkIsBuildStale,
111
+ checkIsSourceFileName,
112
+ findNewestSourceModification,
113
+ willFailOnStaleBuild
114
+ });
115
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YWxlLWJ1aWxkLWRldGVjdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlY2lkZXMgd2hldGhlciB0aGUgYGRpc3QvYCBmb2xkZXIgdGhlIGdsb2JhbCBzZXR1cCBpcyBhYm91dCB0byBpbnN0YWxsXG4gKiBwcmVkYXRlcyB0aGUgc291cmNlcyBpdCB3YXMgYnVpbHQgZnJvbSwgc28gYSBydW4gY2Fubm90IHNpbGVudGx5IHRlc3QgYW4gb2xkXG4gKiBwbHVnaW4uIFNlZSB7QGxpbmsgU3RhbGVCdWlsZEVycm9yfSBmb3Igd2h5IHRoaXMgaXMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYVxuICogd2FybmluZy5cbiAqXG4gKiAqKldoYXQgY291bnRzIGFzIGEgc291cmNlLioqIEV2ZXJ5dGhpbmcgdW5kZXIgYDxwcm9qZWN0Um9vdD4vc3JjL2AgdGhhdCBpcyBub3RcbiAqIGEgdGVzdCBmaWxlLCBwbHVzIGBtYW5pZmVzdC5qc29uYCBhbmQgYHN0eWxlcy5jc3NgIGF0IHRoZSByb290IHdoZW4gdGhleSBleGlzdC5cbiAqIFRlc3QgZmlsZXMgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgdGhleSBhcmUgbm90IGJ1aWxkIGlucHV0cyBcdTIwMTQgdGhlIGJ1bmRsZXIncyBlbnRyeVxuICogZ3JhcGggc3RhcnRzIGF0IGBzcmMvbWFpbi50c2AgYW5kIG5ldmVyIHJlYWNoZXMgYSBgKi50ZXN0LnRzYCBcdTIwMTQgYW5kIGEgZ3VhcmRcbiAqIHRoYXQgZmlyZXMgd2hlbiBlZGl0aW5nIGEgdGVzdCwgd2hlcmUgcmVidWlsZGluZyB3b3VsZCBjaGFuZ2Ugbm90aGluZywgaXMgYVxuICogZ3VhcmQgcGVvcGxlIGxlYXJuIHRvIHN3aXRjaCBvZmYuIGBwYWNrYWdlLmpzb25gIGlzIGV4Y2x1ZGVkIGZvciB0aGUgc2FtZVxuICogcmVhc29uIGZyb20gdGhlIG90aGVyIHNpZGU6IGl0IGlzIGVkaXRlZCBmb3Igc2NyaXB0cyBhbmQgZGVwZW5kZW5jeSByYW5nZXMgZmFyXG4gKiBtb3JlIG9mdGVuIHRoYW4gZm9yIGFueXRoaW5nIHRoYXQgcmVhY2hlcyB0aGUgYnVuZGxlLCBhbmQgdGhlIG9uZSBmaWVsZCBvZiBpdFxuICogdGhhdCBzaGlwcyBpcyByZWFkIGJhY2sgb3V0IG9mIGBtYW5pZmVzdC5qc29uYCBhbnl3YXkuXG4gKlxuICogKiptdGltZSwgbm90IGNvbnRlbnQuKiogQSBgZ2l0IHN3aXRjaGAgcmV3cml0ZXMgbXRpbWVzIHdpdGhvdXQgY2hhbmdpbmdcbiAqIGNvbnRlbnQsIHNvIGEgYnJhbmNoIHN3aXRjaCBjYW4gcmVwb3J0IGEgc3RhbGUgYnVpbGQgYWdhaW5zdCBhIGBkaXN0L2AgdGhhdFxuICogd291bGQgaGFzaCBpZGVudGljYWxseS4gVGhhdCBkaXJlY3Rpb24gaXMgZGVsaWJlcmF0ZTogdGhlIHJlbWVkeSBpcyBhIHJlYnVpbGQsXG4gKiB3aGljaCBpcyB3aGF0IHRoZSByZWFkZXIgd2FudGVkIGFmdGVyIHN3aXRjaGluZyBicmFuY2hlcyBhbnl3YXksIGFuZCB0aGVcbiAqIGFsdGVybmF0aXZlIFx1MjAxNCBoYXNoaW5nIHRoZSBlbnRyeSBncmFwaCBcdTIwMTQgbmVlZHMgdGhlIGJ1bmRsZXIncyBvd24gaW5wdXQgbGlzdCxcbiAqIHdoaWNoIHRoZSBoYXJuZXNzIGRvZXMgbm90IGhhdmUgYW5kIGNhbm5vdCBnZXQgZnJvbSBgbWFpbi5qc2AgaW4gYm90aCB0aGVcbiAqIGBkZXZgIGFuZCBgYnVpbGRgIHNoYXBlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpcmVudCB9IGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQge1xuICByZWFkZGlyLFxuICBzdGF0XG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmUsXG4gIHNlcFxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgZG93bmdyYWRlcyBhIHN0YWxlLWJ1aWxkIGZhaWx1cmUgdG8gYSB3YXJuaW5nXG4gKiBmb3IgYSBzaW5nbGUgcnVuLlxuICpcbiAqIFRoZSB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zLnNob3VsZEZhaWxPblN0YWxlQnVpbGR9IG9wdGlvbiBjYW5ub3Qgc2VydmVcbiAqIHRoYXQgY2FzZSBvbiBpdHMgb3duOiBpdCBsaXZlcyBpbiBhIHRyYWNrZWQgY29uZmlnIGZpbGUsIHNvIGEgb25lLW9mZlxuICogXCJ0ZXN0IHdoYXQgaXMgaW4gYGRpc3QvYCByaWdodCBub3dcIiBydW4gd291bGQgbmVlZCBhbiBlZGl0IGFuZCBhIHJldmVydCBcdTIwMTQgd2hpY2hcbiAqIGlzIGhvdyBhIGd1YXJkIGVuZHMgdXAgc3dpdGNoZWQgb2ZmIHBlcm1hbmVudGx5IGJ5IGFjY2lkZW50LlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dfU1RBTEVfQlVJTERfRU5WSVJPTk1FTlRfVkFSSUFCTEVfTkFNRSA9ICdPQlNJRElBTl9URVNUX0FMTE9XX1NUQUxFX0JVSUxEJztcblxuLyoqXG4gKiBSb290LWxldmVsIGZpbGVzIHRoZSBwbHVnaW4gYnVpbGQgcmVhZHMgYmVzaWRlcyBgc3JjL2AuXG4gKi9cbmNvbnN0IFJPT1RfU09VUkNFX0ZJTEVfTkFNRVMgPSBbJ21hbmlmZXN0Lmpzb24nLCAnc3R5bGVzLmNzcyddO1xuXG4vKipcbiAqIFRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgcGx1Z2luJ3Mgc291cmNlcywgcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuY29uc3QgU09VUkNFX0RJUkVDVE9SWV9OQU1FID0gJ3NyYyc7XG5cbi8qKlxuICogRGlyZWN0b3J5IG5hbWVzIG5ldmVyIGRlc2NlbmRlZCBpbnRvIHdoaWxlIGxvb2tpbmcgZm9yIHNvdXJjZXMuIE5laXRoZXJcbiAqIGJlbG9uZ3MgdG8gYSBwbHVnaW4ncyBvd24gYHNyYy9gLCBidXQgYm90aCB0dXJuIHVwIGluIHJlcG9zIHRoYXQgdmVuZG9yIG9yXG4gKiBnZW5lcmF0ZSBpbnRvIGl0LCBhbmQgZWl0aGVyIHdvdWxkIG1ha2UgdGhlIHdhbGsgYXJiaXRyYXJpbHkgZXhwZW5zaXZlLlxuICovXG5jb25zdCBFWENMVURFRF9ESVJFQ1RPUllfTkFNRVMgPSBuZXcgU2V0KFsnLmdpdCcsICdub2RlX21vZHVsZXMnXSk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSXNCdWlsZFN0YWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0lzQnVpbGRTdGFsZVBhcmFtcyB7XG4gIC8qKlxuICBXaGVuIGBtYWluLmpzYCBpbiB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyIHdhcyBsYXN0IHdyaXR0ZW4sIGluIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBuZXdlc3Qgc291cmNlIGZvdW5kLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwcm9qZWN0IGhhcyBub25lIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IG5ld2VzdFNvdXJjZTogU291cmNlTW9kaWZpY2F0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9uZSBzb3VyY2UgZmlsZSBhbmQgd2hlbiBpdCBsYXN0IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlTW9kaWZpY2F0aW9uIHtcbiAgLyoqXG4gIFdoZW4gdGhlIGZpbGUgd2FzIGxhc3Qgd3JpdHRlbiwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBmaWxlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCByb290LCB3aXRoIGAvYCBzZXBhcmF0b3JzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciBhIGJ1aWxkIHByZWRhdGVzIGl0cyBzb3VyY2VzLlxuICpcbiAqIGBmYWxzZWAgd2hlbiB0aGVyZSBpcyBubyBzb3VyY2UgdG8gY29tcGFyZSBhZ2FpbnN0OiBhIHByb2plY3Qgd2hvc2Ugc291cmNlcyBkb1xuICogbm90IGxpdmUgdW5kZXIgYHNyYy9gIGlzIG5vdCBhIHByb2plY3Qgd2hvc2UgYnVpbGQgaXMgcHJvdmFibHkgb2xkLCBhbmRcbiAqIGNsYWltaW5nIHN0YWxlbmVzcyB0aGVyZSB3b3VsZCBmYWlsIGV2ZXJ5IHJ1biBvZiBpdC5cbiAqXG4gKiBTdHJpY3RseSBuZXdlciwgc28gYSBzb3VyY2Ugd3JpdHRlbiBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCBhcyB0aGUgYnVpbGQgXHUyMDE0IG9yXG4gKiBieSB0aGUgYnVpbGQgaXRzZWxmIFx1MjAxNCBpcyBub3Qgc3RhbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBidWlsZCdzIG1vZGlmaWNhdGlvbiB0aW1lIGFuZCB0aGUgbmV3ZXN0IHNvdXJjZS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBuZXdlc3Qgc291cmNlIGlzIG5ld2VyIHRoYW4gdGhlIGJ1aWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc0J1aWxkU3RhbGUocGFyYW1zOiBDaGVja0lzQnVpbGRTdGFsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzLCBuZXdlc3RTb3VyY2UgfSA9IHBhcmFtcztcbiAgcmV0dXJuIG5ld2VzdFNvdXJjZSA/IG5ld2VzdFNvdXJjZS5tb2RpZmllZEF0SW5NaWxsaXNlY29uZHMgPiBidWlsZE1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA6IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmaWxlIG5hbWUgaXMgb25lIHRoZSBidWlsZCByZWFkcy5cbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgYmFyZSBmaWxlIG5hbWUsIHdpdGhvdXQgYSBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgdW5sZXNzIGl0IGlzIGEgdGVzdCBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc1NvdXJjZUZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFmaWxlTmFtZS5pbmNsdWRlcygnLnRlc3QuJyk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG1vc3QgcmVjZW50bHkgbW9kaWZpZWQgc291cmNlIG9mIHRoZSBwbHVnaW4gYXQgYHByb2plY3RSb290YC5cbiAqXG4gKiBXYWxrcyBgc3JjL2AgcmVjdXJzaXZlbHkgYW5kIGFkZHMgdGhlIHJvb3QtbGV2ZWwgZmlsZXMgdGhlIGJ1aWxkIGFsc28gcmVhZHMuXG4gKiBBbnl0aGluZyB1bnJlYWRhYmxlIGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gdGhyb3duOiBhIGZpbGUgdGhhdCB2YW5pc2hlZFxuICogbWlkLXdhbGsgY2Fubm90IG1ha2UgYSBidWlsZCBzdGFsZSwgYW5kIHRoaXMgY2hlY2sgbXVzdCBuZXZlciBiZSB0aGUgcmVhc29uIGFcbiAqIHJ1biBmYWlscy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIG5ld2VzdCBzb3VyY2UsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kTmV3ZXN0U291cmNlTW9kaWZpY2F0aW9uKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPFNvdXJjZU1vZGlmaWNhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYXRocyA9IFtcbiAgICAuLi5hd2FpdCBsaXN0U291cmNlUGF0aHMoam9pbihwcm9qZWN0Um9vdCwgU09VUkNFX0RJUkVDVE9SWV9OQU1FKSksXG4gICAgLi4uUk9PVF9TT1VSQ0VfRklMRV9OQU1FUy5tYXAoKGZpbGVOYW1lKSA9PiBqb2luKHByb2plY3RSb290LCBmaWxlTmFtZSkpXG4gIF07XG5cbiAgbGV0IG5ld2VzdFNvdXJjZTogU291cmNlTW9kaWZpY2F0aW9uIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICBjb25zdCBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHMgPSBhd2FpdCByZWFkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzKHBhdGgpO1xuICAgIGlmICgobW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQpIHx8IChuZXdlc3RTb3VyY2UgJiYgbmV3ZXN0U291cmNlLm1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA+PSBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdlc3RTb3VyY2UgPSB7XG4gICAgICBtb2RpZmllZEF0SW5NaWxsaXNlY29uZHMsXG4gICAgICBwYXRoOiByZWxhdGl2ZShwcm9qZWN0Um9vdCwgcGF0aCkuc3BsaXQoc2VwKS5qb2luKCcvJylcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5ld2VzdFNvdXJjZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aGV0aGVyIGEgc3RhbGUgYnVpbGQgZmFpbHMgdGhlIHJ1biwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlblxuICogbmVpdGhlciBlc2NhcGUgaGF0Y2ggaXMgdXNlZC5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lucyBvdmVyIHRoZSBvcHRpb24sIGJlY2F1c2UgaXQgaXMgdGhlIG5hcnJvd2VyXG4gKiBzdGF0ZW1lbnQ6IGEgcHJvamVjdCB0aGF0IHNldHMgdGhlIG9wdGlvbiBoYXMgZGVjaWRlZCBwZXJtYW5lbnRseSwgd2hpbGUgdGhlXG4gKiB2YXJpYWJsZSBpcyBzZXQgZm9yIG9uZSBjb21tYW5kIGxpbmUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBhIHN0YWxlIGJ1aWxkIHNob3VsZCB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpbGxGYWlsT25TdGFsZUJ1aWxkKG9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2hlY2tJc1N0YWxlQnVpbGRBbGxvd2VkQnlFbnZpcm9ubWVudCgpID8gZmFsc2UgOiBvcHRpb25zPy5zaG91bGRGYWlsT25TdGFsZUJ1aWxkID8/IHRydWU7XG59XG5cbi8qKlxuICogV2hldGhlciB7QGxpbmsgQUxMT1dfU1RBTEVfQlVJTERfRU5WSVJPTk1FTlRfVkFSSUFCTEVfTkFNRX0gaXMgc2V0IHRvIHNvbWV0aGluZ1xuICogbWVhbmluZyBcInllc1wiLlxuICpcbiAqIEFuIGVtcHR5IHZhbHVlIGFuZCBhIGxpdGVyYWwgYDBgIC8gYGZhbHNlYCBjb3VudCBhcyB1bnNldCwgc28gYSBgLmVudmAgbGluZVxuICogbGVmdCBiZWhpbmQgYXMgYE9CU0lESUFOX1RFU1RfQUxMT1dfU1RBTEVfQlVJTEQ9MGAgZG9lcyBub3Qgc2lsZW50bHkga2VlcCB0aGVcbiAqIGd1YXJkIG9mZi5cbiAqXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgdmFyaWFibGUgYXNrcyBmb3IgdGhlIGd1YXJkIHRvIGJlIGRvd25ncmFkZWQuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrSXNTdGFsZUJ1aWxkQWxsb3dlZEJ5RW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbQUxMT1dfU1RBTEVfQlVJTERfRU5WSVJPTk1FTlRfVkFSSUFCTEVfTkFNRV0/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID8/ICcnO1xuICByZXR1cm4gdmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSAnMCcgJiYgdmFsdWUgIT09ICdmYWxzZSc7XG59XG5cbi8qKlxuICogTGlzdHMgZXZlcnkgc291cmNlIGZpbGUgdW5kZXIgYSBkaXJlY3RvcnksIHJlY3Vyc2l2ZWx5LlxuICpcbiAqIEEgbWlzc2luZyBvciB1bnJlYWRhYmxlIGRpcmVjdG9yeSB5aWVsZHMgbm90aGluZyBcdTIwMTQgYSBwcm9qZWN0IHdob3NlIHNvdXJjZXMgYXJlXG4gKiBlbHNld2hlcmUgaXMgbm90IGFuIGVycm9yIGhlcmUuXG4gKlxuICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHdhbGsuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aHMgb2YgdGhlIHNvdXJjZSBmaWxlcyBmb3VuZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdFNvdXJjZVBhdGhzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZW50cmllczogRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBwYXRoID0gam9pbihkaXJlY3RvcnksIGVudHJ5Lm5hbWUpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAoIUVYQ0xVREVEX0RJUkVDVE9SWV9OQU1FUy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgcGF0aHMucHVzaCguLi5hd2FpdCBsaXN0U291cmNlUGF0aHMocGF0aCkpO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1NvdXJjZUZpbGVOYW1lKGVudHJ5Lm5hbWUpKSB7XG4gICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRocztcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgZmlsZSdzIG1vZGlmaWNhdGlvbiB0aW1lLlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gc3RhdC5cbiAqIEByZXR1cm5zIFRoZSBlcG9jaCBtaWxsaXNlY29uZHMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGZpbGUgaXMgbWlzc2luZyBvciB1bnJlYWRhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5tdGltZU1zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkJBLHNCQUdPO0FBQ1AsdUJBSU87QUFDUCwwQkFBb0I7QUFhYixNQUFNLDhDQUE4QztBQUszRCxNQUFNLHlCQUF5QixDQUFDLGlCQUFpQixZQUFZO0FBSzdELE1BQU0sd0JBQXdCO0FBTzlCLE1BQU0sMkJBQTJCLG9CQUFJLElBQUksQ0FBQyxRQUFRLGNBQWMsQ0FBQztBQTZDMUQsU0FBUyxrQkFBa0IsUUFBMEM7QUFDMUUsUUFBTSxFQUFFLCtCQUErQixhQUFhLElBQUk7QUFDeEQsU0FBTyxlQUFlLGFBQWEsMkJBQTJCLGdDQUFnQztBQUNoRztBQVFPLFNBQVMsc0JBQXNCLFVBQTJCO0FBQy9ELFNBQU8sQ0FBQyxTQUFTLFNBQVMsUUFBUTtBQUNwQztBQWFBLGVBQXNCLDZCQUE2QixhQUE4RDtBQUMvRyxRQUFNLFFBQVE7QUFBQSxJQUNaLEdBQUcsTUFBTSxvQkFBZ0IsdUJBQUssYUFBYSxxQkFBcUIsQ0FBQztBQUFBLElBQ2pFLEdBQUcsdUJBQXVCLElBQUksQ0FBQyxpQkFBYSx1QkFBSyxhQUFhLFFBQVEsQ0FBQztBQUFBLEVBQ3pFO0FBRUEsTUFBSTtBQUNKLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFVBQU0sMkJBQTJCLE1BQU0sNkJBQTZCLElBQUk7QUFDeEUsUUFBSyw2QkFBNkIsVUFBZSxnQkFBZ0IsYUFBYSw0QkFBNEIsMEJBQTJCO0FBQ25JO0FBQUEsSUFDRjtBQUVBLG1CQUFlO0FBQUEsTUFDYjtBQUFBLE1BQ0EsVUFBTSwyQkFBUyxhQUFhLElBQUksRUFBRSxNQUFNLG9CQUFHLEVBQUUsS0FBSyxHQUFHO0FBQUEsSUFDdkQ7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBYU8sU0FBUyxxQkFBcUIsU0FBd0Q7QUFDM0YsU0FBTyxzQ0FBc0MsSUFBSSxRQUFRLFNBQVMsMEJBQTBCO0FBQzlGO0FBWUEsU0FBUyx3Q0FBaUQ7QUFDeEQsUUFBTSxRQUFRLG9CQUFBQSxRQUFRLElBQUksMkNBQTJDLEdBQUcsS0FBSyxFQUFFLFlBQVksS0FBSztBQUNoRyxTQUFPLFVBQVUsTUFBTSxVQUFVLE9BQU8sVUFBVTtBQUNwRDtBQVdBLGVBQWUsZ0JBQWdCLFdBQXNDO0FBQ25FLE1BQUk7QUFDSixNQUFJO0FBQ0YsY0FBVSxVQUFNLHlCQUFRLFdBQVcsRUFBRSxlQUFlLEtBQUssQ0FBQztBQUFBLEVBQzVELFFBQVE7QUFDTixXQUFPLENBQUM7QUFBQSxFQUNWO0FBRUEsUUFBTSxRQUFrQixDQUFDO0FBQ3pCLGFBQVcsU0FBUyxTQUFTO0FBQzNCLFVBQU0sV0FBTyx1QkFBSyxXQUFXLE1BQU0sSUFBSTtBQUN2QyxRQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3ZCLFVBQUksQ0FBQyx5QkFBeUIsSUFBSSxNQUFNLElBQUksR0FBRztBQUM3QyxjQUFNLEtBQUssR0FBRyxNQUFNLGdCQUFnQixJQUFJLENBQUM7QUFBQSxNQUMzQztBQUVBO0FBQUEsSUFDRjtBQUVBLFFBQUksc0JBQXNCLE1BQU0sSUFBSSxHQUFHO0FBQ3JDLFlBQU0sS0FBSyxJQUFJO0FBQUEsSUFDakI7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBUUEsZUFBZSw2QkFBNkIsTUFBMkM7QUFDckYsTUFBSTtBQUNGLFVBQU0sUUFBUSxVQUFNLHNCQUFLLElBQUk7QUFDN0IsV0FBTyxNQUFNO0FBQUEsRUFDZixRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Decides whether the `dist/` folder the global setup is about to install
5
+ * predates the sources it was built from, so a run cannot silently test an old
6
+ * plugin. See {@link StaleBuildError} for why this is an error rather than a
7
+ * warning.
8
+ *
9
+ * **What counts as a source.** Everything under `<projectRoot>/src/` that is not
10
+ * a test file, plus `manifest.json` and `styles.css` at the root when they exist.
11
+ * Test files are excluded because they are not build inputs — the bundler's entry
12
+ * graph starts at `src/main.ts` and never reaches a `*.test.ts` — and a guard
13
+ * that fires when editing a test, where rebuilding would change nothing, is a
14
+ * guard people learn to switch off. `package.json` is excluded for the same
15
+ * reason from the other side: it is edited for scripts and dependency ranges far
16
+ * more often than for anything that reaches the bundle, and the one field of it
17
+ * that ships is read back out of `manifest.json` anyway.
18
+ *
19
+ * **mtime, not content.** A `git switch` rewrites mtimes without changing
20
+ * content, so a branch switch can report a stale build against a `dist/` that
21
+ * would hash identically. That direction is deliberate: the remedy is a rebuild,
22
+ * which is what the reader wanted after switching branches anyway, and the
23
+ * alternative — hashing the entry graph — needs the bundler's own input list,
24
+ * which the harness does not have and cannot get from `main.js` in both the
25
+ * `dev` and `build` shapes.
26
+ */
27
+ import type { ObsidianTransportOptions } from './transport-options.cjs';
28
+ /**
29
+ * The environment variable that downgrades a stale-build failure to a warning
30
+ * for a single run.
31
+ *
32
+ * The {@link ObsidianTransportOptions.shouldFailOnStaleBuild} option cannot serve
33
+ * that case on its own: it lives in a tracked config file, so a one-off
34
+ * "test what is in `dist/` right now" run would need an edit and a revert — which
35
+ * is how a guard ends up switched off permanently by accident.
36
+ */
37
+ export declare const ALLOW_STALE_BUILD_ENVIRONMENT_VARIABLE_NAME = "OBSIDIAN_TEST_ALLOW_STALE_BUILD";
38
+ /**
39
+ * Parameters for {@link checkIsBuildStale}.
40
+ */
41
+ export interface CheckIsBuildStaleParams {
42
+ /**
43
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
44
+ */
45
+ readonly buildModifiedAtInMilliseconds: number;
46
+ /**
47
+ The newest source found, or `undefined` when the project has none to compare against.
48
+ */
49
+ readonly newestSource: SourceModification | undefined;
50
+ }
51
+ /**
52
+ * One source file and when it last changed.
53
+ */
54
+ export interface SourceModification {
55
+ /**
56
+ When the file was last written, in epoch milliseconds.
57
+ */
58
+ readonly modifiedAtInMilliseconds: number;
59
+ /**
60
+ The file's path relative to the project root, with `/` separators.
61
+ */
62
+ readonly path: string;
63
+ }
64
+ /**
65
+ * Decides whether a build predates its sources.
66
+ *
67
+ * `false` when there is no source to compare against: a project whose sources do
68
+ * not live under `src/` is not a project whose build is provably old, and
69
+ * claiming staleness there would fail every run of it.
70
+ *
71
+ * Strictly newer, so a source written in the same millisecond as the build — or
72
+ * by the build itself — is not stale.
73
+ *
74
+ * @param params - The build's modification time and the newest source.
75
+ * @returns `true` when the newest source is newer than the build.
76
+ */
77
+ export declare function checkIsBuildStale(params: CheckIsBuildStaleParams): boolean;
78
+ /**
79
+ * Whether a file name is one the build reads.
80
+ *
81
+ * @param fileName - The bare file name, without a directory.
82
+ * @returns `true` unless it is a test file.
83
+ */
84
+ export declare function checkIsSourceFileName(fileName: string): boolean;
85
+ /**
86
+ * Finds the most recently modified source of the plugin at `projectRoot`.
87
+ *
88
+ * Walks `src/` recursively and adds the root-level files the build also reads.
89
+ * Anything unreadable is skipped rather than thrown: a file that vanished
90
+ * mid-walk cannot make a build stale, and this check must never be the reason a
91
+ * run fails.
92
+ *
93
+ * @param projectRoot - The absolute path to the project root.
94
+ * @returns The newest source, or `undefined` when the project has none.
95
+ */
96
+ export declare function findNewestSourceModification(projectRoot: string): Promise<SourceModification | undefined>;
97
+ /**
98
+ * Resolves whether a stale build fails the run, applying the default when
99
+ * neither escape hatch is used.
100
+ *
101
+ * The environment variable wins over the option, because it is the narrower
102
+ * statement: a project that sets the option has decided permanently, while the
103
+ * variable is set for one command line.
104
+ *
105
+ * @param options - The transport options.
106
+ * @returns `true` when a stale build should throw.
107
+ */
108
+ export declare function willFailOnStaleBuild(options: ObsidianTransportOptions | undefined): boolean;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var stale_build_error_exports = {};
20
+ __export(stale_build_error_exports, {
21
+ StaleBuildError: () => StaleBuildError
22
+ });
23
+ module.exports = __toCommonJS(stale_build_error_exports);
24
+ const MINUTE_IN_MILLISECONDS = 6e4;
25
+ class StaleBuildError extends Error {
26
+ /**
27
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
28
+ */
29
+ buildModifiedAtInMilliseconds;
30
+ /**
31
+ Which build is stale and what outdated it, with **no remedy attached** — the opening of
32
+ {@link StaleBuildError.message}, and what the warning path logs when the failure is switched off. The two
33
+ readers need different halves: somebody whose run just FAILED needs the remedy, while somebody who
34
+ deliberately escaped the failure has already applied it, and repeating *"set `shouldFailOnStaleBuild:
35
+ false`"* at a reader who just did exactly that is the noise that teaches people to skim the line.
36
+ */
37
+ description;
38
+ /**
39
+ Absolute path to the dist folder the run was about to install from.
40
+ */
41
+ distPath;
42
+ /**
43
+ When the newest source was last written, in epoch milliseconds.
44
+ */
45
+ sourceModifiedAtInMilliseconds;
46
+ /**
47
+ Path to the newest source found, relative to the project root.
48
+ */
49
+ sourcePath;
50
+ /**
51
+ * Creates the error from the dist folder and the newest source that outdates it.
52
+ *
53
+ * @param params - The dist path, both modification times, and the newest source's path.
54
+ */
55
+ constructor(params) {
56
+ const { buildModifiedAtInMilliseconds, distPath, sourceModifiedAtInMilliseconds, sourcePath } = params;
57
+ const ageInMinutes = Math.round((sourceModifiedAtInMilliseconds - buildModifiedAtInMilliseconds) / MINUTE_IN_MILLISECONDS);
58
+ const description = `The build is stale: ${distPath}/main.js was written at ${new Date(buildModifiedAtInMilliseconds).toISOString()}, but ${sourcePath} changed at ${new Date(sourceModifiedAtInMilliseconds).toISOString()} \u2014 ${String(ageInMinutes)} minute(s) later. The vault would be given a plugin built before that change, so this run tests code that is not in the working tree.`;
59
+ super(
60
+ `${description} Run \`npm run build\` (or \`npm run dev\`) and try again. To test the built artifact deliberately, set \`shouldFailOnStaleBuild: false\` in the transport options, or \`OBSIDIAN_TEST_ALLOW_STALE_BUILD=1\` for a single run.`
61
+ );
62
+ this.name = "StaleBuildError";
63
+ this.description = description;
64
+ this.buildModifiedAtInMilliseconds = buildModifiedAtInMilliseconds;
65
+ this.distPath = distPath;
66
+ this.sourceModifiedAtInMilliseconds = sourceModifiedAtInMilliseconds;
67
+ this.sourcePath = sourcePath;
68
+ }
69
+ }
70
+ // Annotate the CommonJS export names for ESM import in node:
71
+ 0 && (module.exports = {
72
+ StaleBuildError
73
+ });
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0YWxlLWJ1aWxkLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRpc3RpbmN0IGVycm9yIHRocm93biB3aGVuIHRoZSBgZGlzdC9gIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGluc3RhbGwgaXNcbiAqICoqb2xkZXIgdGhhbiB0aGUgc291cmNlcyBpdCB3YXMgYnVpbHQgZnJvbSoqIFx1MjAxNCB0aGUgcGx1Z2luIGluIHRoZSB2YXVsdCBpcyBub3RcbiAqIHRoZSBwbHVnaW4gaW4gdGhlIHdvcmtpbmcgdHJlZS5cbiAqXG4gKiBUaGUgZmFpbHVyZSBpdCBwcmV2ZW50cyBoYXMgdHdvIGRpcmVjdGlvbnMgYW5kIHRoZSBjaGVhcCBvbmUgaXMgbm90IHRoZSByZWFzb25cbiAqIHRoaXMgZXhpc3RzLiBBIHN1aXRlIHRoYXQgRkFJTFMgYWdhaW5zdCBhIHN0YWxlIGJ1aWxkIGNvc3RzIG9uZSBjb25mdXNpbmcgcnVuOlxuICogdGhlIHN5bXB0b20gaXMgd2hhdGV2ZXIgdGhlIG1pc3NpbmcgY29kZSB3b3VsZCBoYXZlIHByb3ZpZGVkLCBzbyBpdCByZWFkcyBhcyBhXG4gKiBkZWZlY3QgaW4gdGhlIGNvZGUgdW5kZXIgdGVzdCAob2JzZXJ2ZWQgMjAyNi0wOS0xOTogYSBgd2FpdFVudGlsIHRpbWVkIG91dDogdGhlXG4gKiBlbmFibGVkIGV2ZW50IHRvIGFycml2ZWAgYWdhaW5zdCBhIGJ1aWxkIGZpdmUgaG91cnMgb2xkLCB3aXRoIHRoZSBwbHVnaW5cbiAqIGxvYWRpbmcgYW5kIHJlZ2lzdGVyaW5nIHBlcmZlY3RseSBcdTIwMTQgaXQgc2ltcGx5IGhhZCBubyBjb21wb25lbnQgdG8gcHVibGlzaCB0aGVcbiAqIGV2ZW50KS4gQSBzdWl0ZSB0aGF0IFBBU1NFUyBhZ2FpbnN0IGEgc3RhbGUgYnVpbGQgY29zdHMgbm90aGluZyB2aXNpYmxlIGFuZFxuICogcHJvdmVzIG5vdGhpbmc6IGFuIGludGVncmF0aW9uIHN1aXRlIGV4aXN0cyB0byBiZSB0aGUgb25lIHRlc3QgdGhhdCBjYW4gZmFpbFxuICogZm9yIHRoZSByaWdodCByZWFzb24sIGFuZCBhIHN0YWxlIGFydGlmYWN0IHNpbGVudGx5IGNvbnZlcnRzIGl0IGludG8gYSB0ZXN0IG9mXG4gKiBsYXN0IHdlZWsncyBjb2RlLiBOb3RoaW5nIGF0IGFsbCByZXBvcnRzIHRoYXQgZGlyZWN0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gKiB2ZXJkaWN0IGlzIGFuIGVycm9yIHJhdGhlciB0aGFuIGEgd2FybmluZy5cbiAqXG4gKiBFeHBvcnRlZCBzbyBhIGNvbnN1bWVyIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggdGhpcyBzcGVjaWZpYyBzZXR1cCBmYWlsdXJlIFx1MjAxNFxuICogdGhlIHNhbWUgcmVhc29uIGBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yYCBpcy5cbiAqL1xuXG5jb25zdCBNSU5VVEVfSU5fTUlMTElTRUNPTkRTID0gNjBfMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgU3RhbGVCdWlsZEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFsZUJ1aWxkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBXaGVuIGBtYWluLmpzYCBpbiB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyIHdhcyBsYXN0IHdyaXR0ZW4sIGluIGVwb2NoIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIGRpc3QgZm9sZGVyIHRoZSBydW4gd2FzIGFib3V0IHRvIGluc3RhbGwgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZW4gdGhlIG5ld2VzdCBzb3VyY2Ugd2FzIGxhc3Qgd3JpdHRlbiwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFBhdGggdG8gdGhlIG5ld2VzdCBzb3VyY2UgZm91bmQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSBnbG9iYWwgc2V0dXAgd2hlbiB0aGUgYnVpbHQgcGx1Z2luIHByZWRhdGVzIGl0cyBzb3VyY2VzLlxuICpcbiAqIENhcnJpZXMgYm90aCB0aW1lc3RhbXBzIGFuZCB0aGUgbmV3ZXN0IHNvdXJjZSdzIHBhdGgsIHNvIHRoZSBtZXNzYWdlIG5hbWVzIHRoZVxuICogZmlsZSB0aGF0IG1ha2VzIHRoZSBidWlsZCBzdGFsZSByYXRoZXIgdGhhbiBsZWF2aW5nIHRoZSByZWFkZXIgdG8gZmluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YWxlQnVpbGRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFdoZW4gYG1haW4uanNgIGluIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIgd2FzIGxhc3Qgd3JpdHRlbiwgaW4gZXBvY2ggbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoaWNoIGJ1aWxkIGlzIHN0YWxlIGFuZCB3aGF0IG91dGRhdGVkIGl0LCB3aXRoICoqbm8gcmVtZWR5IGF0dGFjaGVkKiogXHUyMDE0IHRoZSBvcGVuaW5nIG9mXG4gIHtAbGluayBTdGFsZUJ1aWxkRXJyb3IubWVzc2FnZX0sIGFuZCB3aGF0IHRoZSB3YXJuaW5nIHBhdGggbG9ncyB3aGVuIHRoZSBmYWlsdXJlIGlzIHN3aXRjaGVkIG9mZi4gVGhlIHR3b1xuICByZWFkZXJzIG5lZWQgZGlmZmVyZW50IGhhbHZlczogc29tZWJvZHkgd2hvc2UgcnVuIGp1c3QgRkFJTEVEIG5lZWRzIHRoZSByZW1lZHksIHdoaWxlIHNvbWVib2R5IHdob1xuICBkZWxpYmVyYXRlbHkgZXNjYXBlZCB0aGUgZmFpbHVyZSBoYXMgYWxyZWFkeSBhcHBsaWVkIGl0LCBhbmQgcmVwZWF0aW5nICpcInNldCBgc2hvdWxkRmFpbE9uU3RhbGVCdWlsZDpcbiAgZmFsc2VgXCIqIGF0IGEgcmVhZGVyIHdobyBqdXN0IGRpZCBleGFjdGx5IHRoYXQgaXMgdGhlIG5vaXNlIHRoYXQgdGVhY2hlcyBwZW9wbGUgdG8gc2tpbSB0aGUgbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBkaXN0IGZvbGRlciB0aGUgcnVuIHdhcyBhYm91dCB0byBpbnN0YWxsIGZyb20uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGlzdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgV2hlbiB0aGUgbmV3ZXN0IHNvdXJjZSB3YXMgbGFzdCB3cml0dGVuLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFBhdGggdG8gdGhlIG5ld2VzdCBzb3VyY2UgZm91bmQsIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlcnJvciBmcm9tIHRoZSBkaXN0IGZvbGRlciBhbmQgdGhlIG5ld2VzdCBzb3VyY2UgdGhhdCBvdXRkYXRlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkaXN0IHBhdGgsIGJvdGggbW9kaWZpY2F0aW9uIHRpbWVzLCBhbmQgdGhlIG5ld2VzdCBzb3VyY2UncyBwYXRoLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogU3RhbGVCdWlsZEVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCB7IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzLCBkaXN0UGF0aCwgc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzLCBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgYWdlSW5NaW51dGVzID0gTWF0aC5yb3VuZCgoc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzIC0gYnVpbGRNb2RpZmllZEF0SW5NaWxsaXNlY29uZHMpIC8gTUlOVVRFX0lOX01JTExJU0VDT05EUyk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBgVGhlIGJ1aWxkIGlzIHN0YWxlOiAke2Rpc3RQYXRofS9tYWluLmpzIHdhcyB3cml0dGVuIGF0ICR7bmV3IERhdGUoYnVpbGRNb2RpZmllZEF0SW5NaWxsaXNlY29uZHMpLnRvSVNPU3RyaW5nKCl9LCBgXG4gICAgICArIGBidXQgJHtzb3VyY2VQYXRofSBjaGFuZ2VkIGF0ICR7bmV3IERhdGUoc291cmNlTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzKS50b0lTT1N0cmluZygpfSBcdTIwMTQgJHtTdHJpbmcoYWdlSW5NaW51dGVzKX0gbWludXRlKHMpIGxhdGVyLiBgXG4gICAgICArICdUaGUgdmF1bHQgd291bGQgYmUgZ2l2ZW4gYSBwbHVnaW4gYnVpbHQgYmVmb3JlIHRoYXQgY2hhbmdlLCBzbyB0aGlzIHJ1biB0ZXN0cyBjb2RlIHRoYXQgaXMgbm90IGluIHRoZSB3b3JraW5nIHRyZWUuJztcbiAgICBzdXBlcihcbiAgICAgIGAke2Rlc2NyaXB0aW9ufSBgXG4gICAgICAgICsgJ1J1biBgbnBtIHJ1biBidWlsZGAgKG9yIGBucG0gcnVuIGRldmApIGFuZCB0cnkgYWdhaW4uICdcbiAgICAgICAgKyAnVG8gdGVzdCB0aGUgYnVpbHQgYXJ0aWZhY3QgZGVsaWJlcmF0ZWx5LCBzZXQgYHNob3VsZEZhaWxPblN0YWxlQnVpbGQ6IGZhbHNlYCBpbiB0aGUgdHJhbnNwb3J0IG9wdGlvbnMsICdcbiAgICAgICAgKyAnb3IgYE9CU0lESUFOX1RFU1RfQUxMT1dfU1RBTEVfQlVJTEQ9MWAgZm9yIGEgc2luZ2xlIHJ1bi4nXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnU3RhbGVCdWlsZEVycm9yJztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5idWlsZE1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA9IGJ1aWxkTW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuZGlzdFBhdGggPSBkaXN0UGF0aDtcbiAgICB0aGlzLnNvdXJjZU1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcyA9IHNvdXJjZU1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBLE1BQU0seUJBQXlCO0FBaUN4QixNQUFNLHdCQUF3QixNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJekI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQTBDO0FBQzNELFVBQU0sRUFBRSwrQkFBK0IsVUFBVSxnQ0FBZ0MsV0FBVyxJQUFJO0FBQ2hHLFVBQU0sZUFBZSxLQUFLLE9BQU8saUNBQWlDLGlDQUFpQyxzQkFBc0I7QUFDekgsVUFBTSxjQUFjLHVCQUF1QixRQUFRLDJCQUEyQixJQUFJLEtBQUssNkJBQTZCLEVBQUUsWUFBWSxDQUFDLFNBQ3hILFVBQVUsZUFBZSxJQUFJLEtBQUssOEJBQThCLEVBQUUsWUFBWSxDQUFDLFdBQU0sT0FBTyxZQUFZLENBQUM7QUFFcEg7QUFBQSxNQUNFLEdBQUcsV0FBVztBQUFBLElBSWhCO0FBQ0EsU0FBSyxPQUFPO0FBQ1osU0FBSyxjQUFjO0FBQ25CLFNBQUssZ0NBQWdDO0FBQ3JDLFNBQUssV0FBVztBQUNoQixTQUFLLGlDQUFpQztBQUN0QyxTQUFLLGFBQWE7QUFBQSxFQUNwQjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when the `dist/` the harness is about to install is
5
+ * **older than the sources it was built from** — the plugin in the vault is not
6
+ * the plugin in the working tree.
7
+ *
8
+ * The failure it prevents has two directions and the cheap one is not the reason
9
+ * this exists. A suite that FAILS against a stale build costs one confusing run:
10
+ * the symptom is whatever the missing code would have provided, so it reads as a
11
+ * defect in the code under test (observed 2026-09-19: a `waitUntil timed out: the
12
+ * enabled event to arrive` against a build five hours old, with the plugin
13
+ * loading and registering perfectly — it simply had no component to publish the
14
+ * event). A suite that PASSES against a stale build costs nothing visible and
15
+ * proves nothing: an integration suite exists to be the one test that can fail
16
+ * for the right reason, and a stale artifact silently converts it into a test of
17
+ * last week's code. Nothing at all reports that direction, which is why the
18
+ * verdict is an error rather than a warning.
19
+ *
20
+ * Exported so a consumer can `instanceof`-match this specific setup failure —
21
+ * the same reason `ConfigDirectoryFallbackError` is.
22
+ */
23
+ /**
24
+ * Parameters for the {@link StaleBuildError} constructor.
25
+ */
26
+ export interface StaleBuildErrorConstructorParams {
27
+ /**
28
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
29
+ */
30
+ readonly buildModifiedAtInMilliseconds: number;
31
+ /**
32
+ Absolute path to the dist folder the run was about to install from.
33
+ */
34
+ readonly distPath: string;
35
+ /**
36
+ When the newest source was last written, in epoch milliseconds.
37
+ */
38
+ readonly sourceModifiedAtInMilliseconds: number;
39
+ /**
40
+ Path to the newest source found, relative to the project root.
41
+ */
42
+ readonly sourcePath: string;
43
+ }
44
+ /**
45
+ * Thrown by the global setup when the built plugin predates its sources.
46
+ *
47
+ * Carries both timestamps and the newest source's path, so the message names the
48
+ * file that makes the build stale rather than leaving the reader to find it.
49
+ */
50
+ export declare class StaleBuildError extends Error {
51
+ /**
52
+ When `main.js` in the chosen dist folder was last written, in epoch milliseconds.
53
+ */
54
+ readonly buildModifiedAtInMilliseconds: number;
55
+ /**
56
+ Which build is stale and what outdated it, with **no remedy attached** — the opening of
57
+ {@link StaleBuildError.message}, and what the warning path logs when the failure is switched off. The two
58
+ readers need different halves: somebody whose run just FAILED needs the remedy, while somebody who
59
+ deliberately escaped the failure has already applied it, and repeating *"set `shouldFailOnStaleBuild:
60
+ false`"* at a reader who just did exactly that is the noise that teaches people to skim the line.
61
+ */
62
+ readonly description: string;
63
+ /**
64
+ Absolute path to the dist folder the run was about to install from.
65
+ */
66
+ readonly distPath: string;
67
+ /**
68
+ When the newest source was last written, in epoch milliseconds.
69
+ */
70
+ readonly sourceModifiedAtInMilliseconds: number;
71
+ /**
72
+ Path to the newest source found, relative to the project root.
73
+ */
74
+ readonly sourcePath: string;
75
+ /**
76
+ * Creates the error from the dist folder and the newest source that outdates it.
77
+ *
78
+ * @param params - The dist path, both modification times, and the newest source's path.
79
+ */
80
+ constructor(params: StaleBuildErrorConstructorParams);
81
+ }