@bitefoundry/retrieviewer 0.0.0-stage → 0.0.1

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 (292) hide show
  1. package/ASSET-PROVENANCE.md +43 -0
  2. package/ASSETS-LICENSE.md +58 -0
  3. package/ATTRIBUTION.md +54 -0
  4. package/EMBEDDING.md +96 -0
  5. package/INSTALLING.md +107 -0
  6. package/LICENSE +16 -0
  7. package/LICENSE-CODE +21 -0
  8. package/PLUGIN.md +110 -0
  9. package/PUPPY-MEMORY.md +57 -0
  10. package/PUPPY-Q5-COMPARISON.md +73 -0
  11. package/README.md +61 -2
  12. package/RELEASING.md +61 -0
  13. package/THIRD-PARTY-NOTICES.md +17 -0
  14. package/TRADEMARKS.md +21 -0
  15. package/braille.mjs +45 -0
  16. package/examples/bridge.py +62 -0
  17. package/examples/embed.mjs +15 -0
  18. package/examples/live.mjs +40 -0
  19. package/examples/plugin.mjs +21 -0
  20. package/integrations/opencode/runtime.mjs +195 -0
  21. package/integrations/opencode/tui.tsx +59 -0
  22. package/locomotion-core.mjs +21 -0
  23. package/locomotion-puppy.animal +0 -0
  24. package/package.json +125 -4
  25. package/pet-q5-manifest.json +118 -0
  26. package/puppy-clean.mjs +51 -0
  27. package/puppy-companion-interactions-v3-q5.bin.gz +0 -0
  28. package/puppy-companion-interactions-v3.json +1 -0
  29. package/puppy-companion-life.mjs +182 -0
  30. package/puppy-companion-objects.mjs +30 -0
  31. package/puppy-companion-sprites.mjs +14 -0
  32. package/puppy-continuous.mjs +57 -0
  33. package/puppy-face.mjs +46 -0
  34. package/puppy-frame-predictive.mjs +147 -0
  35. package/puppy-frame-store.mjs +108 -0
  36. package/puppy-mouth-anchor.json +1 -0
  37. package/puppy-mouth-anchor.mjs +33 -0
  38. package/puppy-paper-actions-v9-q5.bin.gz +0 -0
  39. package/puppy-paper-actions-v9.json +1 -0
  40. package/puppy-paper-actions.mjs +48 -0
  41. package/puppy-paper-approach-q5.bin.gz +0 -0
  42. package/puppy-paper-approach.json +1 -0
  43. package/puppy-paper-area.mjs +15 -0
  44. package/puppy-paper-arrival-seat-q5.bin.gz +0 -0
  45. package/puppy-paper-arrival-seat.json +1 -0
  46. package/puppy-paper-behaviors-q5.bin.gz +0 -0
  47. package/puppy-paper-behaviors.json +1 -0
  48. package/puppy-paper-behaviors.mjs +8 -0
  49. package/puppy-paper-contact.mjs +103 -0
  50. package/puppy-paper-director.mjs +21 -0
  51. package/puppy-paper-paw-transport.mjs +76 -0
  52. package/puppy-paper-rear-gallop-q5.bin.gz +0 -0
  53. package/puppy-paper-rear-gallop.json +1 -0
  54. package/puppy-paper-seat-q5.bin.gz +0 -0
  55. package/puppy-paper-seat.json +14 -0
  56. package/puppy-paper-seat.mjs +13 -0
  57. package/puppy-paper-trick-timing.mjs +58 -0
  58. package/puppy-paper-world.mjs +108 -0
  59. package/puppy-paper.mjs +271 -0
  60. package/puppy-stable-meta.json +1606 -0
  61. package/puppy-stable.mjs +72 -0
  62. package/puppy-stride-meta.json +343 -0
  63. package/puppy-stride-tweens-q5.bin.gz +0 -0
  64. package/puppy-zoomies.mjs +27 -0
  65. package/puppy-zoomies30.mjs +12 -0
  66. package/retrieviewer-cli.mjs +81 -0
  67. package/retrieviewer-config.mjs +49 -0
  68. package/retrieviewer-install.mjs +157 -0
  69. package/retrieviewer-plugin.d.mts +44 -0
  70. package/retrieviewer-plugin.mjs +97 -0
  71. package/retrieviewer-stdio.mjs +38 -0
  72. package/retrieviewer.d.mts +85 -0
  73. package/retrieviewer.mjs +142 -0
  74. package/vendor/procedural-animals/LICENSE +21 -0
  75. package/vendor/procedural-animals/package.json +40 -0
  76. package/vendor/procedural-animals/src/animal.js +146 -0
  77. package/vendor/procedural-animals/src/bake.js +51 -0
  78. package/vendor/procedural-animals/src/build.js +81 -0
  79. package/vendor/procedural-animals/src/core/build/coatKit.js +121 -0
  80. package/vendor/procedural-animals/src/core/build/featherCards.js +189 -0
  81. package/vendor/procedural-animals/src/core/build/finEdges.js +85 -0
  82. package/vendor/procedural-animals/src/core/build/furSlope.js +115 -0
  83. package/vendor/procedural-animals/src/core/build/mesh.js +67 -0
  84. package/vendor/procedural-animals/src/core/build/pipeline.js +272 -0
  85. package/vendor/procedural-animals/src/core/build/seams.js +183 -0
  86. package/vendor/procedural-animals/src/core/build/warp.js +112 -0
  87. package/vendor/procedural-animals/src/core/build/weights.js +393 -0
  88. package/vendor/procedural-animals/src/core/math/vec.js +81 -0
  89. package/vendor/procedural-animals/src/core/motion/actions.js +800 -0
  90. package/vendor/procedural-animals/src/core/motion/bird.js +3063 -0
  91. package/vendor/procedural-animals/src/core/motion/birdActions.js +1059 -0
  92. package/vendor/procedural-animals/src/core/motion/common.js +158 -0
  93. package/vendor/procedural-animals/src/core/motion/index.js +22 -0
  94. package/vendor/procedural-animals/src/core/motion/quadruped.js +2875 -0
  95. package/vendor/procedural-animals/src/core/motion/snake.js +1594 -0
  96. package/vendor/procedural-animals/src/core/motion/spider.js +1810 -0
  97. package/vendor/procedural-animals/src/core/motion/swimmer.js +1047 -0
  98. package/vendor/procedural-animals/src/core/motion/swimmerActions.js +613 -0
  99. package/vendor/procedural-animals/src/core/render/animalObject.js +262 -0
  100. package/vendor/procedural-animals/src/core/render/coatMaterial.js +1301 -0
  101. package/vendor/procedural-animals/src/core/render/dqs.js +159 -0
  102. package/vendor/procedural-animals/src/core/render/eyes.js +676 -0
  103. package/vendor/procedural-animals/src/core/render/membranes.js +77 -0
  104. package/vendor/procedural-animals/src/core/render/skeleton.js +41 -0
  105. package/vendor/procedural-animals/src/core/rig/bird.js +327 -0
  106. package/vendor/procedural-animals/src/core/rig/quadruped.js +76 -0
  107. package/vendor/procedural-animals/src/core/rig/rig.js +79 -0
  108. package/vendor/procedural-animals/src/core/rig/snake.js +76 -0
  109. package/vendor/procedural-animals/src/core/rig/spider.js +110 -0
  110. package/vendor/procedural-animals/src/core/rig/swimmer.js +181 -0
  111. package/vendor/procedural-animals/src/core/sdf/eyeSocket.js +53 -0
  112. package/vendor/procedural-animals/src/core/sdf/mesher.js +238 -0
  113. package/vendor/procedural-animals/src/core/sdf/sdf.js +263 -0
  114. package/vendor/procedural-animals/src/index.d.ts +98 -0
  115. package/vendor/procedural-animals/src/index.js +29 -0
  116. package/vendor/procedural-animals/src/registry.js +48 -0
  117. package/vendor/procedural-animals/src/species/bear/behaviour.js +463 -0
  118. package/vendor/procedural-animals/src/species/bear/claws.js +147 -0
  119. package/vendor/procedural-animals/src/species/bear/coat.js +726 -0
  120. package/vendor/procedural-animals/src/species/bear/index.js +139 -0
  121. package/vendor/procedural-animals/src/species/bear/motion.js +112 -0
  122. package/vendor/procedural-animals/src/species/bear/regions.js +78 -0
  123. package/vendor/procedural-animals/src/species/bear/rig.js +112 -0
  124. package/vendor/procedural-animals/src/species/bear/sculpt.js +272 -0
  125. package/vendor/procedural-animals/src/species/boar/behaviour.js +335 -0
  126. package/vendor/procedural-animals/src/species/boar/coat.js +372 -0
  127. package/vendor/procedural-animals/src/species/boar/index.js +110 -0
  128. package/vendor/procedural-animals/src/species/boar/motion.js +85 -0
  129. package/vendor/procedural-animals/src/species/boar/regions.js +88 -0
  130. package/vendor/procedural-animals/src/species/boar/rig.js +111 -0
  131. package/vendor/procedural-animals/src/species/boar/sculpt.js +285 -0
  132. package/vendor/procedural-animals/src/species/cat/behaviour.js +559 -0
  133. package/vendor/procedural-animals/src/species/cat/coat.js +841 -0
  134. package/vendor/procedural-animals/src/species/cat/index.js +211 -0
  135. package/vendor/procedural-animals/src/species/cat/motion.js +101 -0
  136. package/vendor/procedural-animals/src/species/cat/regions.js +82 -0
  137. package/vendor/procedural-animals/src/species/cat/rig.js +100 -0
  138. package/vendor/procedural-animals/src/species/cat/sculpt.js +266 -0
  139. package/vendor/procedural-animals/src/species/cat/whiskers.js +110 -0
  140. package/vendor/procedural-animals/src/species/cheetah/coat.js +427 -0
  141. package/vendor/procedural-animals/src/species/cheetah/index.js +51 -0
  142. package/vendor/procedural-animals/src/species/cheetah/joints.js +3 -0
  143. package/vendor/procedural-animals/src/species/cheetah/motion.js +77 -0
  144. package/vendor/procedural-animals/src/species/cheetah/regions.js +95 -0
  145. package/vendor/procedural-animals/src/species/cheetah/rig.js +66 -0
  146. package/vendor/procedural-animals/src/species/cheetah/sculpt.js +158 -0
  147. package/vendor/procedural-animals/src/species/chicken/coat.js +313 -0
  148. package/vendor/procedural-animals/src/species/chicken/coverts.js +320 -0
  149. package/vendor/procedural-animals/src/species/chicken/index.js +110 -0
  150. package/vendor/procedural-animals/src/species/chicken/motion.js +177 -0
  151. package/vendor/procedural-animals/src/species/chicken/regions.js +66 -0
  152. package/vendor/procedural-animals/src/species/chicken/rig.js +144 -0
  153. package/vendor/procedural-animals/src/species/chicken/sculpt.js +389 -0
  154. package/vendor/procedural-animals/src/species/chicken/wingLook.js +66 -0
  155. package/vendor/procedural-animals/src/species/chicken/wingStack.js +124 -0
  156. package/vendor/procedural-animals/src/species/cow/behaviour.js +521 -0
  157. package/vendor/procedural-animals/src/species/cow/coat.js +465 -0
  158. package/vendor/procedural-animals/src/species/cow/index.js +118 -0
  159. package/vendor/procedural-animals/src/species/cow/motion.js +81 -0
  160. package/vendor/procedural-animals/src/species/cow/regions.js +98 -0
  161. package/vendor/procedural-animals/src/species/cow/rig.js +116 -0
  162. package/vendor/procedural-animals/src/species/cow/sculpt.js +339 -0
  163. package/vendor/procedural-animals/src/species/crow/coat.js +145 -0
  164. package/vendor/procedural-animals/src/species/crow/index.js +70 -0
  165. package/vendor/procedural-animals/src/species/crow/joints.js +3 -0
  166. package/vendor/procedural-animals/src/species/crow/motion.js +101 -0
  167. package/vendor/procedural-animals/src/species/crow/regions.js +50 -0
  168. package/vendor/procedural-animals/src/species/crow/rig.js +83 -0
  169. package/vendor/procedural-animals/src/species/crow/sculpt.js +118 -0
  170. package/vendor/procedural-animals/src/species/deer/behaviour.js +513 -0
  171. package/vendor/procedural-animals/src/species/deer/coat.js +391 -0
  172. package/vendor/procedural-animals/src/species/deer/index.js +106 -0
  173. package/vendor/procedural-animals/src/species/deer/motion.js +97 -0
  174. package/vendor/procedural-animals/src/species/deer/regions.js +60 -0
  175. package/vendor/procedural-animals/src/species/deer/rig.js +124 -0
  176. package/vendor/procedural-animals/src/species/deer/sculpt.js +297 -0
  177. package/vendor/procedural-animals/src/species/dog/behaviour.js +521 -0
  178. package/vendor/procedural-animals/src/species/dog/coat.js +495 -0
  179. package/vendor/procedural-animals/src/species/dog/index.js +144 -0
  180. package/vendor/procedural-animals/src/species/dog/motion.js +118 -0
  181. package/vendor/procedural-animals/src/species/dog/regions.js +61 -0
  182. package/vendor/procedural-animals/src/species/dog/rig.js +129 -0
  183. package/vendor/procedural-animals/src/species/dog/sculpt.js +246 -0
  184. package/vendor/procedural-animals/src/species/eagle/coat.js +250 -0
  185. package/vendor/procedural-animals/src/species/eagle/index.js +76 -0
  186. package/vendor/procedural-animals/src/species/eagle/joints.js +3 -0
  187. package/vendor/procedural-animals/src/species/eagle/motion.js +137 -0
  188. package/vendor/procedural-animals/src/species/eagle/regions.js +57 -0
  189. package/vendor/procedural-animals/src/species/eagle/rig.js +107 -0
  190. package/vendor/procedural-animals/src/species/eagle/sculpt.js +137 -0
  191. package/vendor/procedural-animals/src/species/fish/coat.js +271 -0
  192. package/vendor/procedural-animals/src/species/fish/index.js +88 -0
  193. package/vendor/procedural-animals/src/species/fish/motion.js +92 -0
  194. package/vendor/procedural-animals/src/species/fish/regions.js +27 -0
  195. package/vendor/procedural-animals/src/species/fish/rig.js +143 -0
  196. package/vendor/procedural-animals/src/species/fish/sculpt.js +214 -0
  197. package/vendor/procedural-animals/src/species/fish/variants.js +126 -0
  198. package/vendor/procedural-animals/src/species/fox/behaviour.js +314 -0
  199. package/vendor/procedural-animals/src/species/fox/coat.js +444 -0
  200. package/vendor/procedural-animals/src/species/fox/index.js +120 -0
  201. package/vendor/procedural-animals/src/species/fox/motion.js +81 -0
  202. package/vendor/procedural-animals/src/species/fox/regions.js +59 -0
  203. package/vendor/procedural-animals/src/species/fox/rig.js +91 -0
  204. package/vendor/procedural-animals/src/species/fox/sculpt.js +202 -0
  205. package/vendor/procedural-animals/src/species/frog/behaviour.js +590 -0
  206. package/vendor/procedural-animals/src/species/frog/coat.js +305 -0
  207. package/vendor/procedural-animals/src/species/frog/index.js +97 -0
  208. package/vendor/procedural-animals/src/species/frog/motion.js +69 -0
  209. package/vendor/procedural-animals/src/species/frog/regions.js +46 -0
  210. package/vendor/procedural-animals/src/species/frog/rig.js +156 -0
  211. package/vendor/procedural-animals/src/species/frog/sculpt.js +240 -0
  212. package/vendor/procedural-animals/src/species/goat/behaviour.js +509 -0
  213. package/vendor/procedural-animals/src/species/goat/coat.js +590 -0
  214. package/vendor/procedural-animals/src/species/goat/index.js +149 -0
  215. package/vendor/procedural-animals/src/species/goat/motion.js +95 -0
  216. package/vendor/procedural-animals/src/species/goat/regions.js +98 -0
  217. package/vendor/procedural-animals/src/species/goat/rig.js +181 -0
  218. package/vendor/procedural-animals/src/species/goat/sculpt.js +547 -0
  219. package/vendor/procedural-animals/src/species/horse/coat.js +361 -0
  220. package/vendor/procedural-animals/src/species/horse/coatSeam.js +122 -0
  221. package/vendor/procedural-animals/src/species/horse/index.js +80 -0
  222. package/vendor/procedural-animals/src/species/horse/motion.js +245 -0
  223. package/vendor/procedural-animals/src/species/horse/regions.js +60 -0
  224. package/vendor/procedural-animals/src/species/horse/rig.js +117 -0
  225. package/vendor/procedural-animals/src/species/horse/sculpt.js +316 -0
  226. package/vendor/procedural-animals/src/species/horse/seamWeights.js +272 -0
  227. package/vendor/procedural-animals/src/species/lion/behaviour.js +509 -0
  228. package/vendor/procedural-animals/src/species/lion/coat.js +1016 -0
  229. package/vendor/procedural-animals/src/species/lion/index.js +111 -0
  230. package/vendor/procedural-animals/src/species/lion/motion.js +87 -0
  231. package/vendor/procedural-animals/src/species/lion/regions.js +106 -0
  232. package/vendor/procedural-animals/src/species/lion/rig.js +110 -0
  233. package/vendor/procedural-animals/src/species/lion/sculpt.js +384 -0
  234. package/vendor/procedural-animals/src/species/lion/whiskers.js +132 -0
  235. package/vendor/procedural-animals/src/species/pig/behaviour.js +575 -0
  236. package/vendor/procedural-animals/src/species/pig/coat.js +730 -0
  237. package/vendor/procedural-animals/src/species/pig/ears.js +242 -0
  238. package/vendor/procedural-animals/src/species/pig/index.js +161 -0
  239. package/vendor/procedural-animals/src/species/pig/motion.js +105 -0
  240. package/vendor/procedural-animals/src/species/pig/regions.js +100 -0
  241. package/vendor/procedural-animals/src/species/pig/rig.js +152 -0
  242. package/vendor/procedural-animals/src/species/pig/sculpt.js +382 -0
  243. package/vendor/procedural-animals/src/species/rabbit/behaviour.js +605 -0
  244. package/vendor/procedural-animals/src/species/rabbit/coat.js +285 -0
  245. package/vendor/procedural-animals/src/species/rabbit/index.js +85 -0
  246. package/vendor/procedural-animals/src/species/rabbit/motion.js +85 -0
  247. package/vendor/procedural-animals/src/species/rabbit/regions.js +48 -0
  248. package/vendor/procedural-animals/src/species/rabbit/rig.js +99 -0
  249. package/vendor/procedural-animals/src/species/rabbit/sculpt.js +148 -0
  250. package/vendor/procedural-animals/src/species/rat/behaviour.js +539 -0
  251. package/vendor/procedural-animals/src/species/rat/coat.js +341 -0
  252. package/vendor/procedural-animals/src/species/rat/index.js +111 -0
  253. package/vendor/procedural-animals/src/species/rat/motion.js +90 -0
  254. package/vendor/procedural-animals/src/species/rat/regions.js +92 -0
  255. package/vendor/procedural-animals/src/species/rat/rig.js +112 -0
  256. package/vendor/procedural-animals/src/species/rat/sculpt.js +163 -0
  257. package/vendor/procedural-animals/src/species/rat/whiskers.js +119 -0
  258. package/vendor/procedural-animals/src/species/shark/coat.js +383 -0
  259. package/vendor/procedural-animals/src/species/shark/index.js +104 -0
  260. package/vendor/procedural-animals/src/species/shark/motion.js +69 -0
  261. package/vendor/procedural-animals/src/species/shark/regions.js +34 -0
  262. package/vendor/procedural-animals/src/species/shark/rig.js +194 -0
  263. package/vendor/procedural-animals/src/species/shark/sculpt.js +343 -0
  264. package/vendor/procedural-animals/src/species/shark/variants.js +105 -0
  265. package/vendor/procedural-animals/src/species/sheep/behaviour.js +522 -0
  266. package/vendor/procedural-animals/src/species/sheep/coat.js +529 -0
  267. package/vendor/procedural-animals/src/species/sheep/index.js +152 -0
  268. package/vendor/procedural-animals/src/species/sheep/motion.js +86 -0
  269. package/vendor/procedural-animals/src/species/sheep/neck.js +41 -0
  270. package/vendor/procedural-animals/src/species/sheep/regions.js +62 -0
  271. package/vendor/procedural-animals/src/species/sheep/rig.js +163 -0
  272. package/vendor/procedural-animals/src/species/sheep/sculpt.js +542 -0
  273. package/vendor/procedural-animals/src/species/snake/coat.js +315 -0
  274. package/vendor/procedural-animals/src/species/snake/index.js +73 -0
  275. package/vendor/procedural-animals/src/species/snake/motion.js +51 -0
  276. package/vendor/procedural-animals/src/species/snake/regions.js +51 -0
  277. package/vendor/procedural-animals/src/species/snake/rig.js +108 -0
  278. package/vendor/procedural-animals/src/species/snake/sculpt.js +122 -0
  279. package/vendor/procedural-animals/src/species/spider/coat.js +279 -0
  280. package/vendor/procedural-animals/src/species/spider/index.js +78 -0
  281. package/vendor/procedural-animals/src/species/spider/motion.js +72 -0
  282. package/vendor/procedural-animals/src/species/spider/regions.js +87 -0
  283. package/vendor/procedural-animals/src/species/spider/rig.js +118 -0
  284. package/vendor/procedural-animals/src/species/spider/sculpt.js +182 -0
  285. package/vendor/procedural-animals/src/species/wolf/behaviour.js +160 -0
  286. package/vendor/procedural-animals/src/species/wolf/coat.js +749 -0
  287. package/vendor/procedural-animals/src/species/wolf/index.js +107 -0
  288. package/vendor/procedural-animals/src/species/wolf/motion.js +80 -0
  289. package/vendor/procedural-animals/src/species/wolf/regions.js +57 -0
  290. package/vendor/procedural-animals/src/species/wolf/rig.js +87 -0
  291. package/vendor/procedural-animals/src/species/wolf/sculpt.js +339 -0
  292. package/vendor/procedural-animals/src/worker.js +29 -0
