@budibase/server 0.9.188 → 0.9.190-alpha.2

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 (307) hide show
  1. package/Dockerfile +7 -1
  2. package/__mocks__/mssql.ts +1 -1
  3. package/__mocks__/oracledb.ts +31 -0
  4. package/__mocks__/pg.ts +3 -0
  5. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  6. package/builder/assets/index.7d405e74.css +1 -0
  7. package/builder/assets/index.edea4fa5.js +1316 -0
  8. package/builder/assets/oracle.66592424.png +0 -0
  9. package/builder/assets/vendor.470042a4.js +152 -0
  10. package/builder/assets/vendor.5e1fe644.css +1 -0
  11. package/builder/index.html +4 -4
  12. package/coverage/clover.xml +1507 -1081
  13. package/coverage/coverage-final.json +93 -89
  14. package/coverage/lcov-report/api/controllers/analytics.js.html +2 -2
  15. package/coverage/lcov-report/api/controllers/apikeys.js.html +2 -2
  16. package/coverage/lcov-report/api/controllers/application.js.html +64 -13
  17. package/coverage/lcov-report/api/controllers/auth.js.html +19 -10
  18. package/coverage/lcov-report/api/controllers/automation.js.html +3 -3
  19. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  22. package/coverage/lcov-report/api/controllers/datasource.js.html +232 -28
  23. package/coverage/lcov-report/api/controllers/dev.js.html +16 -7
  24. package/coverage/lcov-report/api/controllers/hosting.js.html +10 -10
  25. package/coverage/lcov-report/api/controllers/index.html +91 -91
  26. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/layout.js.html +3 -3
  28. package/coverage/lcov-report/api/controllers/metadata.js.html +3 -3
  29. package/coverage/lcov-report/api/controllers/permission.js.html +3 -3
  30. package/coverage/lcov-report/api/controllers/query.js.html +53 -209
  31. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  32. package/coverage/lcov-report/api/controllers/routing.js.html +3 -3
  33. package/coverage/lcov-report/api/controllers/row/external.js.html +17 -8
  34. package/coverage/lcov-report/api/controllers/row/index.html +26 -26
  35. package/coverage/lcov-report/api/controllers/row/index.js.html +2 -2
  36. package/coverage/lcov-report/api/controllers/row/internal.js.html +9 -9
  37. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +2 -2
  38. package/coverage/lcov-report/api/controllers/row/utils.js.html +21 -30
  39. package/coverage/lcov-report/api/controllers/screen.js.html +2 -2
  40. package/coverage/lcov-report/api/controllers/script.js.html +3 -3
  41. package/coverage/lcov-report/api/controllers/table/external.js.html +1001 -0
  42. package/coverage/lcov-report/api/controllers/table/index.html +56 -26
  43. package/coverage/lcov-report/api/controllers/table/index.js.html +80 -350
  44. package/coverage/lcov-report/api/controllers/table/internal.js.html +545 -0
  45. package/coverage/lcov-report/api/controllers/table/utils.js.html +175 -52
  46. package/coverage/lcov-report/api/controllers/templates.js.html +4 -4
  47. package/coverage/lcov-report/api/controllers/user.js.html +390 -33
  48. package/coverage/lcov-report/api/controllers/view/exporters.js.html +19 -4
  49. package/coverage/lcov-report/api/controllers/view/index.html +22 -22
  50. package/coverage/lcov-report/api/controllers/view/index.js.html +52 -13
  51. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  52. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +3 -3
  53. package/coverage/lcov-report/api/controllers/webhook.js.html +4 -4
  54. package/coverage/lcov-report/api/index.html +1 -1
  55. package/coverage/lcov-report/api/index.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/dev.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/hosting.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/index.html +4 -4
  69. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/query.js.html +5 -2
  75. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/static.js.html +2 -2
  81. package/coverage/lcov-report/api/routes/table.js.html +35 -2
  82. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/user.js.html +17 -2
  84. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  85. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  86. package/coverage/lcov-report/automations/actions.js.html +2 -2
  87. package/coverage/lcov-report/automations/automationUtils.js.html +4 -4
  88. package/coverage/lcov-report/automations/bullboard.js.html +71 -20
  89. package/coverage/lcov-report/automations/index.html +35 -50
  90. package/coverage/lcov-report/automations/index.js.html +2 -2
  91. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/discord.js.html +3 -3
  96. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/executeScript.js.html +3 -3
  98. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  99. package/coverage/lcov-report/automations/steps/index.html +14 -14
  100. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +3 -3
  102. package/coverage/lcov-report/automations/steps/queryRows.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/utils.js.html +7 -7
  108. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  113. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  114. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  115. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  116. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  117. package/coverage/lcov-report/automations/triggers.js.html +22 -10
  118. package/coverage/lcov-report/automations/utils.js.html +42 -12
  119. package/coverage/lcov-report/constants/index.html +5 -5
  120. package/coverage/lcov-report/constants/index.js.html +87 -21
  121. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  122. package/coverage/lcov-report/constants/screens.js.html +1 -1
  123. package/coverage/lcov-report/db/client.js.html +2 -2
  124. package/coverage/lcov-report/db/inMemoryView.js.html +2 -2
  125. package/coverage/lcov-report/db/index.html +2 -2
  126. package/coverage/lcov-report/db/index.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +6 -6
  128. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/index.js.html +5 -5
  130. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +6 -6
  131. package/coverage/lcov-report/db/newid.js.html +3 -3
  132. package/coverage/lcov-report/db/utils.js.html +57 -57
  133. package/coverage/lcov-report/events/AutomationEmitter.js.html +6 -6
  134. package/coverage/lcov-report/events/index.html +6 -6
  135. package/coverage/lcov-report/events/index.js.html +1 -1
  136. package/coverage/lcov-report/events/utils.js.html +5 -5
  137. package/coverage/lcov-report/index.html +106 -91
  138. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  139. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  140. package/coverage/lcov-report/middleware/appInfo.js.html +2 -2
  141. package/coverage/lcov-report/middleware/authorized.js.html +11 -8
  142. package/coverage/lcov-report/middleware/builder.js.html +16 -7
  143. package/coverage/lcov-report/middleware/currentapp.js.html +6 -6
  144. package/coverage/lcov-report/middleware/index.html +23 -23
  145. package/coverage/lcov-report/middleware/joi-validator.js.html +2 -2
  146. package/coverage/lcov-report/middleware/resourceId.js.html +18 -18
  147. package/coverage/lcov-report/middleware/selfhost.js.html +2 -2
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +4 -4
  149. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  150. package/coverage/lcov-report/{automations/thread.js.html → threads/automation.js.html} +90 -33
  151. package/coverage/lcov-report/threads/index.html +141 -0
  152. package/coverage/lcov-report/threads/index.js.html +278 -0
  153. package/coverage/lcov-report/threads/query.js.html +278 -0
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  156. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  157. package/coverage/lcov-report/utilities/csvParser.js.html +144 -15
  158. package/coverage/lcov-report/utilities/global.js.html +26 -11
  159. package/coverage/lcov-report/utilities/index.html +48 -48
  160. package/coverage/lcov-report/utilities/index.js.html +47 -14
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +30 -9
  162. package/coverage/lcov-report/utilities/queue/index.html +14 -14
  163. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  165. package/coverage/lcov-report/utilities/rowProcessor/index.html +4 -4
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +2 -2
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +3 -3
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +16 -7
  169. package/coverage/lcov-report/utilities/security.js.html +3 -3
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/users.js.html +1 -1
  172. package/coverage/lcov-report/utilities/workerRequests.js.html +5 -5
  173. package/coverage/lcov.info +2495 -1737
  174. package/dist/api/controllers/application.js +15 -1
  175. package/dist/api/controllers/auth.js +3 -3
  176. package/dist/api/controllers/datasource.js +67 -16
  177. package/dist/api/controllers/deploy/index.js +2 -0
  178. package/dist/api/controllers/dev.js +4 -1
  179. package/dist/api/controllers/query.js +30 -58
  180. package/dist/api/controllers/row/ExternalRequest.js +78 -34
  181. package/dist/api/controllers/row/external.js +3 -1
  182. package/dist/api/controllers/row/utils.js +6 -12
  183. package/dist/api/controllers/table/external.js +249 -0
  184. package/dist/api/controllers/table/index.js +49 -123
  185. package/dist/api/controllers/table/internal.js +150 -0
  186. package/dist/api/controllers/table/utils.js +62 -28
  187. package/dist/api/controllers/user.js +123 -11
  188. package/dist/api/controllers/view/exporters.js +4 -0
  189. package/dist/api/controllers/view/index.js +14 -2
  190. package/dist/api/routes/query.js +1 -1
  191. package/dist/api/routes/table.js +7 -1
  192. package/dist/api/routes/user.js +2 -1
  193. package/dist/app.js +2 -11
  194. package/dist/automations/bullboard.js +37 -10
  195. package/dist/automations/triggers.js +7 -3
  196. package/dist/automations/utils.js +11 -2
  197. package/dist/constants/index.js +19 -0
  198. package/dist/definitions/datasource.js +5 -0
  199. package/dist/environment.js +13 -0
  200. package/dist/integrations/base/IntegrationBase.js +2 -0
  201. package/dist/integrations/base/datasourcePlus.js +2 -0
  202. package/dist/integrations/base/sql.js +353 -177
  203. package/dist/integrations/base/sqlTable.js +143 -0
  204. package/dist/integrations/base/utils.js +30 -0
  205. package/dist/integrations/index.js +6 -0
  206. package/dist/integrations/microsoftSqlServer.js +117 -9
  207. package/dist/integrations/mysql.js +16 -85
  208. package/dist/integrations/oracle.js +347 -0
  209. package/dist/integrations/postgres.js +35 -28
  210. package/dist/integrations/utils.js +71 -9
  211. package/dist/middleware/authorized.js +2 -1
  212. package/dist/middleware/builder.js +4 -1
  213. package/dist/package.json +12 -7
  214. package/dist/tests/utilities/TestConfiguration.js +2 -1
  215. package/dist/{automations/thread.js → threads/automation.js} +26 -8
  216. package/dist/threads/index.js +64 -0
  217. package/dist/threads/query.js +64 -0
  218. package/dist/tsconfig.tsbuildinfo +1 -1
  219. package/dist/utilities/csvParser.js +46 -5
  220. package/dist/utilities/global.js +6 -2
  221. package/dist/utilities/index.js +11 -0
  222. package/dist/utilities/queue/inMemoryQueue.js +8 -0
  223. package/dist/utilities/scriptRunner.js +4 -1
  224. package/package.json +13 -8
  225. package/scripts/dev/manage.js +1 -0
  226. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  227. package/scripts/integrations/mssql/data/entrypoint.sh +24 -0
  228. package/scripts/integrations/mssql/data/setup.sql +54 -0
  229. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  230. package/scripts/integrations/mssql/reset.sh +3 -0
  231. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  232. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  233. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  234. package/scripts/integrations/oracle/oracle.md +90 -0
  235. package/scripts/integrations/postgres/docker-compose.yml +3 -3
  236. package/scripts/likeCypress.ts +33 -0
  237. package/src/api/controllers/application.js +18 -1
  238. package/src/api/controllers/auth.js +3 -0
  239. package/src/api/controllers/datasource.js +84 -16
  240. package/src/api/controllers/deploy/index.js +2 -0
  241. package/src/api/controllers/dev.js +4 -1
  242. package/src/api/controllers/query.js +29 -81
  243. package/src/api/controllers/row/ExternalRequest.ts +91 -36
  244. package/src/api/controllers/row/external.js +4 -1
  245. package/src/api/controllers/row/utils.js +8 -11
  246. package/src/api/controllers/table/external.js +307 -0
  247. package/src/api/controllers/table/index.js +47 -137
  248. package/src/api/controllers/table/internal.js +155 -0
  249. package/src/api/controllers/table/utils.js +74 -33
  250. package/src/api/controllers/user.js +132 -13
  251. package/src/api/controllers/view/exporters.js +5 -0
  252. package/src/api/controllers/view/index.js +15 -2
  253. package/src/api/routes/query.js +1 -0
  254. package/src/api/routes/table.js +11 -0
  255. package/src/api/routes/tests/datasource.spec.js +2 -2
  256. package/src/api/routes/tests/misc.spec.js +5 -1
  257. package/src/api/routes/tests/query.spec.js +0 -1
  258. package/src/api/routes/user.js +5 -0
  259. package/src/app.ts +2 -10
  260. package/src/automations/bullboard.js +28 -11
  261. package/src/automations/tests/automation.spec.js +3 -4
  262. package/src/automations/triggers.js +7 -3
  263. package/src/automations/utils.js +12 -2
  264. package/src/constants/index.js +22 -0
  265. package/src/definitions/common.ts +7 -1
  266. package/src/definitions/datasource.ts +10 -3
  267. package/src/environment.js +15 -0
  268. package/src/integrations/airtable.ts +2 -1
  269. package/src/integrations/arangodb.ts +2 -1
  270. package/src/integrations/base/IntegrationBase.ts +6 -0
  271. package/src/integrations/base/datasourcePlus.ts +9 -0
  272. package/src/integrations/base/sql.ts +377 -218
  273. package/src/integrations/base/sqlTable.ts +180 -0
  274. package/src/integrations/base/utils.ts +22 -0
  275. package/src/integrations/couchdb.ts +2 -1
  276. package/src/integrations/dynamodb.ts +2 -1
  277. package/src/integrations/elasticsearch.ts +2 -1
  278. package/src/integrations/index.ts +7 -0
  279. package/src/integrations/microsoftSqlServer.ts +145 -13
  280. package/src/integrations/mongodb.ts +2 -1
  281. package/src/integrations/mysql.ts +23 -95
  282. package/src/integrations/oracle.ts +458 -0
  283. package/src/integrations/postgres.ts +45 -35
  284. package/src/integrations/rest.ts +2 -1
  285. package/src/integrations/s3.ts +2 -1
  286. package/src/integrations/tests/microsoftSqlServer.spec.js +22 -15
  287. package/src/integrations/tests/oracle.spec.js +94 -0
  288. package/src/integrations/tests/postgres.spec.js +4 -0
  289. package/src/integrations/utils.ts +78 -8
  290. package/src/middleware/authorized.js +2 -1
  291. package/src/middleware/builder.js +4 -1
  292. package/src/tests/utilities/TestConfiguration.js +2 -1
  293. package/src/{automations/thread.js → threads/automation.js} +27 -8
  294. package/src/threads/index.js +66 -0
  295. package/src/threads/query.js +66 -0
  296. package/src/utilities/csvParser.js +48 -5
  297. package/src/utilities/global.js +7 -2
  298. package/src/utilities/index.js +11 -0
  299. package/src/utilities/queue/inMemoryQueue.js +7 -0
  300. package/src/utilities/scriptRunner.js +4 -1
  301. package/src/utilities/tests/__snapshots__/csvParser.spec.js.snap +0 -6
  302. package/src/utilities/tests/csvParser.spec.js +3 -0
  303. package/tsconfig.json +1 -1
  304. package/builder/assets/index.550fdba7.js +0 -201
  305. package/builder/assets/index.7469e1e4.css +0 -29
  306. package/builder/assets/vendor.278a305c.js +0 -9
  307. package/builder/assets/vendor.d75d5eb7.css +0 -1
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">90.13% </span>
26
+ <span class="strong">90.26% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>201/223</span>
28
+ <span class='fraction'>204/226</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">79.33% </span>
33
+ <span class="strong">79.6% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>119/150</span>
35
+ <span class='fraction'>121/152</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">90.05% </span>
47
+ <span class="strong">90.17% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>199/221</span>
49
+ <span class='fraction'>202/224</span>
50
50
  </div>
