@actual-app/sync-server 26.3.0 → 26.4.0-nightly.20260305

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 (291) hide show
  1. package/build/.tsbuildinfo +1 -0
  2. package/build/app.d.ts +2 -0
  3. package/build/app.d.ts.map +1 -0
  4. package/build/bin/actual-server.d.ts +3 -0
  5. package/build/bin/actual-server.d.ts.map +1 -0
  6. package/build/bin/add-import-extensions.d.mts +3 -0
  7. package/build/bin/add-import-extensions.d.mts.map +1 -0
  8. package/build/migrations/1694360000000-create-folders.d.ts +3 -0
  9. package/build/migrations/1694360000000-create-folders.d.ts.map +1 -0
  10. package/build/migrations/1694360479680-create-account-db.d.ts +3 -0
  11. package/build/migrations/1694360479680-create-account-db.d.ts.map +1 -0
  12. package/build/migrations/1694362247011-create-secret-table.d.ts +3 -0
  13. package/build/migrations/1694362247011-create-secret-table.d.ts.map +1 -0
  14. package/build/migrations/1702667624000-rename-nordigen-secrets.d.ts +3 -0
  15. package/build/migrations/1702667624000-rename-nordigen-secrets.d.ts.map +1 -0
  16. package/build/migrations/1718889148000-openid.d.ts +3 -0
  17. package/build/migrations/1718889148000-openid.d.ts.map +1 -0
  18. package/build/migrations/1719409568000-multiuser.d.ts +3 -0
  19. package/build/migrations/1719409568000-multiuser.d.ts.map +1 -0
  20. package/build/migrations/1763873568237-server-global-prefs.d.ts +3 -0
  21. package/build/migrations/1763873568237-server-global-prefs.d.ts.map +1 -0
  22. package/build/migrations/1763873600000-backfill-files-owner.d.ts +3 -0
  23. package/build/migrations/1763873600000-backfill-files-owner.d.ts.map +1 -0
  24. package/build/src/account-db.d.ts +28 -0
  25. package/build/src/account-db.d.ts.map +1 -0
  26. package/build/src/accounts/openid.d.ts +22 -0
  27. package/build/src/accounts/openid.d.ts.map +1 -0
  28. package/build/src/accounts/password.d.ts +19 -0
  29. package/build/src/accounts/password.d.ts.map +1 -0
  30. package/build/src/app-account.d.ts +3 -0
  31. package/build/src/app-account.d.ts.map +1 -0
  32. package/build/src/app-account.test.d.ts +2 -0
  33. package/build/src/app-account.test.d.ts.map +1 -0
  34. package/build/src/app-admin.d.ts +3 -0
  35. package/build/src/app-admin.d.ts.map +1 -0
  36. package/build/src/app-admin.test.d.ts +2 -0
  37. package/build/src/app-admin.test.d.ts.map +1 -0
  38. package/build/src/app-cors-proxy.d.ts +4 -0
  39. package/build/src/app-cors-proxy.d.ts.map +1 -0
  40. package/build/src/app-cors-proxy.test.d.ts +2 -0
  41. package/build/src/app-cors-proxy.test.d.ts.map +1 -0
  42. package/build/src/app-gocardless/app-gocardless.d.ts +3 -0
  43. package/build/src/app-gocardless/app-gocardless.d.ts.map +1 -0
  44. package/build/src/app-gocardless/app-gocardless.js +1 -1
  45. package/build/src/app-gocardless/bank-factory.d.ts +4 -0
  46. package/build/src/app-gocardless/bank-factory.d.ts.map +1 -0
  47. package/build/src/app-gocardless/banks/abanca_caglesmm.d.ts +21 -0
  48. package/build/src/app-gocardless/banks/abanca_caglesmm.d.ts.map +1 -0
  49. package/build/src/app-gocardless/banks/abnamro_abnanl2a.d.ts +21 -0
  50. package/build/src/app-gocardless/banks/abnamro_abnanl2a.d.ts.map +1 -0
  51. package/build/src/app-gocardless/banks/american_express_aesudef1.d.ts +43 -0
  52. package/build/src/app-gocardless/banks/american_express_aesudef1.d.ts.map +1 -0
  53. package/build/src/app-gocardless/banks/bancsabadell_bsabesbbb.d.ts +21 -0
  54. package/build/src/app-gocardless/banks/bancsabadell_bsabesbbb.d.ts.map +1 -0
  55. package/build/src/app-gocardless/banks/bank.interface.d.ts +35 -0
  56. package/build/src/app-gocardless/banks/bank.interface.d.ts.map +1 -0
  57. package/build/src/app-gocardless/banks/bank_of_ireland_b365_bofiie2d.d.ts +21 -0
  58. package/build/src/app-gocardless/banks/bank_of_ireland_b365_bofiie2d.d.ts.map +1 -0
  59. package/build/src/app-gocardless/banks/bankinter_bkbkesmm.d.ts +21 -0
  60. package/build/src/app-gocardless/banks/bankinter_bkbkesmm.d.ts.map +1 -0
  61. package/build/src/app-gocardless/banks/belfius_gkccbebb.d.ts +21 -0
  62. package/build/src/app-gocardless/banks/belfius_gkccbebb.d.ts.map +1 -0
  63. package/build/src/app-gocardless/banks/berliner_sparkasse_beladebexxx.d.ts +29 -0
  64. package/build/src/app-gocardless/banks/berliner_sparkasse_beladebexxx.d.ts.map +1 -0
  65. package/build/src/app-gocardless/banks/bnp_be_gebabebb.d.ts +31 -0
  66. package/build/src/app-gocardless/banks/bnp_be_gebabebb.d.ts.map +1 -0
  67. package/build/src/app-gocardless/banks/boursobank_bousfrppxxx.d.ts +21 -0
  68. package/build/src/app-gocardless/banks/boursobank_bousfrppxxx.d.ts.map +1 -0
  69. package/build/src/app-gocardless/banks/bper_retail_bpmoit22.d.ts +4 -0
  70. package/build/src/app-gocardless/banks/bper_retail_bpmoit22.d.ts.map +1 -0
  71. package/build/src/app-gocardless/banks/cbc_cregbebb.d.ts +25 -0
  72. package/build/src/app-gocardless/banks/cbc_cregbebb.d.ts.map +1 -0
  73. package/build/src/app-gocardless/banks/cetelem_cetmptp1xxx.d.ts +24 -0
  74. package/build/src/app-gocardless/banks/cetelem_cetmptp1xxx.d.ts.map +1 -0
  75. package/build/src/app-gocardless/banks/commerzbank_cobadeff.d.ts +21 -0
  76. package/build/src/app-gocardless/banks/commerzbank_cobadeff.d.ts.map +1 -0
  77. package/build/src/app-gocardless/banks/danskebank_privat.d.ts +21 -0
  78. package/build/src/app-gocardless/banks/danskebank_privat.d.ts.map +1 -0
  79. package/build/src/app-gocardless/banks/direkt_heladef1822.d.ts +21 -0
  80. package/build/src/app-gocardless/banks/direkt_heladef1822.d.ts.map +1 -0
  81. package/build/src/app-gocardless/banks/easybank_bawaatww.d.ts +21 -0
  82. package/build/src/app-gocardless/banks/easybank_bawaatww.d.ts.map +1 -0
  83. package/build/src/app-gocardless/banks/entercard_swednokk.d.ts +21 -0
  84. package/build/src/app-gocardless/banks/entercard_swednokk.d.ts.map +1 -0
  85. package/build/src/app-gocardless/banks/fortuneo_ftnofrp1xxx.d.ts +21 -0
  86. package/build/src/app-gocardless/banks/fortuneo_ftnofrp1xxx.d.ts.map +1 -0
  87. package/build/src/app-gocardless/banks/hype_hyeeit22.d.ts +21 -0
  88. package/build/src/app-gocardless/banks/hype_hyeeit22.d.ts.map +1 -0
  89. package/build/src/app-gocardless/banks/ing_ingbrobu.d.ts +21 -0
  90. package/build/src/app-gocardless/banks/ing_ingbrobu.d.ts.map +1 -0
  91. package/build/src/app-gocardless/banks/ing_ingddeff.d.ts +21 -0
  92. package/build/src/app-gocardless/banks/ing_ingddeff.d.ts.map +1 -0
  93. package/build/src/app-gocardless/banks/ing_pl_ingbplpw.d.ts +21 -0
  94. package/build/src/app-gocardless/banks/ing_pl_ingbplpw.d.ts.map +1 -0
  95. package/build/src/app-gocardless/banks/integration-bank.d.ts +71 -0
  96. package/build/src/app-gocardless/banks/integration-bank.d.ts.map +1 -0
  97. package/build/src/app-gocardless/banks/isybank_itbbitmm.d.ts +21 -0
  98. package/build/src/app-gocardless/banks/isybank_itbbitmm.d.ts.map +1 -0
  99. package/build/src/app-gocardless/banks/kbc_kredbebb.d.ts +25 -0
  100. package/build/src/app-gocardless/banks/kbc_kredbebb.d.ts.map +1 -0
  101. package/build/src/app-gocardless/banks/lhv_lhvbee22.d.ts +21 -0
  102. package/build/src/app-gocardless/banks/lhv_lhvbee22.d.ts.map +1 -0
  103. package/build/src/app-gocardless/banks/mbank_retail_brexplpw.d.ts +37 -0
  104. package/build/src/app-gocardless/banks/mbank_retail_brexplpw.d.ts.map +1 -0
  105. package/build/src/app-gocardless/banks/nationwide_naiagb21.d.ts +21 -0
  106. package/build/src/app-gocardless/banks/nationwide_naiagb21.d.ts.map +1 -0
  107. package/build/src/app-gocardless/banks/nbg_ethngraaxxx.d.ts +34 -0
  108. package/build/src/app-gocardless/banks/nbg_ethngraaxxx.d.ts.map +1 -0
  109. package/build/src/app-gocardless/banks/norwegian_xx_norwnok1.d.ts +30 -0
  110. package/build/src/app-gocardless/banks/norwegian_xx_norwnok1.d.ts.map +1 -0
  111. package/build/src/app-gocardless/banks/raiffeisen_at_rzbaatww.d.ts +21 -0
  112. package/build/src/app-gocardless/banks/raiffeisen_at_rzbaatww.d.ts.map +1 -0
  113. package/build/src/app-gocardless/banks/revolut_revolt21.d.ts +21 -0
  114. package/build/src/app-gocardless/banks/revolut_revolt21.d.ts.map +1 -0
  115. package/build/src/app-gocardless/banks/sandboxfinance_sfin0000.d.ts +35 -0
  116. package/build/src/app-gocardless/banks/sandboxfinance_sfin0000.d.ts.map +1 -0
  117. package/build/src/app-gocardless/banks/seb_kort_bank_ab.d.ts +33 -0
  118. package/build/src/app-gocardless/banks/seb_kort_bank_ab.d.ts.map +1 -0
  119. package/build/src/app-gocardless/banks/seb_privat.d.ts +21 -0
  120. package/build/src/app-gocardless/banks/seb_privat.d.ts.map +1 -0
  121. package/build/src/app-gocardless/banks/sparnord_spnodk22.d.ts +24 -0
  122. package/build/src/app-gocardless/banks/sparnord_spnodk22.d.ts.map +1 -0
  123. package/build/src/app-gocardless/banks/spk_karlsruhe_karsde66.d.ts +29 -0
  124. package/build/src/app-gocardless/banks/spk_karlsruhe_karsde66.d.ts.map +1 -0
  125. package/build/src/app-gocardless/banks/spk_marburg_biedenkopf_heladef1mar.d.ts +21 -0
  126. package/build/src/app-gocardless/banks/spk_marburg_biedenkopf_heladef1mar.d.ts.map +1 -0
  127. package/build/src/app-gocardless/banks/spk_worms_alzey_ried_malade51wor.d.ts +21 -0
  128. package/build/src/app-gocardless/banks/spk_worms_alzey_ried_malade51wor.d.ts.map +1 -0
  129. package/build/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.d.ts +21 -0
  130. package/build/src/app-gocardless/banks/ssk_dusseldorf_dussdeddxxx.d.ts.map +1 -0
  131. package/build/src/app-gocardless/banks/ssk_munchen.d.ts +29 -0
  132. package/build/src/app-gocardless/banks/ssk_munchen.d.ts.map +1 -0
  133. package/build/src/app-gocardless/banks/swedbank_habalv22.d.ts +24 -0
  134. package/build/src/app-gocardless/banks/swedbank_habalv22.d.ts.map +1 -0
  135. package/build/src/app-gocardless/banks/tests/abanca_caglesmm.spec.d.ts +2 -0
  136. package/build/src/app-gocardless/banks/tests/abanca_caglesmm.spec.d.ts.map +1 -0
  137. package/build/src/app-gocardless/banks/tests/abnamro_abnanl2a.spec.d.ts +2 -0
  138. package/build/src/app-gocardless/banks/tests/abnamro_abnanl2a.spec.d.ts.map +1 -0
  139. package/build/src/app-gocardless/banks/tests/bancsabadell_bsabesbbb.spec.d.ts +2 -0
  140. package/build/src/app-gocardless/banks/tests/bancsabadell_bsabesbbb.spec.d.ts.map +1 -0
  141. package/build/src/app-gocardless/banks/tests/belfius_gkccbebb.spec.d.ts +2 -0
  142. package/build/src/app-gocardless/banks/tests/belfius_gkccbebb.spec.d.ts.map +1 -0
  143. package/build/src/app-gocardless/banks/tests/boursobank_bousfrppxxx.spec.d.ts +2 -0
  144. package/build/src/app-gocardless/banks/tests/boursobank_bousfrppxxx.spec.d.ts.map +1 -0
  145. package/build/src/app-gocardless/banks/tests/bper_retail_bpmoit22.spec.d.ts +2 -0
  146. package/build/src/app-gocardless/banks/tests/bper_retail_bpmoit22.spec.d.ts.map +1 -0
  147. package/build/src/app-gocardless/banks/tests/cbc_cregbebb.spec.d.ts +2 -0
  148. package/build/src/app-gocardless/banks/tests/cbc_cregbebb.spec.d.ts.map +1 -0
  149. package/build/src/app-gocardless/banks/tests/commerzbank_cobadeff.spec.d.ts +2 -0
  150. package/build/src/app-gocardless/banks/tests/commerzbank_cobadeff.spec.d.ts.map +1 -0
  151. package/build/src/app-gocardless/banks/tests/easybank_bawaatww.spec.d.ts +2 -0
  152. package/build/src/app-gocardless/banks/tests/easybank_bawaatww.spec.d.ts.map +1 -0
  153. package/build/src/app-gocardless/banks/tests/fortuneo_ftnofrp1xxx.spec.d.ts +2 -0
  154. package/build/src/app-gocardless/banks/tests/fortuneo_ftnofrp1xxx.spec.d.ts.map +1 -0
  155. package/build/src/app-gocardless/banks/tests/ing_ingddeff.spec.d.ts +2 -0
  156. package/build/src/app-gocardless/banks/tests/ing_ingddeff.spec.d.ts.map +1 -0
  157. package/build/src/app-gocardless/banks/tests/ing_pl_ingbplpw.spec.d.ts +2 -0
  158. package/build/src/app-gocardless/banks/tests/ing_pl_ingbplpw.spec.d.ts.map +1 -0
  159. package/build/src/app-gocardless/banks/tests/integration_bank.spec.d.ts +2 -0
  160. package/build/src/app-gocardless/banks/tests/integration_bank.spec.d.ts.map +1 -0
  161. package/build/src/app-gocardless/banks/tests/kbc_kredbebb.spec.d.ts +2 -0
  162. package/build/src/app-gocardless/banks/tests/kbc_kredbebb.spec.d.ts.map +1 -0
  163. package/build/src/app-gocardless/banks/tests/lhv_lhvbee22.spec.d.ts +2 -0
  164. package/build/src/app-gocardless/banks/tests/lhv_lhvbee22.spec.d.ts.map +1 -0
  165. package/build/src/app-gocardless/banks/tests/mbank_retail_brexplpw.spec.d.ts +2 -0
  166. package/build/src/app-gocardless/banks/tests/mbank_retail_brexplpw.spec.d.ts.map +1 -0
  167. package/build/src/app-gocardless/banks/tests/nationwide_naiagb21.spec.d.ts +2 -0
  168. package/build/src/app-gocardless/banks/tests/nationwide_naiagb21.spec.d.ts.map +1 -0
  169. package/build/src/app-gocardless/banks/tests/nbg_ethngraaxxx.spec.d.ts +2 -0
  170. package/build/src/app-gocardless/banks/tests/nbg_ethngraaxxx.spec.d.ts.map +1 -0
  171. package/build/src/app-gocardless/banks/tests/raiffeisen_at_rzbaatww.spec.d.ts +2 -0
  172. package/build/src/app-gocardless/banks/tests/raiffeisen_at_rzbaatww.spec.d.ts.map +1 -0
  173. package/build/src/app-gocardless/banks/tests/revolut_revolt21.spec.d.ts +2 -0
  174. package/build/src/app-gocardless/banks/tests/revolut_revolt21.spec.d.ts.map +1 -0
  175. package/build/src/app-gocardless/banks/tests/sandboxfinance_sfin0000.spec.d.ts +2 -0
  176. package/build/src/app-gocardless/banks/tests/sandboxfinance_sfin0000.spec.d.ts.map +1 -0
  177. package/build/src/app-gocardless/banks/tests/spk_marburg_biedenkopf_heladef1mar.spec.d.ts +2 -0
  178. package/build/src/app-gocardless/banks/tests/spk_marburg_biedenkopf_heladef1mar.spec.d.ts.map +1 -0
  179. package/build/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.d.ts +2 -0
  180. package/build/src/app-gocardless/banks/tests/ssk_dusseldorf_dussdeddxxx.spec.d.ts.map +1 -0
  181. package/build/src/app-gocardless/banks/tests/swedbank_habalv22.spec.d.ts +2 -0
  182. package/build/src/app-gocardless/banks/tests/swedbank_habalv22.spec.d.ts.map +1 -0
  183. package/build/src/app-gocardless/banks/tests/virgin_nrnbgb22.spec.d.ts +2 -0
  184. package/build/src/app-gocardless/banks/tests/virgin_nrnbgb22.spec.d.ts.map +1 -0
  185. package/build/src/app-gocardless/banks/util/escape-regexp.d.ts +2 -0
  186. package/build/src/app-gocardless/banks/util/escape-regexp.d.ts.map +1 -0
  187. package/build/src/app-gocardless/banks/util/extract-payeeName-from-remittanceInfo.d.ts +21 -0
  188. package/build/src/app-gocardless/banks/util/extract-payeeName-from-remittanceInfo.d.ts.map +1 -0
  189. package/build/src/app-gocardless/banks/virgin_nrnbgb22.d.ts +21 -0
  190. package/build/src/app-gocardless/banks/virgin_nrnbgb22.d.ts.map +1 -0
  191. package/build/src/app-gocardless/errors.d.ts +44 -0
  192. package/build/src/app-gocardless/errors.d.ts.map +1 -0
  193. package/build/src/app-gocardless/gocardless-node.types.d.ts +399 -0
  194. package/build/src/app-gocardless/gocardless-node.types.d.ts.map +1 -0
  195. package/build/src/app-gocardless/gocardless.types.d.ts +72 -0
  196. package/build/src/app-gocardless/gocardless.types.d.ts.map +1 -0
  197. package/build/src/app-gocardless/services/gocardless-service.d.ts +83 -0
  198. package/build/src/app-gocardless/services/gocardless-service.d.ts.map +1 -0
  199. package/build/src/app-gocardless/services/tests/fixtures.d.ts +73 -0
  200. package/build/src/app-gocardless/services/tests/fixtures.d.ts.map +1 -0
  201. package/build/src/app-gocardless/services/tests/gocardless-service.spec.d.ts +2 -0
  202. package/build/src/app-gocardless/services/tests/gocardless-service.spec.d.ts.map +1 -0
  203. package/build/src/app-gocardless/tests/bank-factory.spec.d.ts +2 -0
  204. package/build/src/app-gocardless/tests/bank-factory.spec.d.ts.map +1 -0
  205. package/build/src/app-gocardless/tests/utils.spec.d.ts +2 -0
  206. package/build/src/app-gocardless/tests/utils.spec.d.ts.map +1 -0
  207. package/build/src/app-gocardless/util/handle-error.d.ts +2 -0
  208. package/build/src/app-gocardless/util/handle-error.d.ts.map +1 -0
  209. package/build/src/app-gocardless/utils.d.ts +4 -0
  210. package/build/src/app-gocardless/utils.d.ts.map +1 -0
  211. package/build/src/app-openid.d.ts +3 -0
  212. package/build/src/app-openid.d.ts.map +1 -0
  213. package/build/src/app-pluggyai/app-pluggyai.d.ts +3 -0
  214. package/build/src/app-pluggyai/app-pluggyai.d.ts.map +1 -0
  215. package/build/src/app-pluggyai/pluggyai-service.d.ts +8 -0
  216. package/build/src/app-pluggyai/pluggyai-service.d.ts.map +1 -0
  217. package/build/src/app-secrets.d.ts +3 -0
  218. package/build/src/app-secrets.d.ts.map +1 -0
  219. package/build/src/app-simplefin/app-simplefin.d.ts +3 -0
  220. package/build/src/app-simplefin/app-simplefin.d.ts.map +1 -0
  221. package/build/src/app-sync/errors.d.ts +9 -0
  222. package/build/src/app-sync/errors.d.ts.map +1 -0
  223. package/build/src/app-sync/services/files-service.d.ts +62 -0
  224. package/build/src/app-sync/services/files-service.d.ts.map +1 -0
  225. package/build/src/app-sync/tests/services/files-service.test.d.ts +2 -0
  226. package/build/src/app-sync/tests/services/files-service.test.d.ts.map +1 -0
  227. package/build/src/app-sync/validation.d.ts +3 -0
  228. package/build/src/app-sync/validation.d.ts.map +1 -0
  229. package/build/src/app-sync.d.ts +3 -0
  230. package/build/src/app-sync.d.ts.map +1 -0
  231. package/build/src/app-sync.js +1 -5
  232. package/build/src/app-sync.test.d.ts +2 -0
  233. package/build/src/app-sync.test.d.ts.map +1 -0
  234. package/build/src/app-sync.test.js +20 -12
  235. package/build/src/app.d.ts +2 -0
  236. package/build/src/app.d.ts.map +1 -0
  237. package/build/src/config-types.d.ts +42 -0
  238. package/build/src/config-types.d.ts.map +1 -0
  239. package/build/src/db.d.ts +35 -0
  240. package/build/src/db.d.ts.map +1 -0
  241. package/build/src/load-config.d.ts +362 -0
  242. package/build/src/load-config.d.ts.map +1 -0
  243. package/build/src/load-config.test.d.ts +2 -0
  244. package/build/src/load-config.test.d.ts.map +1 -0
  245. package/build/src/migrations.d.ts +2 -0
  246. package/build/src/migrations.d.ts.map +1 -0
  247. package/build/src/scripts/disable-openid.d.ts +2 -0
  248. package/build/src/scripts/disable-openid.d.ts.map +1 -0
  249. package/build/src/scripts/enable-openid.d.ts +2 -0
  250. package/build/src/scripts/enable-openid.d.ts.map +1 -0
  251. package/build/src/scripts/health-check.d.ts +2 -0
  252. package/build/src/scripts/health-check.d.ts.map +1 -0
  253. package/build/src/scripts/reset-password.d.ts +2 -0
  254. package/build/src/scripts/reset-password.d.ts.map +1 -0
  255. package/build/src/scripts/run-migrations.d.ts +2 -0
  256. package/build/src/scripts/run-migrations.d.ts.map +1 -0
  257. package/build/src/secrets.test.d.ts +2 -0
  258. package/build/src/secrets.test.d.ts.map +1 -0
  259. package/build/src/services/secrets-service.d.ts +19 -0
  260. package/build/src/services/secrets-service.d.ts.map +1 -0
  261. package/build/src/services/user-service.d.ts +23 -0
  262. package/build/src/services/user-service.d.ts.map +1 -0
  263. package/build/src/sync-simple.d.ts +5 -0
  264. package/build/src/sync-simple.d.ts.map +1 -0
  265. package/build/src/util/hash.d.ts +2 -0
  266. package/build/src/util/hash.d.ts.map +1 -0
  267. package/build/src/util/hash.js +1 -1
  268. package/build/src/util/middlewares.d.ts +6 -0
  269. package/build/src/util/middlewares.d.ts.map +1 -0
  270. package/build/src/util/middlewares.js +0 -11
  271. package/build/src/util/paths.d.ts +7 -0
  272. package/build/src/util/paths.d.ts.map +1 -0
  273. package/build/src/util/paths.js +4 -2
  274. package/build/src/util/payee-name.d.ts +3 -0
  275. package/build/src/util/payee-name.d.ts.map +1 -0
  276. package/build/src/util/payee-name.js +4 -4
  277. package/build/src/util/prompt.d.ts +3 -0
  278. package/build/src/util/prompt.d.ts.map +1 -0
  279. package/build/src/util/prompt.js +3 -2
  280. package/build/src/util/title/index.d.ts +4 -0
  281. package/build/src/util/title/index.d.ts.map +1 -0
  282. package/build/src/util/title/lower-case.d.ts +2 -0
  283. package/build/src/util/title/lower-case.d.ts.map +1 -0
  284. package/build/src/util/title/specials.d.ts +2 -0
  285. package/build/src/util/title/specials.d.ts.map +1 -0
  286. package/build/src/util/types.d.ts +4 -0
  287. package/build/src/util/types.d.ts.map +1 -0
  288. package/build/src/util/types.js +1 -0
  289. package/build/src/util/validate-user.d.ts +5 -0
  290. package/build/src/util/validate-user.d.ts.map +1 -0
  291. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-error.d.ts","sourceRoot":"","sources":["../../../../src/app-gocardless/util/handle-error.js"],"names":[],"mappings":"AAAA,yCACU,QAAG,EAAE,QAAG,UAYjB"}
