@sealcode/sealgen 0.8.43 → 0.8.44

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 (268) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.mocharc.js +10 -0
  3. package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
  4. package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
  5. package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
  6. package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
  7. package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
  8. package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
  9. package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
  10. package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
  11. package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
  12. package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
  13. package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
  14. package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
  15. package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
  16. package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
  17. package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
  18. package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
  19. package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
  20. package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
  21. package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
  22. package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
  23. package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
  24. package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
  25. package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
  26. package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
  27. package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
  28. package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
  29. package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
  30. package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
  31. package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
  32. package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
  33. package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
  34. package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
  35. package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
  36. package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
  37. package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
  38. package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
  39. package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
  40. package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
  41. package/.nyc_output/processinfo/index.json +1 -1
  42. package/.nycrc +6 -0
  43. package/.prettierrc +20 -13
  44. package/.xunit +45 -1
  45. package/@types/add-route.d.ts +3 -1
  46. package/@types/add-route.test.d.ts +1 -0
  47. package/@types/build.d.ts +3 -1
  48. package/@types/example.test.d.ts +0 -0
  49. package/@types/forms/fields/boolean.test.d.ts +1 -0
  50. package/@types/forms/fields/email.test.d.ts +1 -0
  51. package/@types/forms/fields/enum-multiple.test.d.ts +1 -0
  52. package/@types/forms/fields/enum.test.d.ts +1 -0
  53. package/@types/forms/fields/number.test.d.ts +1 -0
  54. package/@types/forms/fields/pick-from-list.test.d.ts +1 -0
  55. package/@types/forms/fields/regexp.test.d.ts +1 -0
  56. package/@types/forms/form.test.d.ts +6 -0
  57. package/@types/forms/multiform.test.d.ts +1 -0
  58. package/@types/mount.d.ts +1 -1
  59. package/@types/page/mountable-with-fields.d.ts +1 -1
  60. package/@types/test_utils/locator_is_visible.d.ts +2 -0
  61. package/@types/utils/assert-throws.d.ts +1 -0
  62. package/@types/utils/browser-creator.d.ts +1 -0
  63. package/@types/utils/utils.d.ts +1 -0
  64. package/coverage/clover.xml +2208 -47
  65. package/coverage/lcov-report/base.css +224 -0
  66. package/coverage/lcov-report/block-navigation.js +79 -0
  67. package/coverage/lcov-report/favicon.png +0 -0
  68. package/coverage/lcov-report/index.html +231 -0
  69. package/coverage/lcov-report/prettify.css +1 -0
  70. package/coverage/lcov-report/prettify.js +2 -0
  71. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  72. package/coverage/lcov-report/sorter.js +170 -0
  73. package/coverage/lcov-report/src/add-collection.ts.html +173 -0
  74. package/coverage/lcov-report/src/add-route.test.ts.html +254 -0
  75. package/coverage/lcov-report/src/add-route.ts.html +338 -0
  76. package/coverage/lcov-report/src/build.ts.html +359 -0
  77. package/coverage/lcov-report/src/cli.ts.html +188 -0
  78. package/coverage/lcov-report/src/components/components.ts.html +86 -0
  79. package/coverage/lcov-report/src/components/index.html +141 -0
  80. package/coverage/lcov-report/src/components/tabs.ts.html +365 -0
  81. package/coverage/lcov-report/src/components/toggle-modal.ts.html +236 -0
  82. package/coverage/lcov-report/src/example.test.ts.html +89 -0
  83. package/coverage/lcov-report/src/find-scss-includes.ts.html +176 -0
  84. package/coverage/lcov-report/src/forms/controls/array.ts.html +758 -0
  85. package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +179 -0
  86. package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +224 -0
  87. package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +293 -0
  88. package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +182 -0
  89. package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +230 -0
  90. package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +164 -0
  91. package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +362 -0
  92. package/coverage/lcov-report/src/forms/controls/controls.ts.html +170 -0
  93. package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +353 -0
  94. package/coverage/lcov-report/src/forms/controls/derived.ts.html +404 -0
  95. package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +341 -0
  96. package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +371 -0
  97. package/coverage/lcov-report/src/forms/controls/field-group.ts.html +287 -0
  98. package/coverage/lcov-report/src/forms/controls/file.ts.html +221 -0
  99. package/coverage/lcov-report/src/forms/controls/form-control.ts.html +152 -0
  100. package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +146 -0
  101. package/coverage/lcov-report/src/forms/controls/form-header.ts.html +137 -0
  102. package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +113 -0
  103. package/coverage/lcov-report/src/forms/controls/frame.ts.html +158 -0
  104. package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +146 -0
  105. package/coverage/lcov-report/src/forms/controls/html.ts.html +194 -0
  106. package/coverage/lcov-report/src/forms/controls/index.html +561 -0
  107. package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +848 -0
  108. package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +212 -0
  109. package/coverage/lcov-report/src/forms/controls/number.ts.html +194 -0
  110. package/coverage/lcov-report/src/forms/controls/photo.ts.html +302 -0
  111. package/coverage/lcov-report/src/forms/controls/radio.ts.html +209 -0
  112. package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +230 -0
  113. package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +524 -0
  114. package/coverage/lcov-report/src/forms/controls/textarea.ts.html +260 -0
  115. package/coverage/lcov-report/src/forms/controls/tickable.ts.html +461 -0
  116. package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +188 -0
  117. package/coverage/lcov-report/src/forms/fields/boolean.ts.html +269 -0
  118. package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +278 -0
  119. package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +266 -0
  120. package/coverage/lcov-report/src/forms/fields/email.test.ts.html +152 -0
  121. package/coverage/lcov-report/src/forms/fields/email.ts.html +140 -0
  122. package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +173 -0
  123. package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +266 -0
  124. package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +155 -0
  125. package/coverage/lcov-report/src/forms/fields/enum.ts.html +248 -0
  126. package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +146 -0
  127. package/coverage/lcov-report/src/forms/fields/field.ts.html +596 -0
  128. package/coverage/lcov-report/src/forms/fields/file.ts.html +347 -0
  129. package/coverage/lcov-report/src/forms/fields/index.html +456 -0
  130. package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +140 -0
  131. package/coverage/lcov-report/src/forms/fields/number.test.ts.html +182 -0
  132. package/coverage/lcov-report/src/forms/fields/number.ts.html +290 -0
  133. package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +137 -0
  134. package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +236 -0
  135. package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +152 -0
  136. package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +155 -0
  137. package/coverage/lcov-report/src/forms/fields/regexp.ts.html +239 -0
  138. package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +140 -0
  139. package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +170 -0
  140. package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +161 -0
  141. package/coverage/lcov-report/src/forms/form.test.ts.html +1133 -0
  142. package/coverage/lcov-report/src/forms/form.ts.html +962 -0
  143. package/coverage/lcov-report/src/forms/index.html +156 -0
  144. package/coverage/lcov-report/src/forms/multiform.test.ts.html +1700 -0
  145. package/coverage/lcov-report/src/forms/multiform.ts.html +788 -0
  146. package/coverage/lcov-report/src/generate-collections.ts.html +311 -0
  147. package/coverage/lcov-report/src/generate-routes.ts.html +440 -0
  148. package/coverage/lcov-report/src/index.html +321 -0
  149. package/coverage/lcov-report/src/index.ts.html +152 -0
  150. package/coverage/lcov-report/src/make-env.ts.html +125 -0
  151. package/coverage/lcov-report/src/make-hidden-inputs.ts.html +152 -0
  152. package/coverage/lcov-report/src/mount.ts.html +335 -0
  153. package/coverage/lcov-report/src/page/access-control.ts.html +134 -0
  154. package/coverage/lcov-report/src/page/index.html +186 -0
  155. package/coverage/lcov-report/src/page/list.ts.html +800 -0
  156. package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +554 -0
  157. package/coverage/lcov-report/src/page/mountable.ts.html +119 -0
  158. package/coverage/lcov-report/src/page/page.ts.html +218 -0
  159. package/coverage/lcov-report/src/page/props-parser.ts.html +194 -0
  160. package/coverage/lcov-report/src/run.ts.html +80 -0
  161. package/coverage/lcov-report/src/sanitize.ts.html +107 -0
  162. package/coverage/lcov-report/src/templates/collection.ts.html +113 -0
  163. package/coverage/lcov-report/src/templates/form.ts.html +260 -0
  164. package/coverage/lcov-report/src/templates/index.html +216 -0
  165. package/coverage/lcov-report/src/templates/list.ts.html +305 -0
  166. package/coverage/lcov-report/src/templates/multiform.ts.html +254 -0
  167. package/coverage/lcov-report/src/templates/page.ts.html +155 -0
  168. package/coverage/lcov-report/src/templates/post.ts.html +143 -0
  169. package/coverage/lcov-report/src/templates/redirect.ts.html +146 -0
  170. package/coverage/lcov-report/src/templates/route-test.ts.html +161 -0
  171. package/coverage/lcov-report/src/test_utils/index.html +111 -0
  172. package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +131 -0
  173. package/coverage/lcov-report/src/utils/assert-throws.ts.html +134 -0
  174. package/coverage/lcov-report/src/utils/browser-creator.js.html +110 -0
  175. package/coverage/lcov-report/src/utils/escape-url-params.ts.html +122 -0
  176. package/coverage/lcov-report/src/utils/exec.ts.html +170 -0
  177. package/coverage/lcov-report/src/utils/format-external-url.ts.html +119 -0
  178. package/coverage/lcov-report/src/utils/import-path.ts.html +155 -0
  179. package/coverage/lcov-report/src/utils/index.html +366 -0
  180. package/coverage/lcov-report/src/utils/input-wrapper.ts.html +143 -0
  181. package/coverage/lcov-report/src/utils/list-collections.ts.html +128 -0
  182. package/coverage/lcov-report/src/utils/make-slug.ts.html +95 -0
  183. package/coverage/lcov-report/src/utils/natural-numbers.ts.html +95 -0
  184. package/coverage/lcov-report/src/utils/prettier.ts.html +119 -0
  185. package/coverage/lcov-report/src/utils/question.ts.html +149 -0
  186. package/coverage/lcov-report/src/utils/render-attributes.ts.html +131 -0
  187. package/coverage/lcov-report/src/utils/sleep.ts.html +89 -0
  188. package/coverage/lcov-report/src/utils/translate.ts.html +119 -0
  189. package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +107 -0
  190. package/coverage/lcov-report/src/utils/utils.ts.html +122 -0
  191. package/coverage/lcov-report/src/utils/walk.ts.html +140 -0
  192. package/coverage/lcov.info +4697 -0
  193. package/lib/add-route.js +3 -3
  194. package/lib/add-route.js.map +1 -1
  195. package/lib/add-route.test.js +55 -0
  196. package/lib/add-route.test.js.map +1 -0
  197. package/lib/build.js +3 -2
  198. package/lib/build.js.map +1 -1
  199. package/lib/cli.js +1 -1
  200. package/lib/cli.js.map +1 -1
  201. package/lib/example.test.js +4 -0
  202. package/lib/example.test.js.map +1 -0
  203. package/lib/forms/fields/boolean.test.js +37 -0
  204. package/lib/forms/fields/boolean.test.js.map +1 -0
  205. package/lib/forms/fields/email.test.js +25 -0
  206. package/lib/forms/fields/email.test.js.map +1 -0
  207. package/lib/forms/fields/enum-multiple.test.js +32 -0
  208. package/lib/forms/fields/enum-multiple.test.js.map +1 -0
  209. package/lib/forms/fields/enum.test.js +26 -0
  210. package/lib/forms/fields/enum.test.js.map +1 -0
  211. package/lib/forms/fields/number.js +0 -1
  212. package/lib/forms/fields/number.js.map +1 -1
  213. package/lib/forms/fields/number.test.js +35 -0
  214. package/lib/forms/fields/number.test.js.map +1 -0
  215. package/lib/forms/fields/pick-from-list.test.js +22 -0
  216. package/lib/forms/fields/pick-from-list.test.js.map +1 -0
  217. package/lib/forms/fields/regexp.test.js +26 -0
  218. package/lib/forms/fields/regexp.test.js.map +1 -0
  219. package/lib/forms/form.test.js +275 -0
  220. package/lib/forms/form.test.js.map +1 -0
  221. package/lib/forms/multiform.js +11 -2
  222. package/lib/forms/multiform.js.map +1 -1
  223. package/lib/forms/multiform.test.js +431 -0
  224. package/lib/forms/multiform.test.js.map +1 -0
  225. package/lib/mount.js +37 -2
  226. package/lib/mount.js.map +1 -1
  227. package/lib/test_utils/locator_is_visible.js +15 -0
  228. package/lib/test_utils/locator_is_visible.js.map +1 -0
  229. package/lib/utils/assert-throws.js +24 -0
  230. package/lib/utils/assert-throws.js.map +1 -0
  231. package/lib/utils/browser-creator.js +14 -0
  232. package/lib/utils/browser-creator.js.map +1 -0
  233. package/lib/utils/exec.js.map +1 -1
  234. package/lib/utils/question.js.map +1 -1
  235. package/lib/utils/utils.js +3 -1
  236. package/lib/utils/utils.js.map +1 -1
  237. package/mocha_root_hooks.js +6 -0
  238. package/package.json +16 -8
  239. package/src/add-route.test.ts +58 -0
  240. package/src/add-route.ts +6 -5
  241. package/src/build.ts +6 -3
  242. package/src/cli.ts +2 -2
  243. package/src/forms/fields/boolean.test.ts +36 -0
  244. package/src/forms/fields/email.test.ts +24 -0
  245. package/src/forms/fields/enum-multiple.test.ts +31 -0
  246. package/src/forms/fields/enum.test.ts +25 -0
  247. package/src/forms/fields/number.test.ts +34 -0
  248. package/src/forms/fields/number.ts +0 -1
  249. package/src/forms/fields/pick-from-list.test.ts +19 -0
  250. package/src/forms/fields/regexp.test.ts +25 -0
  251. package/src/forms/form.test.ts +351 -0
  252. package/src/forms/multiform.test.ts +540 -0
  253. package/src/forms/multiform.ts +12 -2
  254. package/src/mount.ts +42 -8
  255. package/src/page/mountable-with-fields.ts +1 -1
  256. package/src/test_utils/locator_is_visible.ts +17 -0
  257. package/src/utils/assert-throws.ts +18 -0
  258. package/src/utils/browser-creator.js +10 -0
  259. package/src/utils/exec.ts +8 -2
  260. package/src/utils/question.ts +4 -1
  261. package/src/utils/utils.ts +1 -0
  262. package/tsconfig.json +2 -2
  263. package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
  264. package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
  265. package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
  266. package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
  267. package/src/tests/manual/multiform.ts +0 -112
  268. package/test.js +0 -68
