@budibase/server 1.0.46 → 1.0.49-alpha.1

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 (277) hide show
  1. package/builder/assets/index.ba78c49d.css +1 -0
  2. package/builder/assets/{index.e9bff1c6.js → index.ed1cf508.js} +237 -234
  3. package/builder/assets/{vendor.f9faf6ab.js → vendor.d526bfe8.js} +12 -12
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +2368 -2016
  6. package/coverage/coverage-final.json +101 -95
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +210 -126
  10. package/coverage/lcov-report/api/controllers/auth.js.html +18 -6
  11. package/coverage/lcov-report/api/controllers/automation.js.html +21 -21
  12. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/component.js.html +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +72 -36
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +38 -53
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/layout.js.html +6 -6
  20. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/permission.js.html +15 -15
  22. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  23. package/coverage/lcov-report/api/controllers/query/index.js.html +19 -19
  24. package/coverage/lcov-report/api/controllers/query/validation.js.html +6 -6
  25. package/coverage/lcov-report/api/controllers/role.js.html +9 -9
  26. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/external.js.html +16 -16
  28. package/coverage/lcov-report/api/controllers/row/index.html +48 -33
  29. package/coverage/lcov-report/api/controllers/row/index.js.html +26 -26
  30. package/coverage/lcov-report/api/controllers/row/internal.js.html +95 -158
  31. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +41 -17
  32. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +551 -0
  33. package/coverage/lcov-report/api/controllers/row/utils.js.html +39 -57
  34. package/coverage/lcov-report/api/controllers/screen.js.html +7 -7
  35. package/coverage/lcov-report/api/controllers/script.js.html +4 -4
  36. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +629 -0
  37. package/coverage/lcov-report/api/controllers/table/external.js.html +12 -12
  38. package/coverage/lcov-report/api/controllers/table/index.html +49 -34
  39. package/coverage/lcov-report/api/controllers/table/index.js.html +53 -77
  40. package/coverage/lcov-report/api/controllers/table/internal.js.html +59 -35
  41. package/coverage/lcov-report/api/controllers/table/utils.js.html +283 -76
  42. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/user.js.html +30 -24
  44. package/coverage/lcov-report/api/controllers/view/exporters.js.html +4 -4
  45. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.js.html +14 -14
  47. package/coverage/lcov-report/api/controllers/view/utils.js.html +11 -11
  48. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +7 -7
  49. package/coverage/lcov-report/api/controllers/webhook.js.html +15 -15
  50. package/coverage/lcov-report/api/index.html +1 -1
  51. package/coverage/lcov-report/api/index.js.html +10 -10
  52. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/index.html +7 -22
  64. package/coverage/lcov-report/api/routes/index.js.html +4 -10
  65. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/static.js.html +17 -2
  76. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  78. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  81. package/coverage/lcov-report/automations/actions.js.html +24 -24
  82. package/coverage/lcov-report/automations/automationUtils.js.html +5 -5
  83. package/coverage/lcov-report/automations/bullboard.js.html +16 -16
  84. package/coverage/lcov-report/automations/index.html +1 -1
  85. package/coverage/lcov-report/automations/index.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/bash.js.html +6 -6
  87. package/coverage/lcov-report/automations/steps/createRow.js.html +13 -19
  88. package/coverage/lcov-report/automations/steps/delay.js.html +4 -4
  89. package/coverage/lcov-report/automations/steps/deleteRow.js.html +11 -20
  90. package/coverage/lcov-report/automations/steps/discord.js.html +7 -7
  91. package/coverage/lcov-report/automations/steps/executeQuery.js.html +6 -6
  92. package/coverage/lcov-report/automations/steps/executeScript.js.html +6 -6
  93. package/coverage/lcov-report/automations/steps/filter.js.html +7 -7
  94. package/coverage/lcov-report/automations/steps/index.html +13 -13
  95. package/coverage/lcov-report/automations/steps/integromat.js.html +5 -5
  96. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +8 -8
  97. package/coverage/lcov-report/automations/steps/queryRows.js.html +10 -10
  98. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +5 -5
  99. package/coverage/lcov-report/automations/steps/serverLog.js.html +3 -3
  100. package/coverage/lcov-report/automations/steps/slack.js.html +5 -5
  101. package/coverage/lcov-report/automations/steps/updateRow.js.html +6 -6
  102. package/coverage/lcov-report/automations/steps/utils.js.html +3 -3
  103. package/coverage/lcov-report/automations/steps/zapier.js.html +5 -5
  104. package/coverage/lcov-report/automations/triggerInfo/app.js.html +2 -2
  105. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +2 -2
  106. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  107. package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -8
  108. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +2 -2
  109. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +2 -2
  110. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +2 -2
  111. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +2 -2
  112. package/coverage/lcov-report/automations/triggers.js.html +18 -18
  113. package/coverage/lcov-report/automations/utils.js.html +32 -32
  114. package/coverage/lcov-report/constants/index.html +11 -11
  115. package/coverage/lcov-report/constants/index.js.html +68 -32
  116. package/coverage/lcov-report/constants/layouts.js.html +5 -5
  117. package/coverage/lcov-report/constants/screens.js.html +4 -4
  118. package/coverage/lcov-report/db/client.js.html +18 -18
  119. package/coverage/lcov-report/db/inMemoryView.js.html +7 -7
  120. package/coverage/lcov-report/db/index.html +15 -15
  121. package/coverage/lcov-report/db/index.js.html +3 -3
  122. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +18 -18
  123. package/coverage/lcov-report/db/linkedRows/index.html +10 -10
  124. package/coverage/lcov-report/db/linkedRows/index.js.html +38 -41
  125. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +15 -15
  126. package/coverage/lcov-report/db/newid.js.html +4 -4
  127. package/coverage/lcov-report/db/utils.js.html +86 -86
  128. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  129. package/coverage/lcov-report/events/index.html +1 -1
  130. package/coverage/lcov-report/events/index.js.html +5 -5
  131. package/coverage/lcov-report/events/utils.js.html +3 -3
  132. package/coverage/lcov-report/index.html +131 -101
  133. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  134. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  135. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  136. package/coverage/lcov-report/middleware/authorized.js.html +166 -64
  137. package/coverage/lcov-report/middleware/builder.js.html +8 -8
  138. package/coverage/lcov-report/middleware/currentapp.js.html +29 -29
  139. package/coverage/lcov-report/middleware/index.html +30 -30
  140. package/coverage/lcov-report/middleware/joi-validator.js.html +3 -3
  141. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  142. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  143. package/coverage/lcov-report/middleware/usageQuota.js.html +275 -41
  144. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  145. package/coverage/lcov-report/migrations/usageQuotas/index.html +141 -0
  146. package/coverage/lcov-report/migrations/usageQuotas/index.js.html +152 -0
  147. package/coverage/lcov-report/{api/routes/hosting.js.html → migrations/usageQuotas/syncApps.js.html} +42 -27
  148. package/coverage/lcov-report/{api/controllers/hosting.js.html → migrations/usageQuotas/syncRows.js.html} +41 -44
  149. package/coverage/lcov-report/threads/automation.js.html +1 -1
  150. package/coverage/lcov-report/threads/index.html +15 -15
  151. package/coverage/lcov-report/threads/index.js.html +10 -10
  152. package/coverage/lcov-report/threads/query.js.html +23 -8
  153. package/coverage/lcov-report/threads/utils.js.html +14 -14
  154. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  155. package/coverage/lcov-report/utilities/budibaseDir.js.html +7 -7
  156. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  157. package/coverage/lcov-report/utilities/csvParser.js.html +6 -6
  158. package/coverage/lcov-report/utilities/global.js.html +26 -26
  159. package/coverage/lcov-report/utilities/index.html +19 -19
  160. package/coverage/lcov-report/utilities/index.js.html +25 -25
  161. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +8 -8
  162. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  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 +27 -27
  166. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +115 -79
  167. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +75 -27
  168. package/coverage/lcov-report/utilities/scriptRunner.js.html +5 -5
  169. package/coverage/lcov-report/utilities/security.js.html +8 -8
  170. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  171. package/coverage/lcov-report/utilities/usageQuota/index.html +141 -0
  172. package/coverage/lcov-report/utilities/usageQuota/index.js.html +356 -0
  173. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +302 -0
  174. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +134 -0
  175. package/coverage/lcov-report/utilities/users.js.html +5 -5
  176. package/coverage/lcov-report/utilities/workerRequests.js.html +39 -108
  177. package/coverage/lcov.info +3719 -3046
  178. package/dist/api/controllers/application.js +49 -20
  179. package/dist/api/controllers/auth.js +4 -0
  180. package/dist/api/controllers/datasource.js +11 -0
  181. package/dist/api/controllers/row/ExternalRequest.js +2 -1
  182. package/dist/api/controllers/row/internal.js +30 -53
  183. package/dist/api/controllers/row/internalSearch.js +12 -4
  184. package/dist/api/controllers/row/staticFormula.js +147 -0
  185. package/dist/api/controllers/row/utils.js +6 -8
  186. package/dist/api/controllers/static/index.js +59 -10
  187. package/dist/api/controllers/table/bulkFormula.js +160 -0
  188. package/dist/api/controllers/table/index.js +12 -9
  189. package/dist/api/controllers/table/internal.js +9 -0
  190. package/dist/api/controllers/table/utils.js +56 -14
  191. package/dist/api/controllers/user.js +2 -0
  192. package/dist/api/routes/index.js +0 -2
  193. package/dist/api/routes/static.js +2 -1
  194. package/dist/automations/steps/createRow.js +2 -4
  195. package/dist/automations/steps/deleteRow.js +1 -4
  196. package/dist/constants/index.js +12 -5
  197. package/dist/db/linkedRows/index.js +4 -5
  198. package/dist/definitions/datasource.js +1 -0
  199. package/dist/environment.js +1 -0
  200. package/dist/integrations/base/sql.js +13 -6
  201. package/dist/integrations/googlesheets.js +340 -0
  202. package/dist/integrations/index.js +3 -0
  203. package/dist/integrations/utils.js +57 -8
  204. package/dist/middleware/authorized.js +55 -30
  205. package/dist/middleware/usageQuota.js +82 -13
  206. package/dist/migrations/usageQuotas/index.js +24 -0
  207. package/dist/migrations/usageQuotas/syncApps.js +26 -0
  208. package/dist/migrations/usageQuotas/syncRows.js +29 -0
  209. package/dist/package.json +8 -5
  210. package/dist/tests/utilities/TestConfiguration.js +10 -6
  211. package/dist/threads/query.js +4 -0
  212. package/dist/tsconfig.tsbuildinfo +1 -1
  213. package/dist/utilities/rowProcessor/index.js +18 -11
  214. package/dist/utilities/rowProcessor/utils.js +14 -4
  215. package/dist/utilities/{usageQuota.js → usageQuota/index.js} +44 -31
  216. package/dist/utilities/usageQuota/rows.js +77 -0
  217. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  218. package/dist/utilities/workerRequests.js +0 -20
  219. package/nodemon.json +1 -1
  220. package/package.json +9 -6
  221. package/src/api/controllers/application.js +52 -24
  222. package/src/api/controllers/auth.js +4 -0
  223. package/src/api/controllers/datasource.js +12 -0
  224. package/src/api/controllers/row/ExternalRequest.ts +1 -1
  225. package/src/api/controllers/row/internal.js +29 -50
  226. package/src/api/controllers/row/internalSearch.js +12 -4
  227. package/src/api/controllers/row/staticFormula.js +157 -0
  228. package/src/api/controllers/row/utils.js +6 -12
  229. package/src/api/controllers/static/index.js +63 -10
  230. package/src/api/controllers/table/bulkFormula.js +183 -0
  231. package/src/api/controllers/table/index.js +16 -24
  232. package/src/api/controllers/table/internal.js +9 -1
  233. package/src/api/controllers/table/utils.js +80 -11
  234. package/src/api/controllers/user.js +2 -0
  235. package/src/api/routes/index.js +0 -2
  236. package/src/api/routes/static.js +5 -0
  237. package/src/api/routes/tests/application.spec.js +2 -2
  238. package/src/api/routes/tests/auth.spec.js +1 -2
  239. package/src/api/routes/tests/static.spec.js +98 -0
  240. package/src/automations/steps/createRow.js +2 -4
  241. package/src/automations/steps/deleteRow.js +1 -4
  242. package/src/constants/index.js +17 -5
  243. package/src/db/linkedRows/index.js +4 -5
  244. package/src/definitions/common.ts +3 -0
  245. package/src/definitions/datasource.ts +3 -0
  246. package/src/environment.js +1 -0
  247. package/src/integrations/base/sql.ts +14 -7
  248. package/src/integrations/googlesheets.ts +353 -0
  249. package/src/integrations/index.ts +3 -0
  250. package/src/integrations/tests/sql.spec.js +16 -0
  251. package/src/integrations/utils.ts +71 -10
  252. package/src/middleware/authorized.js +64 -30
  253. package/src/middleware/tests/authorized.spec.js +6 -4
  254. package/src/middleware/tests/usageQuota.spec.js +18 -24
  255. package/src/middleware/usageQuota.js +93 -15
  256. package/src/migrations/tests/usageQuotas/index.spec.js +27 -0
  257. package/src/migrations/tests/usageQuotas/syncApps.spec.js +37 -0
  258. package/src/migrations/tests/usageQuotas/syncRows.spec.js +43 -0
  259. package/src/migrations/usageQuotas/index.js +24 -0
  260. package/src/migrations/usageQuotas/syncApps.js +18 -0
  261. package/src/migrations/usageQuotas/syncRows.js +21 -0
  262. package/src/tests/utilities/TestConfiguration.js +10 -6
  263. package/src/threads/query.js +5 -0
  264. package/src/utilities/rowProcessor/index.js +24 -12
  265. package/src/utilities/rowProcessor/utils.js +23 -7
  266. package/src/utilities/tests/usageQuota/usageQuota.spec.js +72 -0
  267. package/src/utilities/usageQuota/index.js +92 -0
  268. package/src/utilities/usageQuota/rows.js +74 -0
  269. package/src/utilities/usageQuota/usageQuoteReset.js +18 -0
  270. package/src/utilities/workerRequests.js +0 -23
  271. package/builder/assets/index.39e01193.css +0 -1
  272. package/dist/api/controllers/hosting.js +0 -30
  273. package/dist/api/routes/hosting.js +0 -11
  274. package/src/api/controllers/hosting.js +0 -22
  275. package/src/api/routes/hosting.js +0 -13
  276. package/src/api/routes/tests/hosting.spec.js +0 -36
  277. package/src/utilities/usageQuota.js +0 -73
