@underpostnet/cyberia 3.3.73 → 3.3.77

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 (269) hide show
  1. package/.env.example +17 -5
  2. package/.github/workflows/coverall.cyberia.ci.yml +10 -0
  3. package/.github/workflows/docker-image.cyberia-client.ci.yml +1 -1
  4. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +1 -1
  5. package/.github/workflows/docker-image.cyberia-server.ci.yml +1 -1
  6. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +1 -1
  7. package/.github/workflows/docker-image.engine-cyberia.ci.yml +1 -1
  8. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +1 -1
  9. package/.github/workflows/engine-cyberia.ci.yml +1 -1
  10. package/.github/workflows/publish.cyberia.ci.yml +44 -0
  11. package/AGENTS.md +61 -12
  12. package/CHANGELOG.md +159 -161
  13. package/CLI-HELP.md +20 -13
  14. package/Dockerfile +1 -1
  15. package/Dockerfile.dev +1 -1
  16. package/Dockerfile.test +2 -2
  17. package/README.md +28 -28
  18. package/bin/build.js +96 -21
  19. package/bin/cyberia.js +1247 -1373
  20. package/bin/index.js +1247 -1373
  21. package/compose.env +17 -5
  22. package/conf.js +7 -4
  23. package/deploy/cyberia-client/deploy.sh +10 -11
  24. package/deploy/cyberia-client/package.sh +0 -1
  25. package/deploy/cyberia-client/state.sh +3 -2
  26. package/deploy/cyberia-server/deploy.sh +10 -11
  27. package/deploy/cyberia-server/package.sh +0 -1
  28. package/deploy/cyberia-server/state.sh +3 -2
  29. package/deploy/dd-cyberia/deploy.sh +5 -5
  30. package/deploy/dd-cyberia/init.sh +15 -14
  31. package/deploy/dd-cyberia/package.sh +0 -1
  32. package/deploy/dd-cyberia/state.sh +2 -2
  33. package/deploy/dd-cyberia/sync-deploy.sh +139 -75
  34. package/deploy/lib/config.sh +29 -0
  35. package/deploy/lib/github-actions-logging.sh +92 -76
  36. package/deploy/lib/host.sh +28 -19
  37. package/deploy/lib/state.sh +4 -1
  38. package/deploy/pwa-microservices-template/deploy.sh +10 -8
  39. package/deploy/release/deploy.sh +0 -2
  40. package/deployment.yaml +1 -1
  41. package/docker-compose.yml +23 -17
  42. package/docs/coverage/cyberia/api/cyberia-instance/cyberia-fallback-capture.js.html +1591 -0
  43. package/docs/coverage/cyberia/api/cyberia-instance/index.html +116 -0
  44. package/docs/coverage/cyberia/api/cyberia-server-defaults/cyberia-server-defaults.js.html +4138 -0
  45. package/docs/coverage/cyberia/api/cyberia-server-defaults/index.html +116 -0
  46. package/docs/coverage/cyberia/api/object-layer/index.html +116 -0
  47. package/docs/coverage/cyberia/api/object-layer/object-layer.model.js.html +1393 -0
  48. package/docs/coverage/cyberia/base.css +362 -0
  49. package/docs/coverage/cyberia/block-navigation.js +82 -0
  50. package/docs/coverage/cyberia/favicon.png +0 -0
  51. package/docs/coverage/cyberia/index.html +161 -0
  52. package/docs/coverage/cyberia/prettify.css +101 -0
  53. package/docs/coverage/cyberia/prettify.js +937 -0
  54. package/docs/coverage/cyberia/projects/cyberia/atlas-sprite-sheet-generator.js.html +1315 -0
  55. package/docs/coverage/cyberia/projects/cyberia/index.html +176 -0
  56. package/docs/coverage/cyberia/projects/cyberia/instance-backup.js.html +715 -0
  57. package/docs/coverage/cyberia/projects/cyberia/instance-data.js.html +2182 -0
  58. package/docs/coverage/cyberia/projects/cyberia/shape-generator.js.html +3265 -0
  59. package/docs/coverage/cyberia/projects/cyberia/stat-balance.js.html +328 -0
  60. package/docs/coverage/cyberia/sort-arrow-sprite.png +0 -0
  61. package/docs/coverage/cyberia/sorter.js +205 -0
  62. package/hardhat/package-lock.json +2 -2
  63. package/hardhat/package.json +1 -1
  64. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  65. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +1 -1
  66. package/manifests/deployment/dd-cyberia-development/deployment.yaml +1 -1
  67. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  68. package/manifests/deployment/mongo-express/deployment.yaml +46 -27
  69. package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
  70. package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
  71. package/manifests/deployment/mongo-express/service.yaml +16 -0
  72. package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
  73. package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
  74. package/package.json +19 -17
  75. package/scripts/test-monitor.sh +3 -3
  76. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +14 -9
  77. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
  78. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  79. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +88 -184
  80. package/src/api/cyberia-action/cyberia-action.router.js +2 -2
  81. package/src/api/cyberia-action/cyberia-action.service.js +3 -4
  82. package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
  83. package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
  84. package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
  85. package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
  86. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -3
  87. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
  88. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +12 -34
  89. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +15 -32
  90. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
  91. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  92. package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
  93. package/src/api/cyberia-entity/cyberia-entity.service.js +1 -1
  94. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
  95. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
  96. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +16 -1
  97. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +466 -3
  98. package/src/api/cyberia-instance/cyberia-fallback-capture.js +87 -51
  99. package/src/api/cyberia-instance/cyberia-fallback-world.js +21 -40
  100. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
  101. package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
  102. package/src/api/cyberia-instance/cyberia-instance-map.service.js +34 -141
  103. package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -4
  104. package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
  105. package/src/api/cyberia-instance/cyberia-instance.router.js +3 -16
  106. package/src/api/cyberia-instance/cyberia-instance.service.js +3 -43
  107. package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
  108. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
  109. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +74 -1
  110. package/src/api/cyberia-map/cyberia-map.service.js +6 -2
  111. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
  112. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
  113. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
  114. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
  115. package/src/api/cyberia-quest/cyberia-quest.router.js +3 -3
  116. package/src/api/cyberia-quest/cyberia-quest.service.js +3 -3
  117. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
  118. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -188
  119. package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
  120. package/src/api/file/file.ref.js +153 -0
  121. package/src/api/file/file.ref.json +11 -2
  122. package/src/api/object-layer/object-layer.model.js +47 -12
  123. package/src/api/object-layer/object-layer.router.js +10 -3
  124. package/src/api/object-layer/object-layer.service.js +113 -120
  125. package/src/cli/app.js +12 -1
  126. package/src/cli/client.js +2 -2
  127. package/src/cli/cluster.js +80 -18
  128. package/src/cli/deploy.js +215 -34
  129. package/src/cli/docker-compose.js +1 -1
  130. package/src/cli/fs-selection.js +115 -0
  131. package/src/cli/fs.js +158 -342
  132. package/src/cli/index.js +22 -10
  133. package/src/cli/release.js +3 -1
  134. package/src/cli/repository.js +35 -9
  135. package/src/cli/run.js +80 -199
  136. package/src/cli/test.js +4 -0
  137. package/src/cli/wireguard.js +32 -31
  138. package/src/client/components/core/Badge.js +0 -1
  139. package/src/client/components/core/CssCore.js +8 -1
  140. package/src/client/components/core/Docs.js +77 -100
  141. package/src/client/components/core/Modal.js +77 -23
  142. package/src/client/components/core/ToolTip.js +15 -0
  143. package/src/client/components/cryptokoyn/AppShellCryptokoyn.js +0 -2
  144. package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
  145. package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
  146. package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
  147. package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
  148. package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
  149. package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
  150. package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
  151. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
  152. package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
  153. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +0 -34
  154. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
  155. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
  156. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +0 -4
  157. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
  158. package/src/client/components/default/AppShellDefault.js +1 -4
  159. package/src/client/components/itemledger/AppShellItemledger.js +0 -2
  160. package/src/client/components/underpost/AppShellUnderpost.js +1 -1
  161. package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
  162. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +280 -24
  163. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
  164. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
  165. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
  166. package/src/client/public/cyberia-docs/CYBERIA.md +28 -28
  167. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
  168. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  169. package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
  170. package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
  171. package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
  172. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
  173. package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
  174. package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
  175. package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
  176. package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
  177. package/src/client/services/object-layer/object-layer.management.js +6 -10
  178. package/src/client/services/object-layer/object-layer.service.js +3 -1
  179. package/src/client/ssr/views/Cyberia404.js +3 -3
  180. package/src/client-builder/client-build-docs.js +52 -52
  181. package/src/client-builder/client-build.js +67 -44
  182. package/src/client-builder/client-bundle.js +347 -0
  183. package/src/db/mongo/MongoExpress.js +187 -0
  184. package/src/grpc/cyberia/grpc-server.js +5 -7
  185. package/src/index.js +1 -1
  186. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +143 -146
  187. package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
  188. package/src/projects/cyberia/besu-genesis-generator.js +5 -14
  189. package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
  190. package/src/projects/cyberia/catalog-cyberia.js +3 -2
  191. package/src/projects/cyberia/gemini-client.js +3 -3
  192. package/src/projects/cyberia/generate-saga.js +4 -11
  193. package/src/projects/cyberia/hot-reload-trigger.js +17 -28
  194. package/src/projects/cyberia/instance-backup.js +210 -0
  195. package/src/projects/cyberia/instance-data.js +177 -257
  196. package/src/projects/cyberia/map-preview-generator.js +32 -68
  197. package/src/projects/cyberia/object-layer.js +152 -319
  198. package/src/projects/cyberia/seed-audio.js +139 -0
  199. package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
  200. package/src/projects/cyberia/semantic-layer-generator.js +2 -18
  201. package/src/projects/cyberia/stat-balance.js +81 -0
  202. package/src/projects/cyberia/stat-commands.js +23 -0
  203. package/src/projects/cyberia/stat-contract-generator.js +101 -0
  204. package/src/runtime/cyberia-client/Dockerfile +8 -4
  205. package/src/runtime/cyberia-client/Dockerfile.dev +5 -2
  206. package/src/runtime/cyberia-server/Dockerfile +9 -2
  207. package/src/runtime/cyberia-server/Dockerfile.dev +8 -1
  208. package/src/runtime/engine-cyberia/Dockerfile +1 -1
  209. package/src/runtime/engine-cyberia/Dockerfile.dev +1 -1
  210. package/src/runtime/engine-cyberia/Dockerfile.test +2 -2
  211. package/src/runtime/engine-cyberia/compose.env +17 -5
  212. package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
  213. package/src/server/build/coverage.js +113 -42
  214. package/src/server/build/package.js +55 -12
  215. package/src/server/build/testing.js +59 -9
  216. package/src/server/network/middlewares.js +8 -2
  217. package/src/server/network/underpost-gateway.js +113 -14
  218. package/src/server/ops/logger.js +70 -35
  219. package/src/server/runtime/conf.js +40 -9
  220. package/src/server/runtime/start.js +11 -2
  221. package/src/server/storage/data-query.js +16 -0
  222. package/src/server/storage/downloader.js +62 -14
  223. package/src/server/storage/zip.js +153 -0
  224. package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
  225. package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
  226. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +34 -0
  227. package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
  228. package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
  229. package/test/integration/app/cyberia/cyberia-instance-conf-defaults.test.js +16 -22
  230. package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
  231. package/test/integration/app/cyberia/cyberia-load.test.js +6 -7
  232. package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
  233. package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
  234. package/test/integration/app/cyberia/fallback-world-capture.test.js +87 -2
  235. package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
  236. package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
  237. package/test/integration/app/cyberia/seed-audio.test.js +275 -0
  238. package/test/integration/infra/2-network/wireguard-cli.test.js +33 -9
  239. package/test/integration/infra/2-network/wireguard-edge.test.js +58 -18
  240. package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
  241. package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
  242. package/test/integration/infra/4-ingress/underpost-ingress.test.js +1 -1
  243. package/test/unit/catalog.test.js +13 -2
  244. package/test/unit/client-build-docs.test.js +97 -70
  245. package/test/unit/client-bundle.test.js +313 -0
  246. package/test/unit/conf-resolution.test.js +58 -7
  247. package/test/unit/coverage-artifact.test.js +120 -29
  248. package/test/unit/cyberia/instance-backup.test.js +183 -0
  249. package/test/unit/cyberia/instance-data.test.js +314 -0
  250. package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
  251. package/test/unit/cyberia/publish-workflow.test.js +22 -0
  252. package/test/unit/cyberia/stat-balance.test.js +69 -0
  253. package/test/unit/deploy-legacy-gateway-sweep.test.js +63 -0
  254. package/test/unit/deploy-log-table.test.js +76 -5
  255. package/test/unit/downloader-integrity.test.js +98 -0
  256. package/test/unit/file-reference-registry.test.js +141 -0
  257. package/test/unit/fs-storage-paths.test.js +596 -0
  258. package/test/unit/gateway-pod-fetch.test.js +95 -0
  259. package/test/unit/letsencrypt-issuer.test.js +101 -0
  260. package/test/unit/logger-redaction.test.js +29 -0
  261. package/test/unit/package.test.js +70 -16
  262. package/test/unit/prepare-host.test.js +84 -1
  263. package/test/unit/release-bump.test.js +3 -1
  264. package/test/unit/start-options.test.js +12 -0
  265. package/test/unit/test-tiers.test.js +27 -0
  266. package/test/unit/zip-archive.test.js +142 -0
  267. package/vitest.config.js +11 -3
  268. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
  269. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
