@budibase/server 1.2.58 → 1.2.59-alpha.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 (211) hide show
  1. package/__mocks__/mongodb.ts +4 -0
  2. package/__mocks__/node-fetch.ts +8 -1
  3. package/builder/assets/index.48098778.js +875 -0
  4. package/builder/assets/index.e50bda9f.css +6 -0
  5. package/builder/assets/{vendor.6bcafa60.js → vendor.67dbd8fa.js} +1 -1
  6. package/builder/index.html +3 -3
  7. package/coverage/clover.xml +549 -524
  8. package/coverage/coverage-final.json +20 -20
  9. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/index.html +25 -25
  29. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +317 -191
  31. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/row/utils.js.html +27 -18
  33. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/external.js.html +2 -2
  37. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/user.js.html +19 -19
  41. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  47. package/coverage/lcov-report/api/index.html +1 -1
  48. package/coverage/lcov-report/api/index.js.html +5 -5
  49. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/index.html +1 -1
  60. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  74. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  77. package/coverage/lcov-report/automations/actions.js.html +1 -1
  78. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  79. package/coverage/lcov-report/automations/bullboard.js.html +9 -6
  80. package/coverage/lcov-report/automations/index.html +11 -11
  81. package/coverage/lcov-report/automations/index.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/index.html +1 -1
  89. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  106. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  107. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  108. package/coverage/lcov-report/constants/index.html +1 -1
  109. package/coverage/lcov-report/constants/index.js.html +30 -30
  110. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  111. package/coverage/lcov-report/constants/screens.js.html +1 -1
  112. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  113. package/coverage/lcov-report/db/index.html +1 -1
  114. package/coverage/lcov-report/db/index.js.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  117. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  118. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  119. package/coverage/lcov-report/db/newid.js.html +4 -4
  120. package/coverage/lcov-report/db/utils.js.html +73 -73
  121. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  122. package/coverage/lcov-report/events/index.html +1 -1
  123. package/coverage/lcov-report/events/index.js.html +1 -1
  124. package/coverage/lcov-report/events/utils.js.html +1 -1
  125. package/coverage/lcov-report/index.html +33 -33
  126. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  127. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  128. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  129. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  130. package/coverage/lcov-report/middleware/currentapp.js.html +33 -33
  131. package/coverage/lcov-report/middleware/index.html +10 -10
  132. package/coverage/lcov-report/middleware/joi-validator.js.html +18 -9
  133. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  134. package/coverage/lcov-report/middleware/resourceId.js.html +12 -12
  135. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  136. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  137. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  138. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  139. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  140. package/coverage/lcov-report/utilities/global.js.html +31 -31
  141. package/coverage/lcov-report/utilities/index.html +1 -1
  142. package/coverage/lcov-report/utilities/index.js.html +24 -24
  143. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  144. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  145. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  146. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  148. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  150. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  151. package/coverage/lcov-report/utilities/security.js.html +2 -2
  152. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  154. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +20 -20
  155. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  156. package/coverage/lcov-report/utilities/users.js.html +7 -7
  157. package/coverage/lcov-report/utilities/workerRequests.js.html +13 -13
  158. package/coverage/lcov.info +888 -844
  159. package/dist/api/controllers/application.js +80 -14
  160. package/dist/api/controllers/row/internalSearch.js +39 -4
  161. package/dist/api/controllers/row/utils.js +3 -1
  162. package/dist/api/controllers/static/index.js +26 -2
  163. package/dist/api/controllers/static/templates/preview.hbs +103 -0
  164. package/dist/api/controllers/table/external.js +1 -1
  165. package/dist/api/routes/static.js +3 -0
  166. package/dist/app.js +4 -3
  167. package/dist/automations/bullboard.js +1 -0
  168. package/dist/automations/logging/index.js +3 -0
  169. package/dist/integrations/base/query.js +27 -0
  170. package/dist/integrations/base/sql.js +62 -30
  171. package/dist/integrations/base/utils.js +13 -27
  172. package/dist/integrations/microsoftSqlServer.js +5 -2
  173. package/dist/integrations/mongodb.js +35 -8
  174. package/dist/integrations/mysql.js +2 -2
  175. package/dist/integrations/postgres.js +5 -2
  176. package/dist/middleware/joi-validator.js +7 -4
  177. package/dist/package.json +7 -7
  178. package/dist/threads/index.js +1 -0
  179. package/dist/tsconfig.build.tsbuildinfo +1 -1
  180. package/dist/utilities/fileSystem/index.js +2 -1
  181. package/dist/utilities/redis.js +1 -0
  182. package/package.json +8 -8
  183. package/src/api/controllers/application.ts +96 -15
  184. package/src/api/controllers/row/internalSearch.js +45 -3
  185. package/src/api/controllers/row/utils.js +4 -1
  186. package/src/api/controllers/static/index.ts +21 -1
  187. package/src/api/controllers/static/templates/preview.hbs +103 -0
  188. package/src/api/controllers/table/external.js +1 -1
  189. package/src/api/routes/static.ts +12 -0
  190. package/src/api/routes/tests/application.spec.js +26 -0
  191. package/src/api/routes/tests/data/old-app.txt +3 -0
  192. package/src/api/routes/tests/internalSearch.spec.js +176 -0
  193. package/src/api/routes/tests/static.spec.js +19 -7
  194. package/src/app.ts +5 -3
  195. package/src/automations/bullboard.js +1 -0
  196. package/src/automations/logging/index.ts +3 -0
  197. package/src/integrations/base/query.ts +16 -0
  198. package/src/integrations/base/sql.ts +67 -30
  199. package/src/integrations/base/utils.ts +9 -18
  200. package/src/integrations/microsoftSqlServer.ts +3 -2
  201. package/src/integrations/mongodb.ts +35 -8
  202. package/src/integrations/mysql.ts +1 -1
  203. package/src/integrations/postgres.ts +2 -1
  204. package/src/integrations/tests/mongo.spec.js +218 -0
  205. package/src/integrations/tests/sql.spec.js +101 -11
  206. package/src/middleware/joi-validator.js +7 -4
  207. package/src/threads/index.ts +1 -0
  208. package/src/utilities/fileSystem/index.js +2 -0
  209. package/src/utilities/redis.js +1 -0
  210. package/builder/assets/index.08dd0c5e.css +0 -6
  211. package/builder/assets/index.5cf58e77.js +0 -975
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">59.25% </span>
26
+ <span class="strong">79.14% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>112/189</span>
28
+ <span class='fraction'>167/211</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">39.49% </span>
33
+ <span class="strong">68.75% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>47/119</span>
35
+ <span class='fraction'>88/128</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">48.64% </span>
40
+ <span class="strong">68.29% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>18/37</span>
42
+ <span class='fraction'>28/41</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">60% </span>
47
+ <span class="strong">78.64% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>111/185</span>
49
+ <span class='fraction'>162/206</span>
50
50
  </div>