@@ -0,0 +1,152 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for migrations/usageQuotas/index.js</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">migrations/usageQuotas</a> index.js</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>10/10</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>2/2</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>2/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>10/10</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ </div>
58
+ <div class='status-line high'></div>
59
+ <pre><table class="coverage">
60
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
+ <a name='L2'></a><a href='#L2'>2</a>
62
+ <a name='L3'></a><a href='#L3'>3</a>
63
+ <a name='L4'></a><a href='#L4'>4</a>
64
+ <a name='L5'></a><a href='#L5'>5</a>
65
+ <a name='L6'></a><a href='#L6'>6</a>
66
+ <a name='L7'></a><a href='#L7'>7</a>
67
+ <a name='L8'></a><a href='#L8'>8</a>
68
+ <a name='L9'></a><a href='#L9'>9</a>
69
+ <a name='L10'></a><a href='#L10'>10</a>
70
+ <a name='L11'></a><a href='#L11'>11</a>
71
+ <a name='L12'></a><a href='#L12'>12</a>
72
+ <a name='L13'></a><a href='#L13'>13</a>
73
+ <a name='L14'></a><a href='#L14'>14</a>
74
+ <a name='L15'></a><a href='#L15'>15</a>
75
+ <a name='L16'></a><a href='#L16'>16</a>
76
+ <a name='L17'></a><a href='#L17'>17</a>
77
+ <a name='L18'></a><a href='#L18'>18</a>
78
+ <a name='L19'></a><a href='#L19'>19</a>
79
+ <a name='L20'></a><a href='#L20'>20</a>
80
+ <a name='L21'></a><a href='#L21'>21</a>
81
+ <a name='L22'></a><a href='#L22'>22</a>
82
+ <a name='L23'></a><a href='#L23'>23</a>
83
+ <a name='L24'></a><a href='#L24'>24</a>
84
+ <a name='L25'></a><a href='#L25'>25</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
85
+ <span class="cline-any cline-neutral">&nbsp;</span>
86
+ <span class="cline-any cline-neutral">&nbsp;</span>
87
+ <span class="cline-any cline-neutral">&nbsp;</span>
88
+ <span class="cline-any cline-yes">25x</span>
89
+ <span class="cline-any cline-yes">25x</span>
90
+ <span class="cline-any cline-yes">25x</span>
91
+ <span class="cline-any cline-yes">25x</span>
92
+ <span class="cline-any cline-neutral">&nbsp;</span>
93
+ <span class="cline-any cline-yes">25x</span>
94
+ <span class="cline-any cline-yes">4x</span>
95
+ <span class="cline-any cline-yes">3x</span>
96
+ <span class="cline-any cline-neutral">&nbsp;</span>
97
+ <span class="cline-any cline-neutral">&nbsp;</span>
98
+ <span class="cline-any cline-neutral">&nbsp;</span>
99
+ <span class="cline-any cline-yes">1x</span>
100
+ <span class="cline-any cline-neutral">&nbsp;</span>
101
+ <span class="cline-any cline-neutral">&nbsp;</span>
102
+ <span class="cline-any cline-neutral">&nbsp;</span>
103
+ <span class="cline-any cline-yes">1x</span>
104
+ <span class="cline-any cline-yes">1x</span>
105
+ <span class="cline-any cline-neutral">&nbsp;</span>
106
+ <span class="cline-any cline-neutral">&nbsp;</span>
107
+ <span class="cline-any cline-neutral">&nbsp;</span>
108
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const {
109
+ MIGRATIONS,
110
+ MIGRATION_DBS,
111
+ migrateIfRequired,
112
+ } = require("@budibase/backend-core/migrations")
113
+ const { useQuotas } = require("../../utilities/usageQuota")
114
+ const syncApps = require("./syncApps")
115
+ const syncRows = require("./syncRows")
116
+ &nbsp;
117
+ exports.run = async () =&gt; {
118
+ if (!useQuotas()) {
119
+ return
120
+ }
121
+ &nbsp;
122
+ // Jan 2022
123
+ await migrateIfRequired(
124
+ MIGRATION_DBS.GLOBAL_DB,
125
+ MIGRATIONS.QUOTAS_1,
126
+ async () =&gt; {
127
+ await syncApps.run()
128
+ await syncRows.run()
129
+ }
130
+ )
131
+ }
132
+ &nbsp;</pre></td></tr></table></pre>
133
+
134
+ <div class='push'></div><!-- for sticky footer -->
135
+ </div><!-- /wrapper -->
136
+ <div class='footer quiet pad2 space-top1 center small'>
137
+ Code coverage generated by
138
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
139
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
140
+ </div>
141
+ </div>
142
+ <script src="../../prettify.js"></script>
143
+ <script>
144
+ window.onload = function () {
145
+ prettyPrint();
146
+ };
147
+ </script>
148
+ <script src="../../sorter.js"></script>
149
+ <script src="../../block-navigation.js"></script>
150
+ </body>
151
+ </html>
152
+
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for api/routes/hosting.js</title>
6
+ <title>Code coverage report for migrations/usageQuotas/syncApps.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">api/routes</a> hosting.js</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">migrations/usageQuotas</a> syncApps.js</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>7/7</span>
28
+ <span class='fraction'>13/13</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">50% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/0</span>
35
+ <span class='fraction'>1/2</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/0</span>
42
+ <span class='fraction'>1/1</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>7/7</span>
49
+ <span class='fraction'>13/13</span>
50
50
  </div>