@@ -0,0 +1,3265 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for projects/cyberia/shape-generator.js</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">projects/cyberia</a> shape-generator.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">88% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>440/500</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">82.44% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>202/245</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">88.88% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>40/45</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">88.81% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>405/456</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a>
908
+ <a name='L843'></a><a href='#L843'>843</a>
909
+ <a name='L844'></a><a href='#L844'>844</a>
910
+ <a name='L845'></a><a href='#L845'>845</a>
911
+ <a name='L846'></a><a href='#L846'>846</a>
912
+ <a name='L847'></a><a href='#L847'>847</a>
913
+ <a name='L848'></a><a href='#L848'>848</a>
914
+ <a name='L849'></a><a href='#L849'>849</a>
915
+ <a name='L850'></a><a href='#L850'>850</a>
916
+ <a name='L851'></a><a href='#L851'>851</a>
917
+ <a name='L852'></a><a href='#L852'>852</a>
918
+ <a name='L853'></a><a href='#L853'>853</a>
919
+ <a name='L854'></a><a href='#L854'>854</a>
920
+ <a name='L855'></a><a href='#L855'>855</a>
921
+ <a name='L856'></a><a href='#L856'>856</a>
922
+ <a name='L857'></a><a href='#L857'>857</a>
923
+ <a name='L858'></a><a href='#L858'>858</a>
924
+ <a name='L859'></a><a href='#L859'>859</a>
925
+ <a name='L860'></a><a href='#L860'>860</a>
926
+ <a name='L861'></a><a href='#L861'>861</a>
927
+ <a name='L862'></a><a href='#L862'>862</a>
928
+ <a name='L863'></a><a href='#L863'>863</a>
929
+ <a name='L864'></a><a href='#L864'>864</a>
930
+ <a name='L865'></a><a href='#L865'>865</a>
931
+ <a name='L866'></a><a href='#L866'>866</a>
932
+ <a name='L867'></a><a href='#L867'>867</a>
933
+ <a name='L868'></a><a href='#L868'>868</a>
934
+ <a name='L869'></a><a href='#L869'>869</a>
935
+ <a name='L870'></a><a href='#L870'>870</a>
936
+ <a name='L871'></a><a href='#L871'>871</a>
937
+ <a name='L872'></a><a href='#L872'>872</a>
938
+ <a name='L873'></a><a href='#L873'>873</a>
939
+ <a name='L874'></a><a href='#L874'>874</a>
940
+ <a name='L875'></a><a href='#L875'>875</a>
941
+ <a name='L876'></a><a href='#L876'>876</a>
942
+ <a name='L877'></a><a href='#L877'>877</a>
943
+ <a name='L878'></a><a href='#L878'>878</a>
944
+ <a name='L879'></a><a href='#L879'>879</a>
945
+ <a name='L880'></a><a href='#L880'>880</a>
946
+ <a name='L881'></a><a href='#L881'>881</a>
947
+ <a name='L882'></a><a href='#L882'>882</a>
948
+ <a name='L883'></a><a href='#L883'>883</a>
949
+ <a name='L884'></a><a href='#L884'>884</a>
950
+ <a name='L885'></a><a href='#L885'>885</a>
951
+ <a name='L886'></a><a href='#L886'>886</a>
952
+ <a name='L887'></a><a href='#L887'>887</a>
953
+ <a name='L888'></a><a href='#L888'>888</a>
954
+ <a name='L889'></a><a href='#L889'>889</a>
955
+ <a name='L890'></a><a href='#L890'>890</a>
956
+ <a name='L891'></a><a href='#L891'>891</a>
957
+ <a name='L892'></a><a href='#L892'>892</a>
958
+ <a name='L893'></a><a href='#L893'>893</a>
959
+ <a name='L894'></a><a href='#L894'>894</a>
960
+ <a name='L895'></a><a href='#L895'>895</a>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a>
967
+ <a name='L902'></a><a href='#L902'>902</a>
968
+ <a name='L903'></a><a href='#L903'>903</a>
969
+ <a name='L904'></a><a href='#L904'>904</a>
970
+ <a name='L905'></a><a href='#L905'>905</a>
971
+ <a name='L906'></a><a href='#L906'>906</a>
972
+ <a name='L907'></a><a href='#L907'>907</a>
973
+ <a name='L908'></a><a href='#L908'>908</a>
974
+ <a name='L909'></a><a href='#L909'>909</a>
975
+ <a name='L910'></a><a href='#L910'>910</a>
976
+ <a name='L911'></a><a href='#L911'>911</a>
977
+ <a name='L912'></a><a href='#L912'>912</a>
978
+ <a name='L913'></a><a href='#L913'>913</a>
979
+ <a name='L914'></a><a href='#L914'>914</a>
980
+ <a name='L915'></a><a href='#L915'>915</a>
981
+ <a name='L916'></a><a href='#L916'>916</a>
982
+ <a name='L917'></a><a href='#L917'>917</a>
983
+ <a name='L918'></a><a href='#L918'>918</a>
984
+ <a name='L919'></a><a href='#L919'>919</a>
985
+ <a name='L920'></a><a href='#L920'>920</a>
986
+ <a name='L921'></a><a href='#L921'>921</a>
987
+ <a name='L922'></a><a href='#L922'>922</a>
988
+ <a name='L923'></a><a href='#L923'>923</a>
989
+ <a name='L924'></a><a href='#L924'>924</a>
990
+ <a name='L925'></a><a href='#L925'>925</a>
991
+ <a name='L926'></a><a href='#L926'>926</a>
992
+ <a name='L927'></a><a href='#L927'>927</a>
993
+ <a name='L928'></a><a href='#L928'>928</a>
994
+ <a name='L929'></a><a href='#L929'>929</a>
995
+ <a name='L930'></a><a href='#L930'>930</a>
996
+ <a name='L931'></a><a href='#L931'>931</a>
997
+ <a name='L932'></a><a href='#L932'>932</a>
998
+ <a name='L933'></a><a href='#L933'>933</a>
999
+ <a name='L934'></a><a href='#L934'>934</a>
1000
+ <a name='L935'></a><a href='#L935'>935</a>
1001
+ <a name='L936'></a><a href='#L936'>936</a>
1002
+ <a name='L937'></a><a href='#L937'>937</a>
1003
+ <a name='L938'></a><a href='#L938'>938</a>
1004
+ <a name='L939'></a><a href='#L939'>939</a>
1005
+ <a name='L940'></a><a href='#L940'>940</a>
1006
+ <a name='L941'></a><a href='#L941'>941</a>
1007
+ <a name='L942'></a><a href='#L942'>942</a>
1008
+ <a name='L943'></a><a href='#L943'>943</a>
1009
+ <a name='L944'></a><a href='#L944'>944</a>
1010
+ <a name='L945'></a><a href='#L945'>945</a>
1011
+ <a name='L946'></a><a href='#L946'>946</a>
1012
+ <a name='L947'></a><a href='#L947'>947</a>
1013
+ <a name='L948'></a><a href='#L948'>948</a>
1014
+ <a name='L949'></a><a href='#L949'>949</a>
1015
+ <a name='L950'></a><a href='#L950'>950</a>
1016
+ <a name='L951'></a><a href='#L951'>951</a>
1017
+ <a name='L952'></a><a href='#L952'>952</a>
1018
+ <a name='L953'></a><a href='#L953'>953</a>
1019
+ <a name='L954'></a><a href='#L954'>954</a>
1020
+ <a name='L955'></a><a href='#L955'>955</a>
1021
+ <a name='L956'></a><a href='#L956'>956</a>
1022
+ <a name='L957'></a><a href='#L957'>957</a>
1023
+ <a name='L958'></a><a href='#L958'>958</a>
1024
+ <a name='L959'></a><a href='#L959'>959</a>
1025
+ <a name='L960'></a><a href='#L960'>960</a>
1026
+ <a name='L961'></a><a href='#L961'>961</a>
1027
+ <a name='L962'></a><a href='#L962'>962</a>
1028
+ <a name='L963'></a><a href='#L963'>963</a>
1029
+ <a name='L964'></a><a href='#L964'>964</a>
1030
+ <a name='L965'></a><a href='#L965'>965</a>
1031
+ <a name='L966'></a><a href='#L966'>966</a>
1032
+ <a name='L967'></a><a href='#L967'>967</a>
1033
+ <a name='L968'></a><a href='#L968'>968</a>
1034
+ <a name='L969'></a><a href='#L969'>969</a>
1035
+ <a name='L970'></a><a href='#L970'>970</a>
1036
+ <a name='L971'></a><a href='#L971'>971</a>
1037
+ <a name='L972'></a><a href='#L972'>972</a>
1038
+ <a name='L973'></a><a href='#L973'>973</a>
1039
+ <a name='L974'></a><a href='#L974'>974</a>
1040
+ <a name='L975'></a><a href='#L975'>975</a>
1041
+ <a name='L976'></a><a href='#L976'>976</a>
1042
+ <a name='L977'></a><a href='#L977'>977</a>
1043
+ <a name='L978'></a><a href='#L978'>978</a>
1044
+ <a name='L979'></a><a href='#L979'>979</a>
1045
+ <a name='L980'></a><a href='#L980'>980</a>
1046
+ <a name='L981'></a><a href='#L981'>981</a>
1047
+ <a name='L982'></a><a href='#L982'>982</a>
1048
+ <a name='L983'></a><a href='#L983'>983</a>
1049
+ <a name='L984'></a><a href='#L984'>984</a>
1050
+ <a name='L985'></a><a href='#L985'>985</a>
1051
+ <a name='L986'></a><a href='#L986'>986</a>
1052
+ <a name='L987'></a><a href='#L987'>987</a>
1053
+ <a name='L988'></a><a href='#L988'>988</a>
1054
+ <a name='L989'></a><a href='#L989'>989</a>
1055
+ <a name='L990'></a><a href='#L990'>990</a>
1056
+ <a name='L991'></a><a href='#L991'>991</a>
1057
+ <a name='L992'></a><a href='#L992'>992</a>
1058
+ <a name='L993'></a><a href='#L993'>993</a>
1059
+ <a name='L994'></a><a href='#L994'>994</a>
1060
+ <a name='L995'></a><a href='#L995'>995</a>
1061
+ <a name='L996'></a><a href='#L996'>996</a>
1062
+ <a name='L997'></a><a href='#L997'>997</a>
1063
+ <a name='L998'></a><a href='#L998'>998</a>
1064
+ <a name='L999'></a><a href='#L999'>999</a>
1065
+ <a name='L1000'></a><a href='#L1000'>1000</a>
1066
+ <a name='L1001'></a><a href='#L1001'>1001</a>
1067
+ <a name='L1002'></a><a href='#L1002'>1002</a>
1068
+ <a name='L1003'></a><a href='#L1003'>1003</a>
1069
+ <a name='L1004'></a><a href='#L1004'>1004</a>
1070
+ <a name='L1005'></a><a href='#L1005'>1005</a>
1071
+ <a name='L1006'></a><a href='#L1006'>1006</a>
1072
+ <a name='L1007'></a><a href='#L1007'>1007</a>
1073
+ <a name='L1008'></a><a href='#L1008'>1008</a>
1074
+ <a name='L1009'></a><a href='#L1009'>1009</a>
1075
+ <a name='L1010'></a><a href='#L1010'>1010</a>
1076
+ <a name='L1011'></a><a href='#L1011'>1011</a>
1077
+ <a name='L1012'></a><a href='#L1012'>1012</a>
1078
+ <a name='L1013'></a><a href='#L1013'>1013</a>
1079
+ <a name='L1014'></a><a href='#L1014'>1014</a>
1080
+ <a name='L1015'></a><a href='#L1015'>1015</a>
1081
+ <a name='L1016'></a><a href='#L1016'>1016</a>
1082
+ <a name='L1017'></a><a href='#L1017'>1017</a>
1083
+ <a name='L1018'></a><a href='#L1018'>1018</a>
1084
+ <a name='L1019'></a><a href='#L1019'>1019</a>
1085
+ <a name='L1020'></a><a href='#L1020'>1020</a>
1086
+ <a name='L1021'></a><a href='#L1021'>1021</a>
1087
+ <a name='L1022'></a><a href='#L1022'>1022</a>
1088
+ <a name='L1023'></a><a href='#L1023'>1023</a>
1089
+ <a name='L1024'></a><a href='#L1024'>1024</a>
1090
+ <a name='L1025'></a><a href='#L1025'>1025</a>
1091
+ <a name='L1026'></a><a href='#L1026'>1026</a>
1092
+ <a name='L1027'></a><a href='#L1027'>1027</a>
1093
+ <a name='L1028'></a><a href='#L1028'>1028</a>
1094
+ <a name='L1029'></a><a href='#L1029'>1029</a>
1095
+ <a name='L1030'></a><a href='#L1030'>1030</a>
1096
+ <a name='L1031'></a><a href='#L1031'>1031</a>
1097
+ <a name='L1032'></a><a href='#L1032'>1032</a>
1098
+ <a name='L1033'></a><a href='#L1033'>1033</a>
1099
+ <a name='L1034'></a><a href='#L1034'>1034</a>
1100
+ <a name='L1035'></a><a href='#L1035'>1035</a>
1101
+ <a name='L1036'></a><a href='#L1036'>1036</a>
1102
+ <a name='L1037'></a><a href='#L1037'>1037</a>
1103
+ <a name='L1038'></a><a href='#L1038'>1038</a>
1104
+ <a name='L1039'></a><a href='#L1039'>1039</a>
1105
+ <a name='L1040'></a><a href='#L1040'>1040</a>
1106
+ <a name='L1041'></a><a href='#L1041'>1041</a>
1107
+ <a name='L1042'></a><a href='#L1042'>1042</a>
1108
+ <a name='L1043'></a><a href='#L1043'>1043</a>
1109
+ <a name='L1044'></a><a href='#L1044'>1044</a>
1110
+ <a name='L1045'></a><a href='#L1045'>1045</a>
1111
+ <a name='L1046'></a><a href='#L1046'>1046</a>
1112
+ <a name='L1047'></a><a href='#L1047'>1047</a>
1113
+ <a name='L1048'></a><a href='#L1048'>1048</a>
1114
+ <a name='L1049'></a><a href='#L1049'>1049</a>
1115
+ <a name='L1050'></a><a href='#L1050'>1050</a>
1116
+ <a name='L1051'></a><a href='#L1051'>1051</a>
1117
+ <a name='L1052'></a><a href='#L1052'>1052</a>
1118
+ <a name='L1053'></a><a href='#L1053'>1053</a>
1119
+ <a name='L1054'></a><a href='#L1054'>1054</a>
1120
+ <a name='L1055'></a><a href='#L1055'>1055</a>
1121
+ <a name='L1056'></a><a href='#L1056'>1056</a>
1122
+ <a name='L1057'></a><a href='#L1057'>1057</a>
1123
+ <a name='L1058'></a><a href='#L1058'>1058</a>
1124
+ <a name='L1059'></a><a href='#L1059'>1059</a>
1125
+ <a name='L1060'></a><a href='#L1060'>1060</a>
1126
+ <a name='L1061'></a><a href='#L1061'>1061</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-neutral">&nbsp;</span>
1133
+ <span class="cline-any cline-neutral">&nbsp;</span>
1134
+ <span class="cline-any cline-neutral">&nbsp;</span>
1135
+ <span class="cline-any cline-neutral">&nbsp;</span>
1136
+ <span class="cline-any cline-neutral">&nbsp;</span>
1137
+ <span class="cline-any cline-neutral">&nbsp;</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-neutral">&nbsp;</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-yes">53x</span>
1145
+ <span class="cline-any cline-yes">53x</span>
1146
+ <span class="cline-any cline-yes">6868x</span>
1147
+ <span class="cline-any cline-yes">6868x</span>
1148
+ <span class="cline-any cline-yes">6868x</span>
1149
+ <span class="cline-any cline-yes">6868x</span>
1150
+ <span class="cline-any cline-yes">6868x</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-neutral">&nbsp;</span>
1155
+ <span class="cline-any cline-neutral">&nbsp;</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-neutral">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-yes">53x</span>
1162
+ <span class="cline-any cline-yes">21x</span>
1163
+ <span class="cline-any cline-yes">21x</span>
1164
+ <span class="cline-any cline-yes">220x</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-yes">21x</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-neutral">&nbsp;</span>
1174
+ <span class="cline-any cline-neutral">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-neutral">&nbsp;</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-neutral">&nbsp;</span>
1181
+ <span class="cline-any cline-yes">8x</span>
1182
+ <span class="cline-any cline-yes">8x</span>
1183
+ <span class="cline-any cline-yes">8x</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-yes">8x</span>
1187
+ <span class="cline-any cline-yes">2048x</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-yes">2048x</span>
1192
+ <span class="cline-any cline-yes">8x</span>
1193
+ <span class="cline-any cline-yes">2040x</span>
1194
+ <span class="cline-any cline-yes">2040x</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-yes">4096x</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-yes">5200x</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-yes">7800x</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-neutral">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-yes">10400x</span>
1208
+ <span class="cline-any cline-neutral">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-yes">8x</span>
1211
+ <span class="cline-any cline-yes">2600x</span>
1212
+ <span class="cline-any cline-yes">2600x</span>
1213
+ <span class="cline-any cline-yes">2600x</span>
1214
+ <span class="cline-any cline-yes">2600x</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-yes">2600x</span>
1217
+ <span class="cline-any cline-yes">2600x</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-yes">2600x</span>
1220
+ <span class="cline-any cline-yes">2600x</span>
1221
+ <span class="cline-any cline-yes">2600x</span>
1222
+ <span class="cline-any cline-yes">2600x</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-yes">2600x</span>
1225
+ <span class="cline-any cline-yes">2600x</span>
1226
+ <span class="cline-any cline-yes">2600x</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-yes">2x</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-neutral">&nbsp;</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-neutral">&nbsp;</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-neutral">&nbsp;</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-neutral">&nbsp;</span>
1258
+ <span class="cline-any cline-yes">25x</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-yes">2x</span>
1264
+ <span class="cline-any cline-yes">26013x</span>
1265
+ <span class="cline-any cline-yes">26013x</span>
1266
+ <span class="cline-any cline-yes">26013x</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
1269
+ <span class="cline-any cline-yes">2x</span>
1270
+ <span class="cline-any cline-yes">10005x</span>
1271
+ <span class="cline-any cline-yes">10005x</span>
1272
+ <span class="cline-any cline-yes">10005x</span>
1273
+ <span class="cline-any cline-yes">10005x</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-yes">2x</span>
1277
+ <span class="cline-any cline-yes">4002x</span>
1278
+ <span class="cline-any cline-yes">4002x</span>
1279
+ <span class="cline-any cline-yes">4002x</span>
1280
+ <span class="cline-any cline-yes">4002x</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-neutral">&nbsp;</span>
1283
+ <span class="cline-any cline-yes">2x</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-no">&nbsp;</span>
1289
+ <span class="cline-any cline-no">&nbsp;</span>
1290
+ <span class="cline-any cline-no">&nbsp;</span>
1291
+ <span class="cline-any cline-no">&nbsp;</span>
1292
+ <span class="cline-any cline-neutral">&nbsp;</span>
1293
+ <span class="cline-any cline-no">&nbsp;</span>
1294
+ <span class="cline-any cline-no">&nbsp;</span>
1295
+ <span class="cline-any cline-no">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-neutral">&nbsp;</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-no">&nbsp;</span>
1300
+ <span class="cline-any cline-no">&nbsp;</span>
1301
+ <span class="cline-any cline-neutral">&nbsp;</span>
1302
+ <span class="cline-any cline-neutral">&nbsp;</span>
1303
+ <span class="cline-any cline-yes">2x</span>
1304
+ <span class="cline-any cline-yes">2001x</span>
1305
+ <span class="cline-any cline-yes">2001x</span>
1306
+ <span class="cline-any cline-yes">2001x</span>
1307
+ <span class="cline-any cline-yes">2001x</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-yes">2x</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-yes">20858x</span>
1315
+ <span class="cline-any cline-yes">20858x</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-yes">20858x</span>
1318
+ <span class="cline-any cline-yes">20858x</span>
1319
+ <span class="cline-any cline-yes">20858x</span>
1320
+ <span class="cline-any cline-yes">20858x</span>
1321
+ <span class="cline-any cline-yes">20858x</span>
1322
+ <span class="cline-any cline-yes">20858x</span>
1323
+ <span class="cline-any cline-yes">20858x</span>
1324
+ <span class="cline-any cline-yes">20858x</span>
1325
+ <span class="cline-any cline-yes">20858x</span>
1326
+ <span class="cline-any cline-yes">20858x</span>
1327
+ <span class="cline-any cline-yes">20858x</span>
1328
+ <span class="cline-any cline-yes">20858x</span>
1329
+ <span class="cline-any cline-yes">20858x</span>
1330
+ <span class="cline-any cline-yes">20858x</span>
1331
+ <span class="cline-any cline-yes">20858x</span>
1332
+ <span class="cline-any cline-yes">20858x</span>
1333
+ <span class="cline-any cline-yes">20858x</span>
1334
+ <span class="cline-any cline-yes">20858x</span>
1335
+ <span class="cline-any cline-yes">20858x</span>
1336
+ <span class="cline-any cline-yes">20858x</span>
1337
+ <span class="cline-any cline-yes">20858x</span>
1338
+ <span class="cline-any cline-neutral">&nbsp;</span>
1339
+ <span class="cline-any cline-neutral">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-yes">20858x</span>
1343
+ <span class="cline-any cline-yes">20858x</span>
1344
+ <span class="cline-any cline-yes">20858x</span>
1345
+ <span class="cline-any cline-yes">20858x</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-neutral">&nbsp;</span>
1348
+ <span class="cline-any cline-yes">20858x</span>
1349
+ <span class="cline-any cline-yes">20858x</span>
1350
+ <span class="cline-any cline-yes">20858x</span>
1351
+ <span class="cline-any cline-yes">20858x</span>
1352
+ <span class="cline-any cline-yes">20858x</span>
1353
+ <span class="cline-any cline-yes">20858x</span>
1354
+ <span class="cline-any cline-yes">20858x</span>
1355
+ <span class="cline-any cline-yes">20858x</span>
1356
+ <span class="cline-any cline-yes">20858x</span>
1357
+ <span class="cline-any cline-yes">20858x</span>
1358
+ <span class="cline-any cline-yes">20858x</span>
1359
+ <span class="cline-any cline-yes">20858x</span>
1360
+ <span class="cline-any cline-neutral">&nbsp;</span>
1361
+ <span class="cline-any cline-neutral">&nbsp;</span>
1362
+ <span class="cline-any cline-yes">20858x</span>
1363
+ <span class="cline-any cline-yes">2919x</span>
1364
+ <span class="cline-any cline-yes">2919x</span>
1365
+ <span class="cline-any cline-neutral">&nbsp;</span>
1366
+ <span class="cline-any cline-neutral">&nbsp;</span>
1367
+ <span class="cline-any cline-yes">17939x</span>
1368
+ <span class="cline-any cline-yes">417x</span>
1369
+ <span class="cline-any cline-neutral">&nbsp;</span>
1370
+ <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-yes">17522x</span>
1372
+ <span class="cline-any cline-yes">1251x</span>
1373
+ <span class="cline-any cline-yes">1251x</span>
1374
+ <span class="cline-any cline-neutral">&nbsp;</span>
1375
+ <span class="cline-any cline-neutral">&nbsp;</span>
1376
+ <span class="cline-any cline-yes">16271x</span>
1377
+ <span class="cline-any cline-neutral">&nbsp;</span>
1378
+ <span class="cline-any cline-yes">209x</span>
1379
+ <span class="cline-any cline-yes">209x</span>
1380
+ <span class="cline-any cline-neutral">&nbsp;</span>
1381
+ <span class="cline-any cline-yes">209x</span>
1382
+ <span class="cline-any cline-yes">209x</span>
1383
+ <span class="cline-any cline-neutral">&nbsp;</span>
1384
+ <span class="cline-any cline-neutral">&nbsp;</span>
1385
+ <span class="cline-any cline-yes">16062x</span>
1386
+ <span class="cline-any cline-yes">833x</span>
1387
+ <span class="cline-any cline-yes">833x</span>
1388
+ <span class="cline-any cline-yes">407x</span>
1389
+ <span class="cline-any cline-neutral">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-yes">15229x</span>
1392
+ <span class="cline-any cline-yes">209x</span>
1393
+ <span class="cline-any cline-yes">209x</span>
1394
+ <span class="cline-any cline-neutral">&nbsp;</span>
1395
+ <span class="cline-any cline-neutral">&nbsp;</span>
1396
+ <span class="cline-any cline-yes">15020x</span>
1397
+ <span class="cline-any cline-yes">1251x</span>
1398
+ <span class="cline-any cline-yes">1251x</span>
1399
+ <span class="cline-any cline-neutral">&nbsp;</span>
1400
+ <span class="cline-any cline-neutral">&nbsp;</span>
1401
+ <span class="cline-any cline-yes">13769x</span>
1402
+ <span class="cline-any cline-yes">417x</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-yes">13352x</span>
1406
+ <span class="cline-any cline-yes">417x</span>
1407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-yes">12935x</span>
1410
+ <span class="cline-any cline-yes">1251x</span>
1411
+ <span class="cline-any cline-yes">1251x</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-yes">1251x</span>
1414
+ <span class="cline-any cline-yes">1251x</span>
1415
+ <span class="cline-any cline-yes">1251x</span>
1416
+ <span class="cline-any cline-yes">1251x</span>
1417
+ <span class="cline-any cline-yes">1251x</span>
1418
+ <span class="cline-any cline-neutral">&nbsp;</span>
1419
+ <span class="cline-any cline-neutral">&nbsp;</span>
1420
+ <span class="cline-any cline-yes">11684x</span>
1421
+ <span class="cline-any cline-yes">1042x</span>
1422
+ <span class="cline-any cline-yes">1042x</span>
1423
+ <span class="cline-any cline-neutral">&nbsp;</span>
1424
+ <span class="cline-any cline-yes">344x</span>
1425
+ <span class="cline-any cline-neutral">&nbsp;</span>
1426
+ <span class="cline-any cline-yes">698x</span>
1427
+ <span class="cline-any cline-neutral">&nbsp;</span>
1428
+ <span class="cline-any cline-yes">352x</span>
1429
+ <span class="cline-any cline-neutral">&nbsp;</span>
1430
+ <span class="cline-any cline-neutral">&nbsp;</span>
1431
+ <span class="cline-any cline-yes">346x</span>
1432
+ <span class="cline-any cline-neutral">&nbsp;</span>
1433
+ <span class="cline-any cline-neutral">&nbsp;</span>
1434
+ <span class="cline-any cline-yes">10642x</span>
1435
+ <span class="cline-any cline-yes">417x</span>
1436
+ <span class="cline-any cline-neutral">&nbsp;</span>
1437
+ <span class="cline-any cline-neutral">&nbsp;</span>
1438
+ <span class="cline-any cline-yes">10225x</span>
1439
+ <span class="cline-any cline-yes">417x</span>
1440
+ <span class="cline-any cline-yes">417x</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
+ <span class="cline-any cline-yes">9808x</span>
1444
+ <span class="cline-any cline-yes">313x</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-yes">9495x</span>
1447
+ <span class="cline-any cline-yes">417x</span>
1448
+ <span class="cline-any cline-yes">417x</span>
1449
+ <span class="cline-any cline-neutral">&nbsp;</span>
1450
+ <span class="cline-any cline-neutral">&nbsp;</span>
1451
+ <span class="cline-any cline-yes">9078x</span>
1452
+ <span class="cline-any cline-yes">417x</span>
1453
+ <span class="cline-any cline-neutral">&nbsp;</span>
1454
+ <span class="cline-any cline-yes">8661x</span>
1455
+ <span class="cline-any cline-yes">417x</span>
1456
+ <span class="cline-any cline-neutral">&nbsp;</span>
1457
+ <span class="cline-any cline-neutral">&nbsp;</span>
1458
+ <span class="cline-any cline-yes">8244x</span>
1459
+ <span class="cline-any cline-yes">416x</span>
1460
+ <span class="cline-any cline-yes">416x</span>
1461
+ <span class="cline-any cline-neutral">&nbsp;</span>
1462
+ <span class="cline-any cline-yes">7828x</span>
1463
+ <span class="cline-any cline-yes">313x</span>
1464
+ <span class="cline-any cline-neutral">&nbsp;</span>
1465
+ <span class="cline-any cline-neutral">&nbsp;</span>
1466
+ <span class="cline-any cline-neutral">&nbsp;</span>
1467
+ <span class="cline-any cline-yes">7515x</span>
1468
+ <span class="cline-any cline-yes">313x</span>
1469
+ <span class="cline-any cline-neutral">&nbsp;</span>
1470
+ <span class="cline-any cline-yes">7202x</span>
1471
+ <span class="cline-any cline-yes">417x</span>
1472
+ <span class="cline-any cline-yes">417x</span>
1473
+ <span class="cline-any cline-neutral">&nbsp;</span>
1474
+ <span class="cline-any cline-neutral">&nbsp;</span>
1475
+ <span class="cline-any cline-yes">6785x</span>
1476
+ <span class="cline-any cline-yes">417x</span>
1477
+ <span class="cline-any cline-neutral">&nbsp;</span>
1478
+ <span class="cline-any cline-yes">6368x</span>
1479
+ <span class="cline-any cline-yes">417x</span>
1480
+ <span class="cline-any cline-neutral">&nbsp;</span>
1481
+ <span class="cline-any cline-neutral">&nbsp;</span>
1482
+ <span class="cline-any cline-yes">5951x</span>
1483
+ <span class="cline-any cline-yes">417x</span>
1484
+ <span class="cline-any cline-yes">417x</span>
1485
+ <span class="cline-any cline-neutral">&nbsp;</span>
1486
+ <span class="cline-any cline-yes">5534x</span>
1487
+ <span class="cline-any cline-yes">312x</span>
1488
+ <span class="cline-any cline-neutral">&nbsp;</span>
1489
+ <span class="cline-any cline-neutral">&nbsp;</span>
1490
+ <span class="cline-any cline-yes">5222x</span>
1491
+ <span class="cline-any cline-yes">626x</span>
1492
+ <span class="cline-any cline-neutral">&nbsp;</span>
1493
+ <span class="cline-any cline-neutral">&nbsp;</span>
1494
+ <span class="cline-any cline-yes">4596x</span>
1495
+ <span class="cline-any cline-yes">417x</span>
1496
+ <span class="cline-any cline-neutral">&nbsp;</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</span>
1498
+ <span class="cline-any cline-neutral">&nbsp;</span>
1499
+ <span class="cline-any cline-yes">4179x</span>
1500
+ <span class="cline-any cline-yes">4179x</span>
1501
+ <span class="cline-any cline-yes">4179x</span>
1502
+ <span class="cline-any cline-neutral">&nbsp;</span>
1503
+ <span class="cline-any cline-neutral">&nbsp;</span>
1504
+ <span class="cline-any cline-neutral">&nbsp;</span>
1505
+ <span class="cline-any cline-yes">2x</span>
1506
+ <span class="cline-any cline-yes">10005x</span>
1507
+ <span class="cline-any cline-yes">10005x</span>
1508
+ <span class="cline-any cline-yes">10005x</span>
1509
+ <span class="cline-any cline-yes">10005x</span>
1510
+ <span class="cline-any cline-neutral">&nbsp;</span>
1511
+ <span class="cline-any cline-yes">10005x</span>
1512
+ <span class="cline-any cline-yes">10005x</span>
1513
+ <span class="cline-any cline-neutral">&nbsp;</span>
1514
+ <span class="cline-any cline-yes">10005x</span>
1515
+ <span class="cline-any cline-neutral">&nbsp;</span>
1516
+ <span class="cline-any cline-neutral">&nbsp;</span>
1517
+ <span class="cline-any cline-yes">10005x</span>
1518
+ <span class="cline-any cline-neutral">&nbsp;</span>
1519
+ <span class="cline-any cline-neutral">&nbsp;</span>
1520
+ <span class="cline-any cline-yes">2x</span>
1521
+ <span class="cline-any cline-neutral">&nbsp;</span>
1522
+ <span class="cline-any cline-yes">4002x</span>
1523
+ <span class="cline-any cline-yes">4002x</span>
1524
+ <span class="cline-any cline-yes">4002x</span>
1525
+ <span class="cline-any cline-neutral">&nbsp;</span>
1526
+ <span class="cline-any cline-neutral">&nbsp;</span>
1527
+ <span class="cline-any cline-yes">2x</span>
1528
+ <span class="cline-any cline-neutral">&nbsp;</span>
1529
+ <span class="cline-any cline-yes">4002x</span>
1530
+ <span class="cline-any cline-yes">4002x</span>
1531
+ <span class="cline-any cline-neutral">&nbsp;</span>
1532
+ <span class="cline-any cline-yes">4002x</span>
1533
+ <span class="cline-any cline-yes">4002x</span>
1534
+ <span class="cline-any cline-yes">4002x</span>
1535
+ <span class="cline-any cline-yes">4002x</span>
1536
+ <span class="cline-any cline-yes">4002x</span>
1537
+ <span class="cline-any cline-yes">4002x</span>
1538
+ <span class="cline-any cline-neutral">&nbsp;</span>
1539
+ <span class="cline-any cline-yes">4002x</span>
1540
+ <span class="cline-any cline-yes">4002x</span>
1541
+ <span class="cline-any cline-yes">4002x</span>
1542
+ <span class="cline-any cline-neutral">&nbsp;</span>
1543
+ <span class="cline-any cline-neutral">&nbsp;</span>
1544
+ <span class="cline-any cline-yes">2x</span>
1545
+ <span class="cline-any cline-neutral">&nbsp;</span>
1546
+ <span class="cline-any cline-yes">4002x</span>
1547
+ <span class="cline-any cline-yes">4002x</span>
1548
+ <span class="cline-any cline-yes">4002x</span>
1549
+ <span class="cline-any cline-yes">4002x</span>
1550
+ <span class="cline-any cline-yes">4002x</span>
1551
+ <span class="cline-any cline-yes">4002x</span>
1552
+ <span class="cline-any cline-yes">4002x</span>
1553
+ <span class="cline-any cline-yes">4002x</span>
1554
+ <span class="cline-any cline-neutral">&nbsp;</span>
1555
+ <span class="cline-any cline-neutral">&nbsp;</span>
1556
+ <span class="cline-any cline-yes">2x</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&nbsp;</span>
1559
+ <span class="cline-any cline-no">&nbsp;</span>
1560
+ <span class="cline-any cline-no">&nbsp;</span>
1561
+ <span class="cline-any cline-no">&nbsp;</span>
1562
+ <span class="cline-any cline-no">&nbsp;</span>
1563
+ <span class="cline-any cline-neutral">&nbsp;</span>
1564
+ <span class="cline-any cline-no">&nbsp;</span>
1565
+ <span class="cline-any cline-no">&nbsp;</span>
1566
+ <span class="cline-any cline-neutral">&nbsp;</span>
1567
+ <span class="cline-any cline-neutral">&nbsp;</span>
1568
+ <span class="cline-any cline-no">&nbsp;</span>
1569
+ <span class="cline-any cline-no">&nbsp;</span>
1570
+ <span class="cline-any cline-no">&nbsp;</span>
1571
+ <span class="cline-any cline-no">&nbsp;</span>
1572
+ <span class="cline-any cline-no">&nbsp;</span>
1573
+ <span class="cline-any cline-no">&nbsp;</span>
1574
+ <span class="cline-any cline-neutral">&nbsp;</span>
1575
+ <span class="cline-any cline-neutral">&nbsp;</span>
1576
+ <span class="cline-any cline-yes">2x</span>
1577
+ <span class="cline-any cline-neutral">&nbsp;</span>
1578
+ <span class="cline-any cline-neutral">&nbsp;</span>
1579
+ <span class="cline-any cline-no">&nbsp;</span>
1580
+ <span class="cline-any cline-no">&nbsp;</span>
1581
+ <span class="cline-any cline-no">&nbsp;</span>
1582
+ <span class="cline-any cline-no">&nbsp;</span>
1583
+ <span class="cline-any cline-no">&nbsp;</span>
1584
+ <span class="cline-any cline-no">&nbsp;</span>
1585
+ <span class="cline-any cline-neutral">&nbsp;</span>
1586
+ <span class="cline-any cline-no">&nbsp;</span>
1587
+ <span class="cline-any cline-no">&nbsp;</span>
1588
+ <span class="cline-any cline-no">&nbsp;</span>
1589
+ <span class="cline-any cline-no">&nbsp;</span>
1590
+ <span class="cline-any cline-neutral">&nbsp;</span>
1591
+ <span class="cline-any cline-neutral">&nbsp;</span>
1592
+ <span class="cline-any cline-neutral">&nbsp;</span>
1593
+ <span class="cline-any cline-neutral">&nbsp;</span>
1594
+ <span class="cline-any cline-neutral">&nbsp;</span>
1595
+ <span class="cline-any cline-neutral">&nbsp;</span>
1596
+ <span class="cline-any cline-neutral">&nbsp;</span>
1597
+ <span class="cline-any cline-neutral">&nbsp;</span>
1598
+ <span class="cline-any cline-neutral">&nbsp;</span>
1599
+ <span class="cline-any cline-neutral">&nbsp;</span>
1600
+ <span class="cline-any cline-neutral">&nbsp;</span>
1601
+ <span class="cline-any cline-neutral">&nbsp;</span>
1602
+ <span class="cline-any cline-neutral">&nbsp;</span>
1603
+ <span class="cline-any cline-neutral">&nbsp;</span>
1604
+ <span class="cline-any cline-neutral">&nbsp;</span>
1605
+ <span class="cline-any cline-neutral">&nbsp;</span>
1606
+ <span class="cline-any cline-yes">43x</span>
1607
+ <span class="cline-any cline-yes">43x</span>
1608
+ <span class="cline-any cline-yes">43x</span>
1609
+ <span class="cline-any cline-yes">86891x</span>
1610
+ <span class="cline-any cline-neutral">&nbsp;</span>
1611
+ <span class="cline-any cline-neutral">&nbsp;</span>
1612
+ <span class="cline-any cline-yes">43x</span>
1613
+ <span class="cline-any cline-yes">43x</span>
1614
+ <span class="cline-any cline-yes">43x</span>
1615
+ <span class="cline-any cline-yes">86848x</span>
1616
+ <span class="cline-any cline-yes">86848x</span>
1617
+ <span class="cline-any cline-yes">86848x</span>
1618
+ <span class="cline-any cline-neutral">&nbsp;</span>
1619
+ <span class="cline-any cline-neutral">&nbsp;</span>
1620
+ <span class="cline-any cline-yes">43x</span>
1621
+ <span class="cline-any cline-yes">43x</span>
1622
+ <span class="cline-any cline-neutral">&nbsp;</span>
1623
+ <span class="cline-any cline-no">&nbsp;</span>
1624
+ <span class="cline-any cline-no">&nbsp;</span>
1625
+ <span class="cline-any cline-neutral">&nbsp;</span>
1626
+ <span class="cline-any cline-neutral">&nbsp;</span>
1627
+ <span class="cline-any cline-neutral">&nbsp;</span>
1628
+ <span class="cline-any cline-yes">43x</span>
1629
+ <span class="cline-any cline-yes">43x</span>
1630
+ <span class="cline-any cline-yes">43x</span>
1631
+ <span class="cline-any cline-yes">43x</span>
1632
+ <span class="cline-any cline-neutral">&nbsp;</span>
1633
+ <span class="cline-any cline-yes">43x</span>
1634
+ <span class="cline-any cline-yes">5516x</span>
1635
+ <span class="cline-any cline-yes">85221x</span>
1636
+ <span class="cline-any cline-neutral">&nbsp;</span>
1637
+ <span class="cline-any cline-yes">5516x</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-yes">5516x</span>
1640
+ <span class="cline-any cline-yes">5516x</span>
1641
+ <span class="cline-any cline-yes">5516x</span>
1642
+ <span class="cline-any cline-yes">5516x</span>
1643
+ <span class="cline-any cline-yes">5516x</span>
1644
+ <span class="cline-any cline-neutral">&nbsp;</span>
1645
+ <span class="cline-any cline-neutral">&nbsp;</span>
1646
+ <span class="cline-any cline-yes">43x</span>
1647
+ <span class="cline-any cline-neutral">&nbsp;</span>
1648
+ <span class="cline-any cline-neutral">&nbsp;</span>
1649
+ <span class="cline-any cline-neutral">&nbsp;</span>
1650
+ <span class="cline-any cline-neutral">&nbsp;</span>
1651
+ <span class="cline-any cline-neutral">&nbsp;</span>
1652
+ <span class="cline-any cline-neutral">&nbsp;</span>
1653
+ <span class="cline-any cline-neutral">&nbsp;</span>
1654
+ <span class="cline-any cline-neutral">&nbsp;</span>
1655
+ <span class="cline-any cline-neutral">&nbsp;</span>
1656
+ <span class="cline-any cline-neutral">&nbsp;</span>
1657
+ <span class="cline-any cline-yes">4x</span>
1658
+ <span class="cline-any cline-neutral">&nbsp;</span>
1659
+ <span class="cline-any cline-yes">4x</span>
1660
+ <span class="cline-any cline-yes">4x</span>
1661
+ <span class="cline-any cline-yes">4x</span>
1662
+ <span class="cline-any cline-yes">700x</span>
1663
+ <span class="cline-any cline-yes">700x</span>
1664
+ <span class="cline-any cline-neutral">&nbsp;</span>
1665
+ <span class="cline-any cline-yes">4x</span>
1666
+ <span class="cline-any cline-yes">4x</span>
1667
+ <span class="cline-any cline-neutral">&nbsp;</span>
1668
+ <span class="cline-any cline-yes">4x</span>
1669
+ <span class="cline-any cline-yes">4x</span>
1670
+ <span class="cline-any cline-yes">4x</span>
1671
+ <span class="cline-any cline-yes">700x</span>
1672
+ <span class="cline-any cline-yes">700x</span>
1673
+ <span class="cline-any cline-yes">700x</span>
1674
+ <span class="cline-any cline-neutral">&nbsp;</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-neutral">&nbsp;</span>
1677
+ <span class="cline-any cline-neutral">&nbsp;</span>
1678
+ <span class="cline-any cline-neutral">&nbsp;</span>
1679
+ <span class="cline-any cline-neutral">&nbsp;</span>
1680
+ <span class="cline-any cline-neutral">&nbsp;</span>
1681
+ <span class="cline-any cline-neutral">&nbsp;</span>
1682
+ <span class="cline-any cline-neutral">&nbsp;</span>
1683
+ <span class="cline-any cline-neutral">&nbsp;</span>
1684
+ <span class="cline-any cline-neutral">&nbsp;</span>
1685
+ <span class="cline-any cline-neutral">&nbsp;</span>
1686
+ <span class="cline-any cline-neutral">&nbsp;</span>
1687
+ <span class="cline-any cline-neutral">&nbsp;</span>
1688
+ <span class="cline-any cline-neutral">&nbsp;</span>
1689
+ <span class="cline-any cline-yes">43x</span>
1690
+ <span class="cline-any cline-yes">4x</span>
1691
+ <span class="cline-any cline-yes">4x</span>
1692
+ <span class="cline-any cline-yes">4x</span>
1693
+ <span class="cline-any cline-yes">700x</span>
1694
+ <span class="cline-any cline-yes">700x</span>
1695
+ <span class="cline-any cline-neutral">&nbsp;</span>
1696
+ <span class="cline-any cline-yes">4x</span>
1697
+ <span class="cline-any cline-yes">4x</span>
1698
+ <span class="cline-any cline-yes">700x</span>
1699
+ <span class="cline-any cline-neutral">&nbsp;</span>
1700
+ <span class="cline-any cline-neutral">&nbsp;</span>
1701
+ <span class="cline-any cline-neutral">&nbsp;</span>
1702
+ <span class="cline-any cline-neutral">&nbsp;</span>
1703
+ <span class="cline-any cline-neutral">&nbsp;</span>
1704
+ <span class="cline-any cline-neutral">&nbsp;</span>
1705
+ <span class="cline-any cline-neutral">&nbsp;</span>
1706
+ <span class="cline-any cline-neutral">&nbsp;</span>
1707
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1709
+ <span class="cline-any cline-neutral">&nbsp;</span>
1710
+ <span class="cline-any cline-neutral">&nbsp;</span>
1711
+ <span class="cline-any cline-yes">42x</span>
1712
+ <span class="cline-any cline-yes">42x</span>
1713
+ <span class="cline-any cline-yes">42x</span>
1714
+ <span class="cline-any cline-yes">42x</span>
1715
+ <span class="cline-any cline-yes">42x</span>
1716
+ <span class="cline-any cline-yes">5456x</span>
1717
+ <span class="cline-any cline-yes">5456x</span>
1718
+ <span class="cline-any cline-yes">5456x</span>
1719
+ <span class="cline-any cline-yes">5456x</span>
1720
+ <span class="cline-any cline-neutral">&nbsp;</span>
1721
+ <span class="cline-any cline-yes">42x</span>
1722
+ <span class="cline-any cline-yes">42x</span>
1723
+ <span class="cline-any cline-neutral">&nbsp;</span>
1724
+ <span class="cline-any cline-yes">42x</span>
1725
+ <span class="cline-any cline-yes">42x</span>
1726
+ <span class="cline-any cline-yes">42x</span>
1727
+ <span class="cline-any cline-yes">5456x</span>
1728
+ <span class="cline-any cline-neutral">&nbsp;</span>
1729
+ <span class="cline-any cline-neutral">&nbsp;</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-neutral">&nbsp;</span>
1732
+ <span class="cline-any cline-neutral">&nbsp;</span>
1733
+ <span class="cline-any cline-neutral">&nbsp;</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-neutral">&nbsp;</span>
1736
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
+ <span class="cline-any cline-neutral">&nbsp;</span>
1738
+ <span class="cline-any cline-neutral">&nbsp;</span>
1739
+ <span class="cline-any cline-neutral">&nbsp;</span>
1740
+ <span class="cline-any cline-yes">43x</span>
1741
+ <span class="cline-any cline-yes">43x</span>
1742
+ <span class="cline-any cline-yes">43x</span>
1743
+ <span class="cline-any cline-yes">43x</span>
1744
+ <span class="cline-any cline-yes">43x</span>
1745
+ <span class="cline-any cline-yes">3075x</span>
1746
+ <span class="cline-any cline-yes">3075x</span>
1747
+ <span class="cline-any cline-yes">3075x</span>
1748
+ <span class="cline-any cline-yes">3075x</span>
1749
+ <span class="cline-any cline-neutral">&nbsp;</span>
1750
+ <span class="cline-any cline-yes">43x</span>
1751
+ <span class="cline-any cline-neutral">&nbsp;</span>
1752
+ <span class="cline-any cline-neutral">&nbsp;</span>
1753
+ <span class="cline-any cline-neutral">&nbsp;</span>
1754
+ <span class="cline-any cline-neutral">&nbsp;</span>
1755
+ <span class="cline-any cline-neutral">&nbsp;</span>
1756
+ <span class="cline-any cline-neutral">&nbsp;</span>
1757
+ <span class="cline-any cline-neutral">&nbsp;</span>
1758
+ <span class="cline-any cline-neutral">&nbsp;</span>
1759
+ <span class="cline-any cline-neutral">&nbsp;</span>
1760
+ <span class="cline-any cline-neutral">&nbsp;</span>
1761
+ <span class="cline-any cline-neutral">&nbsp;</span>
1762
+ <span class="cline-any cline-yes">3x</span>
1763
+ <span class="cline-any cline-neutral">&nbsp;</span>
1764
+ <span class="cline-any cline-neutral">&nbsp;</span>
1765
+ <span class="cline-any cline-neutral">&nbsp;</span>
1766
+ <span class="cline-any cline-neutral">&nbsp;</span>
1767
+ <span class="cline-any cline-neutral">&nbsp;</span>
1768
+ <span class="cline-any cline-neutral">&nbsp;</span>
1769
+ <span class="cline-any cline-neutral">&nbsp;</span>
1770
+ <span class="cline-any cline-neutral">&nbsp;</span>
1771
+ <span class="cline-any cline-neutral">&nbsp;</span>
1772
+ <span class="cline-any cline-neutral">&nbsp;</span>
1773
+ <span class="cline-any cline-neutral">&nbsp;</span>
1774
+ <span class="cline-any cline-neutral">&nbsp;</span>
1775
+ <span class="cline-any cline-neutral">&nbsp;</span>
1776
+ <span class="cline-any cline-neutral">&nbsp;</span>
1777
+ <span class="cline-any cline-neutral">&nbsp;</span>
1778
+ <span class="cline-any cline-neutral">&nbsp;</span>
1779
+ <span class="cline-any cline-neutral">&nbsp;</span>
1780
+ <span class="cline-any cline-neutral">&nbsp;</span>
1781
+ <span class="cline-any cline-neutral">&nbsp;</span>
1782
+ <span class="cline-any cline-yes">3814x</span>
1783
+ <span class="cline-any cline-yes">3814x</span>
1784
+ <span class="cline-any cline-yes">3814x</span>
1785
+ <span class="cline-any cline-yes">3814x</span>
1786
+ <span class="cline-any cline-yes">3814x</span>
1787
+ <span class="cline-any cline-yes">3814x</span>
1788
+ <span class="cline-any cline-neutral">&nbsp;</span>
1789
+ <span class="cline-any cline-yes">3814x</span>
1790
+ <span class="cline-any cline-yes">5403x</span>
1791
+ <span class="cline-any cline-yes">5403x</span>
1792
+ <span class="cline-any cline-yes">1589x</span>
1793
+ <span class="cline-any cline-yes">1589x</span>
1794
+ <span class="cline-any cline-yes">1042x</span>
1795
+ <span class="cline-any cline-yes">1042x</span>
1796
+ <span class="cline-any cline-neutral">&nbsp;</span>
1797
+ <span class="cline-any cline-yes">1589x</span>
1798
+ <span class="cline-any cline-yes">836x</span>
1799
+ <span class="cline-any cline-yes">836x</span>
1800
+ <span class="cline-any cline-neutral">&nbsp;</span>
1801
+ <span class="cline-any cline-neutral">&nbsp;</span>
1802
+ <span class="cline-any cline-yes">3814x</span>
1803
+ <span class="cline-any cline-neutral">&nbsp;</span>
1804
+ <span class="cline-any cline-neutral">&nbsp;</span>
1805
+ <span class="cline-any cline-neutral">&nbsp;</span>
1806
+ <span class="cline-any cline-neutral">&nbsp;</span>
1807
+ <span class="cline-any cline-neutral">&nbsp;</span>
1808
+ <span class="cline-any cline-neutral">&nbsp;</span>
1809
+ <span class="cline-any cline-neutral">&nbsp;</span>
1810
+ <span class="cline-any cline-neutral">&nbsp;</span>
1811
+ <span class="cline-any cline-neutral">&nbsp;</span>
1812
+ <span class="cline-any cline-neutral">&nbsp;</span>
1813
+ <span class="cline-any cline-neutral">&nbsp;</span>
1814
+ <span class="cline-any cline-neutral">&nbsp;</span>
1815
+ <span class="cline-any cline-neutral">&nbsp;</span>
1816
+ <span class="cline-any cline-neutral">&nbsp;</span>
1817
+ <span class="cline-any cline-neutral">&nbsp;</span>
1818
+ <span class="cline-any cline-yes">19x</span>
1819
+ <span class="cline-any cline-yes">19x</span>
1820
+ <span class="cline-any cline-neutral">&nbsp;</span>
1821
+ <span class="cline-any cline-neutral">&nbsp;</span>
1822
+ <span class="cline-any cline-yes">3816x</span>
1823
+ <span class="cline-any cline-neutral">&nbsp;</span>
1824
+ <span class="cline-any cline-neutral">&nbsp;</span>
1825
+ <span class="cline-any cline-neutral">&nbsp;</span>
1826
+ <span class="cline-any cline-neutral">&nbsp;</span>
1827
+ <span class="cline-any cline-neutral">&nbsp;</span>
1828
+ <span class="cline-any cline-yes">19x</span>
1829
+ <span class="cline-any cline-yes">19x</span>
1830
+ <span class="cline-any cline-yes">19x</span>
1831
+ <span class="cline-any cline-neutral">&nbsp;</span>
1832
+ <span class="cline-any cline-yes">19x</span>
1833
+ <span class="cline-any cline-yes">3814x</span>
1834
+ <span class="cline-any cline-yes">3814x</span>
1835
+ <span class="cline-any cline-yes">3814x</span>
1836
+ <span class="cline-any cline-neutral">&nbsp;</span>
1837
+ <span class="cline-any cline-neutral">&nbsp;</span>
1838
+ <span class="cline-any cline-yes">3814x</span>
1839
+ <span class="cline-any cline-yes">1589x</span>
1840
+ <span class="cline-any cline-neutral">&nbsp;</span>
1841
+ <span class="cline-any cline-neutral">&nbsp;</span>
1842
+ <span class="cline-any cline-yes">3814x</span>
1843
+ <span class="cline-any cline-yes">19x</span>
1844
+ <span class="cline-any cline-neutral">&nbsp;</span>
1845
+ <span class="cline-any cline-neutral">&nbsp;</span>
1846
+ <span class="cline-any cline-neutral">&nbsp;</span>
1847
+ <span class="cline-any cline-neutral">&nbsp;</span>
1848
+ <span class="cline-any cline-yes">19x</span>
1849
+ <span class="cline-any cline-yes">19x</span>
1850
+ <span class="cline-any cline-yes">19x</span>
1851
+ <span class="cline-any cline-yes">1608x</span>
1852
+ <span class="cline-any cline-yes">1608x</span>
1853
+ <span class="cline-any cline-yes">1375x</span>
1854
+ <span class="cline-any cline-yes">1375x</span>
1855
+ <span class="cline-any cline-neutral">&nbsp;</span>
1856
+ <span class="cline-any cline-neutral">&nbsp;</span>
1857
+ <span class="cline-any cline-neutral">&nbsp;</span>
1858
+ <span class="cline-any cline-yes">19x</span>
1859
+ <span class="cline-any cline-neutral">&nbsp;</span>
1860
+ <span class="cline-any cline-neutral">&nbsp;</span>
1861
+ <span class="cline-any cline-neutral">&nbsp;</span>
1862
+ <span class="cline-any cline-neutral">&nbsp;</span>
1863
+ <span class="cline-any cline-neutral">&nbsp;</span>
1864
+ <span class="cline-any cline-neutral">&nbsp;</span>
1865
+ <span class="cline-any cline-neutral">&nbsp;</span>
1866
+ <span class="cline-any cline-neutral">&nbsp;</span>
1867
+ <span class="cline-any cline-neutral">&nbsp;</span>
1868
+ <span class="cline-any cline-neutral">&nbsp;</span>
1869
+ <span class="cline-any cline-neutral">&nbsp;</span>
1870
+ <span class="cline-any cline-neutral">&nbsp;</span>
1871
+ <span class="cline-any cline-neutral">&nbsp;</span>
1872
+ <span class="cline-any cline-neutral">&nbsp;</span>
1873
+ <span class="cline-any cline-neutral">&nbsp;</span>
1874
+ <span class="cline-any cline-neutral">&nbsp;</span>
1875
+ <span class="cline-any cline-neutral">&nbsp;</span>
1876
+ <span class="cline-any cline-neutral">&nbsp;</span>
1877
+ <span class="cline-any cline-no">&nbsp;</span>
1878
+ <span class="cline-any cline-no">&nbsp;</span>
1879
+ <span class="cline-any cline-no">&nbsp;</span>
1880
+ <span class="cline-any cline-no">&nbsp;</span>
1881
+ <span class="cline-any cline-no">&nbsp;</span>
1882
+ <span class="cline-any cline-no">&nbsp;</span>
1883
+ <span class="cline-any cline-neutral">&nbsp;</span>
1884
+ <span class="cline-any cline-no">&nbsp;</span>
1885
+ <span class="cline-any cline-neutral">&nbsp;</span>
1886
+ <span class="cline-any cline-neutral">&nbsp;</span>
1887
+ <span class="cline-any cline-neutral">&nbsp;</span>
1888
+ <span class="cline-any cline-no">&nbsp;</span>
1889
+ <span class="cline-any cline-no">&nbsp;</span>
1890
+ <span class="cline-any cline-neutral">&nbsp;</span>
1891
+ <span class="cline-any cline-no">&nbsp;</span>
1892
+ <span class="cline-any cline-no">&nbsp;</span>
1893
+ <span class="cline-any cline-no">&nbsp;</span>
1894
+ <span class="cline-any cline-no">&nbsp;</span>
1895
+ <span class="cline-any cline-no">&nbsp;</span>
1896
+ <span class="cline-any cline-no">&nbsp;</span>
1897
+ <span class="cline-any cline-neutral">&nbsp;</span>
1898
+ <span class="cline-any cline-neutral">&nbsp;</span>
1899
+ <span class="cline-any cline-neutral">&nbsp;</span>
1900
+ <span class="cline-any cline-neutral">&nbsp;</span>
1901
+ <span class="cline-any cline-no">&nbsp;</span>
1902
+ <span class="cline-any cline-neutral">&nbsp;</span>
1903
+ <span class="cline-any cline-neutral">&nbsp;</span>
1904
+ <span class="cline-any cline-neutral">&nbsp;</span>
1905
+ <span class="cline-any cline-neutral">&nbsp;</span>
1906
+ <span class="cline-any cline-neutral">&nbsp;</span>
1907
+ <span class="cline-any cline-neutral">&nbsp;</span>
1908
+ <span class="cline-any cline-neutral">&nbsp;</span>
1909
+ <span class="cline-any cline-neutral">&nbsp;</span>
1910
+ <span class="cline-any cline-neutral">&nbsp;</span>
1911
+ <span class="cline-any cline-neutral">&nbsp;</span>
1912
+ <span class="cline-any cline-neutral">&nbsp;</span>
1913
+ <span class="cline-any cline-neutral">&nbsp;</span>
1914
+ <span class="cline-any cline-neutral">&nbsp;</span>
1915
+ <span class="cline-any cline-neutral">&nbsp;</span>
1916
+ <span class="cline-any cline-yes">12x</span>
1917
+ <span class="cline-any cline-yes">12x</span>
1918
+ <span class="cline-any cline-yes">12x</span>
1919
+ <span class="cline-any cline-yes">12x</span>
1920
+ <span class="cline-any cline-neutral">&nbsp;</span>
1921
+ <span class="cline-any cline-yes">12x</span>
1922
+ <span class="cline-any cline-yes">1x</span>
1923
+ <span class="cline-any cline-neutral">&nbsp;</span>
1924
+ <span class="cline-any cline-neutral">&nbsp;</span>
1925
+ <span class="cline-any cline-neutral">&nbsp;</span>
1926
+ <span class="cline-any cline-yes">11x</span>
1927
+ <span class="cline-any cline-yes">11x</span>
1928
+ <span class="cline-any cline-yes">807x</span>
1929
+ <span class="cline-any cline-neutral">&nbsp;</span>
1930
+ <span class="cline-any cline-neutral">&nbsp;</span>
1931
+ <span class="cline-any cline-yes">11x</span>
1932
+ <span class="cline-any cline-yes">11x</span>
1933
+ <span class="cline-any cline-yes">182x</span>
1934
+ <span class="cline-any cline-yes">182x</span>
1935
+ <span class="cline-any cline-yes">3316x</span>
1936
+ <span class="cline-any cline-neutral">&nbsp;</span>
1937
+ <span class="cline-any cline-yes">182x</span>
1938
+ <span class="cline-any cline-neutral">&nbsp;</span>
1939
+ <span class="cline-any cline-yes">11x</span>
1940
+ <span class="cline-any cline-neutral">&nbsp;</span>
1941
+ <span class="cline-any cline-neutral">&nbsp;</span>
1942
+ <span class="cline-any cline-neutral">&nbsp;</span>
1943
+ <span class="cline-any cline-neutral">&nbsp;</span>
1944
+ <span class="cline-any cline-neutral">&nbsp;</span>
1945
+ <span class="cline-any cline-neutral">&nbsp;</span>
1946
+ <span class="cline-any cline-neutral">&nbsp;</span>
1947
+ <span class="cline-any cline-neutral">&nbsp;</span>
1948
+ <span class="cline-any cline-neutral">&nbsp;</span>
1949
+ <span class="cline-any cline-neutral">&nbsp;</span>
1950
+ <span class="cline-any cline-neutral">&nbsp;</span>
1951
+ <span class="cline-any cline-neutral">&nbsp;</span>
1952
+ <span class="cline-any cline-neutral">&nbsp;</span>
1953
+ <span class="cline-any cline-neutral">&nbsp;</span>
1954
+ <span class="cline-any cline-neutral">&nbsp;</span>
1955
+ <span class="cline-any cline-neutral">&nbsp;</span>
1956
+ <span class="cline-any cline-neutral">&nbsp;</span>
1957
+ <span class="cline-any cline-neutral">&nbsp;</span>
1958
+ <span class="cline-any cline-neutral">&nbsp;</span>
1959
+ <span class="cline-any cline-neutral">&nbsp;</span>
1960
+ <span class="cline-any cline-neutral">&nbsp;</span>
1961
+ <span class="cline-any cline-neutral">&nbsp;</span>
1962
+ <span class="cline-any cline-neutral">&nbsp;</span>
1963
+ <span class="cline-any cline-neutral">&nbsp;</span>
1964
+ <span class="cline-any cline-neutral">&nbsp;</span>
1965
+ <span class="cline-any cline-neutral">&nbsp;</span>
1966
+ <span class="cline-any cline-neutral">&nbsp;</span>
1967
+ <span class="cline-any cline-neutral">&nbsp;</span>
1968
+ <span class="cline-any cline-neutral">&nbsp;</span>
1969
+ <span class="cline-any cline-neutral">&nbsp;</span>
1970
+ <span class="cline-any cline-neutral">&nbsp;</span>
1971
+ <span class="cline-any cline-neutral">&nbsp;</span>
1972
+ <span class="cline-any cline-neutral">&nbsp;</span>
1973
+ <span class="cline-any cline-neutral">&nbsp;</span>
1974
+ <span class="cline-any cline-neutral">&nbsp;</span>
1975
+ <span class="cline-any cline-neutral">&nbsp;</span>
1976
+ <span class="cline-any cline-neutral">&nbsp;</span>
1977
+ <span class="cline-any cline-neutral">&nbsp;</span>
1978
+ <span class="cline-any cline-neutral">&nbsp;</span>
1979
+ <span class="cline-any cline-neutral">&nbsp;</span>
1980
+ <span class="cline-any cline-neutral">&nbsp;</span>
1981
+ <span class="cline-any cline-neutral">&nbsp;</span>
1982
+ <span class="cline-any cline-neutral">&nbsp;</span>
1983
+ <span class="cline-any cline-neutral">&nbsp;</span>
1984
+ <span class="cline-any cline-neutral">&nbsp;</span>
1985
+ <span class="cline-any cline-neutral">&nbsp;</span>
1986
+ <span class="cline-any cline-neutral">&nbsp;</span>
1987
+ <span class="cline-any cline-neutral">&nbsp;</span>
1988
+ <span class="cline-any cline-neutral">&nbsp;</span>
1989
+ <span class="cline-any cline-neutral">&nbsp;</span>
1990
+ <span class="cline-any cline-neutral">&nbsp;</span>
1991
+ <span class="cline-any cline-neutral">&nbsp;</span>
1992
+ <span class="cline-any cline-neutral">&nbsp;</span>
1993
+ <span class="cline-any cline-neutral">&nbsp;</span>
1994
+ <span class="cline-any cline-neutral">&nbsp;</span>
1995
+ <span class="cline-any cline-neutral">&nbsp;</span>
1996
+ <span class="cline-any cline-neutral">&nbsp;</span>
1997
+ <span class="cline-any cline-neutral">&nbsp;</span>
1998
+ <span class="cline-any cline-neutral">&nbsp;</span>
1999
+ <span class="cline-any cline-neutral">&nbsp;</span>
2000
+ <span class="cline-any cline-neutral">&nbsp;</span>
2001
+ <span class="cline-any cline-neutral">&nbsp;</span>
2002
+ <span class="cline-any cline-neutral">&nbsp;</span>
2003
+ <span class="cline-any cline-neutral">&nbsp;</span>
2004
+ <span class="cline-any cline-neutral">&nbsp;</span>
2005
+ <span class="cline-any cline-neutral">&nbsp;</span>
2006
+ <span class="cline-any cline-neutral">&nbsp;</span>
2007
+ <span class="cline-any cline-neutral">&nbsp;</span>
2008
+ <span class="cline-any cline-neutral">&nbsp;</span>
2009
+ <span class="cline-any cline-neutral">&nbsp;</span>
2010
+ <span class="cline-any cline-neutral">&nbsp;</span>
2011
+ <span class="cline-any cline-neutral">&nbsp;</span>
2012
+ <span class="cline-any cline-neutral">&nbsp;</span>
2013
+ <span class="cline-any cline-neutral">&nbsp;</span>
2014
+ <span class="cline-any cline-neutral">&nbsp;</span>
2015
+ <span class="cline-any cline-neutral">&nbsp;</span>
2016
+ <span class="cline-any cline-neutral">&nbsp;</span>
2017
+ <span class="cline-any cline-neutral">&nbsp;</span>
2018
+ <span class="cline-any cline-neutral">&nbsp;</span>
2019
+ <span class="cline-any cline-neutral">&nbsp;</span>
2020
+ <span class="cline-any cline-neutral">&nbsp;</span>
2021
+ <span class="cline-any cline-neutral">&nbsp;</span>
2022
+ <span class="cline-any cline-neutral">&nbsp;</span>
2023
+ <span class="cline-any cline-yes">45x</span>
2024
+ <span class="cline-any cline-yes">45x</span>
2025
+ <span class="cline-any cline-yes">1x</span>
2026
+ <span class="cline-any cline-yes">1x</span>
2027
+ <span class="cline-any cline-neutral">&nbsp;</span>
2028
+ <span class="cline-any cline-neutral">&nbsp;</span>
2029
+ <span class="cline-any cline-neutral">&nbsp;</span>
2030
+ <span class="cline-any cline-neutral">&nbsp;</span>
2031
+ <span class="cline-any cline-neutral">&nbsp;</span>
2032
+ <span class="cline-any cline-neutral">&nbsp;</span>
2033
+ <span class="cline-any cline-neutral">&nbsp;</span>
2034
+ <span class="cline-any cline-neutral">&nbsp;</span>
2035
+ <span class="cline-any cline-neutral">&nbsp;</span>
2036
+ <span class="cline-any cline-neutral">&nbsp;</span>
2037
+ <span class="cline-any cline-neutral">&nbsp;</span>
2038
+ <span class="cline-any cline-neutral">&nbsp;</span>
2039
+ <span class="cline-any cline-neutral">&nbsp;</span>
2040
+ <span class="cline-any cline-neutral">&nbsp;</span>
2041
+ <span class="cline-any cline-neutral">&nbsp;</span>
2042
+ <span class="cline-any cline-neutral">&nbsp;</span>
2043
+ <span class="cline-any cline-yes">44x</span>
2044
+ <span class="cline-any cline-neutral">&nbsp;</span>
2045
+ <span class="cline-any cline-neutral">&nbsp;</span>
2046
+ <span class="cline-any cline-yes">44x</span>
2047
+ <span class="cline-any cline-yes">44x</span>
2048
+ <span class="cline-any cline-yes">44x</span>
2049
+ <span class="cline-any cline-neutral">&nbsp;</span>
2050
+ <span class="cline-any cline-yes">45x</span>
2051
+ <span class="cline-any cline-yes">20x</span>
2052
+ <span class="cline-any cline-yes">1x</span>
2053
+ <span class="cline-any cline-yes">1x</span>
2054
+ <span class="cline-any cline-yes">19x</span>
2055
+ <span class="cline-any cline-yes">18x</span>
2056
+ <span class="cline-any cline-yes">18x</span>
2057
+ <span class="cline-any cline-neutral">&nbsp;</span>
2058
+ <span class="cline-any cline-neutral">&nbsp;</span>
2059
+ <span class="cline-any cline-yes">1x</span>
2060
+ <span class="cline-any cline-yes">1x</span>
2061
+ <span class="cline-any cline-neutral">&nbsp;</span>
2062
+ <span class="cline-any cline-yes">20x</span>
2063
+ <span class="cline-any cline-yes">1x</span>
2064
+ <span class="cline-any cline-neutral">&nbsp;</span>
2065
+ <span class="cline-any cline-neutral">&nbsp;</span>
2066
+ <span class="cline-any cline-neutral">&nbsp;</span>
2067
+ <span class="cline-any cline-neutral">&nbsp;</span>
2068
+ <span class="cline-any cline-neutral">&nbsp;</span>
2069
+ <span class="cline-any cline-yes">43x</span>
2070
+ <span class="cline-any cline-neutral">&nbsp;</span>
2071
+ <span class="cline-any cline-neutral">&nbsp;</span>
2072
+ <span class="cline-any cline-yes">45x</span>
2073
+ <span class="cline-any cline-yes">45x</span>
2074
+ <span class="cline-any cline-neutral">&nbsp;</span>
2075
+ <span class="cline-any cline-neutral">&nbsp;</span>
2076
+ <span class="cline-any cline-yes">45x</span>
2077
+ <span class="cline-any cline-yes">45x</span>
2078
+ <span class="cline-any cline-yes">8x</span>
2079
+ <span class="cline-any cline-neutral">&nbsp;</span>
2080
+ <span class="cline-any cline-neutral">&nbsp;</span>
2081
+ <span class="cline-any cline-neutral">&nbsp;</span>
2082
+ <span class="cline-any cline-yes">43x</span>
2083
+ <span class="cline-any cline-yes">45x</span>
2084
+ <span class="cline-any cline-neutral">&nbsp;</span>
2085
+ <span class="cline-any cline-neutral">&nbsp;</span>
2086
+ <span class="cline-any cline-yes">86891x</span>
2087
+ <span class="cline-any cline-neutral">&nbsp;</span>
2088
+ <span class="cline-any cline-neutral">&nbsp;</span>
2089
+ <span class="cline-any cline-yes">45x</span>
2090
+ <span class="cline-any cline-neutral">&nbsp;</span>
2091
+ <span class="cline-any cline-neutral">&nbsp;</span>
2092
+ <span class="cline-any cline-yes">45x</span>
2093
+ <span class="cline-any cline-neutral">&nbsp;</span>
2094
+ <span class="cline-any cline-neutral">&nbsp;</span>
2095
+ <span class="cline-any cline-yes">45x</span>
2096
+ <span class="cline-any cline-yes">4x</span>
2097
+ <span class="cline-any cline-neutral">&nbsp;</span>
2098
+ <span class="cline-any cline-neutral">&nbsp;</span>
2099
+ <span class="cline-any cline-neutral">&nbsp;</span>
2100
+ <span class="cline-any cline-yes">43x</span>
2101
+ <span class="cline-any cline-yes">8x</span>
2102
+ <span class="cline-any cline-yes">8x</span>
2103
+ <span class="cline-any cline-yes">1300x</span>
2104
+ <span class="cline-any cline-yes">1300x</span>
2105
+ <span class="cline-any cline-yes">1300x</span>
2106
+ <span class="cline-any cline-yes">1300x</span>
2107
+ <span class="cline-any cline-neutral">&nbsp;</span>
2108
+ <span class="cline-any cline-neutral">&nbsp;</span>
2109
+ <span class="cline-any cline-neutral">&nbsp;</span>
2110
+ <span class="cline-any cline-neutral">&nbsp;</span>
2111
+ <span class="cline-any cline-yes">43x</span>
2112
+ <span class="cline-any cline-yes">1360x</span>
2113
+ <span class="cline-any cline-neutral">&nbsp;</span>
2114
+ <span class="cline-any cline-neutral">&nbsp;</span>
2115
+ <span class="cline-any cline-neutral">&nbsp;</span>
2116
+ <span class="cline-any cline-neutral">&nbsp;</span>
2117
+ <span class="cline-any cline-neutral">&nbsp;</span>
2118
+ <span class="cline-any cline-neutral">&nbsp;</span>
2119
+ <span class="cline-any cline-yes">43x</span>
2120
+ <span class="cline-any cline-yes">42x</span>
2121
+ <span class="cline-any cline-neutral">&nbsp;</span>
2122
+ <span class="cline-any cline-neutral">&nbsp;</span>
2123
+ <span class="cline-any cline-neutral">&nbsp;</span>
2124
+ <span class="cline-any cline-yes">43x</span>
2125
+ <span class="cline-any cline-yes">19x</span>
2126
+ <span class="cline-any cline-neutral">&nbsp;</span>
2127
+ <span class="cline-any cline-neutral">&nbsp;</span>
2128
+ <span class="cline-any cline-yes">19x</span>
2129
+ <span class="cline-any cline-no">&nbsp;</span>
2130
+ <span class="cline-any cline-neutral">&nbsp;</span>
2131
+ <span class="cline-any cline-neutral">&nbsp;</span>
2132
+ <span class="cline-any cline-neutral">&nbsp;</span>
2133
+ <span class="cline-any cline-yes">19x</span>
2134
+ <span class="cline-any cline-neutral">&nbsp;</span>
2135
+ <span class="cline-any cline-yes">19x</span>
2136
+ <span class="cline-any cline-neutral">&nbsp;</span>
2137
+ <span class="cline-any cline-neutral">&nbsp;</span>
2138
+ <span class="cline-any cline-neutral">&nbsp;</span>
2139
+ <span class="cline-any cline-neutral">&nbsp;</span>
2140
+ <span class="cline-any cline-neutral">&nbsp;</span>
2141
+ <span class="cline-any cline-neutral">&nbsp;</span>
2142
+ <span class="cline-any cline-neutral">&nbsp;</span>
2143
+ <span class="cline-any cline-neutral">&nbsp;</span>
2144
+ <span class="cline-any cline-neutral">&nbsp;</span>
2145
+ <span class="cline-any cline-neutral">&nbsp;</span>
2146
+ <span class="cline-any cline-neutral">&nbsp;</span>
2147
+ <span class="cline-any cline-neutral">&nbsp;</span>
2148
+ <span class="cline-any cline-yes">19x</span>
2149
+ <span class="cline-any cline-neutral">&nbsp;</span>
2150
+ <span class="cline-any cline-yes">19x</span>
2151
+ <span class="cline-any cline-neutral">&nbsp;</span>
2152
+ <span class="cline-any cline-neutral">&nbsp;</span>
2153
+ <span class="cline-any cline-neutral">&nbsp;</span>
2154
+ <span class="cline-any cline-yes">1700x</span>
2155
+ <span class="cline-any cline-neutral">&nbsp;</span>
2156
+ <span class="cline-any cline-neutral">&nbsp;</span>
2157
+ <span class="cline-any cline-neutral">&nbsp;</span>
2158
+ <span class="cline-any cline-neutral">&nbsp;</span>
2159
+ <span class="cline-any cline-neutral">&nbsp;</span>
2160
+ <span class="cline-any cline-yes">24x</span>
2161
+ <span class="cline-any cline-neutral">&nbsp;</span>
2162
+ <span class="cline-any cline-yes">24x</span>
2163
+ <span class="cline-any cline-neutral">&nbsp;</span>
2164
+ <span class="cline-any cline-neutral">&nbsp;</span>
2165
+ <span class="cline-any cline-neutral">&nbsp;</span>
2166
+ <span class="cline-any cline-neutral">&nbsp;</span>
2167
+ <span class="cline-any cline-neutral">&nbsp;</span>
2168
+ <span class="cline-any cline-neutral">&nbsp;</span>
2169
+ <span class="cline-any cline-neutral">&nbsp;</span>
2170
+ <span class="cline-any cline-neutral">&nbsp;</span>
2171
+ <span class="cline-any cline-neutral">&nbsp;</span>
2172
+ <span class="cline-any cline-neutral">&nbsp;</span>
2173
+ <span class="cline-any cline-yes">24x</span>
2174
+ <span class="cline-any cline-neutral">&nbsp;</span>
2175
+ <span class="cline-any cline-yes">24x</span>
2176
+ <span class="cline-any cline-neutral">&nbsp;</span>
2177
+ <span class="cline-any cline-neutral">&nbsp;</span>
2178
+ <span class="cline-any cline-neutral">&nbsp;</span>
2179
+ <span class="cline-any cline-neutral">&nbsp;</span>
2180
+ <span class="cline-any cline-neutral">&nbsp;</span>
2181
+ <span class="cline-any cline-neutral">&nbsp;</span>
2182
+ <span class="cline-any cline-neutral">&nbsp;</span>
2183
+ <span class="cline-any cline-neutral">&nbsp;</span>
2184
+ <span class="cline-any cline-yes">2x</span>
2185
+ <span class="cline-any cline-neutral">&nbsp;</span>
2186
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
2187
+ * Parametric shape generator with procedural noise, seeded RNG, and arc-length resampling.
2188
+ * Exports a single pure function `generateShape` that returns ordered contour points.
2189
+ * @module src/projects/cyberia/shape-generator.js
2190
+ * @namespace ShapeGenerator
2191
+ */
2192
+ &nbsp;
2193
+ /* ═══════════════════════════════════════════════════════════════════════════
2194
+ * SEEDED PRNG – Mulberry32 (32-bit, fast, deterministic)
2195
+ * ═══════════════════════════════════════════════════════════════════════════ */
2196
+ &nbsp;
2197
+ /**
2198
+ * Creates a seeded pseudo-random number generator (Mulberry32).
2199
+ * @param {number} seed - Integer seed value.
2200
+ * @returns {function(): number} Returns a function that yields 0..1 on each call.
2201
+ * @memberof ShapeGenerator
2202
+ */
2203
+ export function createRng(seed) {
2204
+ let s = seed | 0;
2205
+ return function () {
2206
+ s |= 0;
2207
+ s = (s + 0x6d2b79f5) | 0;
2208
+ let t = Math.imul(s ^ (s &gt;&gt;&gt; 15), 1 | s);
2209
+ t = (t + Math.imul(t ^ (t &gt;&gt;&gt; 7), 61 | t)) ^ t;
2210
+ return ((t ^ (t &gt;&gt;&gt; 14)) &gt;&gt;&gt; 0) / 4294967296;
2211
+ };
2212
+ }
2213
+ &nbsp;
2214
+ /**
2215
+ * Converts an arbitrary seed (string or number) into a 32-bit integer.
2216
+ * @param {number|string} seed
2217
+ * @returns {number}
2218
+ * @memberof ShapeGenerator
2219
+ */
2220
+ export function seedToInt(seed) {
2221
+ if (typeof seed === 'number') return seed | 0;
2222
+ let h = 0;
2223
+ for (let i = 0; i &lt; seed.length; i++) {
2224
+ h = (Math.imul(31, h) + seed.charCodeAt(i)) | 0;
2225
+ }
2226
+ return h;
2227
+ }
2228
+ &nbsp;
2229
+ /* ═══════════════════════════════════════════════════════════════════════════
2230
+ * SIMPLEX-LIKE 2-D NOISE (value noise with smooth interpolation)
2231
+ * ═══════════════════════════════════════════════════════════════════════════ */
2232
+ &nbsp;
2233
+ /**
2234
+ * Creates a 2D value-noise function seeded by the provided RNG.
2235
+ * Uses smooth Hermite interpolation for organic feel.
2236
+ * @param {function(): number} rng - Seeded random number generator.
2237
+ * @returns {function(number, number): number} Noise function returning -1..1.
2238
+ * @memberof ShapeGenerator
2239
+ */
2240
+ export function createNoise2D(rng) {
2241
+ const SIZE = 256;
2242
+ const perm = new Uint8Array(SIZE * 2);
2243
+ const grad = new Float64Array(SIZE);
2244
+ &nbsp;
2245
+ // Fill gradient table
2246
+ for (let i = 0; i &lt; SIZE; i++) {
2247
+ grad[i] = rng() * 2 - 1;
2248
+ }
2249
+ &nbsp;
2250
+ // Fill permutation table
2251
+ const p = Array.from({ length: SIZE }, (_, i) =&gt; i);
2252
+ for (let i = SIZE - 1; i &gt; 0; i--) {
2253
+ const j = (rng() * (i + 1)) | 0;
2254
+ [p[i], p[j]] = [p[j], p[i]];
2255
+ }
2256
+ for (let i = 0; i &lt; SIZE * 2; i++) perm[i] = p[i &amp; (SIZE - 1)];
2257
+ &nbsp;
2258
+ function fade(t) {
2259
+ return t * t * t * (t * (t * 6 - 15) + 10);
2260
+ }
2261
+ &nbsp;
2262
+ function lerp(a, b, t) {
2263
+ return a + t * (b - a);
2264
+ }
2265
+ &nbsp;
2266
+ function hash(ix, iy) {
2267
+ return perm[(perm[ix &amp; (SIZE - 1)] + iy) &amp; (SIZE - 1)];
2268
+ }
2269
+ &nbsp;
2270
+ return function noise2D(x, y) {
2271
+ const ix = Math.floor(x);
2272
+ const iy = Math.floor(y);
2273
+ const fx = x - ix;
2274
+ const fy = y - iy;
2275
+ &nbsp;
2276
+ const u = fade(fx);
2277
+ const v = fade(fy);
2278
+ &nbsp;
2279
+ const g00 = grad[hash(ix, iy) &amp; (SIZE - 1)];
2280
+ const g10 = grad[hash(ix + 1, iy) &amp; (SIZE - 1)];
2281
+ const g01 = grad[hash(ix, iy + 1) &amp; (SIZE - 1)];
2282
+ const g11 = grad[hash(ix + 1, iy + 1) &amp; (SIZE - 1)];
2283
+ &nbsp;
2284
+ const n0 = lerp(g00, g10, u);
2285
+ const n1 = lerp(g01, g11, u);
2286
+ return lerp(n0, n1, v);
2287
+ };
2288
+ }
2289
+ &nbsp;
2290
+ /* ═══════════════════════════════════════════════════════════════════════════
2291
+ * PARAMETRIC SHAPE REGISTRY
2292
+ * Each shape function receives (t, params) where t ∈ [0, 1]
2293
+ * and returns {x, y} in arbitrary local coordinates.
2294
+ * ═══════════════════════════════════════════════════════════════════════════ */
2295
+ &nbsp;
2296
+ /**
2297
+ * @typedef {Object} ShapePoint
2298
+ * @property {number} x
2299
+ * @property {number} y
2300
+ * @memberof ShapeGenerator
2301
+ */
2302
+ &nbsp;
2303
+ /**
2304
+ * Registry of parametric shape functions.
2305
+ * Each entry maps a key string to a function (t, params) → {x, y}.
2306
+ * @type {Object&lt;string, function(number, Object): ShapePoint&gt;}
2307
+ * @memberof ShapeGenerator
2308
+ */
2309
+ const shapeRegistry = {};
2310
+ &nbsp;
2311
+ /**
2312
+ * Registers a new parametric shape function.
2313
+ * @param {string} key - Unique shape identifier.
2314
+ * @param {function(number, Object): ShapePoint} fn - Parametric function.
2315
+ * @memberof ShapeGenerator
2316
+ */
2317
+ export function registerShape(key, fn) {
2318
+ shapeRegistry[key] = fn;
2319
+ }
2320
+ &nbsp;
2321
+ // ---- Built-in shapes -------------------------------------------------------
2322
+ &nbsp;
2323
+ registerShape('circle', (t, params) =&gt; {
2324
+ const r = params.r ?? 1;
2325
+ const angle = t * Math.PI * 2;
2326
+ return { x: r * Math.cos(angle), y: r * Math.sin(angle) };
2327
+ });
2328
+ &nbsp;
2329
+ registerShape('ellipse', (t, params) =&gt; {
2330
+ const a = params.a ?? 1;
2331
+ const b = params.b ?? 0.6;
2332
+ const angle = t * Math.PI * 2;
2333
+ return { x: a * Math.cos(angle), y: b * Math.sin(angle) };
2334
+ });
2335
+ &nbsp;
2336
+ registerShape('parabola', (t, params) =&gt; {
2337
+ const a = params.a ?? 1;
2338
+ const rangeX = params.rangeX ?? 2;
2339
+ const x = (t - 0.5) * rangeX;
2340
+ return { x, y: a * x * x };
2341
+ });
2342
+ &nbsp;
2343
+ registerShape('thick-parabola', <span class="fstat-no" title="function not covered" >(t</span>, params) =&gt; {
2344
+ // Closed parabolic band — traces the outer curve forward then the inner
2345
+ // curve backward, producing a thick filled crescent when rasterized.
2346
+ // `a` controls curvature, `rangeX` controls horizontal span, and
2347
+ // `thickness` controls band width (vertical gap between outer/inner).
2348
+ const a = <span class="cstat-no" title="statement not covered" >params.a ?? 0.6;</span>
2349
+ const rangeX = <span class="cstat-no" title="statement not covered" >params.rangeX ?? 2.0;</span>
2350
+ const thickness = <span class="cstat-no" title="statement not covered" >params.thickness ?? 0.35;</span>
2351
+ <span class="cstat-no" title="statement not covered" > if (t &lt;= 0.5) {</span>
2352
+ // Outer parabola (forward: left → right)
2353
+ const u = <span class="cstat-no" title="statement not covered" >t * 2;</span>
2354
+ const xNorm = <span class="cstat-no" title="statement not covered" >-rangeX + 2 * rangeX * u;</span>
2355
+ <span class="cstat-no" title="statement not covered" > return { x: xNorm, y: a * xNorm * xNorm };</span>
2356
+ }
2357
+ // Inner parabola (reverse: right → left, shifted up by thickness)
2358
+ const u = <span class="cstat-no" title="statement not covered" >1 - (t - 0.5) * 2;</span>
2359
+ const xNorm = <span class="cstat-no" title="statement not covered" >-rangeX + 2 * rangeX * u;</span>
2360
+ <span class="cstat-no" title="statement not covered" > return { x: xNorm, y: a * xNorm * xNorm + thickness };</span>
2361
+ });
2362
+ &nbsp;
2363
+ registerShape('heart', (t) =&gt; {
2364
+ const angle = t * Math.PI * 2;
2365
+ const x = 16 * Math.pow(Math.sin(angle), 3);
2366
+ const y = 13 * Math.cos(angle) - 5 * Math.cos(2 * angle) - 2 * Math.cos(3 * angle) - Math.cos(4 * angle);
2367
+ return { x: x / 17, y: -y / 17 }; // normalize roughly to -1..1 and flip y
2368
+ });
2369
+ &nbsp;
2370
+ registerShape('skull-bone', (t) =&gt; {
2371
+ // Skull-and-crossbones: cranium dome, two eyes, nose V, mouth with teeth,
2372
+ // goatee/chin, jaw, flattened X-bones with knobs.
2373
+ // All segment endpoints are carefully matched so there are no stray diagonal lines.
2374
+ const PI = Math.PI;
2375
+ const mix = (ax, ay, bx, by, f) =&gt; ({ x: ax + (bx - ax) * f, y: ay + (by - ay) * f });
2376
+ &nbsp;
2377
+ const crR = 0.6; // cranium radius
2378
+ const crCY = -0.1; // cranium vertical center (shifted up a bit for room)
2379
+ const eyeR = 0.13; // eye socket radius
2380
+ const eyeY = 0.01; // eye socket center Y
2381
+ const eyeRX = 0.22; // right eye center X
2382
+ const eyeLX = -0.22; // left eye center X
2383
+ const noseY = 0.27; // nose tip Y
2384
+ const mouthY = 0.38; // mouth line Y
2385
+ const mouthW = 0.22; // mouth half-width
2386
+ const teethN = 3; // number of teeth
2387
+ const goateeY = 0.52; // goatee tip Y
2388
+ const goateeW = 0.08; // goatee half-width at top
2389
+ const jawW = 0.34; // jaw half-width
2390
+ const jawY = 0.46; // jaw bottom Y
2391
+ const boneStartY = 0.56; // bone origin Y (just below jaw)
2392
+ const crossY = 0.68; // bone crossing Y (flatter — closer to start/end)
2393
+ const endY = 0.78; // bone knob center Y (much closer to crossY)
2394
+ const boneX = 0.52; // bone knob spread X (wider for flatter angle)
2395
+ const knob = 0.06; // knob radius
2396
+ const crA0 = PI * 1.15; // cranium start angle (left temple)
2397
+ const crA1 = PI * 1.85; // cranium end angle (right temple)
2398
+ &nbsp;
2399
+ // Key anchor points for seamless transitions:
2400
+ // Right eye: inner-bottom at angle ~(PI*0.75) from center, outer-top at angle ~(-PI*0.35)
2401
+ // Left eye: inner-bottom at angle ~(PI*0.25) from center, outer-top at angle ~(-PI*0.65+2PI)
2402
+ const reInnerA = PI * 0.75; // right eye angle toward nose (inner-bottom)
2403
+ const reOuterA = -PI * 0.35; // right eye angle toward right temple (outer-top)
2404
+ const leInnerA = PI * 0.25; // left eye angle toward nose (inner-bottom)
2405
+ const leOuterA = PI + PI * 0.35; // left eye angle toward left temple (outer-top)
2406
+ &nbsp;
2407
+ // Precomputed anchor coords
2408
+ const rTempleX = Math.cos(crA1) * crR;
2409
+ const rTempleY = crCY + Math.sin(crA1) * crR;
2410
+ const reOuterX = eyeRX + Math.cos(reOuterA) * eyeR;
2411
+ const reOuterY = eyeY + Math.sin(reOuterA) * eyeR;
2412
+ const reInnerX = eyeRX + Math.cos(reInnerA) * eyeR;
2413
+ const reInnerY = eyeY + Math.sin(reInnerA) * eyeR;
2414
+ const leInnerX = eyeLX + Math.cos(leInnerA) * eyeR;
2415
+ const leInnerY = eyeY + Math.sin(leInnerA) * eyeR;
2416
+ const leOuterX = eyeLX + Math.cos(leOuterA) * eyeR;
2417
+ const leOuterY = eyeY + Math.sin(leOuterA) * eyeR;
2418
+ const lTempleX = Math.cos(crA0) * crR;
2419
+ const lTempleY = crCY + Math.sin(crA0) * crR;
2420
+ &nbsp;
2421
+ // 0.00–0.14 : cranium dome (left temple → top → right temple)
2422
+ if (t &lt; 0.14) {
2423
+ const a = crA0 + (t / 0.14) * (crA1 - crA0);
2424
+ return { x: Math.cos(a) * crR, y: crCY + Math.sin(a) * crR };
2425
+ }
2426
+ // 0.14–0.16 : right temple → right eye outer-top (short connector)
2427
+ if (t &lt; 0.16) {
2428
+ return mix(rTempleX, rTempleY, reOuterX, reOuterY, (t - 0.14) / 0.02);
2429
+ }
2430
+ // 0.16–0.22 : right eye socket (from outer-top, clockwise full circle back to outer-top)
2431
+ if (t &lt; 0.22) {
2432
+ const a = reOuterA - ((t - 0.16) / 0.06) * PI * 2;
2433
+ return { x: eyeRX + Math.cos(a) * eyeR, y: eyeY + Math.sin(a) * eyeR };
2434
+ }
2435
+ // 0.22–0.23 : right eye outer-top → right eye inner-bottom (short connector along bottom)
2436
+ if (t &lt; 0.23) {
2437
+ // small arc along bottom of right eye from outer to inner
2438
+ const aStart = reOuterA - PI * 2; // same as reOuterA but after full circle
2439
+ const aEnd = reInnerA;
2440
+ // go the short way: outer-top → bottom → inner-bottom
2441
+ const a = reOuterA + ((t - 0.22) / 0.01) * (reInnerA - reOuterA);
2442
+ return { x: eyeRX + Math.cos(a) * eyeR, y: eyeY + Math.sin(a) * eyeR };
2443
+ }
2444
+ // 0.23–0.27 : nose V (inner-bottom of right eye → nose tip → inner-bottom of left eye)
2445
+ if (t &lt; 0.27) {
2446
+ const s = (t - 0.23) / 0.04;
2447
+ if (s &lt; 0.5) return mix(reInnerX, reInnerY, 0, noseY, s / 0.5);
2448
+ return mix(0, noseY, leInnerX, leInnerY, (s - 0.5) / 0.5);
2449
+ }
2450
+ // 0.27–0.28 : left eye inner-bottom → left eye outer-top (short connector along bottom)
2451
+ if (t &lt; 0.28) {
2452
+ const a = leInnerA + ((t - 0.27) / 0.01) * (leOuterA - leInnerA);
2453
+ return { x: eyeLX + Math.cos(a) * eyeR, y: eyeY + Math.sin(a) * eyeR };
2454
+ }
2455
+ // 0.28–0.34 : left eye socket (from outer-top, counter-clockwise full circle)
2456
+ if (t &lt; 0.34) {
2457
+ const a = leOuterA + ((t - 0.28) / 0.06) * PI * 2;
2458
+ return { x: eyeLX + Math.cos(a) * eyeR, y: eyeY + Math.sin(a) * eyeR };
2459
+ }
2460
+ // 0.34–0.36 : left eye outer-top → left temple (short connector)
2461
+ if (t &lt; 0.36) {
2462
+ return mix(leOuterX, leOuterY, lTempleX, lTempleY, (t - 0.34) / 0.02);
2463
+ }
2464
+ // 0.36–0.38 : left temple → mouth start (travel down along left cheek to mouth)
2465
+ if (t &lt; 0.38) {
2466
+ return mix(lTempleX, lTempleY, -mouthW, mouthY, (t - 0.36) / 0.02);
2467
+ }
2468
+ // 0.38–0.44 : mouth with teeth (zigzag line from left to right)
2469
+ if (t &lt; 0.44) {
2470
+ const s = (t - 0.38) / 0.06; // 0..1 across mouth
2471
+ const x = -mouthW + s * mouthW * 2;
2472
+ // zigzag teeth: go up/down based on segment
2473
+ const toothPhase = s * teethN * 2; // each tooth = up + down
2474
+ const inTooth = toothPhase % 2;
2475
+ const toothAmp = 0.05;
2476
+ const y = mouthY + (inTooth &lt; 1 ? -toothAmp * inTooth : -toothAmp * (2 - inTooth));
2477
+ return { x, y };
2478
+ }
2479
+ // 0.44–0.49 : goatee / chin tuft (down to point and back)
2480
+ if (t &lt; 0.49) {
2481
+ const s = (t - 0.44) / 0.05;
2482
+ if (s &lt; 0.33) {
2483
+ // from mouth right end → goatee left start → down to tip
2484
+ return mix(0, mouthY + 0.04, 0, goateeY, s / 0.33);
2485
+ }
2486
+ if (s &lt; 0.66) {
2487
+ // goatee tip → back up, widening
2488
+ return mix(0, goateeY, goateeW, mouthY + 0.06, (s - 0.33) / 0.33);
2489
+ }
2490
+ // close back to center bottom
2491
+ return mix(goateeW, mouthY + 0.06, 0, jawY, (s - 0.66) / 0.34);
2492
+ }
2493
+ // 0.49–0.51 : center jaw → left jaw corner
2494
+ if (t &lt; 0.51) {
2495
+ return mix(0, jawY, -jawW, jawY, (t - 0.49) / 0.02);
2496
+ }
2497
+ // 0.51–0.53 : left jaw corner → center below jaw (bone start)
2498
+ if (t &lt; 0.53) {
2499
+ const s = (t - 0.51) / 0.02;
2500
+ return mix(-jawW, jawY, 0, boneStartY, s);
2501
+ }
2502
+ // 0.53–0.565 : left-down bone arm → left-bottom knob arc
2503
+ if (t &lt; 0.545) {
2504
+ return mix(0, boneStartY, -boneX, endY, (t - 0.53) / 0.015);
2505
+ }
2506
+ if (t &lt; 0.565) {
2507
+ const a = PI * 0.65 + ((t - 0.545) / 0.02) * PI * 1.7;
2508
+ return { x: -boneX + Math.cos(a) * knob, y: endY + Math.sin(a) * knob };
2509
+ }
2510
+ // 0.565–0.605 : left-bottom knob → cross center → right-bottom knob
2511
+ if (t &lt; 0.585) {
2512
+ return mix(-boneX, endY, 0, crossY, (t - 0.565) / 0.02);
2513
+ }
2514
+ if (t &lt; 0.605) {
2515
+ return mix(0, crossY, boneX, endY, (t - 0.585) / 0.02);
2516
+ }
2517
+ // 0.605–0.64 : right-bottom knob arc → back up to center
2518
+ if (t &lt; 0.625) {
2519
+ const a = PI * 0.35 - ((t - 0.605) / 0.02) * PI * 1.7;
2520
+ return { x: boneX + Math.cos(a) * knob, y: endY + Math.sin(a) * knob };
2521
+ }
2522
+ if (t &lt; 0.64) {
2523
+ return mix(boneX, endY, 0, boneStartY, (t - 0.625) / 0.015);
2524
+ }
2525
+ // --- second bone of the X (top-left to bottom-right, crossing the first) ---
2526
+ // 0.64–0.675 : center → left-top knob
2527
+ if (t &lt; 0.655) {
2528
+ return mix(0, boneStartY, -boneX, boneStartY, (t - 0.64) / 0.015);
2529
+ }
2530
+ if (t &lt; 0.675) {
2531
+ const a = -PI * 0.35 - ((t - 0.655) / 0.02) * PI * 1.7;
2532
+ return { x: -boneX + Math.cos(a) * knob, y: boneStartY + Math.sin(a) * knob };
2533
+ }
2534
+ // 0.675–0.715 : left-top knob → cross center → right-top knob area
2535
+ if (t &lt; 0.695) {
2536
+ return mix(-boneX, boneStartY, 0, crossY, (t - 0.675) / 0.02);
2537
+ }
2538
+ if (t &lt; 0.715) {
2539
+ return mix(0, crossY, boneX, boneStartY, (t - 0.695) / 0.02);
2540
+ }
2541
+ // 0.715–0.75 : right-top knob arc → back to center
2542
+ if (t &lt; 0.735) {
2543
+ const a = -PI * 0.65 + ((t - 0.715) / 0.02) * PI * 1.7;
2544
+ return { x: boneX + Math.cos(a) * knob, y: boneStartY + Math.sin(a) * knob };
2545
+ }
2546
+ if (t &lt; 0.75) {
2547
+ return mix(boneX, boneStartY, 0, boneStartY, (t - 0.735) / 0.015);
2548
+ }
2549
+ // 0.75–0.78 : center below jaw → right jaw corner
2550
+ if (t &lt; 0.78) {
2551
+ return mix(0, boneStartY, jawW, jawY, (t - 0.75) / 0.03);
2552
+ }
2553
+ // 0.78–0.80 : right jaw corner → right temple
2554
+ if (t &lt; 0.8) {
2555
+ return mix(jawW, jawY, rTempleX, rTempleY, (t - 0.78) / 0.02);
2556
+ }
2557
+ // 0.80–1.00 : closing arc around cranium bottom back to left temple
2558
+ {
2559
+ const s = (t - 0.8) / 0.2;
2560
+ const a = crA1 + s * (crA0 + PI * 2 - crA1);
2561
+ return { x: Math.cos(a) * crR, y: crCY + Math.sin(a) * crR };
2562
+ }
2563
+ });
2564
+ &nbsp;
2565
+ registerShape('star', (t, params) =&gt; {
2566
+ const spikes = params.spikes ?? 5;
2567
+ const outerR = params.outerR ?? 1;
2568
+ const innerR = params.innerR ?? 0.4;
2569
+ const angle = t * Math.PI * 2;
2570
+ // Alternate between outer and inner radius based on angular position
2571
+ const segAngle = Math.PI / spikes;
2572
+ const mod = ((angle % (2 * segAngle)) + 2 * segAngle) % (2 * segAngle);
2573
+ const r =
2574
+ mod &lt; segAngle
2575
+ ? outerR + (innerR - outerR) * (mod / segAngle)
2576
+ : innerR + (outerR - innerR) * ((mod - segAngle) / segAngle);
2577
+ return { x: r * Math.cos(angle), y: r * Math.sin(angle) };
2578
+ });
2579
+ &nbsp;
2580
+ registerShape('cactus', (t) =&gt; {
2581
+ // Organic cactus silhouette using additive sine harmonics
2582
+ const angle = t * Math.PI * 2;
2583
+ const r = 0.5 + 0.15 * Math.sin(3 * angle) + 0.1 * Math.sin(5 * angle) + 0.08 * Math.cos(7 * angle);
2584
+ return { x: r * Math.cos(angle), y: r * Math.sin(angle) };
2585
+ });
2586
+ &nbsp;
2587
+ registerShape('pixel-art', (t, params) =&gt; {
2588
+ // Generates a blocky pixel-art shape — a rounded square with stepped edges
2589
+ const gridSize = params.gridSize ?? 8;
2590
+ const angle = t * Math.PI * 2;
2591
+ // Superellipse (Lamé curve) for rounded-square feel
2592
+ const n = params.n ?? 4;
2593
+ const cosA = Math.cos(angle);
2594
+ const sinA = Math.sin(angle);
2595
+ const r = 1 / Math.pow(Math.pow(Math.abs(cosA), n) + Math.pow(Math.abs(sinA), n), 1 / n);
2596
+ let x = r * cosA;
2597
+ let y = r * sinA;
2598
+ // Snap to grid for pixel-art effect
2599
+ x = Math.round(x * gridSize) / gridSize;
2600
+ y = Math.round(y * gridSize) / gridSize;
2601
+ return { x, y };
2602
+ });
2603
+ &nbsp;
2604
+ registerShape('bezier-path', (t, params) =&gt; {
2605
+ // Cubic Bézier through default control points (or user-supplied)
2606
+ const p0 = params.p0 ?? { x: 0, y: 0 };
2607
+ const p1 = params.p1 ?? { x: 0.3, y: 1 };
2608
+ const p2 = params.p2 ?? { x: 0.7, y: 1 };
2609
+ const p3 = params.p3 ?? { x: 1, y: 0 };
2610
+ const u = 1 - t;
2611
+ const x = u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x;
2612
+ const y = u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y;
2613
+ return { x, y };
2614
+ });
2615
+ &nbsp;
2616
+ registerShape('regular-polygon', <span class="fstat-no" title="function not covered" >(t</span>, params) =&gt; {
2617
+ // Regular convex polygon with `sides` edges.
2618
+ // Traces straight vertex-to-vertex segments for perfect geometric figures.
2619
+ const sides = <span class="cstat-no" title="statement not covered" >Math.max(3, params.sides ?? 4);</span>
2620
+ const r = <span class="cstat-no" title="statement not covered" >params.r ?? 1;</span>
2621
+ const segAngle = <span class="cstat-no" title="statement not covered" >(2 * Math.PI) / sides;</span>
2622
+ const angle = <span class="cstat-no" title="statement not covered" >t * Math.PI * 2;</span>
2623
+ // Which segment are we in?
2624
+ const seg = <span class="cstat-no" title="statement not covered" >Math.floor(angle / segAngle);</span>
2625
+ const frac = <span class="cstat-no" title="statement not covered" >(angle - seg * segAngle) / segAngle;</span>
2626
+ // Offset: -π/2 puts first vertex at top (flat bottom for odd-sided).
2627
+ // For even-sided polygons, shift by half a segment so edges are axis-aligned.
2628
+ const offset = <span class="cstat-no" title="statement not covered" >-Math.PI / 2 + (sides % 2 === 0 ? Math.PI / sides : 0);</span>
2629
+ const a0 = <span class="cstat-no" title="statement not covered" >seg * segAngle + offset;</span>
2630
+ const a1 = <span class="cstat-no" title="statement not covered" >(seg + 1) * segAngle + offset;</span>
2631
+ const x = <span class="cstat-no" title="statement not covered" >r * ((1 - frac) * Math.cos(a0) + frac * Math.cos(a1));</span>
2632
+ const y = <span class="cstat-no" title="statement not covered" >r * ((1 - frac) * Math.sin(a0) + frac * Math.sin(a1));</span>
2633
+ <span class="cstat-no" title="statement not covered" > return { x, y };</span>
2634
+ });
2635
+ &nbsp;
2636
+ registerShape('rectangle', <span class="fstat-no" title="function not covered" >(t</span>, params) =&gt; {
2637
+ // Axis-aligned rectangle with configurable aspect ratio.
2638
+ // `width` and `height` control proportions (default: 1.4 × 1.0).
2639
+ const w = <span class="cstat-no" title="statement not covered" >params.width ?? 1.4;</span>
2640
+ const h = <span class="cstat-no" title="statement not covered" >params.height ?? 1.0;</span>
2641
+ const hw = <span class="cstat-no" title="statement not covered" >w / 2,</span>
2642
+ hh = <span class="cstat-no" title="statement not covered" >h / 2;</span>
2643
+ const perim = <span class="cstat-no" title="statement not covered" >2 * (w + h);</span>
2644
+ const d = <span class="cstat-no" title="statement not covered" >t * perim;</span>
2645
+ // Traverse: bottom-left → bottom-right → top-right → top-left
2646
+ <span class="cstat-no" title="statement not covered" > if (d &lt; w) <span class="cstat-no" title="statement not covered" >return { x: -hw + d, y: hh };</span></span>
2647
+ <span class="cstat-no" title="statement not covered" > if (d &lt; w + h) <span class="cstat-no" title="statement not covered" >return { x: hw, y: hh - (d - w) };</span></span>
2648
+ <span class="cstat-no" title="statement not covered" > if (d &lt; 2 * w + h) <span class="cstat-no" title="statement not covered" >return { x: hw - (d - w - h), y: -hh };</span></span>
2649
+ <span class="cstat-no" title="statement not covered" > return { x: -hw, y: -hh + (d - 2 * w - h) };</span>
2650
+ });
2651
+ &nbsp;
2652
+ /* ═══════════════════════════════════════════════════════════════════════════
2653
+ * GEOMETRY HELPERS
2654
+ * ═══════════════════════════════════════════════════════════════════════════ */
2655
+ &nbsp;
2656
+ /**
2657
+ * Arc-length resamples a parametric curve to produce `count` evenly-spaced points.
2658
+ * @param {function(number): ShapePoint} curveFn - Function from t→{x,y}.
2659
+ * @param {number} count - Number of output points.
2660
+ * @param {boolean} closed - If true, the curve wraps so last point connects to first.
2661
+ * @returns {ShapePoint[]}
2662
+ * @memberof ShapeGenerator
2663
+ */
2664
+ function arcLengthResample(curveFn, count, closed) {
2665
+ // 1. Sample at high resolution to build cumulative arc-length table
2666
+ const SAMPLES = Math.max(count * 8, 2000);
2667
+ const rawPoints = [];
2668
+ for (let i = 0; i &lt;= SAMPLES; i++) {
2669
+ rawPoints.push(curveFn(i / SAMPLES));
2670
+ }
2671
+ &nbsp;
2672
+ const cumLen = new Float64Array(SAMPLES + 1);
2673
+ cumLen[0] = 0;
2674
+ for (let i = 1; i &lt;= SAMPLES; i++) {
2675
+ const dx = rawPoints[i].x - rawPoints[i - 1].x;
2676
+ const dy = rawPoints[i].y - rawPoints[i - 1].y;
2677
+ cumLen[i] = cumLen[i - 1] + Math.sqrt(dx * dx + dy * dy);
2678
+ }
2679
+ &nbsp;
2680
+ const totalLen = cumLen[SAMPLES];
2681
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (totalLen === 0) {
2682
+ // Degenerate — all points overlap
2683
+ const p = <span class="cstat-no" title="statement not covered" >rawPoints[0];</span>
2684
+ <span class="cstat-no" title="statement not covered" > return Array.from({ length: count }, <span class="fstat-no" title="function not covered" >()</span> =&gt; (<span class="cstat-no" title="statement not covered" >{ x: p.x, y: p.y })</span>);</span>
2685
+ }
2686
+ &nbsp;
2687
+ // 2. Walk the arc-length table to pick `count` evenly-spaced distances
2688
+ const numSegments = closed ? count : count - 1;
2689
+ const step = totalLen / (numSegments || <span class="branch-1 cbranch-no" title="branch not covered" >1)</span>;
2690
+ const result = [];
2691
+ let idx = 0;
2692
+ &nbsp;
2693
+ for (let i = 0; i &lt; count; i++) {
2694
+ const target = i * step;
2695
+ while (idx &lt; SAMPLES - 1 &amp;&amp; cumLen[idx + 1] &lt; target) idx++;
2696
+ // Clamp so we never read past rawPoints[SAMPLES]
2697
+ const safeIdx = Math.min(idx, SAMPLES - 1);
2698
+ // Linear interpolation between safeIdx and safeIdx+1
2699
+ const segLen = cumLen[safeIdx + 1] - cumLen[safeIdx];
2700
+ const frac = segLen &gt; 0 ? (target - cumLen[safeIdx]) / segLen : 0;
2701
+ const x = rawPoints[safeIdx].x + frac * (rawPoints[safeIdx + 1].x - rawPoints[safeIdx].x);
2702
+ const y = rawPoints[safeIdx].y + frac * (rawPoints[safeIdx + 1].y - rawPoints[safeIdx].y);
2703
+ result.push({ x, y });
2704
+ }
2705
+ &nbsp;
2706
+ return result;
2707
+ }
2708
+ &nbsp;
2709
+ /**
2710
+ * Applies 2D rotation (in radians) to a set of points around their centroid.
2711
+ * @param {ShapePoint[]} points
2712
+ * @param {number} radians
2713
+ * @returns {ShapePoint[]}
2714
+ * @memberof ShapeGenerator
2715
+ */
2716
+ function rotatePoints(points, radians) {
2717
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (radians === 0) <span class="cstat-no" title="statement not covered" >return points;</span>
2718
+ // Compute centroid
2719
+ let cx = 0,
2720
+ cy = 0;
2721
+ for (const p of points) {
2722
+ cx += p.x;
2723
+ cy += p.y;
2724
+ }
2725
+ cx /= points.length;
2726
+ cy /= points.length;
2727
+ &nbsp;
2728
+ const cosR = Math.cos(radians);
2729
+ const sinR = Math.sin(radians);
2730
+ return points.map((p) =&gt; {
2731
+ const dx = p.x - cx;
2732
+ const dy = p.y - cy;
2733
+ return {
2734
+ x: cx + dx * cosR - dy * sinR,
2735
+ y: cy + dx * sinR + dy * cosR,
2736
+ };
2737
+ });
2738
+ }
2739
+ &nbsp;
2740
+ /**
2741
+ * Scales points from their centroid.
2742
+ * @param {ShapePoint[]} points
2743
+ * @param {number} sx - X scale factor.
2744
+ * @param {number} sy - Y scale factor.
2745
+ * @returns {ShapePoint[]}
2746
+ * @memberof ShapeGenerator
2747
+ */
2748
+ function scalePoints(points, sx, sy) {
2749
+ if (sx === 1 &amp;&amp; sy === 1) return points;
2750
+ let cx = 0,
2751
+ cy = 0;
2752
+ for (const p of points) {
2753
+ cx += p.x;
2754
+ cy += p.y;
2755
+ }
2756
+ cx /= points.length;
2757
+ cy /= points.length;
2758
+ return points.map((p) =&gt; ({
2759
+ x: cx + (p.x - cx) * sx,
2760
+ y: cy + (p.y - cy) * sy,
2761
+ }));
2762
+ }
2763
+ &nbsp;
2764
+ /**
2765
+ * Normalizes points into the 0..1 bounding box.
2766
+ * @param {ShapePoint[]} points
2767
+ * @returns {ShapePoint[]}
2768
+ * @memberof ShapeGenerator
2769
+ */
2770
+ function normalizePoints(points) {
2771
+ let minX = Infinity,
2772
+ minY = Infinity,
2773
+ maxX = -Infinity,
2774
+ maxY = -Infinity;
2775
+ for (const p of points) {
2776
+ if (p.x &lt; minX) minX = p.x;
2777
+ if (p.y &lt; minY) minY = p.y;
2778
+ if (p.x &gt; maxX) maxX = p.x;
2779
+ if (p.y &gt; maxY) maxY = p.y;
2780
+ }
2781
+ const rangeX = maxX - minX || <span class="branch-1 cbranch-no" title="branch not covered" >1;</span>
2782
+ const rangeY = maxY - minY || <span class="branch-1 cbranch-no" title="branch not covered" >1;</span>
2783
+ // Uniform scale to fit inside [0..1] while preserving aspect ratio
2784
+ const range = Math.max(rangeX, rangeY);
2785
+ const offsetX = (range - rangeX) / 2;
2786
+ const offsetY = (range - rangeY) / 2;
2787
+ return points.map((p) =&gt; ({
2788
+ x: (p.x - minX + offsetX) / range,
2789
+ y: (p.y - minY + offsetY) / range,
2790
+ }));
2791
+ }
2792
+ &nbsp;
2793
+ /**
2794
+ * Computes the axis-aligned bounding box for a set of points.
2795
+ * @param {ShapePoint[]} points
2796
+ * @returns {{minX: number, minY: number, maxX: number, maxY: number}}
2797
+ * @memberof ShapeGenerator
2798
+ */
2799
+ function computeBbox(points) {
2800
+ let minX = Infinity,
2801
+ minY = Infinity,
2802
+ maxX = -Infinity,
2803
+ maxY = -Infinity;
2804
+ for (const p of points) {
2805
+ if (p.x &lt; minX) minX = p.x;
2806
+ if (p.y &lt; minY) minY = p.y;
2807
+ if (p.x &gt; maxX) maxX = p.x;
2808
+ if (p.y &gt; maxY) maxY = p.y;
2809
+ }
2810
+ return { minX, minY, maxX, maxY };
2811
+ }
2812
+ &nbsp;
2813
+ /**
2814
+ * Converts normalized (0..1) points to pixel coordinates.
2815
+ * @param {ShapePoint[]} points - Normalized points.
2816
+ * @param {number} width - Target pixel width.
2817
+ * @param {number} height - Target pixel height.
2818
+ * @returns {ShapePoint[]}
2819
+ * @memberof ShapeGenerator
2820
+ */
2821
+ export function toPixelCoords(points, width, height) {
2822
+ return points.map((p) =&gt; ({
2823
+ x: p.x * width,
2824
+ y: p.y * height,
2825
+ }));
2826
+ }
2827
+ &nbsp;
2828
+ /* ═══════════════════════════════════════════════════════════════════════════
2829
+ * BRESENHAM RASTERIZATION – connected integer-grid contour
2830
+ * ═══════════════════════════════════════════════════════════════════════════ */
2831
+ &nbsp;
2832
+ /**
2833
+ * Bresenham line algorithm — returns all integer grid cells between two points.
2834
+ * @param {number} x0
2835
+ * @param {number} y0
2836
+ * @param {number} x1
2837
+ * @param {number} y1
2838
+ * @returns {ShapePoint[]}
2839
+ * @memberof ShapeGenerator
2840
+ */
2841
+ function bresenhamLine(x0, y0, x1, y1) {
2842
+ const pts = [];
2843
+ let dx = Math.abs(x1 - x0);
2844
+ let dy = -Math.abs(y1 - y0);
2845
+ const sx = x0 &lt; x1 ? 1 : -1;
2846
+ const sy = y0 &lt; y1 ? 1 : -1;
2847
+ let err = dx + dy;
2848
+ &nbsp;
2849
+ for (;;) {
2850
+ pts.push({ x: x0, y: y0 });
2851
+ if (x0 === x1 &amp;&amp; y0 === y1) break;
2852
+ const e2 = 2 * err;
2853
+ if (e2 &gt;= dy) {
2854
+ err += dy;
2855
+ x0 += sx;
2856
+ }
2857
+ if (e2 &lt;= dx) {
2858
+ err += dx;
2859
+ y0 += sy;
2860
+ }
2861
+ }
2862
+ return pts;
2863
+ }
2864
+ &nbsp;
2865
+ /**
2866
+ * Rasterizes a contour of normalized (0..1) points onto an integer grid,
2867
+ * using Bresenham lines between consecutive points so the outline is fully
2868
+ * connected — even on grids as small as 16×16.
2869
+ *
2870
+ * @param {ShapePoint[]} normalizedPoints - Points in 0..1.
2871
+ * @param {number} gridW - Grid width in cells.
2872
+ * @param {number} gridH - Grid height in cells.
2873
+ * @param {boolean} closed - Whether to connect last point back to first.
2874
+ * @returns {ShapePoint[]} Unique integer {x,y} cells ordered along the contour.
2875
+ * @memberof ShapeGenerator
2876
+ */
2877
+ function rasterizeContour(normalizedPoints, gridW, gridH, closed) {
2878
+ const maxX = gridW - 1;
2879
+ const maxY = gridH - 1;
2880
+ &nbsp;
2881
+ // Map normalized → grid integers
2882
+ const gridPts = normalizedPoints.map((p) =&gt; ({
2883
+ x: Math.round(Math.min(Math.max(p.x, 0), 1) * maxX),
2884
+ y: Math.round(Math.min(Math.max(p.y, 0), 1) * maxY),
2885
+ }));
2886
+ &nbsp;
2887
+ // Bresenham between every consecutive pair (+ wrap if closed)
2888
+ const allCells = [];
2889
+ const len = gridPts.length;
2890
+ const segments = closed ? len : len - 1;
2891
+ &nbsp;
2892
+ for (let i = 0; i &lt; segments; i++) {
2893
+ const a = gridPts[i];
2894
+ const b = gridPts[(i + 1) % len];
2895
+ const lineCells = bresenhamLine(a.x, a.y, b.x, b.y);
2896
+ // Append all except the last cell (it will be the first of the next segment)
2897
+ // to avoid trivial duplicates at joints.
2898
+ for (let j = 0; j &lt; lineCells.length - 1; j++) {
2899
+ allCells.push(lineCells[j]);
2900
+ }
2901
+ // For the very last segment, include its endpoint too
2902
+ if (i === segments - 1) {
2903
+ allCells.push(lineCells[lineCells.length - 1]);
2904
+ }
2905
+ }
2906
+ &nbsp;
2907
+ // Deduplicate while preserving contour order
2908
+ const seen = new Set();
2909
+ const unique = [];
2910
+ for (const p of allCells) {
2911
+ const k = p.x * 100000 + p.y;
2912
+ if (!seen.has(k)) {
2913
+ seen.add(k);
2914
+ unique.push(p);
2915
+ }
2916
+ }
2917
+ &nbsp;
2918
+ return unique;
2919
+ }
2920
+ &nbsp;
2921
+ /**
2922
+ * Scanline-fills the interior of a closed contour on an integer grid.
2923
+ * Takes the contour points produced by `rasterizeContour` and returns a
2924
+ * new array containing both the contour AND all interior cells.
2925
+ *
2926
+ * Uses the standard even-odd scanline algorithm: for each row, find the
2927
+ * leftmost and rightmost contour cell then fill everything in between.
2928
+ *
2929
+ * @param {ShapePoint[]} contourPoints - Contour cells from rasterizeContour.
2930
+ * @param {number} gridW - Grid width.
2931
+ * @param {number} gridH - Grid height.
2932
+ * @returns {ShapePoint[]} All unique filled cells (contour + interior).
2933
+ * @memberof ShapeGenerator
2934
+ */
2935
+ function <span class="fstat-no" title="function not covered" >scanlineFill(</span>contourPoints, gridW, gridH) {
2936
+ // Build per-row min/max from contour
2937
+ const rowBounds = <span class="cstat-no" title="statement not covered" >new Map();</span>
2938
+ <span class="cstat-no" title="statement not covered" > for (const p of contourPoints) {</span>
2939
+ const b = <span class="cstat-no" title="statement not covered" >rowBounds.get(p.y);</span>
2940
+ <span class="cstat-no" title="statement not covered" > if (b) {</span>
2941
+ <span class="cstat-no" title="statement not covered" > if (p.x &lt; b.min) <span class="cstat-no" title="statement not covered" >b.min = p.x;</span></span>
2942
+ <span class="cstat-no" title="statement not covered" > if (p.x &gt; b.max) <span class="cstat-no" title="statement not covered" >b.max = p.x;</span></span>
2943
+ } else {
2944
+ <span class="cstat-no" title="statement not covered" > rowBounds.set(p.y, { min: p.x, max: p.x });</span>
2945
+ }
2946
+ }
2947
+ &nbsp;
2948
+ const seen = <span class="cstat-no" title="statement not covered" >new Set();</span>
2949
+ const filled = <span class="cstat-no" title="statement not covered" >[];</span>
2950
+ &nbsp;
2951
+ <span class="cstat-no" title="statement not covered" > for (const [y, { min, max }] of rowBounds) {</span>
2952
+ <span class="cstat-no" title="statement not covered" > for (let x = <span class="cstat-no" title="statement not covered" >min;</span> x &lt;= max; x++) {</span>
2953
+ const k = <span class="cstat-no" title="statement not covered" >x * 100000 + y;</span>
2954
+ <span class="cstat-no" title="statement not covered" > if (!seen.has(k)) {</span>
2955
+ <span class="cstat-no" title="statement not covered" > seen.add(k);</span>
2956
+ <span class="cstat-no" title="statement not covered" > filled.push({ x, y });</span>
2957
+ }
2958
+ }
2959
+ }
2960
+ &nbsp;
2961
+ <span class="cstat-no" title="statement not covered" > return filled;</span>
2962
+ }
2963
+ &nbsp;
2964
+ /**
2965
+ * Renders an integer-coordinate ShapeResult as an ASCII grid string.
2966
+ * Useful for quick visual verification of pixel-art shapes.
2967
+ *
2968
+ * @param {ShapeResult} shapeResult - Result from generateShape with intCoords enabled.
2969
+ * @param {object} [opts] - Render options.
2970
+ * @param {string} [opts.filled='█'] - Character for filled cells.
2971
+ * @param {string} [opts.empty='·'] - Character for empty cells.
2972
+ * @returns {string} Multi-line ASCII grid.
2973
+ * @memberof ShapeGenerator
2974
+ */
2975
+ export function renderGrid(shapeResult, opts = {}) {
2976
+ const { filled = '█', empty = '·' } = opts;
2977
+ const { points, metadata } = shapeResult;
2978
+ const w = metadata.gridWidth;
2979
+ const h = metadata.gridHeight;
2980
+ &nbsp;
2981
+ if (w == null || h == null) {
2982
+ throw new Error('renderGrid requires a ShapeResult generated with intCoords enabled.');
2983
+ }
2984
+ &nbsp;
2985
+ // Build set of occupied cells
2986
+ const occupied = new Set();
2987
+ for (const p of points) {
2988
+ occupied.add(p.y * w + p.x);
2989
+ }
2990
+ &nbsp;
2991
+ const rows = [];
2992
+ for (let y = 0; y &lt; h; y++) {
2993
+ let row = '';
2994
+ for (let x = 0; x &lt; w; x++) {
2995
+ row += occupied.has(y * w + x) ? filled : empty;
2996
+ }
2997
+ rows.push(row);
2998
+ }
2999
+ return rows.join('\n');
3000
+ }
3001
+ &nbsp;
3002
+ /* ═══════════════════════════════════════════════════════════════════════════
3003
+ * MAIN PUBLIC API
3004
+ * ═══════════════════════════════════════════════════════════════════════════ */
3005
+ &nbsp;
3006
+ /**
3007
+ * @typedef {Object} ShapeOptions
3008
+ * @property {number} [count=200] - Number of XY points to generate.
3009
+ * @property {number|number[]} [scale=1] - Uniform number or [sx, sy] scale factors.
3010
+ * @property {number} [rotation=0] - Rotation in degrees.
3011
+ * @property {number} [jitter=0] - Max random offset in normalized units (0..1).
3012
+ * @property {number} [noise=0] - 0..1 strength of procedural noise displacement.
3013
+ * @property {number|string} [seed] - Seed for deterministic randomness.
3014
+ * @property {boolean} [closed=true] - Whether last point connects to the first.
3015
+ * @property {boolean} [normalize=true] - Return points in 0..1 coordinate box.
3016
+ * @property {string} [color] - RGBA or hex color metadata.
3017
+ * @property {boolean|number|number[]} [intCoords=false] - Integer pixel-art grid mode.
3018
+ * - `true` → use a grid of size `count × count` (or `count` as single dim).
3019
+ * - `number` (e.g. 16) → square grid of that size (`16×16`).
3020
+ * - `[width, height]` → rectangular grid.
3021
+ * When enabled, output points are unique integer {x,y} pairs in `0..gridW-1`
3022
+ * with Bresenham rasterization so that even on a 16×16 grid the full contour
3023
+ * is visible as a connected set of cells. `count` is ignored in this mode;
3024
+ * the number of output points equals the number of unique rasterized cells.
3025
+ * @property {boolean} [fill=false] - When true (and intCoords is enabled),
3026
+ * scanline-fills the interior of the closed contour, producing a solid
3027
+ * silhouette instead of an outline-only shape.
3028
+ * @memberof ShapeGenerator
3029
+ */
3030
+ &nbsp;
3031
+ /**
3032
+ * @typedef {Object} ShapeBbox
3033
+ * @property {number} minX
3034
+ * @property {number} minY
3035
+ * @property {number} maxX
3036
+ * @property {number} maxY
3037
+ * @memberof ShapeGenerator
3038
+ */
3039
+ &nbsp;
3040
+ /**
3041
+ * @typedef {Object} ShapeMetadata
3042
+ * @property {string} key - The shape key used.
3043
+ * @property {number} count - Number of points generated.
3044
+ * @property {number} seed - Effective integer seed used.
3045
+ * @property {string} [color] - Color metadata if provided.
3046
+ * @property {ShapeBbox} [bbox] - Bounding box of the output points.
3047
+ * @property {number} [gridWidth] - Grid width when intCoords is used.
3048
+ * @property {number} [gridHeight] - Grid height when intCoords is used.
3049
+ * @memberof ShapeGenerator
3050
+ */
3051
+ &nbsp;
3052
+ /**
3053
+ * @typedef {Object} ShapeResult
3054
+ * @property {ShapePoint[]} points - Ordered contour points.
3055
+ * @property {ShapeMetadata} metadata - Descriptive metadata about the generation.
3056
+ * @memberof ShapeGenerator
3057
+ */
3058
+ &nbsp;
3059
+ /**
3060
+ * Generates a parametric shape as an array of ordered contour points.
3061
+ *
3062
+ * @param {string} key - Shape identifier (e.g. "circle", "heart", "star").
3063
+ * @param {ShapeOptions} [options={}] - Generation options.
3064
+ * @returns {ShapeResult} The generated shape data.
3065
+ * @throws {Error} If the requested shape key is not registered.
3066
+ * @memberof ShapeGenerator
3067
+ *
3068
+ * @example
3069
+ * import { generateShape } from './shape-generator.js';
3070
+ *
3071
+ * const result = generateShape('heart', {
3072
+ * count: 300,
3073
+ * scale: 0.9,
3074
+ * rotation: 10,
3075
+ * jitter: 0.002,
3076
+ * noise: 0.15,
3077
+ * seed: 'fx-42',
3078
+ * color: 'rgba(220,20,60,1)',
3079
+ * });
3080
+ * // result.points -&gt; [{x: 0.51, y: 0.86}, ...]
3081
+ */
3082
+ export function generateShape(key, options = {}) {
3083
+ const shapeFn = shapeRegistry[key];
3084
+ if (!shapeFn) {
3085
+ const available = Object.keys(shapeRegistry).join(', ');
3086
+ throw new Error(`Unknown shape key "${key}". Available shapes: ${available}`);
3087
+ }
3088
+ &nbsp;
3089
+ // ---- Destructure options with defaults ------------------------------------
3090
+ const {
3091
+ count = 200,
3092
+ scale = 1,
3093
+ rotation = 0,
3094
+ jitter = 0,
3095
+ noise = 0,
3096
+ seed: rawSeed,
3097
+ closed = true,
3098
+ normalize = true,
3099
+ intCoords = false,
3100
+ fill = false,
3101
+ color,
3102
+ ...extraParams
3103
+ } = options;
3104
+ &nbsp;
3105
+ // ---- Parse intCoords into grid dimensions ---------------------------------
3106
+ let gridW = 0;
3107
+ let gridH = 0;
3108
+ const useIntCoords = intCoords !== false &amp;&amp; intCoords !== 0;
3109
+ &nbsp;
3110
+ if (useIntCoords) {
3111
+ if (Array.isArray(intCoords)) {
3112
+ gridW = intCoords[0] | 0;
3113
+ gridH = intCoords[1] | 0;
3114
+ } else if (typeof intCoords === 'number') {
3115
+ gridW = intCoords | 0;
3116
+ gridH = intCoords | 0;
3117
+ } else {
3118
+ // true → derive from count, minimum 8 to be useful
3119
+ gridW = Math.max(count, 8) | 0;
3120
+ gridH = gridW;
3121
+ }
3122
+ if (gridW &lt; 2 || gridH &lt; 2) {
3123
+ throw new Error(`intCoords grid must be at least 2×2, got ${gridW}×${gridH}`);
3124
+ }
3125
+ }
3126
+ &nbsp;
3127
+ // When rasterizing, oversample the parametric curve so small grids get
3128
+ // enough raw points for Bresenham to trace the full contour.
3129
+ const sampleCount = useIntCoords ? Math.max(count, (gridW + gridH) * 4) : count;
3130
+ &nbsp;
3131
+ // ---- Seeded RNG -----------------------------------------------------------
3132
+ const intSeed = rawSeed != null ? seedToInt(rawSeed) : <span class="branch-1 cbranch-no" title="branch not covered" >(Math.random() * 0x7fffffff) | 0;</span>
3133
+ const rng = createRng(intSeed);
3134
+ &nbsp;
3135
+ // ---- Noise function -------------------------------------------------------
3136
+ let noise2D = null;
3137
+ if (noise &gt; 0) {
3138
+ noise2D = createNoise2D(rng);
3139
+ }
3140
+ &nbsp;
3141
+ // ---- Scale factors --------------------------------------------------------
3142
+ const sx = Array.isArray(scale) ? <span class="branch-0 cbranch-no" title="branch not covered" >scale[0] </span>: scale;
3143
+ const sy = Array.isArray(scale) ? <span class="branch-0 cbranch-no" title="branch not covered" >scale[1] </span>: scale;
3144
+ &nbsp;
3145
+ // ---- Build raw parametric curve function -----------------------------------
3146
+ const curveFn = (t) =&gt; shapeFn(t, extraParams);
3147
+ &nbsp;
3148
+ // ---- Arc-length resample to evenly-spaced points --------------------------
3149
+ let points = arcLengthResample(curveFn, sampleCount, closed);
3150
+ &nbsp;
3151
+ // ---- Apply scale ----------------------------------------------------------
3152
+ points = scalePoints(points, sx, sy);
3153
+ &nbsp;
3154
+ // ---- Apply rotation (degrees → radians) -----------------------------------
3155
+ if (rotation !== 0) {
3156
+ points = rotatePoints(points, (rotation * Math.PI) / 180);
3157
+ }
3158
+ &nbsp;
3159
+ // ---- Apply procedural noise displacement ----------------------------------
3160
+ if (noise &gt; 0 &amp;&amp; noise2D) {
3161
+ const noiseScale = 3; // frequency multiplier
3162
+ points = points.map((p, i) =&gt; {
3163
+ const t = i / sampleCount;
3164
+ const nx = noise2D(t * noiseScale * 10, 0.0) * noise * 0.1;
3165
+ const ny = noise2D(0.0, t * noiseScale * 10) * noise * 0.1;
3166
+ return { x: p.x + nx, y: p.y + ny };
3167
+ });
3168
+ }
3169
+ &nbsp;
3170
+ // ---- Apply jitter ---------------------------------------------------------
3171
+ if (jitter &gt; 0) {
3172
+ points = points.map((p) =&gt; ({
3173
+ x: p.x + (rng() * 2 - 1) * jitter,
3174
+ y: p.y + (rng() * 2 - 1) * jitter,
3175
+ }));
3176
+ }
3177
+ &nbsp;
3178
+ // ---- Normalize to 0..1 (always needed before intCoords rasterization) -----
3179
+ if (normalize || useIntCoords) {
3180
+ points = normalizePoints(points);
3181
+ }
3182
+ &nbsp;
3183
+ // ---- Integer grid rasterization (Bresenham) -------------------------------
3184
+ if (useIntCoords) {
3185
+ points = rasterizeContour(points, gridW, gridH, closed);
3186
+ &nbsp;
3187
+ // ---- Scanline fill (solid silhouette) -----------------------------------
3188
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (fill &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >closed)</span> {
3189
+ <span class="cstat-no" title="statement not covered" > points = scanlineFill(points, gridW, gridH);</span>
3190
+ }
3191
+ &nbsp;
3192
+ // Build metadata for integer grid mode
3193
+ const bbox = computeBbox(points);
3194
+ /** @type {ShapeMetadata} */
3195
+ const metadata = {
3196
+ key,
3197
+ count: points.length,
3198
+ seed: intSeed,
3199
+ gridWidth: gridW,
3200
+ gridHeight: gridH,
3201
+ bbox: {
3202
+ minX: bbox.minX,
3203
+ minY: bbox.minY,
3204
+ maxX: bbox.maxX,
3205
+ maxY: bbox.maxY,
3206
+ },
3207
+ };
3208
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (color != null) <span class="cstat-no" title="statement not covered" >metadata.color = color;</span>
3209
+ &nbsp;
3210
+ return { points, metadata };
3211
+ }
3212
+ &nbsp;
3213
+ // ---- Round for cleanliness (6 decimal places) -----------------------------
3214
+ points = points.map((p) =&gt; ({
3215
+ x: Math.round(p.x * 1e6) / 1e6,
3216
+ y: Math.round(p.y * 1e6) / 1e6,
3217
+ }));
3218
+ &nbsp;
3219
+ // ---- Build metadata -------------------------------------------------------
3220
+ const bbox = computeBbox(points);
3221
+ /** @type {ShapeMetadata} */
3222
+ const metadata = {
3223
+ key,
3224
+ count: points.length,
3225
+ seed: intSeed,
3226
+ bbox: {
3227
+ minX: Math.round(bbox.minX * 1e6) / 1e6,
3228
+ minY: Math.round(bbox.minY * 1e6) / 1e6,
3229
+ maxX: Math.round(bbox.maxX * 1e6) / 1e6,
3230
+ maxY: Math.round(bbox.maxY * 1e6) / 1e6,
3231
+ },
3232
+ };
3233
+ if (color != null) metadata.color = color;
3234
+ &nbsp;
3235
+ return { points, metadata };
3236
+ }
3237
+ &nbsp;
3238
+ /**
3239
+ * Returns the list of currently registered shape keys.
3240
+ * @returns {string[]}
3241
+ * @memberof ShapeGenerator
3242
+ */
3243
+ export function listShapes() {
3244
+ return Object.keys(shapeRegistry);
3245
+ }
3246
+ &nbsp;</pre></td></tr></table></pre>
3247
+
3248
+ <div class='push'></div><!-- for sticky footer -->
3249
+ </div><!-- /wrapper -->
3250
+ <div class='footer quiet pad2 space-top1 center small'>
3251
+ Code coverage generated by
3252
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
3253
+ at 2026-09-13T20:21:13.226Z
3254
+ </div>
3255
+ <script src="../../prettify.js"></script>
3256
+ <script>
3257
+ window.onload = function () {
3258
+ prettyPrint();
3259
+ };
3260
+ </script>
3261
+ <script src="../../sorter.js"></script>
3262
+ <script src="../../block-navigation.js"></script>
3263
+ </body>
3264
+ </html>
3265
+