cubing 0.63.3 → 0.63.5

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 (153) hide show
  1. package/README.md +15 -1
  2. package/alg/index.d.ts +1 -1
  3. package/bluetooth/index.d.ts +1 -1
  4. package/dist/bin/chunks/{chunk-OI3YIXMQ.js → chunk-22VWCGBC.js} +2 -2
  5. package/dist/bin/order.js +8 -4
  6. package/dist/bin/order.js.map +2 -2
  7. package/dist/bin/puzzle-geometry-bin.js +8 -4
  8. package/dist/bin/puzzle-geometry-bin.js.map +2 -2
  9. package/dist/bin/scramble.js +8 -4
  10. package/dist/bin/scramble.js.map +2 -2
  11. package/dist/bin/svg.js +56 -0
  12. package/dist/bin/svg.js.map +7 -0
  13. package/dist/lib/cubing/alg/index.d.ts +2 -84
  14. package/dist/lib/cubing/alg/index.js +1 -1
  15. package/dist/lib/cubing/bluetooth/index.d.ts +147 -134
  16. package/dist/lib/cubing/bluetooth/index.js +29 -5
  17. package/dist/lib/cubing/bluetooth/index.js.map +2 -2
  18. package/dist/lib/cubing/chunks/{big-puzzle-orientation-ZVZQJEF5.js → big-puzzle-orientation-ADWIOX6S.js} +2 -2
  19. package/dist/lib/cubing/chunks/{chunk-RINY3U6G.js → chunk-5ONX3JVC.js} +7 -2
  20. package/dist/lib/cubing/chunks/{chunk-RINY3U6G.js.map → chunk-5ONX3JVC.js.map} +1 -1
  21. package/dist/lib/cubing/chunks/{chunk-ROB5TROI.js → chunk-7LXHWXCO.js} +2 -2
  22. package/dist/lib/cubing/chunks/{chunk-FUHYAW74.js → chunk-A7FK4XKU.js} +49 -63
  23. package/dist/lib/cubing/chunks/chunk-A7FK4XKU.js.map +7 -0
  24. package/dist/lib/cubing/chunks/{chunk-FLK6AZKB.js → chunk-FUAADKXE.js} +7 -7
  25. package/dist/lib/cubing/chunks/{chunk-FLK6AZKB.js.map → chunk-FUAADKXE.js.map} +2 -2
  26. package/dist/lib/cubing/chunks/{chunk-E3YLQC45.js → chunk-GHFBZYSV.js} +2 -2
  27. package/dist/lib/cubing/chunks/chunk-GHFBZYSV.js.map +7 -0
  28. package/dist/lib/cubing/chunks/{chunk-FTE3QI5X.js → chunk-H5KMIDAF.js} +42 -47
  29. package/dist/lib/cubing/chunks/chunk-H5KMIDAF.js.map +7 -0
  30. package/dist/lib/cubing/chunks/{chunk-NGW52SHR.js → chunk-MQSQDKWH.js} +3 -3
  31. package/dist/lib/cubing/chunks/{chunk-O6HEZXGY.js → chunk-N5FJ5YIA.js} +4 -3
  32. package/dist/lib/cubing/chunks/{chunk-O6HEZXGY.js.map → chunk-N5FJ5YIA.js.map} +1 -1
  33. package/dist/lib/cubing/chunks/{chunk-ZU7PSGX4.js → chunk-UEUJSZTX.js} +4 -3
  34. package/dist/lib/cubing/chunks/{chunk-ZU7PSGX4.js.map → chunk-UEUJSZTX.js.map} +1 -1
  35. package/dist/lib/cubing/chunks/{chunk-44CFF24P.js → chunk-WMKAKGVZ.js} +46 -17
  36. package/dist/lib/cubing/chunks/chunk-WMKAKGVZ.js.map +7 -0
  37. package/dist/lib/cubing/chunks/{chunk-DQGYYYHZ.js → chunk-YR72E7KZ.js} +28 -13
  38. package/dist/lib/cubing/chunks/chunk-YR72E7KZ.js.map +7 -0
  39. package/dist/lib/cubing/chunks/{inside-L2JI2BEY.js → inside-LSPIPZY2.js} +53 -25
  40. package/dist/lib/cubing/chunks/inside-LSPIPZY2.js.map +7 -0
  41. package/dist/lib/cubing/chunks/puzzles-dynamic-4x4x4-AIGABOAR.js +132 -0
  42. package/dist/lib/cubing/chunks/puzzles-dynamic-4x4x4-AIGABOAR.js.map +7 -0
  43. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-XFECDWOF.js → search-dynamic-sgs-side-events-WORUZVF5.js} +6 -5
  44. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-CM33KT7L.js → search-dynamic-sgs-unofficial-5JQKPNG2.js} +6 -5
  45. package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-NANDMURR.js → search-dynamic-solve-4x4x4-KIH4YATU.js} +7 -6
  46. package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-UZMNOI6U.js → search-dynamic-solve-fto-I5ID5LXD.js} +2 -2
  47. package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-Y2D3C74Y.js +771 -0
  48. package/dist/lib/cubing/chunks/search-dynamic-solve-kilominx-Y2D3C74Y.js.map +7 -0
  49. package/dist/lib/cubing/chunks/search-worker-entry.js +7 -6
  50. package/dist/lib/cubing/chunks/search-worker-entry.js.map +2 -2
  51. package/dist/lib/cubing/chunks/{twips-YHXBF55O.js → twips-ZNMKGC5U.js} +4 -4
  52. package/dist/lib/cubing/chunks/twips_wasm_bg-TJNYGA2C-AP2O4LGG.js +10 -0
  53. package/dist/lib/cubing/chunks/twips_wasm_bg-TJNYGA2C-AP2O4LGG.js.map +7 -0
  54. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-VGZIQ64W.js → twisty-dynamic-3d-4BEQ76PB.js} +22 -7
  55. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-VGZIQ64W.js.map → twisty-dynamic-3d-4BEQ76PB.js.map} +2 -2
  56. package/dist/lib/cubing/index-BXHm_6gm.d.ts +2626 -0
  57. package/dist/lib/cubing/index-Cvk652Bd.d.ts +76 -0
  58. package/dist/lib/cubing/kpuzzle/index.d.ts +2 -3
  59. package/dist/lib/cubing/kpuzzle/index.js +2 -2
  60. package/dist/lib/cubing/notation/index.d.ts +18 -17
  61. package/dist/lib/cubing/notation/index.js +4 -4
  62. package/dist/lib/cubing/outside-C2ODxIX_.d.ts +39 -0
  63. package/dist/lib/cubing/protocol/index.d.ts +14 -14
  64. package/dist/lib/cubing/protocol/index.js +4 -4
  65. package/dist/lib/cubing/puzzle-geometry/index.d.ts +2 -8
  66. package/dist/lib/cubing/puzzle-geometry/index.js +33 -1
  67. package/dist/lib/cubing/puzzle-geometry/index.js.map +1 -1
  68. package/dist/lib/cubing/puzzles/index.d.ts +2 -45
  69. package/dist/lib/cubing/puzzles/index.js +4 -4
  70. package/dist/lib/cubing/scramble/index.d.ts +2 -4
  71. package/dist/lib/cubing/scramble/index.js +6 -6
  72. package/dist/lib/cubing/search/index.d.ts +4 -9
  73. package/dist/lib/cubing/search/index.js +6 -6
  74. package/dist/lib/cubing/stream/index.d.ts +2 -45
  75. package/dist/lib/cubing/stream/index.js +1 -1
  76. package/dist/lib/cubing/twisty/index.d.ts +2 -60
  77. package/dist/lib/cubing/twisty/index.js +66 -18
  78. package/dist/lib/cubing/twisty/index.js.map +2 -2
  79. package/experimental-json-schema/kpuzzle/KPatternData.schema.json +27 -29
  80. package/experimental-json-schema/kpuzzle/KPuzzleDefinition.schema.json +82 -78
  81. package/experimental-json-schema/kpuzzle/KTransformationData.schema.json +21 -22
  82. package/kpuzzle/index.d.ts +1 -1
  83. package/notation/index.d.ts +1 -1
  84. package/package.json +25 -21
  85. package/protocol/index.d.ts +1 -1
  86. package/puzzle-geometry/index.d.ts +1 -1
  87. package/puzzles/index.d.ts +1 -1
  88. package/scramble/index.d.ts +1 -1
  89. package/search/index.d.ts +1 -1
  90. package/stream/index.d.ts +1 -1
  91. package/twisty/index.d.ts +1 -1
  92. package/dist/lib/cubing/PuzzleLoader-Bp8zngUn.d.ts +0 -2362
  93. package/dist/lib/cubing/chunks/chunk-44CFF24P.js.map +0 -7
  94. package/dist/lib/cubing/chunks/chunk-DQGYYYHZ.js.map +0 -7
  95. package/dist/lib/cubing/chunks/chunk-E3YLQC45.js.map +0 -7
  96. package/dist/lib/cubing/chunks/chunk-FTE3QI5X.js.map +0 -7
  97. package/dist/lib/cubing/chunks/chunk-FUHYAW74.js.map +0 -7
  98. package/dist/lib/cubing/chunks/chunk-FZBKZ5ZB.js +0 -265
  99. package/dist/lib/cubing/chunks/chunk-LWCBAAHO.js +0 -1180
  100. package/dist/lib/cubing/chunks/chunk-LWCBAAHO.js.map +0 -7
  101. package/dist/lib/cubing/chunks/chunk-M7YKTETT.js +0 -239
  102. package/dist/lib/cubing/chunks/chunk-M7YKTETT.js.map +0 -7
  103. package/dist/lib/cubing/chunks/chunk-NGW52SHR.js.map +0 -7
  104. package/dist/lib/cubing/chunks/chunk-OUM32GEA.js +0 -239
  105. package/dist/lib/cubing/chunks/chunk-OUM32GEA.js.map +0 -7
  106. package/dist/lib/cubing/chunks/chunk-SGJ5WPE4.js +0 -1074
  107. package/dist/lib/cubing/chunks/chunk-SGJ5WPE4.js.map +0 -7
  108. package/dist/lib/cubing/chunks/chunk-TAVR35KU.js +0 -265
  109. package/dist/lib/cubing/chunks/chunk-TAVR35KU.js.map +0 -7
  110. package/dist/lib/cubing/chunks/chunk-V27EM5TJ.js +0 -1074
  111. package/dist/lib/cubing/chunks/chunk-V27EM5TJ.js.map +0 -7
  112. package/dist/lib/cubing/chunks/chunk-VRTKWZPL.js +0 -10084
  113. package/dist/lib/cubing/chunks/chunk-VRTKWZPL.js.map +0 -7
  114. package/dist/lib/cubing/chunks/chunk-VSMFYTG6.js +0 -10086
  115. package/dist/lib/cubing/chunks/chunk-VSMFYTG6.js.map +0 -7
  116. package/dist/lib/cubing/chunks/inside-IHWQVDVU.js +0 -564
  117. package/dist/lib/cubing/chunks/inside-IHWQVDVU.js.map +0 -7
  118. package/dist/lib/cubing/chunks/inside-L2JI2BEY.js.map +0 -7
  119. package/dist/lib/cubing/chunks/inside-Q56GLXG4.js +0 -556
  120. package/dist/lib/cubing/chunks/inside-Q56GLXG4.js.map +0 -7
  121. package/dist/lib/cubing/chunks/puzzles-dynamic-4x4x4-REUXFQJ4.js +0 -124
  122. package/dist/lib/cubing/chunks/puzzles-dynamic-4x4x4-REUXFQJ4.js.map +0 -7
  123. package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-GB4WAJ7I.js +0 -1891
  124. package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-MXHP7O4R.js +0 -1890
  125. package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-MXHP7O4R.js.map +0 -7
  126. package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-XFECDWOF.js.map +0 -7
  127. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-2CECFBP3.js +0 -1268
  128. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-CM33KT7L.js.map +0 -7
  129. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-Q4LLHL2O.js +0 -1267
  130. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-Q4LLHL2O.js.map +0 -7
  131. package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-COSEVJBV.js +0 -2922
  132. package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-COSEVJBV.js.map +0 -7
  133. package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-E576AITS.js +0 -2923
  134. package/dist/lib/cubing/chunks/search-dynamic-solve-4x4x4-NANDMURR.js.map +0 -7
  135. package/dist/lib/cubing/chunks/twips_wasm_bg-RWVQBVBA-5YCKA6O5.js +0 -10
  136. package/dist/lib/cubing/chunks/twips_wasm_bg-RWVQBVBA-5YCKA6O5.js.map +0 -7
  137. package/dist/lib/cubing/chunks/twisty-dynamic-3d-5NZRNZ7C.js +0 -1881
  138. package/dist/lib/cubing/chunks/twisty-dynamic-3d-5NZRNZ7C.js.map +0 -7
  139. package/dist/lib/cubing/chunks/twisty-dynamic-3d-IKE4BUQG.js +0 -1883
  140. package/dist/lib/cubing/chunks/twisty-dynamic-3d-IKE4BUQG.js.map +0 -7
  141. package/dist/lib/cubing/chunks/twisty-dynamic-3d-XLUOPCLN.js +0 -1881
  142. package/dist/lib/cubing/chunks/twisty-dynamic-3d-XLUOPCLN.js.map +0 -7
  143. package/dist/lib/cubing/events-CewDA1aS.d.ts +0 -35
  144. package/dist/lib/cubing/index-DabjED-w.d.ts +0 -33
  145. /package/dist/bin/chunks/{chunk-OI3YIXMQ.js.map → chunk-22VWCGBC.js.map} +0 -0
  146. /package/dist/lib/cubing/chunks/{big-puzzle-orientation-ZVZQJEF5.js.map → big-puzzle-orientation-ADWIOX6S.js.map} +0 -0
  147. /package/dist/lib/cubing/chunks/{chunk-ROB5TROI.js.map → chunk-7LXHWXCO.js.map} +0 -0
  148. /package/dist/lib/cubing/chunks/{chunk-FZBKZ5ZB.js.map → chunk-MQSQDKWH.js.map} +0 -0
  149. /package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-GB4WAJ7I.js.map → search-dynamic-sgs-side-events-WORUZVF5.js.map} +0 -0
  150. /package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-2CECFBP3.js.map → search-dynamic-sgs-unofficial-5JQKPNG2.js.map} +0 -0
  151. /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-E576AITS.js.map → search-dynamic-solve-4x4x4-KIH4YATU.js.map} +0 -0
  152. /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-UZMNOI6U.js.map → search-dynamic-solve-fto-I5ID5LXD.js.map} +0 -0
  153. /package/dist/lib/cubing/chunks/{twips-YHXBF55O.js.map → twips-ZNMKGC5U.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cubing/search/worker-workarounds/index.ts", "../../../../src/cubing/search/instantiator.ts", "../../../../src/cubing/search/outside.ts"],
4
+ "sourcesContent": ["import { exposeAPI } from \"./worker-guard\";\n\nexport function searchWorkerURLImportMetaResolve(): string {\n // Note:\n // - We have to hardcode the expected path of the entry file in the ESM build, due to lack of `esbuild` support: https://github.com/evanw/esbuild/issues/2866\n // - This URL is based on the assumption that the code from this file ends up in a shared chunk in the `esm` build. This is not guaranteed by `esbuild`, but it consistently happens for our codebase.\n // - We inline the value (instead of using a constant), to maximize compatibility for hardcoded syntax detection in bundlers.\n return import.meta.resolve(\"./search-worker-entry.js\");\n}\n\nexport function searchWorkerURLNewURLImportMetaURL(): URL {\n // Note:\n // - We have to hardcode the expected path of the entry file in the ESM build, due to lack of `esbuild` support: https://github.com/evanw/esbuild/issues/795\n // - This URL is based on the assumption that the code from this file ends up in a shared chunk in the `esm` build. This is not guaranteed by `esbuild`, but it consistently happens for our codebase.\n // - We inline the value (instead of using a constant), to maximize compatibility for hardcoded syntax detection in bundlers.\n return new URL(\"./search-worker-entry.js\", import.meta.url);\n}\n\n// Workaround for `esbuild`: https://github.com/evanw/esbuild/issues/312#issuecomment-1092195778\nexport async function searchWorkerURLEsbuildWorkaround(): Promise<string> {\n exposeAPI.expose = false;\n return (await import(\"./search-worker-entry.js\")).WORKER_ENTRY_FILE_URL;\n}\n\nexport function instantiateSearchWorkerURLNewURLImportMetaURL(): Worker {\n return new Worker(new URL(\"./search-worker-entry.js\", import.meta.url), {\n type: \"module\",\n });\n}\n", "import type { Worker as NodeWorker } from \"node:worker_threads\";\nimport { PortableWorker, wrap } from \"@cubing/comlink-everywhere\";\nimport type { WorkerAPI } from \"./inside/api\";\nimport { searchOutsideDebugGlobals } from \"./outside\";\nimport {\n searchWorkerURLEsbuildWorkaround,\n searchWorkerURLImportMetaResolve,\n searchWorkerURLNewURLImportMetaURL,\n} from \"./worker-workarounds\";\n\nfunction wrapAPI(worker: Worker | NodeWorker): WorkerAPI {\n return wrap<WorkerAPI>(worker);\n}\n\nasync function instantiateModuleWorker(\n workerEntryFileURL: string | URL,\n): Promise<WorkerAPI> {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: TODO\n return new Promise<WorkerAPI>(async (resolve, reject) => {\n try {\n const worker = new PortableWorker(workerEntryFileURL);\n\n // TODO: Remove this once we can remove the workarounds for lack of `import.meta.resolve(\u2026)` support.\n const onFirstMessage = (messageData: string) => {\n if (messageData === \"comlink-exposed\") {\n // We need to clear the timeout so that we don't prevent `node` from exiting in the meantime.\n resolve(wrapAPI(worker));\n } else {\n reject(\n new Error(`wrong module instantiation message ${messageData}`),\n );\n }\n };\n\n const onError = (e: ErrorEvent) => {\n reject(e);\n };\n\n if (\"once\" in worker /* hack to detect `node` */) {\n // We have to use `once` so the `unref()` from `comlink-everywhere` allows the process to quit as expected.\n worker.once(\"message\", onFirstMessage);\n } else {\n worker.addEventListener(\"error\", onError, {\n once: true,\n });\n worker.addEventListener(\n \"message\",\n (e: MessageEvent) => onFirstMessage(e.data),\n {\n once: true,\n },\n );\n }\n } catch (e) {\n reject(e);\n }\n });\n}\n\nexport const allWorkerAPIPromises: Promise<WorkerAPI>[] = [];\n\nexport async function instantiateWorkerAPI(): Promise<WorkerAPI> {\n const workerAPIPromise = instantiateWorkerImplementation();\n allWorkerAPIPromises.push(workerAPIPromise);\n const insideAPI = await workerAPIPromise;\n insideAPI.setDebugMeasurePerf(searchOutsideDebugGlobals.logPerf);\n insideAPI.setDebugForceTwipsForScrambles(\n searchOutsideDebugGlobals.forceTwipsForScrambles,\n );\n insideAPI.setScramblePrefetchLevel(\n searchOutsideDebugGlobals.scramblePrefetchLevel,\n );\n return workerAPIPromise;\n}\n\ntype FallbackStrategyInfo = [\n fn: () => Promise<WorkerAPI>,\n description: string,\n warnOnSuccess: null | string,\n];\n\nfunction fallbackOrder(): FallbackStrategyInfo[] {\n const importMetaResolveStrategy: FallbackStrategyInfo = [\n async () => instantiateModuleWorker(searchWorkerURLImportMetaResolve()),\n \"using `import.meta.resolve(\u2026)\",\n null,\n ];\n const esbuildWorkaroundStrategy: FallbackStrategyInfo = [\n async () =>\n instantiateModuleWorker(await searchWorkerURLEsbuildWorkaround()),\n \"using the `esbuild` workaround\",\n // TODO: we will hopefully discontinue the `esbuild` workaround at some\n // point, but `esbuild` has been stuck for 3 years on this issue. Because\n // `esbuild` and Vite (which uses `esbuild`) are now dominating the\n // ecosystem, this just causes a warning for a lot of devs/users that they\n // can't do anything about. As frustrating as the situation is, the\n // workaround is semantically fine (even if it's convoluted) and is\n // preserved by `esbuild`-based flows in practice. So we suppress the\n // warning in the medium-term but maintain long-term hope that we can\n // remove it (and the other fallbacks as well).\n null,\n ];\n const newURLStrategy: FallbackStrategyInfo = [\n async () => instantiateModuleWorker(searchWorkerURLNewURLImportMetaURL()),\n \"using `new URL(\u2026, import.meta.url)`\",\n \"will\",\n ];\n\n if (!searchOutsideDebugGlobals.allowLegacyPatternsForWorkerInstantiation) {\n return [importMetaResolveStrategy];\n }\n if (\n searchOutsideDebugGlobals.prioritizeEsbuildWorkaroundForWorkerInstantiation\n ) {\n return [\n esbuildWorkaroundStrategy,\n importMetaResolveStrategy,\n newURLStrategy,\n ];\n }\n return [importMetaResolveStrategy, esbuildWorkaroundStrategy, newURLStrategy];\n}\n\nasync function instantiateWorkerImplementation(): Promise<WorkerAPI> {\n if (globalThis.location?.protocol === \"file:\") {\n console.warn(\n \"This current web page is loaded from the local filesystem (a URL that starts with `file://`). In this situation, `cubing.js` may be unable to generate scrambles or perform searches in some browsers. See: https://js.cubing.net/cubing/scramble/#file-server-required\",\n );\n }\n\n function failed(methodDescription?: string) {\n return `Module worker instantiation${\n methodDescription ? ` ${methodDescription}` : \"\"\n } failed`;\n }\n\n for (const [fn, description, warnOnSuccess] of fallbackOrder()) {\n try {\n const worker = await fn();\n if (warnOnSuccess) {\n if (searchOutsideDebugGlobals.showWorkerInstantiationWarnings) {\n console.warn(\n `Module worker instantiation required ${description}. \\`cubing.js\\` ${warnOnSuccess} not support this fallback in the future.`,\n );\n }\n }\n return worker;\n } catch (e) {\n if (searchOutsideDebugGlobals.showWorkerInstantiationWarnings) {\n console.warn(`${failed(description)}, falling back.`, e);\n }\n }\n }\n\n throw new Error(\n `Module worker instantiation failed. There are no more fallbacks available.`,\n );\n}\n", "import { Alg } from \"../alg\";\nimport type { KPuzzle } from \"../kpuzzle\";\n// import { preInitialize222 } from \"../implementations/2x2x2\";\nimport type { KPattern } from \"../kpuzzle/KPattern\";\nimport type { PrefetchLevel, WorkerAPI } from \"./inside/api\";\nimport type { TwipsOptions } from \"./inside/solve/twips\";\nimport { allWorkerAPIPromises, instantiateWorkerAPI } from \"./instantiator\";\n\nlet cachedWorkerInstance: Promise<WorkerAPI> | undefined;\nfunction getCachedWorkerInstance(): Promise<WorkerAPI> {\n return (cachedWorkerInstance ??= instantiateWorkerAPI());\n}\n\nexport async function mapToAllWorkers(\n f: (worker: WorkerAPI) => void,\n): Promise<void> {\n await Promise.all(\n allWorkerAPIPromises.map(async (worker) => {\n f(await worker);\n }),\n );\n}\n\n// Pre-initialize the scrambler for the given event. (Otherwise, an event is\n// initialized the first time you ask for a scramble for that event.)\n//\n// Some typical numbers for a fast computer:\n// - 3x3x3 initialization: 200ms\n// - Each 3x3x3 scramble: 50ms\n// - 4x4x4 initialization: 2500ms\n// - Each 4x4x4 scramble: 300ms to 800ms\n//\n// It is safe to immediately call for a scramble\n// any time after starting pre-initialization, or to call for them without\n// pre-initializing. Pre-initializing essentially gives the scramble worker a\n// head start in case a scramble doesn't get requested immediately.\n//\n// Note that events cannot be pre-initialized in parallel. Attempting to\n// pre-initialize multiple events will initialize them consecutively. Scrambles\n// for a given event cannot be computed while another event is being initialized.\nexport function _preInitializationHintForEvent(\n eventID: string,\n // callback?: () => void\n): void {\n switch (eventID) {\n case \"333oh\":\n _preInitializationHintForEvent(\"333\");\n return;\n }\n void (async () => {\n await (await getCachedWorkerInstance()).initialize(eventID);\n })();\n}\n\nexport async function randomScrambleForEvent(eventID: string): Promise<Alg> {\n const worker = searchOutsideDebugGlobals.forceNewWorkerForEveryScramble\n ? await instantiateWorkerAPI()\n : await getCachedWorkerInstance();\n const scrambleString = await worker.randomScrambleStringForEvent(eventID);\n\n return Alg.fromString(scrambleString);\n}\n\nexport async function deriveScrambleForEvent(\n derivationSeedHex: string,\n derivationSaltHierarchy: string[],\n eventID: string,\n): Promise<Alg> {\n if (!searchOutsideDebugGlobals.allowDerivedScrambles) {\n throw new Error(\"Derived scrambles are not allowed.\");\n }\n const worker = searchOutsideDebugGlobals.forceNewWorkerForEveryScramble\n ? await instantiateWorkerAPI()\n : await getCachedWorkerInstance();\n const scrambleString = await worker.deriveScrambleStringForEvent(\n derivationSeedHex,\n derivationSaltHierarchy,\n eventID,\n );\n return Alg.fromString(scrambleString);\n}\n\nexport async function experimentalSolve3x3x3IgnoringCenters(\n pattern: KPattern,\n): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(await cwi.solve333ToString(pattern.patternData));\n}\n\nexport async function experimentalSolve2x2x2(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(await cwi.solve222ToString(pattern.patternData));\n}\n\nexport async function solveSkewb(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(await cwi.solveSkewbToString(pattern.patternData));\n}\n\nexport async function solvePyraminx(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(await cwi.solvePyraminxToString(pattern.patternData));\n}\n\nexport async function solveMegaminx(pattern: KPattern): Promise<Alg> {\n const cwi = await getCachedWorkerInstance();\n return Alg.fromString(await cwi.solveMegaminxToString(pattern.patternData));\n}\n\nexport interface SolveTwipsOptions {\n generatorMoves?: string[];\n targetPattern?: KPattern;\n minDepth?: number;\n maxDepth?: number;\n}\n\nexport async function solveTwips(\n kpuzzle: KPuzzle,\n pattern: KPattern,\n options?: SolveTwipsOptions,\n): Promise<Alg> {\n const { targetPattern, ...otherOptions } = options ?? {};\n const apiOptions: TwipsOptions = otherOptions;\n if (targetPattern) {\n apiOptions.targetPattern = targetPattern.patternData;\n }\n const { ...def } = kpuzzle.definition;\n delete def.experimentalIsPatternSolved;\n // delete def.derivedMoves;\n const dedicatedWorker = await instantiateWorkerAPI();\n try {\n return Alg.fromString(\n // TODO: unnecessary because we terminate the worker?\n await dedicatedWorker.solveTwipsToString(\n def,\n pattern.patternData,\n apiOptions,\n ),\n );\n } finally {\n console.log(\"Search ended, terminating dedicated `twips` worker.\");\n // TODO: support re-using the same worker for multiple searches..\n // dedicatedWorker.terminate?.(); // TODO\n }\n}\n\ninterface SearchOutsideDebugGlobals {\n logPerf: boolean;\n scramblePrefetchLevel: `${PrefetchLevel}`;\n forceNewWorkerForEveryScramble: boolean;\n showWorkerInstantiationWarnings: boolean;\n forceTwipsForScrambles: boolean;\n // Allow fallbacks from `import.meta.resolve(\u2026)`.\n allowLegacyPatternsForWorkerInstantiation: boolean;\n // This can prevent a request to `search-worker-entry.js` when it doesn't exist, if the library semantics have been mangled by `esbuild`.\n prioritizeEsbuildWorkaroundForWorkerInstantiation: boolean;\n allowDerivedScrambles: boolean;\n}\n\nexport const searchOutsideDebugGlobals: SearchOutsideDebugGlobals = {\n logPerf: true,\n scramblePrefetchLevel: \"auto\",\n forceNewWorkerForEveryScramble: false,\n forceTwipsForScrambles: false,\n showWorkerInstantiationWarnings: true,\n prioritizeEsbuildWorkaroundForWorkerInstantiation: false,\n allowLegacyPatternsForWorkerInstantiation: true,\n allowDerivedScrambles: false,\n};\n\nexport function setSearchDebug(\n options: Partial<SearchOutsideDebugGlobals>,\n): void {\n const { logPerf, forceTwipsForScrambles, scramblePrefetchLevel } = options;\n if (typeof logPerf !== \"undefined\") {\n searchOutsideDebugGlobals.logPerf = logPerf;\n void mapToAllWorkers((worker) => worker.setDebugMeasurePerf(logPerf));\n }\n if (typeof forceTwipsForScrambles !== \"undefined\") {\n searchOutsideDebugGlobals.forceTwipsForScrambles = forceTwipsForScrambles;\n void mapToAllWorkers((worker) =>\n worker.setDebugMeasurePerf(forceTwipsForScrambles),\n );\n }\n if (typeof scramblePrefetchLevel !== \"undefined\") {\n searchOutsideDebugGlobals.scramblePrefetchLevel = scramblePrefetchLevel;\n void mapToAllWorkers((worker) =>\n worker.setScramblePrefetchLevel(scramblePrefetchLevel as PrefetchLevel),\n );\n }\n for (const booleanField of [\n \"forceNewWorkerForEveryScramble\",\n \"showWorkerInstantiationWarnings\",\n \"prioritizeEsbuildWorkaroundForWorkerInstantiation\",\n \"allowLegacyPatternsForWorkerInstantiation\",\n \"allowDerivedScrambles\",\n ] as const) {\n if (booleanField in options) {\n searchOutsideDebugGlobals[booleanField] =\n options[booleanField] ?? searchOutsideDebugGlobals[booleanField];\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
- from
3
- } from "./chunk-FUHYAW74.js";
2
+ LazyPromise
3
+ } from "./chunk-A7FK4XKU.js";
4
4
 
