codeboard-studio 0.2.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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +23 -0
  3. package/README.md +54 -0
  4. package/dist/src/animation/camera-plane.d.ts +8 -0
  5. package/dist/src/animation/camera-plane.d.ts.map +1 -0
  6. package/dist/src/animation/camera-plane.js +16 -0
  7. package/dist/src/animation/camera-plane.js.map +1 -0
  8. package/dist/src/animation/drawing-neighbors.d.ts +4 -0
  9. package/dist/src/animation/drawing-neighbors.d.ts.map +1 -0
  10. package/dist/src/animation/drawing-neighbors.js +38 -0
  11. package/dist/src/animation/drawing-neighbors.js.map +1 -0
  12. package/dist/src/animation/evaluate.d.ts +17 -0
  13. package/dist/src/animation/evaluate.d.ts.map +1 -0
  14. package/dist/src/animation/evaluate.js +70 -0
  15. package/dist/src/animation/evaluate.js.map +1 -0
  16. package/dist/src/animation/frame.d.ts +8 -0
  17. package/dist/src/animation/frame.d.ts.map +1 -0
  18. package/dist/src/animation/frame.js +16 -0
  19. package/dist/src/animation/frame.js.map +1 -0
  20. package/dist/src/animation/ik.d.ts +26 -0
  21. package/dist/src/animation/ik.d.ts.map +1 -0
  22. package/dist/src/animation/ik.js +47 -0
  23. package/dist/src/animation/ik.js.map +1 -0
  24. package/dist/src/animation/retime.d.ts +4 -0
  25. package/dist/src/animation/retime.d.ts.map +1 -0
  26. package/dist/src/animation/retime.js +116 -0
  27. package/dist/src/animation/retime.js.map +1 -0
  28. package/dist/src/audio/wav.d.ts +11 -0
  29. package/dist/src/audio/wav.d.ts.map +1 -0
  30. package/dist/src/audio/wav.js +58 -0
  31. package/dist/src/audio/wav.js.map +1 -0
  32. package/dist/src/authoring-runner.d.ts +2 -0
  33. package/dist/src/authoring-runner.d.ts.map +1 -0
  34. package/dist/src/authoring-runner.js +24 -0
  35. package/dist/src/authoring-runner.js.map +1 -0
  36. package/dist/src/cli.d.ts +3 -0
  37. package/dist/src/cli.d.ts.map +1 -0
  38. package/dist/src/cli.js +127 -0
  39. package/dist/src/cli.js.map +1 -0
  40. package/dist/src/core/coordinates.d.ts +16 -0
  41. package/dist/src/core/coordinates.d.ts.map +1 -0
  42. package/dist/src/core/coordinates.js +48 -0
  43. package/dist/src/core/coordinates.js.map +1 -0
  44. package/dist/src/core/handles.d.ts +93 -0
  45. package/dist/src/core/handles.d.ts.map +1 -0
  46. package/dist/src/core/handles.js +190 -0
  47. package/dist/src/core/handles.js.map +1 -0
  48. package/dist/src/core/history.d.ts +14 -0
  49. package/dist/src/core/history.d.ts.map +1 -0
  50. package/dist/src/core/history.js +80 -0
  51. package/dist/src/core/history.js.map +1 -0
  52. package/dist/src/core/inspection.d.ts +51 -0
  53. package/dist/src/core/inspection.d.ts.map +1 -0
  54. package/dist/src/core/inspection.js +72 -0
  55. package/dist/src/core/inspection.js.map +1 -0
  56. package/dist/src/core/production.d.ts +208 -0
  57. package/dist/src/core/production.d.ts.map +1 -0
  58. package/dist/src/core/production.js +894 -0
  59. package/dist/src/core/production.js.map +1 -0
  60. package/dist/src/core/project.d.ts +146 -0
  61. package/dist/src/core/project.d.ts.map +1 -0
  62. package/dist/src/core/project.js +700 -0
  63. package/dist/src/core/project.js.map +1 -0
  64. package/dist/src/drawing/brush-authoring.d.ts +6 -0
  65. package/dist/src/drawing/brush-authoring.d.ts.map +1 -0
  66. package/dist/src/drawing/brush-authoring.js +12 -0
  67. package/dist/src/drawing/brush-authoring.js.map +1 -0
  68. package/dist/src/drawing/brushes.d.ts +157 -0
  69. package/dist/src/drawing/brushes.d.ts.map +1 -0
  70. package/dist/src/drawing/brushes.js +50 -0
  71. package/dist/src/drawing/brushes.js.map +1 -0
  72. package/dist/src/drawing/color.d.ts +5 -0
  73. package/dist/src/drawing/color.d.ts.map +1 -0
  74. package/dist/src/drawing/color.js +63 -0
  75. package/dist/src/drawing/color.js.map +1 -0
  76. package/dist/src/drawing/curves.d.ts +27 -0
  77. package/dist/src/drawing/curves.d.ts.map +1 -0
  78. package/dist/src/drawing/curves.js +170 -0
  79. package/dist/src/drawing/curves.js.map +1 -0
  80. package/dist/src/drawing/math.d.ts +10 -0
  81. package/dist/src/drawing/math.d.ts.map +1 -0
  82. package/dist/src/drawing/math.js +40 -0
  83. package/dist/src/drawing/math.js.map +1 -0
  84. package/dist/src/drawing/path-geometry.d.ts +18 -0
  85. package/dist/src/drawing/path-geometry.d.ts.map +1 -0
  86. package/dist/src/drawing/path-geometry.js +115 -0
  87. package/dist/src/drawing/path-geometry.js.map +1 -0
  88. package/dist/src/drawing/path-sampling.d.ts +10 -0
  89. package/dist/src/drawing/path-sampling.d.ts.map +1 -0
  90. package/dist/src/drawing/path-sampling.js +64 -0
  91. package/dist/src/drawing/path-sampling.js.map +1 -0
  92. package/dist/src/drawing/path.d.ts +4 -0
  93. package/dist/src/drawing/path.d.ts.map +1 -0
  94. package/dist/src/drawing/path.js +27 -0
  95. package/dist/src/drawing/path.js.map +1 -0
  96. package/dist/src/drawing/pen-input.d.ts +5 -0
  97. package/dist/src/drawing/pen-input.d.ts.map +1 -0
  98. package/dist/src/drawing/pen-input.js +30 -0
  99. package/dist/src/drawing/pen-input.js.map +1 -0
  100. package/dist/src/drawing/pixel-selection.d.ts +23 -0
  101. package/dist/src/drawing/pixel-selection.d.ts.map +1 -0
  102. package/dist/src/drawing/pixel-selection.js +142 -0
  103. package/dist/src/drawing/pixel-selection.js.map +1 -0
  104. package/dist/src/drawing/pixels.d.ts +22 -0
  105. package/dist/src/drawing/pixels.d.ts.map +1 -0
  106. package/dist/src/drawing/pixels.js +79 -0
  107. package/dist/src/drawing/pixels.js.map +1 -0
  108. package/dist/src/drawing/resource-binary.d.ts +23 -0
  109. package/dist/src/drawing/resource-binary.d.ts.map +1 -0
  110. package/dist/src/drawing/resource-binary.js +135 -0
  111. package/dist/src/drawing/resource-binary.js.map +1 -0
  112. package/dist/src/drawing/resources.d.ts +51 -0
  113. package/dist/src/drawing/resources.d.ts.map +1 -0
  114. package/dist/src/drawing/resources.js +239 -0
  115. package/dist/src/drawing/resources.js.map +1 -0
  116. package/dist/src/drawing/stroke-outline.d.ts +5 -0
  117. package/dist/src/drawing/stroke-outline.d.ts.map +1 -0
  118. package/dist/src/drawing/stroke-outline.js +53 -0
  119. package/dist/src/drawing/stroke-outline.js.map +1 -0
  120. package/dist/src/drawing/swatch.d.ts +6 -0
  121. package/dist/src/drawing/swatch.d.ts.map +1 -0
  122. package/dist/src/drawing/swatch.js +15 -0
  123. package/dist/src/drawing/swatch.js.map +1 -0
  124. package/dist/src/export/animatic-export.d.ts +11 -0
  125. package/dist/src/export/animatic-export.d.ts.map +1 -0
  126. package/dist/src/export/animatic-export.js +52 -0
  127. package/dist/src/export/animatic-export.js.map +1 -0
  128. package/dist/src/export/movie-export.d.ts +16 -0
  129. package/dist/src/export/movie-export.d.ts.map +1 -0
  130. package/dist/src/export/movie-export.js +108 -0
  131. package/dist/src/export/movie-export.js.map +1 -0
  132. package/dist/src/export/sheet-layout.d.ts +27 -0
  133. package/dist/src/export/sheet-layout.d.ts.map +1 -0
  134. package/dist/src/export/sheet-layout.js +72 -0
  135. package/dist/src/export/sheet-layout.js.map +1 -0
  136. package/dist/src/export/storyboard-export.d.ts +8 -0
  137. package/dist/src/export/storyboard-export.d.ts.map +1 -0
  138. package/dist/src/export/storyboard-export.js +76 -0
  139. package/dist/src/export/storyboard-export.js.map +1 -0
  140. package/dist/src/index.d.ts +36 -0
  141. package/dist/src/index.d.ts.map +1 -0
  142. package/dist/src/index.js +27 -0
  143. package/dist/src/index.js.map +1 -0
  144. package/dist/src/model/query.d.ts +6 -0
  145. package/dist/src/model/query.d.ts.map +1 -0
  146. package/dist/src/model/query.js +7 -0
  147. package/dist/src/model/query.js.map +1 -0
  148. package/dist/src/model/schema.d.ts +754 -0
  149. package/dist/src/model/schema.d.ts.map +1 -0
  150. package/dist/src/model/schema.js +205 -0
  151. package/dist/src/model/schema.js.map +1 -0
  152. package/dist/src/model/types.d.ts +537 -0
  153. package/dist/src/model/types.d.ts.map +1 -0
  154. package/dist/src/model/types.js +8 -0
  155. package/dist/src/model/types.js.map +1 -0
  156. package/dist/src/model/validate.d.ts +12 -0
  157. package/dist/src/model/validate.d.ts.map +1 -0
  158. package/dist/src/model/validate.js +183 -0
  159. package/dist/src/model/validate.js.map +1 -0
  160. package/dist/src/preview/server.d.ts +6 -0
  161. package/dist/src/preview/server.d.ts.map +1 -0
  162. package/dist/src/preview/server.js +71 -0
  163. package/dist/src/preview/server.js.map +1 -0
  164. package/dist/src/render/annotations.d.ts +4 -0
  165. package/dist/src/render/annotations.d.ts.map +1 -0
  166. package/dist/src/render/annotations.js +27 -0
  167. package/dist/src/render/annotations.js.map +1 -0
  168. package/dist/src/render/brush-engine.d.ts +14 -0
  169. package/dist/src/render/brush-engine.d.ts.map +1 -0
  170. package/dist/src/render/brush-engine.js +230 -0
  171. package/dist/src/render/brush-engine.js.map +1 -0
  172. package/dist/src/render/layer-compositor.d.ts +33 -0
  173. package/dist/src/render/layer-compositor.d.ts.map +1 -0
  174. package/dist/src/render/layer-compositor.js +296 -0
  175. package/dist/src/render/layer-compositor.js.map +1 -0
  176. package/dist/src/render/panel-renderer.d.ts +33 -0
  177. package/dist/src/render/panel-renderer.d.ts.map +1 -0
  178. package/dist/src/render/panel-renderer.js +118 -0
  179. package/dist/src/render/panel-renderer.js.map +1 -0
  180. package/dist/src/render/png.d.ts +4 -0
  181. package/dist/src/render/png.d.ts.map +1 -0
  182. package/dist/src/render/png.js +10 -0
  183. package/dist/src/render/png.js.map +1 -0
  184. package/dist/src/render/review.d.ts +42 -0
  185. package/dist/src/render/review.d.ts.map +1 -0
  186. package/dist/src/render/review.js +192 -0
  187. package/dist/src/render/review.js.map +1 -0
  188. package/dist/src/render/vector-renderer.d.ts +5 -0
  189. package/dist/src/render/vector-renderer.d.ts.map +1 -0
  190. package/dist/src/render/vector-renderer.js +98 -0
  191. package/dist/src/render/vector-renderer.js.map +1 -0
  192. package/dist/src/starter.d.ts +2 -0
  193. package/dist/src/starter.d.ts.map +1 -0
  194. package/dist/src/starter.js +23 -0
  195. package/dist/src/starter.js.map +1 -0
  196. package/dist/src/storage/codec.d.ts +20 -0
  197. package/dist/src/storage/codec.d.ts.map +1 -0
  198. package/dist/src/storage/codec.js +203 -0
  199. package/dist/src/storage/codec.js.map +1 -0
  200. package/dist/src/storage/store.d.ts +89 -0
  201. package/dist/src/storage/store.d.ts.map +1 -0
  202. package/dist/src/storage/store.js +392 -0
  203. package/dist/src/storage/store.js.map +1 -0
  204. package/dist/src/updates.d.ts +10 -0
  205. package/dist/src/updates.d.ts.map +1 -0
  206. package/dist/src/updates.js +134 -0
  207. package/dist/src/updates.js.map +1 -0
  208. package/package.json +84 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/drawing/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,sBAAsB,CAAC;AAuB7E,MAAM,GAAG,GAAC,CAAC,CAAmB,EAAC,EAAE,CAAA,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9E,MAAM,IAAI,GAAC,CAAC,CAAK,EAAO,EAAE,CAAA,CAAC,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC;AAClE,MAAM,GAAG,GAAG,CAAC,IAAW,EAAE,EAAE;IAC1B,IAAI,GAAC,IAAI,CAAC,OAAO,CAAC,qCAAqC,EAAC,EAAE,CAAC,CAAC;IAC5D,IAAG,IAAI,CAAC,MAAM,GAAC,CAAC,GAAC,IAAI,GAAC,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACzI,MAAM,KAAK,GAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAAC,IAAG,KAAK,KAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAClH,OAAO,IAAI,SAAS,CAAC,EAAC,gBAAgB,EAAC,KAAK,EAAC,aAAa,EAAC,KAAK,EAAC,mBAAmB,EAAC,GAAG,EAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzG,CAAC,CAAC;AAEF,SAAS,OAAO,CAAC,IAAW;IAC1B,IAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAG,kBAAkB;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3G,MAAM,CAAC,GAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC;IAAA,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,MAAM,GAAuB,EAAE,CAAC;IAC1E,OAAM,CAAC,CAAC,MAAM,GAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAC,CAAC,CAAC,GAAG,EAAE,EAAC,IAAI,GAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAC,KAAK,GAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAA,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAG,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,MAAM,IAAI,GAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAAC,IAAG,IAAI,GAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACpF,MAAM,GAAG,GAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAAA,IAAI,KAAY,CAAC;QAC7D,IAAG,IAAI,KAAG,MAAM;YAAE,KAAK,GAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAC,CAAC,CAAC,CAAC;aAC1C,IAAG,IAAI,KAAG,MAAM,EAAE,CAAC;YAAC,IAAG,KAAK,CAAC,IAAI,GAAC,CAAC,CAAC,KAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAAA,KAAK,GAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAC,CAAC,CAAC,EAAC,EAAC,eAAe,EAAC,CAAC,GAAC,IAAI,GAAC,IAAI,EAAC,CAAC,CAAC;QAAC,CAAC;aACpK,CAAC;YACJ,MAAM,UAAU,GAAC,KAAK,CAAC,IAAI,GAAC,CAAC,CAAC,EAAC,MAAM,GAAC,KAAK,CAAC,IAAI,GAAC,CAAC,CAAC,CAAC;YAAA,IAAI,MAAM,GAAC,IAAI,GAAC,CAAC,CAAC;YACtE,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE,EAAC,CAAC;gBAAA,MAAM,GAAG,GAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC,MAAM,CAAC,CAAC;gBAAA,IAAG,GAAG,GAAC,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAAA,MAAM,GAAC,GAAG,GAAC,CAAC,CAAC;YAAA,CAAC;YAChI,IAAG,MAAM,KAAG,CAAC,IAAE,CAAC,CAAC,UAAU,KAAG,CAAC,IAAE,UAAU,KAAG,CAAC,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC/G,KAAK,GAAC,UAAU,CAAA,CAAC,CAAA,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAC,EAAC,eAAe,EAAC,CAAC,GAAC,IAAI,GAAC,IAAI,EAAC,CAAC,CAAA,CAAC,CAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5G,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAW,EAAE,OAAqB;IAC1E,OAAO,yBAAyB,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAW,EAAC,IAAW,EAAC,OAAqB;IAC3F,IAAG,IAAI,CAAC,MAAM,GAAC,EAAE,GAAC,IAAI,GAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACzF,MAAM,GAAG,GAAC,OAAO,CAAC,UAAU,IAAE,GAAG,CAAC;IAClC,IAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAE,GAAG,GAAC,CAAC,IAAE,GAAG,GAAC,GAAG;QAAC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACvF,MAAM,MAAM,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClD,MAAM,MAAM,GAAmB,EAAC,MAAM,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,QAAQ,EAAC,GAAG,CAAC,IAAI,CAAC,EAAC,SAAS,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,mBAAmB,EAAC,EAAE,EAAC,WAAW,EAAC,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAC;IACrK,MAAM,SAAS,GAAC,KAAK,EAAC,MAAa,EAAC,UAAiB,EAAC,OAAqB,KAAK,EAAC,EAAE;QACjF,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,GAAC,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,EAAC,EAAC,GAAG,EAAC,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,MAAM,EAAC,MAAM,CAAC,MAAM,EAAC,QAAQ,EAAC,CAAC,EAAC,EAAC,CAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,GAAG,EAAC,QAAQ,EAAC,kBAAkB,EAAC,IAAI,EAAC,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAC,iBAAiB,EAAC,IAAI,EAAC,CAAC,CAAC;QACvO,MAAM,QAAQ,GAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxH,MAAM,gBAAgB,GAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7H,MAAM,EAAE,GAAC,YAAY,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAChD,MAAM,GAAG,GAAmC,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,MAAM,EAAC,IAAI,CAAC,MAAM,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAC,CAAC,CAAA,EAAE,CAAA,CAAC,GAAC,GAAG,CAAC,EAAC,KAAK,EAAC,CAAC,EAAC,YAAY,EAAC,QAAQ,EAAC,aAAa,EAAC,EAAE,EAAC,CAAC;QACjL,IAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,EAAE,CAAC;YAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAC,EAAE,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI,EAAC,GAAG,EAAC,aAAa,EAAC,MAAM,CAAC,KAAK,EAAC,cAAc,EAAC,MAAM,CAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC;QACrL,IAAG,IAAI,CAAC,KAAK,KAAG,MAAM,CAAC,KAAK,IAAE,IAAI,CAAC,MAAM,KAAG,MAAM,CAAC,MAAM;YAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,eAAe,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5K,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,MAAM,KAAK,GAAC,KAAK,EAAC,KAAY,EAAC,KAAY,EAAC,OAAqB,KAAK,EAAC,EAAE;QACvE,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,GAAC,MAAM,KAAK,CAAC,KAAK,EAAC,EAAC,gBAAgB,EAAC,EAAE,GAAC,IAAI,GAAC,IAAI,EAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAC,iBAAiB,EAAC,IAAI,EAAC,CAAC,CAAC;QACzJ,MAAM,IAAI,GAAC,IAAI,KAAG,SAAS,CAAA,CAAC,CAAA,WAAW,CAAA,CAAC,CAAA,OAAO,CAAC,QAAQ,IAAE,OAAO,CAAC;QAClE,MAAM,KAAK,GAAC,UAAU,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,IAAI,CAAC,KAAK,GAAC,IAAI,CAAC,MAAM,EAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE;YACjE,MAAM,CAAC,GAAC,MAAM,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAE,GAAC,GAAG,EAAE,CAAC,GAAC,KAAK,GAAC,MAAM,CAAC,CAAC,GAAC,CAAC,CAAE,GAAC,KAAK,GAAC,MAAM,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAE,GAAC,KAAK,GAAC,MAAM,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC,CAAE,CAAC;YAC3F,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,KAAG,OAAO,CAAA,CAAC,CAAA,CAAC,GAAC,GAAG,CAAA,CAAC,CAAA,CAAC,IAAI,KAAG,WAAW,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,GAAG,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QACH,IAAG,IAAI,KAAG,OAAO,IAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,KAAG,GAAG,CAAC;YAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,2EAA2E,CAAC,CAAC;QACrJ,OAAO,SAAS,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,MAAM,EAAC,IAAI,CAAC,MAAM,EAAC,KAAK,EAAC,EAAC,KAAK,EAAC,IAAI,CAAC,CAAC;IACtF,CAAC,CAAC;IACF,MAAM,IAAI,GAAC,KAAK,EAAC,KAAY,EAAC,KAAY,EAAC,OAAqB,KAAK,EAAmB,EAAE;QACxF,MAAM,SAAS,GAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAG,SAAS,KAAG,MAAM;YAAE,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,EAAC,KAAK,EAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAG,SAAS,KAAG,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,GAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,MAAM,EAAE,GAAC,MAAM,SAAS,CAAC,CAAC,EAAC,KAAK,EAAC,IAAI,CAAC,CAAC;YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,kCAAkC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAAA,OAAO,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAC5L,IAAG,SAAS,KAAG,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,GAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAC,IAAI,GAAC,GAAE,EAAE,GAAC,MAAM,GAAG,GAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA,IAAG,GAAG,GAAC,CAAC,IAAE,GAAG,GAAC,CAAC,CAAC,MAAM,GAAC,IAAI;gBAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAA,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,GAAC,CAAC,CAAC,MAAM,GAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA,CAAC,CAAC;YAC7L,IAAI,EAAE,CAAC;YAAC,MAAM,MAAM,GAAC,IAAI,EAAE,EAAC,KAAK,GAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,IAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAE,KAAK,GAAC,CAAC,IAAE,KAAK,GAAC,IAAI;gBAAC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5F,MAAM,GAAG,GAAC,EAAE,CAAC;YAAA,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,KAAK,EAAC,CAAC,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAC,GAAG,KAAK,IAAI,CAAC,EAAE,EAAC,IAAI,CAAC,CAAC,CAAC;YACjG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,qDAAqD,MAAM,4BAA4B,CAAC,CAAC;YAAA,OAAO,GAAG,CAAC;QACtI,CAAC;QACD,IAAG,SAAS,KAAG,MAAM,EAAE,CAAC;YACtB,MAAM,MAAM,GAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAA,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAAA,MAAM,GAAG,GAAC,EAAE,CAAC;YACxF,KAAI,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;gBAAC,GAAG,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,EAAC,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,EAAE,EAAC,IAAI,CAAC,CAAC,CAAC;YAAA,OAAO,GAAG,CAAC;QAClG,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,SAAS,iBAAiB,CAAC,CAAC;QAAA,OAAO,EAAE,CAAC;IAC/F,CAAC,CAAC;IACF,MAAM,MAAM,GAAC,KAAK,EAAC,KAAY,EAAC,KAAY,EAAC,YAAkC,EAAC,EAAE;QAChF,MAAM,MAAM,GAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAG,CAAC,MAAM,CAAC,MAAM;YAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,2DAA2D,CAAC,CAAC;QACvG,MAAM,IAAI,GAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACrC,IAAG,CAAC,IAAI;YAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,2BAA2B,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAuB,EAAE,CAAC;QAC1C,KAAI,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAE,EAAE,CAAC,CAAC;QAClG,MAAM,MAAM,GAAgB,EAAC,IAAI,EAAC,IAAI,CAAC,OAAO,CAAC,IAAE,KAAK,EAAC,MAAM,EAAC,IAAI,CAAC,YAAY,CAAC,IAAE,SAAS,EAAC,UAAU,EAAC,WAAW,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,mBAAmB,EAAC,EAAE,EAAC,WAAW,EAAC,EAAE,EAAC,CAAC;QACvK,MAAM,IAAI,GAAC,EAAC,GAAG,YAAY,EAAC,CAAC;QAC7B,KAAI,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAE,EAAE,CAAC,CAAC;YAC7C,IAAG,CAAC,IAAI;gBAAC,SAAS;YAClB,MAAM,OAAO,GAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAE,EAAE,CAAC,EAAC,QAAQ,CAAC,CAAC;YAClE,IAAG,OAAO,CAAC,MAAM,GAAC,EAAE,GAAC,IAAI,GAAC,IAAI;gBAAC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACnC,IAAG,QAAQ,IAAE,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAG,QAAQ;gBAAC,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;YACxI,IAAI,CAAC,IAAI,CAAC,GAAC,OAAO,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAsC,EAAE,CAAC;QACnD,IAAI,eAAmB,CAAC;QACxB,IAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAC/B,eAAe,GAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC;YACvD,MAAM,IAAI,GAAC,CAAC,IAAQ,EAAC,EAAE;gBAAC,IAAG,CAAC,IAAI,IAAE,OAAO,IAAI,KAAG,QAAQ;oBAAC,OAAO;gBAAA,KAAI,MAAM,CAAC,GAAG,EAAC,KAAK,CAAC,IAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,CAAC;oBAC5G,IAAG,GAAG,KAAG,WAAW;wBAAC,IAAI,CAAC,IAAI,CAAC,EAAC,IAAI,EAAC,MAAM,CAAC,KAAK,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;yBAAM,IAAG,OAAO,KAAK,KAAG,QAAQ;wBAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/G,CAAC;YAAA,CAAC,CAAC;YAAA,IAAI,CAAC,eAAe,CAAC,CAAC;YACzB,MAAM,UAAU,GAAC,eAAe,EAAE,CAAC,UAAU,CAAC,EAAC,OAAO,GAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1E,IAAG,UAAU,KAAG,SAAS,EAAC,CAAC;gBACzB,IAAG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,IAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAE,OAAO,IAAE,GAAG,IAAE,OAAO,IAAE,CAAC;oBAAC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAC,OAAO,CAAC;;oBAC1G,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,2BAA2B,UAAU,4BAA4B,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QACD,KAAI,MAAM,CAAC,GAAG,EAAC,KAAK,CAAC,IAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,IAAG,6CAA6C,CAAC,IAAI,CAAC,GAAG,CAAC,IAAE,KAAK;gBAAC,IAAI,CAAC,IAAI,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,SAAS,EAAC,CAAC,CAAC;YACzG,IAAG,GAAG,KAAG,cAAc,IAAE,GAAG,KAAG,WAAW,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtB,IAAG,KAAK,CAAC,IAAI,EAAE,IAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAE,CAAC,IAAE,CAAC,IAAE,CAAC,IAAE,CAAC;oBAAC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAG,cAAc,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,MAAM,CAAC,GAAC,CAAC,CAAC;;oBAClG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,uBAAuB,GAAG,MAAM,KAAK,yBAAyB,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC;QACD,IAAI,WAAW,GAAC,KAAK,CAAC;QACtB,KAAI,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,OAAO,GAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAC,GAAG,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,QAAQ,CAAC,CAAC,CAAC,KAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YACpH,IAAG,OAAO,CAAC,MAAM,KAAG,CAAC,EAAE,CAAC;gBAAA,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,GAAC,CAAC,CAAA,CAAC,CAAA,cAAc,CAAA,CAAC,CAAA,EAAE,EAAE,CAAC,CAAC;gBAAA,SAAS;YAAA,CAAC;YACtH,MAAM,GAAG,GAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAE,EAAC,GAAG,CAAC,IAAI,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YAAA,IAAG,GAAG,CAAC,IAAI,KAAG,KAAK,IAAE,GAAG,CAAC,MAAM;gBAAC,WAAW,GAAC,IAAI,CAAC;QACnF,CAAC;QACD,IAAG,CAAC,WAAW;YAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,wGAAwG,CAAC,CAAC;QAClJ,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,gGAAgG,CAAC,CAAC;QACxJ,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,kBAAkB,EAAC,cAAc,EAAC,WAAW,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC;QACzK,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAA,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAAA,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1I,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAE,CAAA,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC;IACF,IAAG,MAAM,KAAG,QAAQ,EAAE,CAAC;QACrB,IAAI,QAAQ,GAAC,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC;QACvB,MAAM,OAAO,GAAC,SAAS,CAAC,IAAI,EAAC,EAAC,MAAM,EAAC,KAAK,CAAA,EAAE;gBAC1C,IAAG,EAAE,KAAK,GAAC,IAAI,IAAE,KAAK,CAAC,YAAY,GAAC,EAAE,GAAC,IAAI,GAAC,IAAI,IAAE,CAAC,QAAQ,IAAE,KAAK,CAAC,YAAY,CAAC,GAAC,EAAE,GAAC,IAAI,GAAC,IAAI;oBAAC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC3J,IAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAChI,OAAO,IAAI,CAAC;YACd,CAAC,EAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAE,CAAA,CAAC,CAAC,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,KAAI,MAAM,CAAC,KAAK,EAAC,KAAK,CAAC,IAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAC,KAAK,EAAC,IAAI,CAAC,CAAC;iBACpD,IAAG,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,MAAM,IAAI,CAAC,KAAK,EAAC,KAAK,CAAC,CAAC;iBAClE,IAAG,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,MAAM,IAAI,CAAC,KAAK,EAAC,KAAK,EAAC,SAAS,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,iGAAiG,CAAC,CAAC;IAC1H,CAAC;SAAM,IAAG,MAAM,KAAG,KAAK;QAAC,MAAM,MAAM,CAAC,IAAI,EAAC,IAAI,EAAC,OAAO,CAAC,YAAY,IAAE,EAAE,CAAC,CAAC;;QACrE,MAAM,IAAI,CAAC,IAAI,EAAC,IAAI,EAAC,OAAO,CAAC,IAAI,IAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,iBAAiB,CAAC,QAAsB,EAAC,QAAgC;IACvF,IAAG,QAAQ,CAAC,IAAI,KAAG,KAAK;QAAC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC3G,OAAO,EAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,EAAC,GAAG,EAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAC,UAAU,EAAC,EAAC,GAAG,QAAQ,CAAC,MAAM,EAAC,gBAAgB,EAAC,QAAQ,CAAC,QAAQ,EAAC,EAAC,CAAC;AAC7I,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Path2D, type CanvasRenderingContext2D } from "skia-canvas";