51
51
 
52
52
 
@@ -523,10 +523,53 @@
523
523
  <a name='L458'></a><a href='#L458'>458</a>
524
524
  <a name='L459'></a><a href='#L459'>459</a>
525
525
  <a name='L460'></a><a href='#L460'>460</a>
526
- <a name='L461'></a><a href='#L461'>461</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">44x</span>
527
- <span class="cline-any cline-yes">44x</span>
528
- <span class="cline-any cline-yes">44x</span>
529
- <span class="cline-any cline-yes">44x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">45x</span>
569
+ <span class="cline-any cline-yes">45x</span>
570
+ <span class="cline-any cline-yes">45x</span>
571
+ <span class="cline-any cline-yes">45x</span>
572
+ <span class="cline-any cline-yes">45x</span>
530
573
  <span class="cline-any cline-neutral">&nbsp;</span>
531
574
  <span class="cline-any cline-neutral">&nbsp;</span>
532
575
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -534,7 +577,7 @@
534
577
  <span class="cline-any cline-neutral">&nbsp;</span>
535
578
  <span class="cline-any cline-neutral">&nbsp;</span>
536
579
  <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-yes">16x</span>
538
581
  <span class="cline-any cline-neutral">&nbsp;</span>
539
582
  <span class="cline-any cline-neutral">&nbsp;</span>
540
583
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -547,54 +590,56 @@
547
590
  <span class="cline-any cline-neutral">&nbsp;</span>
548
591
  <span class="cline-any cline-neutral">&nbsp;</span>
549
592
  <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-yes">1x</span>
551
- <span class="cline-any cline-yes">1x</span>
552
- <span class="cline-any cline-yes">1x</span>
553
- <span class="cline-any cline-yes">1x</span>
554
- <span class="cline-any cline-yes">1x</span>
555
593
  <span class="cline-any cline-neutral">&nbsp;</span>
556
594
  <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-yes">16x</span>
596
+ <span class="cline-any cline-yes">16x</span>
597
+ <span class="cline-any cline-yes">16x</span>
598
+ <span class="cline-any cline-yes">16x</span>
599
+ <span class="cline-any cline-yes">16x</span>
557
600
  <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-yes">1x</span>
559
- <span class="cline-any cline-yes">1x</span>
560
601
  <span class="cline-any cline-neutral">&nbsp;</span>
561
602
  <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-yes">16x</span>
604
+ <span class="cline-any cline-yes">16x</span>
562
605
  <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-yes">1x</span>
564
- <span class="cline-any cline-yes">1x</span>
565
606
  <span class="cline-any cline-neutral">&nbsp;</span>
566
607
  <span class="cline-any cline-neutral">&nbsp;</span>
608
+ <span class="cline-any cline-yes">31x</span>
609
+ <span class="cline-any cline-yes">31x</span>
567
610
  <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-yes">1x</span>
569
- <span class="cline-any cline-yes">1x</span>
570
611
  <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-yes">1x</span>
572
612
  <span class="cline-any cline-neutral">&nbsp;</span>
613
+ <span class="cline-any cline-yes">31x</span>
614
+ <span class="cline-any cline-yes">31x</span>
573
615
  <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-yes">31x</span>
574
617
  <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-yes">1x</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
618
  <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-yes">16x</span>
578
621
  <span class="cline-any cline-yes">1x</span>
579
622
  <span class="cline-any cline-neutral">&nbsp;</span>
623
+ <span class="cline-any cline-yes">16x</span>
580
624
  <span class="cline-any cline-neutral">&nbsp;</span>
581
625
  <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-yes">1x</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
626
  <span class="cline-any cline-neutral">&nbsp;</span>
585
- <span class="cline-any cline-yes">1x</span>
627
+ <span class="cline-any cline-yes">16x</span>
628
+ <span class="cline-any cline-yes">15x</span>
586
629
  <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-yes">16x</span>
587
631
  <span class="cline-any cline-neutral">&nbsp;</span>
588
632
  <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-yes">1x</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
633
  <span class="cline-any cline-neutral">&nbsp;</span>
592
- <span class="cline-any cline-yes">1x</span>
634
+ <span class="cline-any cline-yes">16x</span>
635
+ <span class="cline-any cline-yes">15x</span>
593
636
  <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-yes">16x</span>
594
638
  <span class="cline-any cline-neutral">&nbsp;</span>
595
639
  <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-yes">1x</span>
597
- <span class="cline-any cline-yes">1x</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-yes">31x</span>
642
+ <span class="cline-any cline-yes">31x</span>
598
643
  <span class="cline-any cline-neutral">&nbsp;</span>
599
644
  <span class="cline-any cline-neutral">&nbsp;</span>
600
645
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -651,122 +696,152 @@
651
696
  <span class="cline-any cline-neutral">&nbsp;</span>
652
697
  <span class="cline-any cline-neutral">&nbsp;</span>
653
698
  <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
654
701
  <span class="cline-any cline-neutral">&nbsp;</span>
655
702
  <span class="cline-any cline-neutral">&nbsp;</span>
656
703
  <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-no">&nbsp;</span>
705
+ <span class="cline-any cline-no">&nbsp;</span>
657
706
  <span class="cline-any cline-neutral">&nbsp;</span>