51
51
 
52
52
 
@@ -79,7 +79,7 @@
79
79
  </td>
80
80
  <td data-value="80" class="pct high">80%</td>
81
81
  <td data-value="10" class="abs high">8/10</td>
82
- <td data-value="54.55" class="pct medium">54.55%</td>
82
+ <td data-value="54.54" class="pct medium">54.54%</td>
83
83
  <td data-value="11" class="abs medium">6/11</td>
84
84
  <td data-value="100" class="pct high">100%</td>
85
85
  <td data-value="2" class="abs high">2/2</td>
@@ -94,8 +94,8 @@
94
94
  </td>
95
95
  <td data-value="100" class="pct high">100%</td>
96
96
  <td data-value="34" class="abs high">34/34</td>
97
- <td data-value="88.46" class="pct high">88.46%</td>
98
- <td data-value="26" class="abs high">23/26</td>
97
+ <td data-value="89.28" class="pct high">89.28%</td>
98
+ <td data-value="28" class="abs high">25/28</td>
99
99
  <td data-value="100" class="pct high">100%</td>
100
100
  <td data-value="4" class="abs high">4/4</td>
101
101
  <td data-value="100" class="pct high">100%</td>
@@ -104,31 +104,31 @@
104
104
 
105
105
  <tr>
106
106
  <td class="file high" data-value="builder.js"><a href="builder.js.html">builder.js</a></td>
