etro 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/.github/dependabot.yml +6 -0
  2. package/.github/scripts/update-changelog.js +72 -0
  3. package/.github/workflows/dependabot-changelog.yml +57 -0
  4. package/.github/workflows/nodejs.yml +2 -2
  5. package/.vscode/settings.json +3 -0
  6. package/CHANGELOG.md +36 -0
  7. package/README.md +7 -1
  8. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/base.css +224 -0
  9. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/block-navigation.js +87 -0
  10. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/favicon.png +0 -0
  11. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/index.html +176 -0
  12. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/prettify.css +1 -0
  13. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/prettify.js +2 -0
  14. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/sort-arrow-sprite.png +0 -0
  15. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/sorter.js +196 -0
  16. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/custom-array.ts.html +214 -0
  17. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/base.ts.html +433 -0
  18. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/brightness.ts.html +214 -0
  19. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/channels.ts.html +235 -0
  20. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/chroma-key.ts.html +331 -0
  21. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/contrast.ts.html +211 -0
  22. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/elliptical-mask.ts.html +310 -0
  23. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/gaussian-blur.ts.html +796 -0
  24. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/grayscale.ts.html +187 -0
  25. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/index.html +311 -0
  26. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/index.ts.html +154 -0
  27. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/pixelate.ts.html +259 -0
  28. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/shader.ts.html +1774 -0
  29. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/stack.ts.html +358 -0
  30. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/transform.ts.html +685 -0
  31. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/effect/visual.ts.html +148 -0
  32. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/etro.ts.html +163 -0
  33. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/event.ts.html +691 -0
  34. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/index.html +176 -0
  35. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/index.ts.html +109 -0
  36. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/audio-source.ts.html +835 -0
  37. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/audio.ts.html +241 -0
  38. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/base.ts.html +772 -0
  39. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/image.ts.html +181 -0
  40. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/index.html +236 -0
  41. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/index.ts.html +124 -0
  42. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/text.ts.html +658 -0
  43. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/video.ts.html +211 -0
  44. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/visual-source.ts.html +721 -0
  45. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/layer/visual.ts.html +760 -0
  46. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/effects.ts.html +163 -0
  47. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/index.html +161 -0
  48. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/index.ts.html +88 -0
  49. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/layers.ts.html +163 -0
  50. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/movie/movie.ts.html +2692 -0
  51. package/coverage/Chrome Headless 79.0.3945.0 (Mac OS 10.16.0)/html/src/util.ts.html +1426 -0
  52. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/base.css +224 -0
  53. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  54. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/favicon.png +0 -0
  55. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/index.html +176 -0
  56. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/prettify.css +1 -0
  57. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/prettify.js +2 -0
  58. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  59. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/sorter.js +196 -0
  60. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  61. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  62. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  63. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  64. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  65. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  66. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  67. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +796 -0
  68. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  69. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  70. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  71. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  72. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1948 -0
  73. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  74. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  75. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  76. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  77. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  78. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/index.html +176 -0
  79. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  80. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  81. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  82. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  83. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  84. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  85. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  86. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  87. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  88. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  89. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  90. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  91. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  92. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  93. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  94. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2692 -0
  95. package/coverage/Firefox 118.0 (Mac OS 10.15)/html/src/util.ts.html +1426 -0
  96. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/base.css +224 -0
  97. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  98. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/favicon.png +0 -0
  99. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/index.html +176 -0
  100. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/prettify.css +1 -0
  101. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/prettify.js +2 -0
  102. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  103. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/sorter.js +196 -0
  104. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  105. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  106. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  107. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  108. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  109. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  110. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  111. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +790 -0
  112. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  113. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  114. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  115. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  116. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1948 -0
  117. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  118. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  119. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  120. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  121. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  122. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/index.html +176 -0
  123. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  124. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  125. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  126. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  127. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  128. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  129. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  130. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  131. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  132. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  133. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  134. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  135. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  136. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  137. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  138. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2692 -0
  139. package/coverage/Firefox 120.0 (Mac OS 10.15)/html/src/util.ts.html +1426 -0
  140. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/base.css +224 -0
  141. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  142. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/favicon.png +0 -0
  143. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/index.html +176 -0
  144. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/prettify.css +1 -0
  145. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/prettify.js +2 -0
  146. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  147. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/sorter.js +196 -0
  148. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  149. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  150. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  151. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  152. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  153. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  154. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  155. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +796 -0
  156. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  157. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  158. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  159. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  160. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1774 -0
  161. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  162. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  163. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  164. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  165. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  166. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/index.html +176 -0
  167. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  168. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  169. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  170. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  171. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  172. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  173. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  174. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  175. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  176. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  177. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  178. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  179. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  180. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  181. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  182. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2698 -0
  183. package/coverage/Firefox 121.0 (Mac OS 10.15)/html/src/util.ts.html +1453 -0
  184. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/base.css +224 -0
  185. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/block-navigation.js +87 -0
  186. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/favicon.png +0 -0
  187. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/index.html +161 -0
  188. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/prettify.css +1 -0
  189. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/prettify.js +2 -0
  190. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/sort-arrow-sprite.png +0 -0
  191. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/sorter.js +196 -0
  192. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/custom-array.ts.html +214 -0
  193. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/base.ts.html +433 -0
  194. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/brightness.ts.html +214 -0
  195. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/channels.ts.html +235 -0
  196. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/chroma-key.ts.html +331 -0
  197. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/contrast.ts.html +211 -0
  198. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/elliptical-mask.ts.html +310 -0
  199. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/gaussian-blur.ts.html +796 -0
  200. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/grayscale.ts.html +187 -0
  201. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/index.html +311 -0
  202. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/index.ts.html +154 -0
  203. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/pixelate.ts.html +259 -0
  204. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/shader.ts.html +1774 -0
  205. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/stack.ts.html +358 -0
  206. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/transform.ts.html +685 -0
  207. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/effect/visual.ts.html +148 -0
  208. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/etro.ts.html +163 -0
  209. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/event.ts.html +691 -0
  210. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/index.html +176 -0
  211. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/index.ts.html +109 -0
  212. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/audio-source.ts.html +835 -0
  213. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/audio.ts.html +241 -0
  214. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/base.ts.html +772 -0
  215. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/image.ts.html +181 -0
  216. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/index.html +236 -0
  217. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/index.ts.html +124 -0
  218. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/text.ts.html +658 -0
  219. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/video.ts.html +211 -0
  220. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/visual-source.ts.html +721 -0
  221. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/layer/visual.ts.html +760 -0
  222. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/effects.ts.html +163 -0
  223. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/index.html +161 -0
  224. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/index.ts.html +88 -0
  225. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/layers.ts.html +163 -0
  226. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/movie/movie.ts.html +2698 -0
  227. package/coverage/Firefox 148.0 (Mac OS 10.15)/html/src/util.ts.html +1453 -0
  228. package/dist/etro-cjs.js +79 -64
  229. package/dist/etro-iife.js +80 -65
  230. package/dist/movie/movie.d.ts +4 -3
  231. package/dist/util.d.ts +4 -2
  232. package/karma.conf.js +9 -0
  233. package/package.json +5 -6
  234. package/src/effect/shader.ts +1 -1
  235. package/src/effect/transform.ts +1 -1
  236. package/src/movie/movie.ts +7 -5
  237. package/src/util.ts +13 -4
