prts-terrarchive 0.2.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 (287) hide show
  1. package/GAME_ASSETS.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +274 -0
  4. package/README.md +423 -0
  5. package/THIRD_PARTY_NOTICES.md +61 -0
  6. package/bin/bake-rhine-details.mjs +34 -0
  7. package/bin/install.js +273 -0
  8. package/bin/pack-map-assets.mjs +110 -0
  9. package/bin/preview-rhine.mjs +71 -0
  10. package/bin/rhine-detail-baker.ts +84 -0
  11. package/contracts/cloud_tools_v1.schema.json +243 -0
  12. package/contracts/corpus_i18n_v1.schema.json +179 -0
  13. package/contracts/corpus_tools_v1.schema.json +1801 -0
  14. package/cordis.patch.yml +32 -0
  15. package/docs/endfield-official-i18n.md +103 -0
  16. package/lib/client.js +3912 -0
  17. package/lib/endfield-map/map.js.br +0 -0
  18. package/lib/endfield-map/map.js.gz +0 -0
  19. package/lib/endfield-map/resources/map-00b0d0744a1b4404.json.br +0 -0
  20. package/lib/endfield-map/resources/map-00b0d0744a1b4404.json.gz +0 -0
  21. package/lib/endfield-map/resources/map-01616f534aaaeca1.png +0 -0
  22. package/lib/endfield-map/resources/map-1562e0dff4be3d23.png +0 -0
  23. package/lib/endfield-map/resources/map-160fe040f080f6a3.png +0 -0
  24. package/lib/endfield-map/resources/map-17b9d8be25dc2b39.json.br +0 -0
  25. package/lib/endfield-map/resources/map-17b9d8be25dc2b39.json.gz +0 -0
  26. package/lib/endfield-map/resources/map-1c4245c4e8b80c43.json.br +0 -0
  27. package/lib/endfield-map/resources/map-1c4245c4e8b80c43.json.gz +0 -0
  28. package/lib/endfield-map/resources/map-1d30baaaef3e29cc.png +0 -0
  29. package/lib/endfield-map/resources/map-21a61386af79cd12.json.br +0 -0
  30. package/lib/endfield-map/resources/map-21a61386af79cd12.json.gz +0 -0
  31. package/lib/endfield-map/resources/map-24b920b8dab49b44.json.br +0 -0
  32. package/lib/endfield-map/resources/map-24b920b8dab49b44.json.gz +0 -0
  33. package/lib/endfield-map/resources/map-26caf8d71247abb7.png +0 -0
  34. package/lib/endfield-map/resources/map-2729942c89545e73.json.br +0 -0
  35. package/lib/endfield-map/resources/map-2729942c89545e73.json.gz +0 -0
  36. package/lib/endfield-map/resources/map-29063a9802f67014.json.br +0 -0
  37. package/lib/endfield-map/resources/map-29063a9802f67014.json.gz +0 -0
  38. package/lib/endfield-map/resources/map-2f35d09a3ab60a63.json.br +0 -0
  39. package/lib/endfield-map/resources/map-2f35d09a3ab60a63.json.gz +0 -0
  40. package/lib/endfield-map/resources/map-2f98a873da81425e.json.br +0 -0
  41. package/lib/endfield-map/resources/map-2f98a873da81425e.json.gz +0 -0
  42. package/lib/endfield-map/resources/map-3ab978ae44190f80.json.br +0 -0
  43. package/lib/endfield-map/resources/map-3ab978ae44190f80.json.gz +0 -0
  44. package/lib/endfield-map/resources/map-3b62c80d14208902.json.br +0 -0
  45. package/lib/endfield-map/resources/map-3b62c80d14208902.json.gz +0 -0
  46. package/lib/endfield-map/resources/map-3d486e887ae121ac.png +0 -0
  47. package/lib/endfield-map/resources/map-418dc4865608fce5.png +0 -0
  48. package/lib/endfield-map/resources/map-4366b84607335f76.json.br +0 -0
  49. package/lib/endfield-map/resources/map-4366b84607335f76.json.gz +0 -0
  50. package/lib/endfield-map/resources/map-4371259d3ab7aac7.png +0 -0
  51. package/lib/endfield-map/resources/map-48dcc0fd55e13f7f.png +0 -0
  52. package/lib/endfield-map/resources/map-4aabda0e41197570.json.br +0 -0
  53. package/lib/endfield-map/resources/map-4aabda0e41197570.json.gz +0 -0
  54. package/lib/endfield-map/resources/map-505f5687b287043c.json.br +0 -0
  55. package/lib/endfield-map/resources/map-505f5687b287043c.json.gz +0 -0
  56. package/lib/endfield-map/resources/map-5177e9d1d46f47e2.png +0 -0
  57. package/lib/endfield-map/resources/map-51baeb59b7f8c28d.png +0 -0
  58. package/lib/endfield-map/resources/map-549561b46e621874.png +0 -0
  59. package/lib/endfield-map/resources/map-56c6a0bef799c8dc.json.br +0 -0
  60. package/lib/endfield-map/resources/map-56c6a0bef799c8dc.json.gz +0 -0
  61. package/lib/endfield-map/resources/map-5a6963909423b674.png +0 -0
  62. package/lib/endfield-map/resources/map-5a9c533c0552d7b7.png +0 -0
  63. package/lib/endfield-map/resources/map-5d20ae9ffa9a02b0.png +0 -0
  64. package/lib/endfield-map/resources/map-626c8847393f60bf.png +0 -0
  65. package/lib/endfield-map/resources/map-63d43cbec3bed3b8.png +0 -0
  66. package/lib/endfield-map/resources/map-661b6ec56e722574.png +0 -0
  67. package/lib/endfield-map/resources/map-6ddd384eca190828.png +0 -0
  68. package/lib/endfield-map/resources/map-6fc1aa9144f8156c.json.br +0 -0
  69. package/lib/endfield-map/resources/map-6fc1aa9144f8156c.json.gz +0 -0
  70. package/lib/endfield-map/resources/map-738ebaa002c33cfc.png +0 -0
  71. package/lib/endfield-map/resources/map-758c13be6085ec07.json.br +0 -0
  72. package/lib/endfield-map/resources/map-758c13be6085ec07.json.gz +0 -0
  73. package/lib/endfield-map/resources/map-78929f26d6844509.png +0 -0
  74. package/lib/endfield-map/resources/map-7f09c142950a0f74.png +0 -0
  75. package/lib/endfield-map/resources/map-8385e11f39e1a51c.json.br +0 -0
  76. package/lib/endfield-map/resources/map-8385e11f39e1a51c.json.gz +0 -0
  77. package/lib/endfield-map/resources/map-881343926a568f27.json.br +0 -0
  78. package/lib/endfield-map/resources/map-881343926a568f27.json.gz +0 -0
  79. package/lib/endfield-map/resources/map-8d1ade3f01d952b0.png +0 -0
  80. package/lib/endfield-map/resources/map-8fef3495bb7ed60f.png +0 -0
  81. package/lib/endfield-map/resources/map-907a7ecf8a0ce352.png +0 -0
  82. package/lib/endfield-map/resources/map-9113d5951c4db903.json.br +0 -0
  83. package/lib/endfield-map/resources/map-9113d5951c4db903.json.gz +0 -0
  84. package/lib/endfield-map/resources/map-94ad6634436224e3.json.br +0 -0
  85. package/lib/endfield-map/resources/map-94ad6634436224e3.json.gz +0 -0
  86. package/lib/endfield-map/resources/map-99722e61da5f3e53.png +0 -0
  87. package/lib/endfield-map/resources/map-9be9596cc059abe3.png +0 -0
  88. package/lib/endfield-map/resources/map-a4db9a4763e47fbf.png +0 -0
  89. package/lib/endfield-map/resources/map-a4e8ef07159997e7.json.br +0 -0
  90. package/lib/endfield-map/resources/map-a4e8ef07159997e7.json.gz +0 -0
  91. package/lib/endfield-map/resources/map-ab35d06875ee418f.png +0 -0
  92. package/lib/endfield-map/resources/map-ac51bb3e7623cd8b.png +0 -0
  93. package/lib/endfield-map/resources/map-ac830a66296bc83a.png +0 -0
  94. package/lib/endfield-map/resources/map-b3fd04209718e55e.json.br +0 -0
  95. package/lib/endfield-map/resources/map-b3fd04209718e55e.json.gz +0 -0
  96. package/lib/endfield-map/resources/map-b8164f1af7c5d895.png +0 -0
  97. package/lib/endfield-map/resources/map-b8cde93b965384d8.json.br +0 -0
  98. package/lib/endfield-map/resources/map-b8cde93b965384d8.json.gz +0 -0
  99. package/lib/endfield-map/resources/map-b8e48511502e0e8d.json.br +0 -0
  100. package/lib/endfield-map/resources/map-b8e48511502e0e8d.json.gz +0 -0
  101. package/lib/endfield-map/resources/map-bfc58277d5ba649d.png +0 -0
  102. package/lib/endfield-map/resources/map-c013f82048c6891a.png +0 -0
  103. package/lib/endfield-map/resources/map-c49c947841ae4ab5.json.br +0 -0
  104. package/lib/endfield-map/resources/map-c49c947841ae4ab5.json.gz +0 -0
  105. package/lib/endfield-map/resources/map-c4d1b1c6d6706c81.json.br +0 -0
  106. package/lib/endfield-map/resources/map-c4d1b1c6d6706c81.json.gz +0 -0
  107. package/lib/endfield-map/resources/map-c607f8b4c8ad8967.png +0 -0
  108. package/lib/endfield-map/resources/map-c6f20276b8781326.json.br +0 -0
  109. package/lib/endfield-map/resources/map-c6f20276b8781326.json.gz +0 -0
  110. package/lib/endfield-map/resources/map-d51adf5952af1e8e.png +0 -0
  111. package/lib/endfield-map/resources/map-d695eface22f8b74.json.br +0 -0
  112. package/lib/endfield-map/resources/map-d695eface22f8b74.json.gz +0 -0
  113. package/lib/endfield-map/resources/map-db11d394456a7465.png +0 -0
  114. package/lib/endfield-map/resources/map-dcc4d218581e3dc6.png +0 -0
  115. package/lib/endfield-map/resources/map-ddd43dbb8ab8a4e3.json.br +0 -0
  116. package/lib/endfield-map/resources/map-ddd43dbb8ab8a4e3.json.gz +0 -0
  117. package/lib/endfield-map/resources/map-defe5db7dabf748a.png +0 -0
  118. package/lib/endfield-map/resources/map-e1aeb833e22520aa.json.br +0 -0
  119. package/lib/endfield-map/resources/map-e1aeb833e22520aa.json.gz +0 -0
  120. package/lib/endfield-map/resources/map-e25ee9af6e493500.png +0 -0
  121. package/lib/endfield-map/resources/map-e3824082cd6f747d.json.br +0 -0
  122. package/lib/endfield-map/resources/map-e3824082cd6f747d.json.gz +0 -0
  123. package/lib/endfield-map/resources/map-e694a91e630b1bd6.png +0 -0
  124. package/lib/endfield-map/resources/map-eaa93af79d12a87d.png +0 -0
  125. package/lib/endfield-map/resources/map-ec9575ee65d7766f.json.br +0 -0
  126. package/lib/endfield-map/resources/map-ec9575ee65d7766f.json.gz +0 -0
  127. package/lib/endfield-map/resources/map-ede421a329dc78a4.png +0 -0
  128. package/lib/endfield-map/resources/map-eff3bce8f6888fc5.json.br +0 -0
  129. package/lib/endfield-map/resources/map-eff3bce8f6888fc5.json.gz +0 -0
  130. package/lib/endfield-map/resources/map-fb5f4a59a181452c.png +0 -0
  131. package/lib/endfield-map/resources/map-fdeaa17eeba90d8e.json.br +0 -0
  132. package/lib/endfield-map/resources/map-fdeaa17eeba90d8e.json.gz +0 -0
  133. package/lib/rhine/assets/archive-assembly.glb +0 -0
  134. package/lib/rhine/assets/archive-cassette.glb +0 -0
  135. package/lib/rhine/fonts/MiSans-Bold.woff2 +0 -0
  136. package/lib/rhine/fonts/MiSans-Demibold.woff2 +0 -0
  137. package/lib/rhine/fonts/MiSans-Light.woff2 +0 -0
  138. package/lib/rhine/fonts/MiSans-Regular.woff2 +0 -0
  139. package/lib/rhine/fonts/MiSans-license.pdf +0 -0
  140. package/lib/rhine/fonts/NOTICE.txt +6 -0
  141. package/lib/rhine/licenses/RhineLabUI-MIT.txt +21 -0
  142. package/lib/rhine/licenses/entities-BSD-2-Clause.txt +11 -0
  143. package/lib/rhine/licenses/linkify-it-MIT.txt +22 -0
  144. package/lib/rhine/licenses/markdown-it-MIT.txt +22 -0
  145. package/lib/rhine/licenses/mdurl-MIT.txt +45 -0
  146. package/lib/rhine/licenses/punycode.js-MIT.txt +20 -0
  147. package/lib/rhine/licenses/rolling-number-MIT.txt +21 -0
  148. package/lib/rhine/licenses/three-MIT.txt +21 -0
  149. package/lib/rhine/licenses/uc.micro-MIT.txt +20 -0
  150. package/lib/rhine/rhine.css +1 -0
  151. package/lib/rhine/rhine.js +5106 -0
  152. package/lib/skins/common.css +31 -0
  153. package/lib/skins/endfield-aic.css +141 -0
  154. package/lib/skins/prts-agent.css +136 -0
  155. package/lib/skins/rhine-lab.css +70 -0
  156. package/package.json +112 -0
  157. package/presets/definition.js +26 -0
  158. package/presets/prts/agent.cordis.yml +25 -0
  159. package/presets/prts/preset.yml +3 -0
  160. package/presets/register.js +86 -0
  161. package/resources/entity-routing.json +21 -0
  162. package/skills/prts-investigation/SKILL.md +121 -0
  163. package/skills/prts-retrieval/SKILL.md +35 -0
  164. package/skills/prts-retrieval/references/cloud-tools.md +13 -0
  165. package/skills/prts-retrieval/references/diagnostics.md +15 -0
  166. package/skills/prts-retrieval/references/local-tools.md +24 -0
  167. package/skills/prts-retrieval/references/module-arknights.md +23 -0
  168. package/skills/prts-retrieval/references/module-dual.md +15 -0
  169. package/skills/prts-retrieval/references/module-endfield.md +21 -0
  170. package/skills/prts-retrieval/references/retrieval-process.md +44 -0
  171. package/skills/prts-retrieval/references/retrieval-recipes-dual.md +34 -0
  172. package/skills/prts-retrieval/references/retrieval-recipes-endfield.md +37 -0
  173. package/skills/prts-retrieval/references/retrieval-recipes.md +39 -0
  174. package/skills/prts-retrieval/references/tools-runtime.md +48 -0
  175. package/skills/prts-retrieval/references/wiki-schema.md +38 -0
  176. package/src/archive-presentation.js +287 -0
  177. package/src/cloud-projection.js +124 -0
  178. package/src/cloud.js +498 -0
  179. package/src/entity-recognizer.js +311 -0
  180. package/src/entity-routing.js +82 -0
  181. package/src/evidence-state.js +332 -0
  182. package/src/i18n.js +365 -0
  183. package/src/index.js +1261 -0
  184. package/src/installer.js +1362 -0
  185. package/src/investigation-review.js +87 -0
  186. package/src/investigation-store.js +579 -0
  187. package/src/investigation-tools.js +113 -0
  188. package/src/localization-format.js +23 -0
  189. package/src/manual-search.js +103 -0
  190. package/src/read.js +1097 -0
  191. package/src/release-compatibility.js +73 -0
  192. package/src/release-watch.js +40 -0
  193. package/src/search-projection.js +139 -0
  194. package/src/search.js +1522 -0
  195. package/src/skill.js +98 -0
  196. package/src/source-map.js +348 -0
  197. package/src/state.js +314 -0
  198. package/src/store.js +1569 -0
  199. package/src/timeline.js +386 -0
  200. package/src/ui.js +1353 -0
  201. package/src/wiki.js +111 -0
  202. package/tsconfig.rhine.json +15 -0
  203. package/ui/rhine/archive-navigation-limit.ts +31 -0
  204. package/ui/rhine/archive-rack.ts +83 -0
  205. package/ui/rhine/assets/evidence-observatory.webp +0 -0
  206. package/ui/rhine/board-plane-transform.ts +24 -0
  207. package/ui/rhine/catalogue.ts +72 -0
  208. package/ui/rhine/deferred-preparation.ts +146 -0
  209. package/ui/rhine/evidence-board-controls.css +22 -0
  210. package/ui/rhine/evidence-board-history.ts +73 -0
  211. package/ui/rhine/evidence-board-model.ts +189 -0
  212. package/ui/rhine/evidence-board-panel.ts +762 -0
  213. package/ui/rhine/evidence-board-scene.ts +548 -0
  214. package/ui/rhine/evidence-board.css +191 -0
  215. package/ui/rhine/evidence-card-art.ts +470 -0
  216. package/ui/rhine/evidence-card-style.ts +17 -0
  217. package/ui/rhine/evidence-inbox-scene.ts +43 -0
  218. package/ui/rhine/evidence-inbox.css +29 -0
  219. package/ui/rhine/evidence-inbox.ts +104 -0
  220. package/ui/rhine/index.ts +12 -0
  221. package/ui/rhine/interaction.css +20 -0
  222. package/ui/rhine/investigation-board-plane.ts +5 -0
  223. package/ui/rhine/investigation-board.css +34 -0
  224. package/ui/rhine/investigation-board.ts +348 -0
  225. package/ui/rhine/investigation-edits.ts +46 -0
  226. package/ui/rhine/investigation-layout.ts +29 -0
  227. package/ui/rhine/label-prefetch.ts +34 -0
  228. package/ui/rhine/looping-title.ts +40 -0
  229. package/ui/rhine/manual-search.css +41 -0
  230. package/ui/rhine/manual-search.ts +89 -0
  231. package/ui/rhine/original/appearance.ts +180 -0
  232. package/ui/rhine/original/archive-label.ts +84 -0
  233. package/ui/rhine/original/archive-lighting.ts +39 -0
  234. package/ui/rhine/original/archive-loop.ts +82 -0
  235. package/ui/rhine/original/archive-refill.ts +64 -0
  236. package/ui/rhine/original/array-detail-data.ts +2 -0
  237. package/ui/rhine/original/array-detail.ts +41 -0
  238. package/ui/rhine/original/array-interior.ts +411 -0
  239. package/ui/rhine/original/array-occlusion.ts +166 -0
  240. package/ui/rhine/original/array-shell.ts +38 -0
  241. package/ui/rhine/original/array-visibility.ts +309 -0
  242. package/ui/rhine/original/asset-url.ts +4 -0
  243. package/ui/rhine/original/brand.ts +12 -0
  244. package/ui/rhine/original/cassette-lod.ts +81 -0
  245. package/ui/rhine/original/data.ts +21 -0
  246. package/ui/rhine/original/decryption.ts +185 -0
  247. package/ui/rhine/original/detail-signature.ts +18 -0
  248. package/ui/rhine/original/glass-reveal.ts +45 -0
  249. package/ui/rhine/original/internal-optics.ts +70 -0
  250. package/ui/rhine/original/label-renderer.ts +119 -0
  251. package/ui/rhine/original/label-textures.ts +117 -0
  252. package/ui/rhine/original/model-viewer.ts +658 -0
  253. package/ui/rhine/original/motion.ts +116 -0
  254. package/ui/rhine/original/opaque-backfaces.ts +64 -0
  255. package/ui/rhine/original/program-preparation.ts +111 -0
  256. package/ui/rhine/original/quality-renderer.ts +97 -0
  257. package/ui/rhine/original/quality-settings.ts +111 -0
  258. package/ui/rhine/original/render-quality.ts +163 -0
  259. package/ui/rhine/original/scene.ts +2051 -0
  260. package/ui/rhine/original/shelf-interior.ts +142 -0
  261. package/ui/rhine/original/ui-transitions.ts +111 -0
  262. package/ui/rhine/original/viewer-camera.ts +92 -0
  263. package/ui/rhine/original/viewport-layout.ts +41 -0
  264. package/ui/rhine/original-ui.css +2334 -0
  265. package/ui/rhine/readability.css +46 -0
  266. package/ui/rhine/reading-object.ts +96 -0
  267. package/ui/rhine/reading-origin.ts +28 -0
  268. package/ui/rhine/reading-room.css +55 -0
  269. package/ui/rhine/report-markdown.ts +98 -0
  270. package/ui/rhine/scene-edge-navigation.ts +84 -0
  271. package/ui/rhine/scene.ts +1726 -0
  272. package/ui/rhine/shelf-layout.ts +38 -0
  273. package/ui/rhine/snapshot-update-gate.ts +22 -0
  274. package/ui/rhine/source-reading.ts +15 -0
  275. package/ui/rhine/source-selection.css +164 -0
  276. package/ui/rhine/temporary-performance-observers.ts +163 -0
  277. package/ui/rhine/temporary-performance-panel.ts +124 -0
  278. package/ui/rhine/temporary-performance.css +19 -0
  279. package/ui/rhine/temporary-performance.ts +552 -0
  280. package/ui/rhine/temporary-render-diagnostics.ts +105 -0
  281. package/ui/rhine/tool-activity.ts +69 -0
  282. package/ui/rhine/types.ts +219 -0
  283. package/ui/rhine/visible-scene-hit.ts +13 -0
  284. package/ui/rhine/workbench.css +818 -0
  285. package/ui/rhine/workbench.ts +2245 -0
  286. package/ui/rhine/workspace-travel.ts +32 -0
  287. package/vite.rhine.config.ts +19 -0