@@ -0,0 +1,4 @@
1
+ export function printIban(account: any): string;
2
+ export function sortByBookingDateOrValueDate(transactions?: any[]): any[];
3
+ export function amountToInteger(n: any): number;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/app-gocardless/utils.js"],"names":[],"mappings":"AAAO,gDAMN;AA2BM,0EASH;AAEG,gDAAgD"}
@@ -0,0 +1,3 @@
1
+ export { app as handlers };
2
+ declare const app: import("express-serve-static-core").Express;
3
+ //# sourceMappingURL=app-openid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-openid.d.ts","sourceRoot":"","sources":["../../src/app-openid.js"],"names":[],"mappings":";AAYA,+DAAsB"}
@@ -0,0 +1,3 @@
1
+ export { app as handlers };
2
+ declare const app: import("express-serve-static-core").Express;
3
+ //# sourceMappingURL=app-pluggyai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-pluggyai.d.ts","sourceRoot":"","sources":["../../../src/app-pluggyai/app-pluggyai.js"],"names":[],"mappings":";AAWA,+DAAsB"}
@@ -0,0 +1,8 @@
1
+ export namespace pluggyaiService {
2
+ function isConfigured(): boolean;
3
+ function getAccountsByItemId(itemId: any): Promise<any>;
4
+ function getAccountById(accountId: any): Promise<any>;
5
+ function getTransactionsByAccountId(accountId: any, startDate: any, pageSize: any, page: any): Promise<any>;
6
+ function getTransactions(accountId: any, startDate: any): Promise<any[]>;
7
+ }
8
+ //# sourceMappingURL=pluggyai-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluggyai-service.d.ts","sourceRoot":"","sources":["../../../src/app-pluggyai/pluggyai-service.js"],"names":[],"mappings":";IAqBgB,iCAMb;IAEoB,wDAepB;IACe,sDAaf;IAE2B,4GAoC3B;IACgB,yEAqBhB"}
@@ -0,0 +1,3 @@
1
+ export { app as handlers };
2
+ declare const app: import("express-serve-static-core").Express;
3
+ //# sourceMappingURL=app-secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-secrets.d.ts","sourceRoot":"","sources":["../../src/app-secrets.js"],"names":[],"mappings":";AASA,+DAAsB"}
@@ -0,0 +1,3 @@
1
+ export { app as handlers };
2
+ declare const app: import("express-serve-static-core").Express;
3
+ //# sourceMappingURL=app-simplefin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-simplefin.d.ts","sourceRoot":"","sources":["../../../src/app-simplefin/app-simplefin.js"],"names":[],"mappings":";AAWA,+DAAsB"}
@@ -0,0 +1,9 @@
1
+ export class FileNotFound extends Error {
2
+ constructor(params?: {});
3
+ details: {};
4
+ }
5
+ export class GenericFileError extends Error {
6
+ constructor(message: any, params?: {});
7
+ details: {};
8
+ }
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/app-sync/errors.js"],"names":[],"mappings":"AAAA;IACE,yBAGC;IADC,YAAqB;CAExB;AAED;IACE,uCAGC;IADC,YAAqB;CAExB"}
@@ -0,0 +1,62 @@
1
+ export const filesService: FilesService;
2
+ export class FilesService {
3
+ constructor(accountDb: any);
4
+ accountDb: any;
5
+ get(fileId: any): File;
6
+ set(file: any): void;
7
+ find({ userId, limit }: {
8
+ userId: any;
9
+ limit?: number;
10
+ }): any;
11
+ findUsersWithAccess(fileId: any): any;
12
+ update(id: any, fileUpdate: any): File;
13
+ getRaw(fileId: any): any;
14
+ validate(rawFile: any): File;
15
+ }
16
+ export class File extends FileBase {
17
+ constructor({ id, name, groupId, encryptSalt, encryptTest, encryptKeyId, encryptMeta, syncVersion, deleted, owner, }: {
18
+ id: any;
19
+ name?: any;
20
+ groupId?: any;
21
+ encryptSalt?: any;
22
+ encryptTest?: any;
23
+ encryptKeyId?: any;
24
+ encryptMeta?: any;
25
+ syncVersion?: any;
26
+ deleted?: boolean;
27
+ owner?: any;
28
+ });
29
+ id: any;
30
+ }
31
+ /**
32
+ * Represents a file update. Will only update the fields that are defined.
33
+ * @class
34
+ * @extends FileBase
35
+ */
36
+ export class FileUpdate extends FileBase {
37
+ constructor({ name, groupId, encryptSalt, encryptTest, encryptKeyId, encryptMeta, syncVersion, deleted, owner, }: {
38
+ name?: any;
39
+ groupId?: any;
40
+ encryptSalt?: any;
41
+ encryptTest?: any;
42
+ encryptKeyId?: any;
43
+ encryptMeta?: any;
44
+ syncVersion?: any;
45
+ deleted?: any;
46
+ owner?: any;
47
+ });
48
+ }
49
+ declare class FileBase {
50
+ constructor(name: any, groupId: any, encryptSalt: any, encryptTest: any, encryptKeyId: any, encryptMeta: any, syncVersion: any, deleted: any, owner: any);
51
+ name: any;
52
+ groupId: any;
53
+ encryptSalt: any;
54
+ encryptTest: any;
55
+ encryptKeyId: any;
56
+ encryptMeta: any;
57
+ syncVersion: any;
58
+ deleted: boolean;
59
+ owner: any;
60
+ }
61
+ export {};
62
+ //# sourceMappingURL=files-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files-service.d.ts","sourceRoot":"","sources":["../../../../src/app-sync/services/files-service.js"],"names":[],"mappings":"AAgPA,wCAAsD;AAtJtD;IACE,4BAEC;IADC,eAA0B;IAG5B,uBAOC;IAED,qBAiBC;IAED;;;YAsBC;IAED,sCAkBC;IAED,uCAmDC;IAED,yBAEC;IAED,6BAaC;CACF;AAnND;IACE;;;;;;;;;;;OAwBC;IADC,QAAY;CAEf;AAED;;;;GAIG;AACH;IACE;;;;;;;;;;OAsBC;CACF;AAjFD;IACE,0JAoBC;IATC,UAAgB;IAChB,aAAsB;IACtB,iBAA8B;IAC9B,iBAA8B;IAC9B,kBAAgC;IAChC,iBAA8B;IAC9B,iBAA8B;IAC9B,iBAAwE;IACxE,WAAkB;CAErB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=files-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files-service.test.d.ts","sourceRoot":"","sources":["../../../../../src/app-sync/tests/services/files-service.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export function validateSyncedFile(groupId: any, keyId: any, currentFile: any): "file-old-version" | "file-needs-upload" | "file-key-mismatch" | "file-has-reset" | "file-has-new-key";
2
+ export function validateUploadedFile(groupId: any, keyId: any, currentFile: any): "file-has-reset" | "file-has-new-key";
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/app-sync/validation.js"],"names":[],"mappings":"AAMA,uLAwCC;AAED,wHA0BC"}
@@ -0,0 +1,3 @@
1
+ declare const app: import("express-serve-static-core").Express;
2
+ export { app as handlers };
3
+ //# sourceMappingURL=app-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sync.d.ts","sourceRoot":"","sources":["../../src/app-sync.ts"],"names":[],"mappings":"AAkCA,QAAA,MAAM,GAAG,6CAAY,CAAC;AAkBtB,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC"}
@@ -13,7 +13,7 @@ import { config } from './load-config.js';
13
13
  import * as UserService from './services/user-service.js';