658
707
  <span class="cline-any cline-neutral">&nbsp;</span>
659
708
  <span class="cline-any cline-neutral">&nbsp;</span>
660
709
  <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-yes">2x</span>
662
710
  <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-yes">2x</span>
664
711
  <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-yes">2x</span>
666
- <span class="cline-any cline-yes">1x</span>
667
712
  <span class="cline-any cline-neutral">&nbsp;</span>
668
713
  <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-yes">2x</span>
670
- <span class="cline-any cline-yes">2x</span>
671
714
  <span class="cline-any cline-neutral">&nbsp;</span>
672
715
  <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-yes">2x</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-yes">148x</span>
675
717
  <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-yes">2x</span>
718
+ <span class="cline-any cline-yes">148x</span>
677
719
  <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-yes">148x</span>
721
+ <span class="cline-any cline-yes">61x</span>
678
722
  <span class="cline-any cline-neutral">&nbsp;</span>
679
723
  <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">1x</span>
681
- <span class="cline-any cline-yes">1x</span>
682
- <span class="cline-any cline-yes">1x</span>
683
- <span class="cline-any cline-yes">1x</span>
724
+ <span class="cline-any cline-yes">148x</span>
725
+ <span class="cline-any cline-yes">138x</span>
684
726
  <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-yes">1x</span>
686
- <span class="cline-any cline-yes">1x</span>
687
- <span class="cline-any cline-yes">1x</span>
688
727
  <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-yes">148x</span>
729
+ <span class="cline-any cline-yes">58x</span>
689
730
  <span class="cline-any cline-neutral">&nbsp;</span>
690
- <span class="cline-any cline-yes">1x</span>
731
+ <span class="cline-any cline-yes">148x</span>
691
732
  <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-yes">1x</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
733
  <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">1x</span>
696
734
  <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-yes">31x</span>
736
+ <span class="cline-any cline-yes">31x</span>
737
+ <span class="cline-any cline-yes">31x</span>
738
+ <span class="cline-any cline-yes">31x</span>
697
739
  <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-yes">1x</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
740
+ <span class="cline-any cline-yes">31x</span>
741
+ <span class="cline-any cline-yes">31x</span>
742
+ <span class="cline-any cline-yes">31x</span>
701
743
  <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
744
  <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-yes">31x</span>
704
746
  <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-yes">1x</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
747
+ <span class="cline-any cline-yes">45x</span>
708
748
  <span class="cline-any cline-no">&nbsp;</span>
709
749
  <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-yes">45x</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-yes">31x</span>
754
+ <span class="cline-any cline-yes">8x</span>
710
755
  <span class="cline-any cline-no">&nbsp;</span>
711
756
  <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-yes">8x</span>
758
+ <span class="cline-any cline-yes">2x</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-yes">6x</span>
761
+ <span class="cline-any cline-yes">6x</span>
762
+ <span class="cline-any cline-yes">12x</span>
763
+ <span class="cline-any cline-neutral">&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-yes">6x</span>
767
+ <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-yes">31x</span>
770
+ <span class="cline-any cline-yes">2x</span>
771
+ <span class="cline-any cline-yes">2x</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-yes">31x</span>
775
+ <span class="cline-any cline-yes">2x</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
777
  <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-yes">31x</span>
779
+ <span class="cline-any cline-yes">2x</span>
713
780
  <span class="cline-any cline-no">&nbsp;</span>
714
781
  <span class="cline-any cline-no">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
783
  <span class="cline-any cline-no">&nbsp;</span>
716
784
  <span class="cline-any cline-neutral">&nbsp;</span>
717
785
  <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-yes">2x</span>
787
+ <span class="cline-any cline-yes">2x</span>
788
+ <span class="cline-any cline-yes">2x</span>
718
789
  <span class="cline-any cline-neutral">&nbsp;</span>
719
790
  <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
791
  <span class="cline-any cline-neutral">&nbsp;</span>
722
792
  <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-yes">2x</span>
723
794
  <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-yes">10x</span>
725
- <span class="cline-any cline-yes">1x</span>
726
795
  <span class="cline-any cline-neutral">&nbsp;</span>
727
796
  <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-yes">1x</span>
729
- <span class="cline-any cline-yes">1x</span>
797
+ <span class="cline-any cline-yes">372x</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">69x</span>
800
+ <span class="cline-any cline-yes">69x</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-yes">69x</span>
804
+ <span class="cline-any cline-yes">69x</span>
730
805
  <span class="cline-any cline-no">&nbsp;</span>
731
806
  <span class="cline-any cline-neutral">&nbsp;</span>
732
- <span class="cline-any cline-yes">1x</span>
733
- <span class="cline-any cline-yes">1x</span>
807
+ <span class="cline-any cline-yes">69x</span>
808
+ <span class="cline-any cline-yes">65x</span>
734
809
  <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-yes">1x</span>
810
+ <span class="cline-any cline-yes">69x</span>
736
811
  <span class="cline-any cline-neutral">&nbsp;</span>
737
812
  <span class="cline-any cline-neutral">&nbsp;</span>
738
813
  <span class="cline-any cline-neutral">&nbsp;</span>
739
814
  <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-yes">1x</span>
741
- <span class="cline-any cline-yes">1x</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
815
+ <span class="cline-any cline-yes">31x</span>
816
+ <span class="cline-any cline-yes">31x</span>
817
+ <span class="cline-any cline-yes">2x</span>
743
818
  <span class="cline-any cline-no">&nbsp;</span>
744
819
  <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-yes">2x</span>
746
821
  <span class="cline-any cline-neutral">&nbsp;</span>
747
822
  <span class="cline-any cline-neutral">&nbsp;</span>
748
823
  <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-yes">2x</span>
750
825
  <span class="cline-any cline-neutral">&nbsp;</span>
751
826
  <span class="cline-any cline-neutral">&nbsp;</span>
752
- <span class="cline-any cline-yes">1x</span>
753
- <span class="cline-any cline-yes">1x</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
827
+ <span class="cline-any cline-yes">31x</span>
828
+ <span class="cline-any cline-yes">31x</span>
829
+ <span class="cline-any cline-yes">2x</span>
755
830
  <span class="cline-any cline-no">&nbsp;</span>