@@ -0,0 +1,147 @@
1
+ // 32-level predictive grayscale frames (RVQ5), a lossy VISUAL COMPARISON codec
2
+ // built from a lossless RVF1 store. Every pixel v becomes q=round(v*31/255) and
3
+ // is shown as round(q*255/31) (max error 4; 0 and 255 stay exact). The RVF1
4
+ // dedup map and crop rectangles are kept unchanged. Each cropped row stores a
5
+ // PNG filter type (0 None, 1 Sub, 2 Up, 3 Average, 4 Paeth; 1 byte per pixel)
6
+ // followed by w residual bytes (q - prediction) mod 256.
7
+ //
8
+ // Little-endian layout:
9
+ // 0 'RVQ5' 4 u32 width 8 u32 height 12 u32 logicalFrameCount 16 u32 uniqueCount
10
+ // 20 u32[logicalFrameCount] logical -> unique index
11
+ // then uniqueCount records of u32 x,y,w,h,offset,length (length = h*(w+1))
12
+ // then the filtered rows of every unique crop, contiguous in order.
13
+ // At load every crop is unfiltered once and kept as 5-bit packed indices; the
14
+ // filtered input is not retained. Full frames are rebuilt on demand (LRU of 2).
15
+ const MAGIC=[0x52,0x56,0x51,0x35],RVF1=[0x52,0x56,0x46,0x31],HEADER=20,RECORD=24,MAX_SIDE=16384,BITS=5;
16
+
17
+ export const quantize5=v=>Math.round(v*31/255);
18
+ export const expand5=q=>Math.round(q*255/31);
19
+ const QUANT=Uint8Array.from({length:256},(_,v)=>quantize5(v)),DISPLAY=Uint8Array.from({length:32},(_,q)=>expand5(q));
20
+ export const quantizedGray=Uint8Array.from({length:256},(_,v)=>DISPLAY[QUANT[v]]);
21
+ export const isPredictiveFrames=bytes=>bytes instanceof Uint8Array&&bytes.length>=4&&MAGIC.every((v,i)=>bytes[i]===v);
22
+
23
+ const fail=what=>{throw Error(`Invalid predictive frames: ${what}`);};
24
+ const paeth=(a,b,c)=>{const p=a+b-c,pa=Math.abs(p-a),pb=Math.abs(p-b),pc=Math.abs(p-c);return pa<=pb&&pa<=pc?a:pb<=pc?b:c;};
25
+ export function predict(type,a,b,c){
26
+ switch(type){case 0:return 0;case 1:return a;case 2:return b;case 3:return (a+b)>>1;case 4:return paeth(a,b,c);}
27
+ return fail('filter');
28
+ }
29
+
30
+ function checkShape(width,height,frameCount){
31
+ if(!Number.isInteger(width)||!Number.isInteger(height)||width<1||height<1||width>MAX_SIDE||height>MAX_SIDE)fail('header');
32
+ if(!Number.isInteger(frameCount)||frameCount<1||frameCount>0xffffffff||!Number.isSafeInteger(width*height*frameCount))fail('header');
33
+ }
34
+
35
+ // Encode an RVF1 byte store (see puppy-frame-store.mjs). Rows pick the filter
36
+ // with the smallest sum of |signed residual|, lowest type on ties; `filter`
37
+ // forces one type for every row (tests). Deterministic.
38
+ export function encodePredictiveFrames(rvf1,{filter}={}){
39
+ if(!(rvf1 instanceof Uint8Array)||rvf1.length<HEADER||RVF1.some((v,i)=>rvf1[i]!==v))throw Error('Invalid packed frames: magic');
40
+ if(filter!==undefined&&!(Number.isInteger(filter)&&filter>=0&&filter<=4))fail('filter');
41
+ const view=new DataView(rvf1.buffer,rvf1.byteOffset,rvf1.byteLength),u32=at=>view.getUint32(at,true);
42
+ const width=u32(4),height=u32(8),frameCount=u32(12),unique=u32(16),records=HEADER+4*frameCount,data=records+RECORD*unique;
43
+ checkShape(width,height,frameCount);
44
+ if(rvf1.length<data)throw Error('Invalid packed frames: truncated');
45
+ let total=0;
46
+ for(let u=0;u<unique;u++)total+=u32(records+RECORD*u+12)*(u32(records+RECORD*u+8)+1);
47
+ const out=new Uint8Array(data+total),ov=new DataView(out.buffer);
48
+ out.set(rvf1.subarray(0,data));out.set(MAGIC,0);
49
+ const rows=Array.from({length:5},()=>new Uint8Array(width)),cur=new Uint8Array(width),prev=new Uint8Array(width);let at=data,offset=0;
50
+ for(let u=0;u<unique;u++){
51
+ const rec=records+RECORD*u,w=u32(rec+8),h=u32(rec+12),src=data+u32(rec+16);
52
+ if(u32(rec+20)!==w*h||src+w*h>rvf1.length)throw Error('Invalid packed frames: offset');
53
+ ov.setUint32(rec+16,offset,true);ov.setUint32(rec+20,h*(w+1),true);offset+=h*(w+1);
54
+ prev.fill(0);
55
+ for(let y=0;y<h;y++){
56
+ for(let x=0;x<w;x++)cur[x]=QUANT[rvf1[src+y*w+x]];
57
+ let best=filter??-1,bestCost=Infinity;
58
+ for(let t=filter??0;t<=(filter??4);t++){
59
+ const r=rows[t];let cost=0;
60
+ for(let x=0;x<w;x++){const v=(cur[x]-predict(t,x?cur[x-1]:0,prev[x],x?prev[x-1]:0))&255;r[x]=v;cost+=v>127?256-v:v;}
61
+ if(cost<bestCost){bestCost=cost;best=t;}
62
+ }
63
+ out[at++]=best;out.set(rows[best].subarray(0,w),at);at+=w;prev.set(cur.subarray(0,w));
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+
69
+ // Exact PNG inverse filter of one row into `cur` (bpp 1, integer arithmetic).
70
+ function unfilterRow(type,src,at,cur,prev,w){
71
+ switch(type){
72
+ case 0:for(let x=0;x<w;x++)cur[x]=src[at+x];return;
73
+ case 1:for(let x=0;x<w;x++)cur[x]=(src[at+x]+(x?cur[x-1]:0))&255;return;
74
+ case 2:for(let x=0;x<w;x++)cur[x]=(src[at+x]+prev[x])&255;return;
75
+ case 3:for(let x=0;x<w;x++)cur[x]=(src[at+x]+(((x?cur[x-1]:0)+prev[x])>>1))&255;return;
76
+ case 4:for(let x=0;x<w;x++)cur[x]=(src[at+x]+paeth(x?cur[x-1]:0,prev[x],x?prev[x-1]:0))&255;return;
77
+ }
78
+ fail('filter');
79
+ }
80
+
81
+ // Validate and unfilter. Only the returned typed arrays survive; `bytes` is
82
+ // not referenced by the store built from them.
83
+ function decode(bytes){
84
+ if(!(bytes instanceof Uint8Array))fail('bytes');
85
+ if(!isPredictiveFrames(bytes)||bytes.length<HEADER)fail('magic');
86
+ const view=new DataView(bytes.buffer,bytes.byteOffset,bytes.byteLength),u32=at=>view.getUint32(at,true);
87
+ const width=u32(4),height=u32(8),frameCount=u32(12),unique=u32(16);
88
+ checkShape(width,height,frameCount);
89
+ if(unique<1||unique>frameCount)fail('unique count');
90
+ const data=HEADER+4*frameCount+RECORD*unique;
91
+ if(bytes.length<data)fail('truncated');
92
+ const map=new Uint32Array(frameCount),used=new Uint8Array(unique);
93
+ for(let f=0;f<frameCount;f++){const u=u32(HEADER+4*f);if(u>=unique)fail('map');map[f]=u;used[u]=1;}
94
+ if(used.includes(0))fail('unreferenced frame');
95
+ // x,y,w,h,first pixel index in the packed stream
96
+ const rects=new Float64Array(unique*5);let total=0,pixels=0;
97
+ for(let u=0;u<unique;u++){
98
+ const at=HEADER+4*frameCount+RECORD*u,x=u32(at),y=u32(at+4),w=u32(at+8),h=u32(at+12),offset=u32(at+16),length=u32(at+20);
99
+ if((w===0)!==(h===0)||(w===0&&(x||y))||x+w>width||y+h>height)fail('rectangle');
100
+ if(length!==h*(w+1)||offset!==total)fail('offset');
101
+ rects.set([x,y,w,h,pixels],u*5);total+=length;pixels+=w*h;
102
+ }
103
+ if(bytes.length!==data+total)fail('pixel length');
104
+ if(pixels*BITS>0xffffffff)fail('pixel count');
105
+ const packed=new Uint8Array(Math.ceil(pixels*BITS/8));
106
+ let cur=new Uint8Array(width),prev=new Uint8Array(width),at=data,pos=0;
107
+ for(let u=0;u<unique;u++){
108
+ const w=rects[u*5+2],h=rects[u*5+3];prev.fill(0);
109
+ for(let y=0;y<h;y++){
110
+ unfilterRow(bytes[at],bytes,at+1,cur,prev,w);at+=w+1;
111
+ for(let x=0;x<w;x++){
112
+ const q=cur[x];if(q>31)fail('quantized value');
113
+ const i=pos>>>3,s=pos&7;packed[i]|=(q<<s)&255;if(s>3)packed[i+1]|=q>>(8-s);pos+=BITS;
114
+ }
115
+ const t=prev;prev=cur;cur=t;
116
+ }
117
+ }
118
+ return{width,height,frameCount,unique,map,rects,packed};
119
+ }
120
+
121
+ function createStore({width,height,frameCount,unique,map,rects,packed}){
122
+ const n=width*height,slots=[{unique:-1,frame:null},{unique:-1,frame:null}];let decodes=0,hits=0;
123
+ return Object.freeze({
124
+ width,height,frameCount,uniqueCount:unique,byteLength:n*frameCount,residentPixelBytes:packed.byteLength,
125
+ get residentBytes(){return packed.byteLength+map.byteLength+rects.byteLength+slots.reduce((s,e)=>s+(e.frame?.byteLength??0),0);},
126
+ stats(){return{decodes,hits,cachedFrames:slots.filter(e=>e.frame).length};},
127
+ getFrame(index){
128
+ if(!Number.isInteger(index)||index<0||index>=frameCount)fail('frame index');
129
+ const u=map[index];
130
+ if(slots[0].unique===u){hits++;return slots[0].frame;}
131
+ if(slots[1].unique===u){hits++;slots.reverse();return slots[0].frame;}
132
+ const slot=slots.pop();slots.unshift(slot);decodes++;
133
+ const frame=slot.frame??=new Uint8Array(n),k=u*5,x=rects[k],y=rects[k+1],w=rects[k+2],h=rects[k+3];
134
+ frame.fill(0);slot.unique=u;
135
+ let pos=rects[k+4]*BITS;
136
+ for(let r=0;r<h;r++){
137
+ const row=(y+r)*width+x;
138
+ for(let c=0;c<w;c++){const i=pos>>>3,s=pos&7;let v=packed[i]>>s;if(s>3)v|=packed[i+1]<<(8-s);frame[row+c]=DISPLAY[v&31];pos+=BITS;}
139
+ }
140
+ return frame;
141
+ },
142
+ });
143
+ }
144
+
145
+ // Parse, validate and unpack an RVQ5 store. A returned frame is valid until two
146
+ // other unique frames have been requested.
147
+ export function readPredictiveFrames(bytes){return createStore(decode(bytes));}
@@ -0,0 +1,108 @@
1
+ // Lossless packed grayscale frames (RVF1). Exact duplicate frames are stored
2
+ // once and each unique frame keeps only the bounding rectangle of its nonzero
3
+ // pixels; every other pixel is exactly zero. No quantization or resampling.
4
+ //
5
+ // Little-endian layout:
6
+ // 0 'RVF1' 4 u32 width 8 u32 height 12 u32 logicalFrameCount 16 u32 uniqueCount
7
+ // 20 u32[logicalFrameCount] logical -> unique index
8
+ // then uniqueCount records of u32 x,y,w,h,offset,length (offset into pixel data)
9
+ // then the cropped row-major pixels of every unique frame, contiguous in order.
10
+ import {isPredictiveFrames,readPredictiveFrames} from './puppy-frame-predictive.mjs';
11
+ const MAGIC=[0x52,0x56,0x46,0x31],HEADER=20,RECORD=24,MAX_SIDE=16384;
12
+ const stores=new WeakSet();
13
+
14
+ export function isPackedFrames(value){return stores.has(value);}
15
+ export function isGrayFrameSource(value){return value instanceof Uint8Array||stores.has(value);}
16
+
17
+ const fnv=(bytes,start,end)=>{let h=0x811c9dc5;for(let i=start;i<end;i++)h=Math.imul(h^bytes[i],0x01000193);return h>>>0;};
18
+ const sameBytes=(bytes,a,b,n)=>{for(let i=0;i<n;i++)if(bytes[a+i]!==bytes[b+i])return false;return true;};
19
+
20
+ // Pack a legacy concatenated raster (frameCount full width*height frames).
21
+ export function packFrames(raw,width,height,frameCount){
22
+ checkShape(width,height,frameCount);
23
+ const n=width*height;
24
+ if(!(raw instanceof Uint8Array)||raw.length!==n*frameCount)throw Error('Invalid gray frames: byte length');
25
+ const map=new Uint32Array(frameCount),firsts=[],rects=[],buckets=new Map();let total=0;
26
+ for(let f=0;f<frameCount;f++){
27
+ const start=f*n,h=fnv(raw,start,start+n),bucket=buckets.get(h);
28
+ const hit=bucket?.find(u=>sameBytes(raw,firsts[u]*n,start,n));
29
+ if(hit!==undefined){map[f]=hit;continue;}
30
+ let x0=width,y0=height,x1=-1,y1=-1;
31
+ for(let y=0;y<height;y++){const row=start+y*width;for(let x=0;x<width;x++)if(raw[row+x]){if(x<x0)x0=x;if(x>x1)x1=x;if(y<y0)y0=y;y1=y;}}
32
+ const rect=x1<0?{x:0,y:0,w:0,h:0}:{x:x0,y:y0,w:x1-x0+1,h:y1-y0+1};
33
+ rect.offset=total;rect.length=rect.w*rect.h;total+=rect.length;
34
+ map[f]=firsts.length;if(bucket)bucket.push(firsts.length);else buckets.set(h,[firsts.length]);firsts.push(f);rects.push(rect);
35
+ }
36
+ const unique=firsts.length,data=HEADER+4*frameCount+RECORD*unique,out=new Uint8Array(data+total),view=new DataView(out.buffer);
37
+ out.set(MAGIC,0);[width,height,frameCount,unique].forEach((v,i)=>view.setUint32(4+4*i,v,true));
38
+ for(let f=0;f<frameCount;f++)view.setUint32(HEADER+4*f,map[f],true);
39
+ rects.forEach((r,u)=>{
40
+ const at=HEADER+4*frameCount+RECORD*u;[r.x,r.y,r.w,r.h,r.offset,r.length].forEach((v,i)=>view.setUint32(at+4*i,v,true));
41
+ const start=firsts[u]*n;for(let y=0;y<r.h;y++){const src=start+(r.y+y)*width+r.x;out.set(raw.subarray(src,src+r.w),data+r.offset+y*r.w);}
42
+ });
43
+ return out;
44
+ }
45
+
46
+ function checkShape(width,height,frameCount){
47
+ if(!Number.isInteger(width)||!Number.isInteger(height)||width<1||height<1||width>MAX_SIDE||height>MAX_SIDE)throw Error('Invalid gray frames: dimensions');
48
+ if(!Number.isInteger(frameCount)||frameCount<1||frameCount>0xffffffff||!Number.isSafeInteger(width*height*frameCount))throw Error('Invalid gray frames: frame count');
49
+ }
50
+
51
+ // Parse and fully validate an RVF1 store. The returned store keeps `bytes`
52
+ // resident (crops only) and reconstructs at most two full frames at a time.
53
+ // A returned frame is valid until two other unique frames have been requested.
54
+ // An 'RVQ5' store (lossy 32-level comparison codec) is delegated and branded.
55
+ export function readPackedFrames(bytes){
56
+ if(!(bytes instanceof Uint8Array))throw Error('Invalid packed frames: bytes');
57
+ if(isPredictiveFrames(bytes)){const store=readPredictiveFrames(bytes);stores.add(store);return store;}
58
+ if(bytes.length<HEADER||MAGIC.some((v,i)=>bytes[i]!==v))throw Error('Invalid packed frames: magic');
59
+ const view=new DataView(bytes.buffer,bytes.byteOffset,bytes.byteLength),u32=at=>view.getUint32(at,true);
60
+ const width=u32(4),height=u32(8),frameCount=u32(12),unique=u32(16);
61
+ try{checkShape(width,height,frameCount);}catch{throw Error('Invalid packed frames: header');}
62
+ if(unique<1||unique>frameCount)throw Error('Invalid packed frames: unique count');
63
+ const data=HEADER+4*frameCount+RECORD*unique,n=width*height;
64
+ if(bytes.length<data)throw Error('Invalid packed frames: truncated');
65
+ const map=new Uint32Array(frameCount),used=new Uint8Array(unique);
66
+ for(let f=0;f<frameCount;f++){const u=u32(HEADER+4*f);if(u>=unique)throw Error('Invalid packed frames: map');map[f]=u;used[u]=1;}
67
+ if(used.includes(0))throw Error('Invalid packed frames: unreferenced frame');
68
+ const rects=new Uint32Array(unique*6);let total=0;
69
+ for(let u=0;u<unique;u++){
70
+ const at=HEADER+4*frameCount+RECORD*u,x=u32(at),y=u32(at+4),w=u32(at+8),h=u32(at+12),offset=u32(at+16),length=u32(at+20);
71
+ if((w===0)!==(h===0)||(w===0&&(x||y))||x+w>width||y+h>height)throw Error('Invalid packed frames: rectangle');
72
+ if(length!==w*h||offset!==total)throw Error('Invalid packed frames: offset');
73
+ rects.set([x,y,w,h,offset,length],u*6);total+=length;
74
+ }
75
+ if(bytes.length!==data+total)throw Error('Invalid packed frames: pixel length');
76
+ const pixels=bytes.subarray(data),slots=[{unique:-1,frame:null},{unique:-1,frame:null}];let decodes=0,hits=0;
77
+ const store=Object.freeze({
78
+ width,height,frameCount,uniqueCount:unique,byteLength:n*frameCount,
79
+ get residentBytes(){return bytes.byteLength+map.byteLength+rects.byteLength+slots.reduce((s,e)=>s+(e.frame?.byteLength??0),0);},
80
+ stats(){return{decodes,hits,cachedFrames:slots.filter(e=>e.frame).length};},
81
+ getFrame(index){
82
+ if(!Number.isInteger(index)||index<0||index>=frameCount)throw Error('Invalid packed frames: frame index');
83
+ const u=map[index];
84
+ if(slots[0].unique===u){hits++;return slots[0].frame;}
85
+ if(slots[1].unique===u){hits++;slots.reverse();return slots[0].frame;}
86
+ const slot=slots.pop();slots.unshift(slot);decodes++;
87
+ const frame=slot.frame??=new Uint8Array(n),k=u*6,x=rects[k],y=rects[k+1],w=rects[k+2],h=rects[k+3],offset=rects[k+4];
88
+ frame.fill(0);slot.unique=u;
89
+ for(let r=0;r<h;r++)frame.set(pixels.subarray(offset+r*w,offset+(r+1)*w),(y+r)*width+x);
90
+ return frame;
91
+ },
92
+ });
93
+ stores.add(store);return store;
94
+ }
95
+
96
+ // Uniform frame access over a legacy concatenated Uint8Array or a packed store.
97
+ export function grayFrameReader(source,width,height,frameCount){
98
+ checkShape(width,height,frameCount);
99
+ const n=width*height,byteLength=n*frameCount;
100
+ const check=index=>{if(!Number.isInteger(index)||index<0||index>=frameCount)throw Error('Invalid gray frames: frame index');};
101
+ if(stores.has(source)){
102
+ if(source.width!==width||source.height!==height||source.frameCount!==frameCount)throw Error('Invalid gray frames: store shape');
103
+ return{width,height,frameCount,byteLength,getFrame(index){check(index);return source.getFrame(index);}};
104
+ }
105
+ if(!(source instanceof Uint8Array))throw Error('Invalid gray frames: source');
106
+ if(source.length!==byteLength)throw Error('Invalid gray frames: byte length');
107
+ return{width,height,frameCount,byteLength,getFrame(index){check(index);return source.subarray(index*n,(index+1)*n);}};
108
+ }
@@ -0,0 +1 @@
1
+ {"version":1,"canonical":320,"ballRadiusPx":17.5,"mouthOffsetPx":25.0,"minScore":0.9,"seed":{"family":"approach","frame":45,"box":[158,108,68,50],"nose":[191.7,143.3]},"method":"cv2 TM_CCOEFF_NORMED multi-scale match of measured eyes+nose seed; mouth = nose + scale*offset (down)","unsupported":"front side-view tween, rear, actions (incl. walk-enter/walk), interactions, behaviors watch/rest","families":{"approach":{"cache":"puppy-paper-approach.bin.gz","sha256":"f5558c57d5a445d396e06c060f9f8d64e6ce0ff5b9b92fa6d77ef9bb2984a2fe","samples":9,"covered":124,"frames":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[224.66,147.5,0.9,0.904],[222.44,147.33,0.9,0.915],[219.17,148.34,0.9,0.934],[215.72,149.59,0.92,0.945],[212.89,150.36,0.92,0.957],[209.34,151.71,0.94,0.966],[206.61,152.52,0.94,0.972],[202.85,153.49,0.94,0.965],[202.85,153.49,0.94,0.965],[198.71,154.18,0.96,0.966],[195.56,154.22,0.96,0.97],[191.82,155.11,0.98,0.967],[188.11,155.2,0.98,0.966],[184.12,154.72,0.96,0.966],[180.5,154.77,0.96,0.968],[177.45,154.9,0.96,0.97],[173.13,154.91,0.96,0.965],[173.13,154.91,0.96,0.965],[175.53,155.91,0.96,0.974],[177.69,157.9,0.98,0.976],[179.97,159.24,0.98,0.983],[182.41,161.16,0.98,0.988],[184.55,162.2,0.98,0.987],[186.96,165.39,1.0,0.991],[189.54,166.0,0.98,0.986],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[190.78,168.33,1.0,0.999],[190.26,168.08,0.98,0.983],[189.46,169.24,1.0,0.994],[188.66,169.45,1.0,0.988],[187.9,169.62,1.0,0.977],[187.07,168.92,0.98,0.971],[186.15,171.37,1.02,0.964],[185.12,171.44,1.02,0.959],[185.12,171.44,1.02,0.959],[183.01,167.4,0.98,0.967],[180.53,166.1,1.0,0.965],[178.7,163.98,0.98,0.962],[176.6,160.9,0.96,0.958],[174.17,158.89,0.96,0.958],[172.42,158.03,0.98,0.948],[170.58,155.84,0.96,0.945],[168.27,154.8,0.98,0.932],[168.27,154.8,0.98,0.932],[168.28,154.25,0.98,0.941],[167.82,153.76,0.98,0.938],[167.36,153.07,0.98,0.941],[167.1,151.76,0.96,0.941],[166.97,152.2,0.98,0.947],[166.89,151.46,0.98,0.944],[166.21,151.32,0.98,0.944],[166.05,150.38,0.98,0.943],[166.05,150.38,0.98,0.943],[168.13,148.79,0.96,0.945],[169.85,149.25,0.98,0.951],[172.04,147.99,0.98,0.948],[174.87,146.91,0.98,0.947],[176.38,147.11,1.0,0.947],[179.35,146.95,1.02,0.941],[181.18,146.19,1.02,0.943],[183.86,145.25,1.02,0.942],[183.86,145.25,1.02,0.942],[182.95,145.34,1.02,0.946],[182.65,145.38,1.02,0.953],[181.7,145.7,1.02,0.948],[181.06,145.96,1.02,0.949],[180.46,145.26,1.0,0.954],[179.53,146.46,1.02,0.949],[179.36,146.51,1.02,0.948],[178.41,146.53,1.02,0.947],[178.41,146.53,1.02,0.947],[180.31,147.47,1.02,0.952],[181.26,147.72,1.02,0.954],[183.14,147.04,0.98,0.957],[184.8,149.17,1.0,0.967],[186.42,150.19,1.0,0.966],[188.41,150.46,1.0,0.966],[189.95,151.41,1.0,0.971],[191.61,152.4,1.0,0.971],[191.61,152.4,1.0,0.971],[189.01,151.48,1.0,0.971],[186.85,151.25,1.0,0.979],[184.64,150.57,1.0,0.975],[182.06,149.13,0.98,0.974],[179.48,149.48,1.0,0.976],[177.17,149.61,1.02,0.976],[175.2,149.27,1.02,0.979],[172.3,148.6,1.02,0.975],[172.3,148.6,1.02,0.975],[175.21,151.35,1.02,0.979],[177.27,153.34,1.02,0.982],[179.97,155.12,1.0,0.983],[181.35,158.65,1.02,0.988],[184.96,160.94,1.0,0.987],[187.54,163.29,1.0,0.996],[189.22,166.33,1.02,0.992],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[189.18,166.28,1.0,0.99],[186.95,164.07,0.98,0.991],[184.75,163.57,1.0,0.987],[182.21,160.91,0.98,0.986],[180.15,158.8,0.96,0.98],[177.73,156.71,0.96,0.974],[175.67,155.87,0.96,0.97],[173.13,154.91,0.96,0.965],[173.13,154.91,0.96,0.965],[176.75,154.83,0.96,0.966],[180.19,154.77,0.96,0.966],[183.7,154.69,0.96,0.966],[187.78,153.74,0.94,0.965],[191.91,155.07,0.98,0.968],[195.35,154.27,0.96,0.969],[199.09,154.17,0.96,0.968],[202.85,153.49,0.94,0.965],[202.85,153.49,0.94,0.965],[206.07,152.72,0.94,0.968],[209.04,152.89,0.96,0.962],[211.97,151.51,0.94,0.959],[215.45,150.92,0.94,0.941],[218.71,149.41,0.92,0.933],[221.75,148.5,0.9,0.92],[224.95,147.58,0.9,0.903],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},"behaviors":{"cache":"puppy-paper-behaviors.bin.gz","sha256":"7918261fb64c57a91739729841fd84c6dd53891196c7fb76ee9c27712ab6ef5d","samples":9,"covered":90,"frames":[[201.21,166.15,0.98,0.959],[200.4,166.14,0.98,0.961],[200.13,166.16,0.98,0.963],[199.21,166.15,0.98,0.964],[198.65,166.13,0.98,0.964],[197.98,166.12,0.98,0.967],[197.08,166.1,0.98,0.966],[196.87,166.13,0.98,0.966],[195.93,166.1,0.98,0.965],[195.93,166.1,0.98,0.965],[196.01,166.1,0.98,0.967],[196.35,166.05,0.98,0.96],[196.85,166.1,0.98,0.966],[197.08,166.07,0.98,0.964],[197.25,166.07,0.98,0.96],[197.72,166.12,0.98,0.963],[198.13,166.05,0.98,0.957],[198.18,166.04,0.98,0.954],[198.18,166.04,0.98,0.954],[198.23,166.06,0.98,0.957],[198.26,166.09,0.98,0.957],[198.28,166.12,0.98,0.958],[198.81,167.29,1.0,0.968],[198.92,167.34,1.0,0.966],[198.98,167.37,1.0,0.964],[199.06,167.41,1.0,0.962],[199.07,167.42,1.0,0.96],[199.07,167.42,1.0,0.96],[199.16,167.39,1.0,0.96],[199.43,167.35,1.0,0.96],[199.96,167.33,1.0,0.965],[200.14,166.34,0.98,0.965],[200.28,166.27,0.98,0.963],[200.84,166.24,0.98,0.965],[201.14,166.17,0.98,0.962],[201.21,166.15,0.98,0.959],[191.7,168.3,1.0,1.0],[192.77,168.21,1.0,0.999],[194.11,167.32,0.98,0.992],[195.54,167.92,1.0,0.986],[196.71,166.87,0.98,0.982],[197.88,167.48,1.0,0.978],[199.08,166.37,0.98,0.973],[200.32,166.2,0.98,0.965],[201.21,166.15,0.98,0.959],[201.21,166.15,0.98,0.959],[201.8,170.56,1.0,0.964],[202.18,172.74,0.98,0.965],[202.46,176.13,0.98,0.966],[203.09,179.85,0.98,0.968],[203.28,183.55,0.98,0.961],[203.98,187.56,1.0,0.963],[204.72,190.66,1.0,0.967],[204.91,194.05,1.0,0.954],[204.91,194.05,1.0,0.954],[203.9,194.08,1.0,0.956],[202.88,194.15,0.98,0.958],[201.8,195.0,1.0,0.958],[200.65,195.45,1.0,0.961],[199.66,196.08,1.0,0.957],[198.46,196.15,1.0,0.953],[197.37,196.24,0.98,0.95],[196.35,196.3,0.98,0.947],[196.35,196.3,0.98,0.947],[192.86,196.11,1.0,0.951],[190.53,196.01,1.0,0.951],[187.51,196.0,1.0,0.949],[184.08,194.32,0.98,0.952],[180.99,193.88,0.98,0.949],[177.81,194.62,1.0,0.949],[175.36,194.61,1.02,0.95],[171.67,193.62,1.0,0.944],[171.67,193.62,1.0,0.944],[174.59,193.5,1.02,0.952],[177.38,192.46,1.02,0.95],[180.43,190.38,1.0,0.957],[183.32,188.01,0.98,0.95],[186.05,187.0,0.98,0.954],[189.53,187.6,1.02,0.95],[192.59,185.84,1.0,0.945],[195.46,183.93,0.98,0.942],[195.46,183.93,0.98,0.942],[195.23,182.08,0.98,0.958],[194.56,180.73,1.0,0.963],[194.34,179.26,1.0,0.974],[193.93,177.12,1.0,0.982],[193.33,175.54,1.02,0.983],[192.7,173.2,1.0,0.996],[192.66,170.55,1.0,0.992],[191.7,168.3,1.0,1.0],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},"seat":{"cache":"puppy-paper-seat.bin.gz","sha256":"613dbeeeaec11804e80db0216922c8f62294745514ee6283bdce61a6d784dd5e","samples":17,"covered":51,"frames":[[191.7,168.3,1.0,1.0],[187.28,167.83,0.98,0.992],[186.01,168.11,0.98,0.997],[184.36,167.85,0.96,0.997],[182.14,168.27,0.96,0.99],[179.4,167.97,0.94,0.989],[177.05,167.47,0.92,0.991],[174.39,167.11,0.9,0.982],[171.52,167.84,0.9,0.977],[169.74,168.03,0.9,0.978],[166.37,168.27,0.9,0.98],[163.95,166.65,0.86,0.975],[161.1,167.16,0.86,0.973],[158.82,167.1,0.86,0.97],[157.06,167.85,0.86,0.97],[155.39,167.09,0.84,0.966],[152.19,167.86,0.84,0.951],[152.19,167.86,0.84,0.951],[152.24,167.87,0.84,0.952],[152.26,167.86,0.84,0.953],[152.26,167.85,0.84,0.953],[152.27,167.85,0.84,0.953],[152.3,167.84,0.84,0.954],[152.33,167.83,0.84,0.954],[152.69,166.08,0.8,0.956],[152.75,166.06,0.8,0.956],[152.77,166.04,0.8,0.957],[153.16,166.03,0.8,0.957],[153.19,166.03,0.8,0.956],[153.21,166.02,0.8,0.955],[153.23,166.02,0.8,0.955],[153.27,166.02,0.8,0.953],[153.37,166.03,0.8,0.952],[153.28,166.02,0.8,0.952],[153.28,166.02,0.8,0.952],[154.28,166.02,0.8,0.954],[154.49,166.87,0.82,0.951],[155.31,165.99,0.8,0.953],[156.08,165.96,0.8,0.956],[156.67,166.83,0.82,0.958],[157.34,166.82,0.82,0.955],[158.31,166.73,0.82,0.956],[158.83,166.62,0.82,0.96],[159.42,166.54,0.82,0.958],[160.23,166.48,0.82,0.952],[160.85,166.5,0.82,0.954],[161.4,166.49,0.82,0.954],[162.04,166.45,0.82,0.947],[162.98,166.47,0.82,0.947],[163.19,166.46,0.82,0.946],[164.02,166.47,0.82,0.945]]},"arrivalSeat":{"cache":"puppy-paper-arrival-seat.bin.gz","sha256":"13acb62fd573ff7ef97bcf59be80757897fe9d1784f187ab278990ff94a643b9","samples":17,"covered":51,"frames":[[195.46,183.93,0.98,0.942],[191.05,182.87,0.98,0.955],[189.92,182.76,0.98,0.95],[187.17,181.29,0.96,0.954],[184.77,179.89,0.94,0.954],[182.36,179.93,0.96,0.955],[179.54,177.85,0.94,0.96],[176.3,176.4,0.92,0.959],[174.08,175.36,0.9,0.966],[171.91,174.25,0.9,0.958],[168.15,172.23,0.88,0.953],[165.17,170.82,0.86,0.963],[162.45,171.28,0.88,0.959],[160.06,170.01,0.86,0.965],[157.6,169.78,0.86,0.959],[155.67,167.31,0.82,0.96],[152.19,167.86,0.84,0.951],[152.19,167.86,0.84,0.951],[152.24,167.87,0.84,0.952],[152.26,167.86,0.84,0.953],[152.26,167.85,0.84,0.953],[152.27,167.85,0.84,0.953],[152.3,167.84,0.84,0.954],[152.33,167.83,0.84,0.954],[152.69,166.08,0.8,0.956],[152.75,166.06,0.8,0.956],[152.77,166.04,0.8,0.957],[153.16,166.03,0.8,0.957],[153.19,166.03,0.8,0.956],[153.21,166.02,0.8,0.955],[153.23,166.02,0.8,0.955],[153.27,166.02,0.8,0.953],[153.37,166.03,0.8,0.952],[153.28,166.02,0.8,0.952],[153.28,166.02,0.8,0.952],[154.28,166.02,0.8,0.954],[154.49,166.87,0.82,0.951],[155.31,165.99,0.8,0.953],[156.08,165.96,0.8,0.956],[156.67,166.83,0.82,0.958],[157.34,166.82,0.82,0.955],[158.31,166.73,0.82,0.956],[158.83,166.62,0.82,0.96],[159.42,166.54,0.82,0.958],[160.23,166.48,0.82,0.952],[160.85,166.5,0.82,0.954],[161.4,166.49,0.82,0.954],[162.04,166.45,0.82,0.947],[162.98,166.47,0.82,0.947],[163.19,166.46,0.82,0.946],[164.02,166.47,0.82,0.945]]}}}
@@ -0,0 +1,33 @@
1
+ import {paperBehaviorPose} from './puppy-paper-behaviors.mjs';
2
+
3
+ // Measured open-mouth centers per exact cached source sample (canonical 320px
4
+ // source space, unflipped). Generated offline by prepare-mouth-anchors.py from
5
+ // the drawn faces; never a root height, bob curve or runtime image analysis.
6
+ // Families/frames missing here (side view, rear, actions, turned heads) are
7
+ // unsupported: callers hide the carried ball rather than float it.
8
+ export const MOUTH_ANCHORS=/*BEGIN GENERATED*/{"version":1,"ballRadiusPx":17.5,"families":{"approach":{"sha256":"f5558c57d5a445d396e06c060f9f8d64e6ce0ff5b9b92fa6d77ef9bb2984a2fe","frames":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[224.66,147.5,0.9,0.904],[222.44,147.33,0.9,0.915],[219.17,148.34,0.9,0.934],[215.72,149.59,0.92,0.945],[212.89,150.36,0.92,0.957],[209.34,151.71,0.94,0.966],[206.61,152.52,0.94,0.972],[202.85,153.49,0.94,0.965],[202.85,153.49,0.94,0.965],[198.71,154.18,0.96,0.966],[195.56,154.22,0.96,0.97],[191.82,155.11,0.98,0.967],[188.11,155.2,0.98,0.966],[184.12,154.72,0.96,0.966],[180.5,154.77,0.96,0.968],[177.45,154.9,0.96,0.97],[173.13,154.91,0.96,0.965],[173.13,154.91,0.96,0.965],[175.53,155.91,0.96,0.974],[177.69,157.9,0.98,0.976],[179.97,159.24,0.98,0.983],[182.41,161.16,0.98,0.988],[184.55,162.2,0.98,0.987],[186.96,165.39,1.0,0.991],[189.54,166.0,0.98,0.986],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[190.78,168.33,1.0,0.999],[190.26,168.08,0.98,0.983],[189.46,169.24,1.0,0.994],[188.66,169.45,1.0,0.988],[187.9,169.62,1.0,0.977],[187.07,168.92,0.98,0.971],[186.15,171.37,1.02,0.964],[185.12,171.44,1.02,0.959],[185.12,171.44,1.02,0.959],[183.01,167.4,0.98,0.967],[180.53,166.1,1.0,0.965],[178.7,163.98,0.98,0.962],[176.6,160.9,0.96,0.958],[174.17,158.89,0.96,0.958],[172.42,158.03,0.98,0.948],[170.58,155.84,0.96,0.945],[168.27,154.8,0.98,0.932],[168.27,154.8,0.98,0.932],[168.28,154.25,0.98,0.941],[167.82,153.76,0.98,0.938],[167.36,153.07,0.98,0.941],[167.1,151.76,0.96,0.941],[166.97,152.2,0.98,0.947],[166.89,151.46,0.98,0.944],[166.21,151.32,0.98,0.944],[166.05,150.38,0.98,0.943],[166.05,150.38,0.98,0.943],[168.13,148.79,0.96,0.945],[169.85,149.25,0.98,0.951],[172.04,147.99,0.98,0.948],[174.87,146.91,0.98,0.947],[176.38,147.11,1.0,0.947],[179.35,146.95,1.02,0.941],[181.18,146.19,1.02,0.943],[183.86,145.25,1.02,0.942],[183.86,145.25,1.02,0.942],[182.95,145.34,1.02,0.946],[182.65,145.38,1.02,0.953],[181.7,145.7,1.02,0.948],[181.06,145.96,1.02,0.949],[180.46,145.26,1.0,0.954],[179.53,146.46,1.02,0.949],[179.36,146.51,1.02,0.948],[178.41,146.53,1.02,0.947],[178.41,146.53,1.02,0.947],[180.31,147.47,1.02,0.952],[181.26,147.72,1.02,0.954],[183.14,147.04,0.98,0.957],[184.8,149.17,1.0,0.967],[186.42,150.19,1.0,0.966],[188.41,150.46,1.0,0.966],[189.95,151.41,1.0,0.971],[191.61,152.4,1.0,0.971],[191.61,152.4,1.0,0.971],[189.01,151.48,1.0,0.971],[186.85,151.25,1.0,0.979],[184.64,150.57,1.0,0.975],[182.06,149.13,0.98,0.974],[179.48,149.48,1.0,0.976],[177.17,149.61,1.02,0.976],[175.2,149.27,1.02,0.979],[172.3,148.6,1.02,0.975],[172.3,148.6,1.02,0.975],[175.21,151.35,1.02,0.979],[177.27,153.34,1.02,0.982],[179.97,155.12,1.0,0.983],[181.35,158.65,1.02,0.988],[184.96,160.94,1.0,0.987],[187.54,163.29,1.0,0.996],[189.22,166.33,1.02,0.992],[191.7,168.3,1.0,1.0],[191.7,168.3,1.0,1.0],[189.18,166.28,1.0,0.99],[186.95,164.07,0.98,0.991],[184.75,163.57,1.0,0.987],[182.21,160.91,0.98,0.986],[180.15,158.8,0.96,0.98],[177.73,156.71,0.96,0.974],[175.67,155.87,0.96,0.97],[173.13,154.91,0.96,0.965],[173.13,154.91,0.96,0.965],[176.75,154.83,0.96,0.966],[180.19,154.77,0.96,0.966],[183.7,154.69,0.96,0.966],[187.78,153.74,0.94,0.965],[191.91,155.07,0.98,0.968],[195.35,154.27,0.96,0.969],[199.09,154.17,0.96,0.968],[202.85,153.49,0.94,0.965],[202.85,153.49,0.94,0.965],[206.07,152.72,0.94,0.968],[209.04,152.89,0.96,0.962],[211.97,151.51,0.94,0.959],[215.45,150.92,0.94,0.941],[218.71,149.41,0.92,0.933],[221.75,148.5,0.9,0.92],[224.95,147.58,0.9,0.903],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},"behaviors":{"sha256":"7918261fb64c57a91739729841fd84c6dd53891196c7fb76ee9c27712ab6ef5d","frames":[[201.21,166.15,0.98,0.959],[200.4,166.14,0.98,0.961],[200.13,166.16,0.98,0.963],[199.21,166.15,0.98,0.964],[198.65,166.13,0.98,0.964],[197.98,166.12,0.98,0.967],[197.08,166.1,0.98,0.966],[196.87,166.13,0.98,0.966],[195.93,166.1,0.98,0.965],[195.93,166.1,0.98,0.965],[196.01,166.1,0.98,0.967],[196.35,166.05,0.98,0.96],[196.85,166.1,0.98,0.966],[197.08,166.07,0.98,0.964],[197.25,166.07,0.98,0.96],[197.72,166.12,0.98,0.963],[198.13,166.05,0.98,0.957],[198.18,166.04,0.98,0.954],[198.18,166.04,0.98,0.954],[198.23,166.06,0.98,0.957],[198.26,166.09,0.98,0.957],[198.28,166.12,0.98,0.958],[198.81,167.29,1.0,0.968],[198.92,167.34,1.0,0.966],[198.98,167.37,1.0,0.964],[199.06,167.41,1.0,0.962],[199.07,167.42,1.0,0.96],[199.07,167.42,1.0,0.96],[199.16,167.39,1.0,0.96],[199.43,167.35,1.0,0.96],[199.96,167.33,1.0,0.965],[200.14,166.34,0.98,0.965],[200.28,166.27,0.98,0.963],[200.84,166.24,0.98,0.965],[201.14,166.17,0.98,0.962],[201.21,166.15,0.98,0.959],[191.7,168.3,1.0,1.0],[192.77,168.21,1.0,0.999],[194.11,167.32,0.98,0.992],[195.54,167.92,1.0,0.986],[196.71,166.87,0.98,0.982],[197.88,167.48,1.0,0.978],[199.08,166.37,0.98,0.973],[200.32,166.2,0.98,0.965],[201.21,166.15,0.98,0.959],[201.21,166.15,0.98,0.959],[201.8,170.56,1.0,0.964],[202.18,172.74,0.98,0.965],[202.46,176.13,0.98,0.966],[203.09,179.85,0.98,0.968],[203.28,183.55,0.98,0.961],[203.98,187.56,1.0,0.963],[204.72,190.66,1.0,0.967],[204.91,194.05,1.0,0.954],[204.91,194.05,1.0,0.954],[203.9,194.08,1.0,0.956],[202.88,194.15,0.98,0.958],[201.8,195.0,1.0,0.958],[200.65,195.45,1.0,0.961],[199.66,196.08,1.0,0.957],[198.46,196.15,1.0,0.953],[197.37,196.24,0.98,0.95],[196.35,196.3,0.98,0.947],[196.35,196.3,0.98,0.947],[192.86,196.11,1.0,0.951],[190.53,196.01,1.0,0.951],[187.51,196.0,1.0,0.949],[184.08,194.32,0.98,0.952],[180.99,193.88,0.98,0.949],[177.81,194.62,1.0,0.949],[175.36,194.61,1.02,0.95],[171.67,193.62,1.0,0.944],[171.67,193.62,1.0,0.944],[174.59,193.5,1.02,0.952],[177.38,192.46,1.02,0.95],[180.43,190.38,1.0,0.957],[183.32,188.01,0.98,0.95],[186.05,187.0,0.98,0.954],[189.53,187.6,1.02,0.95],[192.59,185.84,1.0,0.945],[195.46,183.93,0.98,0.942],[195.46,183.93,0.98,0.942],[195.23,182.08,0.98,0.958],[194.56,180.73,1.0,0.963],[194.34,179.26,1.0,0.974],[193.93,177.12,1.0,0.982],[193.33,175.54,1.02,0.983],[192.7,173.2,1.0,0.996],[192.66,170.55,1.0,0.992],[191.7,168.3,1.0,1.0],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},"seat":{"sha256":"613dbeeeaec11804e80db0216922c8f62294745514ee6283bdce61a6d784dd5e","frames":[[191.7,168.3,1.0,1.0],[187.28,167.83,0.98,0.992],[186.01,168.11,0.98,0.997],[184.36,167.85,0.96,0.997],[182.14,168.27,0.96,0.99],[179.4,167.97,0.94,0.989],[177.05,167.47,0.92,0.991],[174.39,167.11,0.9,0.982],[171.52,167.84,0.9,0.977],[169.74,168.03,0.9,0.978],[166.37,168.27,0.9,0.98],[163.95,166.65,0.86,0.975],[161.1,167.16,0.86,0.973],[158.82,167.1,0.86,0.97],[157.06,167.85,0.86,0.97],[155.39,167.09,0.84,0.966],[152.19,167.86,0.84,0.951],[152.19,167.86,0.84,0.951],[152.24,167.87,0.84,0.952],[152.26,167.86,0.84,0.953],[152.26,167.85,0.84,0.953],[152.27,167.85,0.84,0.953],[152.3,167.84,0.84,0.954],[152.33,167.83,0.84,0.954],[152.69,166.08,0.8,0.956],[152.75,166.06,0.8,0.956],[152.77,166.04,0.8,0.957],[153.16,166.03,0.8,0.957],[153.19,166.03,0.8,0.956],[153.21,166.02,0.8,0.955],[153.23,166.02,0.8,0.955],[153.27,166.02,0.8,0.953],[153.37,166.03,0.8,0.952],[153.28,166.02,0.8,0.952],[153.28,166.02,0.8,0.952],[154.28,166.02,0.8,0.954],[154.49,166.87,0.82,0.951],[155.31,165.99,0.8,0.953],[156.08,165.96,0.8,0.956],[156.67,166.83,0.82,0.958],[157.34,166.82,0.82,0.955],[158.31,166.73,0.82,0.956],[158.83,166.62,0.82,0.96],[159.42,166.54,0.82,0.958],[160.23,166.48,0.82,0.952],[160.85,166.5,0.82,0.954],[161.4,166.49,0.82,0.954],[162.04,166.45,0.82,0.947],[162.98,166.47,0.82,0.947],[163.19,166.46,0.82,0.946],[164.02,166.47,0.82,0.945]]},"arrivalSeat":{"sha256":"13acb62fd573ff7ef97bcf59be80757897fe9d1784f187ab278990ff94a643b9","frames":[[195.46,183.93,0.98,0.942],[191.05,182.87,0.98,0.955],[189.92,182.76,0.98,0.95],[187.17,181.29,0.96,0.954],[184.77,179.89,0.94,0.954],[182.36,179.93,0.96,0.955],[179.54,177.85,0.94,0.96],[176.3,176.4,0.92,0.959],[174.08,175.36,0.9,0.966],[171.91,174.25,0.9,0.958],[168.15,172.23,0.88,0.953],[165.17,170.82,0.86,0.963],[162.45,171.28,0.88,0.959],[160.06,170.01,0.86,0.965],[157.6,169.78,0.86,0.959],[155.67,167.31,0.82,0.96],[152.19,167.86,0.84,0.951],[152.19,167.86,0.84,0.951],[152.24,167.87,0.84,0.952],[152.26,167.86,0.84,0.953],[152.26,167.85,0.84,0.953],[152.27,167.85,0.84,0.953],[152.3,167.84,0.84,0.954],[152.33,167.83,0.84,0.954],[152.69,166.08,0.8,0.956],[152.75,166.06,0.8,0.956],[152.77,166.04,0.8,0.957],[153.16,166.03,0.8,0.957],[153.19,166.03,0.8,0.956],[153.21,166.02,0.8,0.955],[153.23,166.02,0.8,0.955],[153.27,166.02,0.8,0.953],[153.37,166.03,0.8,0.952],[153.28,166.02,0.8,0.952],[153.28,166.02,0.8,0.952],[154.28,166.02,0.8,0.954],[154.49,166.87,0.82,0.951],[155.31,165.99,0.8,0.953],[156.08,165.96,0.8,0.956],[156.67,166.83,0.82,0.958],[157.34,166.82,0.82,0.955],[158.31,166.73,0.82,0.956],[158.83,166.62,0.82,0.96],[159.42,166.54,0.82,0.958],[160.23,166.48,0.82,0.952],[160.85,166.5,0.82,0.954],[161.4,166.49,0.82,0.954],[162.04,166.45,0.82,0.947],[162.98,166.47,0.82,0.947],[163.19,166.46,0.82,0.946],[164.02,166.47,0.82,0.945]]}}}/*END GENERATED*/;
9
+
10
+ // Exact sample the renderer's samplers read for this state (same quantization).
11
+ export function mouthSourceFrame(family,state,info){
12
+ if(family==='approach')return state.approachPair*9+Math.round(state.blend*8);
13
+ if(family==='behaviors'){const p=paperBehaviorPose(state,info);return p.pair*9+Math.round(p.blend*8);}
14
+ if(family==='seat'||family==='arrivalSeat'){const q=state.seatProgress*3,pair=Math.min(2,Math.floor(q));return pair*17+Math.round((q-pair)*16);}
15
+ return null;
16
+ }
17
+
18
+ // Mouth in canonical source px, or null when the cache differs or the sample is unmeasured.
19
+ export function mouthAnchor(family,frame,sha256){
20
+ const f=MOUTH_ANCHORS.families[family];
21
+ if(!f||!Number.isInteger(frame)||(sha256&&f.sha256!==sha256))return null;
22
+ const a=f.frames[frame];
23
+ return a?{x:a[0],y:a[1],scale:a[2],score:a[3]}:null;
24
+ }
25
+
26
+ // Same placement and mirroring as the renderer: pixel center px=(dx+.5-left)/sideX*320,
27
+ // flipped source column sourceN-1-floor(raw) == continuous sourceN-raw.
28
+ export function projectMouth(anchor,{left,top,side,sideX},flip=false,{family=null,frame=null}={}){
29
+ if(!anchor)return null;
30
+ const sx=flip?320-anchor.x:anchor.x,r=MOUTH_ANCHORS.ballRadiusPx;
31
+ const m={x:left+sx/320*sideX,y:top+anchor.y/320*side,rx:r/320*sideX,ry:r/320*side,family,frame,flip:!!flip,scale:anchor.scale,score:anchor.score};
32
+ return [m.x,m.y,m.rx,m.ry].every(Number.isFinite)&&m.rx>0&&m.ry>0?m:null;
33
+ }
Binary file
@@ -0,0 +1 @@
1
+ {"version":1,"width":480,"height":480,"pairs":66,"samples":9,"bytes":136857600,"sha256":"1e0db7138d087292a3e70c246a1d56af590b3fb50928687a026e7080d7657c38","manualTricks":true,"manualDown":true,"downEndpoint":{"key":"bridge2","sha256":"5acfdc05ef0e6892b8549bf7ea354a26b813380448ba227a823dc577ecf6d08c","shared":"lie-down last sample == lie-up first sample == roll-down first sample"},"runtimeDurations":{"spin":2.8,"roll":4.6,"roll-down":4.6,"lie-down":0.65,"lie-up":0.55},"sourceHashes":{"puppy-spin16-v4-sheet.png":"51d5c80a7076879415a98b667d9aad6f712a48f1f3765297534fad1603be3ae1","puppy-roll16-v4-sheet.png":"b5666734ad0f129b0a8329093398084e18f88fd90370d2a8334dfdae20ef1c34","puppy-trick-bridge8-v4-sheet.png":"6099551fda8b9f327eed2c29157ecb5c730b5208ae647b70729c7f5871fdb724","puppy-roll-opposite6-v5-sheet.png":"b2864da19202c09e7493763fa26fcdbbd00c69ed4e59e2436f476d7db0f067e3","puppy-paper-rear.bin.gz":"19c86a6c8cf0114cdf22f766c55c568573d5345e0b754eac438803407ee078bc","puppy-paper-seat.bin.gz":"a863225bef502fa3d60fe97c85007a9e85b818d53e5c3b5490fddd80b0c100d9","puppy-paper-behaviors.bin.gz":"d8aa7d373514a66bfa39168ed1087a0a95e83caab5f2879cc7287b2911741ad1","worker-staging/actions-art-v5/prepare_v5.py":"47b10a4725641e35bec87cce34bb70a28bef862d7c997fc313db521054752b19","worker-staging/actions-art-v5/extract_patch_v5.py":"2077b173fc60b5a6e9447960a11cdc31e700d5c55b20b954ea24f349956094b7","worker-staging/actions-art-v5/registered_actions_v4.py":"1050fe1c8b4da4126a3c8755e4526947e0728724b330ed9e1db0f9e9be5f6a66","worker-staging/actions-art-v5/landmark_tools.py":"90b6d55363968ca008194b0d350aaf2d787a85a358cc17224f2d0b1cc7f93fde","worker-staging/actions-art-v5/extract_panels.py":"f87d95bb995392eaf33117a47a9bb8993e3d1b6e457cb534e70f63fa98b8e902","worker-staging/actions-art-v5/annotations.json":"4310d07b33a612e3d1ccb2d589be511c8248172b718d96b0ab97c9c71f70f201","worker-staging/actions-art-v5/panels.json":"170163acdbf58fa4ba6a8b0b103715db5082c52e252e818f7760a0aae90c2c06","worker-staging/actions-art-v5/annotations-v5-patch.json":"04b402439871a20e8e62a0038a680d816e40fef780aba341dd89fdaa076ab012","worker-staging/actions-art-v5/panels-v5-patch.json":"793361fe8c06c1757616a9c3213757ae70f1ffb841e6cddc33a338dad491c677","worker-staging/actions-art-v5/manifest-v5.json":"ff994df86033422152355e82af3e62e0a1c61b0cbe39b1cc15dff77982283890","worker-staging/actions-art-v5/masks/spin0.png":"5522056a2fcb607e706cda6caf4e876be69f1a208086544dcb128601eaa24aca","worker-staging/actions-art-v5/masks/spin1.png":"52d516707f7a8be6e84428a99e6a69a4b12860036b4485f3e576d498ddd7e5c2","worker-staging/actions-art-v5/masks/spin2.png":"f1d0b50365e37cbd76759f570c089f2b1186a810292ba7b7349e2ae95381aa9e","worker-staging/actions-art-v5/masks/spin3.png":"b57c99486fc56bdf0ed5e280327f1ba22517650adce59d805b55162588d97427","worker-staging/actions-art-v5/masks/spin4.png":"d2823684d12d006ceecf99a29c72adb7975361215661543c96e24ef5b7dacdf8","worker-staging/actions-art-v5/masks/spin5.png":"113897d95097d282623fa28767d918599db0bdd02de7885fda2d7014d2b0356f","worker-staging/actions-art-v5/masks/spin6.png":"e665f2890f0b090741889d72a5678119afa07c1fe04b97e091b98a76408a4b5f","worker-staging/actions-art-v5/masks/spin7.png":"8c842c1ea4bdb9ea3af7afd77e1537746308ad459a34f9599ab546a68cad1eea","worker-staging/actions-art-v5/masks/spin8.png":"8b0e42cf895b320f86adae8afbe815182973e1618f87c7b67829068cf1b5131a","worker-staging/actions-art-v5/masks/spin9.png":"40f9f25edee03f7c437573a0385bf129379a184669a89a65ae0088861be2aac1","worker-staging/actions-art-v5/masks/spin10.png":"70213c302da68f339a951cceceb34203fbcd4087db3009af6df39307f117620d","worker-staging/actions-art-v5/masks/spin11.png":"d11b2a92a44c00edc6915849935d1192d04a547325a3332a29b2ab150bc7e509","worker-staging/actions-art-v5/masks/spin12.png":"66de04066c34984943befbd2883a84636c6dacad4a868de22901d594a23246ca","worker-staging/actions-art-v5/masks/spin13.png":"0e43e18aea6ac0d4288e5d71b21a211b926dc347ed9c5ceade703f150801868d","worker-staging/actions-art-v5/masks/spin14.png":"83cf89eb00eac85b45c45cc22060d48fd8d2b205e22c490bb1c4a2389e65fc73","worker-staging/actions-art-v5/masks/spin15.png":"42b5ee481bc836b8385128cd8a07d6a21a52468ee3d3b180fdb9ad88bcb4cd30","worker-staging/actions-art-v5/masks/bridge0.png":"593308d8517d9107b0aefbd0fc6e5a5c3ecc48a1edb8d1acc7a6bcdae4f1c055","worker-staging/actions-art-v5/masks/bridge1.png":"9da5bfd5c6fc700a5ef20856ec06c56df187e41e243bfd7e813b51161fbdbb35","worker-staging/actions-art-v5/masks/bridge2.png":"202e74e416d971a306bb0270f21d57d68ac69864f6fae5fd377e0ca185e3586a","worker-staging/actions-art-v5/masks/bridge5.png":"543b18dcb800b37dce7834605e75a8f8eb7dbf4c519db43173f791028d0fafe2","worker-staging/actions-art-v5/masks/bridge6.png":"2334670cd8cd2251a6ab6aef886ac89cab780374262ef7d1da69ec19eb5d98d2","worker-staging/actions-art-v5/masks/bridge7.png":"5639d2ff7f654e1aa9cdbc85da77dfd8c03156852b1050a190a9d6e8c23e8bda","worker-staging/actions-art-v5/masks/roll0.png":"a5c508f0305b05ed4922c51a7d88a66526e665cb85eb848c319708d788d20d22","worker-staging/actions-art-v5/masks/roll1.png":"0a321cbd1d60b29adc11c23c08a5559d0a0158c1fb60cd69a7e61e3f19082ddd","worker-staging/actions-art-v5/masks/roll2.png":"972952a7f6d4a8d8dab4cabd83ce355874b4ec869a5f750ae20e2fe91b5b2cbb","worker-staging/actions-art-v5/masks/roll3.png":"dc598562e3a693e04b8723ab9c3f0fd8c98c9bd2f73a329d77c95eb6ce48c56e","worker-staging/actions-art-v5/masks/roll4.png":"07d5580ce57dd4d122bfcd7e3a044bdbd5c865543001ddacda871c3107524484","worker-staging/actions-art-v5/masks/roll5.png":"c2d0f814b11b4834bc24e832bc588ab4230fd34cb22051da2b74b88d560eb438","worker-staging/actions-art-v5/masks/roll6.png":"b03c37c7ee1828c0d32080c0f8c9ac2e91332c4bbe659f612585da54a0aa13e7","worker-staging/actions-art-v5/masks/roll7.png":"0814ea966379aa842cf0a5f60bc3bde08f842742f488c1bdfda0a966cf2230b0","worker-staging/actions-art-v5/masks/roll8.png":"a6c02566d6fdea228eda5d02be82f95a8ee44c907448caefe562e62fe02a6868","worker-staging/actions-art-v5/masks/patch0.png":"b34ef9eaa2120c92ea3802db4bc86bc28d8fb2d1d10c8d69cf753e80f1281cb7","worker-staging/actions-art-v5/masks/patch1.png":"a7be3dab012c466d16f355d0896a50f36d2fc4bef102b48a3fda07ff86708d9c","worker-staging/actions-art-v5/masks/patch2.png":"ec4a99b6d908362fdec352b748338cf4a72064576229f446ad8359b7530b0cae","worker-staging/actions-art-v5/masks/patch3.png":"ce500e997695acc4e22e797a37f8cdefd95a3f091ab7bd7fecf998dfa0af2079","worker-staging/actions-art-v5/masks/patch4.png":"caca1174ce6e4b19056e90f5c10b909f4d52c5db1158433891fccc961ca62d10","worker-staging/actions-art-v5/masks/patch5.png":"6ad70f7f1c480bc77f9118095612500c99b1e4cfeaf0a5068ed0d6864c4cd247","puppy-paper-actions-v5.bin.gz":"4c5d42284ecc3196822d7e605a65f7b45c35f0a42649d70843b2dd2bcf34d473","puppy-paper-actions-v5.json":"0bda84f57c37ed6232d2fbbc6095e9656b0474269192f1a90d7cb0c008db8281","worker-staging/actions-art-v5/rife-work-v5/key-spin0.png":"e10feb6d1a97f1166b5dc2469652182f2da95f3d10843a4f5342204ee5ea62c6","references/zoomies30/paper-actions-v3/key-16.png":"f8194fcfeb2bf4d44b28c5e6d0bbee4b144ef5c81bcc2d22d5906e2c951b37a6","prepare-paper-actions-v6.py":"c075f0b528d729e20524e36eebbc894aa90b9b5b558eb7ac856a2b603f163ecb","puppy-paper-actions-v6.bin.gz":"260ae6493532d16f9613c48aa78efc2599dc39e31698401fd0e00764a725c1e5","puppy-paper-actions-v6.json":"801868a226f02b0b473ea56cba74666d367387ea6690347ec059d96e58c0d7e8","worker-staging/actions-art-v7/prepare_v7.py":"9368e11ad38d6d7b534380de1004c1ffb4af374665030600057dec8ffc26f297","worker-staging/actions-art-v5/rife-work-v5/key-spin11.png":"a216230475f1303fa7a77816b9a46b680339d3b9c5bd495efe0438a52bfdf252","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-1.png":"1baba3fda8693119d877c23b475f32117efcef4dd9af40d72c6a53a56b49589a","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-2.png":"9bd1b5ace4c4f411feafaa04b972ab4c36f2228f0886361eef8fa399bf17386e","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-3.png":"0ba7a7d9555211f8479d21af8bfc07c2e7c05c518a6f0513eecfff7fc125b00c","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-4.png":"0162fb7cbce4d7bbb33b4726ca880260747ca9fd5d5b97c54df21df87d8263e9","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-5.png":"4e89d1760d8163a11ad1256408ef82ebdb143e35a2e721ad1130ce7df0135ec0","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-6.png":"45a4f8211be7f70a40914ec0e42bb5629d33f91eb89f2a94fe4fdc6ed37a45af","worker-staging/actions-art-v4/rife-work-v4/spin11-spin12-7.png":"0bd544f26a091c194d36cd40866397a0706efc128057ef43834dfc1eebd9cdf0","worker-staging/actions-art-v5/rife-work-v5/key-spin12.png":"15982b3366b9cd599f16ae41a61488cc4ab81e5c01aa542168a2dac8c1ea5604","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-1.png":"34c3893bebac5324877c261701075ce029613876930c305d31be35deb8a7f13b","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-2.png":"9f89d6a52eec593a4a1f4e199abfe9bba6d68800ceea8cb250c3e8a0691b1d67","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-3.png":"2be6db8017b91986a16d6fc7cf8548690f0fcc218a4a44a6f65e3bf7c4b0aa6b","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-4.png":"c58b582274ca3630363daeec0a183de69aeebeea002d1f8e0a689596554fd8f1","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-5.png":"b563cb64da8ea31deb9e9bf7b4edfd33d98212440d93beb1d077731c00e2837d","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-6.png":"587ebac36c7c900f3586281da83db4033bb56ebe2e55dba5b1a76c3aa43ed924","worker-staging/actions-art-v4/rife-work-v4/spin12-spin13-7.png":"d3c3656185159f1694de8c3bd389b73275257b86e261e30acea3a7e33d132ec3","worker-staging/actions-art-v5/rife-work-v5/key-spin13.png":"6179a6dc6ce3f0775abe3e3e7db19bb4b56aeb684d787d540df53b6657002e95","worker-staging/actions-art-v5/rife-work-v5/key-patch0.png":"796778a1f1533c46238801679b2c48efac0e777488952397fdcae51d0f2fe5b4","worker-staging/actions-art-v5/rife-work-v5/key-patch1.png":"5ed5e3a0aa4f7ea69aaabc1d5f4b89c6ab1c8a3b5c963e352f4e79e7490be1ae","worker-staging/actions-art-v5/rife-work-v5/key-patch4.png":"19fbd3d5439ff2689e858470c26f0ee28815ce1fa08d00cb05ee86712803341c","worker-staging/actions-art-v5/rife-work-v5/key-patch5.png":"3b4bcf1d0be1f796200be260e64e70edb616677423844ae14fd8f6667c6a27e5","puppy-paper-approach.bin.gz":"21f4015cf899f6b1b6602a8939bbe0eaa76c66cb466c6aabd77249d215ce8d7f","puppy-paper-rear-gallop.bin.gz":"d16b69bd1679f5d9987f7996049a1948ade71b6476f0dd2e82b8b2c387caed2d","puppy-stride-meta.json":"21725d593d9a38ea59f68e359ef85c1d1569990155bf74a0ee7c1c111fb4f9c8","puppy-stride-tweens.bin.gz":"b335328e12245adfa5ccae591224442f6eca72d449e9b6cc6fe87bb5e67ff9f1","prepare-paper-actions-v8.py":"5bc7b4d9bbd754257046cf00faab79d8ef578fb509c177216d28906b9c36e01b","worker-staging/actions-art-v7/out-v7/puppy-paper-actions-v7.bin.gz":"f262ae08b33ade6332d68009fa0fefadc60130f37edb67edf75dfe5f53260e9d","worker-staging/actions-art-v7/out-v7/puppy-paper-actions-v7.json":"503c3b520b2d57282d81bacbdcb62a54a299462f40bbc0bffb232137df74a6f7","puppy-walk-same-view9-v9-sheet.png":"4149882789fdd7894381fe7277bb6ef6a35e10bda0acbb86089f79da5e31ff1b","references/action-audit-v7/neutral.png":"4b1d21973a0ed0c67fcdb93cc9bbe6567236cdafc5f328d2d6a6e27bb3b4245d","puppy-paper-actions-v8.bin.gz":"dab2b3b495d84f13d867a7f95884e6aa6d62af2e858a716893d406edb90e9709","puppy-paper-actions-v8.json":"87fc24c072d1110a3e395d8bc5072eba2c6126506ac4b736687b087dbf9b116b","prepare-paper-walk-v9-skull.py":"2b33bf190be2729f69b25c7a170b5bd0dcfcffb1db8d5c804bcf9896c90858bf","worker-staging/actions-walk-v9/out-v9/puppy-paper-actions-v9.bin.gz":"75684106d86342822638698e3fe360cca5a5eb4e3dc27f1dbb129c6b919073ca","worker-staging/actions-walk-v9/out-v9/puppy-paper-actions-v9.json":"2f225eaeb4e83b8436275ec800969ecc6e2c2ed30e95ffa5099d8db5dc80d819","worker-staging/actions-walk-v9/walk_v9_art.py":"5b6562e7179d2c1b573066f151419d545b842a895e5f37188c5a5eab3b8ee517"},"keyOrder":["spin0","spin1","spin2","spin3","spin4","spin5","spin6","spin7","spin8","spin9","spin10","spin11","spin12","spin13","spin14","spin15","bridge0","bridge1","bridge2","bridge5","bridge6","bridge7","roll0","roll1","roll2","roll3","roll4","roll5","roll6","roll7","roll8","patch0","patch1","patch2","patch3","patch4","patch5","key24","key25","key26","standing","walk-v9-1","walk-v9-2","walk-v9-3","walk-v9-4","walk-v9-5","walk-v9-6","walk-v9-7","walk-v9-8","walk-neutral","walk-face-front-start","walk-face-rear-start","walk-turn-0","walk-turn-1","walk-turn-2","walk-turn-3","walk-turn-4","walk-turn-5","walk-turn-6","walk-turn-7","walk-turn-8","walk-turn-9","walk-turn-10","walk-turn-11","walk-turn-12","walk-turn-13"],"registration":[{"key":"spin0","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,107.22071530025849],[0.0,0.860784254959076,209.8411928664178]],"source":"spin"},{"key":"spin1","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-166.99071695950474],[0.0,0.860784254959076,210.70197712137687]],"source":"spin"},{"key":"spin2","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-440.6598551386438],[0.0,0.860784254959076,205.53727159162244]],"source":"spin"},{"key":"spin3","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-712.9689541949474],[0.0,0.860784254959076,203.81570308170427]],"source":"spin"},{"key":"spin4","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,116.6893421048083],[0.0,0.860784254959076,-57.00192617089573]],"source":"spin"},{"key":"spin5","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-157.84918817183936],[0.0,0.860784254959076,-57.00192617089573]],"source":"spin"},{"key":"spin6","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-426.353620821224],[0.0,0.860784254959076,-52.69800489610037]],"source":"spin"},{"key":"spin7","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-701.7529353528307],[0.0,0.860784254959076,-50.11565213122316]],"source":"spin"},{"key":"spin8","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,95.79810823695155],[0.0,0.860784254959076,-302.3254388342324]],"source":"spin"},{"key":"spin9","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-172.5341675614412],[0.0,0.860784254959076,-301.4646545792733]],"source":"spin"},{"key":"spin10","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-443.4574039672608],[0.0,0.860784254959076,-304.9077915991096]],"source":"spin"},{"key":"spin11","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-728.8332080138432],[0.0,0.860784254959076,-310.07249712886403]],"source":"spin"},{"key":"spin12","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,108.07289171266794],[0.0,0.860784254959076,-565.7254208517096]],"source":"spin"},{"key":"spin13","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-130.30409201314896],[0.0,0.860784254959076,-564.8646365967505]],"source":"spin"},{"key":"spin14","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-421.59348389130025],[0.0,0.860784254959076,-562.2822838318733]],"source":"spin"},{"key":"spin15","scale":0.860784254959076,"matrix":[[0.860784254959076,0.0,-683.3063287690578],[0.0,0.860784254959076,-559.6999310669961]],"source":"spin"},{"key":"bridge0","scale":0.6367438487220192,"matrix":[[0.6367438487220192,0.0,135.18059143563013],[0.0,0.6367438487220192,63.496483825734344]],"source":"bridge"},{"key":"bridge1","scale":0.6367438487220192,"matrix":[[0.6367438487220192,0.0,-50.277421943145185],[0.0,0.6367438487220192,59.676020733402254]],"source":"bridge"},{"key":"bridge2","scale":0.6367438487220192,"matrix":[[0.6367438487220192,0.0,-221.79074503490827],[0.0,0.6367438487220192,67.9536907667885]],"source":"bridge"},{"key":"bridge5","scale":0.6367438487220192,"matrix":[[0.6367438487220192,0.0,-71.21992712761235],[0.0,0.6367438487220192,-184.19687332713113]],"source":"bridge"},{"key":"bridge6","scale":0.6367438487220192,"matrix":[[0.6367438487220192,0.0,-261.3007008481095],[0.0,0.6367438487220192,-186.1071048732972]],"source":"bridge"},{"key":"bridge7","scale":0.6367438487220192,"matrix":[[0.6367438487220192,0.0,-465.88649944249426],[0.0,0.6367438487220192,-187.38059257074121]],"source":"bridge"},{"key":"roll0","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,108.14057358456897],[0.0,0.7350469007786855,248.59714918664017]],"source":"roll"},{"key":"roll1","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,-114.37282421915475],[0.0,0.7350469007786855,248.59714918664017]],"source":"roll"},{"key":"roll2","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,-356.0121423811398],[0.0,0.7350469007786855,244.92191468274675]],"source":"roll"},{"key":"roll3","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,-582.2742793788348],[0.0,0.7350469007786855,245.65696158352543]],"source":"roll"},{"key":"roll4","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,104.05371281623948],[0.0,0.7350469007786855,25.877938250698435]],"source":"roll"},{"key":"roll5","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,-128.3607667409731],[0.0,0.7350469007786855,17.79242234213291]],"source":"roll"},{"key":"roll6","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,-347.3900422350058],[0.0,0.7350469007786855,24.407844449141066]],"source":"roll"},{"key":"roll7","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,-584.3177097629996],[0.0,0.7350469007786855,22.937750647583698]],"source":"roll"},{"key":"roll8","scale":0.7350469007786855,"matrix":[[0.7350469007786855,0.0,99.68018375660628],[0.0,0.7350469007786855,-196.10622578446453]],"source":"roll"},{"key":"patch0","scale":0.5188272680052457,"matrix":[[0.5188272680052457,0.0,91.49977928920782],[0.0,0.5188272680052457,207.188838573545]],"source":"patch"},{"key":"patch1","scale":0.5188272680052457,"matrix":[[0.5188272680052457,0.0,-171.4937628626512],[0.0,0.5188272680052457,204.59470223351877]],"source":"patch"},{"key":"patch2","scale":0.5188272680052457,"matrix":[[0.5188272680052457,0.0,-425.7606303666621],[0.0,0.5188272680052457,203.5570476975083]],"source":"patch"},{"key":"patch3","scale":0.5188272680052457,"matrix":[[0.5188272680052457,0.0,96.8852063311023],[0.0,0.5188272680052457,-3.4550322365847705]],"source":"patch"},{"key":"patch4","scale":0.5188272680052457,"matrix":[[0.5188272680052457,0.0,-161.13797059326654],[0.0,0.5188272680052457,-15.388059400705401]],"source":"patch"},{"key":"patch5","scale":0.5188272680052457,"matrix":[[0.5188272680052457,0.0,-432.572832395571],[0.0,0.5188272680052457,-15.906886668710627]],"source":"patch"},{"key":"key24","scale":1.0,"matrix":[[1.0,0.0,80.0],[0.0,1.0,150.0]],"source":null},{"key":"key25","scale":1.0,"matrix":[[1.0,0.0,80.0],[0.0,1.0,150.0]],"source":null},{"key":"key26","scale":1.0,"matrix":[[1.0,0.0,80.0],[0.0,1.0,150.0]],"source":null},{"key":"standing","scale":1.0,"matrix":[[1.0,0.0,80.0],[0.0,1.0,150.0]],"source":null}],"edges":[[37,0],[0,1],[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9,10],[10,11],[11,12],[12,13],[13,14],[14,15],[15,37],[38,17],[17,18],[18,19],[19,20],[20,22],[22,23],[23,24],[24,25],[25,26],[26,27],[27,28],[28,29],[29,30],[30,31],[31,32],[32,33],[33,34],[34,35],[35,36],[36,20],[20,19],[19,18],[18,17],[17,38],[49,41],[41,42],[42,43],[43,44],[44,45],[45,46],[46,47],[47,48],[48,41],[41,49],[50,49],[51,49],[52,53],[53,54],[54,55],[55,56],[56,57],[57,58],[58,59],[59,60],[60,61],[61,62],[62,63],[63,64],[64,65]],"clips":{"spin":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"roll":[17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"roll-down":[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"lie-down":[17,18],"lie-up":[39,40],"walk-enter":[41],"walk":[42,43,44,45,46,47,48,49],"walk-exit":[50],"walk-face-front":[51],"walk-face-rear":[52],"walk-turn":[53,54,55,56,57,58,59,60,61,62,63,64,65]},"weights":{"spin":[1.1168,0.8052,0.827,0.7936,1.3421,1.4204,0.9015,0.5275,1.1081,0.7701,0.723,1.0494,1.4422,1.3325,1.0787,0.8964,0.8655],"roll":[1.122,1.4089,1.6479,0.6752,0.753,0.8756,0.9957,0.9586,0.7325,0.8218,1.0968,0.9962,0.8959,0.6589,1.0191,0.8352,0.4557,1.1818,1.1101,0.905,0.6752,1.6479,1.4089,1.122],"roll-down":[1.6886,0.6919,0.7717,0.8973,1.0203,0.9823,0.7506,0.8422,1.124,1.0208,0.918,0.6752,1.0443,0.8559,0.467,1.211,1.1376,0.9274,0.6919,1.6886,1.4438,1.1498],"lie-down":[0.8866,1.1134],"lie-up":[1.1134,0.8866]},"feet":[[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[{"id":"hind-far","x":154,"y":282,"stance":true},{"id":"hind-near","x":100,"y":289,"stance":true},{"id":"fore-far","x":250,"y":298,"stance":false},{"id":"fore-near","x":221,"y":296,"stance":false}],[{"id":"hind-far","x":156,"y":282,"stance":true},{"id":"hind-near","x":99,"y":289,"stance":true},{"id":"fore-far","x":264,"y":298,"stance":false},{"id":"fore-near","x":236,"y":297,"stance":false}],[{"id":"hind-far","x":156,"y":281,"stance":true},{"id":"hind-near","x":98,"y":289,"stance":true},{"id":"fore-far","x":269,"y":297,"stance":false},{"id":"fore-near","x":240,"y":298,"stance":false}],[{"id":"hind-far","x":157,"y":281,"stance":true},{"id":"hind-near","x":97,"y":288,"stance":true},{"id":"fore-far","x":272,"y":297,"stance":true},{"id":"fore-near","x":238,"y":299,"stance":true}],[{"id":"hind-far","x":158,"y":281,"stance":true},{"id":"hind-near","x":94,"y":288,"stance":true},{"id":"fore-far","x":275,"y":296,"stance":true},{"id":"fore-near","x":239,"y":300,"stance":true}],[{"id":"hind-far","x":159,"y":280,"stance":true},{"id":"hind-near","x":94,"y":288,"stance":true},{"id":"fore-far","x":275,"y":295,"stance":true},{"id":"fore-near","x":240,"y":300,"stance":true}],[{"id":"hind-far","x":160,"y":280,"stance":true},{"id":"hind-near","x":94,"y":287,"stance":true},{"id":"fore-far","x":277,"y":294,"stance":false},{"id":"fore-near","x":242,"y":300,"stance":true}],[{"id":"hind-far","x":161,"y":279,"stance":true},{"id":"hind-near","x":92,"y":287,"stance":true},{"id":"fore-far","x":280,"y":294,"stance":false},{"id":"fore-near","x":242,"y":300,"stance":true}],[{"id":"hind-far","x":162,"y":279,"stance":true},{"id":"hind-near","x":92,"y":287,"stance":true},{"id":"fore-far","x":280,"y":293,"stance":false},{"id":"fore-near","x":242,"y":300,"stance":true}]],[[{"id":"hind-far","x":162,"y":279,"stance":true},{"id":"hind-near","x":92,"y":287,"stance":true},{"id":"fore-far","x":280,"y":293,"stance":false},{"id":"fore-near","x":242,"y":300,"stance":true}],[{"id":"hind-far","x":160,"y":279,"stance":true},{"id":"hind-near","x":90,"y":285,"stance":false},{"id":"fore-far","x":277,"y":293,"stance":false},{"id":"fore-near","x":239,"y":300,"stance":true}],[{"id":"hind-far","x":159,"y":279,"stance":true},{"id":"hind-near","x":89,"y":283,"stance":false},{"id":"fore-far","x":275,"y":293,"stance":false},{"id":"fore-near","x":237,"y":300,"stance":true}],[{"id":"hind-far","x":158,"y":279,"stance":true},{"id":"hind-near","x":89,"y":281,"stance":false},{"id":"fore-far","x":273,"y":293,"stance":false},{"id":"fore-near","x":235,"y":299,"stance":true}],[{"id":"hind-far","x":157,"y":279,"stance":true},{"id":"hind-near","x":87,"y":280,"stance":false},{"id":"fore-far","x":273,"y":293,"stance":false},{"id":"fore-near","x":233,"y":299,"stance":true}],[{"id":"hind-far","x":156,"y":279,"stance":true},{"id":"hind-near","x":84,"y":278,"stance":false},{"id":"fore-far","x":269,"y":293,"stance":false},{"id":"fore-near","x":230,"y":299,"stance":true}],[{"id":"hind-far","x":156,"y":279,"stance":true},{"id":"hind-near","x":81,"y":276,"stance":false},{"id":"fore-far","x":266,"y":293,"stance":false},{"id":"fore-near","x":227,"y":299,"stance":true}],[{"id":"hind-far","x":153,"y":279,"stance":true},{"id":"hind-near","x":79,"y":274,"stance":false},{"id":"fore-far","x":264,"y":293,"stance":false},{"id":"fore-near","x":225,"y":299,"stance":true}],[{"id":"hind-far","x":153,"y":279,"stance":true},{"id":"hind-near","x":78,"y":274,"stance":false},{"id":"fore-far","x":262,"y":293,"stance":false},{"id":"fore-near","x":221,"y":299,"stance":true}]],[[{"id":"hind-far","x":153,"y":279,"stance":true},{"id":"hind-near","x":78,"y":274,"stance":false},{"id":"fore-far","x":262,"y":293,"stance":false},{"id":"fore-near","x":221,"y":299,"stance":true}],[{"id":"hind-far","x":155,"y":280,"stance":true},{"id":"hind-near","x":80,"y":275,"stance":false},{"id":"fore-far","x":264,"y":293,"stance":false},{"id":"fore-near","x":224,"y":299,"stance":true}],[{"id":"hind-far","x":157,"y":280,"stance":true},{"id":"hind-near","x":80,"y":278,"stance":false},{"id":"fore-far","x":264,"y":294,"stance":false},{"id":"fore-near","x":225,"y":299,"stance":true}],[{"id":"hind-far","x":158,"y":280,"stance":true},{"id":"hind-near","x":82,"y":279,"stance":false},{"id":"fore-far","x":266,"y":294,"stance":false},{"id":"fore-near","x":227,"y":299,"stance":true}],[{"id":"hind-far","x":161,"y":281,"stance":true},{"id":"hind-near","x":85,"y":280,"stance":false},{"id":"fore-far","x":267,"y":294,"stance":false},{"id":"fore-near","x":230,"y":299,"stance":true}],[{"id":"hind-far","x":163,"y":281,"stance":true},{"id":"hind-near","x":86,"y":281,"stance":false},{"id":"fore-far","x":267,"y":295,"stance":true},{"id":"fore-near","x":233,"y":299,"stance":true}],[{"id":"hind-far","x":165,"y":281,"stance":true},{"id":"hind-near","x":86,"y":284,"stance":false},{"id":"fore-far","x":268,"y":295,"stance":true},{"id":"fore-near","x":234,"y":299,"stance":true}],[{"id":"hind-far","x":167,"y":281,"stance":true},{"id":"hind-near","x":89,"y":285,"stance":false},{"id":"fore-far","x":269,"y":296,"stance":true},{"id":"fore-near","x":236,"y":300,"stance":true}],[{"id":"hind-far","x":169,"y":281,"stance":true},{"id":"hind-near","x":89,"y":287,"stance":true},{"id":"fore-far","x":270,"y":296,"stance":true},{"id":"fore-near","x":238,"y":300,"stance":true}]],[[{"id":"hind-far","x":169,"y":281,"stance":true},{"id":"hind-near","x":89,"y":287,"stance":true},{"id":"fore-far","x":270,"y":296,"stance":true},{"id":"fore-near","x":238,"y":300,"stance":true}],[{"id":"hind-far","x":165,"y":282,"stance":true},{"id":"hind-near","x":89,"y":287,"stance":true},{"id":"fore-far","x":268,"y":296,"stance":true},{"id":"fore-near","x":238,"y":299,"stance":true}],[{"id":"hind-far","x":165,"y":282,"stance":true},{"id":"hind-near","x":89,"y":288,"stance":true},{"id":"fore-far","x":268,"y":296,"stance":false},{"id":"fore-near","x":239,"y":299,"stance":false}],[{"id":"hind-far","x":164,"y":283,"stance":true},{"id":"hind-near","x":88,"y":288,"stance":true},{"id":"fore-far","x":253,"y":299,"stance":false},{"id":"fore-near","x":235,"y":300,"stance":false}],[{"id":"hind-far","x":164,"y":284,"stance":true},{"id":"hind-near","x":86,"y":290,"stance":true},{"id":"fore-far","x":259,"y":298,"stance":false},{"id":"fore-near","x":240,"y":300,"stance":false}],[{"id":"hind-far","x":161,"y":284,"stance":true},{"id":"hind-near","x":85,"y":291,"stance":true},{"id":"fore-far","x":249,"y":299,"stance":false},{"id":"fore-near","x":232,"y":299,"stance":false}],[{"id":"hind-far","x":162,"y":284,"stance":true},{"id":"hind-near","x":83,"y":292,"stance":true},{"id":"fore-far","x":247,"y":300,"stance":false},{"id":"fore-near","x":228,"y":298,"stance":false}],[{"id":"hind-far","x":160,"y":285,"stance":true},{"id":"hind-near","x":83,"y":293,"stance":true},{"id":"fore-far","x":248,"y":300,"stance":true},{"id":"fore-near","x":230,"y":298,"stance":false}],[{"id":"hind-far","x":159,"y":286,"stance":true},{"id":"hind-near","x":84,"y":293,"stance":true},{"id":"fore-far","x":248,"y":300,"stance":true},{"id":"fore-near","x":230,"y":297,"stance":false}]],[[{"id":"hind-far","x":159,"y":286,"stance":true},{"id":"hind-near","x":84,"y":293,"stance":true},{"id":"fore-far","x":248,"y":300,"stance":true},{"id":"fore-near","x":230,"y":297,"stance":false}],[{"id":"hind-far","x":160,"y":285,"stance":true},{"id":"hind-near","x":84,"y":292,"stance":true},{"id":"fore-far","x":247,"y":300,"stance":true},{"id":"fore-near","x":229,"y":298,"stance":true}],[{"id":"hind-far","x":160,"y":285,"stance":true},{"id":"hind-near","x":85,"y":291,"stance":true},{"id":"fore-far","x":245,"y":300,"stance":false},{"id":"fore-near","x":226,"y":298,"stance":false}],[{"id":"hind-far","x":161,"y":284,"stance":true},{"id":"hind-near","x":84,"y":290,"stance":true},{"id":"fore-far","x":260,"y":297,"stance":false},{"id":"fore-near","x":240,"y":300,"stance":false}],[{"id":"hind-far","x":162,"y":282,"stance":true},{"id":"hind-near","x":85,"y":288,"stance":true},{"id":"fore-far","x":262,"y":296,"stance":false},{"id":"fore-near","x":234,"y":299,"stance":false}],[{"id":"hind-far","x":164,"y":281,"stance":true},{"id":"hind-near","x":85,"y":288,"stance":true},{"id":"fore-far","x":279,"y":291,"stance":false},{"id":"fore-near","x":232,"y":299,"stance":true}],[{"id":"hind-far","x":164,"y":280,"stance":true},{"id":"hind-near","x":88,"y":286,"stance":false},{"id":"fore-far","x":278,"y":292,"stance":false},{"id":"fore-near","x":232,"y":299,"stance":true}],[{"id":"hind-far","x":165,"y":279,"stance":false},{"id":"hind-near","x":89,"y":285,"stance":false},{"id":"fore-far","x":281,"y":293,"stance":false},{"id":"fore-near","x":230,"y":299,"stance":true}],[{"id":"hind-far","x":165,"y":278,"stance":false},{"id":"hind-near","x":87,"y":284,"stance":false},{"id":"fore-far","x":282,"y":294,"stance":false},{"id":"fore-near","x":228,"y":299,"stance":true}]],[[{"id":"hind-far","x":165,"y":278,"stance":false},{"id":"hind-near","x":87,"y":284,"stance":false},{"id":"fore-far","x":282,"y":294,"stance":false},{"id":"fore-near","x":228,"y":299,"stance":true}],[{"id":"hind-far","x":164,"y":278,"stance":false},{"id":"hind-near","x":90,"y":281,"stance":false},{"id":"fore-far","x":280,"y":293,"stance":false},{"id":"fore-near","x":229,"y":299,"stance":true}],[{"id":"hind-far","x":164,"y":278,"stance":false},{"id":"hind-near","x":91,"y":279,"stance":false},{"id":"fore-far","x":277,"y":293,"stance":false},{"id":"fore-near","x":230,"y":299,"stance":true}],[{"id":"hind-far","x":163,"y":278,"stance":false},{"id":"hind-near","x":92,"y":276,"stance":false},{"id":"fore-far","x":273,"y":293,"stance":false},{"id":"fore-near","x":231,"y":299,"stance":true}],[{"id":"hind-far","x":162,"y":278,"stance":false},{"id":"hind-near","x":97,"y":275,"stance":false},{"id":"fore-far","x":272,"y":292,"stance":false},{"id":"fore-near","x":231,"y":300,"stance":true}],[{"id":"hind-far","x":162,"y":278,"stance":false},{"id":"hind-near","x":98,"y":273,"stance":false},{"id":"fore-far","x":269,"y":292,"stance":false},{"id":"fore-near","x":233,"y":299,"stance":true}],[{"id":"hind-far","x":161,"y":278,"stance":false},{"id":"hind-near","x":98,"y":271,"stance":false},{"id":"fore-far","x":256,"y":296,"stance":false},{"id":"fore-near","x":235,"y":299,"stance":true}],[{"id":"hind-far","x":163,"y":279,"stance":false},{"id":"hind-near","x":99,"y":268,"stance":false},{"id":"fore-far","x":256,"y":296,"stance":true},{"id":"fore-near","x":235,"y":299,"stance":true}],[{"id":"hind-far","x":161,"y":279,"stance":false},{"id":"hind-near","x":100,"y":266,"stance":false},{"id":"fore-far","x":253,"y":298,"stance":true},{"id":"fore-near","x":233,"y":300,"stance":true}]],[[{"id":"hind-far","x":161,"y":279,"stance":false},{"id":"hind-near","x":100,"y":266,"stance":false},{"id":"fore-far","x":253,"y":298,"stance":true},{"id":"fore-near","x":233,"y":300,"stance":true}],[{"id":"hind-far","x":162,"y":279,"stance":false},{"id":"hind-near","x":99,"y":269,"stance":false},{"id":"fore-far","x":253,"y":298,"stance":true},{"id":"fore-near","x":233,"y":300,"stance":true}],[{"id":"hind-far","x":163,"y":279,"stance":false},{"id":"hind-near","x":98,"y":272,"stance":false},{"id":"fore-far","x":255,"y":297,"stance":true},{"id":"fore-near","x":235,"y":299,"stance":true}],[{"id":"hind-far","x":161,"y":279,"stance":false},{"id":"hind-near","x":96,"y":274,"stance":false},{"id":"fore-far","x":257,"y":296,"stance":true},{"id":"fore-near","x":236,"y":299,"stance":true}],[{"id":"hind-far","x":165,"y":280,"stance":true},{"id":"hind-near","x":94,"y":276,"stance":false},{"id":"fore-far","x":257,"y":296,"stance":false},{"id":"fore-near","x":236,"y":299,"stance":true}],[{"id":"hind-far","x":162,"y":280,"stance":true},{"id":"hind-near","x":92,"y":278,"stance":false},{"id":"fore-far","x":265,"y":293,"stance":false},{"id":"fore-near","x":236,"y":299,"stance":true}],[{"id":"hind-far","x":164,"y":280,"stance":true},{"id":"hind-near","x":92,"y":280,"stance":false},{"id":"fore-far","x":270,"y":294,"stance":false},{"id":"fore-near","x":236,"y":299,"stance":true}],[{"id":"hind-far","x":165,"y":280,"stance":true},{"id":"hind-near","x":87,"y":284,"stance":false},{"id":"fore-far","x":271,"y":294,"stance":false},{"id":"fore-near","x":235,"y":300,"stance":true}],[{"id":"hind-far","x":164,"y":281,"stance":true},{"id":"hind-near","x":87,"y":286,"stance":false},{"id":"fore-far","x":275,"y":294,"stance":false},{"id":"fore-near","x":235,"y":300,"stance":true}]],[[{"id":"hind-far","x":164,"y":281,"stance":true},{"id":"hind-near","x":87,"y":286,"stance":false},{"id":"fore-far","x":275,"y":294,"stance":false},{"id":"fore-near","x":235,"y":300,"stance":true}],[{"id":"hind-far","x":163,"y":281,"stance":true},{"id":"hind-near","x":88,"y":286,"stance":false},{"id":"fore-far","x":274,"y":294,"stance":false},{"id":"fore-near","x":235,"y":299,"stance":true}],[{"id":"hind-far","x":163,"y":281,"stance":true},{"id":"hind-near","x":90,"y":287,"stance":true},{"id":"fore-far","x":274,"y":295,"stance":false},{"id":"fore-near","x":236,"y":299,"stance":true}],[{"id":"hind-far","x":162,"y":281,"stance":true},{"id":"hind-near","x":91,"y":287,"stance":true},{"id":"fore-far","x":273,"y":295,"stance":true},{"id":"fore-near","x":237,"y":299,"stance":true}],[{"id":"hind-far","x":160,"y":282,"stance":true},{"id":"hind-near","x":92,"y":288,"stance":true},{"id":"fore-far","x":271,"y":296,"stance":true},{"id":"fore-near","x":237,"y":299,"stance":true}],[{"id":"hind-far","x":159,"y":282,"stance":true},{"id":"hind-near","x":95,"y":288,"stance":true},{"id":"fore-far","x":271,"y":297,"stance":true},{"id":"fore-near","x":238,"y":298,"stance":true}],[{"id":"hind-far","x":158,"y":281,"stance":true},{"id":"hind-near","x":97,"y":288,"stance":true},{"id":"fore-far","x":269,"y":297,"stance":false},{"id":"fore-near","x":238,"y":298,"stance":false}],[{"id":"hind-far","x":156,"y":282,"stance":true},{"id":"hind-near","x":99,"y":289,"stance":true},{"id":"fore-far","x":263,"y":298,"stance":false},{"id":"fore-near","x":236,"y":298,"stance":false}],[{"id":"hind-far","x":154,"y":282,"stance":true},{"id":"hind-near","x":100,"y":289,"stance":true},{"id":"fore-far","x":250,"y":298,"stance":false},{"id":"fore-near","x":221,"y":296,"stance":false}]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]]],"sourceOrigin":[80,150],"ground":450,"approval":{"status":"unapproved-candidate","unresolved":41},"legacyEndpoints":{"key24":{"productionPair":0,"sample":0,"byteEqual":true,"sha256":"f5e9ecf3ed911f1ff978fb51907f7ecb9b6809f32bc447815af0fc1b72c0f1a7"},"key25":{"productionPair":9,"sample":0,"byteEqual":true,"sha256":"b7d06a7f2157cba0ce7f812eda34265e9789c1e15d19e8f8dde5273e151364ac"},"key26":{"productionPair":28,"sample":0,"byteEqual":true,"sha256":"f27c5b8e830e29c350af5d1323b83cc191dc59e16178abbe07628d61ead48c08","use":"audit only, not rendered by v5 clips"},"standing":{"legacy":"puppy-paper-seat.bin.gz[0,16] embedded 1:1 at origin","embeddedSha256":"cfd0c4e07985a10fd5f631994000dec971e435366cab50069118c14f47aaf6b8","inSpinClip":false,"note":"v7: legacy standing kept in keyOrder as calibration reference only; no edge renders it"}},"calibrationOnlyKeys":["standing","bridge0","bridge7","key26"],"reversedPairs":{"bridge6>bridge5":"bridge5>bridge6 samples reversed","bridge5>bridge2":"bridge2>bridge5 samples reversed","bridge2>bridge1":"bridge1>bridge2 samples reversed","bridge1>key25":"key25>bridge1 samples reversed"},"method":"v9: v8 with walk-enter/walk/walk-exit replaced by the uniformly calibrated same-view v9 walk sheet","v7Repairs":{"base":{"bin":"puppy-paper-actions-v6.bin.gz","rawSha256":"3ca98c36505d733ec9d544e53783f127d1cfab6d7c8b9f8de1da6d22e02ce8ab"},"changedSamples":[[12,1],[12,2],[12,3],[12,4],[12,5],[12,6],[12,7],[12,8],[13,0],[13,1],[13,2],[13,3],[13,4],[13,5],[13,6],[13,7],[31,1],[31,2],[31,3],[31,4],[31,5],[31,6],[31,7],[35,1],[35,2],[35,3],[35,4],[35,5],[35,6],[35,7]],"spin":{"replacedEdges":["spin11>standing","standing>spin13"],"with":["spin11>spin12","spin12>spin13"],"pairs":[12,13]},"heldEdges":{"patch0>patch1":{"pair":31,"samples1to4":"patch0","samples5to7":"patch1"},"patch4>patch5":{"pair":35,"samples1to4":"patch4","samples5to7":"patch5"}}},"walkTurn":{"source":"original articulated turn30..40, no crouch41/42","scale":1.088785046728972,"referenceStandingHeight":233,"coreStandingHeight":214,"method":"one uniform standing-strip scale, shared floor450; no framewise bbox fit; neutral entry and mirrored-neutral exit"},"v8WalkLifecycle":{"neutral":"puppy-stride-tweens.bin.gz[20,0] embedded 1:1 with legacy floor compensation","neutralTranslationY":-4,"neutralSha256":"a37bd5fb5ff35c05a38304b6608468fbce06c8ce5bb10e2c8ad2a4a2bf5d7d96","walkScale":1,"source":"original production walk loop/feet byte-exact","skipRunLaunchSettle":true,"entry":"neutral to walk16, RIFE4.6; exit exact reverse","oldCrouchedKey24ExcludedFromWalk":true,"supersededBy":"walkV9 (walk-enter/walk/walk-exit replaced); kept for provenance only"},"walkV9":{"sheet":"puppy-walk-same-view9-v9-sheet.png","sheetSha256":"4149882789fdd7894381fe7277bb6ef6a35e10bda0acbb86089f79da5e31ff1b","cells":"3x3 row-major; cell0 = same-view duplicate neutral, calibration anchor only; cells1..8 loop keys","extraction":{"threshold":16,"method":"nearest-seed split of 9 connected drawings, original pixels","cellBoxes":[[36,69,344,299],[444,70,349,295],[850,71,357,300],[36,451,361,310],[448,450,351,311],[847,450,366,304],[30,843,358,318],[437,843,366,321],[847,841,368,322]],"ignoredSpecks":[1,1]},"calibration":{"scale":0.7955,"uniform":true,"target":"references/action-audit-v7/neutral.png","targetSha256":"4b1d21973a0ed0c67fcdb93cc9bbe6567236cdafc5f328d2d6a6e27bb3b4245d","method":"one similarity scale for the whole sheet: maximise silhouette IoU(>40) of cell0 vs master neutral over scales 0.790..0.802 step .0005, translation by template match","cell0IoU":0.969,"tone":"none (sheet values copied; brightness reported, not adjusted)"},"registration":{"floor":450,"origin":[80,150],"method":"per key translation only: y puts lowest foreground (>40) on floor450, x minimises torso-band abs error vs registered cell0; no per-key scale, no rotation, no camera orbit","torsoWindow":[176,303,312,379],"keys":[{"cell":0,"x":117,"y":213,"torsoDx":0,"torsoError":0.0},{"cell":1,"x":111,"y":217,"torsoDx":-6,"torsoError":14.3},{"cell":2,"x":109,"y":213,"torsoDx":-8,"torsoError":11.7},{"cell":3,"x":104,"y":204,"torsoDx":-13,"torsoError":18.95},{"cell":4,"x":117,"y":205,"torsoDx":0,"torsoError":14.0},{"cell":5,"x":105,"y":210,"torsoDx":-12,"torsoError":14.4},{"cell":6,"x":112,"y":199,"torsoDx":-5,"torsoError":14.91},{"cell":7,"x":105,"y":196,"torsoDx":-12,"torsoError":24.87},{"cell":8,"x":107,"y":195,"torsoDx":-10,"torsoError":20.62}]},"keys":["walk-v9-1","walk-v9-2","walk-v9-3","walk-v9-4","walk-v9-5","walk-v9-6","walk-v9-7","walk-v9-8"],"loop":"walk-v9-1>2>..>8>1","entry":"exact v8 neutral (walk-neutral key) > walk-v9-1, RIFE4.6 7 intermediates, floor translation only","exit":"exact reverse of entry","rifeFloorShiftsPx":{"neutral>k1":[0,0,0,0,0,1,0,0,0],"k1>k2":[0,0,0,0,0,0,0,0,0],"k2>k3":[0,0,0,0,0,0,0,0,0],"k3>k4":[0,0,0,0,0,0,0,0,0],"k4>k5":[0,0,0,0,0,0,0,0,0],"k5>k6":[0,0,0,0,0,0,0,0,0],"k6>k7":[0,0,0,0,0,0,0,0,0],"k7>k8":[0,0,0,0,0,0,0,0,0],"k8>k1":[0,0,0,0,0,0,0,0,0]},"feet":{"method":"Four named paw contacts recomputed from the actual v9 walk pixels (never copied from v8).","lobeCounts":{"min":3,"max":4,"framesNot4":2,"frames":73},"occludedSamples":2,"loopClosurePx":0.0,"groundLinesCanvasY":{"hind-far":434.0,"hind-near":440.7,"fore-far":450.0,"fore-near":450.0},"stanceRule":"y within 4px of the paw 90th-percentile ground line and |dx|<=3.5px to both cyclic neighbour samples","loopStanceFraction":{"hind-far":0.797,"hind-near":0.453,"fore-far":0.297,"fore-near":0.766},"supportFeetHistogram0to4":[0,8,37,10,9],"timeline":{"hind-far":"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS.............SSSSSSSSSSSS","hind-near":"SSSSSSSSS...............SSSSSSSSSSSSSS....................SSSSSS","fore-far":"...SSS...............SSSSS.....SSS.............SSSSS.......SSS..","fore-near":"...SSSSSSSSSSSSSSSSSSSSSSS.......S...SSSSSSSSSSSSSSSSSSSSSSSSS.."},"entryExitFeet":"empty, as v8 (runtime pins walk loop only)"},"replacedPairs":[41,42,43,44,45,46,47,48,49,50],"replacedKeyNames":{"41":["walk16","walk-v9-1"],"42":["walk17","walk-v9-2"],"43":["walk18","walk-v9-3"],"44":["walk19","walk-v9-4"],"45":["walk20","walk-v9-5"],"46":["walk21","walk-v9-6"],"47":["walk22","walk-v9-7"],"48":["walk23","walk-v9-8"]},"nonWalkPairsByteExactWithV8":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65],"v8RawSha256":"30b51e3dc7e77d1c89919a7d14596283f265774c14f33a74909c53e1c3df9d04","exactInputHashes":{"puppy-walk-same-view9-v9-sheet.png":"4149882789fdd7894381fe7277bb6ef6a35e10bda0acbb86089f79da5e31ff1b","references/action-audit-v7/neutral.png":"4b1d21973a0ed0c67fcdb93cc9bbe6567236cdafc5f328d2d6a6e27bb3b4245d","puppy-paper-actions-v8.bin.gz":"dab2b3b495d84f13d867a7f95884e6aa6d62af2e858a716893d406edb90e9709","puppy-paper-actions-v8.json":"87fc24c072d1110a3e395d8bc5072eba2c6126506ac4b736687b087dbf9b116b","tools/rife-20221029/rife-ncnn-vulkan.exe":"4b970319db2814c82b15fceed8193151560a676a9eb63f20d4877be77b98f44f","worker-staging/actions-walk-v9/build_v9.py":"65a579361a967d701db5cc531765e8984bb058bb392d3884a034f7f7916f87c0","worker-staging/actions-walk-v9/walk_v9_art.py":"5b6562e7179d2c1b573066f151419d545b842a895e5f37188c5a5eab3b8ee517","worker-staging/actions-walk-v9/walk_v9_feet.py":"6a4f65d6239bc90b1c6661363bf309ba7c20b0425f3a2da95eb286e504b92ad5"},"removedObsoleteWalkSourceHashes":{"puppy-paper-actions.bin.gz":"530930afd318f991097c32325f671423af48323b279b7321f75656633d7262b8","puppy-paper-actions.json":"e768260e447f92ea69778fcc7b2be93d1ca88abc3ed0e34b40366c9d28f40767"}},"sourceCameraCorrection":{"method":"offline same-view skull-template similarity calibration to approved neutral; no per-frame bbox fit, no runtime camera/zoom change","pivot":[240,450],"keyMagnifications":{"walk-v9-1":1.005,"walk-v9-2":1.005,"walk-v9-3":1.02,"walk-v9-4":1.04,"walk-v9-5":1.025,"walk-v9-6":1.06,"walk-v9-7":1.065,"walk-v9-8":1.07},"keyEvidence":{"1":{"faceScale":1.005,"faceScore":0.989,"points":{"eyeA":[304.0,259.0],"eyeB":[342.0,253.0],"nose":[330.0,277.0]},"eyeSpan":38.47,"eyeAToNose":31.62,"eyeBToNose":26.83,"crownToEyes":38.0},"2":{"faceScale":1.005,"faceScore":0.973,"points":{"eyeA":[310.0,255.0],"eyeB":[349.0,249.0],"nose":[338.0,272.0]},"eyeSpan":39.46,"eyeAToNose":32.76,"eyeBToNose":25.5,"crownToEyes":39.0},"3":{"faceScale":1.02,"faceScore":0.991,"points":{"eyeA":[305.0,246.0],"eyeB":[344.0,240.0],"nose":[332.0,264.0]},"eyeSpan":39.46,"eyeAToNose":32.45,"eyeBToNose":26.83,"crownToEyes":39.0},"4":{"faceScale":1.04,"faceScore":0.994,"points":{"eyeA":[309.0,248.0],"eyeB":[348.0,243.0],"nose":[335.0,267.0]},"eyeSpan":39.32,"eyeAToNose":32.2,"eyeBToNose":27.29,"crownToEyes":40.5},"5":{"faceScale":1.025,"faceScore":0.975,"points":{"eyeA":[312.0,253.0],"eyeB":[351.0,248.0],"nose":[339.0,271.0]},"eyeSpan":39.32,"eyeAToNose":32.45,"eyeBToNose":25.94,"crownToEyes":39.5},"6":{"faceScale":1.06,"faceScore":0.992,"points":{"eyeA":[308.0,243.0],"eyeB":[348.0,238.0],"nose":[335.0,262.0]},"eyeSpan":40.31,"eyeAToNose":33.02,"eyeBToNose":27.29,"crownToEyes":40.5},"7":{"faceScale":1.065,"faceScore":0.99,"points":{"eyeA":[306.0,240.0],"eyeB":[346.0,234.0],"nose":[333.0,259.0]},"eyeSpan":40.45,"eyeAToNose":33.02,"eyeBToNose":28.18,"crownToEyes":41.0},"8":{"faceScale":1.07,"faceScore":0.987,"points":{"eyeA":[311.0,238.0],"eyeB":[351.0,234.0],"nose":[338.0,258.0]},"eyeSpan":40.2,"eyeAToNose":33.6,"eyeBToNose":27.29,"crownToEyes":40.0}},"samples":[{"pair":41,"sample":1,"factor":0.9993767516111329},{"pair":41,"sample":2,"factor":0.9987538916608201},{"pair":41,"sample":3,"factor":0.9981314199069676},{"pair":41,"sample":4,"factor":0.9975093361076329},{"pair":41,"sample":5,"factor":0.9968876400210239},{"pair":41,"sample":6,"factor":0.9962663314054993},{"pair":41,"sample":7,"factor":0.9956454100195684},{"pair":41,"sample":8,"factor":0.9950248756218907},{"pair":42,"sample":0,"factor":0.9950248756218907},{"pair":42,"sample":1,"factor":0.9950248756218909},{"pair":42,"sample":2,"factor":0.9950248756218907},{"pair":42,"sample":3,"factor":0.9950248756218907},{"pair":42,"sample":4,"factor":0.9950248756218907},{"pair":42,"sample":5,"factor":0.9950248756218907},{"pair":42,"sample":6,"factor":0.9950248756218907},{"pair":42,"sample":7,"factor":0.9950248756218909},{"pair":42,"sample":8,"factor":0.9950248756218907},{"pair":43,"sample":0,"factor":0.9950248756218907},{"pair":43,"sample":1,"factor":0.9931839084171267},{"pair":43,"sample":2,"factor":0.9913463473184124},{"pair":43,"sample":3,"factor":0.9895121860238668},{"pair":43,"sample":4,"factor":0.9876814182432663},{"pair":43,"sample":5,"factor":0.9858540376980267},{"pair":43,"sample":6,"factor":0.9840300381211801},{"pair":43,"sample":7,"factor":0.9822094132573528},{"pair":43,"sample":8,"factor":0.9803921568627451},{"pair":44,"sample":0,"factor":0.9803921568627451},{"pair":44,"sample":1,"factor":0.9780153751796401},{"pair":44,"sample":2,"factor":0.9756443555695272},{"pair":44,"sample":3,"factor":0.9732790840633138},{"pair":44,"sample":4,"factor":0.9709195467257717},{"pair":44,"sample":5,"factor":0.9685657296554565},{"pair":44,"sample":6,"factor":0.9662176189846255},{"pair":44,"sample":7,"factor":0.9638752008791555},{"pair":44,"sample":8,"factor":0.9615384615384615},{"pair":45,"sample":0,"factor":0.9615384615384615},{"pair":45,"sample":1,"factor":0.963286213961362},{"pair":45,"sample":2,"factor":0.9650371432083359},{"pair":45,"sample":3,"factor":0.9667912550537768},{"pair":45,"sample":4,"factor":0.9685485552825747},{"pair":45,"sample":5,"factor":0.9703090496901344},{"pair":45,"sample":6,"factor":0.9720727440823952},{"pair":45,"sample":7,"factor":0.9738396442758492},{"pair":45,"sample":8,"factor":0.9756097560975611},{"pair":46,"sample":0,"factor":0.9756097560975611},{"pair":46,"sample":1,"factor":0.9715236666428082},{"pair":46,"sample":2,"factor":0.9674546907182632},{"pair":46,"sample":3,"factor":0.9634027566483255},{"pair":46,"sample":4,"factor":0.9593677930575896},{"pair":46,"sample":5,"factor":0.9553497288695859},{"pair":46,"sample":6,"factor":0.9513484933055323},{"pair":46,"sample":7,"factor":0.9473640158830844},{"pair":46,"sample":8,"factor":0.9433962264150942},{"pair":47,"sample":0,"factor":0.9433962264150942},{"pair":47,"sample":1,"factor":0.9428414496202111},{"pair":47,"sample":2,"factor":0.9422869990692575},{"pair":47,"sample":3,"factor":0.9417328745703815},{"pair":47,"sample":4,"factor":0.9411790759318438},{"pair":47,"sample":5,"factor":0.9406256029620178},{"pair":47,"sample":6,"factor":0.9400724554693898},{"pair":47,"sample":7,"factor":0.9395196332625584},{"pair":47,"sample":8,"factor":0.9389671361502347},{"pair":48,"sample":0,"factor":0.9389671361502347},{"pair":48,"sample":1,"factor":0.9384175494803747},{"pair":48,"sample":2,"factor":0.9378682844889802},{"pair":48,"sample":3,"factor":0.93731934098777},{"pair":48,"sample":4,"factor":0.9367707187885724},{"pair":48,"sample":5,"factor":0.9362224177033265},{"pair":48,"sample":6,"factor":0.9356744375440808},{"pair":48,"sample":7,"factor":0.9351267781229946},{"pair":48,"sample":8,"factor":0.9345794392523364},{"pair":49,"sample":0,"factor":0.9345794392523364},{"pair":49,"sample":1,"factor":0.94192958276485},{"pair":49,"sample":2,"factor":0.9493375326096939},{"pair":49,"sample":3,"factor":0.9568037434136454},{"pair":49,"sample":4,"factor":0.9643286733789639},{"pair":49,"sample":5,"factor":0.9719127843115107},{"pair":49,"sample":6,"factor":0.9795565416490905},{"pair":49,"sample":7,"factor":0.9872604144900149},{"pair":49,"sample":8,"factor":0.9950248756218907},{"pair":50,"sample":0,"factor":0.9950248756218907},{"pair":50,"sample":1,"factor":0.9956454100195684},{"pair":50,"sample":2,"factor":0.9962663314054993},{"pair":50,"sample":3,"factor":0.9968876400210239},{"pair":50,"sample":4,"factor":0.9975093361076329},{"pair":50,"sample":5,"factor":0.9981314199069676},{"pair":50,"sample":6,"factor":0.9987538916608201},{"pair":50,"sample":7,"factor":0.9993767516111329}],"stagedRawSha256":"9afe06196d07d6063d4372730fac59782c6c7c3219c29103bf9c82a0de3f9a8e"}}
@@ -0,0 +1,48 @@
1
+ import{grayFrameReader,isGrayFrameSource}from'./puppy-frame-store.mjs';
2
+ export const PAPER_ACTION_DURATIONS=Object.freeze({spin:2.8,roll:4.6,'roll-down':4.6,'walk-enter':.28,'walk-exit':.28});
3
+ export const PAPER_ACTION_FORMAT=Object.freeze({width:480,height:480,samples:9,maxPairs:256});
4
+ const own=(o,k)=>o!==null&&typeof o==='object'&&!Array.isArray(o)&&Object.prototype.hasOwnProperty.call(o,k);
5
+ const isPairCount=n=>Number.isInteger(n)&&n>0&&n<=PAPER_ACTION_FORMAT.maxPairs;
6
+ function actionClip(name,info){
7
+ if(typeof name!=='string'||!own(info?.clips,name))throw Error(`Invalid paper action: unknown clip ${JSON.stringify(name)}`);
8
+ if(!isPairCount(info.pairs))throw Error('Invalid paper action: pair count');
9
+ const list=info.clips[name];
10
+ if(!Array.isArray(list)||!list.length)throw Error(`Invalid paper action: empty clip ${name}`);
11
+ for(const p of list)if(!Number.isInteger(p)||p<0||p>=info.pairs)throw Error(`Invalid paper action: pair ${p} out of range in ${name}`);
12
+ let weights=list.map(()=>1);
13
+ if(info.weights!==undefined){
14
+ if(info.weights===null||typeof info.weights!=='object'||Array.isArray(info.weights))throw Error('Invalid paper action: weights');
15
+ if(own(info.weights,name)){weights=info.weights[name];
16
+ if(!Array.isArray(weights)||weights.length!==list.length)throw Error(`Invalid paper action: weights length for ${name}`);
17
+ for(const w of weights)if(typeof w!=='number'||!Number.isFinite(w)||w<=0)throw Error(`Invalid paper action: weight ${w} in ${name}`);}
18
+ }
19
+ return{list,weights};
20
+ }
21
+ export function validatePaperActionInfo(info,byteLength){
22
+ const f=PAPER_ACTION_FORMAT;
23
+ if(info===null||typeof info!=='object'||info.width!==f.width||info.height!==f.height||info.samples!==f.samples)throw Error('Invalid action cache: format');
24
+ if(!isPairCount(info.pairs))throw Error('Invalid action cache: pair count');
25
+ if(info.clips===null||typeof info.clips!=='object'||Array.isArray(info.clips)||!Object.keys(info.clips).length)throw Error('Invalid action cache: clips');
26
+ if(info.weights!==undefined)for(const k of Object.keys(info.weights??{}))if(!own(info.clips,k))throw Error(`Invalid action cache: weights for unknown clip ${k}`);
27
+ for(const name of Object.keys(info.clips))actionClip(name,info);
28
+ if(byteLength!==undefined&&byteLength!==f.width*f.height*f.samples*info.pairs)throw Error('Invalid action cache: byte length');
29
+ return info;
30
+ }
31
+ export function paperActionPose(name,progress,info){
32
+ if(typeof progress!=='number'||!Number.isFinite(progress))throw Error('Invalid paper action: progress');
33
+ const{list,weights}=actionClip(name,info),total=weights.reduce((a,b)=>a+b,0);
34
+ let t=(name==='walk'?((progress%1)+1)%1:Math.max(0,Math.min(1,progress)))*total,index=0;
35
+ while(index<list.length-1&&t>weights[index]){t-=weights[index++];}
36
+ const blend=Math.round(Math.max(0,Math.min(1,t/weights[index]))*8)/8;
37
+ if(!Number.isFinite(blend))throw Error('Invalid paper action: blend');
38
+ return{pair:list[index],blend};
39
+ }
40
+ export function createPaperActionSampler(bytes,info){
41
+ if(!isGrayFrameSource(bytes))throw Error('Invalid action cache: bytes');
42
+ validatePaperActionInfo(info,bytes.byteLength);
43
+ const stride=info.width*info.height,pairs=info.pairs,frames=grayFrameReader(bytes,info.width,info.height,pairs*9);
44
+ const out=new Uint8ClampedArray(stride*4);for(let i=3;i<out.length;i+=4)out[i]=255;
45
+ return state=>{const p=paperActionPose(state.actionName,state.actionProgress,info),sample=Math.round(p.blend*8);
46
+ if(p.pair>=pairs||sample<0||sample>8)throw Error('Invalid paper action: sample out of range');
47
+ const frame=frames.getFrame(p.pair*9+sample);for(let i=0,j=0;i<stride;i++,j+=4)out[j]=out[j+1]=out[j+2]=frame[i];return out;};
48
+ }
Binary file
@@ -0,0 +1 @@
1
+ {"version":1,"width":320,"height":320,"samples":9,"pairs":18,"bytes":16588800,"sha256":"f5558c57d5a445d396e06c060f9f8d64e6ce0ff5b9b92fa6d77ef9bb2984a2fe","sheet_sha256":"ea5658c8a019458831456b70058be08dfe792374006def8f3ba282c84fbaaf01","edges":[[12,0],[0,1],[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9,10],[10,11],[11,4],[4,3],[3,2],[2,1],[1,0],[0,12]],"enter":[0,1,2,3,4],"run":[5,6,7,8,9,10,11,12],"exit":[13,14,15,16,17],"feet":[[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[{"id":"fore-left","x":155,"y":276,"stance":false},{"id":"fore-right","x":208,"y":300,"stance":true}],[{"id":"fore-left","x":155,"y":276,"stance":false},{"id":"fore-right","x":208,"y":299,"stance":true}],[{"id":"fore-left","x":155,"y":276,"stance":false},{"id":"fore-right","x":207,"y":297,"stance":true}],[{"id":"fore-left","x":154,"y":276,"stance":false},{"id":"fore-right","x":206,"y":296,"stance":true}],[{"id":"fore-left","x":155,"y":277,"stance":false},{"id":"fore-right","x":203,"y":294,"stance":true}],[{"id":"fore-left","x":155,"y":277,"stance":false},{"id":"fore-right","x":201,"y":293,"stance":true}],[{"id":"fore-left","x":154,"y":277,"stance":false},{"id":"fore-right","x":201,"y":291,"stance":true}],[{"id":"fore-left","x":154,"y":277,"stance":false},{"id":"fore-right","x":200,"y":290,"stance":false}],[{"id":"fore-left","x":154,"y":277,"stance":false},{"id":"fore-right","x":199,"y":289,"stance":false}]],[[{"id":"fore-left","x":154,"y":277,"stance":false},{"id":"fore-right","x":199,"y":289,"stance":false}],[{"id":"fore-left","x":153,"y":277,"stance":false},{"id":"fore-right","x":198,"y":286,"stance":false}],[{"id":"fore-left","x":152,"y":276,"stance":false},{"id":"fore-right","x":197,"y":284,"stance":false}],[{"id":"fore-left","x":150,"y":276,"stance":false},{"id":"fore-right","x":196,"y":282,"stance":false}],[{"id":"fore-left","x":147,"y":275,"stance":false},{"id":"fore-right","x":194,"y":279,"stance":false}],[{"id":"fore-left","x":143,"y":276,"stance":false},{"id":"fore-right","x":193,"y":277,"stance":false}],[{"id":"fore-left","x":141,"y":275,"stance":false},{"id":"fore-right","x":192,"y":275,"stance":false}],[{"id":"fore-left","x":140,"y":275,"stance":false},{"id":"fore-right","x":191,"y":273,"stance":false}],[{"id":"fore-left","x":137,"y":275,"stance":false},{"id":"fore-right","x":189,"y":271,"stance":false}]],[[{"id":"fore-left","x":137,"y":275,"stance":false},{"id":"fore-right","x":189,"y":271,"stance":false}],[{"id":"fore-left","x":138,"y":275,"stance":false},{"id":"fore-right","x":190,"y":270,"stance":false}],[{"id":"fore-left","x":140,"y":275,"stance":false},{"id":"fore-right","x":190,"y":268,"stance":false}],[{"id":"fore-left","x":141,"y":275,"stance":false},{"id":"fore-right","x":191,"y":265,"stance":false}],[{"id":"fore-left","x":143,"y":275,"stance":false},{"id":"fore-right","x":191,"y":263,"stance":false}],[{"id":"fore-left","x":145,"y":274,"stance":false},{"id":"fore-right","x":161,"y":266,"stance":false}],[{"id":"fore-left","x":147,"y":274,"stance":false},{"id":"fore-right","x":161,"y":267,"stance":false}],[{"id":"fore-left","x":147,"y":274,"stance":false},{"id":"fore-right","x":160,"y":269,"stance":false}],[{"id":"fore-left","x":149,"y":274,"stance":false},{"id":"fore-right","x":160,"y":271,"stance":false}]],[[{"id":"fore-left","x":149,"y":274,"stance":false},{"id":"fore-right","x":160,"y":271,"stance":false}],[{"id":"fore-left","x":150,"y":275,"stance":false},{"id":"fore-right","x":160,"y":273,"stance":false}],[{"id":"fore-left","x":151,"y":277,"stance":false},{"id":"fore-right","x":161,"y":274,"stance":false}],[{"id":"fore-left","x":153,"y":280,"stance":false},{"id":"fore-right","x":160,"y":277,"stance":false}],[{"id":"fore-left","x":159,"y":282,"stance":false},{"id":"fore-right","x":162,"y":284,"stance":false}],[{"id":"fore-left","x":141,"y":265,"stance":false},{"id":"fore-right","x":185,"y":284,"stance":false}],[{"id":"fore-left","x":143,"y":267,"stance":false},{"id":"fore-right","x":182,"y":290,"stance":false}],[{"id":"fore-left","x":144,"y":269,"stance":false},{"id":"fore-right","x":189,"y":294,"stance":true}],[{"id":"fore-left","x":145,"y":270,"stance":false},{"id":"fore-right","x":191,"y":298,"stance":true}]],[[{"id":"fore-left","x":145,"y":270,"stance":false},{"id":"fore-right","x":191,"y":298,"stance":true}],[{"id":"fore-left","x":146,"y":273,"stance":false},{"id":"fore-right","x":189,"y":297,"stance":true}],[{"id":"fore-left","x":146,"y":275,"stance":false},{"id":"fore-right","x":185,"y":297,"stance":true}],[{"id":"fore-left","x":146,"y":279,"stance":false},{"id":"fore-right","x":184,"y":296,"stance":true}],[{"id":"fore-left","x":146,"y":283,"stance":false},{"id":"fore-right","x":178,"y":293,"stance":true}],[{"id":"fore-left","x":149,"y":286,"stance":false},{"id":"fore-right","x":175,"y":292,"stance":true}],[{"id":"fore-left","x":150,"y":289,"stance":false},{"id":"fore-right","x":170,"y":292,"stance":true}],[{"id":"fore-left","x":148,"y":293,"stance":true},{"id":"fore-right","x":167,"y":293,"stance":true}],[{"id":"fore-left","x":147,"y":294,"stance":true},{"id":"fore-right","x":166,"y":293,"stance":true}]],[[{"id":"fore-left","x":147,"y":294,"stance":true},{"id":"fore-right","x":166,"y":293,"stance":true}],[{"id":"fore-left","x":150,"y":294,"stance":true},{"id":"fore-right","x":169,"y":294,"stance":true}],[{"id":"fore-left","x":152,"y":295,"stance":true},{"id":"fore-right","x":170,"y":295,"stance":true}],[{"id":"fore-left","x":155,"y":294,"stance":true},{"id":"fore-right","x":175,"y":296,"stance":true}],[{"id":"fore-left","x":158,"y":294,"stance":true},{"id":"fore-right","x":180,"y":296,"stance":true}],[{"id":"fore-left","x":127,"y":274,"stance":false},{"id":"fore-right","x":187,"y":296,"stance":true}],[{"id":"fore-left","x":127,"y":274,"stance":false},{"id":"fore-right","x":193,"y":296,"stance":true}],[{"id":"fore-left","x":128,"y":274,"stance":false},{"id":"fore-right","x":200,"y":297,"stance":true}],[{"id":"fore-left","x":128,"y":274,"stance":false},{"id":"fore-right","x":203,"y":297,"stance":true}]],[[{"id":"fore-left","x":128,"y":274,"stance":false},{"id":"fore-right","x":203,"y":297,"stance":true}],[{"id":"fore-left","x":129,"y":277,"stance":false},{"id":"fore-right","x":202,"y":295,"stance":true}],[{"id":"fore-left","x":129,"y":279,"stance":false},{"id":"fore-right","x":199,"y":291,"stance":true}],[{"id":"fore-left","x":131,"y":282,"stance":false},{"id":"fore-right","x":199,"y":288,"stance":false}],[{"id":"fore-left","x":134,"y":286,"stance":false},{"id":"fore-right","x":198,"y":284,"stance":false}],[{"id":"fore-left","x":139,"y":288,"stance":false},{"id":"fore-right","x":165,"y":288,"stance":false}],[{"id":"fore-left","x":142,"y":291,"stance":true},{"id":"fore-right","x":165,"y":290,"stance":false}],[{"id":"fore-left","x":143,"y":293,"stance":true},{"id":"fore-right","x":165,"y":292,"stance":true}],[{"id":"fore-left","x":140,"y":295,"stance":true},{"id":"fore-right","x":164,"y":294,"stance":true}]],[[{"id":"fore-left","x":140,"y":295,"stance":true},{"id":"fore-right","x":164,"y":294,"stance":true}],[{"id":"fore-left","x":146,"y":295,"stance":true},{"id":"fore-right","x":165,"y":294,"stance":true}],[{"id":"fore-left","x":144,"y":293,"stance":true},{"id":"fore-right","x":166,"y":292,"stance":true}],[{"id":"fore-left","x":147,"y":290,"stance":false},{"id":"fore-right","x":166,"y":291,"stance":true}],[{"id":"fore-left","x":148,"y":286,"stance":false},{"id":"fore-right","x":201,"y":288,"stance":false}],[{"id":"fore-left","x":153,"y":278,"stance":false},{"id":"fore-right","x":184,"y":295,"stance":true}],[{"id":"fore-left","x":153,"y":278,"stance":false},{"id":"fore-right","x":202,"y":295,"stance":true}],[{"id":"fore-left","x":154,"y":278,"stance":false},{"id":"fore-right","x":203,"y":298,"stance":true}],[{"id":"fore-left","x":155,"y":276,"stance":false},{"id":"fore-right","x":208,"y":300,"stance":true}]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]],[[],[],[],[],[],[],[],[],[]]],"registration":[{"cell":0,"scale":0.91,"torso":[182.53649938031987,177.7928704562654],"matrix":[[0.91,0.0,-6.108214436091089],[0.0,0.91,18.208487884798473]],"ground_shift":-2},{"cell":1,"scale":0.91,"torso":[169.9144093980554,177.87085025905003],"matrix":[[0.91,0.0,5.377887447769581],[0.0,0.91,18.137526264264466]],"ground_shift":0},{"cell":2,"scale":0.91,"torso":[147.5526218791003,187.12793398348816],"matrix":[[0.91,0.0,25.727114090018745],[0.0,0.91,9.71358007502576]],"ground_shift":9},{"cell":3,"scale":0.91,"torso":[132.71177757338796,197.13414196908792],"matrix":[[0.91,0.0,39.232282408216946],[0.0,0.91,0.6079308081299928]],"ground_shift":19},{"cell":4,"scale":0.91,"torso":[172.31985295531476,181.76471339852299],"matrix":[[0.91,0.0,3.1889338106635705],[0.0,0.91,14.594110807344066]],"ground_shift":22},{"cell":5,"scale":0.91,"torso":[162.71578216601097,179.8905586056037],"matrix":[[0.91,0.0,11.928638228930026],[0.0,0.91,16.299591668900632]],"ground_shift":22},{"cell":6,"scale":0.91,"torso":[153.3670740811748,182.55914599895132],"matrix":[[0.91,0.0,20.435962586130927],[0.0,0.91,13.871177140954302]],"ground_shift":22},{"cell":7,"scale":0.91,"torso":[133.2646505793462,181.33461095053593],"matrix":[[0.91,0.0,38.72916797279494],[0.0,0.91,14.985504035012298]],"ground_shift":22},{"cell":8,"scale":0.91,"torso":[176.70935863380478,158.76417839487578],"matrix":[[0.91,0.0,-0.8055163567623538],[0.0,0.91,35.524597660663034]],"ground_shift":22},{"cell":9,"scale":0.91,"torso":[169.1811398788915,162.2365917393083],"matrix":[[0.91,0.0,6.045162710208729],[0.0,0.91,32.364701517229435]],"ground_shift":22},{"cell":10,"scale":0.91,"torso":[144.1380670506937,160.2370420989717],"matrix":[[0.91,0.0,28.834358983868725],[0.0,0.91,34.18429168993575]],"ground_shift":22},{"cell":11,"scale":0.91,"torso":[142.06266749532077,162.55352306256896],"matrix":[[0.91,0.0,30.722972579258084],[0.0,0.91,32.07629401306224]],"ground_shift":22}],"method":"built-in imagegen reference-preserving frontal run; fixed scale; torso registration; pinned offline RIFE v4.6; original side endpoint"}