107
- <td data-value="87.88" class="pic high">
108
- <div class="chart"><div class="cover-fill" style="width: 87%"></div><div class="cover-empty" style="width: 13%"></div></div>
107
+ <td data-value="88.88" class="pic high">
108
+ <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div>
109
109
  </td>
110
- <td data-value="87.88" class="pct high">87.88%</td>
111
- <td data-value="33" class="abs high">29/33</td>
110
+ <td data-value="88.88" class="pct high">88.88%</td>
111
+ <td data-value="36" class="abs high">32/36</td>
112
112
  <td data-value="77.27" class="pct medium">77.27%</td>
113
113
  <td data-value="22" class="abs medium">17/22</td>
114
114
  <td data-value="100" class="pct high">100%</td>
115
115
  <td data-value="3" class="abs high">3/3</td>
116
- <td data-value="87.88" class="pct high">87.88%</td>
117
- <td data-value="33" class="abs high">29/33</td>
116
+ <td data-value="88.88" class="pct high">88.88%</td>
117
+ <td data-value="36" class="abs high">32/36</td>
118
118
  </tr>
119
119
 
120
120
  <tr>
121
121
  <td class="file high" data-value="currentapp.js"><a href="currentapp.js.html">currentapp.js</a></td>
122
- <td data-value="83.02" class="pic high">
122
+ <td data-value="83.01" class="pic high">
123
123
  <div class="chart"><div class="cover-fill" style="width: 83%"></div><div class="cover-empty" style="width: 17%"></div></div>