@@ -0,0 +1,1774 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/effect/shader.ts</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">src/effect</a> shader.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">13.61% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>29/213</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/93</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">4.76% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>1/21</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">12.98% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>27/208</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 oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-yes">1x</span>
632
+ <span class="cline-any cline-yes">1x</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-neutral">&nbsp;</span>
646
+ <span class="cline-any cline-neutral">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-neutral">&nbsp;</span>
653
+ <span class="cline-any cline-neutral">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-neutral">&nbsp;</span>
661
+ <span class="cline-any cline-neutral">&nbsp;</span>
662
+ <span class="cline-any cline-neutral">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-yes">1x</span>
667
+ <span class="cline-any cline-neutral">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
+ <span class="cline-any cline-yes">1x</span>
671
+ <span class="cline-any cline-yes">1x</span>
672
+ <span class="cline-any cline-neutral">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-neutral">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-neutral">&nbsp;</span>
681
+ <span class="cline-any cline-neutral">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-neutral">&nbsp;</span>
684
+ <span class="cline-any cline-yes">1x</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-yes">1x</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-neutral">&nbsp;</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-no">&nbsp;</span>
732
+ <span class="cline-any cline-no">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-no">&nbsp;</span>
735
+ <span class="cline-any cline-no">&nbsp;</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-no">&nbsp;</span>
741
+ <span class="cline-any cline-no">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-no">&nbsp;</span>
744
+ <span class="cline-any cline-no">&nbsp;</span>
745
+ <span class="cline-any cline-no">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-yes">1x</span>
749
+ <span class="cline-any cline-no">&nbsp;</span>
750
+ <span class="cline-any cline-no">&nbsp;</span>
751
+ <span class="cline-any cline-no">&nbsp;</span>
752
+ <span class="cline-any cline-no">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-no">&nbsp;</span>
756
+ <span class="cline-any cline-no">&nbsp;</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
+ <span class="cline-any cline-yes">1x</span>
760
+ <span class="cline-any cline-no">&nbsp;</span>
761
+ <span class="cline-any cline-no">&nbsp;</span>
762
+ <span class="cline-any cline-no">&nbsp;</span>
763
+ <span class="cline-any cline-no">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-neutral">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-no">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-no">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-no">&nbsp;</span>
780
+ <span class="cline-any cline-no">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-no">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-yes">1x</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">1x</span>
800
+ <span class="cline-any cline-no">&nbsp;</span>
801
+ <span class="cline-any cline-no">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-no">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-no">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-no">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-no">&nbsp;</span>
816
+ <span class="cline-any cline-no">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-neutral">&nbsp;</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-yes">1x</span>
821
+ <span class="cline-any cline-no">&nbsp;</span>
822
+ <span class="cline-any cline-no">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-no">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-no">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-yes">1x</span>
836
+ <span class="cline-any cline-no">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-no">&nbsp;</span>
840
+ <span class="cline-any cline-no">&nbsp;</span>
841
+ <span class="cline-any cline-no">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-no">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-yes">1x</span>
848
+ <span class="cline-any cline-no">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-no">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-no">&nbsp;</span>
855
+ <span class="cline-any cline-no">&nbsp;</span>
856
+ <span class="cline-any cline-no">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-no">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-yes">1x</span>
863
+ <span class="cline-any cline-no">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-no">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-no">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-no">&nbsp;</span>
875
+ <span class="cline-any cline-no">&nbsp;</span>
876
+ <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-no">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-yes">1x</span>
888
+ <span class="cline-any cline-no">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-no">&nbsp;</span>
891
+ <span class="cline-any cline-no">&nbsp;</span>
892
+ <span class="cline-any cline-no">&nbsp;</span>
893
+ <span class="cline-any cline-no">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-no">&nbsp;</span>
897
+ <span class="cline-any cline-no">&nbsp;</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-yes">1x</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-no">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-no">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-no">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-no">&nbsp;</span>
921
+ <span class="cline-any cline-no">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-no">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-neutral">&nbsp;</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-yes">1x</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-no">&nbsp;</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-neutral">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
947
+ <span class="cline-any cline-no">&nbsp;</span>
948
+ <span class="cline-any cline-no">&nbsp;</span>
949
+ <span class="cline-any cline-no">&nbsp;</span>
950
+ <span class="cline-any cline-no">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-no">&nbsp;</span>
953
+ <span class="cline-any cline-neutral">&nbsp;</span>
954
+ <span class="cline-any cline-no">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-yes">1x</span>
958
+ <span class="cline-any cline-no">&nbsp;</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-no">&nbsp;</span>
961
+ <span class="cline-any cline-no">&nbsp;</span>
962
+ <span class="cline-any cline-no">&nbsp;</span>
963
+ <span class="cline-any cline-neutral">&nbsp;</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-no">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-no">&nbsp;</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-neutral">&nbsp;</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-yes">1x</span>
982
+ <span class="cline-any cline-no">&nbsp;</span>
983
+ <span class="cline-any cline-no">&nbsp;</span>
984
+ <span class="cline-any cline-neutral">&nbsp;</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-neutral">&nbsp;</span>
989
+ <span class="cline-any cline-neutral">&nbsp;</span>
990
+ <span class="cline-any cline-neutral">&nbsp;</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-no">&nbsp;</span>
999
+ <span class="cline-any cline-no">&nbsp;</span>
1000
+ <span class="cline-any cline-no">&nbsp;</span>
1001
+ <span class="cline-any cline-no">&nbsp;</span>
1002
+ <span class="cline-any cline-no">&nbsp;</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-no">&nbsp;</span>
1006
+ <span class="cline-any cline-neutral">&nbsp;</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-no">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-no">&nbsp;</span>
1012
+ <span class="cline-any cline-no">&nbsp;</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-neutral">&nbsp;</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-no">&nbsp;</span>
1017
+ <span class="cline-any cline-no">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-neutral">&nbsp;</span>
1024
+ <span class="cline-any cline-no">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-no">&nbsp;</span>
1028
+ <span class="cline-any cline-no">&nbsp;</span>
1029
+ <span class="cline-any cline-no">&nbsp;</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-no">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-no">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-no">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-yes">1x</span>
1049
+ <span class="cline-any cline-no">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-no">&nbsp;</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-neutral">&nbsp;</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-no">&nbsp;</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-yes">1x</span>
1074
+ <span class="cline-any cline-no">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-no">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-no">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-neutral">&nbsp;</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1097
+ <span class="cline-any cline-yes">1x</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-no">&nbsp;</span>
1100
+ <span class="cline-any cline-neutral">&nbsp;</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-no">&nbsp;</span>
1103
+ <span class="cline-any cline-no">&nbsp;</span>
1104
+ <span class="cline-any cline-no">&nbsp;</span>
1105
+ <span class="cline-any cline-no">&nbsp;</span>
1106
+ <span class="cline-any cline-no">&nbsp;</span>
1107
+ <span class="cline-any cline-no">&nbsp;</span>
1108
+ <span class="cline-any cline-no">&nbsp;</span>
1109
+ <span class="cline-any cline-no">&nbsp;</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-no">&nbsp;</span>
1116
+ <span class="cline-any cline-no">&nbsp;</span>
1117
+ <span class="cline-any cline-neutral">&nbsp;</span>
1118
+ <span class="cline-any cline-neutral">&nbsp;</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-neutral">&nbsp;</span>
1123
+ <span class="cline-any cline-neutral">&nbsp;</span>
1124
+ <span class="cline-any cline-no">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <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-no">&nbsp;</span>
1135
+ <span class="cline-any cline-no">&nbsp;</span>
1136
+ <span class="cline-any cline-no">&nbsp;</span>
1137
+ <span class="cline-any cline-no">&nbsp;</span>
1138
+ <span class="cline-any cline-no">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-no">&nbsp;</span>
1141
+ <span class="cline-any cline-no">&nbsp;</span>
1142
+ <span class="cline-any cline-no">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-neutral">&nbsp;</span>
1146
+ <span class="cline-any cline-no">&nbsp;</span>
1147
+ <span class="cline-any cline-no">&nbsp;</span>
1148
+ <span class="cline-any cline-neutral">&nbsp;</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-no">&nbsp;</span>
1151
+ <span class="cline-any cline-no">&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-no">&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-yes">1x</span>
1158
+ <span class="cline-any cline-no">&nbsp;</span>
1159
+ <span class="cline-any cline-no">&nbsp;</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-no">&nbsp;</span>
1162
+ <span class="cline-any cline-no">&nbsp;</span>
1163
+ <span class="cline-any cline-no">&nbsp;</span>
1164
+ <span class="cline-any cline-no">&nbsp;</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-no">&nbsp;</span>
1168
+ <span class="cline-any cline-no">&nbsp;</span>
1169
+ <span class="cline-any cline-no">&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-no">&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-yes">1x</span>
1176
+ <span class="cline-any cline-no">&nbsp;</span>
1177
+ <span class="cline-any cline-no">&nbsp;</span>
1178
+ <span class="cline-any cline-no">&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-no">&nbsp;</span>
1182
+ <span class="cline-any cline-no">&nbsp;</span>
1183
+ <span class="cline-any cline-no">&nbsp;</span>
1184
+ <span class="cline-any cline-no">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-neutral">&nbsp;</span>
1187
+ <span class="cline-any cline-no">&nbsp;</span>
1188
+ <span class="cline-any cline-neutral">&nbsp;</span>
1189
+ <span class="cline-any cline-yes">1x</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-yes">1x</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Visual as VisualLayer } from '../layer/index'
1193
+ import { Movie } from '../movie'
1194
+ import { val } from '../util'
1195
+ import { Visual } from './visual'
1196
+ &nbsp;
1197
+ export interface UniformOptions {
1198
+ /**
1199
+ * The type of the uniform.
1200
+ */
1201
+ type?: string
1202
+ defaultFloatComponent?: number
1203
+ }
1204
+ &nbsp;
1205
+ export interface TextureOptions {
1206
+ createUniform?: boolean
1207
+ target?
1208
+ level?: number
1209
+ internalFormat?
1210
+ srcFormat?
1211
+ srcType?
1212
+ wrapS?
1213
+ wrapT?
1214
+ minFilter?
1215
+ magFilter?
1216
+ }
1217
+ &nbsp;
1218
+ export interface ShaderOptions {
1219
+ fragmentSource?: string
1220
+ uniforms?: Record&lt;string, (UniformOptions | string)&gt;
1221
+ textures?: Record&lt;string, TextureOptions&gt;
1222
+ sourceTextureOptions?: TextureOptions
1223
+ }
1224
+ &nbsp;
1225
+ /**
1226
+ * A hardware-accelerated pixel mapping using WebGL
1227
+ */
1228
+ // TODO: can `v_TextureCoord` be replaced by `gl_FragUV`?
1229
+ export class Shader extends Visual {
1230
+ /**
1231
+ * WebGL texture units consumed by {@link Shader}
1232
+ */
1233
+ static INTERNAL_TEXTURE_UNITS = 1
1234
+ private static _DEFAULT_TEXTURE_OPTIONS = {
1235
+ createUniform: true,
1236
+ target: 'TEXTURE_2D',
1237
+ level: 0,
1238
+ internalFormat: 'RGBA',
1239
+ srcFormat: 'RGBA',
1240
+ srcType: 'UNSIGNED_BYTE',
1241
+ minFilter: 'LINEAR',
1242
+ magFilter: 'LINEAR',
1243
+ wrapS: 'CLAMP_TO_EDGE',
1244
+ wrapT: 'CLAMP_TO_EDGE'
1245
+ }
1246
+ &nbsp;
1247
+ private static _VERTEX_SOURCE = `
1248
+ attribute vec4 a_VertexPosition;
1249
+ attribute vec2 a_TextureCoord;
1250
+ &nbsp;
1251
+ varying highp vec2 v_TextureCoord;
1252
+ &nbsp;
1253
+ void main() {
1254
+ // no need for projection or model-view matrices, since we're just rendering a rectangle
1255
+ // that fills the screen (see position values)
1256
+ gl_Position = a_VertexPosition;
1257
+ v_TextureCoord = a_TextureCoord;
1258
+ }
1259
+ `
1260
+ private static _IDENTITY_FRAGMENT_SOURCE = `
1261
+ precision mediump float;
1262
+ &nbsp;
1263
+ uniform sampler2D u_Source;
1264
+ &nbsp;
1265
+ varying highp vec2 v_TextureCoord;
1266
+ &nbsp;
1267
+ void main() {
1268
+ gl_FragColor = texture2D(u_Source, v_TextureCoord);
1269
+ }
1270
+ `
1271
+ private _program: WebGLProgram
1272
+ private _buffers: {
1273
+ position: WebGLBuffer,
1274
+ textureCoord: WebGLBuffer
1275
+ }
1276
+ &nbsp;
1277
+ private _canvas: HTMLCanvasElement
1278
+ private _gl: WebGLRenderingContext
1279
+ private _uniformLocations: Record&lt;string, WebGLUniformLocation&gt;
1280
+ private _attribLocations: Record&lt;string, GLint&gt;
1281
+ private _userUniforms: Record&lt;string, (UniformOptions | string)&gt;
1282
+ private _userTextures: Record&lt;string, TextureOptions&gt;
1283
+ private _sourceTextureOptions: TextureOptions
1284
+ private _inputTexture: WebGLTexture
1285
+ &nbsp;
1286
+ /**
1287
+ * @param fragmentSrc
1288
+ * @param [userUniforms={}] - object mapping uniform id to an
1289
+ * options object or a string (if you only need to provide the uniforms'
1290
+ * type)
1291
+ * @param [userTextures=[]]
1292
+ * @param [sourceTextureOptions={}]
1293
+ */
1294
+ <span class="fstat-no" title="function not covered" > constructor (<span class="cstat-no" title="statement not covered" >o</span>ptions: ShaderOptions = {}) {</span>
1295
+ <span class="cstat-no" title="statement not covered" > super()</span>
1296
+ // TODO: split up into multiple methods
1297
+ const fragmentSrc = <span class="cstat-no" title="statement not covered" >options.fragmentSource || Shader._IDENTITY_FRAGMENT_SOURCE</span>
1298
+ const userUniforms = <span class="cstat-no" title="statement not covered" >options.uniforms || {}</span>
1299
+ const userTextures = <span class="cstat-no" title="statement not covered" >options.textures || {}</span>
1300
+ const sourceTextureOptions = <span class="cstat-no" title="statement not covered" >options.sourceTextureOptions || {}</span>
1301
+ &nbsp;
1302
+ const gl = <span class="cstat-no" title="statement not covered" >this._initGl()</span>
1303
+ <span class="cstat-no" title="statement not covered" > this._program = Shader._initShaderProgram(gl, Shader._VERTEX_SOURCE, fragmentSrc)</span>
1304
+ <span class="cstat-no" title="statement not covered" > this._buffers = Shader._initRectBuffers(gl)</span>
1305
+ &nbsp;
1306
+ <span class="cstat-no" title="statement not covered" > this._initTextures(userUniforms, userTextures, sourceTextureOptions)</span>
1307
+ <span class="cstat-no" title="statement not covered" > this._initAttribs()</span>
1308
+ <span class="cstat-no" title="statement not covered" > this._initUniforms(userUniforms)</span>
1309
+ }
1310
+ &nbsp;
1311
+ <span class="fstat-no" title="function not covered" > private _</span>initGl () {
1312
+ <span class="cstat-no" title="statement not covered" > this._canvas = document.createElement('canvas')</span>
1313
+ const gl = <span class="cstat-no" title="statement not covered" >this._canvas.getContext('webgl')</span>
1314
+ <span class="cstat-no" title="statement not covered" > if (gl === null) {</span>
1315
+ <span class="cstat-no" title="statement not covered" > throw new Error('Unable to initialize WebGL. Your browser or machine may not support it.')</span>
1316
+ }
1317
+ &nbsp;
1318
+ <span class="cstat-no" title="statement not covered" > this._gl = gl</span>
1319
+ <span class="cstat-no" title="statement not covered" > return gl</span>
1320
+ }
1321
+ &nbsp;
1322
+ <span class="fstat-no" title="function not covered" > private _</span>initTextures (userUniforms, userTextures, sourceTextureOptions) {
1323
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1324
+ const maxTextures = <span class="cstat-no" title="statement not covered" >gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS)</span>
1325
+ <span class="cstat-no" title="statement not covered" > if (userTextures.length &gt; maxTextures) {</span>
1326
+ <span class="cstat-no" title="statement not covered" > console.warn('Too many textures!')</span>
1327
+ }
1328
+ &nbsp;
1329
+ <span class="cstat-no" title="statement not covered" > this._userTextures = {}</span>
1330
+ <span class="cstat-no" title="statement not covered" > for (const name in userTextures) {</span>
1331
+ const userOptions: TextureOptions = <span class="cstat-no" title="statement not covered" >userTextures[name]</span>
1332
+ // Apply default options.
1333
+ const options<span class="cstat-no" title="statement not covered" > = { ...Shader._DEFAULT_TEXTURE_OPTIONS, ...userOptions }</span>
1334
+ &nbsp;
1335
+ <span class="cstat-no" title="statement not covered" > if (options.createUniform) {</span>
1336
+ /*
1337
+ * Automatically, create a uniform with the same name as this texture,
1338
+ * that points to it. This is an easy way for the user to use custom
1339
+ * textures, without having to define multiple properties in the effect
1340
+ * object.
1341
+ */
1342
+ <span class="cstat-no" title="statement not covered" > if (userUniforms[name]) {</span>
1343
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Texture - uniform naming conflict: ${name}!`)</span>
1344
+ }
1345
+ &nbsp;
1346
+ // Add this as a "user uniform".
1347
+ <span class="cstat-no" title="statement not covered" > userUniforms[name] = '1i' /</span>/ texture pointer
1348
+ }
1349
+ <span class="cstat-no" title="statement not covered" > this._userTextures[name] = options</span>
1350
+ }
1351
+ <span class="cstat-no" title="statement not covered" > this._sourceTextureOptions = { ...Shader._DEFAULT_TEXTURE_OPTIONS, ...sourceTextureOptions }</span>
1352
+ }
1353
+ &nbsp;
1354
+ <span class="fstat-no" title="function not covered" > private _</span>initAttribs () {
1355
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1356
+ <span class="cstat-no" title="statement not covered" > this._attribLocations = {</span>
1357
+ vertexPosition: gl.getAttribLocation(this._program, 'a_VertexPosition'),
1358
+ textureCoord: gl.getAttribLocation(this._program, 'a_TextureCoord')
1359
+ }
1360
+ }
1361
+ &nbsp;
1362
+ <span class="fstat-no" title="function not covered" > private _</span>initUniforms (userUniforms) {
1363
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1364
+ <span class="cstat-no" title="statement not covered" > this._uniformLocations = {</span>
1365
+ source: gl.getUniformLocation(this._program, 'u_Source'),
1366
+ size: gl.getUniformLocation(this._program, 'u_Size')
1367
+ }
1368
+ // The options value can just be a string equal to the type of the variable,
1369
+ // for syntactic sugar. If this is the case, convert it to a real options
1370
+ // object.
1371
+ <span class="cstat-no" title="statement not covered" > this._userUniforms = {}</span>
1372
+ <span class="cstat-no" title="statement not covered" > for (const name in userUniforms) {</span>
1373
+ const val = <span class="cstat-no" title="statement not covered" >userUniforms[name]</span>
1374
+ <span class="cstat-no" title="statement not covered" > this._userUniforms[name] = typeof val === 'string' ? { type: val } : val</span>
1375
+ }
1376
+ <span class="cstat-no" title="statement not covered" > for (const unprefixed in userUniforms) {</span>
1377
+ // property =&gt; u_Property
1378
+ const prefixed = <span class="cstat-no" title="statement not covered" >'u_' + unprefixed.charAt(0).toUpperCase() + (unprefixed.length &gt; 1 ? unprefixed.slice(1) : '')</span>
1379
+ <span class="cstat-no" title="statement not covered" > this._uniformLocations[unprefixed] = gl.getUniformLocation(this._program, prefixed)</span>
1380
+ }
1381
+ }
1382
+ &nbsp;
1383
+ <span class="fstat-no" title="function not covered" > apply </span>(target: Movie | VisualLayer, reltime: number): void {
1384
+ <span class="cstat-no" title="statement not covered" > this._checkDimensions(target)</span>
1385
+ <span class="cstat-no" title="statement not covered" > this._refreshGl()</span>
1386
+ &nbsp;
1387
+ <span class="cstat-no" title="statement not covered" > this._enablePositionAttrib()</span>
1388
+ <span class="cstat-no" title="statement not covered" > this._enableTexCoordAttrib()</span>
1389
+ <span class="cstat-no" title="statement not covered" > this._prepareTextures(target, reltime)</span>
1390
+ &nbsp;
1391
+ <span class="cstat-no" title="statement not covered" > this._gl.useProgram(this._program)</span>
1392
+ &nbsp;
1393
+ <span class="cstat-no" title="statement not covered" > this._prepareUniforms(target, reltime)</span>
1394
+ &nbsp;
1395
+ <span class="cstat-no" title="statement not covered" > this._draw(target)</span>
1396
+ }
1397
+ &nbsp;
1398
+ <span class="fstat-no" title="function not covered" > private _</span>checkDimensions (target) {
1399
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1400
+ // TODO: Change target.canvas.width =&gt; target.width and see if it breaks
1401
+ // anything.
1402
+ <span class="cstat-no" title="statement not covered" > if (this._canvas.width !== target.canvas.width || this._canvas.height !== target.canvas.height) { // (optimization)</span>
1403
+ <span class="cstat-no" title="statement not covered" > this._canvas.width = target.canvas.width</span>
1404
+ <span class="cstat-no" title="statement not covered" > this._canvas.height = target.canvas.height</span>
1405
+ &nbsp;
1406
+ <span class="cstat-no" title="statement not covered" > gl.viewport(0, 0, target.canvas.width, target.canvas.height)</span>
1407
+ }
1408
+ }
1409
+ &nbsp;
1410
+ <span class="fstat-no" title="function not covered" > private _</span>refreshGl () {
1411
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1412
+ // Clear to black; fragments can be made transparent with the blendfunc
1413
+ // below.
1414
+ <span class="cstat-no" title="statement not covered" > gl.clearColor(0, 0, 0, 1)</span>
1415
+ // gl.clearDepth(1.0); // clear everything
1416
+ // not sure why I can't multiply rgb by zero
1417
+ <span class="cstat-no" title="statement not covered" > gl.blendFuncSeparate(gl.SRC_ALPHA, gl.SRC_ALPHA, gl.ONE, gl.ZERO)</span>
1418
+ <span class="cstat-no" title="statement not covered" > gl.enable(gl.BLEND)</span>
1419
+ <span class="cstat-no" title="statement not covered" > gl.disable(gl.DEPTH_TEST)</span>
1420
+ // gl.depthFunc(gl.LEQUAL);
1421
+ &nbsp;
1422
+ <span class="cstat-no" title="statement not covered" > gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)</span>
1423
+ }
1424
+ &nbsp;
1425
+ <span class="fstat-no" title="function not covered" > private _</span>enablePositionAttrib () {
1426
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1427
+ // Tell WebGL how to pull out the positions from buffer
1428
+ const numComponents = <span class="cstat-no" title="statement not covered" >2</span>
1429
+ // The data in the buffer is 32bit floats
1430
+ const type = <span class="cstat-no" title="statement not covered" >gl.FLOAT</span>
1431
+ // Don't normalize
1432
+ const normalize = <span class="cstat-no" title="statement not covered" >false</span>
1433
+ // How many bytes to get from one set of values to the next
1434
+ // 0 = use type and numComponents above
1435
+ const stride = <span class="cstat-no" title="statement not covered" >0</span>
1436
+ // How many bytes inside the buffer to start from
1437
+ const offset = <span class="cstat-no" title="statement not covered" >0</span>
1438
+ <span class="cstat-no" title="statement not covered" > gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers.position)</span>
1439
+ <span class="cstat-no" title="statement not covered" > gl.vertexAttribPointer(</span>
1440
+ this._attribLocations.vertexPosition,
1441
+ numComponents,
1442
+ type,
1443
+ normalize,
1444
+ stride,
1445
+ offset)
1446
+ <span class="cstat-no" title="statement not covered" > gl.enableVertexAttribArray(</span>
1447
+ this._attribLocations.vertexPosition)
1448
+ }
1449
+ &nbsp;
1450
+ <span class="fstat-no" title="function not covered" > private _</span>enableTexCoordAttrib () {
1451
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1452
+ // tell webgl how to pull out the texture coordinates from buffer
1453
+ const numComponents = <span class="cstat-no" title="statement not covered" >2 </span>// every coordinate composed of 2 values (uv)
1454
+ const type = <span class="cstat-no" title="statement not covered" >gl.FLOAT </span>// the data in the buffer is 32 bit float
1455
+ const normalize = <span class="cstat-no" title="statement not covered" >false </span>// don't normalize
1456
+ const stride = <span class="cstat-no" title="statement not covered" >0 </span>// how many bytes to get from one set to the next
1457
+ const offset = <span class="cstat-no" title="statement not covered" >0 </span>// how many bytes inside the buffer to start from
1458
+ <span class="cstat-no" title="statement not covered" > gl.bindBuffer(gl.ARRAY_BUFFER, this._buffers.textureCoord)</span>
1459
+ <span class="cstat-no" title="statement not covered" > gl.vertexAttribPointer(this._attribLocations.textureCoord, numComponents, type, normalize, stride, offset)</span>
1460
+ <span class="cstat-no" title="statement not covered" > gl.enableVertexAttribArray(this._attribLocations.textureCoord)</span>
1461
+ }
1462
+ &nbsp;
1463
+ <span class="fstat-no" title="function not covered" > private _</span>prepareTextures (target, reltime) {
1464
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1465
+ // TODO: figure out which properties should be private / public
1466
+ &nbsp;
1467
+ // Tell WebGL we want to affect texture unit 0
1468
+ // Call `activeTexture` before `_loadTexture` so it won't be bound to the
1469
+ // last active texture.
1470
+ <span class="cstat-no" title="statement not covered" > gl.activeTexture(gl.TEXTURE0)</span>
1471
+ <span class="cstat-no" title="statement not covered" > this._inputTexture = Shader._loadTexture(gl, target.canvas, this._sourceTextureOptions)</span>
1472
+ // Bind the texture to texture unit 0
1473
+ <span class="cstat-no" title="statement not covered" > gl.bindTexture(gl.TEXTURE_2D, this._inputTexture)</span>
1474
+ &nbsp;
1475
+ let i = <span class="cstat-no" title="statement not covered" >0</span>
1476
+ <span class="cstat-no" title="statement not covered" > for (const name in this._userTextures) {</span>
1477
+ const options = <span class="cstat-no" title="statement not covered" >this._userTextures[name]</span>
1478
+ /*
1479
+ * Call `activeTexture` before `_loadTexture` so it won't be bound to the
1480
+ * last active texture.
1481
+ * TODO: investigate better implementation of `_loadTexture`
1482
+ */
1483
+ <span class="cstat-no" title="statement not covered" > gl.activeTexture(gl.TEXTURE0 + (Shader.INTERNAL_TEXTURE_UNITS + i)) /</span>/ use the fact that TEXTURE0, TEXTURE1, ... are continuous
1484
+ const preparedTex = <span class="cstat-no" title="statement not covered" >Shader._loadTexture(gl, val(this, name, reltime), options) </span>// do it every frame to keep updated (I think you need to)
1485
+ <span class="cstat-no" title="statement not covered" > gl.bindTexture(gl[options.target], preparedTex)</span>
1486
+ <span class="cstat-no" title="statement not covered" > i++</span>
1487
+ }
1488
+ }
1489
+ &nbsp;
1490
+ /**
1491
+ * Set the shader's uniforms.
1492
+ * @param target The movie or layer to apply the shader to.
1493
+ * @param reltime The relative time of the movie or layer.
1494
+ */
1495
+ <span class="fstat-no" title="function not covered" > private _</span>prepareUniforms (target, reltime) {
1496
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1497
+ &nbsp;
1498
+ // Tell the shader we bound the texture to texture unit 0.
1499
+ // All base (Shader class) uniforms are optional.
1500
+ <span class="cstat-no" title="statement not covered" > if (this._uniformLocations.source) {</span>
1501
+ <span class="cstat-no" title="statement not covered" > gl.uniform1i(this._uniformLocations.source, 0)</span>
1502
+ }
1503
+ &nbsp;
1504
+ // All base (Shader class) uniforms are optional.
1505
+ <span class="cstat-no" title="statement not covered" > if (this._uniformLocations.size) {</span>
1506
+ <span class="cstat-no" title="statement not covered" > gl.uniform2iv(this._uniformLocations.size, [target.canvas.width, target.canvas.height])</span>
1507
+ }
1508
+ &nbsp;
1509
+ <span class="cstat-no" title="statement not covered" > for (const unprefixed in this._userUniforms) {</span>
1510
+ const options = <span class="cstat-no" title="statement not covered" >this._userUniforms[unprefixed] as UniformOptions</span>
1511
+ const value = <span class="cstat-no" title="statement not covered" >val(this, unprefixed, reltime)</span>
1512
+ const preparedValue = <span class="cstat-no" title="statement not covered" >this._prepareValue(value, options.type, reltime, options)</span>
1513
+ const location = <span class="cstat-no" title="statement not covered" >this._uniformLocations[unprefixed]</span>
1514
+ // haHA JavaScript (`options.type` is "1f", for instance)
1515
+ <span class="cstat-no" title="statement not covered" > gl['uniform' + options.type](location, preparedValue)</span>
1516
+ }
1517
+ <span class="cstat-no" title="statement not covered" > gl.uniform1i(this._uniformLocations.test, 0)</span>
1518
+ }
1519
+ &nbsp;
1520
+ <span class="fstat-no" title="function not covered" > private _</span>draw (target) {
1521
+ const gl = <span class="cstat-no" title="statement not covered" >this._gl</span>
1522
+ &nbsp;
1523
+ const offset = <span class="cstat-no" title="statement not covered" >0</span>
1524
+ const vertexCount = <span class="cstat-no" title="statement not covered" >4</span>
1525
+ <span class="cstat-no" title="statement not covered" > gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount)</span>
1526
+ &nbsp;
1527
+ // clear the target, in case the effect outputs transparent pixels
1528
+ <span class="cstat-no" title="statement not covered" > target.cctx.clearRect(0, 0, target.canvas.width, target.canvas.height)</span>
1529
+ // copy internal image state onto target
1530
+ <span class="cstat-no" title="statement not covered" > target.cctx.drawImage(this._canvas, 0, 0)</span>
1531
+ }
1532
+ &nbsp;
1533
+ /**
1534
+ * Converts a value of a standard type for javascript to a standard type for
1535
+ * GLSL
1536
+ *
1537
+ * @param value - the raw value to prepare
1538
+ * @param outputType - the WebGL type of |value|; example:
1539
+ * &lt;code&gt;1f&lt;/code&gt; for a float
1540
+ * @param reltime - current time, relative to the target
1541
+ * @param [options]
1542
+ * @returns the prepared value
1543
+ */
1544
+ <span class="fstat-no" title="function not covered" > private _</span>prepareValue (value, outputType, reltime, <span class="cstat-no" title="statement not covered" >options: UniformOptions = {}) {</span>
1545
+ const def = <span class="cstat-no" title="statement not covered" >options.defaultFloatComponent || 0</span>
1546
+ <span class="cstat-no" title="statement not covered" > if (outputType === '1i') {</span>
1547
+ /*
1548
+ * Textures are passed to the shader by both providing the texture (with
1549
+ * texImage2D) and setting the |sampler| uniform equal to the index of
1550
+ * the texture. In etro shader effects, the subclass passes the names of
1551
+ * all the textures ot this base class, along with all the names of
1552
+ * uniforms. By default, corresponding uniforms (with the same name) are
1553
+ * created for each texture for ease of use. You can also define
1554
+ * different texture properties in the javascript effect by setting it
1555
+ * identical to the property with the passed texture name. In WebGL, it
1556
+ * will be set to the same integer texture unit.
1557
+ *
1558
+ * To do this, test if |value| is identical to a texture. If so, set it
1559
+ * to the texture's index, so the shader can use it.
1560
+ */
1561
+ let i = <span class="cstat-no" title="statement not covered" >0</span>
1562
+ <span class="cstat-no" title="statement not covered" > for (const name in this._userTextures) {</span>
1563
+ const testValue = <span class="cstat-no" title="statement not covered" >val(this, name, reltime)</span>
1564
+ <span class="cstat-no" title="statement not covered" > if (value === testValue) {</span>
1565
+ <span class="cstat-no" title="statement not covered" > value = Shader.INTERNAL_TEXTURE_UNITS + i /</span>/ after the internal texture units
1566
+ }
1567
+ &nbsp;
1568
+ <span class="cstat-no" title="statement not covered" > i++</span>
1569
+ }
1570
+ }
1571
+ &nbsp;
1572
+ <span class="cstat-no" title="statement not covered" > if (outputType === '3fv') {</span>
1573
+ // allow 4-component vectors; TODO: why?
1574
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(value) &amp;&amp; (value.length === 3 || value.length === 4)) {</span>
1575
+ <span class="cstat-no" title="statement not covered" > return value</span>
1576
+ }
1577
+ &nbsp;
1578
+ // kind of loose so this can be changed if needed
1579
+ <span class="cstat-no" title="statement not covered" > if (typeof value === 'object') {</span>
1580
+ <span class="cstat-no" title="statement not covered" > return [</span>
1581
+ value.r !== undefined ? value.r : def,
1582
+ value.g !== undefined ? value.g : def,
1583
+ value.b !== undefined ? value.b : def
1584
+ ]
1585
+ }
1586
+ &nbsp;
1587
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Invalid type: ${outputType} or value: ${value}`)</span>
1588
+ }
1589
+ &nbsp;
1590
+ <span class="cstat-no" title="statement not covered" > if (outputType === '4fv') {</span>
1591
+ <span class="cstat-no" title="statement not covered" > if (Array.isArray(value) &amp;&amp; value.length === 4) {</span>
1592
+ <span class="cstat-no" title="statement not covered" > return value</span>
1593
+ }
1594
+ &nbsp;
1595
+ // kind of loose so this can be changed if needed
1596
+ <span class="cstat-no" title="statement not covered" > if (typeof value === 'object') {</span>
1597
+ <span class="cstat-no" title="statement not covered" > return [</span>
1598
+ value.r !== undefined ? value.r : def,
1599
+ value.g !== undefined ? value.g : def,
1600
+ value.b !== undefined ? value.b : def,
1601
+ value.a !== undefined ? value.a : def
1602
+ ]
1603
+ }
1604
+ &nbsp;
1605
+ <span class="cstat-no" title="statement not covered" > throw new Error(`Invalid type: ${outputType} or value: ${value}`)</span>
1606
+ }
1607
+ &nbsp;
1608
+ <span class="cstat-no" title="statement not covered" > return value</span>
1609
+ }
1610
+ &nbsp;
1611
+ <span class="fstat-no" title="function not covered" > private static _</span>initRectBuffers (gl) {
1612
+ const position = <span class="cstat-no" title="statement not covered" >[</span>
1613
+ // the screen/canvas (output)
1614
+ -1.0, 1.0,
1615
+ 1.0, 1.0,
1616
+ -1.0, -1.0,
1617
+ 1.0, -1.0
1618
+ ]
1619
+ const textureCoord = <span class="cstat-no" title="statement not covered" >[</span>
1620
+ // the texture/canvas (input)
1621
+ 0.0, 0.0,
1622
+ 1.0, 0.0,
1623
+ 0.0, 1.0,
1624
+ 1.0, 1.0
1625
+ ]
1626
+ &nbsp;
1627
+ <span class="cstat-no" title="statement not covered" > return {</span>
1628
+ position: Shader._initBuffer(gl, position),
1629
+ textureCoord: Shader._initBuffer(gl, textureCoord)
1630
+ }
1631
+ }
1632
+ &nbsp;
1633
+ /**
1634
+ * Creates the quad covering the screen
1635
+ */
1636
+ <span class="fstat-no" title="function not covered" > private static _</span>initBuffer (gl, data) {
1637
+ const buffer = <span class="cstat-no" title="statement not covered" >gl.createBuffer()</span>
1638
+ &nbsp;
1639
+ // Select the buffer as the one to apply buffer operations to from here out.
1640
+ <span class="cstat-no" title="statement not covered" > gl.bindBuffer(gl.ARRAY_BUFFER, buffer)</span>
1641
+ &nbsp;
1642
+ <span class="cstat-no" title="statement not covered" > gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW)</span>
1643
+ &nbsp;
1644
+ <span class="cstat-no" title="statement not covered" > return buffer</span>
1645
+ }
1646
+ &nbsp;
1647
+ /**
1648
+ * Creates a webgl texture from the source.
1649
+ * @param [options] - optional WebGL config for texture
1650
+ * @param [options.target=gl.TEXTURE_2D]
1651
+ * @param [options.level=0]
1652
+ * @param [options.internalFormat=gl.RGBA]
1653
+ * @param [options.srcFormat=gl.RGBA]
1654
+ * @param [options.srcType=gl.UNSIGNED_BYTE]
1655
+ * @param [options.wrapS=gl.CLAMP_TO_EDGE]
1656
+ * @param [options.wrapT=gl.CLAMP_TO_EDGE]
1657
+ * @param [options.minFilter=gl.LINEAR]
1658
+ * @param [options.magFilter=gl.LINEAR]
1659
+ */
1660
+ <span class="fstat-no" title="function not covered" > private static _</span>loadTexture (gl, source, <span class="cstat-no" title="statement not covered" >options: TextureOptions = {}) {</span>
1661
+ // Apply default options, just in case.
1662
+ <span class="cstat-no" title="statement not covered" > options = { ...Shader._DEFAULT_TEXTURE_OPTIONS, ...options }</span>
1663
+ // When creating the option, the user can't access `gl` so access it here.
1664
+ const target = <span class="cstat-no" title="statement not covered" >gl[options.target]</span>
1665
+ const level = <span class="cstat-no" title="statement not covered" >options.level</span>
1666
+ const internalFormat = <span class="cstat-no" title="statement not covered" >gl[options.internalFormat]</span>
1667
+ const srcFormat = <span class="cstat-no" title="statement not covered" >gl[options.srcFormat]</span>
1668
+ const srcType = <span class="cstat-no" title="statement not covered" >gl[options.srcType]</span>
1669
+ const wrapS = <span class="cstat-no" title="statement not covered" >gl[options.wrapS]</span>
1670
+ const wrapT = <span class="cstat-no" title="statement not covered" >gl[options.wrapT]</span>
1671
+ const minFilter = <span class="cstat-no" title="statement not covered" >gl[options.minFilter]</span>
1672
+ const magFilter = <span class="cstat-no" title="statement not covered" >gl[options.magFilter]</span>
1673
+ // TODO: figure out how wrap-s and wrap-t interact with mipmaps
1674
+ // (for legacy support)
1675
+ // let wrapS = options.wrapS ? options.wrapS : gl.CLAMP_TO_EDGE,
1676
+ // wrapT = options.wrapT ? options.wrapT : gl.CLAMP_TO_EDGE;
1677
+ &nbsp;
1678
+ const tex = <span class="cstat-no" title="statement not covered" >gl.createTexture()</span>
1679
+ <span class="cstat-no" title="statement not covered" > gl.bindTexture(target, tex)</span>
1680
+ &nbsp;
1681
+ // gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true) // premultiply alpha
1682
+ &nbsp;
1683
+ // TODO: figure out how this works with layer width/height
1684
+ &nbsp;
1685
+ // TODO: support 3d textures (change texImage2D)
1686
+ // set to `source`
1687
+ <span class="cstat-no" title="statement not covered" > gl.texImage2D(target, level, internalFormat, srcFormat, srcType, source)</span>
1688
+ &nbsp;
1689
+ /*
1690
+ * WebGL1 has different requirements for power of 2 images vs non power of 2
1691
+ * images so check if the image is a power of 2 in both dimensions. Get
1692
+ * dimensions by using the fact that all valid inputs for texImage2D must have
1693
+ * `width` and `height` properties except videos, which have `videoWidth` and
1694
+ * `videoHeight` instead and `ArrayBufferView`, which is one dimensional (so
1695
+ * don't worry about mipmaps)
1696
+ */
1697
+ const w = <span class="cstat-no" title="statement not covered" >target instanceof HTMLVideoElement ? target.videoWidth : target.width</span>
1698
+ const h = <span class="cstat-no" title="statement not covered" >target instanceof HTMLVideoElement ? target.videoHeight : target.height</span>
1699
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, minFilter)</span>
1700
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, magFilter)</span>
1701
+ <span class="cstat-no" title="statement not covered" > if ((w &amp;&amp; isPowerOf2(w)) &amp;&amp; (h &amp;&amp; isPowerOf2(h))) {</span>
1702
+ // Yes, it's a power of 2. All wrap modes are valid. Generate mips.
1703
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_WRAP_S, wrapS)</span>
1704
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_WRAP_T, wrapT)</span>
1705
+ <span class="cstat-no" title="statement not covered" > gl.generateMipmap(target)</span>
1706
+ } else {
1707
+ // No, it's not a power of 2. Turn off mips and set
1708
+ // wrapping to clamp to edge
1709
+ <span class="cstat-no" title="statement not covered" > if (wrapS !== gl.CLAMP_TO_EDGE || wrapT !== gl.CLAMP_TO_EDGE) {</span>
1710
+ <span class="cstat-no" title="statement not covered" > console.warn('Wrap mode is not CLAMP_TO_EDGE for a non-power-of-two texture. Defaulting to CLAMP_TO_EDGE')</span>
1711
+ }
1712
+ &nbsp;
1713
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)</span>
1714
+ <span class="cstat-no" title="statement not covered" > gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)</span>
1715
+ }
1716
+ &nbsp;
1717
+ <span class="cstat-no" title="statement not covered" > return tex</span>
1718
+ }
1719
+ &nbsp;
1720
+ <span class="fstat-no" title="function not covered" > private static _</span>initShaderProgram (gl, vertexSrc, fragmentSrc) {
1721
+ const vertexShader = <span class="cstat-no" title="statement not covered" >Shader._loadShader(gl, gl.VERTEX_SHADER, vertexSrc)</span>
1722
+ const fragmentShader = <span class="cstat-no" title="statement not covered" >Shader._loadShader(gl, gl.FRAGMENT_SHADER, fragmentSrc)</span>
1723
+ &nbsp;
1724
+ const shaderProgram = <span class="cstat-no" title="statement not covered" >gl.createProgram()</span>
1725
+ <span class="cstat-no" title="statement not covered" > gl.attachShader(shaderProgram, vertexShader)</span>
1726
+ <span class="cstat-no" title="statement not covered" > gl.attachShader(shaderProgram, fragmentShader)</span>
1727
+ <span class="cstat-no" title="statement not covered" > gl.linkProgram(shaderProgram)</span>
1728
+ &nbsp;
1729
+ // Check program creation status
1730
+ <span class="cstat-no" title="statement not covered" > if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {</span>
1731
+ <span class="cstat-no" title="statement not covered" > console.warn('Unable to link shader program: ' + gl.getProgramInfoLog(shaderProgram))</span>
1732
+ <span class="cstat-no" title="statement not covered" > return null</span>
1733
+ }
1734
+ &nbsp;
1735
+ <span class="cstat-no" title="statement not covered" > return shaderProgram</span>
1736
+ }
1737
+ &nbsp;
1738
+ <span class="fstat-no" title="function not covered" > private static _</span>loadShader (gl, type, source) {
1739
+ const shader = <span class="cstat-no" title="statement not covered" >gl.createShader(type)</span>
1740
+ <span class="cstat-no" title="statement not covered" > gl.shaderSource(shader, source)</span>
1741
+ <span class="cstat-no" title="statement not covered" > gl.compileShader(shader)</span>
1742
+ &nbsp;
1743
+ // Check compile status
1744
+ <span class="cstat-no" title="statement not covered" > if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {</span>
1745
+ <span class="cstat-no" title="statement not covered" > console.warn('An error occured compiling shader: ' + gl.getShaderInfoLog(shader))</span>
1746
+ <span class="cstat-no" title="statement not covered" > gl.deleteShader(shader)</span>
1747
+ <span class="cstat-no" title="statement not covered" > return null</span>
1748
+ }
1749
+ &nbsp;
1750
+ <span class="cstat-no" title="statement not covered" > return shader</span>
1751
+ }
1752
+ }
1753
+ &nbsp;
1754
+ const isPowerOf2 = <span class="fstat-no" title="function not covered" >value </span>=&gt; <span class="cstat-no" title="statement not covered" >(value &amp;&amp; (value - 1)) === 0</span>
1755
+ &nbsp;</pre></td></tr></table></pre>
1756
+
1757
+ <div class='push'></div><!-- for sticky footer -->
1758
+ </div><!-- /wrapper -->
1759
+ <div class='footer quiet pad2 space-top1 center small'>
1760
+ Code coverage generated by
1761
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1762
+ at 2026-03-18T02:03:15.743Z
1763
+ </div>
1764
+ <script src="../../prettify.js"></script>
1765
+ <script>
1766
+ window.onload = function () {
1767
+ prettyPrint();
1768
+ };
1769
+ </script>
1770
+ <script src="../../sorter.js"></script>
1771
+ <script src="../../block-navigation.js"></script>
1772
+ </body>
1773
+ </html>
1774
+