51
51
 
52
52
 
@@ -70,32 +70,47 @@
70
70
  <a name='L11'></a><a href='#L11'>11</a>
71
71
  <a name='L12'></a><a href='#L12'>12</a>
72
72
  <a name='L13'></a><a href='#L13'>13</a>
73
- <a name='L14'></a><a href='#L14'>14</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">23x</span>
74
- <span class="cline-any cline-yes">23x</span>
75
- <span class="cline-any cline-yes">23x</span>
76
- <span class="cline-any cline-yes">23x</span>
77
- <span class="cline-any cline-neutral">&nbsp;</span>
78
- <span class="cline-any cline-yes">23x</span>
73
+ <a name='L14'></a><a href='#L14'>14</a>
74
+ <a name='L15'></a><a href='#L15'>15</a>
75
+ <a name='L16'></a><a href='#L16'>16</a>
76
+ <a name='L17'></a><a href='#L17'>17</a>
77
+ <a name='L18'></a><a href='#L18'>18</a>
78
+ <a name='L19'></a><a href='#L19'>19</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">25x</span>
79
+ <span class="cline-any cline-yes">25x</span>
80
+ <span class="cline-any cline-yes">25x</span>
81
+ <span class="cline-any cline-yes">25x</span>
79
82
  <span class="cline-any cline-neutral">&nbsp;</span>