5
5
  // src/cubing/twisty/debug.ts
6
6
  var twistyDebugGlobals = {
@@ -129,7 +129,7 @@ var TwistyPropSource = class extends TwistyPropParent {
129
129
  #value;
130
130
  constructor(initialValue) {
131
131
  super();
132
- this.#value = from(() => this.getDefaultValue());
132
+ this.#value = new LazyPromise(async () => this.getDefaultValue());
133
133
  if (initialValue) {
134
134
  this.#value = this.deriveFromPromiseOrValue(initialValue, this.#value);
135
135
  }
@@ -159,7 +159,7 @@ var SimpleTwistyPropSource = class extends TwistyPropSource {
159
159
  return input;
160
160
  }
161
161
  };
162
- var NO_VALUE = Symbol("no value");
162
+ var NO_VALUE = /* @__PURE__ */ Symbol("no value");
163
163
  var TwistyPropDerived = class extends TwistyPropParent {
164
164
  constructor(parents, userVisibleErrorTracker) {
165
165
  super();
@@ -169,6 +169,7 @@ var TwistyPropDerived = class extends TwistyPropParent {
169
169
  parent.addChild(this);
170
170
  }
171
171
  }
172
+ userVisibleErrorTracker;
172
173
  // cachedInputs:
173
174
  #parents;
174
175
  #cachedLastSuccessfulCalculation = null;
@@ -353,6 +354,7 @@ var RenderScheduler = class {
353
354
  constructor(callback) {
354
355
  this.callback = callback;
355
356
  }
357
+ callback;
356
358
  animFrameID = null;
357
359
  animFrame = this.animFrameWrapper.bind(this);
358
360
  requestIsPending() {
@@ -478,6 +480,9 @@ var StatsPanel = class {
478
480
  this.context.globalAlpha = 0.9;
479
481
  this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);
480
482
  }
483
+ name;
484
+ fg;
485
+ bg;
481
486
  min = Infinity;
482
487
  max = 0;
483
488
  dom = document.createElement("canvas");
@@ -525,10 +530,9 @@ var StatsPanel = class {
525
530
  };
526
531
 
527
532
  // src/cubing/twisty/heavy-code-imports/3d.ts
528
- var cachedConstructorProxy = null;
529
- async function bulk3DCode() {
530
- return cachedConstructorProxy ??= import("./twisty-dynamic-3d-VGZIQ64W.js");
531
- }
533
+ var bulk3DCode = new LazyPromise(
534
+ () => import("./twisty-dynamic-3d-4BEQ76PB.js")
535
+ );
532
536
 
533
537
  // src/cubing/twisty/views/canvas.ts
534
538
  var globalPixelRatioOverride = null;
@@ -543,6 +547,7 @@ var DragTracker = class extends EventTarget {
543
547
  super();
544
548
  this.target = target;
545
549
  }
550
+ target;
546
551
  #dragInfoMap = /* @__PURE__ */ new Map();
547
552
  // Idempotent
548
553
  start() {
@@ -701,7 +706,7 @@ async function renderPooled(width, height, canvas, scene, camera) {
701
706
  }
702
707
  var linearSRGBColorSpace = "srgb-linear";
703
708
  async function newRenderer() {
704
- const rendererConstructor = (await bulk3DCode()).ThreeWebGLRenderer;
709
+ const rendererConstructor = (await bulk3DCode).ThreeWebGLRenderer;
705
710
  const renderer = new rendererConstructor({
706
711
  antialias: true,
707
712
  alpha: true
@@ -794,6 +799,10 @@ var Inertia = class {
794
799
  this.scheduler.requestAnimFrame();
795
800
  this.lastTimestamp = startTimestamp;
796
801
  }
802
+ startTimestamp;
803
+ momentumX;
804
+ momentumY;
805
+ callback;
797
806
  scheduler = new RenderScheduler(this.render.bind(this));
798
807
  lastTimestamp;
799
808
  render(now) {
@@ -830,6 +839,10 @@ var TwistyOrbitControls = class {
830
839
  // TODO: https://github.com/microsoft/TypeScript/issues/28357
831
840
  );
832
841
  }
842
+ model;
843
+ mirror;
844
+ canvas;
845
+ dragTracker;
833
846
  /** @deprecated */
834
847
  experimentalInertia = INERTIA_DEFAULT;
835
848
  onMovementBound = this.onMovement.bind(this);
@@ -884,7 +897,7 @@ var TwistyOrbitControls = class {
884
897
 
885
898
  // src/cubing/twisty/views/3D/Twisty3DVantage.ts
886
899
  async function setCameraFromOrbitCoordinates(camera, orbitCoordinates, backView = false) {
887
- const spherical = new (await bulk3DCode()).ThreeSpherical(
900
+ const spherical = new (await bulk3DCode).ThreeSpherical(
888
901
  orbitCoordinates.distance,
889
902
  (90 - (backView ? -1 : 1) * orbitCoordinates.latitude) / DEGREES_PER_RADIAN,
890
903
  ((backView ? 180 : 0) + orbitCoordinates.longitude) / DEGREES_PER_RADIAN
@@ -928,6 +941,8 @@ var Twisty3DVantage = class extends ManagedCustomElement {
928
941
  this.contentWrapper.appendChild(this.stats.dom);
929
942
  }
930
943
  }
944
+ model;
945
+ options;
931
946
  scene = null;
932
947
  stats = null;
933
948
  rendererIsShared = shareRenderer();
@@ -1063,7 +1078,7 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1063
1078
  #cachedCamera = null;
1064
1079
  async camera() {
1065
1080
  return this.#cachedCamera ??= (async () => {
1066
- const camera = new (await bulk3DCode()).ThreePerspectiveCamera(
1081
+ const camera = new (await bulk3DCode).ThreePerspectiveCamera(
1067
1082
  20,
1068
1083
  1,
1069
1084
  // We rely on the resize logic to handle this.
@@ -1071,7 +1086,7 @@ var Twisty3DVantage = class extends ManagedCustomElement {
1071
1086
  20
1072
1087
  );
1073
1088
  camera.position.copy(
1074
- new (await bulk3DCode()).ThreeVector3(2, 4, 4).multiplyScalar(
1089
+ new (await bulk3DCode).ThreeVector3(2, 4, 4).multiplyScalar(
1075
1090
  this.options?.backView ? -1 : 1
1076
1091
  )
1077
1092
  );
@@ -1177,4 +1192,4 @@ export {
1177
1192
  Twisty3DVantage,
1178
1193
  bulk3DCode
1179
1194
  };
1180
- //# sourceMappingURL=chunk-DQGYYYHZ.js.map
1195
+ //# sourceMappingURL=chunk-YR72E7KZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/cubing/twisty/debug.ts", "../../../../src/cubing/twisty/model/PromiseFreshener.ts", "../../../../src/cubing/twisty/model/props/TwistyProp.ts", "../../../../src/cubing/twisty/views/node-custom-element-shims.ts", "../../../../src/cubing/twisty/views/ManagedCustomElement.ts", "../../../../src/cubing/twisty/controllers/RenderScheduler.ts", "../../../../src/cubing/twisty/model/props/puzzle/display/HintFaceletProp.ts", "../../../../src/cubing/twisty/views/3D/TAU.ts", "../../../../src/cubing/vendor/mit/three/examples/jsm/libs/stats.modified.module.ts", "../../../../src/cubing/twisty/heavy-code-imports/3d.ts", "../../../../src/cubing/twisty/views/canvas.ts", "../../../../src/cubing/twisty/views/3D/DragTracker.ts", "../../../../src/cubing/twisty/views/3D/RendererPool.ts", "../../../../src/cubing/twisty/views/3D/Twisty3DVantage.css.ts", "../../../../src/cubing/twisty/views/3D/TwistyOrbitControls.ts", "../../../../src/cubing/twisty/views/3D/Twisty3DVantage.ts"],
4
+ "sourcesContent": ["export const twistyDebugGlobals: {\n // WARNING: The current shared renderer implementation has performance issues, especially in Safari.\n // Avoid using for players that are likely to have dimensions approaching 1 megapixel or higher.\n // TODO: use a dedicated renderer while fullscreen?\n // - \"auto\": Default heuristics.\n // - \"always\": Force all new (i.e. constructed in the future) renderers to be shared\n // - \"never\": Force all new (i.e. constructed in the future) renderers to be dedicated\n shareAllNewRenderers: \"auto\" | \"always\" | \"never\";\n showRenderStats: boolean;\n} = {\n shareAllNewRenderers: \"auto\",\n showRenderStats: false,\n};\n\nexport function setTwistyDebug(\n options: Partial<typeof twistyDebugGlobals>,\n): void {\n for (const [key, value] of Object.entries(options)) {\n if (key in twistyDebugGlobals) {\n (twistyDebugGlobals as any)[key] = value;\n }\n }\n}\n", "// TODO: Pick a much better name.\nexport class PromiseFreshener<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n // TODO: reject instead? Drop?\n async queue(\n p: Promise<T>,\n ): Promise<{ fresh: false } | { fresh: true; result: T }> {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n return {\n fresh: true,\n result: result,\n };\n } else {\n return { fresh: false };\n }\n }\n}\n\n// This will silenty drop a queued Promise (i.e. not resolve it) if a\n// newer queued one already resolved first. This is useful for classes that want\n// to know the \"latest\" state of something without jumping back to an older\n// value by accident.\n// TODO: Remove this because it's too easy to misuse?\nexport class StaleDropper<T> {\n #latestAssignedIdx = 0;\n #latestResolvedIdx = 0;\n\n queue(p: Promise<T>): Promise<T> {\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: This is a very rare case where we *do* want to drop a Promise sometimes.\n return new Promise(async (resolve, reject) => {\n try {\n const idx = ++this.#latestAssignedIdx;\n const result = await p;\n if (idx > this.#latestResolvedIdx) {\n this.#latestResolvedIdx = idx;\n resolve(result);\n }\n } catch (e) {\n reject(e);\n }\n });\n }\n}\n", "import { LazyPromise } from \"@cubing/lazy-promise\";\nimport type { Tagged } from \"type-fest\";\nimport { StaleDropper } from \"../PromiseFreshener\";\nimport type { UserVisibleErrorTracker } from \"../UserVisibleErrorTracker\";\n\ntype InputRecord = Record<string, any>;\n\nexport type InputProps<T extends InputRecord> = {\n [s in keyof T]: TwistyPropParent<T[s]>;\n};\n\ntype InputPromises<T extends InputRecord> = {\n [s in keyof T]: Promise<T[s]>;\n};\n\ntype Generation = Tagged<number, \"Generation\">;\n\ninterface SourceEventDetail<OutputType> {\n sourceProp: TwistyPropSource<OutputType, any>;\n value: Promise<OutputType>; // TODO: remove?\n generation: Generation;\n}\n\ntype SourceEvent<T> = CustomEvent<SourceEventDetail<T>>;\n\nexport type PromiseOrValue<T> = T | Promise<T>;\n\n// Values of T must be immutable.\nlet globalSourceGeneration: Generation = 0 as Generation; // This is incremented before being used, so 1 will be the first active value.\nexport abstract class TwistyPropParent<T> {\n public abstract get(): Promise<T>;\n\n // Don't overwrite this. Overwrite `canReuseValue` instead.\n public canReuse(v1: T, v2: T): boolean {\n return v1 === v2 || this.canReuseValue(v1, v2);\n }\n\n // Overwrite with a cheap semantic comparison when possible.\n // Note that this is not called if `v1 === v2` (in which case the value is automatically reused).\n protected canReuseValue(_v1: T, _v2: T): boolean {\n return false;\n }\n\n debugGetChildren(): TwistyPropDerived<any, any>[] {\n return Array.from(this.#children.values());\n }\n\n // Propagation\n\n #children: Set<TwistyPropDerived<any, any>> = new Set();\n protected addChild(child: TwistyPropDerived<any, any>): void {\n this.#children.add(child);\n }\n\n protected removeChild(child: TwistyPropDerived<any, any>): void {\n this.#children.delete(child);\n }\n\n protected lastSourceGeneration: number = 0;\n // Synchronously marks all descendants as stale. This doesn't actually\n // literally mark as stale, but it updates the last source generation, which\n // is used to tell if a cahced result is stale.\n protected markStale(sourceEvent: SourceEvent<any>): void {\n if (sourceEvent.detail.generation !== globalSourceGeneration) {\n // The full stale propagation is synchronous, so there should not be a new one yet.\n throw new Error(\"A TwistyProp was marked stale too late!\");\n }\n if (this.lastSourceGeneration === sourceEvent.detail.generation) {\n // Already propagated.\n return;\n }\n this.lastSourceGeneration = sourceEvent.detail.generation;\n for (const child of this.#children) {\n child.markStale(sourceEvent);\n }\n // We schedule sending out events *after* the (synchronous) propagation has happened, in\n // case one of the listeners updates a source again.\n this.#scheduleRawDispatch();\n }\n\n #rawListeners: Set<() => void> = new Set();\n /** @deprecated */\n addRawListener(listener: () => void, options?: { initial: boolean }): void {\n this.#rawListeners.add(listener);\n if (options?.initial) {\n listener(); // TODO: wrap in a try?\n }\n }\n\n /** @deprecated */\n removeRawListener(listener: () => void): void {\n this.#rawListeners.delete(listener);\n }\n\n /** @deprecated */\n #scheduleRawDispatch(): void {\n if (!this.#rawDispatchPending) {\n this.#rawDispatchPending = true;\n setTimeout(() => this.#dispatchRawListeners(), 0);\n }\n }\n\n #rawDispatchPending: boolean = false;\n #dispatchRawListeners(): void {\n if (!this.#rawDispatchPending) {\n throw new Error(\"Invalid dispatch state!\");\n }\n for (const listener of this.#rawListeners) {\n listener(); // TODO: wrap in a try?\n }\n this.#rawDispatchPending = false;\n }\n\n #freshListeners: Map<(value: T) => void, () => void> = new Map();\n // TODO: Pick a better name.\n public addFreshListener(listener: (value: T) => void): void {\n const staleDropper: StaleDropper<T> = new StaleDropper<T>();\n let lastResult: T | null = null;\n const callback = async () => {\n const result = await staleDropper.queue(this.get());\n if (lastResult !== null && this.canReuse(lastResult, result)) {\n return;\n }\n lastResult = result;\n listener(result);\n };\n this.#freshListeners.set(listener, callback);\n this.addRawListener(callback, { initial: true });\n }\n\n public removeFreshListener(listener: (value: T) => void): void {\n this.removeRawListener(this.#freshListeners.get(listener)!); // TODO: throw a custom error?\n this.#freshListeners.delete(listener);\n }\n}\n\nexport abstract class TwistyPropSource<\n OutputType,\n InputType = OutputType,\n> extends TwistyPropParent<OutputType> {\n #value: Promise<OutputType>;\n\n public abstract getDefaultValue(): PromiseOrValue<OutputType>;\n\n constructor(initialValue?: PromiseOrValue<InputType>) {\n super();\n this.#value = new LazyPromise(async () => this.getDefaultValue());\n if (initialValue) {\n this.#value = this.deriveFromPromiseOrValue(initialValue, this.#value);\n }\n }\n\n set(input: PromiseOrValue<InputType>): void {\n this.#value = this.deriveFromPromiseOrValue(input, this.#value);\n\n const sourceEventDetail: SourceEventDetail<OutputType> = {\n sourceProp: this,\n value: this.#value,\n generation: ++globalSourceGeneration as Generation,\n };\n this.markStale(\n new CustomEvent<SourceEventDetail<OutputType>>(\"stale\", {\n detail: sourceEventDetail,\n }),\n );\n }\n\n async get(): Promise<OutputType> {\n return this.#value;\n }\n\n protected async deriveFromPromiseOrValue(\n input: PromiseOrValue<InputType>,\n oldValuePromise: Promise<OutputType>,\n ): Promise<OutputType> {\n return this.derive(await input, oldValuePromise);\n }\n\n // TODO: add an indirect layer to cache the derivation?\n protected abstract derive(\n input: InputType,\n oldValuePromise: Promise<OutputType>,\n ): PromiseOrValue<OutputType>;\n}\n\nexport abstract class SimpleTwistyPropSource<\n SimpleType,\n> extends TwistyPropSource<SimpleType> {\n protected override derive(input: SimpleType): PromiseOrValue<SimpleType> {\n return input;\n }\n}\n\n// TODO: Can we support `null` as a valid output value without loosening type\n// safety?\nexport const NO_VALUE = Symbol(\"no value\");\nexport type NoValueType = typeof NO_VALUE;\n\nexport abstract class TwistyPropDerived<\n InputTypes extends InputRecord,\n OutputType,\n> extends TwistyPropParent<OutputType> {\n // cachedInputs:\n #parents: InputProps<InputTypes>;\n\n constructor(\n parents: InputProps<InputTypes>,\n protected userVisibleErrorTracker?: UserVisibleErrorTracker,\n ) {\n super();\n this.#parents = parents;\n for (const parent of Object.values(parents)) {\n (\n parent as TwistyPropDerived<InputProps<InputTypes>, OutputType>\n ).addChild(this);\n }\n }\n\n #cachedLastSuccessfulCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n #cachedLatestGenerationCalculation: {\n output: Promise<OutputType>;\n generation: number;\n } | null = null;\n\n public async get(): Promise<OutputType> {\n const generation = this.lastSourceGeneration;\n\n if (this.#cachedLatestGenerationCalculation?.generation === generation) {\n return this.#cachedLatestGenerationCalculation.output;\n }\n\n const latestGenerationCalculation = {\n generation,\n output: this.#cacheDerive(\n this.#getParents(),\n generation,\n this.#cachedLastSuccessfulCalculation,\n ),\n };\n this.#cachedLatestGenerationCalculation = latestGenerationCalculation;\n\n this.userVisibleErrorTracker?.reset();\n return latestGenerationCalculation.output;\n }\n\n async #getParents(): Promise<InputTypes> {\n const inputValuePromises: InputPromises<InputRecord> = {} as any; // TODO\n for (const [key, parent] of Object.entries(this.#parents)) {\n (inputValuePromises as Record<string, Promise<unknown>>)[key] = (\n parent as TwistyPropParent<unknown>\n ).get();\n }\n\n const inputs: InputTypes = {} as any; // TODO\n for (const key in this.#parents) {\n inputs[key] = (await (\n inputValuePromises as Record<string, Promise<unknown>>\n )[key]) as any;\n }\n return inputs;\n }\n\n async #cacheDerive(\n inputsPromise: PromiseOrValue<InputTypes>,\n generation: number,\n cachedLatestGenerationCalculation: {\n inputs: InputTypes;\n output: Promise<OutputType>;\n generation: number;\n } | null = null,\n ): Promise<OutputType> {\n const inputs = await inputsPromise;\n\n const cache = (output: OutputType): OutputType => {\n this.#cachedLastSuccessfulCalculation = {\n inputs,\n output: Promise.resolve(output),\n generation,\n };\n return output;\n };\n\n if (!cachedLatestGenerationCalculation) {\n return cache(await this.derive(inputs));\n }\n\n const cachedInputs = cachedLatestGenerationCalculation.inputs;\n for (const key in this.#parents) {\n const parent = this.#parents[key];\n if (!parent.canReuse(inputs[key], cachedInputs[key])) {\n return cache(await this.derive(inputs));\n }\n }\n\n return cachedLatestGenerationCalculation.output;\n }\n\n protected abstract derive(input: InputTypes): PromiseOrValue<OutputType>;\n}\n\nexport class FreshListenerManager {\n #disconnectionFunctions: (() => void)[] = [];\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n let disconnected = false;\n const wrappedListener = (value: T) => {\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n listener(value);\n };\n\n prop.addFreshListener(wrappedListener);\n\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(wrappedListener);\n disconnected = true;\n });\n }\n\n // TODO: Figure out the signature to let us do overloads\n /** @deprecated */\n public addMultiListener3<U, V, W>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>, TwistyPropParent<W>],\n listener: (values: [U, V, W]) => void,\n ): void {\n this.addMultiListener(props as any, listener as any); // TODO\n }\n public addMultiListener<U, V>(\n props: [TwistyPropParent<U>, TwistyPropParent<V>],\n listener: (values: [U, V]) => void,\n ) {\n let disconnected = false;\n\n // We're going to get one initial call per prop. We'll ignore all but one.\n let initialIgnoresLeft = props.length - 1;\n const wrappedListener = async (_: any) => {\n if (initialIgnoresLeft > 0) {\n initialIgnoresLeft--;\n return;\n }\n if (disconnected) {\n // TODO\n // console.warn(\"Should be disconnected!\");\n return;\n }\n // We rely on `TwistyProp` caching to give us the full set of latest\n // values efficiently.\n const promises = (props as TwistyPropParent<any>[]).map((prop) =>\n prop.get(),\n );\n const values = await Promise.all(promises);\n listener(values as any); // TODO: fix up types\n };\n\n for (const prop of props) {\n prop.addFreshListener(wrappedListener);\n }\n\n this.#disconnectionFunctions.push(() => {\n for (const prop of props) {\n prop.removeFreshListener(wrappedListener);\n }\n disconnected = true;\n });\n }\n\n public disconnect(): void {\n for (const disconnectionFunction of this.#disconnectionFunctions) {\n disconnectionFunction();\n }\n }\n}\n", "// Workarounds for `node`.\n// TODO: figure out how to remove this.\n\n// This stub does not need to be callable, just constructable to satisfy the `node` loader.\nclass HTMLElementStub {}\n\nlet HTMLElementShim: typeof HTMLElement;\nif (globalThis.HTMLElement) {\n HTMLElementShim = globalThis.HTMLElement;\n} else {\n HTMLElementShim = HTMLElementStub as any;\n}\n\nexport { HTMLElementShim };\n\nclass CustomElementsStub {\n define(): void {\n // nothing\n }\n}\n\nlet customElementsShim: typeof customElements;\n\nif (globalThis.customElements) {\n customElementsShim = globalThis.customElements;\n} else {\n customElementsShim = new CustomElementsStub() as any;\n}\n\nexport { customElementsShim };\n\nlet cssStyleSheetShim: typeof CSSStyleSheet;\n\nclass CSSStyleSheetStub {\n replaceSync(): void {\n // nothing\n }\n}\n\nif (globalThis.CSSStyleSheet) {\n cssStyleSheetShim = globalThis.CSSStyleSheet;\n} else {\n cssStyleSheetShim = CSSStyleSheetStub as any;\n}\n\nexport { cssStyleSheetShim };\n", "import {\n customElementsShim,\n HTMLElementShim,\n} from \"./node-custom-element-shims\";\n\n// - Wrapped element\n// - Shadow root\n// - Content wrapper\nexport class ManagedCustomElement extends HTMLElementShim {\n public readonly shadow: ShadowRoot; // TODO: hide this\n public readonly contentWrapper: HTMLDivElement; // TODO: can we get rid of this wrapper?\n\n constructor(options?: { mode?: \"open\" | \"closed\" }) {\n super();\n this.shadow = this.attachShadow({ mode: options?.mode ?? \"closed\" });\n\n this.contentWrapper = document.createElement(\"div\");\n this.contentWrapper.classList.add(\"wrapper\");\n this.shadow.appendChild(this.contentWrapper);\n }\n\n // Add the source, if not already added.\n // Returns the existing if it's already on the element.\n protected addCSS(cssSource: CSSStyleSheet): void {\n this.shadow.adoptedStyleSheets.push(cssSource);\n }\n\n protected removeCSS(cssSource: CSSStyleSheet) {\n const cssIndex = this.shadow.adoptedStyleSheets.indexOf(cssSource);\n if (typeof cssIndex !== \"undefined\") {\n this.shadow.adoptedStyleSheets.splice(cssIndex, cssIndex + 1);\n }\n }\n\n public addElement<T extends Node>(element: T): T {\n return this.contentWrapper.appendChild(element);\n }\n\n public prependElement<T extends Node>(element: T): void {\n this.contentWrapper.prepend(element);\n }\n\n public removeElement<T extends Node>(element: T): T {\n return this.contentWrapper.removeChild(element);\n }\n}\n\ncustomElementsShim.define(\n \"twisty-managed-custom-element\",\n ManagedCustomElement,\n);\n", "import type { MillisecondTimestamp } from \"./AnimationTypes\";\n\n// Debounces `requestAnimationFrame()`.\nexport class RenderScheduler {\n private animFrameID: number | null = null;\n private animFrame = this.animFrameWrapper.bind(this);\n constructor(private callback: (timestamp: MillisecondTimestamp) => void) {}\n\n requestIsPending(): boolean {\n return !!this.animFrameID;\n }\n\n requestAnimFrame(): void {\n if (!this.animFrameID) {\n this.animFrameID = requestAnimationFrame(this.animFrame);\n }\n }\n\n cancelAnimFrame(): void {\n if (this.animFrameID) {\n cancelAnimationFrame(this.animFrameID);\n this.animFrameID = 0;\n }\n }\n\n private animFrameWrapper(timestamp: DOMHighResTimeStamp): void {\n this.animFrameID = 0;\n this.callback(timestamp as MillisecondTimestamp);\n }\n}\n\n// An interface for classes to use to expose their scheduling.\nexport interface Schedulable {\n scheduleRender(): void;\n}\n", "import { SimpleTwistyPropSource } from \"../../TwistyProp\";\n\n// TODO: turn these maps into `Set`s?\nexport const hintFaceletStyles = {\n floating: true, // default\n none: true,\n};\nexport type HintFaceletStyle = keyof typeof hintFaceletStyles;\nexport type HintFaceletStyleWithAuto = HintFaceletStyle | \"auto\";\n\nexport class HintFaceletProp extends SimpleTwistyPropSource<HintFaceletStyleWithAuto> {\n getDefaultValue(): HintFaceletStyleWithAuto {\n return \"auto\";\n }\n}\n", "export const TAU = Math.PI * 2;\nexport const DEGREES_PER_RADIAN = 360 / TAU;\n", "/**\n * @author mrdoob / http://mrdoob.com/\n * ESM conversion by Lucas Garron, 2021-12-21\n */\n\nconst performance:\n | null\n | (Performance & {\n memory?: {\n usedJSHeapSize: number;\n jsHeapSizeLimit: number;\n };\n }) = globalThis.performance;\n\nexport class Stats {\n mode = 0;\n\n dom = document.createElement(\"div\");\n\n constructor() {\n this.dom.style.cssText =\n \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\";\n this.dom.addEventListener(\n \"click\",\n (event) => {\n event.preventDefault();\n this.showPanel(++this.mode % this.dom.children.length);\n },\n false,\n );\n\n this.showPanel(0);\n }\n\n addPanel(panel: StatsPanel): StatsPanel {\n this.dom.appendChild(panel.dom);\n return panel;\n }\n\n showPanel(id: number): void {\n for (let i = 0; i < this.dom.children.length; i++) {\n (this.dom.children[i] as HTMLElement).style.display =\n i === id ? \"block\" : \"none\";\n }\n\n this.mode = id;\n }\n\n beginTime = (performance || Date).now();\n prevTime = this.beginTime;\n frames = 0;\n\n fpsPanel = this.addPanel(new StatsPanel(\"FPS\", \"#0ff\", \"#002\"));\n msPanel = this.addPanel(new StatsPanel(\"MS\", \"#0f0\", \"#020\"));\n memPanel = performance?.memory\n ? this.addPanel(new StatsPanel(\"MB\", \"#f08\", \"#201\"))\n : null;\n REVISION = 16;\n\n begin() {\n this.beginTime = (performance || Date).now();\n }\n\n end() {\n this.frames++;\n\n const time = (performance || Date).now();\n\n this.msPanel.update(time - this.beginTime, 200);\n\n if (time >= this.prevTime + 1000) {\n this.fpsPanel.update((this.frames * 1000) / (time - this.prevTime), 100);\n\n this.prevTime = time;\n this.frames = 0;\n\n if (this.memPanel) {\n const memory = performance!.memory!;\n this.memPanel.update(\n memory.usedJSHeapSize / 1048576,\n memory.jsHeapSizeLimit / 1048576,\n );\n }\n }\n\n return time;\n }\n\n update() {\n this.beginTime = this.end();\n }\n}\n\nconst PR = Math.round(globalThis?.window?.devicePixelRatio ?? 1);\n\nconst WIDTH = 80 * PR;\nconst HEIGHT = 48 * PR;\nconst TEXT_X = 3 * PR;\nconst TEXT_Y = 2 * PR;\nconst GRAPH_X = 3 * PR;\nconst GRAPH_Y = 15 * PR;\nconst GRAPH_WIDTH = 74 * PR;\nconst GRAPH_HEIGHT = 30 * PR;\n\nexport class StatsPanel {\n min = Infinity;\n max = 0;\n dom = document.createElement(\"canvas\");\n context = this.dom.getContext(\"2d\")!;\n constructor(\n private name: string,\n private fg: string,\n private bg: string,\n ) {\n this.dom.width = WIDTH;\n this.dom.height = HEIGHT;\n this.dom.style.cssText = \"width:80px;height:48px\";\n\n this.context.font = `bold ${9 * PR}px Helvetica,Arial,sans-serif`;\n this.context.textBaseline = \"top\";\n\n this.context.fillStyle = bg;\n this.context.fillRect(0, 0, WIDTH, HEIGHT);\n\n this.context.fillStyle = fg;\n this.context.fillText(name, TEXT_X, TEXT_Y);\n this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n\n this.context.fillStyle = bg;\n this.context.globalAlpha = 0.9;\n this.context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT);\n }\n\n update(value: number, maxValue: number) {\n this.min = Math.min(this.min, value);\n this.max = Math.max(this.max, value);\n\n this.context.fillStyle = this.bg;\n this.context.globalAlpha = 1;\n this.context.fillRect(0, 0, WIDTH, GRAPH_Y);\n this.context.fillStyle = this.fg;\n this.context.fillText(\n `${Math.round(value)} ${this.name} (${Math.round(this.min)}-${Math.round(\n this.max,\n )})`,\n TEXT_X,\n TEXT_Y,\n );\n\n this.context.drawImage(\n this.dom,\n GRAPH_X + PR,\n GRAPH_Y,\n GRAPH_WIDTH - PR,\n GRAPH_HEIGHT,\n GRAPH_X,\n GRAPH_Y,\n GRAPH_WIDTH - PR,\n GRAPH_HEIGHT,\n );\n\n this.context.fillRect(\n GRAPH_X + GRAPH_WIDTH - PR,\n GRAPH_Y,\n PR,\n GRAPH_HEIGHT,\n );\n\n this.context.fillStyle = this.bg;\n this.context.globalAlpha = 0.9;\n this.context.fillRect(\n GRAPH_X + GRAPH_WIDTH - PR,\n GRAPH_Y,\n PR,\n Math.round((1 - value / maxValue) * GRAPH_HEIGHT),\n );\n }\n}\n", "// TODO can we remove the cached proxy?\n\nimport { LazyPromise } from \"@cubing/lazy-promise\";\n\nexport const bulk3DCode = new LazyPromise(\n () => import(\"./dynamic-entries/twisty-dynamic-3d\"),\n);\n", "let globalPixelRatioOverride: number | null = null;\nexport function setGlobalPixelRatioOverride(override: number | null): void {\n globalPixelRatioOverride = override;\n}\n\n// TODO: Handle if you move across screens?\nexport function pixelRatio(): number {\n return globalPixelRatioOverride ?? (devicePixelRatio || 1);\n}\n", "// export class Drag() {\n\n// }\n\ninterface DragInfo {\n attachedInfo: Record<any, any>;\n hasMoved: boolean;\n lastClientX: number;\n lastClientY: number;\n lastTimeStamp: number;\n}\n\ntype PointerID = number;\n\nexport interface DragMovementInfo {\n attachedInfo: Record<any, any>;\n movementX: number;\n movementY: number;\n elapsedMs: number;\n}\n\nexport interface UpInfo {\n attachedInfo: Record<any, any>;\n}\n\nexport interface PressInfo {\n normalizedX: number;\n normalizedY: number;\n rightClick: boolean;\n keys: {\n // TODO: group these\n altKey: boolean;\n ctrlOrMetaKey: boolean;\n shiftKey: boolean;\n };\n}\n\n// Chrome can report movements as low as `0.0000152587890625` even if the cursor did not move at all. So we need a treshold instead.\nconst MOVEMENT_EPSILON = 0.1; // px\n\nexport class DragTracker extends EventTarget {\n #dragInfoMap: Map<PointerID, DragInfo> = new Map();\n\n constructor(public readonly target: HTMLElement) {\n super();\n }\n\n // Idempotent\n start() {\n this.addTargetListener(\"pointerdown\", this.onPointerDown.bind(this));\n // Prevent right-click on desktop (only tested on macOS Chrome/Safari/Firefox) so we can detect right-click moves.\n // TODO: Can we do this selectively, e.g. only on the puzzle? That way we could allow right-click to download the canvas. Unfortunately, it would probably require a sync calculation.\n this.addTargetListener(\"contextmenu\", (e: MouseEvent) => {\n e.preventDefault();\n });\n // Prevent touch scrolling (preventing default on `pointermove` doesn't work).\n this.addTargetListener(\"touchmove\", (e: PointerEvent) =>\n e.preventDefault(),\n );\n // Prevent zooming on double-tap (iOS).\n // This is because `dblclick` works to zoom in, but does *not* work to zoom out. So the user can get stuck zoomed into the player without a way to zoom out.\n this.addTargetListener(\"dblclick\", (e: MouseEvent) => e.preventDefault());\n }\n\n // Idempotent\n stop(): void {\n for (const [eventType, listener] of this.#targetListeners.entries()) {\n this.target.removeEventListener(\n eventType,\n listener as unknown as EventListener,\n ); // TODO\n }\n this.#targetListeners.clear();\n this.#lazyListenersRegistered = false;\n }\n\n #targetListeners = new Map<\n string,\n ((e: MouseEvent) => any) | ((e: PointerEvent) => any)\n >();\n addTargetListener(\n eventType: string,\n listener: ((e: MouseEvent) => any) | ((e: PointerEvent) => any),\n ) {\n if (!this.#targetListeners.has(eventType)) {\n this.target.addEventListener(\n eventType,\n listener as unknown as EventListener, // TODO\n );\n this.#targetListeners.set(eventType, listener);\n }\n }\n\n // This allows us to avoid getting a callback every time the pointer moves over the canvas, until we have a down event.\n // TODO: Ideally we'd also support unregistering when we're certain there are no more active touches. But this means we need to properly handle every way a pointer \"click\" can end, which is tricky across environments (due to e.g. mouse vs. touch vs. stylues, canvas/viewport/window/scroll boundaries, right-click and other ways of losing focus, etc.), so we conservatively leave the listeners on.\n #lazyListenersRegistered: boolean = false;\n #registerLazyListeners(): void {\n if (this.#lazyListenersRegistered) {\n return;\n }\n this.addTargetListener(\"pointermove\", this.onPointerMove.bind(this)); // TODO: only register this after pointer down.\n this.addTargetListener(\"pointerup\", this.onPointerUp.bind(this));\n this.#lazyListenersRegistered = true;\n }\n\n #clear(e: PointerEvent): void {\n this.#dragInfoMap.delete(e.pointerId);\n }\n\n // `null`: means: ignore this result (no movement, or not\n #trackDrag(e: PointerEvent): {\n movementInfo: DragMovementInfo | null;\n hasMoved: boolean;\n } {\n // TODO: Find a way to detect if this is an active press, in a way that works cross-platform.\n // if (e.buttons === 0) {\n // return { movementInfo: null, hasMoved: false };\n // }\n const existing = this.#dragInfoMap.get(e.pointerId);\n if (!existing) {\n return { movementInfo: null, hasMoved: false };\n }\n // We would try to use `e.movementX`/`e.movementY`, except Safari:\n // - Does not have those values on i[Pad]OS.\n // - Will always report `0` for these values on macOS.\n // https://bugs.webkit.org/show_bug.cgi?id=220194\n //\n // The following are all insufficiently powerful for detecting the Safari `0` bug:\n // - `\"movementX\" in e`\n // - `e.movementX !== \"undefined\"`\n // - `e.hasOwnProperty(\"movementX\")`\n\n let movementInfo: DragMovementInfo;\n if ((e.movementX ?? 0) !== 0 || (e.movementY ?? 0) !== 0) {\n // We optimistically try to catch sub-pixel movements in Chrome.\n movementInfo = {\n attachedInfo: existing.attachedInfo,\n movementX: e.movementX,\n movementY: e.movementY,\n elapsedMs: e.timeStamp - existing.lastTimeStamp,\n };\n } else {\n movementInfo = {\n attachedInfo: existing.attachedInfo,\n movementX: e.clientX - existing.lastClientX,\n movementY: e.clientY - existing.lastClientY,\n elapsedMs: e.timeStamp - existing.lastTimeStamp,\n };\n }\n existing.lastClientX = e.clientX;\n existing.lastClientY = e.clientY;\n existing.lastTimeStamp = e.timeStamp;\n if (\n Math.abs(movementInfo.movementX) < MOVEMENT_EPSILON &&\n Math.abs(movementInfo.movementY) < MOVEMENT_EPSILON\n ) {\n return { movementInfo: null, hasMoved: existing.hasMoved };\n } else {\n existing.hasMoved = true;\n return { movementInfo, hasMoved: existing.hasMoved };\n }\n }\n\n private onPointerDown(e: PointerEvent) {\n this.#registerLazyListeners();\n const newDragInfo: DragInfo = {\n attachedInfo: {},\n hasMoved: false,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n lastTimeStamp: e.timeStamp,\n };\n this.#dragInfoMap.set(e.pointerId, newDragInfo);\n this.target.setPointerCapture(e.pointerId);\n }\n\n private onPointerMove(e: PointerEvent) {\n const movementInfo = this.#trackDrag(e).movementInfo;\n if (movementInfo) {\n e.preventDefault();\n this.dispatchEvent(\n new CustomEvent(\"move\", {\n detail: movementInfo,\n }),\n );\n }\n }\n\n private onPointerUp(e: PointerEvent) {\n const trackDragResult = this.#trackDrag(e);\n const existing = this.#dragInfoMap.get(e.pointerId)!; // TODO\n this.#clear(e);\n this.target.releasePointerCapture(e.pointerId); // TODO: unnecessary?\n let event: CustomEvent;\n if (trackDragResult.hasMoved) {\n // TODO: send proper movement/momentum since last move event.\n event = new CustomEvent<UpInfo>(\"up\", {\n detail: { attachedInfo: existing.attachedInfo },\n });\n } else {\n const { altKey, ctrlKey, metaKey, shiftKey } = e;\n event = new CustomEvent<PressInfo>(\"press\", {\n detail: {\n normalizedX: (e.offsetX / this.target.offsetWidth) * 2 - 1,\n normalizedY: 1 - (e.offsetY / this.target.offsetHeight) * 2,\n rightClick: !!(e.button & 2),\n keys: {\n altKey,\n ctrlOrMetaKey: ctrlKey || metaKey,\n shiftKey,\n },\n },\n });\n }\n this.dispatchEvent(event);\n }\n}\n", "// TODO: https://stackoverflow.com/a/40443642\n\n// let shareAllNewRenderers: boolean = false;\n\n// // WARNING: The current shared renderer implementation is not every efficient.\n// // Avoid using for players that are likely to have dimensions approaching 1 megapixel or higher.\n// // TODO: use a dedicated renderer while fullscreen?\n// export function experimentalSetShareAllNewRenderers(share: boolean): void {\n// shareAllNewRenderers = share;\n// }\n\n// const sharedRenderer: WebGLRenderer | null = null;\n\nimport { bulk3DCode } from \"../../heavy-code-imports/3d\";\nimport type {\n Camera,\n LinearSRGBColorSpace,\n Scene,\n WebGLRenderer,\n} from \"../../heavy-code-imports/three-types\";\nimport { pixelRatio } from \"../canvas\";\n\nconst renderers: Promise<WebGLRenderer>[] = [];\n\n// Render result is guaranteed to be available synchronously at resolution time.\nexport async function rawRenderPooled(\n width: number,\n height: number,\n scene: Scene,\n camera: Camera,\n): Promise<HTMLCanvasElement> {\n // At most one in the pool for now.\n if (renderers.length === 0) {\n renderers.push(newRenderer());\n }\n const renderer = await renderers[0];\n // TODO: scissoring\n renderer.setSize(width, height); // TODO: is it faster if we cache values and only call this when necessary?\n renderer.render(scene, camera);\n\n return renderer.domElement;\n}\n\n// let haveSet = false;\nexport async function renderPooled(\n width: number,\n height: number,\n canvas: HTMLCanvasElement,\n scene: Scene,\n camera: Camera,\n): Promise<void> {\n if (width === 0 || height === 0) {\n return;\n }\n // At most one in the pool for now.\n if (renderers.length === 0) {\n renderers.push(newRenderer());\n }\n\n const rendererCanvas = await rawRenderPooled(width, height, scene, camera);\n\n // TODO: Should we cache this? Seems to take about 0.0001ms to get.\n const context = canvas.getContext(\"2d\")!;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.drawImage(rendererCanvas, 0, 0);\n}\n\n// Workaround to avoid an import of `three`.\nconst linearSRGBColorSpace =\n \"srgb-linear\" satisfies typeof LinearSRGBColorSpace;\n\nexport async function newRenderer(): Promise<WebGLRenderer> {\n const rendererConstructor = (await bulk3DCode).ThreeWebGLRenderer;\n const renderer = new rendererConstructor({\n antialias: true,\n alpha: true,\n });\n renderer.outputColorSpace = linearSRGBColorSpace; // TODO(https://github.com/cubing/cubing.js/issues/308): remove this\n renderer.setPixelRatio(pixelRatio());\n return renderer;\n}\n", "// The `position` values are a hack for a bug in Safari where the canvas either\n// grows infinitely, or takes up the full `fr` of any encompassing grid (making\n// the contents of that element e.g. over 100% of its height). `contain:\n// content` is a good fix for this, but there is no indication that Safari will\n// support it soon. https://developer.mozilla.org/en-US/docs/Web/CSS/contain\n\nimport { cssStyleSheetShim } from \"../node-custom-element-shims\";\n\nexport const twisty3DVantageCSS = new cssStyleSheetShim();\ntwisty3DVantageCSS.replaceSync(\n `\n:host {\n width: 384px;\n height: 256px;\n display: grid;\n}\n\n.wrapper {\n width: 100%;\n height: 100%;\n display: grid;\n overflow: hidden;\n place-content: center;\n contain: strict;\n}\n\n.loading {\n width: 4em;\n height: 4em;\n border-radius: 2.5em;\n border: 0.5em solid rgba(0, 0, 0, 0);\n border-top: 0.5em solid rgba(0, 0, 0, 0.7);\n border-right: 0.5em solid rgba(0, 0, 0, 0.7);\n animation: fade-in-delayed 4s, rotate 1s linear infinite;\n}\n\n@keyframes fade-in-delayed {\n 0% { opacity: 0; }\n 25% {opacity: 0; }\n 100% { opacity: 1; }\n}\n\n@keyframes rotate {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* TODO: This is due to stats hack. Replace with \\`canvas\\`. */\n.wrapper > canvas {\n max-width: 100%;\n max-height: 100%;\n animation: fade-in 0.25s ease-in;\n}\n\n@keyframes fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.wrapper.invisible {\n opacity: 0;\n}\n\n.wrapper.drag-input-enabled > canvas {\n cursor: grab;\n}\n\n.wrapper.drag-input-enabled > canvas:active {\n cursor: grabbing;\n}\n`,\n);\n", "import type { Vector3 } from \"three/src/Three.js\";\nimport { RenderScheduler } from \"../../controllers/RenderScheduler\";\nimport { bulk3DCode } from \"../../heavy-code-imports/3d\";\nimport type { OrbitCoordinates } from \"../../model/props/viewer/OrbitCoordinatesRequestProp\";\nimport type { TwistyPlayerModel } from \"../../model/TwistyPlayerModel\";\nimport type { DragMovementInfo, DragTracker } from \"./DragTracker\";\nimport { DEGREES_PER_RADIAN } from \"./TAU\";\n\nconst INERTIA_DEFAULT: boolean = true;\n\nconst INERTIA_DURATION_MS = 500;\n// If the first inertial render is this long after the last move, we assume the\n// user has halted the cursor and we consider inertia to have \"timed out\". We\n// never begin animating the inertia.\nconst INERTIA_TIMEOUT_MS = 50;\n\nconst VERTICAL_MOVEMENT_BASE_SCALE = 0.75;\n\n// progress is from 0 to 1.\nfunction momentumScale(progress: number) {\n // This is the exponential curve flipped so that\n // - The slope at progress = 0 is 1 (this corresponds to \"x = 1\" on the normal\n // curve).\n // - The scale exponentially \"decays\" until progress = 1.\n // This means the scale at the end will be about 0.418\n return (Math.exp(1 - progress) - (1 - progress)) / (1 - Math.E) + 1;\n}\n\nclass Inertia {\n private scheduler = new RenderScheduler(this.render.bind(this));\n private lastTimestamp: number;\n constructor(\n private startTimestamp: number,\n private momentumX: number,\n private momentumY: number,\n private callback: (movementX: number, movementY: number) => void,\n ) {\n this.scheduler.requestAnimFrame();\n this.lastTimestamp = startTimestamp;\n }\n\n private render(now: DOMHighResTimeStamp) {\n const progressBefore =\n (this.lastTimestamp - this.startTimestamp) / INERTIA_DURATION_MS;\n const progressAfter = Math.min(\n 1,\n (now - this.startTimestamp) / INERTIA_DURATION_MS,\n );\n\n if (\n progressBefore === 0 &&\n progressAfter > INERTIA_TIMEOUT_MS / INERTIA_DURATION_MS\n ) {\n // The user has already paused for a while. Don't start any inertia.\n return;\n }\n\n const delta = momentumScale(progressAfter) - momentumScale(progressBefore);\n\n // TODO: For now, we only carry horizontal momentum. If this should stay, we\n // can remove the plumbing for the Y dimension.\n this.callback(this.momentumX * delta * 1000, this.momentumY * delta * 1000);\n\n if (progressAfter < 1) {\n this.scheduler.requestAnimFrame();\n }\n this.lastTimestamp = now;\n }\n}\n\nexport async function positionToOrbitCoordinates(\n position: Vector3,\n): Promise<OrbitCoordinates> {\n const spherical = new (await bulk3DCode).ThreeSpherical();\n spherical.setFromVector3(position);\n return {\n latitude: 90 - spherical.phi * DEGREES_PER_RADIAN,\n longitude: spherical.theta * DEGREES_PER_RADIAN,\n distance: spherical.radius,\n };\n}\n\ninterface TwistyOrbitControlsDragAttachedInfo {\n lastTemperedX: number;\n lastTemperedY: number;\n timestamp: number;\n}\n\n// TODO: change mouse cursor while moving.\nexport class TwistyOrbitControls {\n /** @deprecated */\n experimentalInertia: boolean = INERTIA_DEFAULT;\n private onMovementBound = this.onMovement.bind(this);\n public experimentalHasBeenMoved: boolean = false;\n constructor(\n private model: TwistyPlayerModel,\n private mirror: boolean,\n private canvas: HTMLCanvasElement,\n private dragTracker: DragTracker,\n ) {\n this.dragTracker.addEventListener(\n \"move\",\n this.onMove.bind(this) as any as EventListener, // TODO: https://github.com/microsoft/TypeScript/issues/28357\n );\n this.dragTracker.addEventListener(\n \"up\",\n this.onUp.bind(this) as any as EventListener, // TODO: https://github.com/microsoft/TypeScript/issues/28357\n );\n }\n\n // f is the fraction of the canvas traversed per ms.\n temperMovement(f: number): number {\n // This is scaled to be linear for small values, but to reduce large values\n // by a significant factor.\n return (Math.sign(f) * Math.log(Math.abs(f * 10) + 1)) / 6;\n }\n\n onMove(e: CustomEvent<DragMovementInfo>): void {\n e.detail.attachedInfo ??= {};\n\n const { temperedX, temperedY } = this.onMovement(\n e.detail.movementX,\n e.detail.movementY,\n );\n const attachedInfo = e.detail\n .attachedInfo as TwistyOrbitControlsDragAttachedInfo;\n attachedInfo.lastTemperedX = temperedX * 10;\n attachedInfo.lastTemperedY = temperedY * 10;\n attachedInfo.timestamp = e.timeStamp; // TODO\n }\n\n onMovement(\n movementX: number,\n movementY: number,\n ): {\n temperedX: number;\n temperedY: number;\n } {\n const scale = this.mirror ? -1 : 1;\n\n // TODO: refactor\n const minDim = Math.min(this.canvas.offsetWidth, this.canvas.offsetHeight);\n\n const temperedX = this.temperMovement(movementX / minDim);\n const temperedY = this.temperMovement(\n (movementY / minDim) * VERTICAL_MOVEMENT_BASE_SCALE,\n );\n this.model.twistySceneModel.orbitCoordinatesRequest.set(\n (async () => {\n const prevCoords =\n await this.model.twistySceneModel.orbitCoordinates.get();\n\n const newCoords = {\n latitude:\n prevCoords.latitude + 2 * temperedY * DEGREES_PER_RADIAN * scale,\n longitude: prevCoords.longitude - 2 * temperedX * DEGREES_PER_RADIAN,\n };\n return newCoords;\n })(),\n );\n return { temperedX, temperedY };\n }\n\n onUp(e: CustomEvent<DragMovementInfo>): void {\n e.preventDefault();\n if (\n \"lastTemperedX\" in e.detail.attachedInfo &&\n \"lastTemperedY\" in e.detail.attachedInfo &&\n \"timestamp\" in e.detail.attachedInfo &&\n e.timeStamp - e.detail.attachedInfo[\"timestamp\"] < 60 // TODO\n ) {\n new Inertia(\n e.timeStamp, // TODO\n (e.detail.attachedInfo as TwistyOrbitControlsDragAttachedInfo)\n .lastTemperedX,\n (e.detail.attachedInfo as TwistyOrbitControlsDragAttachedInfo)\n .lastTemperedY,\n this.onMovementBound,\n ); // TODO: cancel inertia\n }\n }\n}\n", "import type { PerspectiveCamera, WebGLRenderer } from \"three/src/Three.js\";\nimport { Stats } from \"../../../vendor/mit/three/examples/jsm/libs/stats.modified.module\";\nimport { RenderScheduler } from \"../../controllers/RenderScheduler\";\nimport { twistyDebugGlobals } from \"../../debug\";\nimport { bulk3DCode } from \"../../heavy-code-imports/3d\";\nimport { StaleDropper } from \"../../model/PromiseFreshener\";\nimport type { DragInputMode } from \"../../model/props/puzzle/state/DragInputProp\";\nimport type { TwistyPropParent } from \"../../model/props/TwistyProp\";\nimport type { OrbitCoordinates } from \"../../model/props/viewer/OrbitCoordinatesRequestProp\";\nimport type { TwistyPlayerModel } from \"../../model/TwistyPlayerModel\";\nimport { pixelRatio } from \"../canvas\";\nimport { ManagedCustomElement } from \"../ManagedCustomElement\";\nimport { customElementsShim } from \"../node-custom-element-shims\";\nimport { DragTracker, type PressInfo } from \"./DragTracker\";\nimport { newRenderer, renderPooled } from \"./RendererPool\";\nimport { DEGREES_PER_RADIAN } from \"./TAU\";\nimport type { Twisty3DSceneWrapper } from \"./Twisty3DSceneWrapper\";\nimport { twisty3DVantageCSS } from \"./Twisty3DVantage.css\";\nimport { TwistyOrbitControls } from \"./TwistyOrbitControls\";\n\nexport async function setCameraFromOrbitCoordinates(\n camera: PerspectiveCamera,\n orbitCoordinates: OrbitCoordinates,\n backView: boolean = false,\n): Promise<void> {\n const spherical = new (await bulk3DCode).ThreeSpherical(\n orbitCoordinates.distance,\n (90 - (backView ? -1 : 1) * orbitCoordinates.latitude) / DEGREES_PER_RADIAN,\n ((backView ? 180 : 0) + orbitCoordinates.longitude) / DEGREES_PER_RADIAN,\n );\n spherical.makeSafe();\n camera.position.setFromSpherical(spherical);\n camera.lookAt(0, 0, 0);\n}\n\nlet dedicatedRenderersSoFar = 0;\nconst DEFAULT_MAX_DEDICATED_RENDERERS = 2; // This allows for a front view and a back view (or two separate front views).\nlet sharingRenderers = false;\nfunction shareRenderer(): boolean {\n if (twistyDebugGlobals.shareAllNewRenderers !== \"auto\") {\n if (!twistyDebugGlobals.shareAllNewRenderers) {\n dedicatedRenderersSoFar++;\n }\n return twistyDebugGlobals.shareAllNewRenderers !== \"never\";\n }\n if (dedicatedRenderersSoFar < DEFAULT_MAX_DEDICATED_RENDERERS) {\n dedicatedRenderersSoFar++;\n return false;\n } else {\n sharingRenderers = true;\n return true;\n }\n}\n\nexport function haveStartedSharingRenderers(): boolean {\n return sharingRenderers;\n}\n\nexport class Twisty3DVantage extends ManagedCustomElement {\n scene: Twisty3DSceneWrapper | null = null;\n\n stats: Stats | null = null;\n\n private rendererIsShared: boolean = shareRenderer();\n\n loadingElement: HTMLDivElement | null = null;\n constructor(\n private model?: TwistyPlayerModel,\n scene?: Twisty3DSceneWrapper,\n private options?: { backView?: boolean },\n ) {\n super();\n this.scene = scene ?? null;\n\n this.loadingElement = this.addElement(document.createElement(\"div\"));\n this.loadingElement.classList.add(\"loading\");\n\n if (twistyDebugGlobals.showRenderStats) {\n this.stats = new Stats();\n this.stats.dom.style.position = \"absolute\";\n this.contentWrapper.appendChild(this.stats.dom);\n }\n }\n\n async connectedCallback(): Promise<void> {\n this.addCSS(twisty3DVantageCSS);\n this.addElement((await this.canvasInfo()).canvas);\n\n void this.#onResize();\n const observer = new ResizeObserver(this.#onResize.bind(this));\n observer.observe(this.contentWrapper);\n void this.orbitControls(); // Instantiate orbit controls\n void this.#setupBasicPresses();\n\n this.scheduleRender();\n }\n\n async #setupBasicPresses(): Promise<void> {\n const dragTracker = await this.#dragTracker();\n dragTracker.addEventListener(\n \"press\",\n (async (e: CustomEvent<PressInfo>) => {\n const movePressInput =\n await this.model!.twistySceneModel.movePressInput.get();\n if (movePressInput !== \"basic\") {\n return;\n }\n this.dispatchEvent(\n new CustomEvent(\"press\", {\n detail: {\n pressInfo: e.detail,\n cameraPromise: this.camera(),\n },\n }),\n );\n }) as any as EventListener, // TODO\n );\n }\n\n #onResizeStaleDropper = new StaleDropper<PerspectiveCamera>();\n\n async clearCanvas(): Promise<void> {\n if (this.rendererIsShared) {\n const canvasInfo = await this.canvasInfo();\n canvasInfo.context.clearRect(\n 0,\n 0,\n canvasInfo.canvas.width,\n canvasInfo.canvas.height,\n );\n } else {\n const renderer = await this.renderer();\n const context = renderer.getContext();\n context.clear(context.COLOR_BUFFER_BIT);\n }\n }\n\n // TODO: Why doesn't this work for the top-right back view height?\n #width: number = 0;\n #height: number = 0;\n async #onResize(): Promise<void> {\n const camera = await this.#onResizeStaleDropper.queue(this.camera());\n\n const w = this.contentWrapper.clientWidth;\n const h = this.contentWrapper.clientHeight;\n this.#width = w;\n this.#height = h;\n const off = 0;\n let yoff = 0;\n let excess = 0;\n if (h > w) {\n excess = h - w;\n yoff = -Math.floor(0.5 * excess);\n }\n camera.aspect = w / h;\n camera.setViewOffset(w, h - excess, off, yoff, w, h);\n camera.updateProjectionMatrix(); // TODO\n\n void this.clearCanvas();\n if (this.rendererIsShared) {\n const canvasInfo = await this.canvasInfo();\n\n canvasInfo.canvas.width = w * pixelRatio();\n canvasInfo.canvas.height = h * pixelRatio();\n canvasInfo.canvas.style.width = `${w.toString()}px`;\n canvasInfo.canvas.style.height = `${h.toString()}px`;\n } else {\n const renderer = await this.renderer();\n renderer.setSize(w, h, true);\n }\n\n this.scheduleRender();\n }\n\n #cachedRenderer: Promise<WebGLRenderer> | null = null;\n async renderer(): Promise<WebGLRenderer> {\n if (this.rendererIsShared) {\n throw new Error(\"renderer expected to be shared.\");\n }\n return (this.#cachedRenderer ??= newRenderer());\n }\n\n #cachedCanvas: Promise<{\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }> | null = null;\n async canvasInfo(): Promise<{\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }> {\n return (this.#cachedCanvas ??= (async () => {\n let canvas: HTMLCanvasElement;\n if (this.rendererIsShared) {\n canvas = this.addElement(document.createElement(\"canvas\"));\n } else {\n const renderer = await this.renderer();\n canvas = this.addElement(renderer.domElement);\n }\n this.loadingElement?.remove();\n const context = canvas.getContext(\"2d\")!;\n return { canvas, context };\n })());\n }\n\n #cachedDragTracker: Promise<DragTracker> | null = null;\n async #dragTracker(): Promise<DragTracker> {\n return (this.#cachedDragTracker ??= (async () => {\n const dragTracker = new DragTracker((await this.canvasInfo()).canvas);\n this.model?.twistySceneModel.dragInput.addFreshListener(\n (dragInputMode: DragInputMode) => {\n let dragInputEnabled = false;\n switch (dragInputMode) {\n case \"auto\": {\n dragTracker.start();\n dragInputEnabled = true;\n break;\n }\n case \"none\": {\n dragTracker.stop();\n break;\n }\n }\n this.contentWrapper.classList.toggle(\n \"drag-input-enabled\",\n dragInputEnabled,\n );\n },\n );\n return dragTracker;\n })());\n }\n\n #cachedCamera: Promise<PerspectiveCamera> | null = null;\n async camera(): Promise<PerspectiveCamera> {\n return (this.#cachedCamera ??= (async () => {\n const camera = new (await bulk3DCode).ThreePerspectiveCamera(\n 20,\n 1, // We rely on the resize logic to handle this.\n 0.1,\n 20,\n );\n camera.position.copy(\n new (await bulk3DCode).ThreeVector3(2, 4, 4).multiplyScalar(\n this.options?.backView ? -1 : 1,\n ),\n );\n camera.lookAt(0, 0, 0);\n // TODO: `TwistyOrbitControls` breaks isolateion\n return camera;\n })());\n }\n\n #cachedOrbitControls: Promise<TwistyOrbitControls> | null = null;\n async orbitControls(): Promise<TwistyOrbitControls> {\n return (this.#cachedOrbitControls ??= (async () => {\n const orbitControls = new TwistyOrbitControls(\n this.model!,\n !!this.options?.backView,\n (await this.canvasInfo()).canvas,\n await this.#dragTracker(),\n );\n\n if (this.model) {\n this.addListener(\n this.model.twistySceneModel.orbitCoordinates,\n async (orbitCoordinates: OrbitCoordinates) => {\n const camera = await this.camera();\n void setCameraFromOrbitCoordinates(\n camera,\n orbitCoordinates,\n this.options?.backView,\n );\n // TODO: Wrap in StaleDropper?\n\n this.scheduleRender();\n },\n );\n }\n\n return orbitControls;\n })());\n }\n\n addListener<T>(\n prop: TwistyPropParent<T>,\n listener: (value: T) => void,\n ): void {\n prop.addFreshListener(listener);\n this.#disconnectionFunctions.push(() => {\n prop.removeFreshListener(listener);\n // disconnected = true; // TODO\n });\n }\n\n #disconnectionFunctions: (() => void)[] = [];\n disconnect(): void {\n for (const fn of this.#disconnectionFunctions) {\n fn();\n }\n this.#disconnectionFunctions = []; // TODO: Encapsulate this.\n }\n\n #experimentalNextRenderFinishedCallback: (() => void) | null = null;\n experimentalNextRenderFinishedCallback(callback: () => void): void {\n this.#experimentalNextRenderFinishedCallback = callback;\n }\n\n async render(): Promise<void> {\n if (!this.scene) {\n throw new Error(\"Attempted to render without a scene\");\n }\n\n this.stats?.begin();\n\n const [scene, camera, canvas] = await Promise.all([\n this.scene.scene(),\n this.camera(),\n this.canvasInfo(),\n ]);\n if (this.rendererIsShared) {\n await renderPooled(\n this.#width,\n this.#height,\n canvas.canvas,\n scene,\n camera,\n );\n } else {\n (await this.renderer()).render(scene, camera);\n }\n\n this.stats?.end();\n this.#experimentalNextRenderFinishedCallback?.();\n this.#experimentalNextRenderFinishedCallback = null;\n }\n\n #scheduler = new RenderScheduler(this.render.bind(this));\n scheduleRender(): void {\n // console.log(\"scheduling\", this);\n this.#scheduler.requestAnimFrame();\n }\n}\n\ncustomElementsShim.define(\"twisty-3d-vantage\", Twisty3DVantage);\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,3 +1,6 @@
1
+ import {
2
+ countMoves
3
+ } from "./chunk-UEUJSZTX.js";
1
4
  import {
2
5
  addOrientationSuffix,
3
6
  expose,
@@ -7,22 +10,24 @@ import {
7
10
  random333Scramble,
8
11
  setIsInsideWorker,
9
12
  solve333
10
- } from "./chunk-SGJ5WPE4.js";
13
+ } from "./chunk-H5KMIDAF.js";
11
14
  import {
12
- LazyPromise,
13
- countMoves,
14
15
  cube2x2x2,
15
- puzzles
16
- } from "./chunk-VRTKWZPL.js";
16
+ puzzles,
17
+ wcaEvents
18
+ } from "./chunk-FUAADKXE.js";
19
+ import {
20
+ LazyPromise
21
+ } from "./chunk-A7FK4XKU.js";
17
22
  import {
18
23
  KPattern,
19
24
  KPuzzle
20
- } from "./chunk-RINY3U6G.js";
25
+ } from "./chunk-5ONX3JVC.js";
21
26
  import {
22
27
  Alg,
23
28
  AlgBuilder,
24
29
  Move
25
- } from "./chunk-O6HEZXGY.js";
30
+ } from "./chunk-N5FJ5YIA.js";
26
31
 
27
32
  // src/cubing/search/inside/solve/puzzles/2x2x2.ts
28
33
  import { randomPermuteInPlace, randomUIntBelow } from "random-uint-below";
@@ -64,6 +69,8 @@ var TrembleSolver = class {
64
69
  trembleMoveNames ?? Object.keys(this.kpuzzle.definition.moves)
65
70
  );
66
71
  }
72
+ kpuzzle;
73
+ sgs;
67
74
  searchMoves;
68
75
  // public badRandomMoves(): KSolvePuzzleState {
69
76
  // return badRandomMoves(this.moves, this.ksp);
@@ -158,7 +165,7 @@ var TrembleSolver = class {
158
165
 
159
166
  // src/cubing/search/inside/solve/twips.ts
160
167
  var twipsPromise = new LazyPromise(
161
- async () => import("./twips-YHXBF55O.js")
168
+ async () => import("./twips-ZNMKGC5U.js")
162
169
  );
163
170
  async function wasmTwips(def, pattern, options) {
164
171
  const { wasmTwips: wasmTwips2 } = await twipsPromise;
@@ -179,7 +186,7 @@ async function wasmDeriveScrambleForEvent(derivationSeedHex, derivationSaltHiera
179
186
 
180
187
  // src/cubing/search/inside/solve/puzzles/dynamic/sgs-side-events/index.ts
181
188
  var searchDynamicSideEvents = new LazyPromise(
182
- () => import("./search-dynamic-sgs-side-events-MXHP7O4R.js")
189
+ () => import("./search-dynamic-sgs-side-events-WORUZVF5.js")
183
190
  );
184
191
 
185
192
  // src/cubing/search/inside/solve/puzzles/2x2x2.ts
@@ -206,7 +213,7 @@ async function solve222(pattern) {
206
213
 
207
214
  // src/cubing/search/inside/solve/puzzles/dynamic/4x4x4/index.ts
208
215
  var dynamic4x4x4Solver = new LazyPromise(
209
- () => import("./search-dynamic-solve-4x4x4-NANDMURR.js")
216
+ () => import("./search-dynamic-solve-4x4x4-KIH4YATU.js")
210
217
  );
211
218
 
212
219
  // src/cubing/search/inside/solve/puzzles/4x4x4.ts
@@ -227,18 +234,27 @@ async function random444OrientedScramble() {
227
234
 
228
235
  // src/cubing/search/inside/solve/puzzles/dynamic/fto/index.ts
229
236
  var dynamicFTO = new LazyPromise(
230
- () => import("./search-dynamic-solve-fto-UZMNOI6U.js")
237
+ () => import("./search-dynamic-solve-fto-I5ID5LXD.js")
231
238
  );
232
239
 
233
240
  // src/cubing/search/inside/solve/puzzles/fto.ts
234
241
  var dynamic = new LazyPromise(
235
- () => import("./search-dynamic-sgs-unofficial-CM33KT7L.js")
242
+ () => import("./search-dynamic-sgs-unofficial-5JQKPNG2.js")
236
243
  );
237
244
  async function randomFTOScramble() {
238
245
  mustBeInsideWorker();
239
246
  return new Alg(await (await dynamicFTO).getRandomFTOScramble());
240
247
  }
241
248
 
249
+ // src/cubing/search/inside/solve/puzzles/dynamic/kilominx/index.ts
250
+ var dynamicKilominxSolver = new LazyPromise(() => import("./search-dynamic-solve-kilominx-Y2D3C74Y.js"));
251
+
252
+ // src/cubing/search/inside/solve/puzzles/kilominx.ts
253
+ async function randomKilominxScramble() {
254
+ mustBeInsideWorker();
255
+ return (await dynamicKilominxSolver).getRandomKilominxScramble();
256
+ }
257
+
242
258
  // src/cubing/search/inside/solve/puzzles/dynamic/master_tetraminx/index.ts
243
259
  var dynamicMasterTetraminxSolver = new LazyPromise(
244
260
  () => import("./search-dynamic-solve-master_tetraminx-GIS7T5B7.js")
@@ -307,7 +323,7 @@ async function solvePyraminx(pattern) {
307
323
 
308
324
  // src/cubing/search/inside/solve/puzzles/dynamic/sgs-unofficial/index.ts
309
325
  var searchDynamicUnofficial = new LazyPromise(
310
- () => import("./search-dynamic-sgs-unofficial-CM33KT7L.js")
326
+ () => import("./search-dynamic-sgs-unofficial-5JQKPNG2.js")
311
327
  );
312
328
 
313
329
  // src/cubing/search/inside/solve/puzzles/redi_cube.ts
@@ -360,6 +376,10 @@ var DEBUG_MEASURE_PERF = true;
360
376
  function setDebugMeasurePerf(newDebugMeasurePerf) {
361
377
  DEBUG_MEASURE_PERF = newDebugMeasurePerf;
362
378
  }
379
+ var DEBUG_FORCE_TWIPS_FOR_SCRAMBLES = false;
380
+ function setDebugForceTwipsForScrambles(forceTwipsForScrambles) {
381
+ DEBUG_FORCE_TWIPS_FOR_SCRAMBLES = forceTwipsForScrambles;
382
+ }
363
383
  function now() {
364
384
  return (typeof performance === "undefined" ? Date : performance).now();
365
385
  }
@@ -395,6 +415,13 @@ async function randomScrambleForEvent(eventID, options) {
395
415
  }
396
416
  );
397
417
  }
418
+ function twipsOverride() {
419
+ if (DEBUG_FORCE_TWIPS_FOR_SCRAMBLES && (eventID in wcaEvents || ["kilominx"].includes(eventID))) {
420
+ console.log(`Using \`twips\` override for \`${eventID}\` scramble.`);
421
+ return wasm();
422
+ }
423
+ return void 0;
424
+ }
398
425
  switch (eventID) {
399
426
  // case "333":
400
427
  case "222":
@@ -420,31 +447,25 @@ async function randomScrambleForEvent(eventID, options) {
420
447
  // case "333mbf":
421
448
  // case "fto":
422
449
  // case "master_tetraminx":
423
- case "kilominx":
450
+ // case "kilominx":
424
451
  // case "redi_cube":
425
452
  case "baby_fto":
426
453
  return wasm();
427
454
  case "333":
428
455
  case "333oh":
429
456
  case "333ft":
430
- return measurePerf("random333Scramble", random333Scramble, {
457
+ return twipsOverride() ?? measurePerf("random333Scramble", random333Scramble, {
431
458
  isPrefetch: options?.isPrefetch
432
459
  });
433
460
  case "333bf":
434
461
  case "333mbf":
435
- return measurePerf(
436
- "random333OrientedScramble",
437
- random333OrientedScramble
438
- );
462
+ return twipsOverride() ?? measurePerf("random333OrientedScramble", random333OrientedScramble);
439
463
  case "444":
440
- return measurePerf("random444Scramble", random444Scramble, {
464
+ return twipsOverride() ?? measurePerf("random444Scramble", random444Scramble, {
441
465
  isPrefetch: options?.isPrefetch
442
466
  });
443
467
  case "444bf":
444
- return measurePerf(
445
- "random444OrientedScramble",
446
- random444OrientedScramble
447
- );
468
+ return twipsOverride() ?? measurePerf("random444OrientedScramble", random444OrientedScramble);
448
469
  case "fto":
449
470
  return measurePerf("randomFTOScramble", randomFTOScramble, {
450
471
  isPrefetch: options?.isPrefetch
@@ -454,6 +475,10 @@ async function randomScrambleForEvent(eventID, options) {
454
475
  "randomMasterTetraminxScramble",
455
476
  randomMasterTetraminxScramble
456
477
  );
478
+ case "kilominx":
479
+ return twipsOverride() ?? measurePerf("randomKilominxScramble", randomKilominxScramble, {
480
+ isPrefetch: options?.isPrefetch
481
+ });
457
482
  case "redi_cube":
458
483
  return measurePerf("randomRediCubeScramble", randomRediCubeScramble, {
459
484
  isPrefetch: options?.isPrefetch
@@ -552,6 +577,9 @@ var insideAPI = {
552
577
  setDebugMeasurePerf: async (measure) => {
553
578
  setDebugMeasurePerf(measure);
554
579
  },
580
+ setDebugForceTwipsForScrambles: async (measure) => {
581
+ setDebugForceTwipsForScrambles(measure);
582
+ },
555
583
  solveTwipsToString: async (def, patternData, options) => {
556
584
  const kpuzzle = new KPuzzle(def);
557
585
  const pattern = new KPattern(kpuzzle, patternData);
@@ -561,4 +589,4 @@ var insideAPI = {
561
589
 
562
590
  // src/cubing/search/inside/index.ts
563
591
  expose(insideAPI);
564
- //# sourceMappingURL=inside-L2JI2BEY.js.map
592
+ //# sourceMappingURL=inside-LSPIPZY2.js.map