756
831
  <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
832
+ <span class="cline-any cline-yes">2x</span>
758
833
  <span class="cline-any cline-no">&nbsp;</span>
759
834
  <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
835
+ <span class="cline-any cline-yes">2x</span>
761
836
  <span class="cline-any cline-no">&nbsp;</span>
762
837
  <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-no">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
838
+ <span class="cline-any cline-yes">2x</span>
839
+ <span class="cline-any cline-yes">2x</span>
840
+ <span class="cline-any cline-yes">2x</span>
766
841
  <span class="cline-any cline-neutral">&nbsp;</span>
767
842
  <span class="cline-any cline-neutral">&nbsp;</span>
768
- <span class="cline-any cline-yes">1x</span>
769
- <span class="cline-any cline-yes">1x</span>
843
+ <span class="cline-any cline-yes">31x</span>
844
+ <span class="cline-any cline-yes">31x</span>
770
845
  <span class="cline-any cline-no">&nbsp;</span>
771
846
  <span class="cline-any cline-no">&nbsp;</span>
772
847
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -777,93 +852,100 @@
777
852
  <span class="cline-any cline-no">&nbsp;</span>
778
853
  <span class="cline-any cline-neutral">&nbsp;</span>
779
854
  <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-yes">1x</span>
781
- <span class="cline-any cline-yes">1x</span>
855
+ <span class="cline-any cline-yes">31x</span>
856
+ <span class="cline-any cline-yes">31x</span>
782
857
  <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-yes">1x</span>
784
- <span class="cline-any cline-yes">1x</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
858
+ <span class="cline-any cline-yes">31x</span>
859
+ <span class="cline-any cline-yes">31x</span>
860
+ <span class="cline-any cline-yes">6x</span>
786
861
  <span class="cline-any cline-no">&nbsp;</span>
787
862
  <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
863
+ <span class="cline-any cline-yes">6x</span>
789
864
  <span class="cline-any cline-neutral">&nbsp;</span>
790
865
  <span class="cline-any cline-neutral">&nbsp;</span>
791
- <span class="cline-any cline-yes">1x</span>
792
- <span class="cline-any cline-yes">1x</span>
866
+ <span class="cline-any cline-yes">31x</span>
867
+ <span class="cline-any cline-yes">31x</span>
793
868
  <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-yes">1x</span>
795
- <span class="cline-any cline-yes">1x</span>
869
+ <span class="cline-any cline-yes">31x</span>
870
+ <span class="cline-any cline-yes">31x</span>
796
871
  <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-yes">1x</span>
798
- <span class="cline-any cline-yes">1x</span>
872
+ <span class="cline-any cline-yes">31x</span>
873
+ <span class="cline-any cline-yes">31x</span>
799
874
  <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-yes">1x</span>
801
- <span class="cline-any cline-yes">1x</span>
875
+ <span class="cline-any cline-yes">31x</span>
876
+ <span class="cline-any cline-yes">31x</span>
802
877
  <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-yes">31x</span>
879
+ <span class="cline-any cline-yes">31x</span>
803
880
  <span class="cline-any cline-neutral">&nbsp;</span>
804
- <span class="cline-any cline-yes">1x</span>
805
- <span class="cline-any cline-yes">1x</span>
806
- <span class="cline-any cline-yes">1x</span>
807
- <span class="cline-any cline-yes">1x</span>
881
+ <span class="cline-any cline-yes">31x</span>
882
+ <span class="cline-any cline-yes">31x</span>
808
883
  <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-yes">1x</span>
810
884
  <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-yes">31x</span>
886
+ <span class="cline-any cline-yes">31x</span>
887
+ <span class="cline-any cline-yes">31x</span>
888
+ <span class="cline-any cline-yes">31x</span>
811
889
  <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-yes">31x</span>
812
891
  <span class="cline-any cline-neutral">&nbsp;</span>
813
- <span class="cline-any cline-yes">1x</span>
814
892
  <span class="cline-any cline-neutral">&nbsp;</span>
815
893
  <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-yes">31x</span>
816
895
  <span class="cline-any cline-neutral">&nbsp;</span>
817
896
  <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-yes">1x</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
897
  <span class="cline-any cline-neutral">&nbsp;</span>
821
- <span class="cline-any cline-yes">1x</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
823
- <span class="cline-any cline-no">&nbsp;</span>
824
- <span class="cline-any cline-no">&nbsp;</span>
825
898
  <span class="cline-any cline-neutral">&nbsp;</span>
826
- <span class="cline-any cline-yes">1x</span>
899
+ <span class="cline-any cline-yes">31x</span>
900
+ <span class="cline-any cline-yes">16x</span>
827
901
  <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-yes">31x</span>
903
+ <span class="cline-any cline-yes">2x</span>
904
+ <span class="cline-any cline-yes">2x</span>
905
+ <span class="cline-any cline-yes">2x</span>
828
906
  <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-yes">31x</span>
829
908
  <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-yes">1x</span>
831
- <span class="cline-any cline-yes">1x</span>
832
- <span class="cline-any cline-yes">1x</span>
833
- <span class="cline-any cline-yes">1x</span>
834
- <span class="cline-any cline-yes">1x</span>
835
909
  <span class="cline-any cline-neutral">&nbsp;</span>
836
910
  <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-yes">31x</span>
912
+ <span class="cline-any cline-yes">31x</span>
913
+ <span class="cline-any cline-yes">31x</span>
914
+ <span class="cline-any cline-yes">31x</span>
915
+ <span class="cline-any cline-yes">31x</span>
837
916
  <span class="cline-any cline-neutral">&nbsp;</span>
838
917
  <span class="cline-any cline-neutral">&nbsp;</span>
839
918
  <span class="cline-any cline-neutral">&nbsp;</span>
840
919
  <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-yes">45x</span>
841
921
  <span class="cline-any cline-neutral">&nbsp;</span>
842
922
  <span class="cline-any cline-neutral">&nbsp;</span>
843
923
  <span class="cline-any cline-neutral">&nbsp;</span>