80
- <span class="cline-any cline-yes">23x</span>
83
+ <span class="cline-any cline-yes">25x</span>
84
+ <span class="cline-any cline-yes">1x</span>
81
85
  <span class="cline-any cline-neutral">&nbsp;</span>
86
+ <span class="cline-any cline-yes">1x</span>
87
+ <span class="cline-any cline-yes">1x</span>
82
88
  <span class="cline-any cline-neutral">&nbsp;</span>
83
89
  <span class="cline-any cline-neutral">&nbsp;</span>
90
+ <span class="cline-any cline-yes">1x</span>
91
+ <span class="cline-any cline-yes">1x</span>
92
+ <span class="cline-any cline-yes">1x</span>
93
+ <span class="cline-any cline-yes">1x</span>
94
+ <span class="cline-any cline-yes">1x</span>
84
95
  <span class="cline-any cline-neutral">&nbsp;</span>
85
- <span class="cline-any cline-yes">23x</span>
86
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const Router = require("@koa/router")
87
- const controller = require("../controllers/hosting")
88
- const authorized = require("../../middleware/authorized")
89
- const { BUILDER } = require("@budibase/backend-core/permissions")
90
- &nbsp;
91
- const router = Router()
96
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy")
97
+ const { getAllApps } = require("@budibase/backend-core/db")
98
+ const CouchDB = require("../../db")
99
+ const { getUsageQuotaDoc } = require("../../utilities/usageQuota")
92
100
  &nbsp;
