@budibase/server 2.1.44 → 2.1.46-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 (832) hide show
  1. package/__mocks__/aws-sdk.ts +14 -0
  2. package/__mocks__/node-fetch.ts +5 -1
  3. package/builder/assets/index.538092be.css +6 -0
  4. package/builder/assets/index.f3d43c3f.js +1020 -0
  5. package/builder/index.html +2 -2
  6. package/coverage/clover.xml +11101 -3980
  7. package/coverage/coverage-final.json +273 -118
  8. package/coverage/lcov-report/index.html +727 -187
  9. package/coverage/lcov-report/src/api/controllers/analytics.ts.html +190 -0
  10. package/coverage/lcov-report/{api/controllers/apikeys.js.html → src/api/controllers/apikeys.ts.html} +30 -30
  11. package/coverage/lcov-report/src/api/controllers/application.ts.html +1891 -0
  12. package/coverage/lcov-report/src/api/controllers/auth.ts.html +301 -0
  13. package/coverage/lcov-report/{api/controllers/automation.js.html → src/api/controllers/automation.ts.html} +99 -99
  14. package/coverage/lcov-report/src/api/controllers/backup.ts.html +148 -0
  15. package/coverage/lcov-report/{api/controllers/cloud.js.html → src/api/controllers/cloud.ts.html} +61 -58
  16. package/coverage/lcov-report/src/api/controllers/component.ts.html +259 -0
  17. package/coverage/lcov-report/{api/controllers/datasource.js.html → src/api/controllers/datasource.ts.html} +287 -107
  18. package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +259 -0
  19. package/coverage/lcov-report/{utilities/rowProcessor → src/api/controllers/deploy}/index.html +40 -40
  20. package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +748 -0
  21. package/coverage/lcov-report/{api/controllers/dev.js.html → src/api/controllers/dev.ts.html} +69 -87
  22. package/coverage/lcov-report/src/api/controllers/index.html +431 -0
  23. package/coverage/lcov-report/src/api/controllers/integration.ts.html +124 -0
  24. package/coverage/lcov-report/{api/controllers/layout.js.html → src/api/controllers/layout.ts.html} +31 -31
  25. package/coverage/lcov-report/{api/controllers/metadata.js.html → src/api/controllers/metadata.ts.html} +33 -30
  26. package/coverage/lcov-report/{api/controllers/migrations.js.html → src/api/controllers/migrations.ts.html} +20 -17
  27. package/coverage/lcov-report/{api/controllers/permission.js.html → src/api/controllers/permission.ts.html} +88 -79
  28. package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +130 -0
  29. package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +310 -0
  30. package/coverage/lcov-report/src/api/controllers/plugin/index.html +206 -0
  31. package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +484 -0
  32. package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +253 -0
  33. package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +97 -0
  34. package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +121 -0
  35. package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +136 -0
  36. package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +334 -0
  37. package/coverage/lcov-report/src/api/controllers/public/index.html +191 -0
  38. package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +181 -0
  39. package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +191 -0
  40. package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +124 -0
  41. package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +202 -0
  42. package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +178 -0
  43. package/coverage/lcov-report/{utilities/routing/index.js.html → src/api/controllers/public/mapping/tables.ts.html} +46 -43
  44. package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +181 -0
  45. package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +145 -0
  46. package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +328 -0
  47. package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +253 -0
  48. package/coverage/lcov-report/src/api/controllers/public/users.ts.html +325 -0
  49. package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +220 -0
  50. package/coverage/lcov-report/src/api/controllers/query/import/index.html +116 -0
  51. package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +373 -0
  52. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +131 -0
  53. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +379 -0
  54. package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +157 -0
  55. package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +403 -0
  56. package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +146 -0
  57. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +586 -0
  58. package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +712 -0
  59. package/coverage/lcov-report/src/api/controllers/query/index.html +131 -0
  60. package/coverage/lcov-report/src/api/controllers/query/index.ts.html +976 -0
  61. package/coverage/lcov-report/{api/controllers/query/validation.js.html → src/api/controllers/query/validation.ts.html} +26 -26
  62. package/coverage/lcov-report/{api/controllers/role.js.html → src/api/controllers/role.ts.html} +51 -63
  63. package/coverage/lcov-report/{api/controllers/routing.js.html → src/api/controllers/routing.ts.html} +67 -58
  64. package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +2269 -0
  65. package/coverage/lcov-report/{api/controllers/row/external.js.html → src/api/controllers/row/external.ts.html} +162 -111
  66. package/coverage/lcov-report/{api → src/api}/controllers/row/index.html +82 -52
  67. package/coverage/lcov-report/src/api/controllers/row/index.ts.html +541 -0
  68. package/coverage/lcov-report/{api/controllers/row/internal.js.html → src/api/controllers/row/internal.ts.html} +163 -121
  69. package/coverage/lcov-report/{api/controllers/row/internalSearch.js.html → src/api/controllers/row/internalSearch.ts.html} +189 -117
  70. package/coverage/lcov-report/{api/controllers/row/staticFormula.js.html → src/api/controllers/row/staticFormula.ts.html} +73 -58
  71. package/coverage/lcov-report/{api/controllers/row/utils.js.html → src/api/controllers/row/utils.ts.html} +88 -58
  72. package/coverage/lcov-report/src/api/controllers/screen.ts.html +463 -0
  73. package/coverage/lcov-report/{api/controllers/script.js.html → src/api/controllers/script.ts.html} +19 -16
  74. package/coverage/lcov-report/src/api/controllers/static/index.html +116 -0
  75. package/coverage/lcov-report/src/api/controllers/static/index.ts.html +694 -0
  76. package/coverage/lcov-report/{api/controllers/table/bulkFormula.js.html → src/api/controllers/table/bulkFormula.ts.html} +104 -62
  77. package/coverage/lcov-report/{api/controllers/table/external.js.html → src/api/controllers/table/external.ts.html} +204 -111
  78. package/coverage/lcov-report/src/api/controllers/table/index.html +176 -0
  79. package/coverage/lcov-report/{api/controllers/table/index.js.html → src/api/controllers/table/index.ts.html} +58 -49
  80. package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +661 -0
  81. package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +1255 -0
  82. package/coverage/lcov-report/{api/controllers/templates.js.html → src/api/controllers/templates.ts.html} +38 -29
  83. package/coverage/lcov-report/{api/controllers/user.js.html → src/api/controllers/user.ts.html} +78 -255
  84. package/coverage/lcov-report/{api/controllers/view/exporters.js.html → src/api/controllers/view/exporters.ts.html} +22 -16
  85. package/coverage/lcov-report/{api → src/api}/controllers/view/index.html +36 -36
  86. package/coverage/lcov-report/{api/controllers/view/index.js.html → src/api/controllers/view/index.ts.html} +91 -64
  87. package/coverage/lcov-report/{api/controllers/view/utils.js.html → src/api/controllers/view/utils.ts.html} +72 -54
  88. package/coverage/lcov-report/{api/controllers/view/viewBuilder.js.html → src/api/controllers/view/viewBuilder.ts.html} +78 -36
  89. package/coverage/lcov-report/src/api/controllers/webhook.ts.html +379 -0
  90. package/coverage/lcov-report/{api → src/api}/index.html +23 -23
  91. package/coverage/lcov-report/{api/index.js.html → src/api/index.ts.html} +63 -84
  92. package/coverage/lcov-report/src/api/routes/analytics.ts.html +112 -0
  93. package/coverage/lcov-report/{api/routes/integration.js.html → src/api/routes/apikeys.ts.html} +25 -25
  94. package/coverage/lcov-report/src/api/routes/application.ts.html +223 -0
  95. package/coverage/lcov-report/src/api/routes/auth.ts.html +109 -0
  96. package/coverage/lcov-report/{api/routes/automation.js.html → src/api/routes/automation.ts.html} +53 -47
  97. package/coverage/lcov-report/{api/routes/cloud.js.html → src/api/routes/backup.ts.html} +28 -28
  98. package/coverage/lcov-report/{api/routes/deploy.js.html → src/api/routes/cloud.ts.html} +31 -28
  99. package/coverage/lcov-report/{api/routes/component.js.html → src/api/routes/component.ts.html} +24 -24
  100. package/coverage/lcov-report/src/api/routes/datasource.ts.html +265 -0
  101. package/coverage/lcov-report/src/api/routes/deploy.ts.html +148 -0
  102. package/coverage/lcov-report/src/api/routes/dev.ts.html +199 -0
  103. package/coverage/lcov-report/{api → src/api}/routes/index.html +167 -47
  104. package/coverage/lcov-report/src/api/routes/index.ts.html +289 -0
  105. package/coverage/lcov-report/src/api/routes/integration.ts.html +133 -0
  106. package/coverage/lcov-report/src/api/routes/layout.ts.html +133 -0
  107. package/coverage/lcov-report/{api/routes/metadata.js.html → src/api/routes/metadata.ts.html} +31 -31
  108. package/coverage/lcov-report/{api/routes/migrations.js.html → src/api/routes/migrations.ts.html} +24 -24
  109. package/coverage/lcov-report/{api/routes/permission.js.html → src/api/routes/permission.ts.html} +55 -31
  110. package/coverage/lcov-report/src/api/routes/plugin.ts.html +151 -0
  111. package/coverage/lcov-report/src/api/routes/public/applications.ts.html +541 -0
  112. package/coverage/lcov-report/src/api/routes/public/index.html +191 -0
  113. package/coverage/lcov-report/src/api/routes/public/index.ts.html +493 -0
  114. package/coverage/lcov-report/src/api/routes/public/middleware/index.html +116 -0
  115. package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +328 -0
  116. package/coverage/lcov-report/src/api/routes/public/queries.ts.html +313 -0
  117. package/coverage/lcov-report/src/api/routes/public/rows.ts.html +598 -0
  118. package/coverage/lcov-report/src/api/routes/public/tables.ts.html +586 -0
  119. package/coverage/lcov-report/src/api/routes/public/tests/index.html +116 -0
  120. package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +169 -0
  121. package/coverage/lcov-report/src/api/routes/public/users.ts.html +511 -0
  122. package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +238 -0
  123. package/coverage/lcov-report/src/api/routes/public/utils/index.html +116 -0
  124. package/coverage/lcov-report/{api/routes/query.js.html → src/api/routes/query.ts.html} +41 -50
  125. package/coverage/lcov-report/src/api/routes/role.ts.html +157 -0
  126. package/coverage/lcov-report/{api/routes/routing.js.html → src/api/routes/routing.ts.html} +24 -24
  127. package/coverage/lcov-report/src/api/routes/row.ts.html +883 -0
  128. package/coverage/lcov-report/{api/routes/screen.js.html → src/api/routes/screen.ts.html} +43 -28
  129. package/coverage/lcov-report/{api/routes/script.js.html → src/api/routes/script.ts.html} +17 -17
  130. package/coverage/lcov-report/src/api/routes/static.ts.html +280 -0
  131. package/coverage/lcov-report/{api/routes/table.js.html → src/api/routes/table.ts.html} +32 -41
  132. package/coverage/lcov-report/src/api/routes/templates.ts.html +133 -0
  133. package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +550 -0
  134. package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +131 -0
  135. package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +367 -0
  136. package/coverage/lcov-report/{api/routes/user.js.html → src/api/routes/user.ts.html} +35 -41
  137. package/coverage/lcov-report/{api → src/api}/routes/utils/index.html +15 -15
  138. package/coverage/lcov-report/{api/routes/utils/validators.js.html → src/api/routes/utils/validators.ts.html} +86 -98
  139. package/coverage/lcov-report/{api/routes/view.js.html → src/api/routes/view.ts.html} +45 -36
  140. package/coverage/lcov-report/src/api/routes/webhook.ts.html +166 -0
  141. package/coverage/lcov-report/src/app.ts.html +406 -0
  142. package/coverage/lcov-report/{automations/actions.js.html → src/automations/actions.ts.html} +69 -60
  143. package/coverage/lcov-report/{automations/automationUtils.js.html → src/automations/automationUtils.ts.html} +36 -33
  144. package/coverage/lcov-report/{automations/bullboard.js.html → src/automations/bullboard.ts.html} +39 -42
  145. package/coverage/lcov-report/{automations → src/automations}/index.html +63 -48
  146. package/coverage/lcov-report/{api/routes/dev.js.html → src/automations/index.ts.html} +46 -46
  147. package/coverage/lcov-report/src/automations/logging/index.html +116 -0
  148. package/coverage/lcov-report/src/automations/logging/index.ts.html +199 -0
  149. package/coverage/lcov-report/{automations/steps/bash.js.html → src/automations/steps/bash.ts.html} +45 -30
  150. package/coverage/lcov-report/src/automations/steps/createRow.ts.html +382 -0
  151. package/coverage/lcov-report/{automations/steps/delay.js.html → src/automations/steps/delay.ts.html} +34 -19
  152. package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +349 -0
  153. package/coverage/lcov-report/{automations/steps/discord.js.html → src/automations/steps/discord.ts.html} +43 -28
  154. package/coverage/lcov-report/{automations/steps/executeQuery.js.html → src/automations/steps/executeQuery.ts.html} +45 -30
  155. package/coverage/lcov-report/{automations/steps/executeScript.js.html → src/automations/steps/executeScript.ts.html} +58 -28
  156. package/coverage/lcov-report/{automations/steps/filter.js.html → src/automations/steps/filter.ts.html} +39 -30
  157. package/coverage/lcov-report/src/automations/steps/index.html +371 -0
  158. package/coverage/lcov-report/{automations/steps/integromat.js.html → src/automations/steps/integromat.ts.html} +38 -23
  159. package/coverage/lcov-report/{automations/steps/loop.js.html → src/automations/steps/loop.ts.html} +21 -15
  160. package/coverage/lcov-report/{automations/steps/outgoingWebhook.js.html → src/automations/steps/outgoingWebhook.ts.html} +54 -39
  161. package/coverage/lcov-report/{automations/steps/queryRows.js.html → src/automations/steps/queryRows.ts.html} +102 -66
  162. package/coverage/lcov-report/{automations/steps/sendSmtpEmail.js.html → src/automations/steps/sendSmtpEmail.ts.html} +40 -25
  163. package/coverage/lcov-report/{automations/steps/serverLog.js.html → src/automations/steps/serverLog.ts.html} +40 -22
  164. package/coverage/lcov-report/{automations/steps/slack.js.html → src/automations/steps/slack.ts.html} +38 -23
  165. package/coverage/lcov-report/{automations/steps/updateRow.js.html → src/automations/steps/updateRow.ts.html} +40 -25
  166. package/coverage/lcov-report/{automations/steps/utils.js.html → src/automations/steps/utils.ts.html} +45 -27
  167. package/coverage/lcov-report/{automations/steps/zapier.js.html → src/automations/steps/zapier.ts.html} +41 -23
  168. package/coverage/lcov-report/src/automations/tests/utilities/index.html +116 -0
  169. package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +265 -0
  170. package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +196 -0
  171. package/coverage/lcov-report/{automations/triggerInfo/cron.js.html → src/automations/triggerInfo/cron.ts.html} +30 -15
  172. package/coverage/lcov-report/{automations → src/automations}/triggerInfo/index.html +31 -31
  173. package/coverage/lcov-report/{automations/triggerInfo/index.js.html → src/automations/triggerInfo/index.ts.html} +24 -24
  174. package/coverage/lcov-report/{automations/triggerInfo/rowDeleted.js.html → src/automations/triggerInfo/rowDeleted.ts.html} +30 -15
  175. package/coverage/lcov-report/{automations/triggerInfo/rowSaved.js.html → src/automations/triggerInfo/rowSaved.ts.html} +30 -15
  176. package/coverage/lcov-report/{automations/triggerInfo/rowUpdated.js.html → src/automations/triggerInfo/rowUpdated.ts.html} +30 -15
  177. package/coverage/lcov-report/{automations/triggerInfo/webhook.js.html → src/automations/triggerInfo/webhook.ts.html} +30 -15
  178. package/coverage/lcov-report/{automations/triggers.js.html → src/automations/triggers.ts.html} +78 -66
  179. package/coverage/lcov-report/src/automations/utils.ts.html +886 -0
  180. package/coverage/lcov-report/{constants → src/constants}/index.html +26 -26
  181. package/coverage/lcov-report/src/constants/index.ts.html +697 -0
  182. package/coverage/lcov-report/{constants/layouts.js.html → src/constants/layouts.ts.html} +18 -36
  183. package/coverage/lcov-report/{constants/screens.js.html → src/constants/screens.ts.html} +64 -58
  184. package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +2059 -0
  185. package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +541 -0
  186. package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +427 -0
  187. package/coverage/lcov-report/src/db/defaultData/index.html +176 -0
  188. package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +403 -0
  189. package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +559 -0
  190. package/coverage/lcov-report/src/db/dynamoClient.ts.html +526 -0
  191. package/coverage/lcov-report/{db/inMemoryView.js.html → src/db/inMemoryView.ts.html} +47 -29
  192. package/coverage/lcov-report/{db → src/db}/index.html +48 -33
  193. package/coverage/lcov-report/{api/routes/templates.js.html → src/db/index.ts.html} +28 -28
  194. package/coverage/lcov-report/{db/linkedRows/LinkController.js.html → src/db/linkedRows/LinkController.ts.html} +97 -160
  195. package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +265 -0
  196. package/coverage/lcov-report/src/db/linkedRows/index.html +161 -0
  197. package/coverage/lcov-report/{db/linkedRows/index.js.html → src/db/linkedRows/index.ts.html} +93 -78
  198. package/coverage/lcov-report/{db/linkedRows/linkUtils.js.html → src/db/linkedRows/linkUtils.ts.html} +83 -56
  199. package/coverage/lcov-report/{db/newid.js.html → src/db/newid.ts.html} +14 -14
  200. package/coverage/lcov-report/{db/utils.js.html → src/db/utils.ts.html} +163 -211
  201. package/coverage/lcov-report/{automations/triggerInfo/app.js.html → src/definitions/automations.ts.html} +42 -42
  202. package/coverage/lcov-report/{api/routes/datasource.js.html → src/definitions/datasource.ts.html} +61 -64
  203. package/coverage/lcov-report/src/definitions/index.html +131 -0
  204. package/coverage/lcov-report/src/environment.ts.html +457 -0
  205. package/coverage/lcov-report/{events/AutomationEmitter.js.html → src/events/AutomationEmitter.ts.html} +40 -25
  206. package/coverage/lcov-report/{events/index.js.html → src/events/BudibaseEmitter.ts.html} +26 -29
  207. package/coverage/lcov-report/{events → src/events}/index.html +48 -33
  208. package/coverage/lcov-report/src/events/index.ts.html +100 -0
  209. package/coverage/lcov-report/src/events/utils.ts.html +319 -0
  210. package/coverage/lcov-report/src/index.html +191 -0
  211. package/coverage/lcov-report/{db/index.js.html → src/index.ts.html} +35 -35
  212. package/coverage/lcov-report/{utilities/queue/inMemoryQueue.js.html → src/integrations/airtable.ts.html} +213 -135
  213. package/coverage/lcov-report/src/integrations/arangodb.ts.html +415 -0
  214. package/coverage/lcov-report/src/integrations/base/index.html +161 -0
  215. package/coverage/lcov-report/src/integrations/base/query.ts.html +133 -0
  216. package/coverage/lcov-report/src/integrations/base/sql.ts.html +1951 -0
  217. package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +691 -0
  218. package/coverage/lcov-report/{api/routes/apikeys.js.html → src/integrations/base/utils.ts.html} +30 -30
  219. package/coverage/lcov-report/src/integrations/couchdb.ts.html +406 -0
  220. package/coverage/lcov-report/{constants/index.js.html → src/integrations/dynamodb.ts.html} +263 -227
  221. package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +634 -0
  222. package/coverage/lcov-report/src/integrations/firebase.ts.html +646 -0
  223. package/coverage/lcov-report/src/integrations/googlesheets.ts.html +1315 -0
  224. package/coverage/lcov-report/src/integrations/index.html +371 -0
  225. package/coverage/lcov-report/src/integrations/index.ts.html +445 -0
  226. package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +1012 -0
  227. package/coverage/lcov-report/src/integrations/mongodb.ts.html +1867 -0
  228. package/coverage/lcov-report/src/integrations/mysql.ts.html +967 -0
  229. package/coverage/lcov-report/src/integrations/oracle.ts.html +1387 -0
  230. package/coverage/lcov-report/src/integrations/postgres.ts.html +1087 -0
  231. package/coverage/lcov-report/src/integrations/queries/index.html +116 -0
  232. package/coverage/lcov-report/src/integrations/queries/sql.ts.html +463 -0
  233. package/coverage/lcov-report/src/integrations/redis.ts.html +550 -0
  234. package/coverage/lcov-report/src/integrations/rest.ts.html +1381 -0
  235. package/coverage/lcov-report/src/integrations/s3.ts.html +862 -0
  236. package/coverage/lcov-report/src/integrations/snowflake.ts.html +376 -0
  237. package/coverage/lcov-report/{integrations → src/integrations}/tests/TestConfiguration.js.html +10 -10
  238. package/coverage/lcov-report/{integrations → src/integrations}/tests/index.html +10 -10
  239. package/coverage/lcov-report/src/integrations/utils.ts.html +1018 -0
  240. package/coverage/lcov-report/{middleware/appInfo.js.html → src/middleware/appInfo.ts.html} +33 -30
  241. package/coverage/lcov-report/src/middleware/authorized.ts.html +460 -0
  242. package/coverage/lcov-report/{middleware/builder.js.html → src/middleware/builder.ts.html} +57 -51
  243. package/coverage/lcov-report/{middleware/currentapp.js.html → src/middleware/currentapp.ts.html} +116 -107
  244. package/coverage/lcov-report/{middleware → src/middleware}/index.html +78 -63
  245. package/coverage/lcov-report/{middleware/joi-validator.js.html → src/middleware/joi-validator.ts.html} +25 -22
  246. package/coverage/lcov-report/{middleware/publicApi.js.html → src/middleware/publicApi.ts.html} +31 -31
  247. package/coverage/lcov-report/{middleware/resourceId.js.html → src/middleware/resourceId.ts.html} +66 -51
  248. package/coverage/lcov-report/{api/controllers/integration.js.html → src/middleware/selfhost.ts.html} +22 -28
  249. package/coverage/lcov-report/{api/routes/analytics.js.html → src/middleware/utils.ts.html} +19 -19
  250. package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +166 -0
  251. package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +163 -0
  252. package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +151 -0
  253. package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +206 -0
  254. package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +172 -0
  255. package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +226 -0
  256. package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +151 -0
  257. package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +151 -0
  258. package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +166 -0
  259. package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +532 -0
  260. package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +283 -0
  261. package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +146 -0
  262. package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +265 -0
  263. package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +232 -0
  264. package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +724 -0
  265. package/coverage/lcov-report/src/migrations/functions/backfill/index.html +161 -0
  266. package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +106 -0
  267. package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +235 -0
  268. package/coverage/lcov-report/src/migrations/functions/index.html +161 -0
  269. package/coverage/lcov-report/{api/routes/role.js.html → src/migrations/functions/syncQuotas.ts.html} +36 -36
  270. package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +520 -0
  271. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +161 -0
  272. package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +94 -0
  273. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +127 -0
  274. package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +115 -0
  275. package/coverage/lcov-report/{automations/index.js.html → src/migrations/functions/usageQuotas/syncRows.ts.html} +58 -61
  276. package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +124 -0
  277. package/coverage/lcov-report/{utilities/queue → src/migrations}/index.html +23 -23
  278. package/coverage/lcov-report/src/migrations/index.ts.html +430 -0
  279. package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +205 -0
  280. package/coverage/lcov-report/src/migrations/tests/index.html +131 -0
  281. package/coverage/lcov-report/src/migrations/tests/structures.ts.html +283 -0
  282. package/coverage/lcov-report/src/sdk/app/applications/index.html +146 -0
  283. package/coverage/lcov-report/{middleware/utils.js.html → src/sdk/app/applications/index.ts.html} +19 -19
  284. package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +268 -0
  285. package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +136 -0
  286. package/coverage/lcov-report/src/sdk/app/automations/index.html +131 -0
  287. package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +100 -0
  288. package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +214 -0
  289. package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +91 -0
  290. package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +604 -0
  291. package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +682 -0
  292. package/coverage/lcov-report/src/sdk/app/backups/index.html +176 -0
  293. package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +112 -0
  294. package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +292 -0
  295. package/coverage/lcov-report/src/sdk/app/tables/index.html +116 -0
  296. package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +265 -0
  297. package/coverage/lcov-report/{utilities/routing → src/sdk}/index.html +10 -10
  298. package/coverage/lcov-report/{api/routes/layout.js.html → src/sdk/index.ts.html} +24 -24
  299. package/coverage/lcov-report/src/sdk/users/index.html +131 -0
  300. package/coverage/lcov-report/src/sdk/users/index.ts.html +100 -0
  301. package/coverage/lcov-report/src/sdk/users/utils.ts.html +277 -0
  302. package/coverage/lcov-report/src/startup.ts.html +499 -0
  303. package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +1966 -0
  304. package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +127 -0
  305. package/coverage/lcov-report/src/tests/utilities/index.html +161 -0
  306. package/coverage/lcov-report/{middleware/selfhost.js.html → src/tests/utilities/index.ts.html} +33 -30
  307. package/coverage/lcov-report/src/tests/utilities/structures.ts.html +667 -0
  308. package/coverage/lcov-report/src/threads/automation.ts.html +1594 -0
  309. package/coverage/lcov-report/src/threads/index.html +161 -0
  310. package/coverage/lcov-report/src/threads/index.ts.html +418 -0
  311. package/coverage/lcov-report/src/threads/query.ts.html +961 -0
  312. package/coverage/lcov-report/src/threads/utils.ts.html +373 -0
  313. package/coverage/lcov-report/{utilities/budibaseDir.js.html → src/utilities/budibaseDir.ts.html} +14 -14
  314. package/coverage/lcov-report/{utilities/centralPath.js.html → src/utilities/centralPath.ts.html} +16 -16
  315. package/coverage/lcov-report/{utilities/csvParser.js.html → src/utilities/csvParser.ts.html} +107 -59
  316. package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +547 -0
  317. package/coverage/lcov-report/{api/controllers/table → src/utilities/fileSystem}/index.html +44 -44
  318. package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +1129 -0
  319. package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +142 -0
  320. package/coverage/lcov-report/{utilities/global.js.html → src/utilities/global.ts.html} +144 -111
  321. package/coverage/lcov-report/{utilities → src/utilities}/index.html +92 -77
  322. package/coverage/lcov-report/{utilities/index.js.html → src/utilities/index.ts.html} +98 -74
  323. package/coverage/lcov-report/{utilities/plugins.js.html → src/utilities/plugins.ts.html} +25 -22
  324. package/coverage/lcov-report/src/utilities/redis.ts.html +343 -0
  325. package/coverage/lcov-report/{api/controllers/query → src/utilities/routing}/index.html +8 -8
  326. package/coverage/lcov-report/src/utilities/routing/index.ts.html +181 -0
  327. package/coverage/lcov-report/src/utilities/rowProcessor/index.html +146 -0
  328. package/coverage/lcov-report/{utilities/rowProcessor/index.js.html → src/utilities/rowProcessor/index.ts.html} +128 -359
  329. package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +373 -0
  330. package/coverage/lcov-report/{utilities/rowProcessor/utils.js.html → src/utilities/rowProcessor/utils.ts.html} +54 -42
  331. package/coverage/lcov-report/{utilities/scriptRunner.js.html → src/utilities/scriptRunner.ts.html} +31 -19
  332. package/coverage/lcov-report/{utilities/security.js.html → src/utilities/security.ts.html} +60 -78
  333. package/coverage/lcov-report/{utilities/statusCodes.js.html → src/utilities/statusCodes.ts.html} +11 -11
  334. package/coverage/lcov-report/{utilities → src/utilities}/usageQuota/index.html +30 -30
  335. package/coverage/lcov-report/{utilities/usageQuota/rows.js.html → src/utilities/usageQuota/rows.ts.html} +42 -54
  336. package/coverage/lcov-report/{utilities/usageQuota/usageQuoteReset.js.html → src/utilities/usageQuota/usageQuoteReset.ts.html} +13 -13
  337. package/coverage/lcov-report/{utilities/users.js.html → src/utilities/users.ts.html} +44 -50
  338. package/coverage/lcov-report/{utilities/workerRequests.js.html → src/utilities/workerRequests.ts.html} +127 -112
  339. package/coverage/lcov-report/{events/utils.js.html → src/watch.ts.html} +68 -71
  340. package/coverage/lcov-report/src/websocket.ts.html +163 -0
  341. package/coverage/lcov.info +19994 -7196
  342. package/dist/api/controllers/apikeys.js +12 -9
  343. package/dist/api/controllers/application.js +430 -446
  344. package/dist/api/controllers/automation.js +122 -82
  345. package/dist/api/controllers/cloud.js +85 -71
  346. package/dist/api/controllers/component.js +4 -2
  347. package/dist/api/controllers/datasource.js +151 -94
  348. package/dist/api/controllers/deploy/Deployment.js +10 -6
  349. package/dist/api/controllers/deploy/index.js +19 -16
  350. package/dist/api/controllers/dev.js +96 -81
  351. package/dist/api/controllers/integration.js +11 -8
  352. package/dist/api/controllers/layout.js +18 -15
  353. package/dist/api/controllers/metadata.js +51 -37
  354. package/dist/api/controllers/migrations.js +19 -11
  355. package/dist/api/controllers/permission.js +52 -43
  356. package/dist/api/controllers/plugin/index.js +6 -7
  357. package/dist/api/controllers/plugin/utils.js +2 -1
  358. package/dist/api/controllers/public/applications.js +17 -9
  359. package/dist/api/controllers/public/tables.js +29 -9
  360. package/dist/api/controllers/public/users.js +18 -0
  361. package/dist/api/controllers/public/utils.js +2 -2
  362. package/dist/api/controllers/query/import/index.js +1 -2
  363. package/dist/api/controllers/query/index.js +10 -13
  364. package/dist/api/controllers/query/validation.js +41 -33
  365. package/dist/api/controllers/role.js +29 -27
  366. package/dist/api/controllers/routing.js +71 -58
  367. package/dist/api/controllers/row/ExternalRequest.js +539 -542
  368. package/dist/api/controllers/row/external.js +258 -190
  369. package/dist/api/controllers/row/index.js +43 -14
  370. package/dist/api/controllers/row/internal.js +354 -295
  371. package/dist/api/controllers/row/internalSearch.js +95 -80
  372. package/dist/api/controllers/row/staticFormula.js +125 -112
  373. package/dist/api/controllers/row/utils.js +122 -84
  374. package/dist/api/controllers/screen.js +81 -66
  375. package/dist/api/controllers/script.js +13 -6
  376. package/dist/api/controllers/static/index.js +11 -14
  377. package/dist/api/controllers/table/bulkFormula.js +47 -35
  378. package/dist/api/controllers/table/external.js +89 -53
  379. package/dist/api/controllers/table/index.js +64 -31
  380. package/dist/api/controllers/table/internal.js +5 -6
  381. package/dist/api/controllers/table/utils.js +39 -35
  382. package/dist/api/controllers/templates.js +17 -10
  383. package/dist/api/controllers/user.js +65 -94
  384. package/dist/api/controllers/view/exporters.js +8 -4
  385. package/dist/api/controllers/view/index.js +201 -153
  386. package/dist/api/controllers/view/utils.js +151 -121
  387. package/dist/api/controllers/view/viewBuilder.js +4 -16
  388. package/dist/api/controllers/webhook.js +25 -2
  389. package/dist/api/index.js +38 -34
  390. package/dist/api/routes/analytics.js +29 -3
  391. package/dist/api/routes/apikeys.js +33 -7
  392. package/dist/api/routes/application.js +8 -9
  393. package/dist/api/routes/auth.js +1 -2
  394. package/dist/api/routes/automation.js +46 -20
  395. package/dist/api/routes/backup.js +3 -4
  396. package/dist/api/routes/cloud.js +32 -6
  397. package/dist/api/routes/component.js +32 -6
  398. package/dist/api/routes/datasource.js +39 -13
  399. package/dist/api/routes/deploy.js +34 -8
  400. package/dist/api/routes/dev.js +36 -10
  401. package/dist/api/routes/integration.js +33 -7
  402. package/dist/api/routes/layout.js +33 -7
  403. package/dist/api/routes/metadata.js +36 -10
  404. package/dist/api/routes/migrations.js +32 -6
  405. package/dist/api/routes/permission.js +38 -12
  406. package/dist/api/routes/plugin.js +5 -5
  407. package/dist/api/routes/public/index.js +11 -11
  408. package/dist/api/routes/public/tests/utils.js +33 -0
  409. package/dist/api/routes/query.js +42 -15
  410. package/dist/api/routes/role.js +36 -10
  411. package/dist/api/routes/routing.js +32 -6
  412. package/dist/api/routes/row.js +12 -11
  413. package/dist/api/routes/screen.js +35 -9
  414. package/dist/api/routes/script.js +32 -6
  415. package/dist/api/routes/static.js +9 -9
  416. package/dist/api/routes/table.js +40 -13
  417. package/dist/api/routes/templates.js +33 -7
  418. package/dist/api/routes/tests/utilities/TestFunctions.js +6 -8
  419. package/dist/api/routes/tests/utilities/index.js +69 -32
  420. package/dist/api/routes/user.js +40 -13
  421. package/dist/api/routes/utils/validators.js +142 -126
  422. package/dist/api/routes/view.js +38 -12
  423. package/dist/api/routes/webhook.js +1 -2
  424. package/dist/app.js +22 -22
  425. package/dist/automations/actions.js +53 -24
  426. package/dist/automations/automationUtils.js +31 -19
  427. package/dist/automations/bullboard.js +59 -29
  428. package/dist/automations/index.js +23 -18
  429. package/dist/automations/steps/bash.js +40 -10
  430. package/dist/automations/steps/createRow.js +2 -1
  431. package/dist/automations/steps/delay.js +9 -5
  432. package/dist/automations/steps/deleteRow.js +2 -1
  433. package/dist/automations/steps/discord.js +14 -7
  434. package/dist/automations/steps/executeQuery.js +34 -7
  435. package/dist/automations/steps/executeScript.js +34 -7
  436. package/dist/automations/steps/filter.js +20 -18
  437. package/dist/automations/steps/integromat.js +14 -7
  438. package/dist/automations/steps/loop.js +4 -1
  439. package/dist/automations/steps/outgoingWebhook.js +45 -14
  440. package/dist/automations/steps/queryRows.js +71 -38
  441. package/dist/automations/steps/sendSmtpEmail.js +33 -6
  442. package/dist/automations/steps/serverLog.js +12 -8
  443. package/dist/automations/steps/slack.js +14 -7
  444. package/dist/automations/steps/updateRow.js +34 -7
  445. package/dist/automations/steps/utils.js +22 -16
  446. package/dist/automations/steps/zapier.js +15 -7
  447. package/dist/automations/tests/utilities/index.js +62 -38
  448. package/dist/automations/triggerInfo/app.js +4 -1
  449. package/dist/automations/triggerInfo/cron.js +4 -1
  450. package/dist/automations/triggerInfo/index.js +31 -6
  451. package/dist/automations/triggerInfo/rowDeleted.js +4 -1
  452. package/dist/automations/triggerInfo/rowSaved.js +4 -1
  453. package/dist/automations/triggerInfo/rowUpdated.js +4 -1
  454. package/dist/automations/triggerInfo/webhook.js +4 -1
  455. package/dist/automations/triggers.js +90 -57
  456. package/dist/automations/utils.js +9 -8
  457. package/dist/constants/index.js +118 -104
  458. package/dist/constants/layouts.js +7 -10
  459. package/dist/constants/screens.js +49 -44
  460. package/dist/db/defaultData/datasource_bb_default.js +573 -0
  461. package/dist/db/defaultData/employeeImport.js +155 -0
  462. package/dist/db/defaultData/expensesImport.js +117 -0
  463. package/dist/db/defaultData/inventoryImport.js +109 -0
  464. package/dist/db/defaultData/jobsImport.js +152 -0
  465. package/dist/db/dynamoClient.js +20 -20
  466. package/dist/db/inMemoryView.js +47 -38
  467. package/dist/db/index.js +7 -4
  468. package/dist/db/linkedRows/LinkController.js +51 -70
  469. package/dist/db/linkedRows/LinkDocument.js +32 -0
  470. package/dist/db/linkedRows/index.js +93 -81
  471. package/dist/db/linkedRows/linkUtils.js +42 -32
  472. package/dist/db/utils.js +146 -119
  473. package/dist/db/views/staticViews.js +91 -74
  474. package/dist/environment.js +9 -6
  475. package/dist/events/AutomationEmitter.js +13 -10
  476. package/dist/events/BudibaseEmitter.js +24 -0
  477. package/dist/events/index.js +5 -23
  478. package/dist/events/utils.js +18 -10
  479. package/dist/integrations/base/types.js +2 -0
  480. package/dist/integrations/elasticsearch.js +26 -2
  481. package/dist/integrations/googlesheets.js +5 -6
  482. package/dist/integrations/index.js +15 -6
  483. package/dist/integrations/microsoftSqlServer.js +8 -3
  484. package/dist/integrations/oracle.js +8 -1
  485. package/dist/integrations/postgres.js +6 -3
  486. package/dist/integrations/s3.js +157 -1
  487. package/dist/middleware/appInfo.js +14 -9
  488. package/dist/middleware/authorized.js +22 -21
  489. package/dist/middleware/builder.js +41 -40
  490. package/dist/middleware/currentapp.js +39 -37
  491. package/dist/middleware/joi-validator.js +17 -10
  492. package/dist/middleware/publicApi.js +5 -6
  493. package/dist/middleware/resourceId.js +16 -9
  494. package/dist/middleware/selfhost.js +5 -4
  495. package/dist/middleware/utils.js +5 -2
  496. package/dist/migrations/functions/appUrls.js +7 -11
  497. package/dist/migrations/functions/backfill/global.js +1 -1
  498. package/dist/migrations/functions/tableSettings.js +130 -0
  499. package/dist/migrations/functions/usageQuotas/syncApps.js +3 -4
  500. package/dist/migrations/functions/usageQuotas/syncRows.js +3 -4
  501. package/dist/migrations/functions/userEmailViewCasing.js +3 -3
  502. package/dist/migrations/index.js +5 -0
  503. package/dist/package.json +11 -45
  504. package/dist/sdk/app/applications/index.js +28 -0
  505. package/dist/sdk/app/applications/sync.js +70 -0
  506. package/dist/sdk/app/applications/utils.js +21 -0
  507. package/dist/sdk/app/backups/exports.js +1 -2
  508. package/dist/sdk/app/backups/imports.js +2 -3
  509. package/dist/sdk/app/tables/index.js +5 -5
  510. package/dist/sdk/index.js +4 -2
  511. package/dist/sdk/users/index.js +27 -0
  512. package/dist/sdk/users/utils.js +65 -0
  513. package/dist/startup.js +10 -10
  514. package/dist/tests/utilities/TestConfiguration.js +111 -87
  515. package/dist/tests/utilities/controllers.js +38 -15
  516. package/dist/tests/utilities/structures.js +72 -53
  517. package/dist/threads/automation.js +49 -27
  518. package/dist/threads/query.js +17 -19
  519. package/dist/threads/utils.js +33 -8
  520. package/dist/tsconfig.build.tsbuildinfo +1 -1
  521. package/dist/utilities/budibaseDir.js +4 -2
  522. package/dist/utilities/centralPath.js +14 -7
  523. package/dist/utilities/csvParser.js +27 -21
  524. package/dist/utilities/fileSystem/clientLibrary.js +87 -73
  525. package/dist/utilities/fileSystem/index.js +203 -175
  526. package/dist/utilities/fileSystem/processor.js +8 -3
  527. package/dist/utilities/global.js +87 -66
  528. package/dist/utilities/index.js +102 -75
  529. package/dist/utilities/plugins.js +15 -9
  530. package/dist/utilities/redis.js +100 -65
  531. package/dist/utilities/routing/index.js +27 -23
  532. package/dist/utilities/rowProcessor/index.js +133 -191
  533. package/dist/utilities/rowProcessor/map.js +99 -0
  534. package/dist/utilities/rowProcessor/utils.js +35 -26
  535. package/dist/utilities/scriptRunner.js +8 -5
  536. package/dist/utilities/security.js +39 -35
  537. package/dist/utilities/usageQuota/rows.js +56 -49
  538. package/dist/utilities/users.js +31 -28
  539. package/dist/utilities/workerRequests.js +115 -82
  540. package/dist/watch.js +1 -2
  541. package/jest.config.ts +33 -0
  542. package/package.json +12 -46
  543. package/scripts/exportAppTemplate.js +2 -2
  544. package/scripts/integrations/mssql/data/setup.sql +3 -3
  545. package/scripts/integrations/postgres/emp-skill.sql +46 -0
  546. package/scripts/localdomain.js +34 -6
  547. package/src/api/controllers/{apikeys.js → apikeys.ts} +10 -10
  548. package/src/api/controllers/application.ts +100 -135
  549. package/src/api/controllers/auth.ts +4 -3
  550. package/src/api/controllers/{automation.js → automation.ts} +48 -48
  551. package/src/api/controllers/{cloud.js → cloud.ts} +25 -24
  552. package/src/api/controllers/component.ts +2 -1
  553. package/src/api/controllers/{datasource.js → datasource.ts} +109 -49
  554. package/src/api/controllers/deploy/{Deployment.js → Deployment.ts} +13 -10
  555. package/src/api/controllers/deploy/index.ts +19 -25
  556. package/src/api/controllers/{dev.js → dev.ts} +31 -37
  557. package/src/api/controllers/integration.ts +13 -0
  558. package/src/api/controllers/{layout.js → layout.ts} +8 -8
  559. package/src/api/controllers/{metadata.js → metadata.ts} +11 -10
  560. package/src/api/controllers/migrations.ts +14 -0
  561. package/src/api/controllers/{permission.js → permission.ts} +49 -46
  562. package/src/api/controllers/plugin/index.ts +4 -5
  563. package/src/api/controllers/plugin/utils.ts +3 -5
  564. package/src/api/controllers/public/applications.ts +15 -9
  565. package/src/api/controllers/public/rows.ts +1 -1
  566. package/src/api/controllers/public/tables.ts +2 -2
  567. package/src/api/controllers/public/users.ts +25 -6
  568. package/src/api/controllers/public/utils.ts +2 -2
  569. package/src/api/controllers/query/import/index.ts +2 -3
  570. package/src/api/controllers/query/index.ts +11 -14
  571. package/src/api/controllers/query/{validation.js → validation.ts} +7 -7
  572. package/src/api/controllers/{role.js → role.ts} +21 -25
  573. package/src/api/controllers/{routing.js → routing.ts} +37 -34
  574. package/src/api/controllers/row/ExternalRequest.ts +605 -624
  575. package/src/api/controllers/row/{external.js → external.ts} +79 -62
  576. package/src/api/controllers/row/index.ts +19 -11
  577. package/src/api/controllers/row/{internal.js → internal.ts} +87 -73
  578. package/src/api/controllers/row/{internalSearch.js → internalSearch.ts} +92 -68
  579. package/src/api/controllers/row/{staticFormula.js → staticFormula.ts} +30 -25
  580. package/src/api/controllers/row/{utils.js → utils.ts} +32 -22
  581. package/src/api/controllers/screen.ts +10 -6
  582. package/src/api/controllers/script.ts +12 -0
  583. package/src/api/controllers/static/index.ts +14 -16
  584. package/src/api/controllers/table/{bulkFormula.js → bulkFormula.ts} +39 -25
  585. package/src/api/controllers/table/{external.js → external.ts} +86 -55
  586. package/src/api/controllers/table/{index.js → index.ts} +21 -18
  587. package/src/api/controllers/table/internal.ts +5 -6
  588. package/src/api/controllers/table/utils.ts +26 -21
  589. package/src/api/controllers/{templates.js → templates.ts} +10 -7
  590. package/src/api/controllers/{user.js → user.ts} +42 -101
  591. package/src/api/controllers/view/{exporters.js → exporters.ts} +5 -3
  592. package/src/api/controllers/view/{index.js → index.ts} +36 -27
  593. package/src/api/controllers/view/{utils.js → utils.ts} +26 -20
  594. package/src/api/controllers/view/{viewBuilder.js → viewBuilder.ts} +25 -11
  595. package/src/api/controllers/webhook.ts +1 -1
  596. package/src/api/{index.js → index.ts} +15 -22
  597. package/src/api/routes/analytics.ts +9 -0
  598. package/src/api/routes/apikeys.ts +12 -0
  599. package/src/api/routes/application.ts +17 -9
  600. package/src/api/routes/auth.ts +2 -2
  601. package/src/api/routes/automation.ts +87 -0
  602. package/src/api/routes/backup.ts +8 -4
  603. package/src/api/routes/cloud.ts +18 -0
  604. package/src/api/routes/component.ts +14 -0
  605. package/src/api/routes/datasource.ts +60 -0
  606. package/src/api/routes/deploy.ts +21 -0
  607. package/src/api/routes/dev.ts +38 -0
  608. package/src/api/routes/integration.ts +16 -0
  609. package/src/api/routes/layout.ts +16 -0
  610. package/src/api/routes/{metadata.js → metadata.ts} +13 -13
  611. package/src/api/routes/migrations.ts +14 -0
  612. package/src/api/routes/permission.ts +41 -0
  613. package/src/api/routes/plugin.ts +14 -6
  614. package/src/api/routes/public/index.ts +11 -14
  615. package/src/api/routes/public/tests/compare.spec.js +3 -21
  616. package/src/api/routes/public/tests/users.spec.js +38 -0
  617. package/src/api/routes/public/tests/utils.ts +28 -0
  618. package/src/api/routes/{query.js → query.ts} +19 -22
  619. package/src/api/routes/role.ts +24 -0
  620. package/src/api/routes/routing.ts +14 -0
  621. package/src/api/routes/row.ts +13 -15
  622. package/src/api/routes/screen.ts +23 -0
  623. package/src/api/routes/script.ts +10 -0
  624. package/src/api/routes/static.ts +7 -10
  625. package/src/api/routes/{table.js → table.ts} +10 -13
  626. package/src/api/routes/templates.ts +16 -0
  627. package/src/api/routes/tests/analytics.spec.js +1 -1
  628. package/src/api/routes/tests/application.spec.js +0 -1
  629. package/src/api/routes/tests/backup.spec.js +9 -1
  630. package/src/api/routes/tests/deployment.spec.ts +1 -1
  631. package/src/api/routes/tests/permissions.spec.js +2 -1
  632. package/src/api/routes/tests/query.spec.js +15 -10
  633. package/src/api/routes/tests/role.spec.js +7 -9
  634. package/src/api/routes/tests/routing.spec.js +2 -1
  635. package/src/api/routes/tests/row.spec.js +3 -4
  636. package/src/api/routes/tests/static.spec.js +2 -2
  637. package/src/api/routes/tests/table.spec.js +40 -36
  638. package/src/api/routes/tests/user.spec.js +2 -1
  639. package/src/api/routes/tests/utilities/TestFunctions.ts +6 -8
  640. package/src/api/routes/tests/utilities/{index.js → index.ts} +12 -12
  641. package/src/api/routes/tests/view.spec.js +3 -3
  642. package/src/api/routes/user.ts +51 -0
  643. package/src/api/routes/utils/{validators.js → validators.ts} +33 -37
  644. package/src/api/routes/view.ts +34 -0
  645. package/src/api/routes/webhook.ts +2 -2
  646. package/src/app.ts +15 -14
  647. package/src/automations/{actions.js → actions.ts} +26 -23
  648. package/src/automations/{automationUtils.js → automationUtils.ts} +13 -12
  649. package/src/automations/bullboard.ts +38 -0
  650. package/src/automations/index.ts +26 -0
  651. package/src/automations/steps/{bash.js → bash.ts} +13 -8
  652. package/src/automations/steps/createRow.ts +8 -3
  653. package/src/automations/steps/{delay.js → delay.ts} +9 -4
  654. package/src/automations/steps/deleteRow.ts +8 -3
  655. package/src/automations/steps/{discord.js → discord.ts} +10 -5
  656. package/src/automations/steps/{executeQuery.js → executeQuery.ts} +12 -7
  657. package/src/automations/steps/{executeScript.js → executeScript.ts} +17 -7
  658. package/src/automations/steps/{filter.js → filter.ts} +12 -9
  659. package/src/automations/steps/{integromat.js → integromat.ts} +10 -5
  660. package/src/automations/steps/{loop.js → loop.ts} +4 -2
  661. package/src/automations/steps/{outgoingWebhook.js → outgoingWebhook.ts} +18 -13
  662. package/src/automations/steps/{queryRows.js → queryRows.ts} +48 -36
  663. package/src/automations/steps/{sendSmtpEmail.js → sendSmtpEmail.ts} +10 -5
  664. package/src/automations/steps/{serverLog.js → serverLog.ts} +9 -3
  665. package/src/automations/steps/{slack.js → slack.ts} +10 -5
  666. package/src/automations/steps/{updateRow.js → updateRow.ts} +12 -7
  667. package/src/automations/steps/{utils.js → utils.ts} +10 -4
  668. package/src/automations/steps/{zapier.js → zapier.ts} +11 -5
  669. package/src/automations/tests/updateRow.spec.js +0 -1
  670. package/src/automations/tests/utilities/index.ts +60 -0
  671. package/src/automations/triggerInfo/{app.js → app.ts} +7 -2
  672. package/src/automations/triggerInfo/{cron.js → cron.ts} +7 -2
  673. package/src/automations/triggerInfo/index.ts +15 -0
  674. package/src/automations/triggerInfo/{rowDeleted.js → rowDeleted.ts} +7 -2
  675. package/src/automations/triggerInfo/{rowSaved.js → rowSaved.ts} +7 -2
  676. package/src/automations/triggerInfo/{rowUpdated.js → rowUpdated.ts} +7 -2
  677. package/src/automations/triggerInfo/{webhook.js → webhook.ts} +7 -2
  678. package/src/automations/{triggers.js → triggers.ts} +30 -26
  679. package/src/automations/utils.ts +9 -12
  680. package/src/constants/index.ts +204 -0
  681. package/src/constants/{layouts.js → layouts.ts} +3 -9
  682. package/src/constants/screens.ts +48 -0
  683. package/src/db/defaultData/datasource_bb_default.ts +658 -0
  684. package/src/db/defaultData/employeeImport.ts +152 -0
  685. package/src/db/defaultData/expensesImport.ts +114 -0
  686. package/src/db/defaultData/inventoryImport.ts +106 -0
  687. package/src/db/defaultData/jobsImport.ts +158 -0
  688. package/src/db/{dynamoClient.js → dynamoClient.ts} +39 -19
  689. package/src/db/{inMemoryView.js → inMemoryView.ts} +15 -9
  690. package/src/db/index.ts +16 -0
  691. package/src/db/linkedRows/{LinkController.js → LinkController.ts} +64 -85
  692. package/src/db/linkedRows/LinkDocument.ts +60 -0
  693. package/src/db/linkedRows/{index.js → index.ts} +43 -38
  694. package/src/db/linkedRows/{linkUtils.js → linkUtils.ts} +33 -24
  695. package/src/db/{newid.js → newid.ts} +1 -1
  696. package/src/db/tests/linkController.spec.js +73 -57
  697. package/src/db/tests/linkTests.spec.js +17 -14
  698. package/src/db/{utils.js → utils.ts} +77 -93
  699. package/src/db/views/{staticViews.js → staticViews.ts} +20 -13
  700. package/src/{environment.js → environment.ts} +11 -7
  701. package/src/events/{AutomationEmitter.js → AutomationEmitter.ts} +12 -7
  702. package/src/events/{index.js → BudibaseEmitter.ts} +7 -8
  703. package/src/events/index.ts +5 -0
  704. package/src/events/utils.ts +78 -0
  705. package/src/integrations/base/sql.ts +1 -1
  706. package/src/integrations/base/sqlTable.ts +1 -1
  707. package/src/integrations/base/types.ts +134 -0
  708. package/src/integrations/elasticsearch.ts +32 -2
  709. package/src/integrations/googlesheets.ts +5 -7
  710. package/src/integrations/index.ts +45 -41
  711. package/src/integrations/microsoftSqlServer.ts +14 -12
  712. package/src/integrations/mysql.ts +4 -3
  713. package/src/integrations/oracle.ts +17 -46
  714. package/src/integrations/postgres.ts +8 -2
  715. package/src/integrations/s3.ts +179 -3
  716. package/src/integrations/tests/s3.spec.ts +85 -1
  717. package/src/integrations/utils.ts +6 -2
  718. package/src/middleware/appInfo.ts +20 -0
  719. package/src/middleware/authorized.ts +21 -28
  720. package/src/middleware/{builder.js → builder.ts} +17 -15
  721. package/src/middleware/{currentapp.js → currentapp.ts} +42 -39
  722. package/src/middleware/{joi-validator.js → joi-validator.ts} +9 -8
  723. package/src/middleware/publicApi.ts +21 -0
  724. package/src/middleware/{resourceId.js → resourceId.ts} +16 -11
  725. package/src/middleware/{selfhost.js → selfhost.ts} +4 -2
  726. package/src/middleware/tests/authorized.spec.js +5 -6
  727. package/src/middleware/tests/currentapp.spec.js +118 -63
  728. package/src/middleware/{utils.js → utils.ts} +3 -1
  729. package/src/migrations/functions/appUrls.ts +4 -11
  730. package/src/migrations/functions/backfill/app/tables.ts +2 -5
  731. package/src/migrations/functions/backfill/global.ts +1 -1
  732. package/src/migrations/functions/tableSettings.ts +145 -0
  733. package/src/migrations/functions/tests/appUrls.spec.js +4 -4
  734. package/src/migrations/functions/tests/tableSettings.spec.ts +144 -0
  735. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +14 -9
  736. package/src/migrations/functions/usageQuotas/syncApps.ts +3 -4
  737. package/src/migrations/functions/usageQuotas/syncRows.ts +4 -5
  738. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +7 -7
  739. package/src/migrations/functions/userEmailViewCasing.ts +3 -3
  740. package/src/migrations/index.ts +9 -0
  741. package/src/migrations/tests/index.spec.ts +1 -1
  742. package/src/sdk/app/applications/index.ts +7 -0
  743. package/src/sdk/app/applications/sync.ts +61 -0
  744. package/src/sdk/app/applications/utils.ts +17 -0
  745. package/src/sdk/app/backups/exports.ts +5 -3
  746. package/src/sdk/app/backups/imports.ts +7 -14
  747. package/src/sdk/app/backups/statistics.ts +9 -18
  748. package/src/sdk/app/tables/index.ts +7 -8
  749. package/src/sdk/index.ts +4 -3
  750. package/src/sdk/users/index.ts +5 -0
  751. package/src/sdk/users/utils.ts +64 -0
  752. package/src/startup.ts +5 -5
  753. package/{scripts/jestSetup.js → src/tests/jestSetup.ts} +11 -2
  754. package/src/tests/utilities/{TestConfiguration.js → TestConfiguration.ts} +111 -78
  755. package/src/tests/utilities/controllers.ts +14 -0
  756. package/src/tests/utilities/{index.js → index.ts} +2 -2
  757. package/src/tests/utilities/{structures.js → structures.ts} +41 -36
  758. package/src/threads/automation.ts +18 -19
  759. package/src/threads/query.ts +11 -16
  760. package/src/threads/utils.ts +4 -5
  761. package/src/utilities/budibaseDir.ts +3 -0
  762. package/src/utilities/{centralPath.js → centralPath.ts} +3 -3
  763. package/src/utilities/{csvParser.js → csvParser.ts} +42 -26
  764. package/src/utilities/fileSystem/{clientLibrary.js → clientLibrary.ts} +20 -20
  765. package/src/utilities/fileSystem/{index.js → index.ts} +61 -65
  766. package/src/utilities/fileSystem/{processor.js → processor.ts} +3 -5
  767. package/src/utilities/global.ts +138 -0
  768. package/src/utilities/{index.js → index.ts} +40 -32
  769. package/src/utilities/{plugins.js → plugins.ts} +5 -4
  770. package/src/utilities/{redis.js → redis.ts} +21 -20
  771. package/src/utilities/routing/index.ts +32 -0
  772. package/src/utilities/rowProcessor/{index.js → index.ts} +67 -144
  773. package/src/utilities/rowProcessor/map.ts +96 -0
  774. package/src/utilities/rowProcessor/{utils.js → utils.ts} +19 -15
  775. package/src/utilities/{scriptRunner.js → scriptRunner.ts} +8 -4
  776. package/src/utilities/security.ts +65 -0
  777. package/src/utilities/{statusCodes.js → statusCodes.ts} +1 -1
  778. package/src/utilities/usageQuota/{rows.js → rows.ts} +14 -18
  779. package/src/utilities/usageQuota/{usageQuoteReset.js → usageQuoteReset.ts} +1 -1
  780. package/src/utilities/{users.js → users.ts} +11 -13
  781. package/src/utilities/{workerRequests.js → workerRequests.ts} +43 -38
  782. package/src/watch.ts +2 -3
  783. package/tsconfig.build.json +1 -2
  784. package/tsconfig.json +3 -1
  785. package/builder/assets/index.2d05742a.js +0 -1021
  786. package/builder/assets/index.534f6c29.css +0 -6
  787. package/coverage/lcov-report/api/controllers/index.html +0 -326
  788. package/coverage/lcov-report/automations/steps/index.html +0 -341
  789. package/coverage/lcov-report/db/linkedRows/index.html +0 -146
  790. package/dist/integrations/tests/TestConfiguration.js +0 -1
  791. package/dist/utilities/fileSystem/utilities.js +0 -22
  792. package/dist/utilities/queue/inMemoryQueue.js +0 -126
  793. package/src/api/controllers/integration.js +0 -14
  794. package/src/api/controllers/migrations.js +0 -13
  795. package/src/api/controllers/script.js +0 -11
  796. package/src/api/routes/analytics.js +0 -9
  797. package/src/api/routes/apikeys.js +0 -12
  798. package/src/api/routes/automation.js +0 -85
  799. package/src/api/routes/cloud.js +0 -14
  800. package/src/api/routes/component.js +0 -14
  801. package/src/api/routes/datasource.js +0 -51
  802. package/src/api/routes/deploy.js +0 -17
  803. package/src/api/routes/dev.js +0 -26
  804. package/src/api/routes/integration.js +0 -12
  805. package/src/api/routes/layout.js +0 -16
  806. package/src/api/routes/migrations.js +0 -14
  807. package/src/api/routes/permission.js +0 -33
  808. package/src/api/routes/role.js +0 -15
  809. package/src/api/routes/routing.js +0 -14
  810. package/src/api/routes/screen.js +0 -18
  811. package/src/api/routes/script.js +0 -10
  812. package/src/api/routes/templates.js +0 -16
  813. package/src/api/routes/user.js +0 -53
  814. package/src/api/routes/view.js +0 -31
  815. package/src/automations/bullboard.js +0 -39
  816. package/src/automations/index.js +0 -29
  817. package/src/automations/tests/utilities/index.js +0 -51
  818. package/src/automations/triggerInfo/index.js +0 -15
  819. package/src/constants/index.js +0 -208
  820. package/src/constants/screens.js +0 -46
  821. package/src/db/index.js +0 -16
  822. package/src/events/utils.js +0 -38
  823. package/src/middleware/appInfo.js +0 -19
  824. package/src/middleware/publicApi.js +0 -21
  825. package/src/module.d.ts +0 -14
  826. package/src/tests/utilities/controllers.js +0 -16
  827. package/src/utilities/budibaseDir.js +0 -3
  828. package/src/utilities/fileSystem/utilities.js +0 -36
  829. package/src/utilities/global.js +0 -127
  830. package/src/utilities/queue/inMemoryQueue.js +0 -122
  831. package/src/utilities/routing/index.js +0 -25
  832. package/src/utilities/security.js +0 -71