844
924
  <span class="cline-any cline-neutral">&nbsp;</span>
845
- <span class="cline-any cline-yes">44x</span>
846
- <span class="cline-any cline-yes">1x</span>
847
925
  <span class="cline-any cline-neutral">&nbsp;</span>
848
926
  <span class="cline-any cline-neutral">&nbsp;</span>
849
927
  <span class="cline-any cline-neutral">&nbsp;</span>
850
928
  <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-yes">45x</span>
930
+ <span class="cline-any cline-yes">31x</span>
851
931
  <span class="cline-any cline-neutral">&nbsp;</span>
852
932
  <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-yes">1x</span>
854
933
  <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-yes">1x</span>
856
934
  <span class="cline-any cline-neutral">&nbsp;</span>
857
935
  <span class="cline-any cline-neutral">&nbsp;</span>
858
- <span class="cline-any cline-yes">1x</span>
859
- <span class="cline-any cline-yes">1x</span>
860
936
  <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-yes">1x</span>
862
- <span class="cline-any cline-yes">1x</span>
937
+ <span class="cline-any cline-yes">31x</span>
863
938
  <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-yes">1x</span>
939
+ <span class="cline-any cline-yes">31x</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-yes">31x</span>
943
+ <span class="cline-any cline-yes">31x</span>
865
944
  <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-yes">31x</span>
946
+ <span class="cline-any cline-yes">31x</span>
866
947
  <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-yes">31x</span>
867
949
  <span class="cline-any cline-neutral">&nbsp;</span>
868
950
  <span class="cline-any cline-neutral">&nbsp;</span>
869
951
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -880,7 +962,9 @@
880
962
  <span class="cline-any cline-neutral">&nbsp;</span>
881
963
  <span class="cline-any cline-neutral">&nbsp;</span>
882
964
  <span class="cline-any cline-neutral">&nbsp;</span>
883
- <span class="cline-any cline-yes">44x</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-yes">45x</span>
884
968
  <span class="cline-any cline-yes">1x</span>
885
969
  <span class="cline-any cline-yes">1x</span>
886
970
  <span class="cline-any cline-yes">1x</span>
@@ -928,32 +1012,32 @@
928
1012
  <span class="cline-any cline-neutral">&nbsp;</span>
929
1013
  <span class="cline-any cline-neutral">&nbsp;</span>
930
1014
  <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-yes">44x</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-no">&nbsp;</span>
1015
+ <span class="cline-any cline-yes">45x</span>
1016
+ <span class="cline-any cline-yes">15x</span>
1017
+ <span class="cline-any cline-yes">15x</span>
1018
+ <span class="cline-any cline-yes">14x</span>
935
1019
  <span class="cline-any cline-neutral">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-no">&nbsp;</span>
1020
+ <span class="cline-any cline-yes">15x</span>
1021
+ <span class="cline-any cline-yes">15x</span>
938
1022
  <span class="cline-any cline-neutral">&nbsp;</span>
939
1023
  <span class="cline-any cline-neutral">&nbsp;</span>
940
1024
  <span class="cline-any cline-neutral">&nbsp;</span>
941
1025
  <span class="cline-any cline-neutral">&nbsp;</span>
942
1026
  <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-no">&nbsp;</span>
1027
+ <span class="cline-any cline-yes">15x</span>
944
1028
  <span class="cline-any cline-neutral">&nbsp;</span>
945
1029
  <span class="cline-any cline-neutral">&nbsp;</span>
946
1030
  <span class="cline-any cline-neutral">&nbsp;</span>
947
1031
  <span class="cline-any cline-neutral">&nbsp;</span>
948
1032
  <span class="cline-any cline-neutral">&nbsp;</span>
949
1033
  <span class="cline-any cline-neutral">&nbsp;</span>
950
- <span class="cline-any cline-no">&nbsp;</span>
1034
+ <span class="cline-any cline-yes">15x</span>
951
1035
  <span class="cline-any cline-neutral">&nbsp;</span>
952
1036
  <span class="cline-any cline-neutral">&nbsp;</span>
953
1037
  <span class="cline-any cline-neutral">&nbsp;</span>
954
1038
  <span class="cline-any cline-neutral">&nbsp;</span>
955
1039
  <span class="cline-any cline-neutral">&nbsp;</span>
956
- <span class="cline-any cline-no">&nbsp;</span>
1040
+ <span class="cline-any cline-yes">15x</span>
957
1041
  <span class="cline-any cline-neutral">&nbsp;</span>
958
1042
  <span class="cline-any cline-neutral">&nbsp;</span>
959
1043
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -974,7 +1058,7 @@
974
1058
  <span class="cline-any cline-neutral">&nbsp;</span>
975
1059
  <span class="cline-any cline-neutral">&nbsp;</span>
976
1060
  <span class="cline-any cline-neutral">&nbsp;</span>
977
- <span class="cline-any cline-yes">44x</span>
1061
+ <span class="cline-any cline-yes">45x</span>
978
1062
  <span class="cline-any cline-yes">1x</span>
979
1063
  <span class="cline-any cline-yes">1x</span>
980
1064
  <span class="cline-any cline-yes">1x</span>
@@ -984,6 +1068,7 @@
984
1068
  <span class="cline-any cline-yes">1x</span>
985
1069
  <span class="cline-any cline-neutral">&nbsp;</span>
986
1070
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { SearchIndexes } = require("../../../db/utils")
1071
+ const { removeKeyNumbering } = require("./utils")
987
1072
  const fetch = require("node-fetch")
988
1073
  const { getCouchInfo } = require("@budibase/backend-core/db")
989
1074
  const { getAppId } = require("@budibase/backend-core/context")
@@ -1005,6 +1090,8 @@ class QueryBuilder {
1005
1090
  notEmpty: {},
1006
1091
  oneOf: {},
1007
1092
  contains: {},
1093
+ notContains: {},
1094
+ containsAny: {},
1008
1095
  ...base,
1009
1096
  }
1010
1097
  this.limit = 50
@@ -1032,22 +1119,22 @@ class QueryBuilder {
1032
1119
  }