124
124
  </td>
125
- <td data-value="83.02" class="pct high">83.02%</td>
125
+ <td data-value="83.01" class="pct high">83.01%</td>
126
126
  <td data-value="53" class="abs high">44/53</td>
127
- <td data-value="78.05" class="pct medium">78.05%</td>
127
+ <td data-value="78.04" class="pct medium">78.04%</td>
128
128
  <td data-value="41" class="abs medium">32/41</td>
129
129
  <td data-value="100" class="pct high">100%</td>
130
130
  <td data-value="1" class="abs high">1/1</td>
131
- <td data-value="83.02" class="pct high">83.02%</td>
131
+ <td data-value="83.01" class="pct high">83.01%</td>
132
132
  <td data-value="53" class="abs high">44/53</td>
133
133
  </tr>
134
134
 
@@ -179,16 +179,16 @@
179
179
 
180
180
  <tr>
181
181
  <td class="file high" data-value="usageQuota.js"><a href="usageQuota.js.html">usageQuota.js</a></td>
182
- <td data-value="92.11" class="pic high">
182
+ <td data-value="92.1" class="pic high">
183
183
  <div class="chart"><div class="cover-fill" style="width: 92%"></div><div class="cover-empty" style="width: 8%"></div></div>
184
184
  </td>
185
- <td data-value="92.11" class="pct high">92.11%</td>
185
+ <td data-value="92.1" class="pct high">92.1%</td>
186
186
  <td data-value="38" class="abs high">35/38</td>