2
+ import type { VectorStroke, VectorPath } from "../model/types.js";
3
+ export declare function traceVectorStroke(ctx: Path2D | CanvasRenderingContext2D, stroke: VectorStroke): void;
4
+ export declare function outlinedStroke(stroke: VectorStroke): VectorPath;
5
+ //# sourceMappingURL=stroke-outline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-outline.d.ts","sourceRoot":"","sources":["../../../src/drawing/stroke-outline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAC,KAAK,wBAAwB,EAAC,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAO,YAAY,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAWrE,wBAAgB,iBAAiB,CAAC,GAAG,EAAC,MAAM,GAAC,wBAAwB,EAAC,MAAM,EAAC,YAAY,GAAE,IAAI,CA0B9F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAC,YAAY,GAAE,UAAU,CAM7D"}
@@ -0,0 +1,53 @@
1
+ import { Path2D } from "skia-canvas";
2
+ import { taper } from "../render/brush-engine.js";
3
+ import { pathCommands } from "./path.js";
4
+ const clamp = (value, min = 0, max = 1) => Math.min(max, Math.max(min, value));
5
+ function vectorWidth(stroke, point, progress) {
6
+ const pressure = clamp(point.pressure ?? 1);
7
+ return Math.max(0.2, stroke.width * (1 - stroke.pressureSize + pressure * stroke.pressureSize) * taper(progress, stroke.taperStart, stroke.taperEnd));
8
+ }
9
+ export function traceVectorStroke(ctx, stroke) {
10
+ if (!stroke.points.length)
11
+ return;
12
+ const points = [];
13
+ for (const point of stroke.points) {
14
+ const previous = points.at(-1);
15
+ if (previous && Math.hypot(point.x - previous.x, point.y - previous.y) <= 1e-6) {
16
+ if ((point.pressure ?? 1) > (previous.pressure ?? 1))
17
+ points[points.length - 1] = { ...previous, pressure: point.pressure ?? 1 };
18
+ }
19
+ else
20
+ points.push(point);
21
+ }
22
+ if (points.length === 1) {
23
+ const width = vectorWidth(stroke, points[0], 0.5);
24
+ ctx.arc(points[0].x, points[0].y, width / 2, 0, Math.PI * 2);
25
+ }
26
+ else {
27
+ const edges = points.map((p, i) => {
28
+ const previous = points[Math.max(0, i - 1)], next = points[Math.min(points.length - 1, i + 1)];
29
+ const angle = Math.atan2(next.y - previous.y, next.x - previous.x), radius = vectorWidth(stroke, p, i / (points.length - 1)) / 2;
30
+ return { p, angle, radius, x: -Math.sin(angle) * radius, y: Math.cos(angle) * radius };
31
+ });
32
+ const first = edges[0], last = edges.at(-1);
33
+ ctx.moveTo(first.p.x + first.x, first.p.y + first.y);
34
+ for (const e of edges.slice(1))
35
+ ctx.lineTo(e.p.x + e.x, e.p.y + e.y);
36
+ ctx.arc(last.p.x, last.p.y, last.radius, last.angle + Math.PI / 2, last.angle - Math.PI / 2, true);
37
+ for (const e of [...edges].reverse())
38
+ ctx.lineTo(e.p.x - e.x, e.p.y - e.y);
39
+ ctx.arc(first.p.x, first.p.y, first.radius, first.angle - Math.PI / 2, first.angle + Math.PI / 2, true);
40
+ ctx.closePath();
41
+ }
42
+ }
43
+ export function outlinedStroke(stroke) {
44
+ if (stroke.closed && stroke.fill !== undefined)
45
+ throw new Error("Outline conversion requires a stroke without a closed-area fill; separate the fill first");
46
+ const path = new Path2D();
47
+ traceVectorStroke(path, stroke);
48
+ path.closePath();
49
+ const { id, name, matrix, visible, opacity, color } = stroke;
50
+ return { id, kind: "vector-path", commands: path.d ? pathCommands(path.d) : [], fill: color, strokeWidth: 0, visible, opacity,
51
+ ...(name !== undefined ? { name } : {}), ...(matrix ? { matrix: [...matrix] } : {}) };
52
+ }
53
+ //# sourceMappingURL=stroke-outline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stroke-outline.js","sourceRoot":"","sources":["../../../src/drawing/stroke-outline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { BrushPreset } from "../model/types.js";
2
+ export declare function renderBrushSwatch(brush: BrushPreset, options?: {
3
+ color?: string;
4
+ background?: string;
5
+ }): Promise<Buffer>;
6
+ //# sourceMappingURL=swatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swatch.d.ts","sourceRoot":"","sources":["../../../src/drawing/swatch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAsB,iBAAiB,CAAC,KAAK,EAAC,WAAW,EAAC,OAAO,GAAC;IAAC,KAAK,CAAC,EAAC,MAAM,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAA;CAAI,GAAE,OAAO,CAAC,MAAM,CAAC,CASvH"}
@@ -0,0 +1,15 @@
1
+ import { StoryboardProject } from "../core/project.js";
2
+ import { renderPanelPNG } from "../render/panel-renderer.js";
3
+ import { catmullRom } from "./curves.js";
4
+ export async function renderBrushSwatch(brush, options = {}) {
5
+ const project = StoryboardProject.create({ title: brush.name, width: 800, height: 300, background: options.background ?? "#eee8dc" });
6
+ let id = "";
7
+ project.transaction("Brush evaluation", () => {
8
+ const panel = project.addScene("Swatches").addShot("Pressure curve").addPanel();
9
+ id = panel.id;
10
+ const raster = panel.addRasterLayer("Brush sample");
11
+ raster.rasterStroke(catmullRom([{ x: 45, y: 170, pressure: .1 }, { x: 200, y: 65, pressure: .8 }, { x: 410, y: 215, pressure: 1 }, { x: 625, y: 85, pressure: .5 }, { x: 755, y: 160, pressure: .1 }], 16), brush, { color: options.color ?? "#171c20" });
12
+ });
13
+ return renderPanelPNG(project, id, { annotations: false });
14
+ }
15
+ //# sourceMappingURL=swatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swatch.js","sourceRoot":"","sources":["../../../src/drawing/swatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAiB,EAAC,UAA2C,EAAE;IACrG,MAAM,OAAO,GAAC,iBAAiB,CAAC,MAAM,CAAC,EAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,UAAU,EAAC,OAAO,CAAC,UAAU,IAAE,SAAS,EAAC,CAAC,CAAC;IACzH,IAAI,EAAE,GAAC,EAAE,CAAC;IACV,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAC,GAAE,EAAE;QACzC,MAAM,KAAK,GAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAC;QAAA,EAAE,GAAC,KAAK,CAAC,EAAE,CAAC;QAC1F,MAAM,MAAM,GAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,EAAC,CAAC,EAAC,GAAG,EAAC,QAAQ,EAAC,EAAE,EAAC,EAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAC,EAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,QAAQ,EAAC,CAAC,EAAC,EAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAC,EAAC,EAAC,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,QAAQ,EAAC,EAAE,EAAC,CAAC,EAAC,EAAE,CAAC,EAAC,KAAK,EAAC,EAAC,KAAK,EAAC,OAAO,CAAC,KAAK,IAAE,SAAS,EAAC,CAAC,CAAC;IAC7M,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,OAAO,EAAC,EAAE,EAAC,EAAC,WAAW,EAAC,KAAK,EAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type RenderSource } from "../render/panel-renderer.js";
2
+ export interface AnimaticPackageResult {
3
+ directory: string;
4
+ manifestFile: string;
5
+ frameFiles: string[];
6
+ }
7
+ export declare function exportAnimaticPackage(source: RenderSource, outputDir: string, options?: {
8
+ assetRoot?: string;
9
+ maxFrames?: number;
10
+ }): Promise<AnimaticPackageResult>;
11
+ //# sourceMappingURL=animatic-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animatic-export.d.ts","sourceRoot":"","sources":["../../../src/export/animatic-export.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMrF,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAC,OAAO,GAAC;IAAC,SAAS,CAAC,EAAC,MAAM,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAA;CAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAoCpK"}
@@ -0,0 +1,52 @@
1
+ import { mkdir, writeFile, readFile } from "node:fs/promises";
2
+ import { join, resolve, extname } from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { StoryboardProject } from "../core/project.js";
5
+ import { createRenderSession } from "../render/panel-renderer.js";
6
+ function documentOf(source) {
7
+ return source instanceof StoryboardProject ? source.toJSON() : structuredClone(source);
8
+ }
9
+ export async function exportAnimaticPackage(source, outputDir, options = {}) {
10
+ const document = documentOf(source);
11
+ const framesDir = join(outputDir, "frames");
12
+ await mkdir(framesDir, { recursive: true });
13
+ const durationFrames = document.panels.reduce((end, panel) => Math.max(end, panel.startFrame + panel.durationFrames), 0);
14
+ if (durationFrames > (options.maxFrames ?? 100000))
15
+ throw new Error("Frame export limit exceeded");
16
+ const assets = [];
17
+ for (const asset of document.assets.filter(a => a.kind === "audio")) {
18
+ if (!options.assetRoot && !(source instanceof StoryboardProject))
19
+ throw new Error("assetRoot is required for a raw document with audio");
20
+ const bytes = options.assetRoot ? await readFile(resolve(options.assetRoot, asset.path)) : source.readAsset(asset.id), checksum = createHash("sha256").update(bytes).digest("hex");
21
+ if (asset.checksum && asset.checksum !== checksum)
22
+ throw new Error(`Asset checksum mismatch: ${asset.id}`);
23
+ const path = `assets/${checksum}${extname(asset.path)}`;
24
+ await mkdir(join(outputDir, "assets"), { recursive: true });
25
+ await writeFile(join(outputDir, path), bytes);
26
+ assets.push({ ...asset, path, checksum });
27
+ }
28
+ const session = createRenderSession(document);
29
+ const frameFiles = [];
30
+ for (let frame = 0; frame < durationFrames; frame += 1) {
31
+ const file = join(framesDir, `${String(frame).padStart(6, "0")}.png`);
32
+ await writeFile(file, await session.frame(frame).toBuffer("png"));
33
+ frameFiles.push(file);
34
+ }
35
+ const manifest = {
36
+ format: "codeboard-animatic-package",
37
+ version: 1,
38
+ projectId: document.id,
39
+ projectVersion: document.version,
40
+ frameRate: document.frameRate,
41
+ durationFrames,
42
+ framePattern: "frames/%06d.png",
43
+ panels: document.panels.map(({ id, number, title, shotId, startFrame, durationFrames, transition }) => ({ id, number, title, shotId, startFrame, durationFrames, transition })),
44
+ audioTracks: document.audioTracks,
45
+ assets,
46
+ note: "Editable project structure remains in the .cboard document. This package is a rendered PNG sequence with audio timing metadata, not a movie container.",
47
+ };
48
+ const manifestFile = join(outputDir, "animatic.json");
49
+ await writeFile(manifestFile, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
50
+ return { directory: outputDir, manifestFile, frameFiles };
51
+ }
52
+ //# sourceMappingURL=animatic-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animatic-export.js","sourceRoot":"","sources":["../../../src/export/animatic-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type RenderSource } from "../render/panel-renderer.js";
2
+ export interface MovieOptions {
3
+ ffmpegPath?: string;
4
+ assetRoot?: string;
5
+ maxFrames?: number;
6
+ signal?: AbortSignal;
7
+ onProgress?: (completed: number, total: number) => void;
8
+ }
9
+ export declare function exportMovie(source: RenderSource, output: string, options?: MovieOptions): Promise<{
10
+ file: string;
11
+ frames: number;
12
+ seconds: number;
13
+ renderSeconds: number;
14
+ peakRssBytes: number;
15
+ }>;
16
+ //# sourceMappingURL=movie-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movie-export.d.ts","sourceRoot":"","sources":["../../../src/export/movie-export.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAIrF,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB;;;;;;GAiBjG"}
@@ -0,0 +1,108 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, rename, unlink, readFile, mkdtemp, writeFile, rm } from "node:fs/promises";
3
+ import { dirname, resolve, join, extname } from "node:path";
4
+ import { randomUUID, createHash } from "node:crypto";
5
+ import { once } from "node:events";
6
+ import { StoryboardProject } from "../core/project.js";
7
+ import { createRenderSession } from "../render/panel-renderer.js";
8
+ import { encodePNG } from "../render/png.js";
9
+ export async function exportMovie(source, output, options = {}) {
10
+ const doc = source instanceof StoryboardProject ? source.toJSON() : structuredClone(source);
11
+ if (options.assetRoot)
12
+ return exportMovieFiles(doc, output, options);
13
+ if (!doc.audioTracks.some(t => !t.muted && t.clips.length))
14
+ return exportMovieFiles(doc, output, options);
15
+ if (!(source instanceof StoryboardProject))
16
+ throw new Error("assetRoot is required for a raw document with audio");
17
+ const parent = dirname(resolve(output));
18
+ await mkdir(parent, { recursive: true });
19
+ const temporary = await mkdtemp(join(parent, ".codeboard-audio-"));
20
+ try {
21
+ for (let i = 0; i < doc.assets.length; i++) {
22
+ const asset = doc.assets[i];
23
+ if (!doc.audioTracks.some(t => !t.muted && t.clips.some(c => c.assetId === asset.id)))
24
+ continue;
25
+ const bytes = source.readAsset(asset.id);
26
+ asset.path = `asset-${i}${extname(asset.path)}`;
27
+ await writeFile(join(temporary, asset.path), bytes);
28
+ }
29
+ return await exportMovieFiles(doc, output, { ...options, assetRoot: temporary });
30
+ }
31
+ finally {
32
+ await rm(temporary, { recursive: true, force: true });
33
+ }
34
+ }
35
+ async function exportMovieFiles(doc, output, options) {
36
+ const session = createRenderSession(doc);
37
+ const total = session.durationFrames;
38
+ if (!total || total > (options.maxFrames ?? 100000))
39
+ throw new Error("Movie frame count exceeds export limit or is empty");
40
+ if (doc.panels.some(p => p.width !== doc.canvas.width || p.height !== doc.canvas.height))
41
+ throw new Error("Movie panels must share the project dimensions");
42
+ if (doc.canvas.width % 2 || doc.canvas.height % 2)
43
+ throw new Error("H.264 export requires even frame dimensions");
44
+ const clips = doc.audioTracks.filter(t => !t.muted).flatMap(t => t.clips);
45
+ const args = ["-hide_banner", "-loglevel", "error", "-y", "-f", "image2pipe", "-framerate", String(doc.frameRate), "-vcodec", "png", "-i", "pipe:0"];
46
+ const filters = [];
47
+ for (let i = 0; i < clips.length; i++) {
48
+ const clip = clips[i];
49
+ const asset = doc.assets.find(a => a.id === clip.assetId);
50
+ const path = resolve(options.assetRoot, asset.path);
51
+ const bytes = await readFile(path);
52
+ if (asset.checksum && createHash("sha256").update(bytes).digest("hex") !== asset.checksum)
53
+ throw new Error(`Asset checksum mismatch: ${asset.id}`);
54
+ args.push("-i", path);
55
+ const duration = clip.durationFrames / doc.frameRate;
56
+ const chain = ["aresample=48000", `atrim=start_sample=${Math.round(clip.sourceInFrame / doc.frameRate * 48000)}:end_sample=${Math.round((clip.sourceInFrame + clip.durationFrames) / doc.frameRate * 48000)}`, "asetpts=N/SR/TB", `volume=${clip.volume}`];
57
+ if (clip.fadeInFrames)
58
+ chain.push(`afade=t=in:d=${clip.fadeInFrames / doc.frameRate}`);
59
+ if (clip.fadeOutFrames)
60
+ chain.push(`afade=t=out:st=${duration - clip.fadeOutFrames / doc.frameRate}:d=${clip.fadeOutFrames / doc.frameRate}`);
61
+ chain.push(`adelay=${Math.round(clip.startFrame / doc.frameRate * 48000)}S:all=1`);
62
+ filters.push(`[${i + 1}:a]${chain.join(",")}[a${i}]`);
63
+ }
64
+ if (clips.length) {
65
+ const samples = Math.round(total / doc.frameRate * 48000);
66
+ filters.push(`${clips.map((_, i) => `[a${i}]`).join("")}${clips.length === 1 ? "anull" : `amix=inputs=${clips.length}:normalize=0`},asetpts=N/SR/TB,apad=whole_len=${samples},atrim=end_sample=${samples}[mix]`);
67
+ args.push("-filter_complex", filters.join(";"), "-map", "0:v", "-map", "[mix]", "-c:a", "aac", "-ar", "48000", "-b:a", "192k");
68
+ }
69
+ else
70
+ args.push("-map", "0:v", "-an");
71
+ await mkdir(dirname(resolve(output)), { recursive: true });
72
+ const temporary = `${resolve(output)}.${randomUUID()}.mp4`;
73
+ args.push("-c:v", "libx264", "-preset", "medium", "-crf", "18", "-pix_fmt", "yuv420p", "-threads", "2", "-movflags", "+faststart", "-t", String(total / doc.frameRate), temporary);
74
+ const started = performance.now();
75
+ let peakRss = process.memoryUsage().rss;
76
+ const child = spawn(options.ffmpegPath ?? process.env.FFMPEG_PATH ?? "ffmpeg", args, { windowsHide: true, stdio: ["pipe", "ignore", "pipe"], ...(options.signal ? { signal: options.signal } : {}) });
77
+ let error;
78
+ let stderr = "";
79
+ child.stderr.on("data", (data) => { stderr = (stderr + data.toString()).slice(-12000); });
80
+ child.on("error", e => { error = e; });
81
+ child.stdin.on("error", e => { error = e; });
82
+ const finished = new Promise(ready => child.on("close", ready));
83
+ try {
84
+ for (let frame = 0; frame < total; frame++) {
85
+ options.signal?.throwIfAborted();
86
+ if (error)
87
+ throw error;
88
+ const png = await encodePNG(session.frame(frame));
89
+ if (!child.stdin.write(png))
90
+ await once(child.stdin, "drain");
91
+ options.onProgress?.(frame + 1, total);
92
+ peakRss = Math.max(peakRss, process.memoryUsage().rss);
93
+ }
94
+ child.stdin.end();
95
+ const code = await finished;
96
+ if (error || code !== 0)
97
+ throw new Error(`FFmpeg failed (${code}): ${error?.message ?? stderr}`);
98
+ await rename(temporary, resolve(output));
99
+ return { file: resolve(output), frames: total, seconds: total / doc.frameRate, renderSeconds: (performance.now() - started) / 1000, peakRssBytes: peakRss };
100
+ }
101
+ finally {
102
+ if (child.exitCode === null)
103
+ child.kill();
104
+ await finished;
105
+ await unlink(temporary).catch(() => { });
106
+ }
107
+ }
108
+ //# sourceMappingURL=movie-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movie-export.js","sourceRoot":"","sources":["../../../src/export/movie-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { SheetOptions, StoryboardDocument } from "../model/types.js";
2
+ export interface CaptionLine {
3
+ text: string;
4
+ title: boolean;
5
+ }
6
+ export interface SheetCell {
7
+ panelIndex: number;
8
+ part: number;
9
+ parts: number;
10
+ lines: CaptionLine[];
11
+ }
12
+ export declare function layoutStoryboard(document: Pick<StoryboardDocument, "title" | "panels">, options?: SheetOptions): {
13
+ pageWidth: number;
14
+ pageHeight: number;
15
+ margin: number;
16
+ gutter: number;
17
+ columns: number;
18
+ rows: number;
19
+ captionHeight: number;
20
+ bodyTop: number;
21
+ cellWidth: number;
22
+ cellHeight: number;
23
+ artHeight: number;
24
+ titleLines: string[];
25
+ pages: SheetCell[][];
26
+ };
27
+ //# sourceMappingURL=sheet-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet-layout.d.ts","sourceRoot":"","sources":["../../../src/export/sheet-layout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAEvE,MAAM,WAAW,WAAW;IAAE,IAAI,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,OAAO,CAAA;CAAC;AACxD,MAAM,WAAW,SAAS;IAAE,UAAU,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,WAAW,EAAE,CAAA;CAAC;AAqB3F,wBAAgB,gBAAgB,CAAC,QAAQ,EAAC,IAAI,CAAC,kBAAkB,EAAC,OAAO,GAAC,QAAQ,CAAC,EAAC,OAAO,GAAC,YAAe;;;;;;;;;;;;;;EA8B1G"}
@@ -0,0 +1,72 @@
1
+ import { Canvas } from "skia-canvas";
2
+ function wrap(ctx, text, width) {
3
+ const lines = [], graphemes = new Intl.Segmenter(undefined, { granularity: "grapheme" });
4
+ for (const paragraph of text.replace(/\r\n?/g, "\n").split("\n")) {
5
+ let line = "";
6
+ for (const word of paragraph.trim().split(/\s+/u).filter(Boolean)) {
7
+ const candidate = line ? `${line} ${word}` : word;
8
+ if (ctx.measureText(candidate).width <= width) {
9
+ line = candidate;
10
+ continue;
11
+ }
12
+ if (line) {
13
+ lines.push(line);
14
+ line = "";
15
+ }
16
+ for (const { segment } of graphemes.segment(word)) {
17
+ if (ctx.measureText(segment).width > width)
18
+ throw new Error("Storyboard caption column is narrower than a glyph");
19
+ if (line && ctx.measureText(line + segment).width > width) {
20
+ lines.push(line);
21
+ line = "";
22
+ }
23
+ line += segment;
24
+ }
25
+ }
26
+ lines.push(line);
27
+ }
28
+ return lines;
29
+ }
30
+ export function layoutStoryboard(document, options = {}) {
31
+ const { pageWidth = 1440, pageHeight = 1020, margin = 64, gutter = 28, columns = 2, rows = 2, captionHeight = 126 } = options;
32
+ for (const [name, value] of Object.entries({ pageWidth, pageHeight, margin, gutter, columns, rows, captionHeight }))
33
+ if (!Number.isFinite(value) || value < 0)
34
+ throw new Error(`Invalid storyboard sheet ${name}: ${value}`);
35
+ if (!Number.isInteger(columns) || !Number.isInteger(rows) || columns < 1 || rows < 1)
36
+ throw new Error("Storyboard sheet rows and columns must be positive integers");
37
+ if (pageWidth * pageHeight > 32 * 1024 * 1024)
38
+ throw new Error("Storyboard sheet exceeds 32 megapixel page budget");
39
+ const ctx = new Canvas(1, 1).getContext("2d"), titleWidth = pageWidth - margin * 2 - 180;
40
+ if (titleWidth <= 0)
41
+ throw new Error("Storyboard sheet has no room for its header");
42
+ ctx.font = "700 25px sans-serif";
43
+ const titleLines = wrap(ctx, document.title, titleWidth);
44
+ const bodyTop = Math.max(margin, titleLines.length * 30 + 20);
45
+ const cellWidth = (pageWidth - margin * 2 - gutter * (columns - 1)) / columns;
46
+ const cellHeight = (pageHeight - bodyTop - margin - gutter * (rows - 1)) / rows;
47
+ const artHeight = cellHeight - captionHeight, lineCapacity = Math.floor((captionHeight - 49) / 18);
48
+ if (cellWidth <= 0 || artHeight <= 0 || lineCapacity < 1)
49
+ throw new Error("Storyboard sheet needs room for artwork and at least one caption line per cell");
50
+ const cells = [];
51
+ document.panels.forEach((panel, panelIndex) => {
52
+ const lines = [];
53
+ for (const [label, text] of [["Title", panel.title], ["Action", panel.action], ["Dialogue", panel.dialogue], ["Camera", panel.camera], ["Notes", panel.notes]]) {
54
+ if (!text)
55
+ continue;
56
+ const title = label === "Title";
57
+ ctx.font = title ? "700 14px sans-serif" : "14px sans-serif";
58
+ for (const line of wrap(ctx, title ? text : `${label}: ${text}`, cellWidth))
59
+ lines.push({ text: line, title });
60
+ }
61
+ const parts = Math.max(1, Math.ceil(lines.length / lineCapacity));
62
+ for (let part = 0; part < parts; part++)
63
+ cells.push({ panelIndex, part: part + 1, parts, lines: lines.slice(part * lineCapacity, (part + 1) * lineCapacity) });
64
+ });
65
+ const perPage = columns * rows, pages = [];
66
+ for (let start = 0; start < cells.length; start += perPage)
67
+ pages.push(cells.slice(start, start + perPage));
68
+ if (!pages.length)
69
+ pages.push([]);
70
+ return { pageWidth, pageHeight, margin, gutter, columns, rows, captionHeight, bodyTop, cellWidth, cellHeight, artHeight, titleLines, pages };
71
+ }
72
+ //# sourceMappingURL=sheet-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet-layout.js","sourceRoot":"","sources":["../../../src/export/sheet-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { SheetOptions } from "../model/types.js";
2
+ import { type RenderSource } from "../render/panel-renderer.js";
3
+ export declare function exportStoryboard(source: RenderSource, outputDir: string, sheet?: SheetOptions): Promise<{
4
+ panelFiles: string[];
5
+ pdfFile: string;
6
+ pageCount: number;
7
+ }>;
8
+ //# sourceMappingURL=storyboard-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-export.d.ts","sourceRoot":"","sources":["../../../src/export/storyboard-export.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGnF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,YAAiB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAC,MAAM,CAAA;CAAE,CAAC,CAgD9K"}
@@ -0,0 +1,76 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { Canvas } from "skia-canvas";
4
+ import { StoryboardProject } from "../core/project.js";
5
+ import { renderPanelCanvas } from "../render/panel-renderer.js";
6
+ import { layoutStoryboard } from "./sheet-layout.js";
7
+ export async function exportStoryboard(source, outputDir, sheet = {}) {
8
+ const document = source instanceof StoryboardProject ? source.toJSON() : structuredClone(source);
9
+ const layout = layoutStoryboard(document, sheet);
10
+ const { pageWidth, pageHeight, margin, gutter, columns, bodyTop, cellWidth, cellHeight, artHeight, pages, titleLines } = layout;
11
+ const panelsDir = join(outputDir, "panels");
12
+ await mkdir(panelsDir, { recursive: true });
13
+ const panelImages = [];
14
+ const panelFiles = [];
15
+ const pdf = new Canvas(pageWidth, pageHeight);
16
+ try {
17
+ for (let i = 0; i < document.panels.length; i++) {
18
+ const file = join(panelsDir, `${String(i + 1).padStart(3, "0")}-${document.panels[i].id.replace(/[^a-z0-9_-]/gi, "-")}.png`);
19
+ const panel = document.panels[i];
20
+ const artwork = renderPanelCanvas(document, panel.id, { frame: panel.startFrame + Math.floor(panel.durationFrames * .6) });
21
+ const image = new Canvas(panel.width, panel.height);
22
+ panelImages.push(image);
23
+ try {
24
+ image.getContext("2d").drawImage(artwork, 0, 0);
25
+ await writeFile(file, await artwork.toBuffer("png"));
26
+ panelFiles.push(file);
27
+ }
28
+ finally {
29
+ artwork.getContext("2d").reset();
30
+ }
31
+ }
32
+ for (const [pageIndex, cells] of pages.entries()) {
33
+ const ctx = pageIndex === 0 ? pdf.getContext("2d") : pdf.newPage(pageWidth, pageHeight);
34
+ ctx.fillStyle = "#f4f0e7";
35
+ ctx.fillRect(0, 0, pageWidth, pageHeight);
36
+ ctx.fillStyle = "#1e1d1a";
37
+ ctx.font = "700 25px sans-serif";
38
+ titleLines.forEach((line, i) => ctx.fillText(line, margin, 30 + i * 30));
39
+ ctx.font = "15px sans-serif";
40
+ ctx.textAlign = "right";
41
+ ctx.fillText(`Page ${pageIndex + 1} / ${pages.length}`, pageWidth - margin, 30);
42
+ ctx.textAlign = "left";
43
+ for (const [slot, cell] of cells.entries()) {
44
+ const panel = document.panels[cell.panelIndex];
45
+ const x = margin + (slot % columns) * (cellWidth + gutter), y = bodyTop + Math.floor(slot / columns) * (cellHeight + gutter);
46
+ const scale = Math.min(cellWidth / panel.width, artHeight / panel.height), width = panel.width * scale, height = panel.height * scale;
47
+ ctx.fillStyle = "#ffffff";
48
+ ctx.fillRect(x, y, cellWidth, artHeight);
49
+ ctx.drawImage(panelImages[cell.panelIndex], x + (cellWidth - width) / 2, y + (artHeight - height) / 2, width, height);
50
+ ctx.strokeStyle = "#292722";
51
+ ctx.lineWidth = 2;
52
+ ctx.strokeRect(x, y, cellWidth, artHeight);
53
+ ctx.fillStyle = "#292722";
54
+ ctx.font = "700 16px sans-serif";
55
+ ctx.fillText(`${panel.number} · ${panel.durationFrames}f${cell.parts > 1 ? ` · text ${cell.part}/${cell.parts}` : ""}`, x, y + artHeight + 22);
56
+ cell.lines.forEach((line, i) => {
57
+ ctx.font = line.title ? "700 14px sans-serif" : "14px sans-serif";
58
+ ctx.fillText(line.text, x, y + artHeight + 43 + i * 18);
59
+ });
60
+ ctx.fillStyle = "#5a554b";
61
+ ctx.font = "12px sans-serif";
62
+ ctx.fillText(`rev ${panel.revision} · start ${panel.startFrame}f`, x, y + cellHeight - 8);
63
+ }
64
+ }
65
+ const pdfFile = join(outputDir, "storyboard.pdf");
66
+ await writeFile(pdfFile, await pdf.toBuffer("pdf"));
67
+ return { panelFiles, pdfFile, pageCount: pages.length };
68
+ }
69
+ finally {
70
+ for (const page of pdf.pages)
71
+ page.reset();
72
+ for (const image of panelImages)
73
+ image.getContext("2d").reset();
74
+ }
75
+ }
76
+ //# sourceMappingURL=storyboard-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyboard-export.js","sourceRoot":"","sources":["../../../src/export/storyboard-export.ts"],"names":[],"mappings":"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"}