93
- router
94
- .get("/api/hosting/urls", authorized(BUILDER), controller.fetchUrls)
95
- // this isn't risky, doesn't return anything about apps other than names and URLs
96
- .get("/api/hosting/apps", controller.getDeployedApps)
101
+ exports.run = async () =&gt; {
102
+ const db = getGlobalDB()
103
+ // get app count
104
+ const devApps = await getAllApps(CouchDB, { dev: true })
105
+ const appCount = devApps ? devApps.length : <span class="branch-1 cbranch-no" title="branch not covered" >0</span>
97
106
  &nbsp;
98
- module.exports = router
107
+ // sync app count
108
+ const tenantId = getTenantId()
109
+ console.log(`[Tenant: ${tenantId}] Syncing app count: ${appCount}`)
110
+ const usageDoc = await getUsageQuotaDoc(db)
111
+ usageDoc.usageQuota.apps = appCount
112
+ await db.put(usageDoc)
113
+ }
99
114
  &nbsp;</pre></td></tr></table></pre>
100
115
 
101
116
  <div class='push'></div><!-- for sticky footer -->
@@ -103,7 +118,7 @@ module.exports = router
103
118
  <div class='footer quiet pad2 space-top1 center small'>
104
119
  Code coverage generated by
105
120
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
106
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
121
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
107
122
  </div>