14
14
  import * as simpleSync from './sync-simple.js';
15
15
  import { errorMiddleware, requestLoggerMiddleware, validateSessionMiddleware, } from './util/middlewares.js';
16
- import { getPathForGroupFile, getPathForUserFile } from './util/paths.js';
16
+ import { getPathForGroupFile, getPathForUserFile, isValidFileId, } from './util/paths.js';
17
17
  const app = express();
18
18
  app.use(validateSessionMiddleware);
19
19
  app.use(errorMiddleware);
@@ -29,13 +29,9 @@ app.use(express.raw({
29
29
  app.use(express.json({ limit: `${config.get('upload.fileSizeLimitMB')}mb` }));
30
30
  export { app as handlers };
31
31
  const OK_RESPONSE = { status: 'ok' };
32
- const FILE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
33
32
  function boolToInt(deleted) {
34
33
  return deleted ? 1 : 0;
35
34
  }
36
- function isValidFileId(fileId) {
37
- return typeof fileId === 'string' && FILE_ID_PATTERN.test(fileId);
38
- }
39
35
  const verifyFileExists = (fileId, filesService, res, errorObject) => {
40
36
  try {
41
37
  return filesService.get(fileId);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=app-sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sync.test.d.ts","sourceRoot":"","sources":["../../src/app-sync.test.ts"],"names":[],"mappings":""}
@@ -5,7 +5,7 @@ import { SyncProtoBuf } from '@actual-app/crdt';
5
5
  import request from 'supertest';
6
6
  import { getAccountDb } from './account-db.js';
7
7
  import { handlers as app } from './app-sync.js';
8
- import { getPathForUserFile } from './util/paths.js';
8
+ import { getPathForUserFile, isValidFileId } from './util/paths.js';
9
9
  const ADMIN_ROLE = 'ADMIN';
10
10
  const OTHER_USER_ID = 'otherUser';
11
11
  const createUser = (userId, userName, role, owner = 0, enabled = 1) => {
@@ -14,6 +14,13 @@ const createUser = (userId, userName, role, owner = 0, enabled = 1) => {
14
14
  const deleteUser = (userId) => {
15
15
  getAccountDb().mutate('DELETE FROM users WHERE id = ?', [userId]);
16
16
  };
17
+ function generateFileId() {
18
+ const id = crypto.randomBytes(16).toString('hex');
19
+ if (!isValidFileId(id)) {
20
+ throw new Error('Generated fileId is invalid');
21
+ }
22
+ return id;
23
+ }
17
24
  describe('/user-get-key', () => {
18
25
  it('returns 401 if the user is not authenticated', async () => {
19
26
  const res = await request(app).post('/user-get-key');
@@ -277,7 +284,7 @@ describe('/upload-user-file', () => {
277
284
  expect(res.text).toBe('invalid fileId');
278
285
  });
279
286
  it('uploads a new file successfully', async () => {
280
- const fileId = crypto.randomBytes(16).toString('hex');
287
+ const fileId = generateFileId();
281
288
  const fileName = 'test-file.txt';
282
289
  const fileContent = 'test file content';
283
290
  const fileContentBuffer = Buffer.from(fileContent);
@@ -322,7 +329,7 @@ describe('/upload-user-file', () => {
322
329
  expect(writtenContent).toEqual(fileContent);
323
330
  });
324
331
  it('uploads and updates an existing file successfully', async () => {
325
- const fileId = crypto.randomBytes(16).toString('hex');
332
+ const fileId = generateFileId();
326
333
  const oldGroupId = null; //sync state was reset
327
334
  const oldFileName = 'old-test-file.txt';
328
335
  const newFileName = 'new-test-file.txt';
@@ -421,7 +428,7 @@ describe('/upload-user-file', () => {
421
428
  expect(res.text).toEqual('file-has-new-key');
422
429
  });
423
430
  it('returns 403 when non-owner overwrites another user file', async () => {
424
- const fileId = crypto.randomBytes(16).toString('hex');
431
+ const fileId = generateFileId();
425
432
  const groupId = 'group-id';
426
433
  const keyId = 'key-id';
427
434
  const syncVersion = 2;
@@ -455,7 +462,7 @@ describe('/upload-user-file', () => {
455
462
  expect(res.text).toEqual('file-access-not-allowed');
456
463
  });
457
464
  it("allows an admin to overwrite another user's file", async () => {
458
- const fileId = crypto.randomBytes(16).toString('hex');
465
+ const fileId = generateFileId();
459
466
  const groupId = 'admin-upload-group-id';
460
467
  const keyId = 'key-id';
461
468
  const syncVersion = 2;
@@ -543,16 +550,17 @@ describe('/download-user-file', () => {
543
550
  expect(res.statusCode).toEqual(404);
544
551
  });
545
552
  it('returns an attachment file', async () => {
553
+ const fileId = generateFileId();
546
554
  const fileContent = 'content';
547
- fs.writeFileSync(getPathForUserFile('file-id'), fileContent);
548
- getAccountDb().mutate('INSERT INTO files (id, deleted) VALUES (?, FALSE)', ['file-id']);
555
+ fs.writeFileSync(getPathForUserFile(fileId), fileContent);
556
+ getAccountDb().mutate('INSERT INTO files (id, deleted) VALUES (?, FALSE)', [fileId]);
549
557
  const res = await request(app)
550
558
  .get('/download-user-file')
551
559
  .set('x-actual-token', 'valid-token')
552
- .set('x-actual-file-id', 'file-id');
560
+ .set('x-actual-file-id', fileId);
553
561
  expect(res.statusCode).toEqual(200);
554
562
  expect(res.headers).toEqual(expect.objectContaining({
555
- 'content-disposition': 'attachment;filename=file-id',
563
+ 'content-disposition': `attachment;filename=${fileId}`,
556
564
  'content-type': 'application/octet-stream',
557
565
  }));
558
566
  expect(res.body).toBeInstanceOf(Buffer);
@@ -560,7 +568,7 @@ describe('/download-user-file', () => {
560
568
  });
561
569
  describe('access control', () => {
562
570
  it('returns 403 when non-owner downloads another user file', async () => {
563
- const fileId = crypto.randomBytes(16).toString('hex');
571
+ const fileId = generateFileId();
564
572
  const fileContent = 'sensitive content';
565
573
  fs.writeFileSync(getPathForUserFile(fileId), fileContent);
566
574
  getAccountDb().mutate('INSERT INTO files (id, deleted, owner) VALUES (?, FALSE, ?)', [fileId, OTHER_USER_ID]);
@@ -578,7 +586,7 @@ describe('/download-user-file', () => {
578
586
  expect(res.text).toEqual('file-access-not-allowed');
579
587
  });
580
588
  it("allows an admin to download another user's file", async () => {
581
- const fileId = crypto.randomBytes(16).toString('hex');
589
+ const fileId = generateFileId();
582
590
  const fileContent = 'admin-downloaded content';
583
591
  fs.writeFileSync(getPathForUserFile(fileId), fileContent);
584
592
  getAccountDb().mutate('INSERT INTO files (id, deleted, owner) VALUES (?, FALSE, ?)', [fileId, OTHER_USER_ID]);
@@ -599,7 +607,7 @@ describe('/download-user-file', () => {
599
607
  it('allows non-owner with user_access to download via requireFileAccess (UserService.countUserAccess > 0)', async () => {
600
608
  // File owned by another user; access granted only via user_access row, not owner/admin.
601
609
  // This exercises the requireFileAccess branch that uses UserService.countUserAccess.
602
- const fileId = crypto.randomBytes(16).toString('hex');
610
+ const fileId = generateFileId();
603
611
  const fileContent = 'shared-user content';
604
612
  fs.writeFileSync(getPathForUserFile(fileId), fileContent);
605
613
  getAccountDb().mutate('INSERT INTO files (id, deleted, owner) VALUES (?, FALSE, ?)', [fileId, OTHER_USER_ID]);
@@ -0,0 +1,2 @@
1
+ export declare function run(): Promise<void>;
2
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/app.ts"],"names":[],"mappings":"AA6KA,wBAAsB,GAAG,kBAqCxB"}
@@ -0,0 +1,42 @@
1
+ import type { ServerOptions } from 'https';
2
+ type LoginMethod = 'password' | 'header' | 'openid';
3
+ export type Config = {
4
+ mode: 'test' | 'development';
5
+ loginMethod?: LoginMethod;
6
+ allowedLoginMethods: LoginMethod[];
7
+ trustedProxies: string[];
8
+ trustedAuthProxies?: string[];
9
+ dataDir: string;
10
+ projectRoot: string;
11
+ port: number;
12
+ hostname: string;
13
+ serverFiles: string;
14
+ userFiles: string;
15
+ webRoot: string;
16
+ https?: {
17
+ key: string;
18
+ cert: string;
19
+ } & ServerOptions;
20
+ upload?: {
21
+ fileSizeSyncLimitMB: number;
22
+ syncEncryptedFileSizeLimitMB: number;
23
+ fileSizeLimitMB: number;
24
+ };
25
+ openId?: {
26
+ issuer: string | {
27
+ name: string;
28
+ authorization_endpoint: string;
29
+ token_endpoint: string;
30
+ userinfo_endpoint: string;
31
+ };
32
+ client_id: string;
33
+ client_secret: string;
34
+ server_hostname: string;
35
+ authMethod?: 'openid' | 'oauth2';
36
+ };
37
+ token_expiration?: 'never' | 'openid-provider' | number;
38
+ enforceOpenId: boolean;
39
+ userCreationMode?: 'manual' | 'login';
40
+ };
41
+ export {};
42
+ //# sourceMappingURL=config-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-types.d.ts","sourceRoot":"","sources":["../../src/config-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,KAAK,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpD,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mBAAmB,EAAE,WAAW,EAAE,CAAC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,aAAa,CAAC;IAClB,MAAM,CAAC,EAAE;QACP,mBAAmB,EAAE,MAAM,CAAC;QAC5B,4BAA4B,EAAE,MAAM,CAAC;QACrC,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,MAAM,EACF,MAAM,GACN;YACE,IAAI,EAAE,MAAM,CAAC;YACb,sBAAsB,EAAE,MAAM,CAAC;YAC/B,cAAc,EAAE,MAAM,CAAC;YACvB,iBAAiB,EAAE,MAAM,CAAC;SAC3B,CAAC;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAClC,CAAC;IACF,gBAAgB,CAAC,EAAE,OAAO,GAAG,iBAAiB,GAAG,MAAM,CAAC;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CACvC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** @param {string} filename */
2
+ export function openDatabase(filename: string): WrappedDatabase;
3
+ declare class WrappedDatabase {
4
+ constructor(db: any);
5
+ db: any;
6
+ /**
7
+ * @param {string} sql
8
+ * @param {string[]} params
9
+ */
10
+ all(sql: string, params?: string[]): any;
11
+ /**
12
+ * @param {string} sql
13
+ * @param {string[]} params
14
+ */
15
+ first(sql: string, params?: string[]): any;
16
+ /**
17
+ * @param {string} sql
18
+ */
19
+ exec(sql: string): any;
20
+ /**
21
+ * @param {string} sql
22
+ * @param {string[]} params
23
+ */
24
+ mutate(sql: string, params?: string[]): {
25
+ changes: any;
26
+ insertId: any;
27
+ };
28
+ /**
29
+ * @param {() => void} fn
30
+ */
31
+ transaction(fn: () => void): any;
32
+ close(): void;
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db.js"],"names":[],"mappings":"AAsDA,+BAA+B;AAC/B,uCADY,MAAM,mBAGjB;AAvDD;IACE,qBAEC;IADC,QAAY;IAGd;;;OAGG;IACH,SAHW,MAAM,WACN,MAAM,EAAE,OAKlB;IAED;;;OAGG;IACH,WAHW,MAAM,WACN,MAAM,EAAE,OAKlB;IAED;;OAEG;IACH,UAFW,MAAM,OAIhB;IAED;;;OAGG;IACH,YAHW,MAAM,WACN,MAAM,EAAE;;;MAMlB;IAED;;OAEG;IACH,gBAFW,MAAM,IAAI,OAIpB;IAED,cAEC;CACF"}