@@ -0,0 +1,800 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/page/list.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/page</a> list.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">15.63% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>10/64</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/20</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/22</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">15.87% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>10/63</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
+ </div>
58
+ <div class='status-line low'></div>
59
+ <pre><table class="coverage">
60
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
+ <a name='L2'></a><a href='#L2'>2</a>
62
+ <a name='L3'></a><a href='#L3'>3</a>
63
+ <a name='L4'></a><a href='#L4'>4</a>
64
+ <a name='L5'></a><a href='#L5'>5</a>
65
+ <a name='L6'></a><a href='#L6'>6</a>
66
+ <a name='L7'></a><a href='#L7'>7</a>
67
+ <a name='L8'></a><a href='#L8'>8</a>
68
+ <a name='L9'></a><a href='#L9'>9</a>
69
+ <a name='L10'></a><a href='#L10'>10</a>
70
+ <a name='L11'></a><a href='#L11'>11</a>
71
+ <a name='L12'></a><a href='#L12'>12</a>
72
+ <a name='L13'></a><a href='#L13'>13</a>
73
+ <a name='L14'></a><a href='#L14'>14</a>
74
+ <a name='L15'></a><a href='#L15'>15</a>
75
+ <a name='L16'></a><a href='#L16'>16</a>
76
+ <a name='L17'></a><a href='#L17'>17</a>
77
+ <a name='L18'></a><a href='#L18'>18</a>
78
+ <a name='L19'></a><a href='#L19'>19</a>
79
+ <a name='L20'></a><a href='#L20'>20</a>
80
+ <a name='L21'></a><a href='#L21'>21</a>
81
+ <a name='L22'></a><a href='#L22'>22</a>
82
+ <a name='L23'></a><a href='#L23'>23</a>
83
+ <a name='L24'></a><a href='#L24'>24</a>
84
+ <a name='L25'></a><a href='#L25'>25</a>
85
+ <a name='L26'></a><a href='#L26'>26</a>
86
+ <a name='L27'></a><a href='#L27'>27</a>
87
+ <a name='L28'></a><a href='#L28'>28</a>
88
+ <a name='L29'></a><a href='#L29'>29</a>
89
+ <a name='L30'></a><a href='#L30'>30</a>
90
+ <a name='L31'></a><a href='#L31'>31</a>
91
+ <a name='L32'></a><a href='#L32'>32</a>
92
+ <a name='L33'></a><a href='#L33'>33</a>
93
+ <a name='L34'></a><a href='#L34'>34</a>
94
+ <a name='L35'></a><a href='#L35'>35</a>
95
+ <a name='L36'></a><a href='#L36'>36</a>
96
+ <a name='L37'></a><a href='#L37'>37</a>
97
+ <a name='L38'></a><a href='#L38'>38</a>
98
+ <a name='L39'></a><a href='#L39'>39</a>
99
+ <a name='L40'></a><a href='#L40'>40</a>
100
+ <a name='L41'></a><a href='#L41'>41</a>
101
+ <a name='L42'></a><a href='#L42'>42</a>
102
+ <a name='L43'></a><a href='#L43'>43</a>
103
+ <a name='L44'></a><a href='#L44'>44</a>
104
+ <a name='L45'></a><a href='#L45'>45</a>
105
+ <a name='L46'></a><a href='#L46'>46</a>
106
+ <a name='L47'></a><a href='#L47'>47</a>
107
+ <a name='L48'></a><a href='#L48'>48</a>
108
+ <a name='L49'></a><a href='#L49'>49</a>
109
+ <a name='L50'></a><a href='#L50'>50</a>
110
+ <a name='L51'></a><a href='#L51'>51</a>
111
+ <a name='L52'></a><a href='#L52'>52</a>
112
+ <a name='L53'></a><a href='#L53'>53</a>
113
+ <a name='L54'></a><a href='#L54'>54</a>
114
+ <a name='L55'></a><a href='#L55'>55</a>
115
+ <a name='L56'></a><a href='#L56'>56</a>
116
+ <a name='L57'></a><a href='#L57'>57</a>
117
+ <a name='L58'></a><a href='#L58'>58</a>
118
+ <a name='L59'></a><a href='#L59'>59</a>
119
+ <a name='L60'></a><a href='#L60'>60</a>
120
+ <a name='L61'></a><a href='#L61'>61</a>
121
+ <a name='L62'></a><a href='#L62'>62</a>
122
+ <a name='L63'></a><a href='#L63'>63</a>
123
+ <a name='L64'></a><a href='#L64'>64</a>
124
+ <a name='L65'></a><a href='#L65'>65</a>
125
+ <a name='L66'></a><a href='#L66'>66</a>
126
+ <a name='L67'></a><a href='#L67'>67</a>
127
+ <a name='L68'></a><a href='#L68'>68</a>
128
+ <a name='L69'></a><a href='#L69'>69</a>
129
+ <a name='L70'></a><a href='#L70'>70</a>
130
+ <a name='L71'></a><a href='#L71'>71</a>
131
+ <a name='L72'></a><a href='#L72'>72</a>
132
+ <a name='L73'></a><a href='#L73'>73</a>
133
+ <a name='L74'></a><a href='#L74'>74</a>
134
+ <a name='L75'></a><a href='#L75'>75</a>
135
+ <a name='L76'></a><a href='#L76'>76</a>
136
+ <a name='L77'></a><a href='#L77'>77</a>
137
+ <a name='L78'></a><a href='#L78'>78</a>
138
+ <a name='L79'></a><a href='#L79'>79</a>
139
+ <a name='L80'></a><a href='#L80'>80</a>
140
+ <a name='L81'></a><a href='#L81'>81</a>
141
+ <a name='L82'></a><a href='#L82'>82</a>
142
+ <a name='L83'></a><a href='#L83'>83</a>
143
+ <a name='L84'></a><a href='#L84'>84</a>
144
+ <a name='L85'></a><a href='#L85'>85</a>
145
+ <a name='L86'></a><a href='#L86'>86</a>
146
+ <a name='L87'></a><a href='#L87'>87</a>
147
+ <a name='L88'></a><a href='#L88'>88</a>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a>
219
+ <a name='L160'></a><a href='#L160'>160</a>
220
+ <a name='L161'></a><a href='#L161'>161</a>
221
+ <a name='L162'></a><a href='#L162'>162</a>
222
+ <a name='L163'></a><a href='#L163'>163</a>
223
+ <a name='L164'></a><a href='#L164'>164</a>
224
+ <a name='L165'></a><a href='#L165'>165</a>
225
+ <a name='L166'></a><a href='#L166'>166</a>
226
+ <a name='L167'></a><a href='#L167'>167</a>
227
+ <a name='L168'></a><a href='#L168'>168</a>
228
+ <a name='L169'></a><a href='#L169'>169</a>
229
+ <a name='L170'></a><a href='#L170'>170</a>
230
+ <a name='L171'></a><a href='#L171'>171</a>
231
+ <a name='L172'></a><a href='#L172'>172</a>
232
+ <a name='L173'></a><a href='#L173'>173</a>
233
+ <a name='L174'></a><a href='#L174'>174</a>
234
+ <a name='L175'></a><a href='#L175'>175</a>
235
+ <a name='L176'></a><a href='#L176'>176</a>
236
+ <a name='L177'></a><a href='#L177'>177</a>
237
+ <a name='L178'></a><a href='#L178'>178</a>
238
+ <a name='L179'></a><a href='#L179'>179</a>
239
+ <a name='L180'></a><a href='#L180'>180</a>
240
+ <a name='L181'></a><a href='#L181'>181</a>
241
+ <a name='L182'></a><a href='#L182'>182</a>
242
+ <a name='L183'></a><a href='#L183'>183</a>
243
+ <a name='L184'></a><a href='#L184'>184</a>
244
+ <a name='L185'></a><a href='#L185'>185</a>
245
+ <a name='L186'></a><a href='#L186'>186</a>
246
+ <a name='L187'></a><a href='#L187'>187</a>
247
+ <a name='L188'></a><a href='#L188'>188</a>
248
+ <a name='L189'></a><a href='#L189'>189</a>
249
+ <a name='L190'></a><a href='#L190'>190</a>
250
+ <a name='L191'></a><a href='#L191'>191</a>
251
+ <a name='L192'></a><a href='#L192'>192</a>
252
+ <a name='L193'></a><a href='#L193'>193</a>
253
+ <a name='L194'></a><a href='#L194'>194</a>
254
+ <a name='L195'></a><a href='#L195'>195</a>
255
+ <a name='L196'></a><a href='#L196'>196</a>
256
+ <a name='L197'></a><a href='#L197'>197</a>
257
+ <a name='L198'></a><a href='#L198'>198</a>
258
+ <a name='L199'></a><a href='#L199'>199</a>
259
+ <a name='L200'></a><a href='#L200'>200</a>
260
+ <a name='L201'></a><a href='#L201'>201</a>
261
+ <a name='L202'></a><a href='#L202'>202</a>
262
+ <a name='L203'></a><a href='#L203'>203</a>
263
+ <a name='L204'></a><a href='#L204'>204</a>
264
+ <a name='L205'></a><a href='#L205'>205</a>
265
+ <a name='L206'></a><a href='#L206'>206</a>
266
+ <a name='L207'></a><a href='#L207'>207</a>
267
+ <a name='L208'></a><a href='#L208'>208</a>
268
+ <a name='L209'></a><a href='#L209'>209</a>
269
+ <a name='L210'></a><a href='#L210'>210</a>
270
+ <a name='L211'></a><a href='#L211'>211</a>
271
+ <a name='L212'></a><a href='#L212'>212</a>
272
+ <a name='L213'></a><a href='#L213'>213</a>
273
+ <a name='L214'></a><a href='#L214'>214</a>
274
+ <a name='L215'></a><a href='#L215'>215</a>
275
+ <a name='L216'></a><a href='#L216'>216</a>
276
+ <a name='L217'></a><a href='#L217'>217</a>
277
+ <a name='L218'></a><a href='#L218'>218</a>
278
+ <a name='L219'></a><a href='#L219'>219</a>
279
+ <a name='L220'></a><a href='#L220'>220</a>
280
+ <a name='L221'></a><a href='#L221'>221</a>
281
+ <a name='L222'></a><a href='#L222'>222</a>
282
+ <a name='L223'></a><a href='#L223'>223</a>
283
+ <a name='L224'></a><a href='#L224'>224</a>
284
+ <a name='L225'></a><a href='#L225'>225</a>
285
+ <a name='L226'></a><a href='#L226'>226</a>
286
+ <a name='L227'></a><a href='#L227'>227</a>
287
+ <a name='L228'></a><a href='#L228'>228</a>
288
+ <a name='L229'></a><a href='#L229'>229</a>
289
+ <a name='L230'></a><a href='#L230'>230</a>
290
+ <a name='L231'></a><a href='#L231'>231</a>
291
+ <a name='L232'></a><a href='#L232'>232</a>
292
+ <a name='L233'></a><a href='#L233'>233</a>
293
+ <a name='L234'></a><a href='#L234'>234</a>
294
+ <a name='L235'></a><a href='#L235'>235</a>
295
+ <a name='L236'></a><a href='#L236'>236</a>
296
+ <a name='L237'></a><a href='#L237'>237</a>
297
+ <a name='L238'></a><a href='#L238'>238</a>
298
+ <a name='L239'></a><a href='#L239'>239</a>
299
+ <a name='L240'></a><a href='#L240'>240</a>
300
+ <a name='L241'></a><a href='#L241'>241</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-yes">1x</span>
310
+ <span class="cline-any cline-yes">1x</span>
311
+ <span class="cline-any cline-yes">1x</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-yes">1x</span>
315
+ <span class="cline-any cline-yes">1x</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-yes">1x</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-yes">1x</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-yes">1x</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-yes">1x</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-no">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-no">&nbsp;</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-no">&nbsp;</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-neutral">&nbsp;</span>
380
+ <span class="cline-any cline-no">&nbsp;</span>
381
+ <span class="cline-any cline-no">&nbsp;</span>
382
+ <span class="cline-any cline-no">&nbsp;</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-no">&nbsp;</span>
387
+ <span class="cline-any cline-neutral">&nbsp;</span>
388
+ <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-neutral">&nbsp;</span>
393
+ <span class="cline-any cline-no">&nbsp;</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-neutral">&nbsp;</span>
398
+ <span class="cline-any cline-neutral">&nbsp;</span>
399
+ <span class="cline-any cline-neutral">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-no">&nbsp;</span>
403
+ <span class="cline-any cline-no">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-no">&nbsp;</span>
406
+ <span class="cline-any cline-neutral">&nbsp;</span>
407
+ <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-neutral">&nbsp;</span>
409
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
+ <span class="cline-any cline-neutral">&nbsp;</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-neutral">&nbsp;</span>
415
+ <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-neutral">&nbsp;</span>
437
+ <span class="cline-any cline-no">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-neutral">&nbsp;</span>
443
+ <span class="cline-any cline-neutral">&nbsp;</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
446
+ <span class="cline-any cline-neutral">&nbsp;</span>
447
+ <span class="cline-any cline-neutral">&nbsp;</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-neutral">&nbsp;</span>
457
+ <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-neutral">&nbsp;</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-neutral">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-neutral">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-yes">1x</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-neutral">&nbsp;</span>
484
+ <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
+ <span class="cline-any cline-neutral">&nbsp;</span>
488
+ <span class="cline-any cline-neutral">&nbsp;</span>
489
+ <span class="cline-any cline-neutral">&nbsp;</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
+ <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-neutral">&nbsp;</span>
493
+ <span class="cline-any cline-neutral">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
498
+ <span class="cline-any cline-neutral">&nbsp;</span>
499
+ <span class="cline-any cline-neutral">&nbsp;</span>
500
+ <span class="cline-any cline-neutral">&nbsp;</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
+ <span class="cline-any cline-neutral">&nbsp;</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-no">&nbsp;</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
509
+ <span class="cline-any cline-no">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-neutral">&nbsp;</span>
514
+ <span class="cline-any cline-no">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-neutral">&nbsp;</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-no">&nbsp;</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { Context } from "koa";
541
+ import {
542
+ Collection,
543
+ CollectionItem,
544
+ ItemList,
545
+ Context as SealiousContext,
546
+ CollectionInput,
547
+ } from "sealious";
548
+ &nbsp;
549
+ import { Templatable, tempstream, FlatTemplatable } from "tempstream";
550
+ import { peopleWhoCan } from "./access-control";
551
+ import { Page } from "./page";
552
+ import { ShapeToType } from "@sealcode/ts-predicates";
553
+ import { FormControl } from "../forms/controls/controls";
554
+ import { FormField, NumberField } from "../forms/fields/field";
555
+ import { naturalNumbers, UrlWithNewParams } from "../utils/utils";
556
+ import { FormDataValue } from "..";
557
+ import { makeHiddenInputs } from "../make-hidden-inputs";
558
+ &nbsp;
559
+ export const BasePagePropsShape = &lt;const&gt;{};
560
+ export type BasePageProps = ShapeToType&lt;typeof BasePagePropsShape&gt;;
561
+ &nbsp;
562
+ export const BaseListPageFields = &lt;const&gt;{
563
+ page: new NumberField(false, 1),
564
+ itemsPerPage: new NumberField(false, 12),
565
+ };
566
+ &nbsp;
567
+ <span class="fstat-no" title="function not covered" >export abstract class L</span>istPage&lt;
568
+ ItemType,
569
+ F extends typeof BaseListPageFields
570
+ &gt; extends Page&lt;F&gt; {
571
+ abstract getItems(
572
+ ctx: Context,
573
+ page: number,
574
+ itemsPerPage: number,
575
+ values: Record&lt;string, FormDataValue&gt;
576
+ ): Promise&lt;ItemType[]&gt;;
577
+ &nbsp;
578
+ abstract getTotalPages(
579
+ ctx: Context,
580
+ itemsPerPage: number,
581
+ values: Record&lt;string, FormDataValue&gt;
582
+ ): Promise&lt;number&gt;;
583
+ &nbsp;
584
+ abstract renderItem(
585
+ ctx: Context,
586
+ item: ItemType,
587
+ index: number
588
+ ): Promise&lt;FlatTemplatable&gt;;
589
+ &nbsp;
590
+ <span class="cstat-no" title="statement not covered" > filterFields: Record&lt;string, FormField&gt; = {};</span>
591
+ <span class="cstat-no" title="statement not covered" > filterControls: FormControl[] = [];</span>
592
+ &nbsp;
593
+ <span class="fstat-no" title="function not covered" > init(</span>): void {
594
+ <span class="cstat-no" title="statement not covered" > super.init();</span>
595
+ <span class="cstat-no" title="statement not covered" > for (const [fieldname, field] of Object.entries(this.filterFields)) {</span>
596
+ <span class="cstat-no" title="statement not covered" > field.init(fieldname);</span>
597
+ }
598
+ }
599
+ &nbsp;
600
+ <span class="fstat-no" title="function not covered" > renderListContainer(</span>_: Context, content: Templatable): FlatTemplatable {
601
+ <span class="cstat-no" title="statement not covered" > return tempstream`&lt;div&gt;${content}&lt;/div&gt;`;</span>
602
+ }
603
+ &nbsp;
604
+ <span class="fstat-no" title="function not covered" > async </span>getPaginationConfig(ctx: Context) {
605
+ const values = <span class="cstat-no" title="statement not covered" >await this.extractRawValues(ctx);</span>
606
+ const { parsed: page } = <span class="cstat-no" title="statement not covered" >await this.fields.page.getValue(ctx, values);</span>
607
+ const { parsed: itemsPerPage } =
608
+ <span class="cstat-no" title="statement not covered" > await this.fields.itemsPerPage.getValue(ctx, values);</span>
609
+ <span class="cstat-no" title="statement not covered" > return { page, itemsPerPage };</span>
610
+ }
611
+ &nbsp;
612
+ <span class="fstat-no" title="function not covered" > async </span>renderItems(
613
+ ctx: Context,
614
+ values?: Record&lt;string, FormDataValue&gt;,
615
+ items?: ItemType[]
616
+ ): Promise&lt;FlatTemplatable&gt; {
617
+ <span class="cstat-no" title="statement not covered" > if (!values) {</span>
618
+ <span class="cstat-no" title="statement not covered" > values = await this.extractRawValues(ctx);</span>
619
+ }
620
+ const { itemsPerPage, page } = <span class="cstat-no" title="statement not covered" >await this.getPaginationConfig(ctx);</span>
621
+ const items_promise = <span class="cstat-no" title="statement not covered" >this.getItems(ctx, page, itemsPerPage, values);</span>
622
+ <span class="cstat-no" title="statement not covered" > return tempstream`${(items</span>
623
+ ? Promise.resolve(items)
624
+ : items_promise
625
+ ).then(<span class="fstat-no" title="function not covered" >(i</span>tems) =&gt;
626
+ <span class="cstat-no" title="statement not covered" > items.map(<span class="fstat-no" title="function not covered" >(i</span>tem, index) =&gt; <span class="cstat-no" title="statement not covered" >this.renderItem(ctx, item, index))</span></span>
627
+ )}`;
628
+ }
629
+ &nbsp;
630
+ <span class="fstat-no" title="function not covered" > async </span>render(ctx: Context): Promise&lt;FlatTemplatable&gt; {
631
+ const values = <span class="cstat-no" title="statement not covered" >await this.extractRawValues(ctx);</span>
632
+ &nbsp;
633
+ <span class="cstat-no" title="statement not covered" > return tempstream`${this.renderPagination(ctx, values)}</span>
634
+ ${this.renderFilters(ctx)}
635
+ ${this.renderListContainer(ctx, this.renderItems(ctx, values))}`;
636
+ }
637
+ &nbsp;
638
+ <span class="fstat-no" title="function not covered" > async </span>renderPagination(
639
+ ctx: Context,
640
+ values: Record&lt;string, FormDataValue&gt;
641
+ ): Promise&lt;FlatTemplatable&gt; {
642
+ const { itemsPerPage, page } = <span class="cstat-no" title="statement not covered" >await this.getPaginationConfig(ctx);</span>
643
+ const totalIems = <span class="cstat-no" title="statement not covered" >await this.getTotalPages(ctx, itemsPerPage, values);</span>
644
+ &nbsp;
645
+ <span class="cstat-no" title="statement not covered" > return tempstream/* HTML */ `&lt;center&gt;</span>
646
+ ${page &gt; 1 ? this.renderPageButton(ctx, 1, "Pierwsza strona") : ""}
647
+ ${page &gt; 1
648
+ ? this.renderPageButton(ctx, page - 1, "Poprzednia strona")
649
+ : ""}
650
+ &nbsp;
651
+ &lt;select onchange="if (this.value) Turbo.visit(this.value)"&gt;
652
+ ${Array.from(naturalNumbers(1, totalIems)).map(
653
+ <span class="fstat-no" title="function not covered" > (n</span>) =&gt; /* HTML */ <span class="cstat-no" title="statement not covered" >`&lt;option</span>
654
+ value="${UrlWithNewParams(
655
+ ctx,
656
+ //eslint-disable-next-line @typescript-eslint/consistent-type-assertions
657
+ this.propsParser.overwriteProp(ctx, {
658
+ page: n,
659
+ } as Partial&lt;Record&lt;string, unknown&gt;&gt;)
660
+ )}"
661
+ ${page === n ? "selected" : ""}
662
+ &gt;
663
+ ${n}
664
+ &lt;/option&gt;`
665
+ )}
666
+ &lt;/select&gt;
667
+ ${page &lt; totalIems
668
+ ? this.renderPageButton(ctx, page + 1, "Następna strona")
669
+ : ""}
670
+ ${page &lt; totalIems
671
+ ? this.renderPageButton(ctx, totalIems, "Ostatnia strona")
672
+ : ""}
673
+ &lt;/center&gt;`;
674
+ }
675
+ &nbsp;
676
+ private <span class="fstat-no" title="function not covered" >renderPageButton(</span>ctx: Context, page: number, text: string) {
677
+ <span class="cstat-no" title="statement not covered" > return /* HTML */ `&lt;a</span>
678
+ href="${UrlWithNewParams(
679
+ ctx,
680
+ //eslint-disable-next-line @typescript-eslint/consistent-type-assertions
681
+ this.propsParser.overwriteProp(ctx, {
682
+ page,
683
+ } as Partial&lt;Record&lt;string, unknown&gt;&gt;)
684
+ )}"
685
+ &gt;${text}&lt;/a
686
+ &gt;`;
687
+ }
688
+ &nbsp;
689
+ <span class="fstat-no" title="function not covered" > async </span>getFilterValues(ctx: Context): Promise&lt;Record&lt;string, unknown&gt;&gt; {
690
+ const filter = <span class="cstat-no" title="statement not covered" >{} as Record&lt;string, unknown&gt;;</span>
691
+ const raw_values = <span class="cstat-no" title="statement not covered" >await this.extractRawValues(ctx);</span>
692
+ <span class="cstat-no" title="statement not covered" > for (const [fieldname, field] of Object.entries(this.filterFields)) {</span>
693
+ // eslint-disable-next-line no-await-in-loop
694
+ const { parsed } = <span class="cstat-no" title="statement not covered" >await field.getValue(ctx, raw_values);</span>
695
+ <span class="cstat-no" title="statement not covered" > filter[fieldname] = field.mapToFilter(parsed);</span>
696
+ }
697
+ <span class="cstat-no" title="statement not covered" > return filter;</span>
698
+ }
699
+ &nbsp;
700
+ <span class="fstat-no" title="function not covered" > async </span>renderFilters(ctx: Context): Promise&lt;FlatTemplatable&gt; {
701
+ const values = <span class="cstat-no" title="statement not covered" >await this.extractRawValues(ctx);</span>
702
+ <span class="cstat-no" title="statement not covered" > return tempstream/* HTML */ `&lt;form method="GET"&gt;</span>
703
+ ${makeHiddenInputs(ctx, this.fields, values, [
704
+ "page",
705
+ ...Object.values(this.filterFields).map(<span class="fstat-no" title="function not covered" >(f</span>) =&gt; <span class="cstat-no" title="statement not covered" >f.name)</span>,
706
+ ])}
707
+ ${this.filterControls.map(<span class="fstat-no" title="function not covered" >(c</span>ontrol) =&gt; {
708
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
709
+ <span class="cstat-no" title="statement not covered" > return control.render(</span>
710
+ this.makeFormControlContext(
711
+ ctx,
712
+ { raw_values: values, messages: [] },
713
+ false
714
+ )
715
+ );
716
+ })}
717
+ &lt;/form&gt;`;
718
+ }
719
+ }
720
+ &nbsp;
721
+ export abstract class SealiousItemListPage&lt;
722
+ C extends Collection,
723
+ F extends typeof BaseListPageFields
724
+ &gt; extends ListPage&lt;CollectionItem&lt;C&gt;, F&gt; {
725
+ <span class="fstat-no" title="function not covered" > constructor(public <span class="cstat-no" title="statement not covered" >c</span>ollection: C)</span> {
726
+ <span class="cstat-no" title="statement not covered" > super();</span>
727
+ }
728
+ &nbsp;
729
+ <span class="fstat-no" title="function not covered" > async </span>getContextForList(ctx: Context): Promise&lt;SealiousContext&gt; {
730
+ <span class="cstat-no" title="statement not covered" > return ctx.$context;</span>
731
+ }
732
+ &nbsp;
733
+ <span class="fstat-no" title="function not covered" > async </span>getTotalPages(ctx: Context, itemsPerPage: number): Promise&lt;number&gt; {
734
+ const query = <span class="cstat-no" title="statement not covered" >this.collection.list(await this.getContextForList(ctx));</span>
735
+ <span class="cstat-no" title="statement not covered" > await this.addFilter(ctx, query);</span>
736
+ const { items } = <span class="cstat-no" title="statement not covered" >await query.fetch();</span>
737
+ <span class="cstat-no" title="statement not covered" > return Math.ceil(items.length / itemsPerPage);</span>
738
+ }
739
+ &nbsp;
740
+ protected <span class="fstat-no" title="function not covered" >async </span>addFilter(ctx: Context, list: ItemList&lt;C&gt;): Promise&lt;void&gt; {
741
+ const filters = <span class="cstat-no" title="statement not covered" >await this.getFilterValues(ctx);</span>
742
+ &nbsp;
743
+ <span class="cstat-no" title="statement not covered" > for (const key in filters) {</span>
744
+ <span class="cstat-no" title="statement not covered" > if (filters[key] === undefined || filters[key] == "") {</span>
745
+ <span class="cstat-no" title="statement not covered" > delete filters[key];</span>
746
+ }
747
+ }
748
+ <span class="cstat-no" title="statement not covered" > if (Object.keys(filters).length) {</span>
749
+ <span class="cstat-no" title="statement not covered" > list.filter(filters as Partial&lt;CollectionInput&lt;C&gt;&gt;);</span>
750
+ }
751
+ }
752
+ &nbsp;
753
+ <span class="fstat-no" title="function not covered" > async </span>makeQuery(ctx: Context): Promise&lt;ItemList&lt;C&gt;&gt; {
754
+ <span class="cstat-no" title="statement not covered" > return this.collection.list(await this.getContextForList(ctx));</span>
755
+ }
756
+ &nbsp;
757
+ <span class="fstat-no" title="function not covered" > async </span>getItems(
758
+ ctx: Context,
759
+ page: number,
760
+ itemsPerPage: number
761
+ ): Promise&lt;CollectionItem&lt;C&gt;[]&gt; {
762
+ const query = <span class="cstat-no" title="statement not covered" >await this.makeQuery(ctx);</span>
763
+ <span class="cstat-no" title="statement not covered" > await this.addFilter(ctx, query);</span>
764
+ const { items } = <span class="cstat-no" title="statement not covered" >await query</span>
765
+ .paginate({ items: itemsPerPage, page })
766
+ .fetch();
767
+ <span class="cstat-no" title="statement not covered" > return items;</span>
768
+ }
769
+ &nbsp;
770
+ <span class="fstat-no" title="function not covered" > async </span>renderItem(
771
+ _: Context,
772
+ item: CollectionItem&lt;C&gt;,
773
+ index: number
774
+ ): Promise&lt;FlatTemplatable&gt; {
775
+ <span class="cstat-no" title="statement not covered" > return `&lt;div&gt;${item.id}&lt;/div&gt;`;</span>
776
+ }
777
+ &nbsp;
778
+ <span class="cstat-no" title="statement not covered" > canAccess = peopleWhoCan("list", this.collection);</span>
779
+ }
780
+ &nbsp;</pre></td></tr></table></pre>
781
+
782
+ <div class='push'></div><!-- for sticky footer -->
783
+ </div><!-- /wrapper -->
784
+ <div class='footer quiet pad2 space-top1 center small'>
785
+ Code coverage generated by
786
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
787
+ at Thu Apr 20 2023 20:03:31 GMT+0200 (Central European Summer Time)
788
+ </div>
789
+ </div>
790
+ <script src="../../prettify.js"></script>
791
+ <script>
792
+ window.onload = function () {
793
+ prettyPrint();
794
+ };
795
+ </script>
796
+ <script src="../../sorter.js"></script>
797
+ <script src="../../block-navigation.js"></script>
798
+ </body>
799
+ </html>
800
+