108
123
  </div>
109
124
  <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 api/controllers/hosting.js</title>
6
+ <title>Code coverage report for migrations/usageQuotas/syncRows.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">api/controllers</a> hosting.js</h1>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">migrations/usageQuotas</a> syncRows.js</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">93.33% </span>
26
+ <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>14/15</span>
28
+ <span class='fraction'>17/17</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">75% </span>
33
+ <span class="strong">50% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>3/4</span>
35
+ <span class='fraction'>2/4</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">50% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>1/2</span>
42
+ <span class='fraction'>2/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">93.33% </span>
47
+ <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>14/15</span>
49
+ <span class='fraction'>16/16</span>
50
50
  </div>
51
51
 
52
52
 
@@ -78,50 +78,47 @@
78
78
  <a name='L19'></a><a href='#L19'>19</a>
79
79
  <a name='L20'></a><a href='#L20'>20</a>
80
80
  <a name='L21'></a><a href='#L21'>21</a>
81
- <a name='L22'></a><a href='#L22'>22</a>
82
- <a name='L23'></a><a href='#L23'>23</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">23x</span>
83
- <span class="cline-any cline-yes">23x</span>
84
- <span class="cline-any cline-yes">23x</span>
85
- <span class="cline-any cline-yes">23x</span>
86
- <span class="cline-any cline-yes">23x</span>
81
+ <a name='L22'></a><a href='#L22'>22</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">25x</span>
82
+ <span class="cline-any cline-yes">25x</span>
83
+ <span class="cline-any cline-yes">25x</span>
84
+ <span class="cline-any cline-yes">25x</span>
85
+ <span class="cline-any cline-yes">25x</span>
87
86
  <span class="cline-any cline-neutral">&nbsp;</span>
88
- <span class="cline-any cline-yes">23x</span>
87
+ <span class="cline-any cline-yes">25x</span>
89
88
  <span class="cline-any cline-yes">1x</span>
89
+ <span class="cline-any cline-neutral">&nbsp;</span>
90
90
  <span class="cline-any cline-yes">1x</span>
91
+ <span class="cline-any cline-yes">4x</span>
92
+ <span class="cline-any cline-yes">1x</span>
93
+ <span class="cline-any cline-yes">1x</span>
94
+ <span class="cline-any cline-neutral">&nbsp;</span>
95
+ <span class="cline-any cline-neutral">&nbsp;</span>
91
96
  <span class="cline-any cline-yes">1x</span>
92
97
  <span class="cline-any cline-yes">1x</span>