187
187
  <td data-value="82.14" class="pct high">82.14%</td>
188
188
  <td data-value="28" class="abs high">23/28</td>
189
189
  <td data-value="100" class="pct high">100%</td>
190
190
  <td data-value="4" class="abs high">4/4</td>
191
- <td data-value="91.67" class="pct high">91.67%</td>
191
+ <td data-value="91.66" class="pct high">91.66%</td>
192
192
  <td data-value="36" class="abs high">33/36</td>
193
193
  </tr>
194
194
 
@@ -215,7 +215,7 @@
215
215
  <div class='footer quiet pad2 space-top1 center small'>
216
216
  Code coverage generated by
217
217
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
218
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
218
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
219
219
  </div>
220
220
  </div>
221
221
  <script src="../prettify.js"></script>
@@ -122,7 +122,7 @@
122
122
  let params = null
123
123
  if (ctx[property] != null) {
124
124
  params = ctx[property]
125
- } else <span class="missing-if-branch" title="else path not taken" >E</span>if (ctx.request[property] != null) {
125
+ } else if (ctx.request[property] != null) {
126
126
  params = ctx.request[property]
127
127
  }
128
128
  const { error } = schema.validate(params)
@@ -148,7 +148,7 @@ module.exports.params = schema =&gt; {
148
148
  <div class='footer quiet pad2 space-top1 center small'>
149
149
  Code coverage generated by
150
150
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
151
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
151
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
152
152
  </div>
153
153
  </div>
154
154
  <script src="../prettify.js"></script>
@@ -120,15 +120,15 @@
120
120
  <a name='L61'></a><a href='#L61'>61</a>
121
121
  <a name='L62'></a><a href='#L62'>62</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
122
122
  <span class="cline-any cline-neutral">&nbsp;</span>
123
- <span class="cline-any cline-yes">558x</span>
124
- <span class="cline-any cline-yes">558x</span>
125
- <span class="cline-any cline-yes">558x</span>
126
- <span class="cline-any cline-yes">558x</span>
123
+ <span class="cline-any cline-yes">604x</span>
124
+ <span class="cline-any cline-yes">604x</span>
125
+ <span class="cline-any cline-yes">604x</span>
126
+ <span class="cline-any cline-yes">604x</span>
127
127
  <span class="cline-any cline-neutral">&nbsp;</span>
128
128
  <span class="cline-any cline-neutral">&nbsp;</span>
129
129
  <span class="cline-any cline-neutral">&nbsp;</span>
130
- <span class="cline-any cline-yes">558x</span>
131
- <span class="cline-any cline-yes">558x</span>
130
+ <span class="cline-any cline-yes">604x</span>
131
+ <span class="cline-any cline-yes">604x</span>
132
132
  <span class="cline-any cline-neutral">&nbsp;</span>
133
133
  <span class="cline-any cline-neutral">&nbsp;</span>
134
134
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -137,21 +137,21 @@
137
137
  <span class="cline-any cline-neutral">&nbsp;</span>
138
138
  <span class="cline-any cline-neutral">&nbsp;</span>
139
139
  <span class="cline-any cline-neutral">&nbsp;</span>
140
- <span class="cline-any cline-yes">558x</span>
141
- <span class="cline-any cline-yes">558x</span>
142
- <span class="cline-any cline-yes">558x</span>
143
- <span class="cline-any cline-yes">558x</span>
144
- <span class="cline-any cline-yes">55x</span>
145
- <span class="cline-any cline-yes">55x</span>
140
+ <span class="cline-any cline-yes">604x</span>
141
+ <span class="cline-any cline-yes">604x</span>
142
+ <span class="cline-any cline-yes">604x</span>
143
+ <span class="cline-any cline-yes">604x</span>
144
+ <span class="cline-any cline-yes">57x</span>
145
+ <span class="cline-any cline-yes">57x</span>
146
146
  <span class="cline-any cline-yes">1x</span>
147
147
  <span class="cline-any cline-neutral">&nbsp;</span>
148
- <span class="cline-any cline-yes">54x</span>
149
- <span class="cline-any cline-yes">50x</span>
148
+ <span class="cline-any cline-yes">56x</span>
149
+ <span class="cline-any cline-yes">52x</span>
150
150
  <span class="cline-any cline-neutral">&nbsp;</span>
151
- <span class="cline-any cline-yes">54x</span>
151
+ <span class="cline-any cline-yes">56x</span>
152
152
  <span class="cline-any cline-yes">11x</span>
153
153
  <span class="cline-any cline-neutral">&nbsp;</span>
154
- <span class="cline-any cline-yes">54x</span>
154
+ <span class="cline-any cline-yes">56x</span>
155
155
  <span class="cline-any cline-neutral">&nbsp;</span>
156
156
  <span class="cline-any cline-neutral">&nbsp;</span>
157
157
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -159,7 +159,7 @@
159
159
  <span class="cline-any cline-yes">24x</span>
160
160
  <span class="cline-any cline-neutral">&nbsp;</span>
161
161
  <span class="cline-any cline-yes">24x</span>
162
- <span class="cline-any cline-yes">416x</span>
162
+ <span class="cline-any cline-yes">462x</span>
163
163
  <span class="cline-any cline-neutral">&nbsp;</span>
164
164
  <span class="cline-any cline-neutral">&nbsp;</span>
165
165
  <span class="cline-any cline-yes">24x</span>
@@ -247,7 +247,7 @@ module.exports.bodySubResource = (main, sub) =&gt; {
247
247
  <div class='footer quiet pad2 space-top1 center small'>
248
248
  Code coverage generated by
249
249
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
250
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
250
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
251
251
  </div>
252
252
  </div>
253
253
  <script src="../prettify.js"></script>
@@ -81,7 +81,7 @@
81
81
  // if added as a middleware will stop requests unless builder is in self host mode
82
82
  // or cloud is in self host
83
83
  module.exports = async (ctx, next) =&gt; {
84
- <span class="missing-if-branch" title="else path not taken" >E</span>if (env.SELF_HOSTED) {
84
+ if (env.SELF_HOSTED) {
85
85
  await next()
86
86
  return
87
87
  }
@@ -94,7 +94,7 @@ module.exports = async (ctx, next) =&gt; {
94
94
  <div class='footer quiet pad2 space-top1 center small'>
95
95
  Code coverage generated by
96
96
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
97
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
97
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
98
98
  </div>
99
99
  </div>
100
100
  <script src="../prettify.js"></script>
@@ -23,7 +23,7 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">92.11% </span>
26
+ <span class="strong">92.1% </span>
27
27
  <span class="quiet">Statements</span>
28
28
  <span class='fraction'>35/38</span>
29
29
  </div>
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">91.67% </span>
47
+ <span class="strong">91.66% </span>
48
48
  <span class="quiet">Lines</span>
49
49
  <span class='fraction'>33/36</span>
50
50
  </div>
@@ -287,7 +287,7 @@ module.exports = async (ctx, next) =&gt; {
287
287
  if (ctx.request.body &amp;&amp; ctx.request.body._id &amp;&amp; ctx.request.body._rev) {
288
288
  const usageId = ctx.request.body._id
289
289
  try {
290
- <span class="missing-if-branch" title="else path not taken" >E</span>if (ctx.appId) {
290
+ if (ctx.appId) {
291
291
  const db = new CouchDB(ctx.appId)
292
292
  await db.get(usageId)
293
293
  }
@@ -328,7 +328,7 @@ module.exports = async (ctx, next) =&gt; {
328
328
  <div class='footer quiet pad2 space-top1 center small'>
329
329
  Code coverage generated by
330
330
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
331
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
331
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
332
332
  </div>
333
333
  </div>
334
334
  <script src="../prettify.js"></script>
@@ -85,7 +85,7 @@ exports.isWebhookEndpoint = ctx =&gt; {
85
85
  <div class='footer quiet pad2 space-top1 center small'>
86
86
  Code coverage generated by
87
87
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
88
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
88
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
89
89
  </div>
90
90
  </div>
91
91
  <script src="../prettify.js"></script>
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for automations/thread.js</title>
6
+ <title>Code coverage report for threads/automation.js</title>
7
7
  <meta charset="utf-8" />
8
8
  <link rel="stylesheet" href="../prettify.css" />
9
9
  <link rel="stylesheet" href="../base.css" />
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../index.html">All files</a> / <a href="index.html">automations</a> thread.js</h1>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">threads</a> automation.js</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">85.07% </span>
26
+ <span class="strong">84.21% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>57/67</span>
28
+ <span class='fraction'>64/76</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">57.14% </span>
33
+ <span class="strong">56.52% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>12/21</span>
35
+ <span class='fraction'>13/23</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">100% </span>
40
+ <span class="strong">90% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>7/7</span>
42
+ <span class='fraction'>9/10</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">85.07% </span>
47
+ <span class="strong">84.21% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>57/67</span>
49
+ <span class='fraction'>64/76</span>
50
50
  </div>
51
51
 
52
52
 
@@ -185,19 +185,42 @@
185
185
  <a name='L126'></a><a href='#L126'>126</a>
186
186
  <a name='L127'></a><a href='#L127'>127</a>
187
187
  <a name='L128'></a><a href='#L128'>128</a>
188
- <a name='L129'></a><a href='#L129'>129</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">33x</span>
189
- <span class="cline-any cline-yes">33x</span>
190
- <span class="cline-any cline-yes">33x</span>
191
- <span class="cline-any cline-yes">33x</span>
192
- <span class="cline-any cline-yes">33x</span>
193
- <span class="cline-any cline-yes">33x</span>
194
- <span class="cline-any cline-yes">33x</span>
195
- <span class="cline-any cline-yes">33x</span>
196
- <span class="cline-any cline-yes">33x</span>
197
- <span class="cline-any cline-yes">33x</span>
198
- <span class="cline-any cline-neutral">&nbsp;</span>
199
- <span class="cline-any cline-yes">33x</span>
200
- <span class="cline-any cline-yes">33x</span>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
208
+ <span class="cline-any cline-yes">4x</span>
209
+ <span class="cline-any cline-yes">4x</span>
210
+ <span class="cline-any cline-yes">4x</span>
211
+ <span class="cline-any cline-yes">4x</span>
212
+ <span class="cline-any cline-yes">4x</span>
213
+ <span class="cline-any cline-yes">4x</span>
214
+ <span class="cline-any cline-yes">4x</span>
215
+ <span class="cline-any cline-yes">4x</span>
216
+ <span class="cline-any cline-yes">4x</span>
217
+ <span class="cline-any cline-yes">4x</span>
218
+ <span class="cline-any cline-yes">4x</span>
219
+ <span class="cline-any cline-yes">4x</span>
220
+ <span class="cline-any cline-neutral">&nbsp;</span>
221
+ <span class="cline-any cline-yes">4x</span>
222
+ <span class="cline-any cline-yes">4x</span>
223
+ <span class="cline-any cline-yes">4x</span>
201
224
  <span class="cline-any cline-neutral">&nbsp;</span>
202
225
  <span class="cline-any cline-neutral">&nbsp;</span>
203
226
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -210,6 +233,8 @@
210
233
  <span class="cline-any cline-yes">7x</span>
211
234
  <span class="cline-any cline-yes">7x</span>
212
235
  <span class="cline-any cline-yes">7x</span>
236
+ <span class="cline-any cline-yes">7x</span>
237
+ <span class="cline-any cline-yes">7x</span>
213
238
  <span class="cline-any cline-neutral">&nbsp;</span>
214
239
  <span class="cline-any cline-yes">7x</span>
215
240
  <span class="cline-any cline-yes">7x</span>
@@ -223,6 +248,12 @@
223
248
  <span class="cline-any cline-neutral">&nbsp;</span>
224
249
  <span class="cline-any cline-yes">7x</span>
225
250
  <span class="cline-any cline-yes">7x</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-yes">7x</span>
255
+ <span class="cline-any cline-no">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
257
  <span class="cline-any cline-yes">7x</span>
227
258
  <span class="cline-any cline-neutral">&nbsp;</span>
228
259
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -306,25 +337,36 @@
306
337
  <span class="cline-any cline-neutral">&nbsp;</span>
307
338
  <span class="cline-any cline-neutral">&nbsp;</span>
308
339
  <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-yes">33x</span>
340
+ <span class="cline-any cline-yes">4x</span>
310
341
  <span class="cline-any cline-yes">7x</span>
311
342
  <span class="cline-any cline-neutral">&nbsp;</span>
312
343
  <span class="cline-any cline-neutral">&nbsp;</span>
313
344
  <span class="cline-any cline-neutral">&nbsp;</span>
314
345
  <span class="cline-any cline-yes">7x</span>
315
346
  <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const actions = require("./actions")
317
- const automationUtils = require("./automationUtils")
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-yes">6x</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// when thread starts, make sure it is recorded
355
+ const env = require("../environment")
356
+ env.setInThread()
357
+ const actions = require("../automations/actions")
358
+ const automationUtils = require("../automations/automationUtils")
318
359
  const AutomationEmitter = require("../events/AutomationEmitter")
319
360
  const { processObject } = require("@budibase/string-templates")
320
361
  const { DEFAULT_TENANT_ID } = require("@budibase/auth").constants
321
362
  const CouchDB = require("../db")
322
363
  const { DocumentTypes, isDevAppID } = require("../db/utils")
323
364
  const { doInTenant } = require("@budibase/auth/tenancy")
324
- const env = require("../environment")
325
365
  const usage = require("../utilities/usageQuota")
366
+ const { definitions: triggerDefs } = require("../automations/triggerInfo")
326
367
  &nbsp;
327
368
  const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
369
+ const CRON_STEP_ID = triggerDefs.CRON.stepId
328
370
  const STOPPED_STATUS = { success: false, status: "STOPPED" }
329
371
  &nbsp;
330
372
  /**
@@ -338,6 +380,8 @@ class Orchestrator {
338
380
  this._chainCount = this._metadata ? this._metadata.automationChainCount : 0
339
381
  this._appId = triggerOutput.appId
340
382
  this._app = null
383
+ const triggerStepId = automation.definition.trigger.stepId
384
+ triggerOutput = this.cleanupTriggerOutputs(triggerStepId, triggerOutput)
341
385
  // remove from context
342
386
  delete triggerOutput.appId
343
387
  delete triggerOutput.metadata
@@ -349,10 +393,16 @@ class Orchestrator {
349
393
  this._emitter = new AutomationEmitter(this._chainCount + 1)
350
394
  this.executionOutput = { trigger: {}, steps: [] }
351
395
  // setup the execution output
352
- const triggerStepId = automation.definition.trigger.stepId
353
396
  const triggerId = automation.definition.trigger.id
354
397
  this.updateExecutionOutput(triggerId, triggerStepId, null, triggerOutput)
355
398
  }
399
+ &nbsp;
400
+ cleanupTriggerOutputs(stepId, triggerOutput) {
401
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (stepId === CRON_STEP_ID) {
402
+ <span class="cstat-no" title="statement not covered" > triggerOutput.timestamp = Date.now()</span>
403
+ }
404
+ return triggerOutput
405
+ }
356
406
  &nbsp;
357
407
  async getStepFunctionality(stepId) {
358
408
  let step = await actions.getAction(stepId)
@@ -434,12 +484,19 @@ class Orchestrator {
434
484
  }
435
485
  }
436
486
  &nbsp;
437
- module.exports = async job =&gt; {
487
+ module.exports = (input, callback) =&gt; {
438
488
  const automationOrchestrator = new Orchestrator(
439
- job.data.automation,
440
- job.data.event
489
+ input.data.automation,
490
+ input.data.event
441
491
  )
442
- return automationOrchestrator.execute()
492
+ automationOrchestrator
493
+ .execute()
494
+ .then(response =&gt; {
495
+ callback(null, response)
496
+ })
497
+ .catch(<span class="fstat-no" title="function not covered" >er</span>r =&gt; {
498
+ <span class="cstat-no" title="statement not covered" > callback(err)</span>
499
+ })
443
500
  }
444
501
  &nbsp;</pre></td></tr></table></pre>
445
502
 
@@ -448,7 +505,7 @@ module.exports = async job =&gt; {
448
505
  <div class='footer quiet pad2 space-top1 center small'>
449
506
  Code coverage generated by
450
507
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
451
- at Thu Nov 18 2021 07:07:10 GMT+0000 (Coordinated Universal Time)
508
+ at Thu Nov 25 2021 16:48:05 GMT+0000 (Coordinated Universal Time)
452
509
  </div>
453
510
  </div>
454
511
  <script src="../prettify.js"></script>