@@ -0,0 +1,1966 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/tests/utilities/TestConfiguration.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/tests/utilities</a> TestConfiguration.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">94.33% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>200/212</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">84.4% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>92/109</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">94.91% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>56/59</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">94.14% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>193/205</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a>
504
+ <a name='L439'></a><a href='#L439'>439</a>
505
+ <a name='L440'></a><a href='#L440'>440</a>
506
+ <a name='L441'></a><a href='#L441'>441</a>
507
+ <a name='L442'></a><a href='#L442'>442</a>
508
+ <a name='L443'></a><a href='#L443'>443</a>
509
+ <a name='L444'></a><a href='#L444'>444</a>
510
+ <a name='L445'></a><a href='#L445'>445</a>
511
+ <a name='L446'></a><a href='#L446'>446</a>
512
+ <a name='L447'></a><a href='#L447'>447</a>
513
+ <a name='L448'></a><a href='#L448'>448</a>
514
+ <a name='L449'></a><a href='#L449'>449</a>
515
+ <a name='L450'></a><a href='#L450'>450</a>
516
+ <a name='L451'></a><a href='#L451'>451</a>
517
+ <a name='L452'></a><a href='#L452'>452</a>
518
+ <a name='L453'></a><a href='#L453'>453</a>
519
+ <a name='L454'></a><a href='#L454'>454</a>
520
+ <a name='L455'></a><a href='#L455'>455</a>
521
+ <a name='L456'></a><a href='#L456'>456</a>
522
+ <a name='L457'></a><a href='#L457'>457</a>
523
+ <a name='L458'></a><a href='#L458'>458</a>
524
+ <a name='L459'></a><a href='#L459'>459</a>
525
+ <a name='L460'></a><a href='#L460'>460</a>
526
+ <a name='L461'></a><a href='#L461'>461</a>
527
+ <a name='L462'></a><a href='#L462'>462</a>
528
+ <a name='L463'></a><a href='#L463'>463</a>
529
+ <a name='L464'></a><a href='#L464'>464</a>
530
+ <a name='L465'></a><a href='#L465'>465</a>
531
+ <a name='L466'></a><a href='#L466'>466</a>
532
+ <a name='L467'></a><a href='#L467'>467</a>
533
+ <a name='L468'></a><a href='#L468'>468</a>
534
+ <a name='L469'></a><a href='#L469'>469</a>
535
+ <a name='L470'></a><a href='#L470'>470</a>
536
+ <a name='L471'></a><a href='#L471'>471</a>
537
+ <a name='L472'></a><a href='#L472'>472</a>
538
+ <a name='L473'></a><a href='#L473'>473</a>
539
+ <a name='L474'></a><a href='#L474'>474</a>
540
+ <a name='L475'></a><a href='#L475'>475</a>
541
+ <a name='L476'></a><a href='#L476'>476</a>
542
+ <a name='L477'></a><a href='#L477'>477</a>
543
+ <a name='L478'></a><a href='#L478'>478</a>
544
+ <a name='L479'></a><a href='#L479'>479</a>
545
+ <a name='L480'></a><a href='#L480'>480</a>
546
+ <a name='L481'></a><a href='#L481'>481</a>
547
+ <a name='L482'></a><a href='#L482'>482</a>
548
+ <a name='L483'></a><a href='#L483'>483</a>
549
+ <a name='L484'></a><a href='#L484'>484</a>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">46x</span>
694
+ <span class="cline-any cline-yes">46x</span>
695
+ <span class="cline-any cline-yes">46x</span>
696
+ <span class="cline-any cline-yes">46x</span>
697
+ <span class="cline-any cline-neutral">&nbsp;</span>
698
+ <span class="cline-any cline-neutral">&nbsp;</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-neutral">&nbsp;</span>
705
+ <span class="cline-any cline-neutral">&nbsp;</span>
706
+ <span class="cline-any cline-neutral">&nbsp;</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-yes">46x</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-neutral">&nbsp;</span>
711
+ <span class="cline-any cline-neutral">&nbsp;</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-neutral">&nbsp;</span>
715
+ <span class="cline-any cline-neutral">&nbsp;</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-neutral">&nbsp;</span>
719
+ <span class="cline-any cline-yes">46x</span>
720
+ <span class="cline-any cline-yes">46x</span>
721
+ <span class="cline-any cline-yes">46x</span>
722
+ <span class="cline-any cline-yes">46x</span>
723
+ <span class="cline-any cline-yes">46x</span>
724
+ <span class="cline-any cline-yes">46x</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-yes">46x</span>
727
+ <span class="cline-any cline-yes">46x</span>
728
+ <span class="cline-any cline-yes">46x</span>
729
+ <span class="cline-any cline-yes">46x</span>
730
+ <span class="cline-any cline-yes">46x</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-neutral">&nbsp;</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-neutral">&nbsp;</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-yes">44x</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-yes">29x</span>
753
+ <span class="cline-any cline-yes">29x</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-yes">29x</span>
756
+ <span class="cline-any cline-yes">29x</span>
757
+ <span class="cline-any cline-neutral">&nbsp;</span>
758
+ <span class="cline-any cline-yes">15x</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-yes">44x</span>
761
+ <span class="cline-any cline-yes">44x</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</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-yes">28x</span>
766
+ <span class="cline-any cline-neutral">&nbsp;</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">2x</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-neutral">&nbsp;</span>
772
+ <span class="cline-any cline-neutral">&nbsp;</span>
773
+ <span class="cline-any cline-yes">1x</span>
774
+ <span class="cline-any cline-neutral">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-yes">317x</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-yes">1x</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-yes">7x</span>
786
+ <span class="cline-any cline-neutral">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-neutral">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-neutral">&nbsp;</span>
793
+ <span class="cline-any cline-neutral">&nbsp;</span>
794
+ <span class="cline-any cline-yes">972x</span>
795
+ <span class="cline-any cline-yes">305x</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-yes">972x</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-yes">972x</span>
800
+ <span class="cline-any cline-yes">449x</span>
801
+ <span class="cline-any cline-yes">449x</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-yes">523x</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-neutral">&nbsp;</span>
810
+ <span class="cline-any cline-neutral">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-yes">237x</span>
814
+ <span class="cline-any cline-yes">40x</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-yes">237x</span>
817
+ <span class="cline-any cline-yes">237x</span>
818
+ <span class="cline-any cline-yes">237x</span>
819
+ <span class="cline-any cline-neutral">&nbsp;</span>
820
+ <span class="cline-any cline-yes">237x</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-neutral">&nbsp;</span>
824
+ <span class="cline-any cline-yes">42x</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-yes">42x</span>
828
+ <span class="cline-any cline-yes">29x</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-yes">42x</span>
831
+ <span class="cline-any cline-yes">436x</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-yes">911x</span>
840
+ <span class="cline-any cline-yes">911x</span>
841
+ <span class="cline-any cline-yes">911x</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-yes">911x</span>
844
+ <span class="cline-any cline-yes">911x</span>
845
+ <span class="cline-any cline-yes">911x</span>
846
+ <span class="cline-any cline-yes">911x</span>
847
+ <span class="cline-any cline-yes">911x</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-yes">911x</span>
851
+ <span class="cline-any cline-yes">115x</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-yes">911x</span>
854
+ <span class="cline-any cline-yes">911x</span>
855
+ <span class="cline-any cline-yes">908x</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-neutral">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-neutral">&nbsp;</span>
867
+ <span class="cline-any cline-neutral">&nbsp;</span>
868
+ <span class="cline-any cline-neutral">&nbsp;</span>
869
+ <span class="cline-any cline-yes">279x</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-yes">279x</span>
872
+ <span class="cline-any cline-yes">279x</span>
873
+ <span class="cline-any cline-neutral">&nbsp;</span>
874
+ <span class="cline-any cline-yes">66x</span>
875
+ <span class="cline-any cline-neutral">&nbsp;</span>
876
+ <span class="cline-any cline-yes">279x</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-neutral">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-yes">279x</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-yes">279x</span>
890
+ <span class="cline-any cline-yes">247x</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-yes">32x</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-yes">279x</span>
895
+ <span class="cline-any cline-yes">1x</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-yes">278x</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-yes">279x</span>
900
+ <span class="cline-any cline-yes">279x</span>
901
+ <span class="cline-any cline-neutral">&nbsp;</span>
902
+ <span class="cline-any cline-neutral">&nbsp;</span>
903
+ <span class="cline-any cline-neutral">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-neutral">&nbsp;</span>
907
+ <span class="cline-any cline-neutral">&nbsp;</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-neutral">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-neutral">&nbsp;</span>
912
+ <span class="cline-any cline-neutral">&nbsp;</span>
913
+ <span class="cline-any cline-neutral">&nbsp;</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-yes">9x</span>
917
+ <span class="cline-any cline-yes">9x</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-neutral">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-yes">9x</span>
927
+ <span class="cline-any cline-yes">9x</span>
928
+ <span class="cline-any cline-neutral">&nbsp;</span>
929
+ <span class="cline-any cline-neutral">&nbsp;</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-neutral">&nbsp;</span>
933
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
+ <span class="cline-any cline-yes">32x</span>
935
+ <span class="cline-any cline-yes">32x</span>
936
+ <span class="cline-any cline-yes">32x</span>
937
+ <span class="cline-any cline-yes">32x</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span>
941
+ <span class="cline-any cline-yes">32x</span>
942
+ <span class="cline-any cline-yes">32x</span>
943
+ <span class="cline-any cline-neutral">&nbsp;</span>
944
+ <span class="cline-any cline-neutral">&nbsp;</span>
945
+ <span class="cline-any cline-neutral">&nbsp;</span>
946
+ <span class="cline-any cline-neutral">&nbsp;</span>
947
+ <span class="cline-any cline-neutral">&nbsp;</span>
948
+ <span class="cline-any cline-yes">32x</span>
949
+ <span class="cline-any cline-neutral">&nbsp;</span>
950
+ <span class="cline-any cline-neutral">&nbsp;</span>
951
+ <span class="cline-any cline-neutral">&nbsp;</span>
952
+ <span class="cline-any cline-neutral">&nbsp;</span>
953
+ <span class="cline-any cline-yes">32x</span>
954
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
+ <span class="cline-any cline-neutral">&nbsp;</span>
956
+ <span class="cline-any cline-neutral">&nbsp;</span>
957
+ <span class="cline-any cline-neutral">&nbsp;</span>
958
+ <span class="cline-any cline-yes">32x</span>
959
+ <span class="cline-any cline-neutral">&nbsp;</span>
960
+ <span class="cline-any cline-neutral">&nbsp;</span>
961
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
+ <span class="cline-any cline-yes">32x</span>
963
+ <span class="cline-any cline-yes">32x</span>
964
+ <span class="cline-any cline-neutral">&nbsp;</span>
965
+ <span class="cline-any cline-neutral">&nbsp;</span>
966
+ <span class="cline-any cline-yes">32x</span>
967
+ <span class="cline-any cline-yes">32x</span>
968
+ <span class="cline-any cline-neutral">&nbsp;</span>
969
+ <span class="cline-any cline-neutral">&nbsp;</span>
970
+ <span class="cline-any cline-neutral">&nbsp;</span>
971
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
+ <span class="cline-any cline-neutral">&nbsp;</span>
973
+ <span class="cline-any cline-neutral">&nbsp;</span>
974
+ <span class="cline-any cline-neutral">&nbsp;</span>
975
+ <span class="cline-any cline-neutral">&nbsp;</span>
976
+ <span class="cline-any cline-neutral">&nbsp;</span>
977
+ <span class="cline-any cline-neutral">&nbsp;</span>
978
+ <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-yes">202x</span>
980
+ <span class="cline-any cline-neutral">&nbsp;</span>
981
+ <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-neutral">&nbsp;</span>
983
+ <span class="cline-any cline-neutral">&nbsp;</span>
984
+ <span class="cline-any cline-yes">202x</span>
985
+ <span class="cline-any cline-neutral">&nbsp;</span>
986
+ <span class="cline-any cline-neutral">&nbsp;</span>
987
+ <span class="cline-any cline-neutral">&nbsp;</span>
988
+ <span class="cline-any cline-yes">202x</span>
989
+ <span class="cline-any cline-yes">202x</span>
990
+ <span class="cline-any cline-yes">202x</span>
991
+ <span class="cline-any cline-neutral">&nbsp;</span>
992
+ <span class="cline-any cline-neutral">&nbsp;</span>
993
+ <span class="cline-any cline-neutral">&nbsp;</span>
994
+ <span class="cline-any cline-neutral">&nbsp;</span>
995
+ <span class="cline-any cline-neutral">&nbsp;</span>
996
+ <span class="cline-any cline-neutral">&nbsp;</span>
997
+ <span class="cline-any cline-neutral">&nbsp;</span>
998
+ <span class="cline-any cline-neutral">&nbsp;</span>
999
+ <span class="cline-any cline-yes">202x</span>
1000
+ <span class="cline-any cline-yes">202x</span>
1001
+ <span class="cline-any cline-neutral">&nbsp;</span>
1002
+ <span class="cline-any cline-yes">202x</span>
1003
+ <span class="cline-any cline-neutral">&nbsp;</span>
1004
+ <span class="cline-any cline-neutral">&nbsp;</span>
1005
+ <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-yes">4x</span>
1007
+ <span class="cline-any cline-neutral">&nbsp;</span>
1008
+ <span class="cline-any cline-yes">4x</span>
1009
+ <span class="cline-any cline-neutral">&nbsp;</span>
1010
+ <span class="cline-any cline-neutral">&nbsp;</span>
1011
+ <span class="cline-any cline-yes">4x</span>
1012
+ <span class="cline-any cline-yes">4x</span>
1013
+ <span class="cline-any cline-neutral">&nbsp;</span>
1014
+ <span class="cline-any cline-yes">4x</span>
1015
+ <span class="cline-any cline-neutral">&nbsp;</span>
1016
+ <span class="cline-any cline-neutral">&nbsp;</span>
1017
+ <span class="cline-any cline-neutral">&nbsp;</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-neutral">&nbsp;</span>
1021
+ <span class="cline-any cline-neutral">&nbsp;</span>
1022
+ <span class="cline-any cline-neutral">&nbsp;</span>
1023
+ <span class="cline-any cline-yes">4x</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-neutral">&nbsp;</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-yes">2x</span>
1030
+ <span class="cline-any cline-yes">2x</span>
1031
+ <span class="cline-any cline-neutral">&nbsp;</span>
1032
+ <span class="cline-any cline-yes">2x</span>
1033
+ <span class="cline-any cline-yes">2x</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-yes">2x</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-yes">2x</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-yes">2x</span>
1041
+ <span class="cline-any cline-yes">2x</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-yes">246x</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-yes">246x</span>
1053
+ <span class="cline-any cline-yes">246x</span>
1054
+ <span class="cline-any cline-yes">246x</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-yes">246x</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-neutral">&nbsp;</span>
1059
+ <span class="cline-any cline-yes">246x</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-yes">246x</span>
1062
+ <span class="cline-any cline-yes">246x</span>
1063
+ <span class="cline-any cline-neutral">&nbsp;</span>
1064
+ <span class="cline-any cline-yes">246x</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-neutral">&nbsp;</span>
1068
+ <span class="cline-any cline-yes">254x</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-yes">254x</span>
1071
+ <span class="cline-any cline-yes">254x</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-yes">254x</span>
1074
+ <span class="cline-any cline-yes">254x</span>
1075
+ <span class="cline-any cline-yes">254x</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-neutral">&nbsp;</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-yes">121x</span>
1083
+ <span class="cline-any cline-yes">121x</span>
1084
+ <span class="cline-any cline-yes">121x</span>
1085
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
+ <span class="cline-any cline-neutral">&nbsp;</span>
1087
+ <span class="cline-any cline-neutral">&nbsp;</span>
1088
+ <span class="cline-any cline-yes">117x</span>
1089
+ <span class="cline-any cline-yes">3x</span>
1090
+ <span class="cline-any cline-neutral">&nbsp;</span>
1091
+ <span class="cline-any cline-yes">117x</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-yes">20x</span>
1096
+ <span class="cline-any cline-yes">20x</span>
1097
+ <span class="cline-any cline-neutral">&nbsp;</span>
1098
+ <span class="cline-any cline-neutral">&nbsp;</span>
1099
+ <span class="cline-any cline-neutral">&nbsp;</span>
1100
+ <span class="cline-any cline-yes">16x</span>
1101
+ <span class="cline-any cline-no">&nbsp;</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-yes">16x</span>
1104
+ <span class="cline-any cline-yes">16x</span>
1105
+ <span class="cline-any cline-yes">16x</span>
1106
+ <span class="cline-any cline-yes">30x</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-neutral">&nbsp;</span>
1112
+ <span class="cline-any cline-yes">30x</span>
1113
+ <span class="cline-any cline-yes">29x</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-yes">16x</span>
1117
+ <span class="cline-any cline-yes">16x</span>
1118
+ <span class="cline-any cline-yes">16x</span>
1119
+ <span class="cline-any cline-neutral">&nbsp;</span>
1120
+ <span class="cline-any cline-neutral">&nbsp;</span>
1121
+ <span class="cline-any cline-neutral">&nbsp;</span>
1122
+ <span class="cline-any cline-yes">1x</span>
1123
+ <span class="cline-any cline-yes">1x</span>
1124
+ <span class="cline-any cline-neutral">&nbsp;</span>
1125
+ <span class="cline-any cline-neutral">&nbsp;</span>
1126
+ <span class="cline-any cline-yes">1x</span>
1127
+ <span class="cline-any cline-neutral">&nbsp;</span>
1128
+ <span class="cline-any cline-neutral">&nbsp;</span>
1129
+ <span class="cline-any cline-neutral">&nbsp;</span>
1130
+ <span class="cline-any cline-neutral">&nbsp;</span>
1131
+ <span class="cline-any cline-neutral">&nbsp;</span>
1132
+ <span class="cline-any cline-yes">69x</span>
1133
+ <span class="cline-any cline-no">&nbsp;</span>
1134
+ <span class="cline-any cline-neutral">&nbsp;</span>
1135
+ <span class="cline-any cline-yes">69x</span>
1136
+ <span class="cline-any cline-yes">69x</span>
1137
+ <span class="cline-any cline-yes">69x</span>
1138
+ <span class="cline-any cline-neutral">&nbsp;</span>
1139
+ <span class="cline-any cline-neutral">&nbsp;</span>
1140
+ <span class="cline-any cline-neutral">&nbsp;</span>
1141
+ <span class="cline-any cline-yes">11x</span>
1142
+ <span class="cline-any cline-neutral">&nbsp;</span>
1143
+ <span class="cline-any cline-neutral">&nbsp;</span>
1144
+ <span class="cline-any cline-neutral">&nbsp;</span>
1145
+ <span class="cline-any cline-yes">1x</span>
1146
+ <span class="cline-any cline-yes">1x</span>
1147
+ <span class="cline-any cline-neutral">&nbsp;</span>
1148
+ <span class="cline-any cline-yes">1x</span>
1149
+ <span class="cline-any cline-neutral">&nbsp;</span>
1150
+ <span class="cline-any cline-neutral">&nbsp;</span>
1151
+ <span class="cline-any cline-neutral">&nbsp;</span>
1152
+ <span class="cline-any cline-neutral">&nbsp;</span>
1153
+ <span class="cline-any cline-neutral">&nbsp;</span>
1154
+ <span class="cline-any cline-yes">4x</span>
1155
+ <span class="cline-any cline-yes">4x</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
1157
+ <span class="cline-any cline-neutral">&nbsp;</span>
1158
+ <span class="cline-any cline-neutral">&nbsp;</span>
1159
+ <span class="cline-any cline-yes">10x</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
1161
+ <span class="cline-any cline-neutral">&nbsp;</span>
1162
+ <span class="cline-any cline-neutral">&nbsp;</span>
1163
+ <span class="cline-any cline-neutral">&nbsp;</span>
1164
+ <span class="cline-any cline-neutral">&nbsp;</span>
1165
+ <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-neutral">&nbsp;</span>
1167
+ <span class="cline-any cline-neutral">&nbsp;</span>
1168
+ <span class="cline-any cline-neutral">&nbsp;</span>
1169
+ <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-neutral">&nbsp;</span>
1171
+ <span class="cline-any cline-neutral">&nbsp;</span>
1172
+ <span class="cline-any cline-neutral">&nbsp;</span>
1173
+ <span class="cline-any cline-yes">9x</span>
1174
+ <span class="cline-any cline-no">&nbsp;</span>
1175
+ <span class="cline-any cline-neutral">&nbsp;</span>
1176
+ <span class="cline-any cline-yes">9x</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-neutral">&nbsp;</span>
1179
+ <span class="cline-any cline-neutral">&nbsp;</span>
1180
+ <span class="cline-any cline-yes">9x</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
1182
+ <span class="cline-any cline-neutral">&nbsp;</span>
1183
+ <span class="cline-any cline-neutral">&nbsp;</span>
1184
+ <span class="cline-any cline-neutral">&nbsp;</span>
1185
+ <span class="cline-any cline-neutral">&nbsp;</span>
1186
+ <span class="cline-any cline-yes">25x</span>
1187
+ <span class="cline-any cline-yes">25x</span>
1188
+ <span class="cline-any cline-no">&nbsp;</span>
1189
+ <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-yes">25x</span>
1191
+ <span class="cline-any cline-neutral">&nbsp;</span>
1192
+ <span class="cline-any cline-neutral">&nbsp;</span>
1193
+ <span class="cline-any cline-yes">25x</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-yes">1x</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-no">&nbsp;</span>
1202
+ <span class="cline-any cline-no">&nbsp;</span>
1203
+ <span class="cline-any cline-no">&nbsp;</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
1205
+ <span class="cline-any cline-no">&nbsp;</span>
1206
+ <span class="cline-any cline-neutral">&nbsp;</span>
1207
+ <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-neutral">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-yes">8x</span>
1214
+ <span class="cline-any cline-no">&nbsp;</span>
1215
+ <span class="cline-any cline-neutral">&nbsp;</span>
1216
+ <span class="cline-any cline-yes">8x</span>
1217
+ <span class="cline-any cline-yes">8x</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1221
+ <span class="cline-any cline-neutral">&nbsp;</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-yes">63x</span>
1224
+ <span class="cline-any cline-yes">63x</span>
1225
+ <span class="cline-any cline-yes">62x</span>
1226
+ <span class="cline-any cline-yes">62x</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-yes">4x</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-yes">4x</span>
1236
+ <span class="cline-any cline-yes">4x</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-yes">12x</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-yes">4x</span>
1251
+ <span class="cline-any cline-yes">4x</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-neutral">&nbsp;</span>
1254
+ <span class="cline-any cline-neutral">&nbsp;</span>
1255
+ <span class="cline-any cline-neutral">&nbsp;</span>
1256
+ <span class="cline-any cline-neutral">&nbsp;</span>
1257
+ <span class="cline-any cline-yes">4x</span>
1258
+ <span class="cline-any cline-neutral">&nbsp;</span>
1259
+ <span class="cline-any cline-neutral">&nbsp;</span>
1260
+ <span class="cline-any cline-neutral">&nbsp;</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-neutral">&nbsp;</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-neutral">&nbsp;</span>
1268
+ <span class="cline-any cline-neutral">&nbsp;</span>
1269
+ <span class="cline-any cline-yes">4x</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-neutral">&nbsp;</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-neutral">&nbsp;</span>
1275
+ <span class="cline-any cline-neutral">&nbsp;</span>
1276
+ <span class="cline-any cline-neutral">&nbsp;</span>
1277
+ <span class="cline-any cline-neutral">&nbsp;</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-neutral">&nbsp;</span>
1282
+ <span class="cline-any cline-yes">13x</span>
1283
+ <span class="cline-any cline-neutral">&nbsp;</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-neutral">&nbsp;</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-neutral">&nbsp;</span>
1289
+ <span class="cline-any cline-neutral">&nbsp;</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-neutral">&nbsp;</span>
1292
+ <span class="cline-any cline-neutral">&nbsp;</span>
1293
+ <span class="cline-any cline-neutral">&nbsp;</span>
1294
+ <span class="cline-any cline-neutral">&nbsp;</span>
1295
+ <span class="cline-any cline-neutral">&nbsp;</span>
1296
+ <span class="cline-any cline-neutral">&nbsp;</span>
1297
+ <span class="cline-any cline-yes">34x</span>
1298
+ <span class="cline-any cline-no">&nbsp;</span>
1299
+ <span class="cline-any cline-neutral">&nbsp;</span>
1300
+ <span class="cline-any cline-yes">34x</span>
1301
+ <span class="cline-any cline-yes">34x</span>
1302
+ <span class="cline-any cline-neutral">&nbsp;</span>
1303
+ <span class="cline-any cline-neutral">&nbsp;</span>
1304
+ <span class="cline-any cline-neutral">&nbsp;</span>
1305
+ <span class="cline-any cline-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-yes">26x</span>
1308
+ <span class="cline-any cline-yes">26x</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-neutral">&nbsp;</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-yes">5x</span>
1315
+ <span class="cline-any cline-yes">5x</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-yes">46x</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { init as dbInit } from "../../db"
1321
+ dbInit()
1322
+ import env from "../../environment"
1323
+ import {
1324
+ basicTable,
1325
+ basicRow,
1326
+ basicRole,
1327
+ basicAutomation,
1328
+ basicDatasource,
1329
+ basicQuery,
1330
+ basicScreen,
1331
+ basicLayout,
1332
+ basicWebhook,
1333
+ TENANT_ID,
1334
+ } from "./structures"
1335
+ import {
1336
+ constants,
1337
+ tenancy,
1338
+ sessions,
1339
+ cache,
1340
+ context,
1341
+ db as dbCore,
1342
+ encryption,
1343
+ auth,
1344
+ roles,
1345
+ } from "@budibase/backend-core"
1346
+ import * as controllers from "./controllers"
1347
+ import { cleanup } from "../../utilities/fileSystem"
1348
+ import newid from "../../db/newid"
1349
+ import { generateUserMetadataID } from "../../db/utils"
1350
+ import { startup } from "../../startup"
1351
+ const supertest = require("supertest")
1352
+ &nbsp;
1353
+ const GLOBAL_USER_ID = "us_uuid1"
1354
+ const EMAIL = "babs@babs.com"
1355
+ const FIRSTNAME = "Barbara"
1356
+ const LASTNAME = "Barbington"
1357
+ const CSRF_TOKEN = "e3727778-7af0-4226-b5eb-f43cbe60a306"
1358
+ &nbsp;
1359
+ class TestConfiguration {
1360
+ server: any
1361
+ request: any
1362
+ started: boolean
1363
+ appId: string | null
1364
+ allApps: any[]
1365
+ app: any
1366
+ prodApp: any
1367
+ prodAppId: any
1368
+ user: any
1369
+ globalUserId: any
1370
+ userMetadataId: any
1371
+ table: any
1372
+ linkedTable: any
1373
+ automation: any
1374
+ datasource: any
1375
+ &nbsp;
1376
+ constructor(openServer = true) {
1377
+ if (openServer) {
1378
+ // use a random port because it doesn't matter
1379
+ env.PORT = "0"
1380
+ this.server = require("../../app")
1381
+ // we need the request for logging in, involves cookies, hard to fake
1382
+ this.request = supertest(this.server)
1383
+ this.started = true
1384
+ } else {
1385
+ this.started = false
1386
+ }
1387
+ this.appId = null
1388
+ this.allApps = []
1389
+ }
1390
+ &nbsp;
1391
+ getRequest() {
1392
+ return this.request
1393
+ }
1394
+ &nbsp;
1395
+ getApp() {
1396
+ return this.app
1397
+ }
1398
+ &nbsp;
1399
+ getProdApp() {
1400
+ return this.prodApp
1401
+ }
1402
+ &nbsp;
1403
+ getAppId() {
1404
+ return this.appId
1405
+ }
1406
+ &nbsp;
1407
+ getProdAppId() {
1408
+ return this.prodAppId
1409
+ }
1410
+ &nbsp;
1411
+ getUserDetails() {
1412
+ return {
1413
+ globalId: GLOBAL_USER_ID,
1414
+ email: EMAIL,
1415
+ firstName: FIRSTNAME,
1416
+ lastName: LASTNAME,
1417
+ }
1418
+ }
1419
+ &nbsp;
1420
+ async doInContext(appId: string | null, task: any) {
1421
+ if (!appId) {
1422
+ appId = this.appId
1423
+ }
1424
+ return tenancy.doInTenant(TENANT_ID, () =&gt; {
1425
+ // check if already in a context
1426
+ if (context.getAppId() == null &amp;&amp; appId !== null) {
1427
+ return context.doInAppContext(appId, async () =&gt; {
1428
+ return task()
1429
+ })
1430
+ } else {
1431
+ return task()
1432
+ }
1433
+ })
1434
+ }
1435
+ &nbsp;
1436
+ // SETUP / TEARDOWN
1437
+ &nbsp;
1438
+ // use a new id as the name to avoid name collisions
1439
+ async init(appName = newid()) {
1440
+ if (!this.started) {
1441
+ await startup()
1442
+ }
1443
+ this.user = await this.globalUser()
1444
+ this.globalUserId = this.user._id
1445
+ this.userMetadataId = generateUserMetadataID(this.globalUserId)
1446
+ &nbsp;
1447
+ return this.createApp(appName)
1448
+ }
1449
+ &nbsp;
1450
+ end() {
1451
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this) {
1452
+ <span class="cstat-no" title="statement not covered" > return</span>
1453
+ }
1454
+ if (this.server) {
1455
+ this.server.close()
1456
+ }
1457
+ if (this.allApps) {
1458
+ cleanup(this.allApps.map(app =&gt; app.appId))
1459
+ }
1460
+ }
1461
+ &nbsp;
1462
+ // UTILS
1463
+ &nbsp;
1464
+ async _req(body: any, params: any, controlFunc: any) {
1465
+ // create a fake request ctx
1466
+ const request: any = {}
1467
+ const appId = this.appId
1468
+ request.appId = appId
1469
+ // fake cookies, we don't need them
1470
+ request.cookies = { set: <span class="fstat-no" title="function not covered" >() =</span>&gt; {}, get: <span class="fstat-no" title="function not covered" >() =</span>&gt; {} }
1471
+ request.config = { jwtSecret: env.JWT_SECRET }
1472
+ request.user = { appId, tenantId: TENANT_ID }
1473
+ request.query = {}
1474
+ request.request = {
1475
+ body,
1476
+ }
1477
+ if (params) {
1478
+ request.params = params
1479
+ }
1480
+ return this.doInContext(appId, async () =&gt; {
1481
+ await controlFunc(request)
1482
+ return request.body
1483
+ })
1484
+ }
1485
+ &nbsp;
1486
+ // USER / AUTH
1487
+ async globalUser({
1488
+ id = GLOBAL_USER_ID,
1489
+ firstName = FIRSTNAME,
1490
+ lastName = LASTNAME,
1491
+ builder = true,
1492
+ admin = false,
1493
+ email = EMAIL,
1494
+ roles,
1495
+ }: any = {}) {
1496
+ return tenancy.doWithGlobalDB(TENANT_ID, async (db: any) =&gt; {
1497
+ let existing
1498
+ try {
1499
+ existing = await db.get(id)
1500
+ } catch (err) {
1501
+ existing = { email }
1502
+ }
1503
+ const user = {
1504
+ _id: id,
1505
+ ...existing,
1506
+ roles: roles || {},
1507
+ tenantId: TENANT_ID,
1508
+ firstName,
1509
+ lastName,
1510
+ }
1511
+ await sessions.createASession(id, {
1512
+ sessionId: "sessionid",
1513
+ tenantId: TENANT_ID,
1514
+ csrfToken: CSRF_TOKEN,
1515
+ })
1516
+ if (builder) {
1517
+ user.builder = { global: true }
1518
+ } else {
1519
+ user.builder = { global: false }
1520
+ }
1521
+ if (admin) {
1522
+ user.admin = { global: true }
1523
+ } else {
1524
+ user.admin = { global: false }
1525
+ }
1526
+ const resp = await db.put(user)
1527
+ return {
1528
+ _rev: resp._rev,
1529
+ ...user,
1530
+ }
1531
+ })
1532
+ }
1533
+ &nbsp;
1534
+ async createUser(
1535
+ id = null,
1536
+ firstName = FIRSTNAME,
1537
+ lastName = LASTNAME,
1538
+ email = EMAIL,
1539
+ builder = true,
1540
+ admin = false,
1541
+ roles = {}
1542
+ ) {
1543
+ const globalId = !id ? `us_${Math.random()}` : `us_${id}`
1544
+ const resp = await this.globalUser({
1545
+ id: globalId,
1546
+ firstName,
1547
+ lastName,
1548
+ email,
1549
+ builder,
1550
+ admin,
1551
+ roles,
1552
+ })
1553
+ await cache.user.invalidateUser(globalId)
1554
+ return {
1555
+ ...resp,
1556
+ globalId,
1557
+ }
1558
+ }
1559
+ &nbsp;
1560
+ async login({ roleId, userId, builder, prodApp = <span class="branch-0 cbranch-no" title="branch not covered" >false </span>}: any = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
1561
+ const appId = prodApp ? this.prodAppId : this.appId
1562
+ return context.doInAppContext(appId, async () =&gt; {
1563
+ userId = !userId ? `us_uuid1` : userId
1564
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.request) {
1565
+ <span class="cstat-no" title="statement not covered" > throw "Server has not been opened, cannot login."</span>
1566
+ }
1567
+ // make sure the user exists in the global DB
1568
+ if (roleId !== roles.BUILTIN_ROLE_IDS.PUBLIC) {
1569
+ await this.globalUser({
1570
+ id: userId,
1571
+ builder,
1572
+ roles: { [this.prodAppId]: roleId },
1573
+ })
1574
+ }
1575
+ await sessions.createASession(userId, {
1576
+ sessionId: "sessionid",
1577
+ tenantId: TENANT_ID,
1578
+ })
1579
+ // have to fake this
1580
+ const authObj = {
1581
+ userId,
1582
+ sessionId: "sessionid",
1583
+ tenantId: TENANT_ID,
1584
+ }
1585
+ const app = {
1586
+ roleId: roleId,
1587
+ appId,
1588
+ }
1589
+ const authToken = auth.jwt.sign(authObj, env.JWT_SECRET)
1590
+ const appToken = auth.jwt.sign(app, env.JWT_SECRET)
1591
+ &nbsp;
1592
+ // returning necessary request headers
1593
+ await cache.user.invalidateUser(userId)
1594
+ return {
1595
+ Accept: "application/json",
1596
+ Cookie: [
1597
+ `${constants.Cookie.Auth}=${authToken}`,
1598
+ `${constants.Cookie.CurrentApp}=${appToken}`,
1599
+ ],
1600
+ [constants.Header.APP_ID]: appId,
1601
+ }
1602
+ })
1603
+ }
1604
+ &nbsp;
1605
+ defaultHeaders(extras = {}) {
1606
+ const authObj = {
1607
+ userId: GLOBAL_USER_ID,
1608
+ sessionId: "sessionid",
1609
+ tenantId: TENANT_ID,
1610
+ }
1611
+ const app = {
1612
+ roleId: roles.BUILTIN_ROLE_IDS.ADMIN,
1613
+ appId: this.appId,
1614
+ }
1615
+ const authToken = auth.jwt.sign(authObj, env.JWT_SECRET)
1616
+ const appToken = auth.jwt.sign(app, env.JWT_SECRET)
1617
+ const headers: any = {
1618
+ Accept: "application/json",
1619
+ Cookie: [
1620
+ `${constants.Cookie.Auth}=${authToken}`,
1621
+ `${constants.Cookie.CurrentApp}=${appToken}`,
1622
+ ],
1623
+ [constants.Header.CSRF_TOKEN]: CSRF_TOKEN,
1624
+ ...extras,
1625
+ }
1626
+ if (this.appId) {
1627
+ headers[constants.Header.APP_ID] = this.appId
1628
+ }
1629
+ return headers
1630
+ }
1631
+ &nbsp;
1632
+ publicHeaders({ prodApp = true } = {}) {
1633
+ const appId = prodApp ? this.prodAppId : this.appId
1634
+ &nbsp;
1635
+ const headers: any = {
1636
+ Accept: "application/json",
1637
+ }
1638
+ if (appId) {
1639
+ headers[constants.Header.APP_ID] = appId
1640
+ }
1641
+ return headers
1642
+ }
1643
+ &nbsp;
1644
+ async roleHeaders({
1645
+ email = EMAIL,
1646
+ roleId = <span class="branch-0 cbranch-no" title="branch not covered" >roles.BUILTIN_ROLE_IDS.ADMIN,</span>
1647
+ builder = false,
1648
+ prodApp = true,
1649
+ } = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
1650
+ return this.login({ email, roleId, builder, prodApp })
1651
+ }
1652
+ &nbsp;
1653
+ // API
1654
+ &nbsp;
1655
+ async generateApiKey(userId = GLOBAL_USER_ID) {
1656
+ return tenancy.doWithGlobalDB(TENANT_ID, async (db: any) =&gt; {
1657
+ const id = dbCore.generateDevInfoID(userId)
1658
+ let devInfo
1659
+ try {
1660
+ devInfo = await db.get(id)
1661
+ } catch (err) {
1662
+ devInfo = { _id: id, userId }
1663
+ }
1664
+ devInfo.apiKey = encryption.encrypt(
1665
+ `${TENANT_ID}${dbCore.SEPARATOR}${newid()}`
1666
+ )
1667
+ await db.put(devInfo)
1668
+ return devInfo.apiKey
1669
+ })
1670
+ }
1671
+ &nbsp;
1672
+ // APP
1673
+ &nbsp;
1674
+ async createApp(appName: string) {
1675
+ // create dev app
1676
+ // clear any old app
1677
+ this.appId = null
1678
+ // @ts-ignore
1679
+ await context.updateAppId(null)
1680
+ this.app = await this._req({ name: appName }, null, controllers.app.create)
1681
+ this.appId = this.app.appId
1682
+ // @ts-ignore
1683
+ await context.updateAppId(this.appId)
1684
+ &nbsp;
1685
+ // create production app
1686
+ this.prodApp = await this.deploy()
1687
+ &nbsp;
1688
+ this.allApps.push(this.prodApp)
1689
+ this.allApps.push(this.app)
1690
+ &nbsp;
1691
+ return this.app
1692
+ }
1693
+ &nbsp;
1694
+ async deploy() {
1695
+ await this._req(null, null, controllers.deploy.deployApp)
1696
+ // @ts-ignore
1697
+ const prodAppId = this.getAppId().replace("_dev", "")
1698
+ this.prodAppId = prodAppId
1699
+ &nbsp;
1700
+ return context.doInAppContext(prodAppId, async () =&gt; {
1701
+ const db = context.getProdAppDB()
1702
+ return await db.get(dbCore.DocumentType.APP_METADATA)
1703
+ })
1704
+ }
1705
+ &nbsp;
1706
+ // TABLE
1707
+ &nbsp;
1708
+ async updateTable(config?: any) {
1709
+ config = config || basicTable()
1710
+ this.table = await this._req(config, null, controllers.table.save)
1711
+ return this.table
1712
+ }
1713
+ &nbsp;
1714
+ async createTable(config?: any) {
1715
+ if (config != null &amp;&amp; config._id) {
1716
+ delete config._id
1717
+ }
1718
+ return this.updateTable(config)
1719
+ }
1720
+ &nbsp;
1721
+ async getTable(tableId?: string) {
1722
+ tableId = tableId || <span class="branch-1 cbranch-no" title="branch not covered" >this.table._id</span>
1723
+ return this._req(null, { tableId }, controllers.table.find)
1724
+ }
1725
+ &nbsp;
1726
+ async createLinkedTable(relationshipType?: string, links: any = ["link"]) {
1727
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.table) {
1728
+ <span class="cstat-no" title="statement not covered" > throw "Must have created a table first."</span>
1729
+ }
1730
+ const tableConfig: any = basicTable()
1731
+ tableConfig.primaryDisplay = "name"
1732
+ for (let link of links) {
1733
+ tableConfig.schema[link] = {
1734
+ type: "link",
1735
+ fieldName: link,
1736
+ tableId: this.table._id,
1737
+ name: link,
1738
+ }
1739
+ if (relationshipType) {
1740
+ tableConfig.schema[link].relationshipType = relationshipType
1741
+ }
1742
+ }
1743
+ const linkedTable = await this.createTable(tableConfig)
1744
+ this.linkedTable = linkedTable
1745
+ return linkedTable
1746
+ }
1747
+ &nbsp;
1748
+ async createAttachmentTable() {
1749
+ const table: any = basicTable()
1750
+ table.schema.attachment = {
1751
+ type: "attachment",
1752
+ }
1753
+ return this.createTable(table)
1754
+ }
1755
+ &nbsp;
1756
+ // ROW
1757
+ &nbsp;
1758
+ async createRow(config: any = null) {
1759
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.table) {
1760
+ <span class="cstat-no" title="statement not covered" > throw "Test requires table to be configured."</span>
1761
+ }
1762
+ const tableId = (config &amp;&amp; config.tableId) || this.table._id
1763
+ config = config || basicRow(tableId)
1764
+ return this._req(config, { tableId }, controllers.row.save)
1765
+ }
1766
+ &nbsp;
1767
+ async getRow(tableId: string, rowId: string) {
1768
+ return this._req(null, { tableId, rowId }, controllers.row.find)
1769
+ }
1770
+ &nbsp;
1771
+ async getRows(tableId: string) {
1772
+ if (!tableId &amp;&amp; this.table) {
1773
+ tableId = this.table._id
1774
+ }
1775
+ return this._req(null, { tableId }, controllers.row.fetch)
1776
+ }
1777
+ &nbsp;
1778
+ // ROLE
1779
+ &nbsp;
1780
+ async createRole(config?: any) {
1781
+ config = config || basicRole()
1782
+ return this._req(config, null, controllers.role.save)
1783
+ }
1784
+ &nbsp;
1785
+ async addPermission(roleId: string, resourceId: string, level = "read") {
1786
+ return this._req(
1787
+ null,
1788
+ {
1789
+ roleId,
1790
+ resourceId,
1791
+ level,
1792
+ },
1793
+ controllers.perms.addPermission
1794
+ )
1795
+ }
1796
+ &nbsp;
1797
+ // VIEW
1798
+ &nbsp;
1799
+ async createView(config?: any) {
1800
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.table) {
1801
+ <span class="cstat-no" title="statement not covered" > throw "Test requires table to be configured."</span>
1802
+ }
1803
+ const view = config || {
1804
+ tableId: this.table._id,
1805
+ name: "ViewTest",
1806
+ }
1807
+ return this._req(view, null, controllers.view.save)
1808
+ }
1809
+ &nbsp;
1810
+ // AUTOMATION
1811
+ &nbsp;
1812
+ async createAutomation(config?: any) {
1813
+ config = config || basicAutomation()
1814
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (config._rev) {
1815
+ <span class="cstat-no" title="statement not covered" > delete config._rev</span>
1816
+ }
1817
+ this.automation = (
1818
+ await this._req(config, null, controllers.automation.create)
1819
+ ).automation
1820
+ return this.automation
1821
+ }
1822
+ &nbsp;
1823
+ async getAllAutomations() {
1824
+ return this._req(null, null, controllers.automation.fetch)
1825
+ }
1826
+ &nbsp;
1827
+ async <span class="fstat-no" title="function not covered" >deleteAutomation(</span>automation?: any) {
1828
+ <span class="cstat-no" title="statement not covered" > automation = automation || this.automation</span>
1829
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!automation) {</span>
1830
+ <span class="cstat-no" title="statement not covered" > return</span>
1831
+ }
1832
+ <span class="cstat-no" title="statement not covered" > return this._req(</span>
1833
+ null,
1834
+ { id: automation._id, rev: automation._rev },
1835
+ controllers.automation.destroy
1836
+ )
1837
+ }
1838
+ &nbsp;
1839
+ async createWebhook(config?: any) {
1840
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.automation) {
1841
+ <span class="cstat-no" title="statement not covered" > throw "Must create an automation before creating webhook."</span>
1842
+ }
1843
+ config = config || basicWebhook(this.automation._id)
1844
+ return (await this._req(config, null, controllers.webhook.save)).webhook
1845
+ }
1846
+ &nbsp;
1847
+ // DATASOURCE
1848
+ &nbsp;
1849
+ async createDatasource(config?: any) {
1850
+ config = config || basicDatasource()
1851
+ const response = await this._req(config, null, controllers.datasource.save)
1852
+ this.datasource = response.datasource
1853
+ return this.datasource
1854
+ }
1855
+ &nbsp;
1856
+ async updateDatasource(datasource: any) {
1857
+ const response = await this._req(
1858
+ datasource,
1859
+ { datasourceId: datasource._id },
1860
+ controllers.datasource.update
1861
+ )
1862
+ this.datasource = response.datasource
1863
+ return this.datasource
1864
+ }
1865
+ &nbsp;
1866
+ async restDatasource(cfg?: any) {
1867
+ return this.createDatasource({
1868
+ datasource: {
1869
+ ...basicDatasource().datasource,
1870
+ source: "REST",
1871
+ config: cfg || {},
1872
+ },
1873
+ })
1874
+ }
1875
+ &nbsp;
1876
+ async dynamicVariableDatasource() {
1877
+ let datasource = await this.restDatasource()
1878
+ const basedOnQuery = await this.createQuery({
1879
+ ...basicQuery(datasource._id),
1880
+ fields: {
1881
+ path: "www.google.com",
1882
+ },
1883
+ })
1884
+ datasource = await this.updateDatasource({
1885
+ ...datasource,
1886
+ config: {
1887
+ dynamicVariables: [
1888
+ {
1889
+ queryId: basedOnQuery._id,
1890
+ name: "variable3",
1891
+ value: "{{ data.0.[value] }}",
1892
+ },
1893
+ ],
1894
+ },
1895
+ })
1896
+ return { datasource, query: basedOnQuery }
1897
+ }
1898
+ &nbsp;
1899
+ // QUERY
1900
+ &nbsp;
1901
+ async previewQuery(
1902
+ request: any,
1903
+ config: any,
1904
+ datasource: any,
1905
+ fields: any,
1906
+ params: any,
1907
+ verb: string
1908
+ ) {
1909
+ return request
1910
+ .post(`/api/queries/preview`)
1911
+ .send({
1912
+ datasourceId: datasource._id,
1913
+ parameters: params || {},
1914
+ fields,
1915
+ queryVerb: verb || "read",
1916
+ name: datasource.name,
1917
+ })
1918
+ .set(config.defaultHeaders())
1919
+ .expect("Content-Type", /json/)
1920
+ .expect(200)
1921
+ }
1922
+ &nbsp;
1923
+ async createQuery(config?: any) {
1924
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!this.datasource &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!config)</span> {
1925
+ <span class="cstat-no" title="statement not covered" > throw "No datasource created for query."</span>
1926
+ }
1927
+ config = config || basicQuery(this.datasource._id)
1928
+ return this._req(config, null, controllers.query.save)
1929
+ }
1930
+ &nbsp;
1931
+ // SCREEN
1932
+ &nbsp;
1933
+ async createScreen(config?: any) {
1934
+ config = config || basicScreen()
1935
+ return this._req(config, null, controllers.screen.save)
1936
+ }
1937
+ &nbsp;
1938
+ // LAYOUT
1939
+ &nbsp;
1940
+ async createLayout(config?: any) {
1941
+ config = config || basicLayout()
1942
+ return await this._req(config, null, controllers.layout.save)
1943
+ }
1944
+ }
1945
+ &nbsp;
1946
+ export = TestConfiguration
1947
+ &nbsp;</pre></td></tr></table></pre>
1948
+
1949
+ <div class='push'></div><!-- for sticky footer -->
1950
+ </div><!-- /wrapper -->
1951
+ <div class='footer quiet pad2 space-top1 center small'>
1952
+ Code coverage generated by
1953
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1954
+ at Fri Dec 09 2022 13:50:48 GMT+0000 (Coordinated Universal Time)
1955
+ </div>
1956
+ <script src="../../../prettify.js"></script>
1957
+ <script>
1958
+ window.onload = function () {
1959
+ prettyPrint();
1960
+ };
1961
+ </script>
1962
+ <script src="../../../sorter.js"></script>
1963
+ <script src="../../../block-navigation.js"></script>
1964
+ </body>
1965
+ </html>
1966
+