93
98
  <span class="cline-any cline-yes">1x</span>
94
99
  <span class="cline-any cline-yes">1x</span>
95
- <span class="cline-any cline-neutral">&nbsp;</span>
96
100
  <span class="cline-any cline-yes">1x</span>
97
101
  <span class="cline-any cline-neutral">&nbsp;</span>
98
- <span class="cline-any cline-neutral">&nbsp;</span>
99
- <span class="cline-any cline-neutral">&nbsp;</span>
100
- <span class="cline-any cline-neutral">&nbsp;</span>
101
- <span class="cline-any cline-yes">23x</span>
102
- <span class="cline-any cline-no">&nbsp;</span>
103
- <span class="cline-any cline-neutral">&nbsp;</span>
104
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const CouchDB = require("../../db")
105
- const { getDeployedApps } = require("../../utilities/workerRequests")
106
- const { getScopedConfig } = require("@budibase/backend-core/db")
107
- const { Configs } = require("@budibase/backend-core/constants")
108
- const { checkSlashesInUrl } = require("../../utilities")
102
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const { getGlobalDB, getTenantId } = require("@budibase/backend-core/tenancy")
103
+ const { getAllApps } = require("@budibase/backend-core/db")
104
+ const CouchDB = require("../../db")
105
+ const { getUsageQuotaDoc } = require("../../utilities/usageQuota")
106
+ const { getUniqueRows } = require("../../utilities/usageQuota/rows")
109
107
  &nbsp;