1033
1120
  &nbsp;
1034
1121
  setSort(sort) {
1035
- <span class="missing-if-branch" title="if path not taken" >I</span>if (sort != null) {
1036
- <span class="cstat-no" title="statement not covered" > this.sort = sort</span>
1122
+ if (sort != null) {
1123
+ this.sort = sort
1037
1124
  }
1038
1125
  return this
1039
1126
  }
1040
1127
  &nbsp;
1041
1128
  setSortOrder(sortOrder) {
1042
- <span class="missing-if-branch" title="if path not taken" >I</span>if (sortOrder != null) {
1043
- <span class="cstat-no" title="statement not covered" > this.sortOrder = sortOrder</span>
1129
+ if (sortOrder != null) {
1130
+ this.sortOrder = sortOrder
1044
1131
  }
1045
1132
  return this
1046
1133
  }
1047
1134
  &nbsp;
1048
1135
  setSortType(sortType) {
1049
- <span class="missing-if-branch" title="if path not taken" >I</span>if (sortType != null) {
1050
- <span class="cstat-no" title="statement not covered" > this.sortType = sortType</span>
1136
+ if (sortType != null) {
1137
+ this.sortType = sortType
1051
1138
  }
1052
1139
  return this
1053
1140
  }
@@ -1107,6 +1194,16 @@ class QueryBuilder {
1107
1194
  &nbsp;
1108
1195
  <span class="fstat-no" title="function not covered" > ad</span>dContains(key, value) {
1109
1196
  <span class="cstat-no" title="statement not covered" > this.query.contains[key] = value</span>
1197
+ <span class="cstat-no" title="statement not covered" > return this</span>
1198
+ }
1199
+ &nbsp;
1200
+ <span class="fstat-no" title="function not covered" > ad</span>dNotContains(key, value) {
1201
+ <span class="cstat-no" title="statement not covered" > this.query.notContains[key] = value</span>
1202
+ <span class="cstat-no" title="statement not covered" > return this</span>
1203
+ }
1204
+ &nbsp;
1205
+ <span class="fstat-no" title="function not covered" > ad</span>dContainsAny(key, value) {
1206
+ <span class="cstat-no" title="statement not covered" > this.query.containsAny[key] = value</span>
1110
1207
  <span class="cstat-no" title="statement not covered" > return this</span>
1111
1208
  }
1112
1209
  &nbsp;
@@ -1123,15 +1220,15 @@ class QueryBuilder {
1123
1220
  const originalType = typeof value
1124
1221
  // Convert to lowercase
1125
1222
  if (value &amp;&amp; lowercase) {
1126
- value = value.toLowerCase ? value.toLowerCase() : <span class="branch-1 cbranch-no" title="branch not covered" >value</span>
1223
+ value = value.toLowerCase ? value.toLowerCase() : value
1127
1224
  }
1128
1225
  // Escape characters
1129
- <span class="missing-if-branch" title="else path not taken" >E</span>if (escape &amp;&amp; originalType === "string") {
1226
+ if (escape &amp;&amp; originalType === "string") {
1130
1227
  value = `${value}`.replace(/[ #+\-&amp;|!(){}\]^"~*?:\\]/g, "\\$&amp;")
1131
1228
  }
1132
1229
  // Wrap in quotes
1133
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hasVersion &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >wrap)</span> {
1134
- <span class="cstat-no" title="statement not covered" > value = originalType === "number" ? value : `"${value}"`</span>
1230
+ if (hasVersion &amp;&amp; wrap) {
1231
+ value = originalType === "number" ? value : `"${value}"`
1135
1232
  }
1136
1233
  return value
1137
1234
  }
@@ -1139,7 +1236,7 @@ class QueryBuilder {
1139
1236
  buildSearchQuery() {
1140
1237
  const builder = this
1141
1238
  let allOr = this.query &amp;&amp; this.query.allOr
1142
- let query = allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"" </span>: "*:*"
1239
+ let query = allOr ? "" : "*:*"
1143
1240
  const allPreProcessingOpts = { escape: true, lowercase: true, wrap: true }
1144
1241
  let tableId
1145
1242
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.equal.tableId) {
@@ -1155,33 +1252,53 @@ class QueryBuilder {
1155
1252
  return `${key}:${builder.preprocess(value, allPreProcessingOpts)}`
1156
1253
  }
1157
1254
  &nbsp;
1158
- const contains = <span class="fstat-no" title="function not covered" >(k</span>ey, value) =&gt; {
1159
- <span class="cstat-no" title="statement not covered" > if (!value &amp;&amp; value !== 0) {</span>
1255
+ const contains = (key, value, mode = "AND") =&gt; {
1256
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(value) &amp;&amp; value.length === 0) {
1160
1257
  <span class="cstat-no" title="statement not covered" > return null</span>
1161
1258
  }
1162
- <span class="cstat-no" title="statement not covered" > return `${key}:${builder.preprocess(value, { escape: true })}`</span>
1259
+ if (!Array.isArray(value)) {
1260
+ return `${key}:${value}`
1261
+ }
1262
+ let statement = `${builder.preprocess(value[0], { escape: true })}`
1263
+ for (let i = 1; i &lt; value.length; i++) {
1264
+ statement += ` ${mode} ${builder.preprocess(value[i], {
1265
+ escape: true,
1266
+ })}`
1267
+ }
1268
+ return `${key}:(${statement})`
1163
1269
  }
1164
1270
  &nbsp;
1165
- const oneOf = <span class="fstat-no" title="function not covered" >(k</span>ey, value) =&gt; {
1166
- <span class="cstat-no" title="statement not covered" > if (!Array.isArray(value)) {</span>
1271
+ const notContains = (key, value) =&gt; {
1272
+ const allPrefix = allOr === "" ? <span class="branch-0 cbranch-no" title="branch not covered" >"*:* AND" </span>: ""
1273
+ return allPrefix + "NOT " + contains(key, value)
1274
+ }
1275
+ &nbsp;
1276
+ const containsAny = (key, value) =&gt; {
1277
+ return contains(key, value, "OR")
1278
+ }
1279
+ &nbsp;
1280
+ const oneOf = (key, value) =&gt; {
1281
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(value)) {
1167
1282
  <span class="cstat-no" title="statement not covered" > if (typeof value === "string") {</span>
1168
1283
  <span class="cstat-no" title="statement not covered" > value = value.split(",")</span>
1169
1284
  } else {
1170
1285
  <span class="cstat-no" title="statement not covered" > return ""</span>
1171
1286
  }
1172
1287
  }
1173
- let orStatement = <span class="cstat-no" title="statement not covered" >`${builder.preprocess(value[0], allPreProcessingOpts)}`</span>
1174
- <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >1;</span> i &lt; value.length; i++) {</span>
1175
- <span class="cstat-no" title="statement not covered" > orStatement += ` OR ${builder.preprocess(</span>
1288
+ let orStatement = `${builder.preprocess(value[0], allPreProcessingOpts)}`
1289
+ for (let i = 1; i &lt; value.length; i++) {
1290
+ orStatement += ` OR ${builder.preprocess(
1176
1291
  value[i],
1177
1292
  allPreProcessingOpts
1178
1293
  )}`
1179
1294
  }
1180
- <span class="cstat-no" title="statement not covered" > return `${key}:(${orStatement})`</span>
1295
+ return `${key}:(${orStatement})`
1181
1296
  }
1182
1297
  &nbsp;
1183
1298
  function build(structure, queryFn) {
1184
1299
  for (let [key, value] of Object.entries(structure)) {
1300
+ // check for new format - remove numbering if needed
1301
+ key = removeKeyNumbering(key)
1185
1302
  key = builder.preprocess(key.replace(/ /g, "_"), {
1186
1303
  escape: true,
1187
1304
  })
@@ -1189,8 +1306,8 @@ class QueryBuilder {
1189
1306
  <span class="missing-if-branch" title="if path not taken" >I</span>if (expression == null) {
1190
1307
  <span class="cstat-no" title="statement not covered" > continue</span>
1191
1308
  }
1192
- <span class="missing-if-branch" title="else path not taken" >E</span>if (query.length &gt; 0) {
1193
- query += ` ${allOr ? <span class="branch-0 cbranch-no" title="branch not covered" >"OR" </span>: "AND"} `
1309
+ if (query.length &gt; 0) {
1310
+ query += ` ${allOr ? "OR" : "AND"} `
1194
1311
  }
1195
1312
  query += expression
1196
1313
  }
@@ -1198,31 +1315,31 @@ class QueryBuilder {
1198
1315
  &nbsp;
1199
1316
  // Construct the actual lucene search query string from JSON structure
1200
1317
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.string) {
1201
- build(this.query.string, <span class="fstat-no" title="function not covered" >(k</span>ey, value) =&gt; {
1202
- <span class="cstat-no" title="statement not covered" > if (!value) {</span>
1318
+ build(this.query.string, (key, value) =&gt; {
1319
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!value) {
1203
1320
  <span class="cstat-no" title="statement not covered" > return null</span>
1204
1321
  }
1205
- <span class="cstat-no" title="statement not covered" > value = builder.preprocess(value, {</span>
1322
+ value = builder.preprocess(value, {
1206
1323
  escape: true,
1207
1324
  lowercase: true,
1208
1325
  })
1209
- <span class="cstat-no" title="statement not covered" > return `${key}:${value}*`</span>
1326
+ return `${key}:${value}*`
1210
1327
  })
1211
1328
  }
1212
1329
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.range) {
1213
- build(this.query.range, <span class="fstat-no" title="function not covered" >(k</span>ey, value) =&gt; {
1214
- <span class="cstat-no" title="statement not covered" > if (!value) {</span>
1330
+ build(this.query.range, (key, value) =&gt; {
1331
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!value) {
1215
1332
  <span class="cstat-no" title="statement not covered" > return null</span>
1216
1333
  }
1217
- <span class="cstat-no" title="statement not covered" > if (value.low == null || value.low === "") {</span>
1334
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (value.low == null || value.low === "") {
1218
1335
  <span class="cstat-no" title="statement not covered" > return null</span>
1219
1336
  }
1220
- <span class="cstat-no" title="statement not covered" > if (value.high == null || value.high === "") {</span>
1337
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (value.high == null || value.high === "") {
1221
1338
  <span class="cstat-no" title="statement not covered" > return null</span>
1222
1339
  }
1223
- const low = <span class="cstat-no" title="statement not covered" >builder.preprocess(value.low, allPreProcessingOpts)</span>
1224
- const high = <span class="cstat-no" title="statement not covered" >builder.preprocess(value.high, allPreProcessingOpts)</span>
1225
- <span class="cstat-no" title="statement not covered" > return `${key}:[${low} TO ${high}]`</span>
1340
+ const low = builder.preprocess(value.low, allPreProcessingOpts)
1341
+ const high = builder.preprocess(value.high, allPreProcessingOpts)
1342
+ return `${key}:[${low} TO ${high}]`
1226
1343
  })
1227
1344
  }
1228
1345
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.fuzzy) {
@@ -1241,18 +1358,18 @@ class QueryBuilder {
1241
1358
  build(this.query.equal, equal)
1242
1359
  }
1243
1360
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.notEqual) {
1244
- build(this.query.notEqual, <span class="fstat-no" title="function not covered" >(k</span>ey, value) =&gt; {
1245
- <span class="cstat-no" title="statement not covered" > if (!value) {</span>
1361
+ build(this.query.notEqual, (key, value) =&gt; {
1362
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!value) {
1246
1363
  <span class="cstat-no" title="statement not covered" > return null</span>
1247
1364
  }
1248
- <span class="cstat-no" title="statement not covered" > return `!${key}:${builder.preprocess(value, allPreProcessingOpts)}`</span>
1365
+ return `!${key}:${builder.preprocess(value, allPreProcessingOpts)}`
1249
1366
  })
1250
1367
  }
1251
1368
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.empty) {
1252
- build(this.query.empty, <span class="fstat-no" title="function not covered" >ke</span>y =&gt; <span class="cstat-no" title="statement not covered" >`!${key}:["" TO *]`)</span>
1369
+ build(this.query.empty, key =&gt; `!${key}:["" TO *]`)
1253
1370
  }
1254
1371
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.notEmpty) {
1255
- build(this.query.notEmpty, <span class="fstat-no" title="function not covered" >ke</span>y =&gt; <span class="cstat-no" title="statement not covered" >`${key}:["" TO *]`)</span>
1372
+ build(this.query.notEmpty, key =&gt; `${key}:["" TO *]`)
1256
1373
  }
1257
1374
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.oneOf) {
1258
1375
  build(this.query.oneOf, oneOf)
@@ -1260,6 +1377,12 @@ class QueryBuilder {
1260
1377
  <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.contains) {
1261
1378
  build(this.query.contains, contains)
1262
1379
  }
1380
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.notContains) {
1381
+ build(this.query.notContains, notContains)
1382
+ }
1383
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (this.query.containsAny) {
1384
+ build(this.query.containsAny, containsAny)
1385
+ }
1263
1386
  // make sure table ID is always added as an AND
1264
1387
  <span class="missing-if-branch" title="else path not taken" >E</span>if (tableId) {
1265
1388
  query = `(${query})`
@@ -1275,13 +1398,13 @@ class QueryBuilder {
1275
1398
  limit: Math.min(this.limit, 200),
1276
1399
  include_docs: this.includeDocs,
1277
1400
  }
1278
- <span class="missing-if-branch" title="if path not taken" >I</span>if (this.bookmark) {
1279
- <span class="cstat-no" title="statement not covered" > body.bookmark = this.bookmark</span>
1401
+ if (this.bookmark) {
1402
+ body.bookmark = this.bookmark
1280
1403
  }
1281
- <span class="missing-if-branch" title="if path not taken" >I</span>if (this.sort) {
1282
- const order = <span class="cstat-no" title="statement not covered" >this.sortOrder === "descending" ? "-" : ""</span>
1283
- const type = <span class="cstat-no" title="statement not covered" >`&lt;${this.sortType}&gt;`</span>
1284
- <span class="cstat-no" title="statement not covered" > body.sort = `${order}${this.sort.replace(/ /g, "_")}${type}`</span>
1404
+ if (this.sort) {
1405
+ const order = this.sortOrder === "descending" ? <span class="branch-0 cbranch-no" title="branch not covered" >"-" </span>: ""
1406
+ const type = `&lt;${this.sortType}&gt;`
1407
+ body.sort = `${order}${this.sort.replace(/ /g, "_")}${type}`
1285
1408
  }
1286
1409
  return body
1287
1410
  }
@@ -1295,6 +1418,9 @@ class QueryBuilder {
1295
1418
  }
1296
1419
  }
1297
1420
  &nbsp;
1421
+ // exported for unit testing
1422
+ exports.QueryBuilder = QueryBuilder
1423
+ &nbsp;
1298
1424
  /**
1299
1425
  * Executes a lucene search query.
1300
1426
  * @param url The query URL
@@ -1388,32 +1514,32 @@ const recursiveSearch = async (query, params) =&gt; {
1388
1514
  * bookmark {string} The bookmark to resume from
1389
1515
  * @returns {Promise&lt;{hasNextPage: boolean, rows: *[]}&gt;}
1390
1516
  */
1391
- exports.paginatedSearch = <span class="fstat-no" title="function not covered" >as</span>ync (query, params) =&gt; {
1392
- let limit = <span class="cstat-no" title="statement not covered" >params.limit</span>
1393
- <span class="cstat-no" title="statement not covered" > if (limit == null || isNaN(limit) || limit &lt; 0) {</span>
1394
- <span class="cstat-no" title="statement not covered" > limit = 50</span>
1517
+ exports.paginatedSearch = async (query, params) =&gt; {
1518
+ let limit = params.limit
1519
+ if (limit == null || isNaN(limit) || limit &lt; 0) {
1520
+ limit = 50
1395
1521
  }
1396
- <span class="cstat-no" title="statement not covered" > limit = Math.min(limit, 200)</span>
1397
- const search = <span class="cstat-no" title="statement not covered" >new QueryBuilder(query)</span>
1522
+ limit = Math.min(limit, 200)
1523
+ const search = new QueryBuilder(query)
1398
1524
  .setVersion(params.version)
1399
1525
  .setTable(params.tableId)
1400
1526
  .setSort(params.sort)
1401
1527
  .setSortOrder(params.sortOrder)
1402
1528
  .setSortType(params.sortType)
1403
- const searchResults = <span class="cstat-no" title="statement not covered" >await search</span>
1529
+ const searchResults = await search
1404
1530
  .setBookmark(params.bookmark)
1405
1531
  .setLimit(limit)
1406
1532
  .run()
1407
1533
  &nbsp;
1408
1534
  // Try fetching 1 row in the next page to see if another page of results
1409
1535
  // exists or not
1410
- const nextResults = <span class="cstat-no" title="statement not covered" >await search</span>
1536
+ const nextResults = await search
1411
1537
  .setTable(params.tableId)
1412
1538
  .setBookmark(searchResults.bookmark)
1413
1539
  .setLimit(1)
1414
1540
  .run()
1415
1541
  &nbsp;
1416
- <span class="cstat-no" title="statement not covered" > return {</span>
1542
+ return {
1417
1543
  ...searchResults,
1418
1544
  hasNextPage: nextResults.rows &amp;&amp; nextResults.rows.length &gt; 0,
1419
1545
  }
@@ -1450,7 +1576,7 @@ exports.fullSearch = async (query, params) =&gt; {
1450
1576
  <div class='footer quiet pad2 space-top1 center small'>
1451
1577
  Code coverage generated by
1452
1578
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1453
- at Thu Sep 01 2022 12:48:54 GMT+0000 (Coordinated Universal Time)
1579
+ at Fri Sep 02 2022 09:18:07 GMT+0000 (Coordinated Universal Time)
1454
1580
  </div>
1455
1581
  <script src="../../../prettify.js"></script>
1456
1582
  <script>