@@ -0,0 +1,64 @@
1
+ import type { ArchiveCell } from './archive-loop';
2
+
3
+ type LaneRefill = { holes: number[]; elapsed: number; duration: number };
4
+ const ease = (value: number) => value ** 3 * (value * (value * 6 - 15) + 10);
5
+
6
+ /** Close physical vacancies with the existing rear row, without adding any meshes. */
7
+ export class ArchiveRefill {
8
+ private pending = new Map<number, Set<number>>();
9
+ private moving = new Map<number, LaneRefill>();
10
+
11
+ remove({ lane, row }: ArchiveCell) {
12
+ const holes = this.pending.get(lane) ?? new Set<number>();
13
+ holes.add(row);
14
+ this.pending.set(lane, holes);
15
+ }
16
+
17
+ get active() { return this.pending.size > 0 || this.moving.size > 0; }
18
+ blocks(lane: number) { return this.pending.has(lane) || this.moving.has(lane); }
19
+ vacant({ lane, row }: ArchiveCell) { return this.pending.get(lane)?.has(row) ?? false; }
20
+
21
+ update(dt: number, occupied: Iterable<ArchiveCell>, reduced = false) {
22
+ for (const [lane, motion] of this.moving) {
23
+ motion.elapsed += Math.max(0, dt);
24
+ if (reduced || motion.elapsed >= motion.duration) this.moving.delete(lane);
25
+ }
26
+ const blocked = new Set(Array.from(occupied, cell => cell.lane));
27
+ for (const [lane, holes] of this.pending) {
28
+ // Parallel readers keep their physical slot until they depart or return.
29
+ // Begin one continuous refill for the lane once every actor has cleared it.
30
+ if (blocked.has(lane) || this.moving.has(lane)) continue;
31
+ this.pending.delete(lane);
32
+ if (!reduced) this.moving.set(lane, {
33
+ holes: [...holes].sort((a, b) => b - a), elapsed: 0,
34
+ duration: 0.86 + Math.min(0.36, (holes.size - 1) * 0.18),
35
+ });
36
+ }
37
+ }
38
+
39
+ row({ lane, row }: ArchiveCell) {
40
+ const motion = this.moving.get(lane);
41
+ if (!motion) return row;
42
+ // The camera looks toward -Z: smaller row numbers are behind the vacancy.
43
+ // Reuse destination instance IDs for the surviving rear cassettes. At t=0
44
+ // the occupied positions are identical; at t=1 the normal grid takes over.
45
+ let source = row;
46
+ for (const hole of motion.holes) if (hole >= source) source--;
47
+ return source + (row - source) * ease(Math.min(1, motion.elapsed / motion.duration));
48
+ }
49
+
50
+ rebase(shift: ArchiveCell) {
51
+ this.pending = new Map([...this.pending].map(([lane, holes]) =>
52
+ [lane - shift.lane, new Set([...holes].map(row => row - shift.row))]));
53
+ this.moving = new Map([...this.moving].map(([lane, motion]) =>
54
+ [lane - shift.lane, { ...motion, holes: motion.holes.map(row => row - shift.row) }]));
55
+ }
56
+
57
+ clear() { this.pending.clear(); this.moving.clear(); }
58
+ stats() {
59
+ return [
60
+ ...[...this.pending].map(([lane, holes]) => ({ lane, holes: [...holes], phase: 'waiting', progress: 0 })),
61
+ ...[...this.moving].map(([lane, motion]) => ({ lane, holes: [...motion.holes], phase: 'moving', progress: motion.elapsed / motion.duration })),
62
+ ];
63
+ }
64
+ }
@@ -0,0 +1,2 @@
1
+ // Generated by bin/bake-rhine-details.mjs from archive-cassette.glb.
2
+ export default {"signature":"9a49cc2e","width":512,"height":64,"sourceTriangles":1928,"min":[-1.8234825134277344,3.0156421661376953,0.24641001224517822],"max":[-1.3948416709899902,3.047001838684082,0.24641001224517822],"runs":[1494,16744576,1,2164228224,1,3221192832,3,4294934656,1,3221192832,1,2164228224,37,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,1090486400,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,15,16744576,1,2164228224,5,4294934656,1,1090486400,4,16744576,1,2164228224,4,4294934656,22,16744576,1,1090486400,4,4294934656,1,2164228224,4,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,1,2164228224,20,4294934656,21,16744576,16,4294934656,1,3221192832,1,2164228224,17,16744576,5,4294934656,23,16744576,1,3221192832,4,4294934656,1,1090486400,13,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,1,2164228224,14,4294934656,1,3221192832,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,3221192832,7,16744576,1,2164228224,9,4294934656,1,1090486400,11,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,3221192832,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,15,16744576,6,4294934656,5,16744576,1,2164228224,4,4294934656,22,16744576,1,3221192832,4,4294934656,1,2164228224,4,16744576,1,1090486400,4,4294934656,1,3221192832,22,16744576,1,3221192832,4,4294934656,1,2164228224,4,16744576,1,2164228224,20,4294934656,21,16744576,19,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,5,4294934656,14,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,3221192832,4,4294934656,1,1090486400,4,16744576,1,2164228224,17,4294934656,1,1090486400,8,16744576,5,4294934656,22,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,3221192832,11,4294934656,1,1090486400,10,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,1090486400,5,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,14,16744576,1,1090486400,5,4294934656,1,2164228224,5,16744576,1,2164228224,4,4294934656,21,16744576,1,1090486400,5,4294934656,1,2164228224,5,16744576,5,4294934656,22,16744576,5,4294934656,5,16744576,1,2164228224,20,4294934656,21,16744576,21,4294934656,1,1090486400,13,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,3221192832,14,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,5,4294934656,22,16744576,5,4294934656,5,16744576,1,2164228224,18,4294934656,1,3221192832,7,16744576,5,4294934656,22,16744576,5,4294934656,6,16744576,1,3221192832,13,4294934656,1,1090486400,9,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,3221192832,5,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,14,16744576,1,3221192832,5,4294934656,6,16744576,1,2164228224,4,4294934656,21,16744576,1,3221192832,5,4294934656,1,2164228224,5,16744576,1,3221192832,4,4294934656,1,1090486400,20,16744576,1,1090486400,4,4294934656,1,3221192832,5,16744576,1,2164228224,20,4294934656,21,16744576,22,4294934656,1,1090486400,13,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,3221192832,5,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,5,16744576,1,3221192832,14,4294934656,1,3221192832,9,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,1,1090486400,6,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,14,16744576,5,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,20,16744576,1,1090486400,6,4294934656,1,2164228224,5,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,2164228224,20,4294934656,21,16744576,23,4294934656,1,1090486400,12,16744576,5,4294934656,21,16744576,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,2164228224,20,4294934656,1,1090486400,5,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,1,2164228224,1,4294934400,15,4294934656,1,1090486400,8,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,1,3221192832,6,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,13,16744576,1,2164228224,5,4294934656,1,1090486400,6,16744576,1,2164228224,4,4294934656,20,16744576,1,3221192832,6,4294934656,1,2164228224,5,16744576,1,1090486400,4,4294934656,1,3221192832,20,16744576,1,3221192832,4,4294934656,1,1090486400,5,16744576,1,2164228224,20,4294934656,21,16744576,24,4294934656,1,1090486400,11,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,5,4294934656,6,16744576,1,2164228224,20,4294934656,1,3221192832,6,16744576,5,4294934656,20,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,1,2164228224,2,4294934656,1,4294934400,1,4294934656,1,4294934400,11,4294934656,1,3221192832,8,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,1090486400,7,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,19,4294934656,1,2164228224,6,16744576,5,4294934656,13,16744576,1,3221192832,4,4294934656,1,3221192832,7,16744576,1,2164228224,4,4294934656,19,16744576,1,1090486400,7,4294934656,1,2164228224,6,16744576,5,4294934656,20,16744576,5,4294934656,6,16744576,1,2164228224,20,4294934656,21,16744576,25,4294934656,11,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,5,4294934656,20,16744576,5,4294934656,6,16744576,1,2164228224,17,4294934656,2,4294934400,2,4294934656,1,2164228224,5,16744576,5,4294934656,20,16744576,5,4294934656,5,16744576,1,2164228224,6,4294934656,1,4294934400,2,2164228224,1,3221192832,7,4294934656,1,1090486400,7,16744576,20,4294934656,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,3221192832,7,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,3221192832,14,2164228224,1,1090486400,6,16744576,5,4294934656,12,16744576,1,1090486400,5,4294934656,1,2164228224,7,16744576,1,2164228224,4,4294934656,19,16744576,1,3221192832,7,4294934656,1,2164228224,6,16744576,1,3221192832,4,4294934656,1,1090486400,18,16744576,1,1090486400,4,4294934656,1,3221192832,6,16744576,1,2164228224,4,4294934656,1,3221192832,15,2164228224,21,16744576,5,4294934656,10,2164228224,1,3221192832,9,4294934656,1,3221192832,11,16744576,5,4294934656,19,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,5,4294934656,19,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,1,3221192832,6,2164228224,2,2164227968,1,3221192576,7,4294934656,1,3221192832,5,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,5,4294934656,5,16744576,1,2164228224,5,4294934656,1,1090486400,5,16744576,1,3221192832,5,4294934656,1,2164228224,7,16744576,5,4294934656,15,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,1090486400,8,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,12,16744576,1,2164228224,5,4294934656,8,16744576,1,2164228224,4,4294934656,18,16744576,1,1090486400,8,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,12,16744576,1,2164228224,8,4294934656,1,1090486400,10,16744576,5,4294934656,19,16744576,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,1090486400,7,4294934656,5,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,2164228224,3,4294934656,1,3221192832,8,16744576,1,3221192832,4,4294934656,1,3221192832,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,3221192832,8,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,12,16744576,5,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,18,16744576,1,3221192832,8,4294934656,1,2164228224,6,16744576,1,1090486400,4,4294934656,1,3221192832,18,16744576,5,4294934656,1,1090486400,6,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,14,16744576,1,3221192832,7,4294934656,10,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,1090486400,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,5,4294934656,7,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,6,4294934656,1,2164228224,5,16744576,5,4294934656,18,16744576,1,3221192832,4,4294934656,1,2164228224,5,16744576,1,2164228224,2,4294934656,1,3221192832,9,16744576,1,1090486400,5,4294934656,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,1090486400,9,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,11,16744576,1,1090486400,5,4294934656,1,1090486400,8,16744576,1,2164228224,4,4294934656,17,16744576,1,2164228224,9,4294934656,1,2164228224,7,16744576,5,4294934656,18,16744576,5,4294934656,7,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,15,16744576,1,3221192832,6,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,5,4294934656,17,16744576,1,1090486400,5,4294934656,7,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,1090486400,5,4294934656,1,2164228224,5,16744576,5,4294934656,18,16744576,5,4294934656,6,16744576,1,2164228224,2,4294934656,11,16744576,1,3221192832,4,4294934656,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,3221192832,9,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,11,16744576,1,3221192832,5,4294934656,9,16744576,1,2164228224,4,4294934656,17,16744576,10,4294934656,1,2164228224,7,16744576,1,3221192832,4,4294934656,1,1090486400,16,16744576,1,2164228224,4,4294934656,1,3221192832,7,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,16,16744576,1,3221192832,6,4294934656,10,16744576,5,4294934656,17,16744576,1,3221192832,4,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,3221192832,4,4294934656,1,4294934400,5,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,1090486400,5,4294934656,6,16744576,1,2164228224,1,4294934656,1,1090486400,11,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,1090486400,10,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,11,16744576,5,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,16,16744576,1,2164228224,10,4294934656,1,2164228224,7,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,17,16744576,6,4294934656,1,1090486400,9,16744576,5,4294934656,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,3221192832,4,4294934656,1,2164228224,7,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,2164227968,3,4294934400,2,4294934656,5,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,2164228224,1,3221192832,13,16744576,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,3221192832,5,4294934656,1,2164228224,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,1,2164228224,5,4294934656,1,1090486400,9,16744576,1,2164228224,4,4294934656,16,16744576,11,4294934656,1,2164228224,7,16744576,1,1090486400,4,4294934656,1,3221192832,16,16744576,5,4294934656,1,1090486400,7,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,17,16744576,1,2164228224,5,4294934656,1,3221192832,9,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,1090486400,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,4,4294934400,1,4294934656,6,16744576,5,4294934656,16,16744576,1,3221192832,4,4294934656,1,1090486400,6,16744576,1,2164228224,14,16744576,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,1090486400,6,4294934656,1,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,1,3221192832,4,4294934656,1,3221192832,10,16744576,1,2164228224,4,4294934656,15,16744576,1,2164228224,6,4294934656,1,2164228224,4,4294934656,1,2164228224,8,16744576,5,4294934656,16,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,18,16744576,1,3221192832,5,4294934656,9,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,5,4294934656,15,16744576,1,1090486400,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,4294934400,4,4294934656,6,16744576,5,4294934656,16,16744576,5,4294934656,22,16744576,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,3221192832,5,4294934656,1,2164228224,1,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,1,1090486400,5,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,15,16744576,6,4294934656,1,1090486400,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,3221192832,4,4294934656,1,1090486400,14,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,18,16744576,1,1090486400,5,4294934656,1,2164228224,9,16744576,5,4294934656,15,16744576,1,3221192832,4,4294934656,1,1090486400,17,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,4,4294934400,1,4294934656,6,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,1090486400,4,4294934656,1,3221192832,22,16744576,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,1090486400,6,4294934656,2,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,1,3221192832,5,4294934656,11,16744576,1,2164228224,4,4294934656,14,16744576,1,2164228224,5,4294934656,1,3221192832,1,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,3221192832,4,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,19,16744576,5,4294934656,1,2164228224,9,16744576,5,4294934656,15,16744576,5,4294934656,18,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,3221192832,4,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,2,4294934400,3,4294934656,6,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,3221192832,5,4294934656,1,2164228224,2,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,5,4294934656,1,3221192832,11,16744576,1,2164228224,4,4294934656,14,16744576,6,4294934656,1,1090486400,1,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,1090486400,24,4294934656,9,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,19,16744576,1,2164228224,5,4294934656,9,16744576,1,2164228224,23,4294934656,1,3221192832,18,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,2164228224,24,4294934656,9,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,5,4294934656,7,16744576,24,4294934656,1,1090486400,21,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,1090486400,6,4294934656,3,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,8,16744576,1,2164228224,5,4294934656,1,1090486400,11,16744576,1,2164228224,4,4294934656,13,16744576,1,2164228224,5,4294934656,1,3221192832,2,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,24,4294934656,9,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,19,16744576,1,1090486400,5,4294934656,1,1090486400,8,16744576,1,2164228224,23,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,23,4294934656,1,3221192832,9,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,5,4294934656,7,16744576,24,4294934656,22,16744576,5,4294934656,1,1090486400,6,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,3221192832,5,4294934656,1,2164228224,3,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,8,16744576,6,4294934656,12,16744576,1,2164228224,4,4294934656,13,16744576,6,4294934656,1,1090486400,2,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,3221192832,22,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,5,4294934656,1,2164228224,9,16744576,23,4294934656,1,1090486400,18,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,23,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,1090486144,5,4294934400,7,16744576,1,2164228224,22,4294934656,1,3221192832,21,16744576,1,1090486400,5,4294934656,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,1090486400,6,4294934656,4,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,7,16744576,1,2164228224,5,4294934656,1,2164228224,12,16744576,1,2164228224,4,4294934656,12,16744576,1,2164228224,5,4294934656,1,3221192832,3,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,2164228224,22,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,1,3221192832,4,4294934656,1,2164228224,9,16744576,23,4294934656,19,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,2164228224,22,4294934656,1,1090486400,9,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,2164228224,22,4294934656,1,2164228224,21,16744576,1,3221192832,5,4294934656,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,3221192832,5,4294934656,1,2164228224,4,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,6,16744576,1,1090486400,6,4294934400,13,16744576,1,2164228224,4,4294934656,12,16744576,6,4294934656,1,1090486400,3,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,1090486400,22,4294934656,10,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,1,2164228224,4,4294934656,1,3221192832,9,16744576,1,2164228224,21,4294934656,1,3221192832,19,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,2164228224,22,4294934656,10,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,3221192832,4,4294934656,1,2164228224,8,16744576,22,4294934656,1,1090486400,20,16744576,1,2164228224,5,4294934656,1,2164228224,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,1090486400,6,4294934656,5,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,6,16744576,1,3221192832,5,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,11,16744576,1,2164228224,5,4294934656,1,3221192832,4,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,22,4294934656,10,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,1,1090486400,5,4294934656,9,16744576,1,2164228224,21,4294934656,1,2164228224,19,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,21,4294934656,1,3221192832,10,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,1090486144,3,4294934400,2,4294934656,9,16744576,22,4294934656,20,16744576,1,1090486400,6,4294934656,1,2164228224,7,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,3221192832,5,4294934656,1,2164228224,5,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,5,16744576,1,2164228224,6,4294934656,14,16744576,1,2164228224,4,4294934656,11,16744576,6,4294934656,1,1090486400,4,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,3221192832,20,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,10,16744576,21,4294934656,1,1090486400,19,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,21,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,1090486400,5,4294934656,1,3221192832,9,16744576,1,2164228224,20,4294934656,1,3221192832,20,16744576,7,4294934656,8,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,2164228224,6,4294934656,6,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,4,16744576,1,3221192832,6,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,10,16744576,1,2164228224,5,4294934656,1,3221192832,5,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,1,3221192832,10,2164228224,5,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,10,16744576,5,4294934656,11,2164228224,5,4294934656,20,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,1,2164228224,4,4294934656,1,3221192832,10,2164228224,5,4294934656,1,1090486400,10,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,1090486400,6,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,3221192832,10,2164228224,5,4294934656,1,2164228224,19,16744576,1,3221192832,6,4294934656,1,3221192832,8,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,6,4294934656,1,1090486400,6,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,3221192832,13,2164228224,1,1090486400,7,16744576,5,4294934656,2,4294934400,1,4294934656,1,4294934400,6,4294934656,1,3221192832,15,16744576,1,2164228224,4,4294934656,10,16744576,6,4294934656,1,1090486400,5,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,1090486400,4,4294934656,1,3221192832,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,1,1090486400,9,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,3221192832,20,16744576,1,2164228224,4,4294934656,1,2164228224,19,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,1,3221192832,8,2164228224,7,4294934656,1,3221192832,11,16744576,5,4294934656,10,16744576,5,4294934656,1,1090486400,18,16744576,1,3221192832,7,4294934656,1,1090486400,8,16744576,5,4294934656,14,2164228224,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,2164228224,5,4294934656,1,3221192832,7,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,11,4294934656,4,4294934400,1,1090486400,15,16744576,1,2164228224,4,4294934656,9,16744576,1,2164228224,5,4294934656,1,3221192832,6,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,5,4294934656,9,16744576,1,2164228224,4,4294934656,1,3221192832,11,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,3221192832,4,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,5,4294934656,9,16744576,1,2164228224,4,4294934656,1,3221192832,11,16744576,1,2164228224,20,4294934656,1,1090486400,11,16744576,5,4294934656,9,16744576,1,1090486400,5,4294934656,18,16744576,1,3221192832,7,4294934656,1,3221192832,9,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,6,4294934656,1,1090486400,7,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,10,4294934656,2,4294934400,2,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,9,16744576,6,4294934656,1,1090486400,6,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,3221192832,4,4294934656,1,1090486400,8,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,9,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,5,4294934656,9,16744576,1,3221192832,4,4294934656,1,2164228224,11,16744576,1,2164228224,19,4294934656,1,2164228224,12,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,3221192832,8,4294934656,1,1090486400,9,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,2164228224,5,4294934656,1,3221192832,8,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,13,4294934656,2,4294934400,1,2164227968,15,16744576,1,2164228224,4,4294934656,8,16744576,1,2164228224,5,4294934656,1,3221192832,7,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,5,4294934656,1,1090486400,11,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,8,16744576,1,1090486400,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,5,4294934656,1,1090486400,11,16744576,1,2164228224,18,4294934656,1,3221192832,13,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,3221192832,4,4294934656,1,2164228224,16,16744576,1,3221192832,8,4294934656,1,2164228224,10,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,6,4294934656,1,1090486400,8,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,15,4294934656,1,4294934400,1,1090486400,14,16744576,1,2164228224,4,4294934656,8,16744576,6,4294934656,1,1090486400,7,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,1090486400,4,4294934656,1,3221192832,8,16744576,5,4294934656,12,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,1090486400,5,4294934656,12,16744576,1,2164228224,17,4294934656,1,1090486400,15,16744576,5,4294934656,8,16744576,5,4294934656,16,16744576,1,3221192832,8,4294934656,1,3221192832,11,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,2164228224,5,4294934656,1,3221192832,9,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,17,4294934656,1,1090486400,13,16744576,1,2164228224,4,4294934656,7,16744576,1,2164228224,5,4294934656,1,3221192832,8,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,5,4294934656,7,16744576,1,2164228224,4,4294934656,1,3221192832,12,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,3221192832,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,7,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,2164228224,15,4294934656,1,2164228224,17,16744576,5,4294934656,7,16744576,1,1090486400,5,4294934656,15,16744576,1,1090486400,8,4294934656,1,3221192832,12,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,6,4294934656,1,1090486400,9,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,17,4294934656,1,3221192832,13,16744576,1,2164228224,4,4294934656,7,16744576,6,4294934656,1,1090486400,8,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,3221192832,4,4294934656,1,1090486400,6,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,1,2164228224,11,16744576,5,4294934656,7,16744576,5,4294934656,22,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,7,16744576,1,3221192832,4,4294934656,1,2164228224,12,16744576,1,2164228224,15,4294934656,1,3221192832,17,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,1090486400,9,4294934656,13,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,2164228224,5,4294934656,1,3221192832,10,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,18,4294934656,1,2164228224,7,16744576,5,4294934656,4,2164228224,1,4294934400,4,4294934656,1,4294934400,3,4294934656,1,1090486400,12,16744576,1,2164228224,4,4294934656,6,16744576,1,2164228224,5,4294934656,1,3221192832,9,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,5,4294934656,1,1090486400,12,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,1,1090486400,11,16744576,5,4294934656,6,16744576,1,1090486400,5,4294934656,22,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,5,4294934656,13,16744576,1,2164228224,16,4294934656,1,3221192832,16,16744576,1,2164228224,4,4294934656,1,2164228224,6,16744576,1,3221192832,4,4294934656,1,2164228224,14,16744576,1,3221192832,8,4294934656,1,1090486400,13,16744576,19,4294934656,5,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,6,4294934656,1,1090486400,10,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,6,16744576,1,2164228224,6,4294934656,1,3221192832,12,16744576,1,2164228224,4,4294934656,6,16744576,6,4294934656,1,1090486400,9,16744576,1,2164228224,4,4294934656,1,2164228224,12,16744576,1,1090486400,4,4294934656,1,3221192832,6,16744576,5,4294934656,13,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,12,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,1090486400,5,4294934656,13,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,2,2164227968,2,4294934400,4,4294934656,1,3221192832,16,16744576,5,4294934656,6,16744576,5,4294934656,14,16744576,1,1090486400,8,4294934656,1,1090486400,14,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,1,2164228224,5,4294934656,1,3221192832,11,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,7,16744576,1,1090486400,6,4294934656,12,16744576,1,2164228224,4,4294934656,5,16744576,1,2164228224,5,4294934656,1,3221192832,10,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,5,4294934656,5,16744576,1,2164228224,4,4294934656,1,3221192832,13,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,12,16744576,1,2164228224,4,4294934656,1,2164228224,5,16744576,1,3221192832,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,5,4294934656,5,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,3221192832,5,4294934656,1,1090486400,15,16744576,5,4294934656,5,16744576,1,1090486400,5,4294934656,14,16744576,8,4294934656,1,1090486400,15,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,6,4294934656,1,1090486400,11,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,8,16744576,1,2164228224,5,4294934656,1,2164228224,11,16744576,1,2164228224,4,4294934656,5,16744576,6,4294934656,1,1090486400,10,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,3221192832,4,4294934656,5,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,21,16744576,5,4294934656,13,16744576,5,4294934656,5,16744576,5,4294934656,23,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,5,4294934656,5,16744576,1,3221192832,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,3221192832,4,4294934656,1,3221192832,15,16744576,1,2164228224,4,4294934656,1,1090486400,4,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,1090486400,7,4294934656,1,1090486400,16,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,3,16744576,1,2164228224,5,4294934656,1,3221192832,12,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,5,4294934656,1,2164228224,11,16744576,1,2164228224,4,4294934656,4,16744576,1,2164228224,5,4294934656,1,2164228224,11,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,5,4294934656,1,1090486400,13,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,1,2164228224,5,4294934656,13,16744576,5,4294934656,4,16744576,1,1090486400,5,4294934656,23,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,5,4294934656,14,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,5,4294934656,1,1090486400,14,16744576,1,2164228224,4,4294934656,1,2164228224,4,16744576,5,4294934656,1,2164228224,13,16744576,1,3221192832,6,4294934656,1,1090486400,17,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,3,16744576,6,4294934656,1,1090486400,12,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,1,2164228224,4,4294934656,1,3221192832,11,16744576,1,2164228224,4,4294934656,4,16744576,6,4294934656,12,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,1090486400,4,4294934656,1,2164228224,3,16744576,1,1090486400,5,4294934656,14,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,1090486400,3,16744576,1,2164228224,4,4294934656,1,2164228224,23,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,1,2164228224,4,4294934656,1,2164228224,3,16744576,1,1090486400,5,4294934656,14,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,4,4294934656,1,3221192832,4,16744576,5,4294934656,14,16744576,6,4294934656,1,1090486400,18,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,2,16744576,1,2164228224,5,4294934656,1,3221192832,13,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,1,2164227968,5,4294934400,11,16744576,1,2164228224,4,4294934656,3,16744576,1,2164228224,5,4294934656,1,2164228224,12,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,5,4294934656,3,16744576,1,2164228224,4,4294934656,1,3221192832,14,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,5,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,3,16744576,5,4294934656,1,2164228224,23,16744576,1,2164228224,4,4294934656,1,2164228224,23,16744576,5,4294934656,3,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,2164228224,4,4294934656,1,3221192832,15,16744576,5,4294934656,3,16744576,1,2164228224,4,4294934656,1,3221192832,13,16744576,1,1090486400,5,4294934656,1,2164228224,19,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,2,16744576,6,4294934656,1,1090486400,13,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,2,4294934400,3,4294934656,11,16744576,1,2164228224,4,4294934656,2,16744576,1,1090486400,6,4294934656,13,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,3221192832,4,4294934656,3,16744576,1,3221192832,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,20,16744576,5,4294934656,1,1090486400,14,16744576,4,4294934656,1,3221192832,3,16744576,5,4294934656,24,16744576,1,2164228224,4,4294934656,1,2164228224,23,16744576,5,4294934656,3,16744576,5,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,1090486400,2,16744576,1,2164228224,4,4294934656,1,2164228224,13,16744576,1,2164228224,5,4294934656,20,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,1,16744576,1,2164228224,5,4294934656,1,3221192832,14,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,2,16744576,1,3221192832,5,4294934656,1,2164228224,13,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,2,16744576,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,19,16744576,1,2164228224,5,4294934656,15,16744576,5,4294934656,2,16744576,1,2164228224,4,4294934656,1,3221192832,24,16744576,1,2164228224,4,4294934656,1,2164228224,23,16744576,1,2164228224,4,4294934656,1,1090486400,2,16744576,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,3,4294934656,2,4294934400,15,16744576,1,2164228224,4,4294934656,1,2164228224,2,16744576,5,4294934656,1,1090486400,13,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,1,16744576,6,4294934656,1,1090486400,14,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,1,16744576,1,1090486400,6,4294934656,14,16744576,1,2164228224,4,4294934656,1,2164228224,14,16744576,1,1090486400,4,4294934656,1,2164228224,1,16744576,1,1090486400,5,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,19,16744576,1,3221192832,4,4294934656,1,3221192832,15,16744576,1,2164228224,4,4294934656,1,1090486400,1,16744576,1,2164228224,4,4294934656,1,2164228224,24,16744576,1,2164228224,4,4294934656,1,2164228224,23,16744576,1,2164228224,4,4294934656,1,2164228224,1,16744576,1,2164228224,4,4294934656,1,3221192832,15,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,4,4294934656,1,4294934400,16,16744576,4,4294934656,1,3221192832,2,16744576,5,4294934656,14,16744576,1,2164228224,4,4294934656,21,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,2,2164228224,5,4294934656,1,3221192832,15,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,1,16744576,1,3221192832,5,4294934656,1,2164228224,14,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,5,4294934656,1,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,18,16744576,1,1090486400,5,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,1,16744576,5,4294934656,1,1090486400,24,16744576,1,2164228224,4,4294934656,1,2164228224,24,16744576,4,4294934656,1,3221192832,1,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,2,4294934656,3,4294934400,16,16744576,5,4294934656,1,16744576,1,2164228224,4,4294934656,1,3221192832,14,16744576,5,4294934656,21,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,6,4294934656,1,1090486400,15,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,1,1090486400,6,4294934656,15,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,3221192832,4,4294934656,1,16744576,1,3221192832,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,18,16744576,1,3221192832,5,4294934656,1,1090486400,16,16744576,4,4294934656,1,3221192832,1,16744576,5,4294934656,25,16744576,1,2164228224,4,4294934656,1,2164228224,24,16744576,5,4294934656,1,16744576,5,4294934656,1,1090486400,15,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,1090486400,1,2164228224,4,4294934656,1,2164228224,14,16744576,5,4294934656,21,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,10,4294934656,1,3221192832,16,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,10,16744576,5,4294934656,11,16744576,1,2164228224,4,4294934656,1,3221192832,5,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934656,1,2164228224,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,17,16744576,1,1090486400,6,4294934656,17,16744576,5,4294934656,1,2164228224,4,4294934656,1,3221192832,25,16744576,1,2164228224,4,4294934656,1,2164228224,24,16744576,1,2164228224,4,4294934656,1,1090486400,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,5,4294934656,1,1090486400,14,16744576,4,4294934656,1,2164228224,21,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,10,4294934656,1,1090486400,16,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,1,2164228224,5,4294934656,11,16744576,1,2164228224,10,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,15,16744576,1,1090486400,4,4294934656,1,3221192832,5,4294934656,16,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,17,16744576,1,3221192832,5,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,3221192832,4,4294934656,1,2164228224,25,16744576,1,2164228224,4,4294934656,1,2164228224,24,16744576,1,2164228224,9,4294934656,1,3221192832,16,16744576,1,2164228224,4,4294934656,1,2164228224,10,16744576,5,4294934656,17,16744576,4,4294934656,1,3221192832,5,4294934656,15,16744576,4,4294934656,1,3221192832,21,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,9,4294934656,1,2164228224,17,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,1,2164228224,4,4294934656,1,2164228224,11,16744576,1,2164228224,9,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,9,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,16,16744576,1,3221192832,6,4294934656,18,16744576,1,2164228224,9,4294934656,1,1090486400,25,16744576,1,2164228224,4,4294934656,1,2164228224,25,16744576,9,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,2164228224,5,4294934656,17,16744576,9,4294934656,1,3221192832,15,16744576,1,2164228224,4,4294934656,12,16744576,1,3221192832,8,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,9,4294934656,18,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,9,16744576,5,4294934656,1,2164228224,11,16744576,1,2164228224,9,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,3221192832,8,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,15,16744576,1,3221192832,6,4294934656,1,2164228224,19,16744576,9,4294934656,26,16744576,1,2164228224,4,4294934656,1,2164228224,25,16744576,9,4294934656,1,1090486400,16,16744576,1,2164228224,4,4294934656,1,2164228224,9,16744576,1,3221192832,4,4294934656,1,3221192832,17,16744576,1,2164228224,8,4294934656,1,2164228224,15,16744576,1,2164228224,4,4294934400,1,1090486144,10,16744576,1,1090486400,1,4294934656,8,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,8,4294934656,1,2164228224,18,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,8,16744576,1,2164228224,5,4294934656,1,1090486400,11,16744576,1,2164228224,8,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,2164228224,8,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,14,16744576,1,3221192832,7,4294934656,1,1090486400,19,16744576,8,4294934656,1,3221192832,26,16744576,1,2164228224,4,4294934656,1,2164228224,25,16744576,1,2164228224,8,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,8,16744576,1,1090486400,5,4294934656,1,2164228224,17,16744576,1,2164228224,8,4294934656,1,1090486400,15,16744576,1,2164227968,2,4294934400,2,4294934656,1,2164228224,9,16744576,1,1090486400,2,4294934656,8,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,8,4294934656,19,16744576,4,4294934656,1,2164228224,17,16744576,5,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,5,4294934656,7,16744576,1,1090486400,2,4294934400,1,4294934656,1,4294934400,2,4294934656,12,16744576,1,2164228224,8,4294934656,18,16744576,1,2164228224,4,4294934656,1,2164228224,16,16744576,1,1090486400,8,4294934656,17,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,12,16744576,1,2164228224,8,4294934656,1,2164228224,20,16744576,1,2164228224,7,4294934656,1,2164228224,26,16744576,1,2164228224,4,4294934656,1,2164228224,25,16744576,1,2164228224,7,4294934656,1,3221192832,17,16744576,1,2164228224,4,4294934656,1,2164228224,7,16744576,1,1090486400,6,4294934656,1,2164228224,18,16744576,8,4294934656,17,16744576,4,4294934400,1,4294934656,1,1090486400,7,16744576,1,1090486400,3,4294934656,8,16744576,5,4294934656,19,16744576,5,4294934656,8,16744576,1,2164228224,7,4294934656,1,2164228224,19,16744576,4,4294934656,1,2164228224,5,16744576,1,1090486400,11,2164228224,5,4294934656,12,2164228224,5,16744576,1,2164228224,4,4294934656,1,3221192832,14,2164228224,7,16744576,5,4294934656,5,16744576,1,1090486400,1,3221192576,6,4294934656,1,3221192832,12,16744576,1,2164228224,7,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,7,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,5,4294934656,1,2164228224,8,2164227968,1,2164228224,1,3221192832,10,4294934656,21,16744576,1,2164228224,7,4294934656,1,1090486400,14,16744576,1,1090486400,11,2164228224,1,3221192832,4,4294934656,1,3221192832,11,2164228224,15,16744576,7,4294934656,1,2164228224,17,16744576,1,2164228224,4,4294934656,1,3221192832,5,2164227968,1,2164228224,1,3221192832,7,4294934656,19,16744576,7,4294934656,1,2164228224,17,16744576,2,4294934656,1,4294934400,2,4294934656,1,4294934400,1,1090486400,5,16744576,1,2164228224,4,4294934656,8,16744576,5,4294934656,14,2164228224,1,1090486400,4,16744576,5,4294934656,8,16744576,1,2164228224,7,4294934656,20,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,18,4294934656,1,1090486400,12,16744576,1,2164228224,7,4294934656,19,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,3221192832,6,4294934656,1,1090486400,17,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,20,4294934656,3,4294934400,2,4294934656,1,1090486400,22,16744576,7,4294934656,15,16744576,1,2164228224,28,4294934656,15,16744576,7,4294934656,1,1090486400,17,16744576,1,2164228224,10,4294934656,3,4294934400,2,4294934656,2,4294934400,1,4294934656,1,3221192832,19,16744576,1,2164228224,6,4294934656,1,2164228224,17,16744576,1,2164228224,6,4294934656,1,3221192832,2,2164228224,1,3221192832,6,4294934656,8,16744576,19,4294934656,1,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,6,4294934656,1,2164228224,20,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,17,4294934656,1,3221192832,13,16744576,1,2164228224,6,4294934656,1,2164228224,19,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,2164228224,6,4294934656,18,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,24,4294934656,1,2164228224,23,16744576,6,4294934656,1,2164228224,15,16744576,1,2164228224,28,4294934656,15,16744576,1,2164228224,6,4294934656,18,16744576,1,2164228224,18,4294934656,1,1090486400,19,16744576,1,2164228224,6,4294934656,18,16744576,1,1090486400,16,4294934656,8,16744576,19,4294934656,1,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,6,4294934656,21,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,17,4294934656,1,1090486400,13,16744576,1,2164228224,6,4294934656,20,16744576,1,2164228224,4,4294934656,1,2164228224,17,16744576,1,1090486400,5,4294934656,1,3221192832,18,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,23,4294934656,1,3221192832,24,16744576,1,2164228224,5,4294934656,1,2164228224,15,16744576,1,2164228224,28,4294934656,15,16744576,1,2164228224,5,4294934656,1,3221192832,18,16744576,1,2164228224,17,4294934656,1,3221192832,21,16744576,6,4294934656,19,16744576,1,3221192832,15,4294934656,8,16744576,19,4294934656,1,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,5,4294934656,1,2164228224,21,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,16,4294934656,1,2164228224,14,16744576,1,2164228224,5,4294934656,1,2164228224,20,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,5,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,22,4294934656,1,3221192832,25,16744576,1,2164228224,5,4294934656,16,16744576,1,2164228224,28,4294934656,16,16744576,5,4294934656,1,2164228224,18,16744576,1,2164228224,17,4294934656,22,16744576,5,4294934656,1,2164228224,19,16744576,1,1090486400,15,4294934656,8,16744576,19,4294934656,1,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,5,4294934656,22,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,15,4294934656,1,3221192832,15,16744576,1,2164228224,5,4294934656,21,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,3221192832,4,4294934656,1,1090486400,18,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,21,4294934656,1,1090486400,27,16744576,5,4294934656,16,16744576,1,2164228224,28,4294934656,16,16744576,5,4294934656,19,16744576,1,2164228224,16,4294934656,1,1090486400,22,16744576,1,2164228224,4,4294934656,1,2164228224,20,16744576,1,2164228224,13,4294934656,1,3221192832,8,16744576,19,4294934656,1,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,1,2164228224,22,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,14,4294934656,1,2164228224,16,16744576,1,2164228224,4,4294934656,1,2164228224,21,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,2164228224,4,4294934656,19,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,19,4294934656,1,3221192832,29,16744576,4,4294934656,1,2164228224,16,16744576,1,2164228224,28,4294934656,16,16744576,1,2164228224,4,4294934656,19,16744576,1,2164228224,14,4294934656,1,3221192832,1,1090486400,23,16744576,1,2164228224,4,4294934656,22,16744576,1,3221192832,3,4294934656,7,4294934400,1,4294934656,1,2164227968,9,16744576,19,4294934656,1,2164228224,4,16744576,5,4294934656,8,16744576,1,2164228224,4,4294934656,23,16744576,4,4294934656,1,2164228224,5,16744576,1,2164228224,28,4294934656,5,16744576,1,2164228224,19,4294934656,7,16744576,12,4294934656,1,2164228224,18,16744576,1,2164228224,3,4294934656,1,3221192832,22,16744576,1,2164228224,4,4294934656,1,2164228224,18,16744576,1,1090486400,3,4294934656,1,3221192832,19,16744576,1,2164228224,4,4294934656,1,2164228224,36,16744576,16,4294934656,1,3221192832,1,2164228224,31,16744576,1,2164228224,3,4294934656,1,2164228224,16,16744576,1,2164228224,28,4294934656,16,16744576,1,2164228224,3,4294934656,1,2164228224,19,16744576,1,2164228224,12,4294934656,1,3221192832,1,1090486400,26,16744576,4,4294934656,23,16744576,1,1090486400,2,4294934656,7,4294934400,1,1090486144,10,16744576,19,4294934656,1,2164228224,199,16744576,3,2164228224,1,1090486400,110,16744576,1,1090486400,3,2164228224,63,16744576,3,2164228224,1,1090486400,60,16744576,3,2164228224,1,1090486400,25,16744576,1,2164228224,1,3221192832,3,4294934656,1,3221192832,1,2164228224,1058,16744576]};
@@ -0,0 +1,41 @@
1
+ import * as THREE from "three";
2
+ import data from "./array-detail-data.ts";
3
+ import { detailSignature } from "./detail-signature.ts";
4
+
5
+ /** Prebaked shallow lettering; source mismatch retains real geometry. No browser
6
+ * rasterization/readback is needed. Normals, coverage and live PBR lighting are
7
+ * kept separate, so this is not a photograph with fixed illumination.
8
+ */
9
+ export function createArrayDetail(surface: string, source: THREE.BufferGeometry, material: THREE.Material) {
10
+ if (surface !== "Array_Interior_Lettering" || !(material instanceof THREE.MeshStandardMaterial)
11
+ || detailSignature(source) !== data.signature) return undefined;
12
+ const pixels = new Uint8Array(data.width * data.height * 4);
13
+ let offset = 0;
14
+ for (let run = 0; run < data.runs.length; run += 2) {
15
+ const count = data.runs[run], value = data.runs[run + 1];
16
+ for (let i = 0; i < count; i++) {
17
+ pixels[offset++] = value & 255; pixels[offset++] = (value >>> 8) & 255;
18
+ pixels[offset++] = (value >>> 16) & 255; pixels[offset++] = value >>> 24;
19
+ }
20
+ }
21
+ if (offset !== pixels.length) return undefined;
22
+ const texture = new THREE.DataTexture(pixels, data.width, data.height, THREE.RGBAFormat);
23
+ texture.name = "Array lettering normal and coverage"; texture.colorSpace = THREE.NoColorSpace;
24
+ texture.generateMipmaps = true; texture.minFilter = THREE.LinearMipmapLinearFilter;
25
+ texture.magFilter = THREE.LinearFilter; texture.anisotropy = 4; texture.needsUpdate = true;
26
+ const geometry = new THREE.PlaneGeometry(data.max[0] - data.min[0], data.max[1] - data.min[1]).translate(
27
+ (data.min[0] + data.max[0]) / 2, (data.min[1] + data.max[1]) / 2, data.max[2]);
28
+ const proxyMaterial = material.clone();
29
+ proxyMaterial.normalMap = texture; proxyMaterial.normalMapType = THREE.TangentSpaceNormalMap;
30
+ proxyMaterial.normalScale.set(1, 1); proxyMaterial.transparent = true; proxyMaterial.depthWrite = false;
31
+ proxyMaterial.alphaTest = 0.01;
32
+ proxyMaterial.onBeforeCompile = shader => {
33
+ shader.fragmentShader = shader.fragmentShader.replace("#include <alphatest_fragment>",
34
+ "diffuseColor.a *= texture2D(normalMap, vNormalMapUv).a;\n#include <alphatest_fragment>");
35
+ };
36
+ proxyMaterial.customProgramCacheKey = () => "array-normal-coverage-v1";
37
+ proxyMaterial.userData.arrayDetail = {
38
+ surface, width: data.width, height: data.height, bakedTriangles: data.sourceTriangles, signature: data.signature,
39
+ };
40
+ return { geometry, material: proxyMaterial, texture };
41
+ }
@@ -0,0 +1,411 @@
1
+ import * as THREE from "three";
2
+
3
+ export const ARRAY_INTERIOR_SURFACES = new Set([
4
+ "Internal_Ceramic",
5
+ "Subsurface_Optics",
6
+ "Optical_Edges",
7
+ ]);
8
+
9
+ export type ArrayInteriorBake = {
10
+ meshes: THREE.Mesh[];
11
+ texture: THREE.Texture;
12
+ dispose(): void;
13
+ stats: {
14
+ width: number;
15
+ height: number;
16
+ sourceTriangles: number;
17
+ bakedTriangles: number;
18
+ proxyTriangles: number;
19
+ letteringTriangles: number;
20
+ instanceTriangles: number;
21
+ textureType: "half-float";
22
+ textureBytes: number;
23
+ shadowStrength: number;
24
+ };
25
+ };
26
+
27
+ export type InteriorBakeOptions = {
28
+ surfaces?: ReadonlySet<string>;
29
+ /** Shelf overview direction in the cassette's local space. */
30
+ direction?: THREE.Vector3;
31
+ maxSize?: number;
32
+ preserveOutsideSubstrate?: boolean;
33
+ shadowStrength?: number;
34
+ name?: string;
35
+ };
36
+
37
+ const LETTERING_DEPTH = 0.22;
38
+ const SURFACE_OFFSET = 0.001;
39
+ // A lit image contains ambient as well as direct illumination. This deliberately
40
+ // conservative approximation restores moving shadows without blackening both.
41
+ const SHADOW_STRENGTH = 0.3;
42
+
43
+ function surfaceName(mesh: THREE.Mesh) {
44
+ const material = mesh.material as THREE.Material;
45
+ return String(mesh.userData.surface ?? material.name).replace(/\.\d+$/, "");
46
+ }
47
+
48
+ function triangleCount(geometry: THREE.BufferGeometry) {
49
+ return (geometry.index?.count ?? geometry.getAttribute("position").count) / 3;
50
+ }
51
+
52
+ /** Copy selected triangles, owning every attribute independently of the GLB. */
53
+ function extractTriangles(
54
+ source: THREE.BufferGeometry,
55
+ keep: (a: number, b: number, c: number) => boolean,
56
+ ) {
57
+ const index = source.index;
58
+ const count = index?.count ?? source.getAttribute("position").count;
59
+ const original: number[] = [];
60
+ const remap = new Map<number, number>();
61
+ const indices: number[] = [];
62
+ for (let offset = 0; offset < count; offset += 3) {
63
+ const a = index ? index.getX(offset) : offset;
64
+ const b = index ? index.getX(offset + 1) : offset + 1;
65
+ const c = index ? index.getX(offset + 2) : offset + 2;
66
+ if (!keep(a, b, c)) continue;
67
+ for (const vertex of [a, b, c]) {
68
+ if (!remap.has(vertex)) {
69
+ remap.set(vertex, original.length);
70
+ original.push(vertex);
71
+ }
72
+ indices.push(remap.get(vertex)!);
73
+ }
74
+ }
75
+ const geometry = new THREE.BufferGeometry();
76
+ for (const [name, attribute] of Object.entries(source.attributes)) {
77
+ const values = new Float32Array(original.length * attribute.itemSize);
78
+ for (let i = 0; i < original.length; i++) {
79
+ for (let component = 0; component < attribute.itemSize; component++) {
80
+ values[i * attribute.itemSize + component] = attribute.getComponent(original[i], component);
81
+ }
82
+ }
83
+ geometry.setAttribute(name, new THREE.BufferAttribute(values, attribute.itemSize));
84
+ }
85
+ geometry.setIndex(indices);
86
+ return geometry;
87
+ }
88
+
89
+ export function copyInteriorLights(source: THREE.Scene, target: THREE.Scene) {
90
+ source.traverse((object) => {
91
+ if (!(object instanceof THREE.Light)) return;
92
+ object.updateWorldMatrix(true, false);
93
+ const light = object.clone();
94
+ object.matrixWorld.decompose(light.position, light.quaternion, light.scale);
95
+ light.castShadow = false;
96
+ if (
97
+ (object instanceof THREE.DirectionalLight && light instanceof THREE.DirectionalLight) ||
98
+ (object instanceof THREE.SpotLight && light instanceof THREE.SpotLight)
99
+ ) {
100
+ object.target.getWorldPosition(light.target.position);
101
+ target.add(light.target);
102
+ }
103
+ target.add(light);
104
+ });
105
+ }
106
+
107
+ function proxyMaterial(texture: THREE.Texture, shadowStrength: number) {
108
+ // The built-in shadow vertex path already handles instance matrices, normal
109
+ // bias, logarithmic depth and directional/spot/point shadow coordinates.
110
+ const shader = THREE.ShaderLib.shadow;
111
+ const uniforms = THREE.UniformsUtils.clone(shader.uniforms);
112
+ uniforms.arrayInteriorMap = { value: texture };
113
+ uniforms.arrayShadowStrength = { value: shadowStrength };
114
+ const material = new THREE.ShaderMaterial({
115
+ uniforms,
116
+ vertexShader: shader.vertexShader
117
+ .replace("#include <common>", "#include <common>\nvarying vec2 vArrayUv;")
118
+ .replace("#include <begin_vertex>", "#include <begin_vertex>\nvArrayUv = uv;"),
119
+ fragmentShader: shader.fragmentShader
120
+ .replace(
121
+ "#include <common>",
122
+ "#include <common>\nvarying vec2 vArrayUv;\nuniform sampler2D arrayInteriorMap;\nuniform float arrayShadowStrength;",
123
+ )
124
+ .replace(
125
+ "gl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );",
126
+ "vec3 radiance = texture2D(arrayInteriorMap, vArrayUv).rgb;\n" +
127
+ "gl_FragColor = vec4(radiance * mix(1.0, getShadowMask(), arrayShadowStrength), 1.0);",
128
+ ),
129
+ lights: true,
130
+ fog: true,
131
+ toneMapped: true,
132
+ transparent: false,
133
+ depthTest: true,
134
+ depthWrite: true,
135
+ side: THREE.FrontSide,
136
+ });
137
+ material.name = "Array_Interior";
138
+ return material;
139
+ }
140
+
141
+ /**
142
+ * Bake the packed array's three interior surfaces onto the substrate's real
143
+ * opaque front face. Source meshes/attributes/materials remain caller-owned.
144
+ * The original substrate still supplies its bevels, back face and cast shadow;
145
+ * the cover and perimeter retain their authored geometry and transmission.
146
+ */
147
+ export function bakeArrayInterior(
148
+ renderer: THREE.WebGLRenderer,
149
+ scene: THREE.Scene,
150
+ sources: THREE.Mesh[],
151
+ options: InteriorBakeOptions = {},
152
+ ): ArrayInteriorBake {
153
+ const interiorSurfaces = options.surfaces ?? ARRAY_INTERIOR_SURFACES;
154
+ const shadowStrength = THREE.MathUtils.clamp(options.shadowStrength ?? SHADOW_STRENGTH, 0, 1);
155
+ const substrate = sources.find((mesh) => surfaceName(mesh) === "Optical_Diffuser");
156
+ if (!substrate) throw new Error("Array interior baking requires the optical substrate.");
157
+ if (sources.some((mesh) => Array.isArray(mesh.material))) {
158
+ throw new Error("Array interior baking requires one material per source mesh.");
159
+ }
160
+ if (!renderer.extensions.has("EXT_color_buffer_float")) {
161
+ // Let the caller retain the authored meshes rather than silently clipping
162
+ // HDR lighting into an 8-bit render target on unsupported hardware.
163
+ throw new Error("Array interior baking requires a linear half-float render target.");
164
+ }
165
+
166
+ const meshes: THREE.Mesh[] = [];
167
+ const ownedGeometry = new Set<THREE.BufferGeometry>();
168
+ const ownedMaterial = new Set<THREE.Material>();
169
+ const temporaryGeometry = new Set<THREE.BufferGeometry>();
170
+ const temporaryMaterial = new Set<THREE.Material>();
171
+ let target: THREE.WebGLRenderTarget | undefined;
172
+ let texture: THREE.DataTexture | undefined;
173
+ let disposed = false;
174
+ const dispose = () => {
175
+ if (disposed) return;
176
+ disposed = true;
177
+ for (const geometry of ownedGeometry) geometry.dispose();
178
+ for (const material of ownedMaterial) material.dispose();
179
+ target?.dispose();
180
+ texture?.dispose();
181
+ };
182
+
183
+ try {
184
+ const sourcePosition = substrate.geometry.getAttribute("position");
185
+ let frontZ = -Infinity;
186
+ for (let i = 0; i < sourcePosition.count; i++) frontZ = Math.max(frontZ, sourcePosition.getZ(i));
187
+ const front = extractTriangles(substrate.geometry, (a, b, c) =>
188
+ [a, b, c].every((index) => Math.abs(sourcePosition.getZ(index) - frontZ) < 1e-6),
189
+ );
190
+ ownedGeometry.add(front);
191
+ if (!front.index?.count) throw new Error("The optical substrate has no planar front face.");
192
+ front.computeBoundingBox();
193
+ const bounds = front.boundingBox!;
194
+ const size = bounds.getSize(new THREE.Vector3());
195
+ const center = bounds.getCenter(new THREE.Vector3());
196
+ if (!(size.x > 0 && size.y > 0)) throw new Error("The optical substrate has an empty front face.");
197
+ const position = front.getAttribute("position");
198
+ const uv = new Float32Array(position.count * 2);
199
+ for (let i = 0; i < position.count; i++) {
200
+ uv[i * 2] = (position.getX(i) - bounds.min.x) / size.x;
201
+ uv[i * 2 + 1] = (position.getY(i) - bounds.min.y) / size.y;
202
+ position.setZ(i, position.getZ(i) + SURFACE_OFFSET);
203
+ }
204
+ front.setAttribute("uv", new THREE.BufferAttribute(uv, 2));
205
+ front.computeBoundingBox();
206
+ front.computeBoundingSphere();
207
+
208
+ const bakeScene = new THREE.Scene();
209
+ bakeScene.environment = scene.environment;
210
+ bakeScene.environmentIntensity = scene.environmentIntensity;
211
+ bakeScene.environmentRotation.copy(scene.environmentRotation);
212
+ copyInteriorLights(scene, bakeScene);
213
+ let sourceTriangles = 0;
214
+ let bakedTriangles = 0;
215
+ let letteringTriangles = 0;
216
+ for (const source of sources) {
217
+ const name = surfaceName(source);
218
+ if (!interiorSurfaces.has(name) && name !== "Optical_Diffuser") continue;
219
+ if (interiorSurfaces.has(name)) sourceTriangles += triangleCount(source.geometry);
220
+ let geometry = source.geometry;
221
+ if (name === "Internal_Ceramic" || options.preserveOutsideSubstrate && name !== "Optical_Diffuser") {
222
+ const attribute = source.geometry.getAttribute("position");
223
+ const isLetter = (a: number, b: number, c: number) =>
224
+ name === "Internal_Ceramic" && [a, b, c].every((index) => attribute.getZ(index) > LETTERING_DEPTH)
225
+ || !!options.preserveOutsideSubstrate && [a, b, c].some(index =>
226
+ attribute.getX(index) < bounds.min.x || attribute.getX(index) > bounds.max.x
227
+ || attribute.getY(index) < bounds.min.y || attribute.getY(index) > bounds.max.y);
228
+ const lettering = extractTriangles(source.geometry, isLetter);
229
+ ownedGeometry.add(lettering);
230
+ if (lettering.index!.count > 0) {
231
+ const material = (source.material as THREE.Material).clone();
232
+ ownedMaterial.add(material);
233
+ const mesh = new THREE.Mesh(lettering, material);
234
+ mesh.name = options.name ? `${options.name}_${name}_Retained` : "Array_Interior_Lettering";
235
+ mesh.userData.surface = mesh.name;
236
+ mesh.receiveShadow = true;
237
+ meshes.push(mesh);
238
+ letteringTriangles += triangleCount(lettering);
239
+ }
240
+ geometry = extractTriangles(source.geometry, (a, b, c) => !isLetter(a, b, c));
241
+ temporaryGeometry.add(geometry);
242
+ }
243
+ const material = (source.material as THREE.MeshStandardMaterial).clone();
244
+ material.fog = false;
245
+ material.toneMapped = false;
246
+ if (material instanceof THREE.MeshPhysicalMaterial) material.transmission = 0;
247
+ temporaryMaterial.add(material);
248
+ const mesh = new THREE.Mesh(geometry, material);
249
+ mesh.name = name;
250
+ bakeScene.add(mesh);
251
+ bakedTriangles += triangleCount(geometry);
252
+ }
253
+
254
+ const camera = new THREE.OrthographicCamera(-size.x / 2, size.x / 2, size.y / 2, -size.y / 2, 0.1, options.direction ? 20 : 4);
255
+ camera.position.copy(center).addScaledVector(options.direction?.clone().normalize() ?? new THREE.Vector3(0, 0, 1), options.direction ? 10 : 2 - center.z);
256
+ camera.lookAt(center.x, center.y, options.direction ? center.z : 0);
257
+ camera.updateMatrixWorld(true);
258
+ if (options.direction) {
259
+ const projectedBounds = bounds.clone().applyMatrix4(camera.matrixWorldInverse);
260
+ camera.left = projectedBounds.min.x; camera.right = projectedBounds.max.x;
261
+ camera.bottom = projectedBounds.min.y; camera.top = projectedBounds.max.y;
262
+ camera.updateProjectionMatrix();
263
+ const projected = new THREE.Vector3();
264
+ for (let i = 0; i < position.count; i++) {
265
+ projected.fromBufferAttribute(position, i).project(camera);
266
+ uv[i * 2] = projected.x * 0.5 + 0.5;
267
+ uv[i * 2 + 1] = projected.y * 0.5 + 0.5;
268
+ }
269
+ front.getAttribute("uv").needsUpdate = true;
270
+ }
271
+ const maximum = Math.min(options.maxSize ?? 1024, renderer.capabilities.maxTextureSize);
272
+ const aspect = (camera.right - camera.left) / (camera.top - camera.bottom);
273
+ const width = options.direction ? Math.max(1, Math.round(maximum * Math.min(1, aspect))) : maximum;
274
+ const height = options.direction ? Math.max(1, Math.round(maximum * Math.min(1, 1 / aspect))) : Math.max(1, Math.round(width * size.y / size.x));
275
+ target = new THREE.WebGLRenderTarget(width, height, {
276
+ type: THREE.HalfFloatType,
277
+ format: THREE.RGBAFormat,
278
+ colorSpace: THREE.LinearSRGBColorSpace,
279
+ depthBuffer: true,
280
+ stencilBuffer: false,
281
+ minFilter: THREE.LinearFilter,
282
+ magFilter: THREE.LinearFilter,
283
+ generateMipmaps: false,
284
+ });
285
+
286
+ const saved = {
287
+ target: renderer.getRenderTarget(),
288
+ face: renderer.getActiveCubeFace(),
289
+ mip: renderer.getActiveMipmapLevel(),
290
+ viewport: renderer.getViewport(new THREE.Vector4()),
291
+ scissor: renderer.getScissor(new THREE.Vector4()),
292
+ scissorTest: renderer.getScissorTest(),
293
+ clearColor: renderer.getClearColor(new THREE.Color()),
294
+ clearAlpha: renderer.getClearAlpha(),
295
+ autoClear: renderer.autoClear,
296
+ autoClearColor: renderer.autoClearColor,
297
+ autoClearDepth: renderer.autoClearDepth,
298
+ autoClearStencil: renderer.autoClearStencil,
299
+ toneMapping: renderer.toneMapping,
300
+ exposure: renderer.toneMappingExposure,
301
+ outputColorSpace: renderer.outputColorSpace,
302
+ shadowEnabled: renderer.shadowMap.enabled,
303
+ shadowAutoUpdate: renderer.shadowMap.autoUpdate,
304
+ shadowNeedsUpdate: renderer.shadowMap.needsUpdate,
305
+ xrEnabled: renderer.xr.enabled,
306
+ clippingPlanes: renderer.clippingPlanes,
307
+ localClipping: renderer.localClippingEnabled,
308
+ };
309
+ const pixels = new Uint16Array(width * height * 4);
310
+ // Some readback failures only log an error. A NaN sentinel plus opaque,
311
+ // finite-pixel validation keeps those failures on the real-geometry path.
312
+ pixels.fill(0x7e00);
313
+ try {
314
+ renderer.xr.enabled = false;
315
+ renderer.shadowMap.enabled = false;
316
+ renderer.shadowMap.autoUpdate = false;
317
+ renderer.shadowMap.needsUpdate = false;
318
+ renderer.clippingPlanes = [];
319
+ renderer.localClippingEnabled = false;
320
+ renderer.toneMapping = THREE.NoToneMapping;
321
+ renderer.toneMappingExposure = 1;
322
+ renderer.outputColorSpace = THREE.LinearSRGBColorSpace;
323
+ renderer.autoClear = true;
324
+ renderer.autoClearColor = true;
325
+ renderer.autoClearDepth = true;
326
+ renderer.autoClearStencil = true;
327
+ // RenderTarget viewport/scissor are physical pixels. Renderer.setViewport
328
+ // would multiply by the main canvas DPR and crop this independent image.
329
+ renderer.setRenderTarget(target);
330
+ renderer.setClearColor(0x000000, 1);
331
+ renderer.render(bakeScene, camera);
332
+ renderer.readRenderTargetPixels(target, 0, 0, width, height, pixels);
333
+ let hasColor = false;
334
+ for (let offset = 0; offset < pixels.length; offset += 4) {
335
+ if (pixels[offset + 3] !== 0x3c00) {
336
+ throw new Error("Array interior half-float readback did not produce an opaque image.");
337
+ }
338
+ for (let channel = 0; channel < 3; channel++) {
339
+ const value = pixels[offset + channel];
340
+ if ((value & 0x7c00) === 0x7c00) {
341
+ throw new Error("Array interior half-float readback contains non-finite pixels.");
342
+ }
343
+ if ((value & 0x7fff) !== 0) hasColor = true;
344
+ }
345
+ }
346
+ if (!hasColor) throw new Error("Array interior baking produced an empty image.");
347
+ } finally {
348
+ renderer.setViewport(saved.viewport);
349
+ renderer.setScissor(saved.scissor);
350
+ renderer.setScissorTest(saved.scissorTest);
351
+ renderer.setRenderTarget(saved.target, saved.face, saved.mip);
352
+ renderer.setClearColor(saved.clearColor, saved.clearAlpha);
353
+ renderer.autoClear = saved.autoClear;
354
+ renderer.autoClearColor = saved.autoClearColor;
355
+ renderer.autoClearDepth = saved.autoClearDepth;
356
+ renderer.autoClearStencil = saved.autoClearStencil;
357
+ renderer.toneMapping = saved.toneMapping;
358
+ renderer.toneMappingExposure = saved.exposure;
359
+ renderer.outputColorSpace = saved.outputColorSpace;
360
+ renderer.shadowMap.enabled = saved.shadowEnabled;
361
+ renderer.shadowMap.autoUpdate = saved.shadowAutoUpdate;
362
+ renderer.shadowMap.needsUpdate = saved.shadowNeedsUpdate;
363
+ renderer.xr.enabled = saved.xrEnabled;
364
+ renderer.clippingPlanes = saved.clippingPlanes;
365
+ renderer.localClippingEnabled = saved.localClipping;
366
+ }
367
+
368
+ // Retain pixels in an ordinary texture: context restoration can upload it
369
+ // again, and the existing quality control can change its anisotropy.
370
+ texture = new THREE.DataTexture(pixels, width, height, THREE.RGBAFormat, THREE.HalfFloatType);
371
+ texture.name = options.name ?? "Rhine array interior radiance";
372
+ texture.colorSpace = THREE.LinearSRGBColorSpace;
373
+ texture.flipY = false;
374
+ texture.generateMipmaps = true;
375
+ texture.minFilter = THREE.LinearMipmapLinearFilter;
376
+ texture.magFilter = THREE.LinearFilter;
377
+ texture.anisotropy = Math.min(4, renderer.capabilities.getMaxAnisotropy());
378
+ texture.needsUpdate = true;
379
+ target.dispose();
380
+ target = undefined;
381
+ const material = proxyMaterial(texture, shadowStrength);
382
+ ownedMaterial.add(material);
383
+ const proxy = new THREE.Mesh(front, material);
384
+ proxy.name = options.name ?? "Array_Interior";
385
+ proxy.userData.surface = proxy.name;
386
+ proxy.receiveShadow = shadowStrength > 0;
387
+ meshes.unshift(proxy);
388
+ const proxyTriangles = triangleCount(front);
389
+ let textureBytes = 0;
390
+ for (let w = width, h = height; ; w = Math.max(1, w >> 1), h = Math.max(1, h >> 1)) {
391
+ textureBytes += w * h * 8;
392
+ if (w === 1 && h === 1) break;
393
+ }
394
+ return {
395
+ meshes,
396
+ texture,
397
+ dispose,
398
+ stats: {
399
+ width, height, sourceTriangles, bakedTriangles, proxyTriangles,
400
+ letteringTriangles, instanceTriangles: proxyTriangles + letteringTriangles,
401
+ textureType: "half-float", textureBytes, shadowStrength,
402
+ },
403
+ };
404
+ } catch (error) {
405
+ dispose();
406
+ throw error;
407
+ } finally {
408
+ for (const geometry of temporaryGeometry) geometry.dispose();
409
+ for (const material of temporaryMaterial) material.dispose();
410
+ }
411
+ }