110
- exports.fetchUrls = async ctx =&gt; {
111
- const appId = ctx.appId
112
- const db = new CouchDB(appId)
113
- const settings = await getScopedConfig(db, { type: Configs.SETTINGS })
114
- let appUrl = "http://localhost:10000/app"
115
- if (settings &amp;&amp; settings["platformUrl"]) {
116
- appUrl = checkSlashesInUrl(`${settings["platformUrl"]}/app`)
117
- }
118
- ctx.body = {
119
- app: appUrl,
120
- }
121
- }
108
+ exports.run = async () =&gt; {
109
+ const db = getGlobalDB()
110
+ // get all rows in all apps
111
+ const allApps = await getAllApps(CouchDB, { all: true })
112
+ const appIds = allApps ? allApps.map(app =&gt; app.appId) : <span class="branch-1 cbranch-no" title="branch not covered" >[]</span>
113
+ const rows = await getUniqueRows(appIds)
114
+ const rowCount = rows ? rows.length : <span class="branch-1 cbranch-no" title="branch not covered" >0</span>
122
115
  &nbsp;
123
- exports.getDeployedApps = <span class="fstat-no" title="function not covered" >as</span>ync ctx =&gt; {
124
- <span class="cstat-no" title="statement not covered" > ctx.body = await getDeployedApps()</span>
116
+ // sync row count
117
+ const tenantId = getTenantId()
118
+ console.log(`[Tenant: ${tenantId}] Syncing row count: ${rowCount}`)
119
+ const usageDoc = await getUsageQuotaDoc(db)
120
+ usageDoc.usageQuota.rows = rowCount
121
+ await db.put(usageDoc)
125
122
  }
126
123
  &nbsp;</pre></td></tr></table></pre>
127
124
 
@@ -130,7 +127,7 @@ exports.getDeployedApps = <span class="fstat-no" title="function not covered" >a
130
127
  <div class='footer quiet pad2 space-top1 center small'>
131
128
  Code coverage generated by
132
129
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
133
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
130
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
134
131
  </div>
135
132
  </div>
136
133
  <script src="../../prettify.js"></script>
@@ -502,7 +502,7 @@ module.exports = (input, callback) =&gt; {
502
502
  <div class='footer quiet pad2 space-top1 center small'>
503
503
  Code coverage generated by
504
504
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
505
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
505
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
506
506
  </div>
507
507
  </div>
508
508
  <script src="../prettify.js"></script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">84.55% </span>
26
+ <span class="strong">84.29% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>219/259</span>
28
+ <span class='fraction'>220/261</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">63.71% </span>
33
+ <span class="strong">63.47% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>72/113</span>
35
+ <span class='fraction'>73/115</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">85.03% </span>
47
+ <span class="strong">84.76% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>216/254</span>
49
+ <span class='fraction'>217/256</span>
50
50
  </div>
51
51
 
52
52
 
@@ -104,17 +104,17 @@
104
104
 
105
105
  <tr>
106
106
  <td class="file high" data-value="query.js"><a href="query.js.html">query.js</a></td>
107
- <td data-value="87.06" 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="86.44" class="pic high">
108
+ <div class="chart"><div class="cover-fill" style="width: 86%"></div><div class="cover-empty" style="width: 14%"></div></div>
109
109
  </td>
110
- <td data-value="87.06" class="pct high">87.06%</td>
111
- <td data-value="116" class="abs high">101/116</td>
112
- <td data-value="68.96" class="pct medium">68.96%</td>
113
- <td data-value="58" class="abs medium">40/58</td>
110
+ <td data-value="86.44" class="pct high">86.44%</td>
111
+ <td data-value="118" class="abs high">102/118</td>
112
+ <td data-value="68.33" class="pct medium">68.33%</td>
113
+ <td data-value="60" class="abs medium">41/60</td>
114
114
  <td data-value="92.3" class="pct high">92.3%</td>
115
115
  <td data-value="13" class="abs high">12/13</td>
116
- <td data-value="87.5" class="pct high">87.5%</td>
117
- <td data-value="112" class="abs high">98/112</td>
116
+ <td data-value="86.84" class="pct high">86.84%</td>
117
+ <td data-value="114" class="abs high">99/114</td>
118
118
  </tr>
119
119
 
120
120
  <tr>
@@ -140,7 +140,7 @@
140
140
  <div class='footer quiet pad2 space-top1 center small'>
141
141
  Code coverage generated by
142
142
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
143
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
143
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
144
144
  </div>
145
145
  </div>
146
146
  <script src="../prettify.js"></script>
@@ -123,10 +123,10 @@
123
123
  <a name='L64'></a><a href='#L64'>64</a>
124
124
  <a name='L65'></a><a href='#L65'>65</a>
125
125
  <a name='L66'></a><a href='#L66'>66</a>
126
- <a name='L67'></a><a href='#L67'>67</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">34x</span>
127
- <span class="cline-any cline-yes">34x</span>
126
+ <a name='L67'></a><a href='#L67'>67</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">37x</span>
127
+ <span class="cline-any cline-yes">37x</span>
128
128
  <span class="cline-any cline-neutral">&nbsp;</span>
129
- <span class="cline-any cline-yes">34x</span>
129
+ <span class="cline-any cline-yes">37x</span>
130
130
  <span class="cline-any cline-neutral">&nbsp;</span>
131
131
  <span class="cline-any cline-neutral">&nbsp;</span>
132
132
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -148,14 +148,14 @@
148
148
  <span class="cline-any cline-neutral">&nbsp;</span>
149
149
  <span class="cline-any cline-neutral">&nbsp;</span>
150
150
  <span class="cline-any cline-neutral">&nbsp;</span>
151
- <span class="cline-any cline-yes">67x</span>
152
- <span class="cline-any cline-yes">67x</span>
153
- <span class="cline-any cline-yes">67x</span>
151
+ <span class="cline-any cline-yes">73x</span>
152
+ <span class="cline-any cline-yes">73x</span>
153
+ <span class="cline-any cline-yes">73x</span>
154
154
  <span class="cline-any cline-neutral">&nbsp;</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>
158
- <span class="cline-any cline-yes">67x</span>
158
+ <span class="cline-any cline-yes">73x</span>
159
159
  <span class="cline-any cline-no">&nbsp;</span>
160
160
  <span class="cline-any cline-neutral">&nbsp;</span>
161
161
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -187,8 +187,8 @@
187
187
  <span class="cline-any cline-neutral">&nbsp;</span>
188
188
  <span class="cline-any cline-neutral">&nbsp;</span>
189
189
  <span class="cline-any cline-neutral">&nbsp;</span>
190
- <span class="cline-any cline-yes">34x</span>
191
- <span class="cline-any cline-yes">34x</span>
190
+ <span class="cline-any cline-yes">37x</span>
191
+ <span class="cline-any cline-yes">37x</span>
192
192
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">const workerFarm = require("worker-farm")
193
193
  const env = require("../environment")
194
194
  &nbsp;
@@ -262,7 +262,7 @@ module.exports.ThreadType = ThreadType
262
262
  <div class='footer quiet pad2 space-top1 center small'>
263
263
  Code coverage generated by
264
264
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
265
- at Thu Jan 20 2022 19:58:26 GMT+0000 (Coordinated Universal Time)
265
+ at Mon Jan 31 2022 16:01:47 GMT+0000 (Coordinated Universal Time)
266
266
  </div>
267
267
  </div>
268
268
  <script src="../prettify.js"></script>