@oxyhq/services 5.27.0 → 6.0.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 (1159) hide show
  1. package/README.md +113 -484
  2. package/lib/commonjs/index.js +82 -607
  3. package/lib/commonjs/index.js.map +1 -1
  4. package/lib/commonjs/ui/client.js +0 -7
  5. package/lib/commonjs/ui/client.js.map +1 -1
  6. package/lib/commonjs/ui/components/SignInModal.js +2 -2
  7. package/lib/commonjs/ui/components/SignInModal.js.map +1 -1
  8. package/lib/commonjs/ui/context/OxyContext.js +13 -16
  9. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  10. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +6 -7
  11. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  12. package/lib/commonjs/ui/context/hooks/useDeviceManagement.js +2 -2
  13. package/lib/commonjs/ui/context/hooks/useDeviceManagement.js.map +1 -1
  14. package/lib/commonjs/ui/context/hooks/useLanguageManagement.js +7 -7
  15. package/lib/commonjs/ui/context/hooks/useLanguageManagement.js.map +1 -1
  16. package/lib/commonjs/ui/context/hooks/useSessionManagement.js +3 -3
  17. package/lib/commonjs/ui/context/hooks/useSessionManagement.js.map +1 -1
  18. package/lib/commonjs/ui/hooks/useDeviceManagement.js +2 -2
  19. package/lib/commonjs/ui/hooks/useDeviceManagement.js.map +1 -1
  20. package/lib/commonjs/ui/hooks/useI18n.js +2 -2
  21. package/lib/commonjs/ui/hooks/useI18n.js.map +1 -1
  22. package/lib/commonjs/ui/hooks/useLanguageManagement.js +7 -7
  23. package/lib/commonjs/ui/hooks/useLanguageManagement.js.map +1 -1
  24. package/lib/commonjs/ui/hooks/useSessionManagement.js +3 -3
  25. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  26. package/lib/commonjs/ui/hooks/useSessionSocket.js +9 -10
  27. package/lib/commonjs/ui/hooks/useSessionSocket.js.map +1 -1
  28. package/lib/commonjs/ui/index.js +1 -11
  29. package/lib/commonjs/ui/index.js.map +1 -1
  30. package/lib/commonjs/ui/screens/AccountCenterScreen.js +3 -3
  31. package/lib/commonjs/ui/screens/AccountCenterScreen.js.map +1 -1
  32. package/lib/commonjs/ui/screens/AppInfoScreen.js +13 -13
  33. package/lib/commonjs/ui/screens/AppInfoScreen.js.map +1 -1
  34. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js +2 -2
  35. package/lib/commonjs/ui/screens/EditProfileFieldScreen.js.map +1 -1
  36. package/lib/commonjs/ui/screens/FeedbackScreen.js +2 -2
  37. package/lib/commonjs/ui/screens/FeedbackScreen.js.map +1 -1
  38. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js +3 -3
  39. package/lib/commonjs/ui/screens/LanguageSelectorScreen.js.map +1 -1
  40. package/lib/commonjs/ui/screens/OxyAuthScreen.js +2 -2
  41. package/lib/commonjs/ui/screens/OxyAuthScreen.js.map +1 -1
  42. package/lib/commonjs/ui/screens/ProfileScreen.js +3 -3
  43. package/lib/commonjs/ui/screens/ProfileScreen.js.map +1 -1
  44. package/lib/commonjs/ui/screens/UserListScreen.js +2 -2
  45. package/lib/commonjs/ui/screens/UserListScreen.js.map +1 -1
  46. package/lib/commonjs/ui/server.js +1 -11
  47. package/lib/commonjs/ui/server.js.map +1 -1
  48. package/lib/commonjs/ui/stores/authStore.js +2 -2
  49. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  50. package/lib/commonjs/ui/utils/colorUtils.js +8 -8
  51. package/lib/commonjs/ui/utils/colorUtils.js.map +1 -1
  52. package/lib/commonjs/ui/utils/themeUtils.js +6 -6
  53. package/lib/commonjs/ui/utils/themeUtils.js.map +1 -1
  54. package/lib/module/index.js +30 -75
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/ui/client.js +0 -2
  57. package/lib/module/ui/client.js.map +1 -1
  58. package/lib/module/ui/components/SignInModal.js +1 -1
  59. package/lib/module/ui/components/SignInModal.js.map +1 -1
  60. package/lib/module/ui/context/OxyContext.js +4 -4
  61. package/lib/module/ui/context/OxyContext.js.map +1 -1
  62. package/lib/module/ui/context/hooks/useAuthOperations.js +2 -2
  63. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  64. package/lib/module/ui/context/hooks/useDeviceManagement.js +1 -1
  65. package/lib/module/ui/context/hooks/useDeviceManagement.js.map +1 -1
  66. package/lib/module/ui/context/hooks/useLanguageManagement.js +1 -1
  67. package/lib/module/ui/context/hooks/useLanguageManagement.js.map +1 -1
  68. package/lib/module/ui/context/hooks/useSessionManagement.js +1 -1
  69. package/lib/module/ui/context/hooks/useSessionManagement.js.map +1 -1
  70. package/lib/module/ui/hooks/useDeviceManagement.js +1 -1
  71. package/lib/module/ui/hooks/useDeviceManagement.js.map +1 -1
  72. package/lib/module/ui/hooks/useI18n.js +1 -1
  73. package/lib/module/ui/hooks/useI18n.js.map +1 -1
  74. package/lib/module/ui/hooks/useLanguageManagement.js +1 -1
  75. package/lib/module/ui/hooks/useLanguageManagement.js.map +1 -1
  76. package/lib/module/ui/hooks/useSessionManagement.js +1 -1
  77. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  78. package/lib/module/ui/hooks/useSessionSocket.js +2 -2
  79. package/lib/module/ui/hooks/useSessionSocket.js.map +1 -1
  80. package/lib/module/ui/index.js +0 -2
  81. package/lib/module/ui/index.js.map +1 -1
  82. package/lib/module/ui/screens/AccountCenterScreen.js +1 -1
  83. package/lib/module/ui/screens/AccountCenterScreen.js.map +1 -1
  84. package/lib/module/ui/screens/AppInfoScreen.js +1 -1
  85. package/lib/module/ui/screens/AppInfoScreen.js.map +1 -1
  86. package/lib/module/ui/screens/EditProfileFieldScreen.js +1 -1
  87. package/lib/module/ui/screens/EditProfileFieldScreen.js.map +1 -1
  88. package/lib/module/ui/screens/FeedbackScreen.js +1 -1
  89. package/lib/module/ui/screens/FeedbackScreen.js.map +1 -1
  90. package/lib/module/ui/screens/LanguageSelectorScreen.js +1 -1
  91. package/lib/module/ui/screens/LanguageSelectorScreen.js.map +1 -1
  92. package/lib/module/ui/screens/OxyAuthScreen.js +1 -1
  93. package/lib/module/ui/screens/OxyAuthScreen.js.map +1 -1
  94. package/lib/module/ui/screens/ProfileScreen.js +1 -1
  95. package/lib/module/ui/screens/ProfileScreen.js.map +1 -1
  96. package/lib/module/ui/screens/UserListScreen.js +1 -1
  97. package/lib/module/ui/screens/UserListScreen.js.map +1 -1
  98. package/lib/module/ui/server.js +0 -2
  99. package/lib/module/ui/server.js.map +1 -1
  100. package/lib/module/ui/stores/authStore.js +1 -1
  101. package/lib/module/ui/stores/authStore.js.map +1 -1
  102. package/lib/module/ui/utils/colorUtils.js +1 -1
  103. package/lib/module/ui/utils/colorUtils.js.map +1 -1
  104. package/lib/module/ui/utils/themeUtils.js +1 -1
  105. package/lib/module/ui/utils/themeUtils.js.map +1 -1
  106. package/lib/typescript/commonjs/index.d.ts +18 -35
  107. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  108. package/lib/typescript/commonjs/ui/client.d.ts +0 -2
  109. package/lib/typescript/commonjs/ui/client.d.ts.map +1 -1
  110. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts +1 -1
  111. package/lib/typescript/commonjs/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  112. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts +1 -1
  113. package/lib/typescript/commonjs/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  114. package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts +1 -1
  115. package/lib/typescript/commonjs/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  116. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +3 -3
  117. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  118. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +3 -3
  119. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  120. package/lib/typescript/commonjs/ui/context/hooks/useDeviceManagement.d.ts +2 -2
  121. package/lib/typescript/commonjs/ui/context/hooks/useDeviceManagement.d.ts.map +1 -1
  122. package/lib/typescript/commonjs/ui/context/hooks/useLanguageManagement.d.ts +2 -2
  123. package/lib/typescript/commonjs/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
  124. package/lib/typescript/commonjs/ui/context/hooks/useSessionManagement.d.ts +3 -3
  125. package/lib/typescript/commonjs/ui/context/hooks/useSessionManagement.d.ts.map +1 -1
  126. package/lib/typescript/commonjs/ui/hooks/mutations/mutationFactory.d.ts +1 -1
  127. package/lib/typescript/commonjs/ui/hooks/mutations/mutationFactory.d.ts.map +1 -1
  128. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
  129. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  130. package/lib/typescript/commonjs/ui/hooks/queries/useSecurityQueries.d.ts +1 -1
  131. package/lib/typescript/commonjs/ui/hooks/queries/useSecurityQueries.d.ts.map +1 -1
  132. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts +1 -1
  133. package/lib/typescript/commonjs/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  134. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts +2 -2
  135. package/lib/typescript/commonjs/ui/hooks/useAssets.d.ts.map +1 -1
  136. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +1 -1
  137. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  138. package/lib/typescript/commonjs/ui/hooks/useDeviceManagement.d.ts +2 -2
  139. package/lib/typescript/commonjs/ui/hooks/useDeviceManagement.d.ts.map +1 -1
  140. package/lib/typescript/commonjs/ui/hooks/useFileDownloadUrl.d.ts +1 -1
  141. package/lib/typescript/commonjs/ui/hooks/useFileDownloadUrl.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/ui/hooks/useFileFiltering.d.ts +1 -1
  143. package/lib/typescript/commonjs/ui/hooks/useFileFiltering.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/ui/hooks/useLanguageManagement.d.ts +2 -2
  145. package/lib/typescript/commonjs/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  146. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts +3 -3
  147. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  148. package/lib/typescript/commonjs/ui/hooks/useStorage.d.ts +1 -1
  149. package/lib/typescript/commonjs/ui/hooks/useStorage.d.ts.map +1 -1
  150. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts +2 -2
  151. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts.map +1 -1
  152. package/lib/typescript/commonjs/ui/index.d.ts +0 -2
  153. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  154. package/lib/typescript/commonjs/ui/server.d.ts +0 -2
  155. package/lib/typescript/commonjs/ui/server.d.ts.map +1 -1
  156. package/lib/typescript/commonjs/ui/stores/accountStore.d.ts +1 -1
  157. package/lib/typescript/commonjs/ui/stores/accountStore.d.ts.map +1 -1
  158. package/lib/typescript/commonjs/ui/stores/assetStore.d.ts +1 -1
  159. package/lib/typescript/commonjs/ui/stores/assetStore.d.ts.map +1 -1
  160. package/lib/typescript/commonjs/ui/stores/authStore.d.ts +1 -1
  161. package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
  162. package/lib/typescript/commonjs/ui/stores/fileStore.d.ts +1 -1
  163. package/lib/typescript/commonjs/ui/stores/fileStore.d.ts.map +1 -1
  164. package/lib/typescript/commonjs/ui/stores/followStore.d.ts +1 -1
  165. package/lib/typescript/commonjs/ui/stores/followStore.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/ui/types/fileManagement.d.ts +1 -1
  167. package/lib/typescript/commonjs/ui/types/fileManagement.d.ts.map +1 -1
  168. package/lib/typescript/commonjs/ui/utils/authHelpers.d.ts +1 -1
  169. package/lib/typescript/commonjs/ui/utils/authHelpers.d.ts.map +1 -1
  170. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts +2 -2
  171. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts.map +1 -1
  172. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts +1 -1
  173. package/lib/typescript/commonjs/ui/utils/colorUtils.d.ts.map +1 -1
  174. package/lib/typescript/commonjs/ui/utils/errorHandlers.d.ts +1 -1
  175. package/lib/typescript/commonjs/ui/utils/errorHandlers.d.ts.map +1 -1
  176. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts +1 -1
  177. package/lib/typescript/commonjs/ui/utils/fileManagement.d.ts.map +1 -1
  178. package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts +1 -1
  179. package/lib/typescript/commonjs/ui/utils/sessionHelpers.d.ts.map +1 -1
  180. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts +2 -2
  181. package/lib/typescript/commonjs/ui/utils/themeUtils.d.ts.map +1 -1
  182. package/lib/typescript/module/index.d.ts +18 -35
  183. package/lib/typescript/module/index.d.ts.map +1 -1
  184. package/lib/typescript/module/ui/client.d.ts +0 -2
  185. package/lib/typescript/module/ui/client.d.ts.map +1 -1
  186. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts +1 -1
  187. package/lib/typescript/module/ui/components/fileManagement/FileDetailsModal.d.ts.map +1 -1
  188. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts +1 -1
  189. package/lib/typescript/module/ui/components/fileManagement/FileViewer.d.ts.map +1 -1
  190. package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts +1 -1
  191. package/lib/typescript/module/ui/components/photogrid/JustifiedPhotoGrid.d.ts.map +1 -1
  192. package/lib/typescript/module/ui/context/OxyContext.d.ts +3 -3
  193. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  194. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +3 -3
  195. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  196. package/lib/typescript/module/ui/context/hooks/useDeviceManagement.d.ts +2 -2
  197. package/lib/typescript/module/ui/context/hooks/useDeviceManagement.d.ts.map +1 -1
  198. package/lib/typescript/module/ui/context/hooks/useLanguageManagement.d.ts +2 -2
  199. package/lib/typescript/module/ui/context/hooks/useLanguageManagement.d.ts.map +1 -1
  200. package/lib/typescript/module/ui/context/hooks/useSessionManagement.d.ts +3 -3
  201. package/lib/typescript/module/ui/context/hooks/useSessionManagement.d.ts.map +1 -1
  202. package/lib/typescript/module/ui/hooks/mutations/mutationFactory.d.ts +1 -1
  203. package/lib/typescript/module/ui/hooks/mutations/mutationFactory.d.ts.map +1 -1
  204. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts +1 -1
  205. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  206. package/lib/typescript/module/ui/hooks/queries/useSecurityQueries.d.ts +1 -1
  207. package/lib/typescript/module/ui/hooks/queries/useSecurityQueries.d.ts.map +1 -1
  208. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts +1 -1
  209. package/lib/typescript/module/ui/hooks/queries/useServicesQueries.d.ts.map +1 -1
  210. package/lib/typescript/module/ui/hooks/useAssets.d.ts +2 -2
  211. package/lib/typescript/module/ui/hooks/useAssets.d.ts.map +1 -1
  212. package/lib/typescript/module/ui/hooks/useAuth.d.ts +1 -1
  213. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  214. package/lib/typescript/module/ui/hooks/useDeviceManagement.d.ts +2 -2
  215. package/lib/typescript/module/ui/hooks/useDeviceManagement.d.ts.map +1 -1
  216. package/lib/typescript/module/ui/hooks/useFileDownloadUrl.d.ts +1 -1
  217. package/lib/typescript/module/ui/hooks/useFileDownloadUrl.d.ts.map +1 -1
  218. package/lib/typescript/module/ui/hooks/useFileFiltering.d.ts +1 -1
  219. package/lib/typescript/module/ui/hooks/useFileFiltering.d.ts.map +1 -1
  220. package/lib/typescript/module/ui/hooks/useLanguageManagement.d.ts +2 -2
  221. package/lib/typescript/module/ui/hooks/useLanguageManagement.d.ts.map +1 -1
  222. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts +3 -3
  223. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  224. package/lib/typescript/module/ui/hooks/useStorage.d.ts +1 -1
  225. package/lib/typescript/module/ui/hooks/useStorage.d.ts.map +1 -1
  226. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts +2 -2
  227. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts.map +1 -1
  228. package/lib/typescript/module/ui/index.d.ts +0 -2
  229. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  230. package/lib/typescript/module/ui/server.d.ts +0 -2
  231. package/lib/typescript/module/ui/server.d.ts.map +1 -1
  232. package/lib/typescript/module/ui/stores/accountStore.d.ts +1 -1
  233. package/lib/typescript/module/ui/stores/accountStore.d.ts.map +1 -1
  234. package/lib/typescript/module/ui/stores/assetStore.d.ts +1 -1
  235. package/lib/typescript/module/ui/stores/assetStore.d.ts.map +1 -1
  236. package/lib/typescript/module/ui/stores/authStore.d.ts +1 -1
  237. package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
  238. package/lib/typescript/module/ui/stores/fileStore.d.ts +1 -1
  239. package/lib/typescript/module/ui/stores/fileStore.d.ts.map +1 -1
  240. package/lib/typescript/module/ui/stores/followStore.d.ts +1 -1
  241. package/lib/typescript/module/ui/stores/followStore.d.ts.map +1 -1
  242. package/lib/typescript/module/ui/types/fileManagement.d.ts +1 -1
  243. package/lib/typescript/module/ui/types/fileManagement.d.ts.map +1 -1
  244. package/lib/typescript/module/ui/utils/authHelpers.d.ts +1 -1
  245. package/lib/typescript/module/ui/utils/authHelpers.d.ts.map +1 -1
  246. package/lib/typescript/module/ui/utils/avatarUtils.d.ts +2 -2
  247. package/lib/typescript/module/ui/utils/avatarUtils.d.ts.map +1 -1
  248. package/lib/typescript/module/ui/utils/colorUtils.d.ts +1 -1
  249. package/lib/typescript/module/ui/utils/colorUtils.d.ts.map +1 -1
  250. package/lib/typescript/module/ui/utils/errorHandlers.d.ts +1 -1
  251. package/lib/typescript/module/ui/utils/errorHandlers.d.ts.map +1 -1
  252. package/lib/typescript/module/ui/utils/fileManagement.d.ts +1 -1
  253. package/lib/typescript/module/ui/utils/fileManagement.d.ts.map +1 -1
  254. package/lib/typescript/module/ui/utils/sessionHelpers.d.ts +1 -1
  255. package/lib/typescript/module/ui/utils/sessionHelpers.d.ts.map +1 -1
  256. package/lib/typescript/module/ui/utils/themeUtils.d.ts +2 -2
  257. package/lib/typescript/module/ui/utils/themeUtils.d.ts.map +1 -1
  258. package/package.json +38 -152
  259. package/src/index.ts +56 -254
  260. package/src/ui/client.ts +0 -4
  261. package/src/ui/components/SignInModal.tsx +1 -1
  262. package/src/ui/components/fileManagement/FileDetailsModal.tsx +1 -1
  263. package/src/ui/components/fileManagement/FileViewer.tsx +1 -1
  264. package/src/ui/components/photogrid/JustifiedPhotoGrid.tsx +1 -1
  265. package/src/ui/context/OxyContext.tsx +6 -6
  266. package/src/ui/context/hooks/useAuthOperations.ts +5 -5
  267. package/src/ui/context/hooks/useDeviceManagement.ts +3 -3
  268. package/src/ui/context/hooks/useLanguageManagement.ts +2 -2
  269. package/src/ui/context/hooks/useSessionManagement.ts +4 -4
  270. package/src/ui/hooks/mutations/mutationFactory.ts +1 -1
  271. package/src/ui/hooks/mutations/useAccountMutations.ts +1 -1
  272. package/src/ui/hooks/mutations/useServicesMutations.ts +1 -1
  273. package/src/ui/hooks/queries/useAccountQueries.ts +1 -1
  274. package/src/ui/hooks/queries/useSecurityQueries.ts +1 -1
  275. package/src/ui/hooks/queries/useServicesQueries.ts +1 -1
  276. package/src/ui/hooks/useAssets.ts +7 -7
  277. package/src/ui/hooks/useAuth.ts +1 -1
  278. package/src/ui/hooks/useDeviceManagement.ts +3 -3
  279. package/src/ui/hooks/useFileDownloadUrl.ts +1 -1
  280. package/src/ui/hooks/useFileFiltering.ts +1 -1
  281. package/src/ui/hooks/useI18n.ts +1 -1
  282. package/src/ui/hooks/useLanguageManagement.ts +2 -2
  283. package/src/ui/hooks/useSessionManagement.ts +4 -4
  284. package/src/ui/hooks/useSessionSocket.ts +2 -2
  285. package/src/ui/hooks/useStorage.ts +1 -1
  286. package/src/ui/hooks/useWebSSO.ts +2 -2
  287. package/src/ui/index.ts +0 -3
  288. package/src/ui/screens/AccountCenterScreen.tsx +1 -1
  289. package/src/ui/screens/AccountSwitcherScreen.tsx +2 -2
  290. package/src/ui/screens/AppInfoScreen.tsx +1 -1
  291. package/src/ui/screens/EditProfileFieldScreen.tsx +1 -1
  292. package/src/ui/screens/FeedbackScreen.tsx +1 -1
  293. package/src/ui/screens/FileManagementScreen.tsx +1 -1
  294. package/src/ui/screens/LanguageSelectorScreen.tsx +1 -1
  295. package/src/ui/screens/OxyAuthScreen.tsx +1 -1
  296. package/src/ui/screens/PrivacySettingsScreen.tsx +1 -1
  297. package/src/ui/screens/ProfileScreen.tsx +2 -2
  298. package/src/ui/screens/SearchSettingsScreen.tsx +1 -1
  299. package/src/ui/screens/SessionManagementScreen.tsx +1 -1
  300. package/src/ui/screens/UserListScreen.tsx +2 -2
  301. package/src/ui/server.ts +0 -4
  302. package/src/ui/stores/accountStore.ts +1 -1
  303. package/src/ui/stores/assetStore.ts +1 -1
  304. package/src/ui/stores/authStore.ts +2 -2
  305. package/src/ui/stores/fileStore.ts +1 -1
  306. package/src/ui/stores/followStore.ts +1 -1
  307. package/src/ui/types/fileManagement.ts +1 -1
  308. package/src/ui/types/navigation.ts +2 -2
  309. package/src/ui/utils/authHelpers.ts +1 -1
  310. package/src/ui/utils/avatarUtils.ts +2 -2
  311. package/src/ui/utils/colorUtils.ts +1 -1
  312. package/src/ui/utils/errorHandlers.ts +1 -1
  313. package/src/ui/utils/fileManagement.ts +1 -1
  314. package/src/ui/utils/sessionHelpers.ts +1 -1
  315. package/src/ui/utils/themeUtils.ts +2 -2
  316. package/dist/web/oxy-services.esm.js +0 -2
  317. package/dist/web/oxy-services.esm.js.map +0 -1
  318. package/dist/web/types/assets/icons/OxyServices.d.ts +0 -28
  319. package/dist/web/types/assets/illustrations/HighFive.d.ts +0 -8
  320. package/dist/web/types/constants/version.d.ts +0 -13
  321. package/dist/web/types/core/AuthManager.d.ts +0 -143
  322. package/dist/web/types/core/CrossDomainAuth.d.ts +0 -160
  323. package/dist/web/types/core/HttpService.d.ts +0 -163
  324. package/dist/web/types/core/OxyServices.base.d.ts +0 -126
  325. package/dist/web/types/core/OxyServices.d.ts +0 -81
  326. package/dist/web/types/core/OxyServices.errors.d.ts +0 -11
  327. package/dist/web/types/core/index.d.ts +0 -20
  328. package/dist/web/types/core/mixins/OxyServices.analytics.d.ts +0 -66
  329. package/dist/web/types/core/mixins/OxyServices.assets.d.ts +0 -135
  330. package/dist/web/types/core/mixins/OxyServices.auth.d.ts +0 -186
  331. package/dist/web/types/core/mixins/OxyServices.developer.d.ts +0 -99
  332. package/dist/web/types/core/mixins/OxyServices.devices.d.ts +0 -96
  333. package/dist/web/types/core/mixins/OxyServices.features.d.ts +0 -228
  334. package/dist/web/types/core/mixins/OxyServices.fedcm.d.ts +0 -200
  335. package/dist/web/types/core/mixins/OxyServices.karma.d.ts +0 -85
  336. package/dist/web/types/core/mixins/OxyServices.language.d.ts +0 -81
  337. package/dist/web/types/core/mixins/OxyServices.location.d.ts +0 -64
  338. package/dist/web/types/core/mixins/OxyServices.payment.d.ts +0 -111
  339. package/dist/web/types/core/mixins/OxyServices.popup.d.ts +0 -205
  340. package/dist/web/types/core/mixins/OxyServices.privacy.d.ts +0 -122
  341. package/dist/web/types/core/mixins/OxyServices.redirect.d.ts +0 -245
  342. package/dist/web/types/core/mixins/OxyServices.security.d.ts +0 -78
  343. package/dist/web/types/core/mixins/OxyServices.user.d.ts +0 -184
  344. package/dist/web/types/core/mixins/OxyServices.utility.d.ts +0 -93
  345. package/dist/web/types/core/mixins/index.d.ts +0 -30
  346. package/dist/web/types/core/mixins/mixinHelpers.d.ts +0 -31
  347. package/dist/web/types/crypto/index.d.ts +0 -11
  348. package/dist/web/types/crypto/keyManager.d.ts +0 -189
  349. package/dist/web/types/crypto/polyfill.d.ts +0 -12
  350. package/dist/web/types/crypto/recoveryPhrase.d.ts +0 -58
  351. package/dist/web/types/crypto/signatureService.d.ts +0 -86
  352. package/dist/web/types/i18n/index.d.ts +0 -3
  353. package/dist/web/types/index.d.ts +0 -62
  354. package/dist/web/types/lib/sonner-safe.d.ts +0 -8
  355. package/dist/web/types/lib/sonner.d.ts +0 -11
  356. package/dist/web/types/lib/sonner.web.d.ts +0 -14
  357. package/dist/web/types/models/interfaces.d.ts +0 -415
  358. package/dist/web/types/models/session.d.ts +0 -27
  359. package/dist/web/types/node/index.d.ts +0 -9
  360. package/dist/web/types/shared/index.d.ts +0 -28
  361. package/dist/web/types/shared/utils/colorUtils.d.ts +0 -104
  362. package/dist/web/types/shared/utils/debugUtils.d.ts +0 -48
  363. package/dist/web/types/shared/utils/errorUtils.d.ts +0 -97
  364. package/dist/web/types/shared/utils/index.d.ts +0 -13
  365. package/dist/web/types/shared/utils/networkUtils.d.ts +0 -139
  366. package/dist/web/types/shared/utils/themeUtils.d.ts +0 -90
  367. package/dist/web/types/ui/client.d.ts +0 -33
  368. package/dist/web/types/ui/components/ActivityIndicator.d.ts +0 -44
  369. package/dist/web/types/ui/components/AnimationExample.d.ts +0 -3
  370. package/dist/web/types/ui/components/AutoHeightScrollView.d.ts +0 -22
  371. package/dist/web/types/ui/components/Avatar.d.ts +0 -60
  372. package/dist/web/types/ui/components/BottomSheet.d.ts +0 -28
  373. package/dist/web/types/ui/components/BottomSheetRouter.d.ts +0 -8
  374. package/dist/web/types/ui/components/CrossFadeIcon.d.ts +0 -26
  375. package/dist/web/types/ui/components/EmptyState.d.ts +0 -7
  376. package/dist/web/types/ui/components/ErrorBoundary.d.ts +0 -30
  377. package/dist/web/types/ui/components/FollowButton.d.ts +0 -17
  378. package/dist/web/types/ui/components/FontLoader.d.ts +0 -14
  379. package/dist/web/types/ui/components/GroupedItem.d.ts +0 -23
  380. package/dist/web/types/ui/components/GroupedSection.d.ts +0 -24
  381. package/dist/web/types/ui/components/Header.d.ts +0 -37
  382. package/dist/web/types/ui/components/HelperText.d.ts +0 -46
  383. package/dist/web/types/ui/components/Icon.d.ts +0 -59
  384. package/dist/web/types/ui/components/IconButton/IconButton.d.ts +0 -98
  385. package/dist/web/types/ui/components/IconButton/utils.d.ts +0 -18
  386. package/dist/web/types/ui/components/LoadingState.d.ts +0 -8
  387. package/dist/web/types/ui/components/OxyLogo.d.ts +0 -28
  388. package/dist/web/types/ui/components/OxyPayButton.d.ts +0 -28
  389. package/dist/web/types/ui/components/OxyProvider.d.ts +0 -33
  390. package/dist/web/types/ui/components/OxySignInButton.d.ts +0 -64
  391. package/dist/web/types/ui/components/ProfileCard.d.ts +0 -17
  392. package/dist/web/types/ui/components/QuickActions.d.ts +0 -14
  393. package/dist/web/types/ui/components/Section.d.ts +0 -11
  394. package/dist/web/types/ui/components/SectionTitle.d.ts +0 -9
  395. package/dist/web/types/ui/components/SettingRow.d.ts +0 -19
  396. package/dist/web/types/ui/components/SignInModal.d.ts +0 -17
  397. package/dist/web/types/ui/components/StepBasedScreen.d.ts +0 -25
  398. package/dist/web/types/ui/components/Surface.d.ts +0 -75
  399. package/dist/web/types/ui/components/TextField/Addons/Outline.d.ts +0 -15
  400. package/dist/web/types/ui/components/TextField/Addons/Underline.d.ts +0 -18
  401. package/dist/web/types/ui/components/TextField/Adornment/TextFieldAdornment.d.ts +0 -44
  402. package/dist/web/types/ui/components/TextField/Adornment/TextFieldAffix.d.ts +0 -72
  403. package/dist/web/types/ui/components/TextField/Adornment/TextFieldIcon.d.ts +0 -77
  404. package/dist/web/types/ui/components/TextField/Adornment/enums.d.ts +0 -12
  405. package/dist/web/types/ui/components/TextField/Adornment/types.d.ts +0 -11
  406. package/dist/web/types/ui/components/TextField/Adornment/utils.d.ts +0 -11
  407. package/dist/web/types/ui/components/TextField/Label/InputLabel.d.ts +0 -4
  408. package/dist/web/types/ui/components/TextField/Label/LabelBackground.d.ts +0 -3
  409. package/dist/web/types/ui/components/TextField/TextFieldFlat.d.ts +0 -3
  410. package/dist/web/types/ui/components/TextField/TextFieldOutlined.d.ts +0 -3
  411. package/dist/web/types/ui/components/TextField/constants.d.ts +0 -31
  412. package/dist/web/types/ui/components/TextField/helpers.d.ts +0 -96
  413. package/dist/web/types/ui/components/TextField/types.d.ts +0 -155
  414. package/dist/web/types/ui/components/TextField.d.ts +0 -191
  415. package/dist/web/types/ui/components/TouchableRipple/Pressable.d.ts +0 -12
  416. package/dist/web/types/ui/components/TouchableRipple/TouchableRipple.d.ts +0 -61
  417. package/dist/web/types/ui/components/TouchableRipple/utils.d.ts +0 -10
  418. package/dist/web/types/ui/components/Typography/AnimatedText.d.ts +0 -34
  419. package/dist/web/types/ui/components/Typography/types.d.ts +0 -18
  420. package/dist/web/types/ui/components/WebOxyProvider.d.ts +0 -51
  421. package/dist/web/types/ui/components/feedback/FormInput.d.ts +0 -19
  422. package/dist/web/types/ui/components/feedback/ProgressIndicator.d.ts +0 -10
  423. package/dist/web/types/ui/components/feedback/constants.d.ts +0 -4
  424. package/dist/web/types/ui/components/feedback/feedbackStyles.d.ts +0 -279
  425. package/dist/web/types/ui/components/feedback/index.d.ts +0 -6
  426. package/dist/web/types/ui/components/feedback/types.d.ts +0 -45
  427. package/dist/web/types/ui/components/feedback/useFeedbackForm.d.ts +0 -8
  428. package/dist/web/types/ui/components/fileManagement/AnimatedButton.d.ts +0 -15
  429. package/dist/web/types/ui/components/fileManagement/FileDetailsModal.d.ts +0 -14
  430. package/dist/web/types/ui/components/fileManagement/FileViewer.d.ts +0 -17
  431. package/dist/web/types/ui/components/fileManagement/UploadPreview.d.ts +0 -20
  432. package/dist/web/types/ui/components/fileManagement/styles.d.ts +0 -859
  433. package/dist/web/types/ui/components/icon/FAIRWalletIcon.d.ts +0 -8
  434. package/dist/web/types/ui/components/icon/OxyIcon.d.ts +0 -9
  435. package/dist/web/types/ui/components/icon/index.d.ts +0 -3
  436. package/dist/web/types/ui/components/index.d.ts +0 -16
  437. package/dist/web/types/ui/components/internal/GroupedPillButtons.d.ts +0 -17
  438. package/dist/web/types/ui/components/internal/PinInput.d.ts +0 -22
  439. package/dist/web/types/ui/components/modals/DeleteAccountModal.d.ts +0 -18
  440. package/dist/web/types/ui/components/modals/index.d.ts +0 -1
  441. package/dist/web/types/ui/components/payment/PaymentDetailsStep.d.ts +0 -20
  442. package/dist/web/types/ui/components/payment/PaymentMethodStep.d.ts +0 -13
  443. package/dist/web/types/ui/components/payment/PaymentReviewStep.d.ts +0 -15
  444. package/dist/web/types/ui/components/payment/PaymentSuccessStep.d.ts +0 -9
  445. package/dist/web/types/ui/components/payment/PaymentSummaryStep.d.ts +0 -14
  446. package/dist/web/types/ui/components/payment/constants.d.ts +0 -6
  447. package/dist/web/types/ui/components/payment/index.d.ts +0 -8
  448. package/dist/web/types/ui/components/payment/paymentStyles.d.ts +0 -395
  449. package/dist/web/types/ui/components/payment/types.d.ts +0 -39
  450. package/dist/web/types/ui/components/photogrid/JustifiedPhotoGrid.d.ts +0 -26
  451. package/dist/web/types/ui/components/styles/overlay.d.ts +0 -3
  452. package/dist/web/types/ui/components/styles/shadow.d.ts +0 -2
  453. package/dist/web/types/ui/components/theming.d.ts +0 -7
  454. package/dist/web/types/ui/components/types.d.ts +0 -79
  455. package/dist/web/types/ui/components/utils/forwardRef.d.ts +0 -11
  456. package/dist/web/types/ui/components/utils/hasTouchHandler.d.ts +0 -5
  457. package/dist/web/types/ui/components/utils/roundLayoutSize.d.ts +0 -1
  458. package/dist/web/types/ui/components/utils/splitStyles.d.ts +0 -19
  459. package/dist/web/types/ui/constants/iconColors.d.ts +0 -129
  460. package/dist/web/types/ui/constants/spacing.d.ts +0 -32
  461. package/dist/web/types/ui/constants/theme.d.ts +0 -96
  462. package/dist/web/types/ui/context/OxyContext.d.ts +0 -74
  463. package/dist/web/types/ui/context/ThemeContext.d.ts +0 -18
  464. package/dist/web/types/ui/context/hooks/useAuthOperations.d.ts +0 -39
  465. package/dist/web/types/ui/context/hooks/useDeviceManagement.d.ts +0 -26
  466. package/dist/web/types/ui/context/hooks/useLanguageManagement.d.ts +0 -24
  467. package/dist/web/types/ui/context/hooks/useSessionManagement.d.ts +0 -40
  468. package/dist/web/types/ui/hooks/index.d.ts +0 -6
  469. package/dist/web/types/ui/hooks/mutations/index.d.ts +0 -8
  470. package/dist/web/types/ui/hooks/mutations/mutationFactory.d.ts +0 -75
  471. package/dist/web/types/ui/hooks/mutations/useAccountMutations.d.ts +0 -68
  472. package/dist/web/types/ui/hooks/mutations/useServicesMutations.d.ts +0 -22
  473. package/dist/web/types/ui/hooks/queries/index.d.ts +0 -10
  474. package/dist/web/types/ui/hooks/queries/queryKeys.d.ts +0 -64
  475. package/dist/web/types/ui/hooks/queries/useAccountQueries.d.ts +0 -42
  476. package/dist/web/types/ui/hooks/queries/useSecurityQueries.d.ts +0 -14
  477. package/dist/web/types/ui/hooks/queries/useServicesQueries.d.ts +0 -31
  478. package/dist/web/types/ui/hooks/queryClient.d.ts +0 -18
  479. package/dist/web/types/ui/hooks/useAssets.d.ts +0 -34
  480. package/dist/web/types/ui/hooks/useAsyncAction.d.ts +0 -50
  481. package/dist/web/types/ui/hooks/useAuth.d.ts +0 -73
  482. package/dist/web/types/ui/hooks/useColorScheme.d.ts +0 -7
  483. package/dist/web/types/ui/hooks/useDeviceManagement.d.ts +0 -26
  484. package/dist/web/types/ui/hooks/useFileDownloadUrl.d.ts +0 -18
  485. package/dist/web/types/ui/hooks/useFileFiltering.d.ts +0 -28
  486. package/dist/web/types/ui/hooks/useFollow.d.ts +0 -61
  487. package/dist/web/types/ui/hooks/useFollow.types.d.ts +0 -32
  488. package/dist/web/types/ui/hooks/useI18n.d.ts +0 -4
  489. package/dist/web/types/ui/hooks/useLanguageManagement.d.ts +0 -24
  490. package/dist/web/types/ui/hooks/useProfileEditing.d.ts +0 -35
  491. package/dist/web/types/ui/hooks/useQueryClient.d.ts +0 -6
  492. package/dist/web/types/ui/hooks/useSessionManagement.d.ts +0 -40
  493. package/dist/web/types/ui/hooks/useSessionSocket.d.ts +0 -13
  494. package/dist/web/types/ui/hooks/useSettingToggle.d.ts +0 -56
  495. package/dist/web/types/ui/hooks/useStorage.d.ts +0 -15
  496. package/dist/web/types/ui/hooks/useThemeColors.d.ts +0 -93
  497. package/dist/web/types/ui/hooks/useThemeStyles.d.ts +0 -44
  498. package/dist/web/types/ui/hooks/useWebSSO.d.ts +0 -57
  499. package/dist/web/types/ui/index.d.ts +0 -7
  500. package/dist/web/types/ui/isFrontend.d.ts +0 -2
  501. package/dist/web/types/ui/navigation/bottomSheetManager.d.ts +0 -26
  502. package/dist/web/types/ui/navigation/routes.d.ts +0 -5
  503. package/dist/web/types/ui/screens/AccountCenterScreen.d.ts +0 -4
  504. package/dist/web/types/ui/screens/AccountOverviewScreen.d.ts +0 -4
  505. package/dist/web/types/ui/screens/AccountSettingsScreen.d.ts +0 -7
  506. package/dist/web/types/ui/screens/AccountSwitcherScreen.d.ts +0 -4
  507. package/dist/web/types/ui/screens/AccountVerificationScreen.d.ts +0 -4
  508. package/dist/web/types/ui/screens/AppInfoScreen.d.ts +0 -4
  509. package/dist/web/types/ui/screens/EditProfileFieldScreen.d.ts +0 -12
  510. package/dist/web/types/ui/screens/FAQScreen.d.ts +0 -4
  511. package/dist/web/types/ui/screens/FeedbackScreen.d.ts +0 -4
  512. package/dist/web/types/ui/screens/FileManagementScreen.d.ts +0 -4
  513. package/dist/web/types/ui/screens/FollowersListScreen.d.ts +0 -8
  514. package/dist/web/types/ui/screens/FollowingListScreen.d.ts +0 -8
  515. package/dist/web/types/ui/screens/HelpSupportScreen.d.ts +0 -4
  516. package/dist/web/types/ui/screens/HistoryViewScreen.d.ts +0 -4
  517. package/dist/web/types/ui/screens/LanguageSelectorScreen.d.ts +0 -6
  518. package/dist/web/types/ui/screens/LearnMoreUsernamesScreen.d.ts +0 -4
  519. package/dist/web/types/ui/screens/LegalDocumentsScreen.d.ts +0 -4
  520. package/dist/web/types/ui/screens/OxyAuthScreen.d.ts +0 -16
  521. package/dist/web/types/ui/screens/PaymentGatewayScreen.d.ts +0 -14
  522. package/dist/web/types/ui/screens/PremiumSubscriptionScreen.d.ts +0 -4
  523. package/dist/web/types/ui/screens/PrivacySettingsScreen.d.ts +0 -4
  524. package/dist/web/types/ui/screens/ProfileScreen.d.ts +0 -8
  525. package/dist/web/types/ui/screens/SavesCollectionsScreen.d.ts +0 -4
  526. package/dist/web/types/ui/screens/SearchSettingsScreen.d.ts +0 -4
  527. package/dist/web/types/ui/screens/SessionManagementScreen.d.ts +0 -4
  528. package/dist/web/types/ui/screens/UserLinksScreen.d.ts +0 -14
  529. package/dist/web/types/ui/screens/UserListScreen.d.ts +0 -10
  530. package/dist/web/types/ui/screens/WelcomeNewUserScreen.d.ts +0 -12
  531. package/dist/web/types/ui/screens/karma/KarmaAboutScreen.d.ts +0 -4
  532. package/dist/web/types/ui/screens/karma/KarmaCenterScreen.d.ts +0 -4
  533. package/dist/web/types/ui/screens/karma/KarmaFAQScreen.d.ts +0 -4
  534. package/dist/web/types/ui/screens/karma/KarmaLeaderboardScreen.d.ts +0 -4
  535. package/dist/web/types/ui/screens/karma/KarmaRewardsScreen.d.ts +0 -4
  536. package/dist/web/types/ui/screens/karma/KarmaRulesScreen.d.ts +0 -4
  537. package/dist/web/types/ui/server.d.ts +0 -42
  538. package/dist/web/types/ui/stores/accountStore.d.ts +0 -33
  539. package/dist/web/types/ui/stores/assetStore.d.ts +0 -53
  540. package/dist/web/types/ui/stores/authStore.d.ts +0 -16
  541. package/dist/web/types/ui/stores/fileStore.d.ts +0 -30
  542. package/dist/web/types/ui/stores/followStore.d.ts +0 -24
  543. package/dist/web/types/ui/styles/authStyles.d.ts +0 -331
  544. package/dist/web/types/ui/styles/fonts.d.ts +0 -20
  545. package/dist/web/types/ui/styles/index.d.ts +0 -4
  546. package/dist/web/types/ui/styles/spacing.d.ts +0 -48
  547. package/dist/web/types/ui/styles/theme.d.ts +0 -67
  548. package/dist/web/types/ui/types/fileManagement.d.ts +0 -40
  549. package/dist/web/types/ui/types/navigation.d.ts +0 -36
  550. package/dist/web/types/ui/utils/authHelpers.d.ts +0 -98
  551. package/dist/web/types/ui/utils/avatarUtils.d.ts +0 -33
  552. package/dist/web/types/ui/utils/colorUtils.d.ts +0 -9
  553. package/dist/web/types/ui/utils/confirmAction.d.ts +0 -6
  554. package/dist/web/types/ui/utils/errorHandlers.d.ts +0 -34
  555. package/dist/web/types/ui/utils/fileManagement.d.ts +0 -86
  556. package/dist/web/types/ui/utils/iconNames.d.ts +0 -111
  557. package/dist/web/types/ui/utils/sessionHelpers.d.ts +0 -63
  558. package/dist/web/types/ui/utils/storageHelpers.d.ts +0 -27
  559. package/dist/web/types/ui/utils/themeUtils.d.ts +0 -10
  560. package/dist/web/types/ui/utils/userUtils.d.ts +0 -28
  561. package/dist/web/types/utils/apiUtils.d.ts +0 -53
  562. package/dist/web/types/utils/asyncUtils.d.ts +0 -58
  563. package/dist/web/types/utils/cache.d.ts +0 -127
  564. package/dist/web/types/utils/deviceManager.d.ts +0 -65
  565. package/dist/web/types/utils/errorUtils.d.ts +0 -46
  566. package/dist/web/types/utils/hookUtils.d.ts +0 -101
  567. package/dist/web/types/utils/index.d.ts +0 -6
  568. package/dist/web/types/utils/languageUtils.d.ts +0 -37
  569. package/dist/web/types/utils/loggerUtils.d.ts +0 -48
  570. package/dist/web/types/utils/platform.d.ts +0 -40
  571. package/dist/web/types/utils/platformInit.d.ts +0 -8
  572. package/dist/web/types/utils/requestUtils.d.ts +0 -123
  573. package/dist/web/types/utils/sessionUtils.d.ts +0 -54
  574. package/dist/web/types/utils/validationUtils.d.ts +0 -85
  575. package/dist/web/types/web/WebOxyContext.d.ts +0 -151
  576. package/dist/web/types/web/index.d.ts +0 -52
  577. package/dist/web/types/web.d.ts +0 -53
  578. package/lib/commonjs/constants/version.js +0 -28
  579. package/lib/commonjs/constants/version.js.map +0 -1
  580. package/lib/commonjs/core/AuthManager.js +0 -405
  581. package/lib/commonjs/core/AuthManager.js.map +0 -1
  582. package/lib/commonjs/core/CrossDomainAuth.js +0 -277
  583. package/lib/commonjs/core/CrossDomainAuth.js.map +0 -1
  584. package/lib/commonjs/core/HttpService.js +0 -697
  585. package/lib/commonjs/core/HttpService.js.map +0 -1
  586. package/lib/commonjs/core/OxyServices.base.js +0 -291
  587. package/lib/commonjs/core/OxyServices.base.js.map +0 -1
  588. package/lib/commonjs/core/OxyServices.errors.js +0 -26
  589. package/lib/commonjs/core/OxyServices.errors.js.map +0 -1
  590. package/lib/commonjs/core/OxyServices.js +0 -149
  591. package/lib/commonjs/core/OxyServices.js.map +0 -1
  592. package/lib/commonjs/core/index.js +0 -158
  593. package/lib/commonjs/core/index.js.map +0 -1
  594. package/lib/commonjs/core/mixins/OxyServices.analytics.js +0 -60
  595. package/lib/commonjs/core/mixins/OxyServices.analytics.js.map +0 -1
  596. package/lib/commonjs/core/mixins/OxyServices.assets.js +0 -390
  597. package/lib/commonjs/core/mixins/OxyServices.assets.js.map +0 -1
  598. package/lib/commonjs/core/mixins/OxyServices.auth.js +0 -296
  599. package/lib/commonjs/core/mixins/OxyServices.auth.js.map +0 -1
  600. package/lib/commonjs/core/mixins/OxyServices.developer.js +0 -115
  601. package/lib/commonjs/core/mixins/OxyServices.developer.js.map +0 -1
  602. package/lib/commonjs/core/mixins/OxyServices.devices.js +0 -133
  603. package/lib/commonjs/core/mixins/OxyServices.devices.js.map +0 -1
  604. package/lib/commonjs/core/mixins/OxyServices.features.js +0 -372
  605. package/lib/commonjs/core/mixins/OxyServices.features.js.map +0 -1
  606. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +0 -464
  607. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +0 -1
  608. package/lib/commonjs/core/mixins/OxyServices.karma.js +0 -117
  609. package/lib/commonjs/core/mixins/OxyServices.karma.js.map +0 -1
  610. package/lib/commonjs/core/mixins/OxyServices.language.js +0 -124
  611. package/lib/commonjs/core/mixins/OxyServices.language.js.map +0 -1
  612. package/lib/commonjs/core/mixins/OxyServices.location.js +0 -55
  613. package/lib/commonjs/core/mixins/OxyServices.location.js.map +0 -1
  614. package/lib/commonjs/core/mixins/OxyServices.payment.js +0 -168
  615. package/lib/commonjs/core/mixins/OxyServices.payment.js.map +0 -1
  616. package/lib/commonjs/core/mixins/OxyServices.popup.js +0 -393
  617. package/lib/commonjs/core/mixins/OxyServices.popup.js.map +0 -1
  618. package/lib/commonjs/core/mixins/OxyServices.privacy.js +0 -174
  619. package/lib/commonjs/core/mixins/OxyServices.privacy.js.map +0 -1
  620. package/lib/commonjs/core/mixins/OxyServices.redirect.js +0 -378
  621. package/lib/commonjs/core/mixins/OxyServices.redirect.js.map +0 -1
  622. package/lib/commonjs/core/mixins/OxyServices.security.js +0 -96
  623. package/lib/commonjs/core/mixins/OxyServices.security.js.map +0 -1
  624. package/lib/commonjs/core/mixins/OxyServices.user.js +0 -393
  625. package/lib/commonjs/core/mixins/OxyServices.user.js.map +0 -1
  626. package/lib/commonjs/core/mixins/OxyServices.utility.js +0 -165
  627. package/lib/commonjs/core/mixins/OxyServices.utility.js.map +0 -1
  628. package/lib/commonjs/core/mixins/index.js +0 -75
  629. package/lib/commonjs/core/mixins/index.js.map +0 -1
  630. package/lib/commonjs/core/mixins/mixinHelpers.js +0 -62
  631. package/lib/commonjs/core/mixins/mixinHelpers.js.map +0 -1
  632. package/lib/commonjs/crypto/index.js +0 -34
  633. package/lib/commonjs/crypto/index.js.map +0 -1
  634. package/lib/commonjs/crypto/keyManager.js +0 -942
  635. package/lib/commonjs/crypto/keyManager.js.map +0 -1
  636. package/lib/commonjs/crypto/polyfill.js +0 -86
  637. package/lib/commonjs/crypto/polyfill.js.map +0 -1
  638. package/lib/commonjs/crypto/recoveryPhrase.js +0 -152
  639. package/lib/commonjs/crypto/recoveryPhrase.js.map +0 -1
  640. package/lib/commonjs/crypto/signatureService.js +0 -289
  641. package/lib/commonjs/crypto/signatureService.js.map +0 -1
  642. package/lib/commonjs/i18n/index.js +0 -76
  643. package/lib/commonjs/i18n/index.js.map +0 -1
  644. package/lib/commonjs/i18n/locales/ar-SA.json +0 -120
  645. package/lib/commonjs/i18n/locales/ca-ES.json +0 -120
  646. package/lib/commonjs/i18n/locales/de-DE.json +0 -120
  647. package/lib/commonjs/i18n/locales/en-US.json +0 -956
  648. package/lib/commonjs/i18n/locales/es-ES.json +0 -944
  649. package/lib/commonjs/i18n/locales/fr-FR.json +0 -120
  650. package/lib/commonjs/i18n/locales/it-IT.json +0 -120
  651. package/lib/commonjs/i18n/locales/ja-JP.json +0 -119
  652. package/lib/commonjs/i18n/locales/ko-KR.json +0 -120
  653. package/lib/commonjs/i18n/locales/pt-PT.json +0 -120
  654. package/lib/commonjs/i18n/locales/zh-CN.json +0 -120
  655. package/lib/commonjs/models/interfaces.js +0 -61
  656. package/lib/commonjs/models/interfaces.js.map +0 -1
  657. package/lib/commonjs/models/session.js +0 -2
  658. package/lib/commonjs/models/session.js.map +0 -1
  659. package/lib/commonjs/node/index.js +0 -59
  660. package/lib/commonjs/node/index.js.map +0 -1
  661. package/lib/commonjs/shared/index.js +0 -227
  662. package/lib/commonjs/shared/index.js.map +0 -1
  663. package/lib/commonjs/shared/utils/colorUtils.js +0 -161
  664. package/lib/commonjs/shared/utils/colorUtils.js.map +0 -1
  665. package/lib/commonjs/shared/utils/debugUtils.js +0 -84
  666. package/lib/commonjs/shared/utils/debugUtils.js.map +0 -1
  667. package/lib/commonjs/shared/utils/errorUtils.js +0 -190
  668. package/lib/commonjs/shared/utils/errorUtils.js.map +0 -1
  669. package/lib/commonjs/shared/utils/index.js +0 -196
  670. package/lib/commonjs/shared/utils/index.js.map +0 -1
  671. package/lib/commonjs/shared/utils/networkUtils.js +0 -213
  672. package/lib/commonjs/shared/utils/networkUtils.js.map +0 -1
  673. package/lib/commonjs/shared/utils/themeUtils.js +0 -118
  674. package/lib/commonjs/shared/utils/themeUtils.js.map +0 -1
  675. package/lib/commonjs/utils/apiUtils.js +0 -79
  676. package/lib/commonjs/utils/apiUtils.js.map +0 -1
  677. package/lib/commonjs/utils/asyncUtils.js +0 -207
  678. package/lib/commonjs/utils/asyncUtils.js.map +0 -1
  679. package/lib/commonjs/utils/cache.js +0 -259
  680. package/lib/commonjs/utils/cache.js.map +0 -1
  681. package/lib/commonjs/utils/deviceManager.js +0 -177
  682. package/lib/commonjs/utils/deviceManager.js.map +0 -1
  683. package/lib/commonjs/utils/errorUtils.js +0 -168
  684. package/lib/commonjs/utils/errorUtils.js.map +0 -1
  685. package/lib/commonjs/utils/index.js +0 -106
  686. package/lib/commonjs/utils/index.js.map +0 -1
  687. package/lib/commonjs/utils/languageUtils.js +0 -159
  688. package/lib/commonjs/utils/languageUtils.js.map +0 -1
  689. package/lib/commonjs/utils/loggerUtils.js +0 -160
  690. package/lib/commonjs/utils/loggerUtils.js.map +0 -1
  691. package/lib/commonjs/utils/platform.js +0 -129
  692. package/lib/commonjs/utils/platform.js.map +0 -1
  693. package/lib/commonjs/utils/platformInit.js +0 -13
  694. package/lib/commonjs/utils/platformInit.js.map +0 -1
  695. package/lib/commonjs/utils/platformInit.native.js +0 -16
  696. package/lib/commonjs/utils/platformInit.native.js.map +0 -1
  697. package/lib/commonjs/utils/requestUtils.js +0 -218
  698. package/lib/commonjs/utils/requestUtils.js.map +0 -1
  699. package/lib/commonjs/utils/sessionUtils.js +0 -191
  700. package/lib/commonjs/utils/sessionUtils.js.map +0 -1
  701. package/lib/commonjs/utils/validationUtils.js +0 -191
  702. package/lib/commonjs/utils/validationUtils.js.map +0 -1
  703. package/lib/commonjs/web/WebOxyContext.js +0 -384
  704. package/lib/commonjs/web/WebOxyContext.js.map +0 -1
  705. package/lib/commonjs/web/index.js +0 -319
  706. package/lib/commonjs/web/index.js.map +0 -1
  707. package/lib/commonjs/web.js +0 -659
  708. package/lib/commonjs/web.js.map +0 -1
  709. package/lib/module/constants/version.js +0 -21
  710. package/lib/module/constants/version.js.map +0 -1
  711. package/lib/module/core/AuthManager.js +0 -399
  712. package/lib/module/core/AuthManager.js.map +0 -1
  713. package/lib/module/core/CrossDomainAuth.js +0 -271
  714. package/lib/module/core/CrossDomainAuth.js.map +0 -1
  715. package/lib/module/core/HttpService.js +0 -692
  716. package/lib/module/core/HttpService.js.map +0 -1
  717. package/lib/module/core/OxyServices.base.js +0 -285
  718. package/lib/module/core/OxyServices.base.js.map +0 -1
  719. package/lib/module/core/OxyServices.errors.js +0 -20
  720. package/lib/module/core/OxyServices.errors.js.map +0 -1
  721. package/lib/module/core/OxyServices.js +0 -134
  722. package/lib/module/core/OxyServices.js.map +0 -1
  723. package/lib/module/core/index.js +0 -31
  724. package/lib/module/core/index.js.map +0 -1
  725. package/lib/module/core/mixins/OxyServices.analytics.js +0 -56
  726. package/lib/module/core/mixins/OxyServices.analytics.js.map +0 -1
  727. package/lib/module/core/mixins/OxyServices.assets.js +0 -386
  728. package/lib/module/core/mixins/OxyServices.assets.js.map +0 -1
  729. package/lib/module/core/mixins/OxyServices.auth.js +0 -292
  730. package/lib/module/core/mixins/OxyServices.auth.js.map +0 -1
  731. package/lib/module/core/mixins/OxyServices.developer.js +0 -111
  732. package/lib/module/core/mixins/OxyServices.developer.js.map +0 -1
  733. package/lib/module/core/mixins/OxyServices.devices.js +0 -129
  734. package/lib/module/core/mixins/OxyServices.devices.js.map +0 -1
  735. package/lib/module/core/mixins/OxyServices.features.js +0 -369
  736. package/lib/module/core/mixins/OxyServices.features.js.map +0 -1
  737. package/lib/module/core/mixins/OxyServices.fedcm.js +0 -461
  738. package/lib/module/core/mixins/OxyServices.fedcm.js.map +0 -1
  739. package/lib/module/core/mixins/OxyServices.karma.js +0 -113
  740. package/lib/module/core/mixins/OxyServices.karma.js.map +0 -1
  741. package/lib/module/core/mixins/OxyServices.language.js +0 -120
  742. package/lib/module/core/mixins/OxyServices.language.js.map +0 -1
  743. package/lib/module/core/mixins/OxyServices.location.js +0 -51
  744. package/lib/module/core/mixins/OxyServices.location.js.map +0 -1
  745. package/lib/module/core/mixins/OxyServices.payment.js +0 -164
  746. package/lib/module/core/mixins/OxyServices.payment.js.map +0 -1
  747. package/lib/module/core/mixins/OxyServices.popup.js +0 -390
  748. package/lib/module/core/mixins/OxyServices.popup.js.map +0 -1
  749. package/lib/module/core/mixins/OxyServices.privacy.js +0 -170
  750. package/lib/module/core/mixins/OxyServices.privacy.js.map +0 -1
  751. package/lib/module/core/mixins/OxyServices.redirect.js +0 -375
  752. package/lib/module/core/mixins/OxyServices.redirect.js.map +0 -1
  753. package/lib/module/core/mixins/OxyServices.security.js +0 -92
  754. package/lib/module/core/mixins/OxyServices.security.js.map +0 -1
  755. package/lib/module/core/mixins/OxyServices.user.js +0 -389
  756. package/lib/module/core/mixins/OxyServices.user.js.map +0 -1
  757. package/lib/module/core/mixins/OxyServices.utility.js +0 -160
  758. package/lib/module/core/mixins/OxyServices.utility.js.map +0 -1
  759. package/lib/module/core/mixins/index.js +0 -72
  760. package/lib/module/core/mixins/index.js.map +0 -1
  761. package/lib/module/core/mixins/mixinHelpers.js +0 -56
  762. package/lib/module/core/mixins/mixinHelpers.js.map +0 -1
  763. package/lib/module/crypto/index.js +0 -18
  764. package/lib/module/crypto/index.js.map +0 -1
  765. package/lib/module/crypto/keyManager.js +0 -939
  766. package/lib/module/crypto/keyManager.js.map +0 -1
  767. package/lib/module/crypto/polyfill.js +0 -78
  768. package/lib/module/crypto/polyfill.js.map +0 -1
  769. package/lib/module/crypto/recoveryPhrase.js +0 -147
  770. package/lib/module/crypto/recoveryPhrase.js.map +0 -1
  771. package/lib/module/crypto/signatureService.js +0 -286
  772. package/lib/module/crypto/signatureService.js.map +0 -1
  773. package/lib/module/i18n/index.js +0 -71
  774. package/lib/module/i18n/index.js.map +0 -1
  775. package/lib/module/i18n/locales/ar-SA.json +0 -120
  776. package/lib/module/i18n/locales/ca-ES.json +0 -120
  777. package/lib/module/i18n/locales/de-DE.json +0 -120
  778. package/lib/module/i18n/locales/en-US.json +0 -956
  779. package/lib/module/i18n/locales/es-ES.json +0 -944
  780. package/lib/module/i18n/locales/fr-FR.json +0 -120
  781. package/lib/module/i18n/locales/it-IT.json +0 -120
  782. package/lib/module/i18n/locales/ja-JP.json +0 -119
  783. package/lib/module/i18n/locales/ko-KR.json +0 -120
  784. package/lib/module/i18n/locales/pt-PT.json +0 -120
  785. package/lib/module/i18n/locales/zh-CN.json +0 -120
  786. package/lib/module/models/interfaces.js +0 -57
  787. package/lib/module/models/interfaces.js.map +0 -1
  788. package/lib/module/models/session.js +0 -2
  789. package/lib/module/models/session.js.map +0 -1
  790. package/lib/module/node/index.js +0 -20
  791. package/lib/module/node/index.js.map +0 -1
  792. package/lib/module/shared/index.js +0 -37
  793. package/lib/module/shared/index.js.map +0 -1
  794. package/lib/module/shared/utils/colorUtils.js +0 -150
  795. package/lib/module/shared/utils/colorUtils.js.map +0 -1
  796. package/lib/module/shared/utils/debugUtils.js +0 -75
  797. package/lib/module/shared/utils/debugUtils.js.map +0 -1
  798. package/lib/module/shared/utils/errorUtils.js +0 -176
  799. package/lib/module/shared/utils/errorUtils.js.map +0 -1
  800. package/lib/module/shared/utils/index.js +0 -21
  801. package/lib/module/shared/utils/index.js.map +0 -1
  802. package/lib/module/shared/utils/networkUtils.js +0 -202
  803. package/lib/module/shared/utils/networkUtils.js.map +0 -1
  804. package/lib/module/shared/utils/themeUtils.js +0 -109
  805. package/lib/module/shared/utils/themeUtils.js.map +0 -1
  806. package/lib/module/utils/apiUtils.js +0 -72
  807. package/lib/module/utils/apiUtils.js.map +0 -1
  808. package/lib/module/utils/asyncUtils.js +0 -192
  809. package/lib/module/utils/asyncUtils.js.map +0 -1
  810. package/lib/module/utils/cache.js +0 -250
  811. package/lib/module/utils/cache.js.map +0 -1
  812. package/lib/module/utils/deviceManager.js +0 -171
  813. package/lib/module/utils/deviceManager.js.map +0 -1
  814. package/lib/module/utils/errorUtils.js +0 -160
  815. package/lib/module/utils/errorUtils.js.map +0 -1
  816. package/lib/module/utils/index.js +0 -11
  817. package/lib/module/utils/index.js.map +0 -1
  818. package/lib/module/utils/languageUtils.js +0 -151
  819. package/lib/module/utils/languageUtils.js.map +0 -1
  820. package/lib/module/utils/loggerUtils.js +0 -149
  821. package/lib/module/utils/loggerUtils.js.map +0 -1
  822. package/lib/module/utils/platform.js +0 -118
  823. package/lib/module/utils/platform.js.map +0 -1
  824. package/lib/module/utils/platformInit.js +0 -13
  825. package/lib/module/utils/platformInit.js.map +0 -1
  826. package/lib/module/utils/platformInit.native.js +0 -16
  827. package/lib/module/utils/platformInit.native.js.map +0 -1
  828. package/lib/module/utils/requestUtils.js +0 -212
  829. package/lib/module/utils/requestUtils.js.map +0 -1
  830. package/lib/module/utils/sessionUtils.js +0 -180
  831. package/lib/module/utils/sessionUtils.js.map +0 -1
  832. package/lib/module/utils/validationUtils.js +0 -170
  833. package/lib/module/utils/validationUtils.js.map +0 -1
  834. package/lib/module/web/WebOxyContext.js +0 -377
  835. package/lib/module/web/WebOxyContext.js.map +0 -1
  836. package/lib/module/web/index.js +0 -72
  837. package/lib/module/web/index.js.map +0 -1
  838. package/lib/module/web.js +0 -76
  839. package/lib/module/web.js.map +0 -1
  840. package/lib/typescript/commonjs/constants/version.d.ts +0 -14
  841. package/lib/typescript/commonjs/constants/version.d.ts.map +0 -1
  842. package/lib/typescript/commonjs/core/AuthManager.d.ts +0 -144
  843. package/lib/typescript/commonjs/core/AuthManager.d.ts.map +0 -1
  844. package/lib/typescript/commonjs/core/CrossDomainAuth.d.ts +0 -161
  845. package/lib/typescript/commonjs/core/CrossDomainAuth.d.ts.map +0 -1
  846. package/lib/typescript/commonjs/core/HttpService.d.ts +0 -164
  847. package/lib/typescript/commonjs/core/HttpService.d.ts.map +0 -1
  848. package/lib/typescript/commonjs/core/OxyServices.base.d.ts +0 -127
  849. package/lib/typescript/commonjs/core/OxyServices.base.d.ts.map +0 -1
  850. package/lib/typescript/commonjs/core/OxyServices.d.ts +0 -82
  851. package/lib/typescript/commonjs/core/OxyServices.d.ts.map +0 -1
  852. package/lib/typescript/commonjs/core/OxyServices.errors.d.ts +0 -12
  853. package/lib/typescript/commonjs/core/OxyServices.errors.d.ts.map +0 -1
  854. package/lib/typescript/commonjs/core/index.d.ts +0 -21
  855. package/lib/typescript/commonjs/core/index.d.ts.map +0 -1
  856. package/lib/typescript/commonjs/core/mixins/OxyServices.analytics.d.ts +0 -67
  857. package/lib/typescript/commonjs/core/mixins/OxyServices.analytics.d.ts.map +0 -1
  858. package/lib/typescript/commonjs/core/mixins/OxyServices.assets.d.ts +0 -136
  859. package/lib/typescript/commonjs/core/mixins/OxyServices.assets.d.ts.map +0 -1
  860. package/lib/typescript/commonjs/core/mixins/OxyServices.auth.d.ts +0 -187
  861. package/lib/typescript/commonjs/core/mixins/OxyServices.auth.d.ts.map +0 -1
  862. package/lib/typescript/commonjs/core/mixins/OxyServices.developer.d.ts +0 -100
  863. package/lib/typescript/commonjs/core/mixins/OxyServices.developer.d.ts.map +0 -1
  864. package/lib/typescript/commonjs/core/mixins/OxyServices.devices.d.ts +0 -97
  865. package/lib/typescript/commonjs/core/mixins/OxyServices.devices.d.ts.map +0 -1
  866. package/lib/typescript/commonjs/core/mixins/OxyServices.features.d.ts +0 -229
  867. package/lib/typescript/commonjs/core/mixins/OxyServices.features.d.ts.map +0 -1
  868. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts +0 -201
  869. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +0 -1
  870. package/lib/typescript/commonjs/core/mixins/OxyServices.karma.d.ts +0 -86
  871. package/lib/typescript/commonjs/core/mixins/OxyServices.karma.d.ts.map +0 -1
  872. package/lib/typescript/commonjs/core/mixins/OxyServices.language.d.ts +0 -82
  873. package/lib/typescript/commonjs/core/mixins/OxyServices.language.d.ts.map +0 -1
  874. package/lib/typescript/commonjs/core/mixins/OxyServices.location.d.ts +0 -65
  875. package/lib/typescript/commonjs/core/mixins/OxyServices.location.d.ts.map +0 -1
  876. package/lib/typescript/commonjs/core/mixins/OxyServices.payment.d.ts +0 -112
  877. package/lib/typescript/commonjs/core/mixins/OxyServices.payment.d.ts.map +0 -1
  878. package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts +0 -206
  879. package/lib/typescript/commonjs/core/mixins/OxyServices.popup.d.ts.map +0 -1
  880. package/lib/typescript/commonjs/core/mixins/OxyServices.privacy.d.ts +0 -123
  881. package/lib/typescript/commonjs/core/mixins/OxyServices.privacy.d.ts.map +0 -1
  882. package/lib/typescript/commonjs/core/mixins/OxyServices.redirect.d.ts +0 -246
  883. package/lib/typescript/commonjs/core/mixins/OxyServices.redirect.d.ts.map +0 -1
  884. package/lib/typescript/commonjs/core/mixins/OxyServices.security.d.ts +0 -79
  885. package/lib/typescript/commonjs/core/mixins/OxyServices.security.d.ts.map +0 -1
  886. package/lib/typescript/commonjs/core/mixins/OxyServices.user.d.ts +0 -185
  887. package/lib/typescript/commonjs/core/mixins/OxyServices.user.d.ts.map +0 -1
  888. package/lib/typescript/commonjs/core/mixins/OxyServices.utility.d.ts +0 -94
  889. package/lib/typescript/commonjs/core/mixins/OxyServices.utility.d.ts.map +0 -1
  890. package/lib/typescript/commonjs/core/mixins/index.d.ts +0 -31
  891. package/lib/typescript/commonjs/core/mixins/index.d.ts.map +0 -1
  892. package/lib/typescript/commonjs/core/mixins/mixinHelpers.d.ts +0 -32
  893. package/lib/typescript/commonjs/core/mixins/mixinHelpers.d.ts.map +0 -1
  894. package/lib/typescript/commonjs/crypto/index.d.ts +0 -12
  895. package/lib/typescript/commonjs/crypto/index.d.ts.map +0 -1
  896. package/lib/typescript/commonjs/crypto/keyManager.d.ts +0 -190
  897. package/lib/typescript/commonjs/crypto/keyManager.d.ts.map +0 -1
  898. package/lib/typescript/commonjs/crypto/polyfill.d.ts +0 -13
  899. package/lib/typescript/commonjs/crypto/polyfill.d.ts.map +0 -1
  900. package/lib/typescript/commonjs/crypto/recoveryPhrase.d.ts +0 -59
  901. package/lib/typescript/commonjs/crypto/recoveryPhrase.d.ts.map +0 -1
  902. package/lib/typescript/commonjs/crypto/signatureService.d.ts +0 -87
  903. package/lib/typescript/commonjs/crypto/signatureService.d.ts.map +0 -1
  904. package/lib/typescript/commonjs/i18n/index.d.ts +0 -4
  905. package/lib/typescript/commonjs/i18n/index.d.ts.map +0 -1
  906. package/lib/typescript/commonjs/models/interfaces.d.ts +0 -416
  907. package/lib/typescript/commonjs/models/interfaces.d.ts.map +0 -1
  908. package/lib/typescript/commonjs/models/session.d.ts +0 -28
  909. package/lib/typescript/commonjs/models/session.d.ts.map +0 -1
  910. package/lib/typescript/commonjs/node/index.d.ts +0 -10
  911. package/lib/typescript/commonjs/node/index.d.ts.map +0 -1
  912. package/lib/typescript/commonjs/shared/index.d.ts +0 -29
  913. package/lib/typescript/commonjs/shared/index.d.ts.map +0 -1
  914. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts +0 -105
  915. package/lib/typescript/commonjs/shared/utils/colorUtils.d.ts.map +0 -1
  916. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts +0 -49
  917. package/lib/typescript/commonjs/shared/utils/debugUtils.d.ts.map +0 -1
  918. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts +0 -98
  919. package/lib/typescript/commonjs/shared/utils/errorUtils.d.ts.map +0 -1
  920. package/lib/typescript/commonjs/shared/utils/index.d.ts +0 -14
  921. package/lib/typescript/commonjs/shared/utils/index.d.ts.map +0 -1
  922. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts +0 -140
  923. package/lib/typescript/commonjs/shared/utils/networkUtils.d.ts.map +0 -1
  924. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts +0 -91
  925. package/lib/typescript/commonjs/shared/utils/themeUtils.d.ts.map +0 -1
  926. package/lib/typescript/commonjs/utils/apiUtils.d.ts +0 -54
  927. package/lib/typescript/commonjs/utils/apiUtils.d.ts.map +0 -1
  928. package/lib/typescript/commonjs/utils/asyncUtils.d.ts +0 -59
  929. package/lib/typescript/commonjs/utils/asyncUtils.d.ts.map +0 -1
  930. package/lib/typescript/commonjs/utils/cache.d.ts +0 -128
  931. package/lib/typescript/commonjs/utils/cache.d.ts.map +0 -1
  932. package/lib/typescript/commonjs/utils/deviceManager.d.ts +0 -66
  933. package/lib/typescript/commonjs/utils/deviceManager.d.ts.map +0 -1
  934. package/lib/typescript/commonjs/utils/errorUtils.d.ts +0 -47
  935. package/lib/typescript/commonjs/utils/errorUtils.d.ts.map +0 -1
  936. package/lib/typescript/commonjs/utils/index.d.ts +0 -7
  937. package/lib/typescript/commonjs/utils/index.d.ts.map +0 -1
  938. package/lib/typescript/commonjs/utils/languageUtils.d.ts +0 -38
  939. package/lib/typescript/commonjs/utils/languageUtils.d.ts.map +0 -1
  940. package/lib/typescript/commonjs/utils/loggerUtils.d.ts +0 -49
  941. package/lib/typescript/commonjs/utils/loggerUtils.d.ts.map +0 -1
  942. package/lib/typescript/commonjs/utils/platform.d.ts +0 -41
  943. package/lib/typescript/commonjs/utils/platform.d.ts.map +0 -1
  944. package/lib/typescript/commonjs/utils/platformInit.d.ts +0 -10
  945. package/lib/typescript/commonjs/utils/platformInit.d.ts.map +0 -1
  946. package/lib/typescript/commonjs/utils/platformInit.native.d.ts +0 -2
  947. package/lib/typescript/commonjs/utils/platformInit.native.d.ts.map +0 -1
  948. package/lib/typescript/commonjs/utils/requestUtils.d.ts +0 -124
  949. package/lib/typescript/commonjs/utils/requestUtils.d.ts.map +0 -1
  950. package/lib/typescript/commonjs/utils/sessionUtils.d.ts +0 -55
  951. package/lib/typescript/commonjs/utils/sessionUtils.d.ts.map +0 -1
  952. package/lib/typescript/commonjs/utils/validationUtils.d.ts +0 -86
  953. package/lib/typescript/commonjs/utils/validationUtils.d.ts.map +0 -1
  954. package/lib/typescript/commonjs/web/WebOxyContext.d.ts +0 -152
  955. package/lib/typescript/commonjs/web/WebOxyContext.d.ts.map +0 -1
  956. package/lib/typescript/commonjs/web/index.d.ts +0 -53
  957. package/lib/typescript/commonjs/web/index.d.ts.map +0 -1
  958. package/lib/typescript/commonjs/web.d.ts +0 -54
  959. package/lib/typescript/commonjs/web.d.ts.map +0 -1
  960. package/lib/typescript/module/constants/version.d.ts +0 -14
  961. package/lib/typescript/module/constants/version.d.ts.map +0 -1
  962. package/lib/typescript/module/core/AuthManager.d.ts +0 -144
  963. package/lib/typescript/module/core/AuthManager.d.ts.map +0 -1
  964. package/lib/typescript/module/core/CrossDomainAuth.d.ts +0 -161
  965. package/lib/typescript/module/core/CrossDomainAuth.d.ts.map +0 -1
  966. package/lib/typescript/module/core/HttpService.d.ts +0 -164
  967. package/lib/typescript/module/core/HttpService.d.ts.map +0 -1
  968. package/lib/typescript/module/core/OxyServices.base.d.ts +0 -127
  969. package/lib/typescript/module/core/OxyServices.base.d.ts.map +0 -1
  970. package/lib/typescript/module/core/OxyServices.d.ts +0 -82
  971. package/lib/typescript/module/core/OxyServices.d.ts.map +0 -1
  972. package/lib/typescript/module/core/OxyServices.errors.d.ts +0 -12
  973. package/lib/typescript/module/core/OxyServices.errors.d.ts.map +0 -1
  974. package/lib/typescript/module/core/index.d.ts +0 -21
  975. package/lib/typescript/module/core/index.d.ts.map +0 -1
  976. package/lib/typescript/module/core/mixins/OxyServices.analytics.d.ts +0 -67
  977. package/lib/typescript/module/core/mixins/OxyServices.analytics.d.ts.map +0 -1
  978. package/lib/typescript/module/core/mixins/OxyServices.assets.d.ts +0 -136
  979. package/lib/typescript/module/core/mixins/OxyServices.assets.d.ts.map +0 -1
  980. package/lib/typescript/module/core/mixins/OxyServices.auth.d.ts +0 -187
  981. package/lib/typescript/module/core/mixins/OxyServices.auth.d.ts.map +0 -1
  982. package/lib/typescript/module/core/mixins/OxyServices.developer.d.ts +0 -100
  983. package/lib/typescript/module/core/mixins/OxyServices.developer.d.ts.map +0 -1
  984. package/lib/typescript/module/core/mixins/OxyServices.devices.d.ts +0 -97
  985. package/lib/typescript/module/core/mixins/OxyServices.devices.d.ts.map +0 -1
  986. package/lib/typescript/module/core/mixins/OxyServices.features.d.ts +0 -229
  987. package/lib/typescript/module/core/mixins/OxyServices.features.d.ts.map +0 -1
  988. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts +0 -201
  989. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +0 -1
  990. package/lib/typescript/module/core/mixins/OxyServices.karma.d.ts +0 -86
  991. package/lib/typescript/module/core/mixins/OxyServices.karma.d.ts.map +0 -1
  992. package/lib/typescript/module/core/mixins/OxyServices.language.d.ts +0 -82
  993. package/lib/typescript/module/core/mixins/OxyServices.language.d.ts.map +0 -1
  994. package/lib/typescript/module/core/mixins/OxyServices.location.d.ts +0 -65
  995. package/lib/typescript/module/core/mixins/OxyServices.location.d.ts.map +0 -1
  996. package/lib/typescript/module/core/mixins/OxyServices.payment.d.ts +0 -112
  997. package/lib/typescript/module/core/mixins/OxyServices.payment.d.ts.map +0 -1
  998. package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts +0 -206
  999. package/lib/typescript/module/core/mixins/OxyServices.popup.d.ts.map +0 -1
  1000. package/lib/typescript/module/core/mixins/OxyServices.privacy.d.ts +0 -123
  1001. package/lib/typescript/module/core/mixins/OxyServices.privacy.d.ts.map +0 -1
  1002. package/lib/typescript/module/core/mixins/OxyServices.redirect.d.ts +0 -246
  1003. package/lib/typescript/module/core/mixins/OxyServices.redirect.d.ts.map +0 -1
  1004. package/lib/typescript/module/core/mixins/OxyServices.security.d.ts +0 -79
  1005. package/lib/typescript/module/core/mixins/OxyServices.security.d.ts.map +0 -1
  1006. package/lib/typescript/module/core/mixins/OxyServices.user.d.ts +0 -185
  1007. package/lib/typescript/module/core/mixins/OxyServices.user.d.ts.map +0 -1
  1008. package/lib/typescript/module/core/mixins/OxyServices.utility.d.ts +0 -94
  1009. package/lib/typescript/module/core/mixins/OxyServices.utility.d.ts.map +0 -1
  1010. package/lib/typescript/module/core/mixins/index.d.ts +0 -31
  1011. package/lib/typescript/module/core/mixins/index.d.ts.map +0 -1
  1012. package/lib/typescript/module/core/mixins/mixinHelpers.d.ts +0 -32
  1013. package/lib/typescript/module/core/mixins/mixinHelpers.d.ts.map +0 -1
  1014. package/lib/typescript/module/crypto/index.d.ts +0 -12
  1015. package/lib/typescript/module/crypto/index.d.ts.map +0 -1
  1016. package/lib/typescript/module/crypto/keyManager.d.ts +0 -190
  1017. package/lib/typescript/module/crypto/keyManager.d.ts.map +0 -1
  1018. package/lib/typescript/module/crypto/polyfill.d.ts +0 -13
  1019. package/lib/typescript/module/crypto/polyfill.d.ts.map +0 -1
  1020. package/lib/typescript/module/crypto/recoveryPhrase.d.ts +0 -59
  1021. package/lib/typescript/module/crypto/recoveryPhrase.d.ts.map +0 -1
  1022. package/lib/typescript/module/crypto/signatureService.d.ts +0 -87
  1023. package/lib/typescript/module/crypto/signatureService.d.ts.map +0 -1
  1024. package/lib/typescript/module/i18n/index.d.ts +0 -4
  1025. package/lib/typescript/module/i18n/index.d.ts.map +0 -1
  1026. package/lib/typescript/module/models/interfaces.d.ts +0 -416
  1027. package/lib/typescript/module/models/interfaces.d.ts.map +0 -1
  1028. package/lib/typescript/module/models/session.d.ts +0 -28
  1029. package/lib/typescript/module/models/session.d.ts.map +0 -1
  1030. package/lib/typescript/module/node/index.d.ts +0 -10
  1031. package/lib/typescript/module/node/index.d.ts.map +0 -1
  1032. package/lib/typescript/module/shared/index.d.ts +0 -29
  1033. package/lib/typescript/module/shared/index.d.ts.map +0 -1
  1034. package/lib/typescript/module/shared/utils/colorUtils.d.ts +0 -105
  1035. package/lib/typescript/module/shared/utils/colorUtils.d.ts.map +0 -1
  1036. package/lib/typescript/module/shared/utils/debugUtils.d.ts +0 -49
  1037. package/lib/typescript/module/shared/utils/debugUtils.d.ts.map +0 -1
  1038. package/lib/typescript/module/shared/utils/errorUtils.d.ts +0 -98
  1039. package/lib/typescript/module/shared/utils/errorUtils.d.ts.map +0 -1
  1040. package/lib/typescript/module/shared/utils/index.d.ts +0 -14
  1041. package/lib/typescript/module/shared/utils/index.d.ts.map +0 -1
  1042. package/lib/typescript/module/shared/utils/networkUtils.d.ts +0 -140
  1043. package/lib/typescript/module/shared/utils/networkUtils.d.ts.map +0 -1
  1044. package/lib/typescript/module/shared/utils/themeUtils.d.ts +0 -91
  1045. package/lib/typescript/module/shared/utils/themeUtils.d.ts.map +0 -1
  1046. package/lib/typescript/module/utils/apiUtils.d.ts +0 -54
  1047. package/lib/typescript/module/utils/apiUtils.d.ts.map +0 -1
  1048. package/lib/typescript/module/utils/asyncUtils.d.ts +0 -59
  1049. package/lib/typescript/module/utils/asyncUtils.d.ts.map +0 -1
  1050. package/lib/typescript/module/utils/cache.d.ts +0 -128
  1051. package/lib/typescript/module/utils/cache.d.ts.map +0 -1
  1052. package/lib/typescript/module/utils/deviceManager.d.ts +0 -66
  1053. package/lib/typescript/module/utils/deviceManager.d.ts.map +0 -1
  1054. package/lib/typescript/module/utils/errorUtils.d.ts +0 -47
  1055. package/lib/typescript/module/utils/errorUtils.d.ts.map +0 -1
  1056. package/lib/typescript/module/utils/index.d.ts +0 -7
  1057. package/lib/typescript/module/utils/index.d.ts.map +0 -1
  1058. package/lib/typescript/module/utils/languageUtils.d.ts +0 -38
  1059. package/lib/typescript/module/utils/languageUtils.d.ts.map +0 -1
  1060. package/lib/typescript/module/utils/loggerUtils.d.ts +0 -49
  1061. package/lib/typescript/module/utils/loggerUtils.d.ts.map +0 -1
  1062. package/lib/typescript/module/utils/platform.d.ts +0 -41
  1063. package/lib/typescript/module/utils/platform.d.ts.map +0 -1
  1064. package/lib/typescript/module/utils/platformInit.d.ts +0 -10
  1065. package/lib/typescript/module/utils/platformInit.d.ts.map +0 -1
  1066. package/lib/typescript/module/utils/platformInit.native.d.ts +0 -2
  1067. package/lib/typescript/module/utils/platformInit.native.d.ts.map +0 -1
  1068. package/lib/typescript/module/utils/requestUtils.d.ts +0 -124
  1069. package/lib/typescript/module/utils/requestUtils.d.ts.map +0 -1
  1070. package/lib/typescript/module/utils/sessionUtils.d.ts +0 -55
  1071. package/lib/typescript/module/utils/sessionUtils.d.ts.map +0 -1
  1072. package/lib/typescript/module/utils/validationUtils.d.ts +0 -86
  1073. package/lib/typescript/module/utils/validationUtils.d.ts.map +0 -1
  1074. package/lib/typescript/module/web/WebOxyContext.d.ts +0 -152
  1075. package/lib/typescript/module/web/WebOxyContext.d.ts.map +0 -1
  1076. package/lib/typescript/module/web/index.d.ts +0 -53
  1077. package/lib/typescript/module/web/index.d.ts.map +0 -1
  1078. package/lib/typescript/module/web.d.ts +0 -54
  1079. package/lib/typescript/module/web.d.ts.map +0 -1
  1080. package/lib/typescript/types/bip39.d.ts +0 -32
  1081. package/lib/typescript/types/buffer.d.ts +0 -97
  1082. package/lib/typescript/types/color.d.ts +0 -20
  1083. package/lib/typescript/types/elliptic.d.ts +0 -62
  1084. package/src/constants/version.ts +0 -15
  1085. package/src/core/AuthManager.ts +0 -436
  1086. package/src/core/CrossDomainAuth.ts +0 -307
  1087. package/src/core/HttpService.ts +0 -752
  1088. package/src/core/OxyServices.base.ts +0 -334
  1089. package/src/core/OxyServices.errors.ts +0 -26
  1090. package/src/core/OxyServices.ts +0 -129
  1091. package/src/core/index.ts +0 -42
  1092. package/src/core/mixins/OxyServices.analytics.ts +0 -53
  1093. package/src/core/mixins/OxyServices.assets.ts +0 -412
  1094. package/src/core/mixins/OxyServices.auth.ts +0 -358
  1095. package/src/core/mixins/OxyServices.developer.ts +0 -114
  1096. package/src/core/mixins/OxyServices.devices.ts +0 -119
  1097. package/src/core/mixins/OxyServices.features.ts +0 -428
  1098. package/src/core/mixins/OxyServices.fedcm.ts +0 -494
  1099. package/src/core/mixins/OxyServices.karma.ts +0 -111
  1100. package/src/core/mixins/OxyServices.language.ts +0 -127
  1101. package/src/core/mixins/OxyServices.location.ts +0 -46
  1102. package/src/core/mixins/OxyServices.payment.ts +0 -163
  1103. package/src/core/mixins/OxyServices.popup.ts +0 -443
  1104. package/src/core/mixins/OxyServices.privacy.ts +0 -182
  1105. package/src/core/mixins/OxyServices.redirect.ts +0 -397
  1106. package/src/core/mixins/OxyServices.security.ts +0 -103
  1107. package/src/core/mixins/OxyServices.user.ts +0 -392
  1108. package/src/core/mixins/OxyServices.utility.ts +0 -191
  1109. package/src/core/mixins/index.ts +0 -91
  1110. package/src/core/mixins/mixinHelpers.ts +0 -69
  1111. package/src/crypto/index.ts +0 -25
  1112. package/src/crypto/keyManager.ts +0 -962
  1113. package/src/crypto/polyfill.ts +0 -81
  1114. package/src/crypto/recoveryPhrase.ts +0 -166
  1115. package/src/crypto/signatureService.ts +0 -323
  1116. package/src/i18n/index.ts +0 -75
  1117. package/src/i18n/locales/ar-SA.json +0 -120
  1118. package/src/i18n/locales/ca-ES.json +0 -120
  1119. package/src/i18n/locales/de-DE.json +0 -120
  1120. package/src/i18n/locales/en-US.json +0 -956
  1121. package/src/i18n/locales/es-ES.json +0 -944
  1122. package/src/i18n/locales/fr-FR.json +0 -120
  1123. package/src/i18n/locales/it-IT.json +0 -120
  1124. package/src/i18n/locales/ja-JP.json +0 -119
  1125. package/src/i18n/locales/ko-KR.json +0 -120
  1126. package/src/i18n/locales/pt-PT.json +0 -120
  1127. package/src/i18n/locales/zh-CN.json +0 -120
  1128. package/src/models/interfaces.ts +0 -511
  1129. package/src/models/session.ts +0 -30
  1130. package/src/node/index.ts +0 -17
  1131. package/src/shared/index.ts +0 -82
  1132. package/src/shared/utils/colorUtils.ts +0 -155
  1133. package/src/shared/utils/debugUtils.ts +0 -73
  1134. package/src/shared/utils/errorUtils.ts +0 -181
  1135. package/src/shared/utils/index.ts +0 -59
  1136. package/src/shared/utils/networkUtils.ts +0 -248
  1137. package/src/shared/utils/themeUtils.ts +0 -115
  1138. package/src/types/bip39.d.ts +0 -32
  1139. package/src/types/buffer.d.ts +0 -97
  1140. package/src/types/color.d.ts +0 -20
  1141. package/src/types/elliptic.d.ts +0 -62
  1142. package/src/utils/__tests__/validationUtils.test.ts +0 -236
  1143. package/src/utils/apiUtils.ts +0 -88
  1144. package/src/utils/asyncUtils.ts +0 -252
  1145. package/src/utils/cache.ts +0 -264
  1146. package/src/utils/deviceManager.ts +0 -198
  1147. package/src/utils/errorUtils.ts +0 -216
  1148. package/src/utils/index.ts +0 -21
  1149. package/src/utils/languageUtils.ts +0 -174
  1150. package/src/utils/loggerUtils.ts +0 -153
  1151. package/src/utils/platform.ts +0 -117
  1152. package/src/utils/platformInit.native.ts +0 -13
  1153. package/src/utils/platformInit.ts +0 -11
  1154. package/src/utils/requestUtils.ts +0 -237
  1155. package/src/utils/sessionUtils.ts +0 -206
  1156. package/src/utils/validationUtils.ts +0 -174
  1157. package/src/web/WebOxyContext.tsx +0 -470
  1158. package/src/web/index.ts +0 -157
  1159. package/src/web.ts +0 -230
@@ -1 +0,0 @@
1
- {"version":3,"file":"oxy-services.esm.js","sources":["../../../../node_modules/ieee754/index.js","../../../../node_modules/buffer/index.js","../../../../node_modules/base64-js/index.js","../../../src/crypto/polyfill.ts","../../../src/core/OxyServices.errors.ts","../../../../node_modules/jwt-decode/build/esm/index.js","../../../src/utils/loggerUtils.ts","../../../src/utils/errorUtils.ts","../../../src/utils/cache.ts","../../../src/utils/requestUtils.ts","../../../src/utils/asyncUtils.ts","../../../src/utils/platform.ts","../../../src/core/HttpService.ts","../../../src/core/OxyServices.base.ts","../../../src/shared/utils/debugUtils.ts","../../../src/core/mixins/OxyServices.fedcm.ts","../../../src/core/mixins/OxyServices.popup.ts","../../../src/utils/apiUtils.ts","../../../src/utils/languageUtils.ts","../../../src/core/mixins/mixinHelpers.ts","../../../src/core/mixins/index.ts","../../../src/core/mixins/OxyServices.auth.ts","../../../src/core/mixins/OxyServices.redirect.ts","../../../src/core/mixins/OxyServices.user.ts","../../../src/core/mixins/OxyServices.privacy.ts","../../../src/core/mixins/OxyServices.language.ts","../../../src/core/mixins/OxyServices.payment.ts","../../../src/core/mixins/OxyServices.karma.ts","../../../src/core/mixins/OxyServices.assets.ts","../../../src/core/mixins/OxyServices.developer.ts","../../../src/core/mixins/OxyServices.location.ts","../../../src/core/mixins/OxyServices.analytics.ts","../../../src/core/mixins/OxyServices.devices.ts","../../../src/core/mixins/OxyServices.security.ts","../../../src/core/mixins/OxyServices.features.ts","../../../src/core/mixins/OxyServices.utility.ts","../../../src/core/OxyServices.ts","../../../src/core/CrossDomainAuth.ts","../../../src/models/interfaces.ts","../../../src/utils/deviceManager.ts","../../../../node_modules/bn.js/lib/bn.js","../../../../node_modules/minimalistic-assert/index.js","../../../../node_modules/minimalistic-crypto-utils/lib/utils.js","../../../../node_modules/elliptic/lib/elliptic/utils.js","../../../../node_modules/brorand/index.js","../../../../node_modules/elliptic/lib/elliptic/curve/base.js","../../../../node_modules/inherits/inherits_browser.js","../../../../node_modules/elliptic/lib/elliptic/curve/index.js","../../../../node_modules/elliptic/lib/elliptic/curve/short.js","../../../../node_modules/elliptic/lib/elliptic/curve/mont.js","../../../../node_modules/elliptic/lib/elliptic/curve/edwards.js","../../../../node_modules/hash.js/lib/hash/utils.js","../../../../node_modules/hash.js/lib/hash/common.js","../../../../node_modules/hash.js/lib/hash/sha/common.js","../../../../node_modules/hash.js/lib/hash/sha/256.js","../../../../node_modules/hash.js/lib/hash/sha/512.js","../../../../node_modules/hash.js/lib/hash/sha.js","../../../../node_modules/hash.js/lib/hash/sha/1.js","../../../../node_modules/hash.js/lib/hash/sha/224.js","../../../../node_modules/hash.js/lib/hash/sha/384.js","../../../../node_modules/hash.js/lib/hash.js","../../../../node_modules/hash.js/lib/hash/ripemd.js","../../../../node_modules/hash.js/lib/hash/hmac.js","../../../../node_modules/elliptic/lib/elliptic/curves.js","../../../../node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js","../../../../node_modules/elliptic/lib/elliptic/ec/index.js","../../../../node_modules/hmac-drbg/lib/hmac-drbg.js","../../../../node_modules/elliptic/lib/elliptic/ec/key.js","../../../../node_modules/elliptic/lib/elliptic/ec/signature.js","../../../../node_modules/elliptic/lib/elliptic/eddsa/index.js","../../../../node_modules/elliptic/lib/elliptic/eddsa/key.js","../../../../node_modules/elliptic/lib/elliptic/eddsa/signature.js","../../../../node_modules/elliptic/lib/elliptic.js","../../../src/crypto/keyManager.ts","../../../src/crypto/signatureService.ts","../../../../node_modules/@noble/hashes/utils.js","../../../../node_modules/@noble/hashes/crypto.js","../../../../node_modules/@noble/hashes/_md.js","../../../../node_modules/@noble/hashes/_u64.js","../../../../node_modules/@noble/hashes/sha2.js","../../../../node_modules/@noble/hashes/sha256.js","../../../../node_modules/@noble/hashes/sha512.js","../../../../node_modules/@noble/hashes/hmac.js","../../../../node_modules/@noble/hashes/pbkdf2.js","../../../../node_modules/bip39/src/_wordlists.js","../../../../node_modules/bip39/src/index.js","../../../src/crypto/recoveryPhrase.ts","../../../src/lib/sonner.web.ts","../../../src/ui/stores/authStore.ts","../../../../node_modules/engine.io-parser/build/esm/commons.js","../../../../node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../../../../node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../../../../node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../../../../node_modules/engine.io-parser/build/esm/index.js","../../../../node_modules/@socket.io/component-emitter/lib/esm/index.js","../../../../node_modules/engine.io-client/build/esm/globals.js","../../../../node_modules/engine.io-client/build/esm/util.js","../../../../node_modules/engine.io-client/build/esm/transport.js","../../../../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../../../../node_modules/engine.io-client/build/esm/transports/polling.js","../../../../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../../../../node_modules/engine.io-client/build/esm/transports/polling-xhr.js","../../../../node_modules/engine.io-client/build/esm/transports/websocket.js","../../../../node_modules/engine.io-client/build/esm/transports/index.js","../../../../node_modules/engine.io-client/build/esm/transports/webtransport.js","../../../../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../../../../node_modules/engine.io-client/build/esm/socket.js","../../../../node_modules/socket.io-parser/build/esm/is-binary.js","../../../../node_modules/socket.io-parser/build/esm/binary.js","../../../../node_modules/socket.io-parser/build/esm/index.js","../../../../node_modules/socket.io-client/build/esm/on.js","../../../../node_modules/socket.io-client/build/esm/socket.js","../../../../node_modules/socket.io-client/build/esm/contrib/backo2.js","../../../../node_modules/socket.io-client/build/esm/manager.js","../../../../node_modules/socket.io-client/build/esm/index.js","../../../../node_modules/socket.io-client/build/esm/url.js","../../../src/ui/hooks/useSessionSocket.ts","../../../src/ui/utils/errorHandlers.ts","../../../src/utils/sessionUtils.ts","../../../src/ui/utils/sessionHelpers.ts","../../../src/ui/utils/storageHelpers.ts","../../../src/ui/hooks/queryClient.ts","../../../src/ui/hooks/useSessionManagement.ts","../../../src/ui/context/hooks/useAuthOperations.ts","../../../src/ui/navigation/routes.ts","../../../../node_modules/zustand/esm/vanilla.mjs","../../../src/ui/navigation/bottomSheetManager.ts","../../../src/i18n/index.ts","../../../src/ui/stores/accountStore.ts","../../../src/ui/hooks/queries/queryKeys.ts","../../../src/ui/utils/authHelpers.ts","../../../src/ui/utils/avatarUtils.ts","../../../src/ui/hooks/useWebSSO.ts","../../../src/ui/context/OxyContext.tsx","../../../src/ui/hooks/useLanguageManagement.ts","../../../src/ui/hooks/useDeviceManagement.ts","../../../src/ui/hooks/useAuth.ts","../../../src/ui/components/WebOxyProvider.tsx","../../../src/ui/stores/assetStore.ts","../../../src/ui/hooks/useAssets.ts","../../../src/ui/hooks/useFileDownloadUrl.ts","../../../src/ui/hooks/queries/useAccountQueries.ts","../../../src/ui/hooks/queries/useServicesQueries.ts","../../../src/ui/hooks/queries/useSecurityQueries.ts","../../../src/ui/hooks/mutations/useAccountMutations.ts","../../../src/ui/hooks/mutations/useServicesMutations.ts","../../../src/ui/hooks/mutations/mutationFactory.ts","../../../src/ui/hooks/useFileFiltering.ts","../../../src/utils/validationUtils.ts","../../../src/utils/hookUtils.ts"],"sourcesContent":["/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/**\n * Crypto Polyfills for React Native\n * \n * This file ensures that required polyfills are available\n * before any crypto operations are performed.\n * \n * Polyfills included:\n * - Buffer: Required by bip39 and other crypto libraries\n * - crypto.getRandomValues: Required by bip39 for secure random number generation\n */\n\n// Import Buffer polyfill for React Native compatibility\n// Libraries like bip39 depend on Buffer which isn't available in React Native\nimport { Buffer } from 'buffer';\n\n// Get the global object in a cross-platform way\nconst getGlobalObject = (): typeof globalThis => {\n if (typeof globalThis !== 'undefined') return globalThis;\n if (typeof global !== 'undefined') return global;\n if (typeof window !== 'undefined') return window as unknown as typeof globalThis;\n if (typeof self !== 'undefined') return self as unknown as typeof globalThis;\n return {} as typeof globalThis;\n};\n\nconst globalObject = getGlobalObject();\n\n// Make Buffer available globally for libraries that depend on it\nif (!globalObject.Buffer) {\n (globalObject as unknown as { Buffer: typeof Buffer }).Buffer = Buffer;\n}\n\n// Polyfill crypto.getRandomValues for React Native\n// This is required by bip39 and other crypto libraries\ntype CryptoLike = {\n getRandomValues: <T extends ArrayBufferView>(array: T) => T;\n};\n\n// Cache for expo-crypto module\nlet expoCryptoModule: typeof import('expo-crypto') | null = null;\n\n/**\n * Get random bytes using expo-crypto (synchronous)\n * This is a synchronous wrapper that loads expo-crypto lazily\n */\nfunction getRandomBytesSync(byteCount: number): Uint8Array {\n if (!expoCryptoModule) {\n // Try to require expo-crypto synchronously\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n expoCryptoModule = require('expo-crypto');\n } catch {\n throw new Error('expo-crypto is required for crypto.getRandomValues polyfill');\n }\n }\n // TypeScript guard - expoCryptoModule is guaranteed to be non-null here\n const cryptoModule = expoCryptoModule;\n if (!cryptoModule) {\n throw new Error('Failed to load expo-crypto module');\n }\n return cryptoModule.getRandomBytes(byteCount);\n}\n\nconst cryptoPolyfill: CryptoLike = {\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n const bytes = getRandomBytesSync(array.byteLength);\n const uint8View = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n uint8View.set(bytes);\n return array;\n },\n};\n\n// Only polyfill if crypto or crypto.getRandomValues is not available\nif (typeof globalObject.crypto === 'undefined') {\n (globalObject as unknown as { crypto: CryptoLike }).crypto = cryptoPolyfill;\n} else if (typeof globalObject.crypto.getRandomValues !== 'function') {\n (globalObject.crypto as CryptoLike).getRandomValues = cryptoPolyfill.getRandomValues;\n}\n\n// Re-export Buffer for convenience\nexport { Buffer };\n\n","/**\n * Custom error types for better error handling\n */\nexport class OxyAuthenticationError extends Error {\n public readonly code: string;\n public readonly status: number;\n\n constructor(message: string, code = 'AUTH_ERROR', status = 401) {\n super(message);\n this.name = 'OxyAuthenticationError';\n this.code = code;\n this.status = status;\n }\n}\n\nexport class OxyAuthenticationTimeoutError extends OxyAuthenticationError {\n constructor(operationName: string, timeoutMs: number) {\n super(\n `Authentication timeout (${timeoutMs}ms): ${operationName} requires user authentication. Please ensure the user is logged in before calling this method.`,\n 'AUTH_TIMEOUT',\n 408\n );\n this.name = 'OxyAuthenticationTimeoutError';\n }\n}\n\n","export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n","/**\n * Centralized logging utilities for consistent logging across the application\n */\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4\n}\n\nexport interface LogContext {\n component?: string;\n method?: string;\n userId?: string;\n sessionId?: string;\n requestId?: string;\n [key: string]: unknown;\n}\n\nclass Logger {\n private level: LogLevel = LogLevel.INFO;\n private isDevelopment: boolean = process.env.NODE_ENV === 'development';\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n private shouldLog(level: LogLevel): boolean {\n return level >= this.level;\n }\n\n private formatMessage(level: string, message: string, context?: LogContext): string {\n const timestamp = new Date().toISOString();\n const contextStr = context ? ` [${Object.entries(context).map(([k, v]) => `${k}:${v}`).join(', ')}]` : '';\n return `[${timestamp}] ${level}${contextStr}: ${message}`;\n }\n\n debug(message: string, context?: LogContext, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.DEBUG)) {\n const formattedMessage = this.formatMessage('DEBUG', message, context);\n if (this.isDevelopment) {\n console.log(formattedMessage, ...args);\n }\n }\n }\n\n info(message: string, context?: LogContext, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.INFO)) {\n const formattedMessage = this.formatMessage('INFO', message, context);\n console.log(formattedMessage, ...args);\n }\n }\n\n warn(message: string, context?: LogContext, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.WARN)) {\n const formattedMessage = this.formatMessage('WARN', message, context);\n console.warn(formattedMessage, ...args);\n }\n }\n\n error(message: string, error?: Error | unknown, context?: LogContext, ...args: unknown[]): void {\n if (this.shouldLog(LogLevel.ERROR)) {\n const formattedMessage = this.formatMessage('ERROR', message, context);\n if (error) {\n console.error(formattedMessage, error, ...args);\n } else {\n console.error(formattedMessage, ...args);\n }\n }\n }\n\n // Specialized logging methods for common patterns\n auth(message: string, context?: LogContext, ...args: unknown[]): void {\n this.info(`🔐 ${message}`, { ...context, category: 'auth' }, ...args);\n }\n\n api(message: string, context?: LogContext, ...args: unknown[]): void {\n this.info(`🌐 ${message}`, { ...context, category: 'api' }, ...args);\n }\n\n session(message: string, context?: LogContext, ...args: unknown[]): void {\n this.info(`📱 ${message}`, { ...context, category: 'session' }, ...args);\n }\n\n user(message: string, context?: LogContext, ...args: unknown[]): void {\n this.info(`👤 ${message}`, { ...context, category: 'user' }, ...args);\n }\n\n device(message: string, context?: LogContext, ...args: unknown[]): void {\n this.info(`📱 ${message}`, { ...context, category: 'device' }, ...args);\n }\n\n payment(message: string, context?: LogContext, ...args: unknown[]): void {\n this.info(`💳 ${message}`, { ...context, category: 'payment' }, ...args);\n }\n\n // Performance logging\n performance(operation: string, duration: number, context?: LogContext): void {\n const level = duration > 1000 ? LogLevel.WARN : LogLevel.INFO;\n const message = `⏱️ ${operation} completed in ${duration}ms`;\n if (level === LogLevel.WARN) {\n this.warn(message, { ...context, category: 'performance', duration });\n } else {\n this.info(message, { ...context, category: 'performance', duration });\n }\n }\n\n // Error logging with stack trace\n errorWithStack(message: string, error: Error, context?: LogContext): void {\n this.error(message, error, { ...context, stack: error.stack });\n }\n\n // Group related log messages\n group(label: string, fn: () => void): void {\n if (this.isDevelopment && this.shouldLog(LogLevel.DEBUG)) {\n console.group(label);\n fn();\n console.groupEnd();\n } else {\n fn();\n }\n }\n}\n\n// Create singleton instance\nexport const logger = new Logger();\n\n// Convenience functions for common logging patterns\nexport const logAuth = (message: string, context?: LogContext, ...args: unknown[]) => \n logger.auth(message, context, ...args);\n\nexport const logApi = (message: string, context?: LogContext, ...args: unknown[]) => \n logger.api(message, context, ...args);\n\nexport const logSession = (message: string, context?: LogContext, ...args: unknown[]) => \n logger.session(message, context, ...args);\n\nexport const logUser = (message: string, context?: LogContext, ...args: unknown[]) => \n logger.user(message, context, ...args);\n\nexport const logDevice = (message: string, context?: LogContext, ...args: unknown[]) => \n logger.device(message, context, ...args);\n\nexport const logPayment = (message: string, context?: LogContext, ...args: unknown[]) => \n logger.payment(message, context, ...args);\n\nexport const logError = (message: string, error?: Error | unknown, context?: LogContext, ...args: unknown[]) => \n logger.error(message, error, context, ...args);\n\nexport const logPerformance = (operation: string, duration: number, context?: LogContext) => \n logger.performance(operation, duration, context); ","import type { ApiError } from '../models/interfaces';\nimport { logger } from './loggerUtils';\n\n/**\n * Error handling utilities for consistent error processing\n */\n\n/**\n * Common error codes\n */\nexport const ErrorCodes = {\n // Authentication errors\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n INVALID_TOKEN: 'INVALID_TOKEN',\n MISSING_TOKEN: 'MISSING_TOKEN',\n \n // Validation errors\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n BAD_REQUEST: 'BAD_REQUEST',\n MISSING_PARAMETER: 'MISSING_PARAMETER',\n INVALID_FORMAT: 'INVALID_FORMAT',\n \n // Resource errors\n NOT_FOUND: 'NOT_FOUND',\n ALREADY_EXISTS: 'ALREADY_EXISTS',\n CONFLICT: 'CONFLICT',\n \n // Server errors\n INTERNAL_ERROR: 'INTERNAL_ERROR',\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\n TIMEOUT: 'TIMEOUT',\n \n // Network errors\n NETWORK_ERROR: 'NETWORK_ERROR',\n CONNECTION_FAILED: 'CONNECTION_FAILED'\n} as const;\n\n/**\n * Create a standardized API error\n */\nexport function createApiError(\n message: string,\n code: string = ErrorCodes.INTERNAL_ERROR,\n status = 500,\n details?: Record<string, unknown>\n): ApiError {\n return {\n message,\n code,\n status,\n details\n };\n}\n\n/**\n * Handle common HTTP errors and convert to ApiError\n */\nexport function handleHttpError(error: unknown): ApiError {\n // If it's already an ApiError, ensure it has a non-empty message\n if (error && typeof error === 'object' && 'code' in error && 'status' in error) {\n const apiError = error as ApiError;\n // Ensure message is not empty\n if (!apiError.message || !apiError.message.trim()) {\n return {\n ...apiError,\n message: apiError.message || 'An error occurred',\n };\n }\n return apiError;\n }\n\n // Handle AbortError (timeout or cancelled requests)\n if (error instanceof Error && error.name === 'AbortError') {\n return createApiError(\n 'Request timeout or cancelled',\n ErrorCodes.TIMEOUT,\n 0\n );\n }\n\n // Handle TypeError (network failures, CORS, etc.)\n if (error instanceof TypeError) {\n // Check if it's a network-related TypeError\n if (error.message.includes('fetch') || error.message.includes('network') || error.message.includes('Failed to fetch')) {\n return createApiError(\n 'Network error - failed to connect to server',\n ErrorCodes.NETWORK_ERROR,\n 0\n );\n }\n return createApiError(\n error.message || 'Network error occurred',\n ErrorCodes.NETWORK_ERROR,\n 0\n );\n }\n\n // Handle fetch Response errors - check if it has response property with status\n if (error && typeof error === 'object' && 'response' in error) {\n const fetchError = error as { \n response?: { \n status: number; \n statusText?: string;\n };\n status?: number;\n message?: string;\n };\n \n const status = fetchError.response?.status || fetchError.status;\n if (status) {\n return createApiError(\n fetchError.message || `HTTP ${status} error`,\n getErrorCodeFromStatus(status),\n status\n );\n }\n }\n\n // Handle standard errors\n if (error instanceof Error) {\n // Check for common error patterns\n if (error.message.includes('timeout') || error.message.includes('aborted')) {\n return createApiError(\n 'Request timeout',\n ErrorCodes.TIMEOUT,\n 0\n );\n }\n \n if (error.message.includes('network') || error.message.includes('fetch')) {\n return createApiError(\n error.message || 'Network error occurred',\n ErrorCodes.NETWORK_ERROR,\n 0\n );\n }\n\n return createApiError(\n error.message || 'Unknown error occurred',\n ErrorCodes.INTERNAL_ERROR,\n 500\n );\n }\n\n // Handle other errors - ensure we always return a non-empty message\n const errorString = error ? String(error) : '';\n const message = errorString.trim() || 'Unknown error occurred';\n return createApiError(\n message,\n ErrorCodes.INTERNAL_ERROR,\n 500\n );\n}\n\n/**\n * Get error code from HTTP status\n * Exported for use in other modules\n */\nexport function getErrorCodeFromStatus(status: number): string {\n switch (status) {\n case 400:\n return ErrorCodes.BAD_REQUEST;\n case 401:\n return ErrorCodes.UNAUTHORIZED;\n case 403:\n return ErrorCodes.FORBIDDEN;\n case 404:\n return ErrorCodes.NOT_FOUND;\n case 409:\n return ErrorCodes.CONFLICT;\n case 422:\n return ErrorCodes.VALIDATION_ERROR;\n case 500:\n return ErrorCodes.INTERNAL_ERROR;\n case 503:\n return ErrorCodes.SERVICE_UNAVAILABLE;\n default:\n return ErrorCodes.INTERNAL_ERROR;\n }\n}\n\n/**\n * Validate required fields and throw error if missing\n */\nexport function validateRequiredFields(data: Record<string, unknown>, fields: string[]): void {\n const missing = fields.filter(field => !data[field]);\n \n if (missing.length > 0) {\n throw createApiError(\n `Missing required fields: ${missing.join(', ')}`,\n ErrorCodes.MISSING_PARAMETER,\n 400\n );\n }\n}\n\n/**\n * Safe error logging with context\n */\nexport function logError(error: unknown, context?: string): void {\n if (error instanceof Error) {\n logger.error(error.message, {\n component: context || 'errorUtils',\n method: 'logError',\n stack: error.stack,\n });\n } else {\n logger.error(String(error), {\n component: context || 'errorUtils',\n method: 'logError',\n });\n }\n}\n\n ","/**\n * Centralized cache utility with TTL support\n * \n * This is a production-ready cache implementation used across the codebase\n * for consistent caching behavior and performance optimization.\n */\n\n/**\n * Cache entry with expiration tracking\n */\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n expiresAt: number;\n}\n\n/**\n * Cache statistics\n */\nexport interface CacheStats {\n size: number;\n hits: number;\n misses: number;\n hitRate: number;\n}\n\n/**\n * TTL-based cache implementation\n * \n * Features:\n * - Automatic expiration based on TTL\n * - Manual cleanup of expired entries\n * - Statistics tracking (hits, misses, hit rate)\n * - Type-safe generic interface\n * \n * @example\n * ```typescript\n * const cache = new TTLCache<string>(5 * 60 * 1000); // 5 minutes\n * \n * // Set with default TTL\n * cache.set('key', 'value');\n * \n * // Set with custom TTL\n * cache.set('key', 'value', 10 * 60 * 1000); // 10 minutes\n * \n * // Get value\n * const value = cache.get('key');\n * \n * // Get statistics\n * const stats = cache.getStats();\n * ```\n */\nexport class TTLCache<T> {\n private cache = new Map<string, CacheEntry<T>>();\n private defaultTTL: number;\n private hits = 0;\n private misses = 0;\n\n /**\n * Create a new TTL cache\n * @param defaultTTL Default TTL in milliseconds (default: 5 minutes)\n */\n constructor(defaultTTL: number = 5 * 60 * 1000) {\n this.defaultTTL = defaultTTL;\n }\n\n /**\n * Get a value from cache\n * @param key Cache key\n * @returns Cached value or null if not found or expired\n */\n get(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) {\n this.misses++;\n return null;\n }\n\n const now = Date.now();\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n this.misses++;\n return null;\n }\n\n this.hits++;\n return entry.data;\n }\n\n /**\n * Set a value in cache\n * @param key Cache key\n * @param data Data to cache\n * @param ttl Optional TTL override (uses default if not provided)\n */\n set(key: string, data: T, ttl?: number): void {\n const now = Date.now();\n const expiresAt = now + (ttl || this.defaultTTL);\n this.cache.set(key, { data, timestamp: now, expiresAt });\n }\n\n /**\n * Delete a specific cache entry\n * @param key Cache key\n * @returns true if entry was deleted, false if not found\n */\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cache entries\n */\n clear(): void {\n this.cache.clear();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Check if a key exists and is not expired\n * @param key Cache key\n * @returns true if key exists and is valid\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Get all valid cache keys\n * @returns Array of valid cache keys\n */\n keys(): string[] {\n const now = Date.now();\n const validKeys: string[] = [];\n\n for (const [key, entry] of this.cache.entries()) {\n if (now <= entry.expiresAt) {\n validKeys.push(key);\n } else {\n this.cache.delete(key);\n }\n }\n\n return validKeys;\n }\n\n /**\n * Clean up expired entries\n * @returns Number of entries removed\n */\n cleanup(): number {\n const now = Date.now();\n let removed = 0;\n\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n removed++;\n }\n }\n\n return removed;\n }\n\n /**\n * Get cache size (number of entries)\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): CacheStats {\n const total = this.hits + this.misses;\n return {\n size: this.cache.size,\n hits: this.hits,\n misses: this.misses,\n hitRate: total > 0 ? this.hits / total : 0,\n };\n }\n\n /**\n * Reset statistics (keeps cache entries)\n */\n resetStats(): void {\n this.hits = 0;\n this.misses = 0;\n }\n}\n\n/**\n * Create a TTL cache instance (convenience function)\n * \n * @example\n * ```typescript\n * const cache = createCache<string>(5 * 60 * 1000);\n * ```\n */\nexport function createCache<T>(ttl: number = 5 * 60 * 1000): TTLCache<T> {\n return new TTLCache<T>(ttl);\n}\n\n/**\n * Global cache cleanup interval (runs every minute)\n * This helps prevent memory leaks from expired cache entries\n */\nlet cleanupInterval: ReturnType<typeof setInterval> | null = null;\nconst activeCaches = new Set<TTLCache<any>>();\n\n/**\n * Register a cache for automatic cleanup\n * @param cache Cache instance to register\n */\nexport function registerCacheForCleanup(cache: TTLCache<any>): void {\n activeCaches.add(cache);\n\n // Start cleanup interval if not already running\n if (!cleanupInterval) {\n cleanupInterval = setInterval(() => {\n for (const cache of activeCaches) {\n cache.cleanup();\n }\n }, 60000); // Every minute\n }\n}\n\n/**\n * Unregister a cache from automatic cleanup\n * @param cache Cache instance to unregister\n */\nexport function unregisterCacheFromCleanup(cache: TTLCache<any>): void {\n activeCaches.delete(cache);\n\n // Stop cleanup interval if no caches are registered\n if (activeCaches.size === 0 && cleanupInterval) {\n clearInterval(cleanupInterval);\n cleanupInterval = null;\n }\n}\n\n/**\n * Stop all cleanup intervals (useful for testing)\n * This will clear the interval and unregister all caches\n */\nexport function stopAllCleanupIntervals(): void {\n if (cleanupInterval) {\n clearInterval(cleanupInterval);\n cleanupInterval = null;\n }\n activeCaches.clear();\n}\n\n","/**\n * Request utilities for HTTP clients\n * \n * Provides reusable components for request deduplication, queuing, and logging\n */\n\n/**\n * Request deduplication - prevents duplicate concurrent requests\n * \n * When multiple requests with the same key are made simultaneously,\n * only one request is executed and all callers receive the same result.\n * \n * @example\n * ```typescript\n * const deduplicator = new RequestDeduplicator();\n * \n * // Multiple calls with same key will share the same promise\n * const promise1 = deduplicator.deduplicate('user-123', () => fetchUser('123'));\n * const promise2 = deduplicator.deduplicate('user-123', () => fetchUser('123'));\n * // promise1 === promise2, only one API call is made\n * ```\n */\nexport class RequestDeduplicator {\n private pendingRequests = new Map<string, Promise<any>>();\n\n /**\n * Deduplicate a request by key\n * @param key Unique key for the request\n * @param requestFn Function that returns a promise\n * @returns Promise that will be shared if key already exists\n */\n async deduplicate<T>(\n key: string,\n requestFn: () => Promise<T>\n ): Promise<T> {\n const existing = this.pendingRequests.get(key);\n if (existing) {\n return existing;\n }\n\n const promise = requestFn()\n .finally(() => {\n this.pendingRequests.delete(key);\n });\n\n this.pendingRequests.set(key, promise);\n return promise;\n }\n\n /**\n * Clear all pending requests\n */\n clear(): void {\n this.pendingRequests.clear();\n }\n\n /**\n * Get number of pending requests\n */\n size(): number {\n return this.pendingRequests.size;\n }\n}\n\n/**\n * Request queue with concurrency control\n * \n * Limits the number of concurrent requests and queues excess requests.\n * Useful for rate limiting and preventing request flooding.\n * \n * @example\n * ```typescript\n * const queue = new RequestQueue(5, 100); // Max 5 concurrent, queue up to 100\n * \n * // All requests will be queued and processed with max 5 concurrent\n * await queue.enqueue(() => fetchUser('1'));\n * await queue.enqueue(() => fetchUser('2'));\n * // ...\n * ```\n */\nexport class RequestQueue {\n private queue: Array<() => Promise<any>> = [];\n private running = 0;\n private maxConcurrent: number;\n private maxQueueSize: number;\n\n /**\n * Create a new request queue\n * @param maxConcurrent Maximum number of concurrent requests (default: 10)\n * @param maxQueueSize Maximum queue size (default: 100)\n */\n constructor(maxConcurrent: number = 10, maxQueueSize: number = 100) {\n this.maxConcurrent = maxConcurrent;\n this.maxQueueSize = maxQueueSize;\n }\n\n /**\n * Enqueue a request\n * @param requestFn Function that returns a promise\n * @returns Promise that resolves when request completes\n */\n async enqueue<T>(requestFn: () => Promise<T>): Promise<T> {\n if (this.queue.length >= this.maxQueueSize) {\n throw new Error('Request queue is full');\n }\n\n return new Promise<T>((resolve, reject) => {\n this.queue.push(async () => {\n try {\n const result = await requestFn();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n });\n\n this.process();\n });\n }\n\n /**\n * Process queued requests\n */\n private async process(): Promise<void> {\n if (this.running >= this.maxConcurrent || this.queue.length === 0) {\n return;\n }\n\n this.running++;\n const requestFn = this.queue.shift();\n if (requestFn) {\n try {\n await requestFn();\n } finally {\n this.running--;\n this.process();\n }\n } else {\n this.running--;\n }\n }\n\n /**\n * Clear all queued requests\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * Get queue size\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * Get number of currently running requests\n */\n runningCount(): number {\n return this.running;\n }\n}\n\n/** Log level type for SimpleLogger */\nexport type LogLevel = 'none' | 'error' | 'warn' | 'info' | 'debug';\n\n/**\n * Simple logger with level support\n *\n * Lightweight logger for HTTP clients and utilities.\n * For more advanced logging, use loggerUtils.ts\n *\n * @example\n * ```typescript\n * const logger = new SimpleLogger(true, 'debug');\n * logger.debug('Debug message');\n * logger.info('Info message');\n * logger.error('Error message');\n * ```\n */\nexport class SimpleLogger {\n private enabled: boolean;\n private level: LogLevel;\n private prefix: string;\n\n /**\n * Create a new simple logger\n * @param enabled Whether logging is enabled\n * @param level Minimum log level\n * @param prefix Prefix for log messages (default: '')\n */\n constructor(\n enabled: boolean = false,\n level: LogLevel = 'error',\n prefix: string = ''\n ) {\n this.enabled = enabled;\n this.level = level;\n this.prefix = prefix;\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.enabled || this.level === 'none') return false;\n const levels: LogLevel[] = ['none', 'error', 'warn', 'info', 'debug'];\n return levels.indexOf(level) <= levels.indexOf(this.level);\n }\n\n private formatMessage(...args: any[]): any[] {\n return this.prefix ? [`[${this.prefix}]`, ...args] : args;\n }\n\n error(...args: any[]): void {\n if (this.shouldLog('error')) {\n console.error(...this.formatMessage(...args));\n }\n }\n\n warn(...args: any[]): void {\n if (this.shouldLog('warn')) {\n console.warn(...this.formatMessage(...args));\n }\n }\n\n info(...args: any[]): void {\n if (this.shouldLog('info')) {\n console.info(...this.formatMessage(...args));\n }\n }\n\n debug(...args: any[]): void {\n if (this.shouldLog('debug')) {\n console.log(...this.formatMessage(...args));\n }\n }\n}\n\n","/**\n * Async utilities for common asynchronous patterns and error handling\n */\n\nimport { TTLCache, registerCacheForCleanup } from './cache';\nimport { logger } from './loggerUtils';\n\n/**\n * Wrapper for async operations with automatic error handling\n * Returns null on error instead of throwing\n */\nexport async function withErrorHandling<T>(\n operation: () => Promise<T>,\n errorHandler?: (error: any) => void,\n context?: string\n): Promise<T | null> {\n try {\n return await operation();\n } catch (error) {\n if (errorHandler) {\n errorHandler(error);\n } else {\n logger.error(`Error in ${context || 'operation'}`, error instanceof Error ? error : new Error(String(error)), {\n component: 'asyncUtils',\n method: 'withErrorHandling',\n });\n }\n return null;\n }\n}\n\n/**\n * Execute multiple async operations in parallel with error handling\n */\nexport async function parallelWithErrorHandling<T>(\n operations: (() => Promise<T>)[],\n errorHandler?: (error: any, index: number) => void\n): Promise<(T | null)[]> {\n const results = await Promise.allSettled(\n operations.map((op, index) => \n withErrorHandling(op, error => errorHandler?.(error, index))\n )\n );\n \n return results.map(result => \n result.status === 'fulfilled' ? result.value : null\n );\n}\n\n/**\n * Retry an async operation with exponential backoff\n * \n * By default, does not retry on 4xx errors (client errors).\n * Use shouldRetry callback to customize retry behavior.\n */\nexport async function retryAsync<T>(\n operation: () => Promise<T>,\n maxRetries = 3,\n baseDelay = 1000,\n shouldRetry?: (error: any) => boolean\n): Promise<T> {\n let lastError: any;\n \n // Default shouldRetry: don't retry on 4xx errors\n const defaultShouldRetry = (error: any): boolean => {\n // Don't retry on 4xx errors (client errors)\n if (error?.response?.status >= 400 && error?.response?.status < 500) {\n return false;\n }\n return true;\n };\n \n const retryCheck = shouldRetry || defaultShouldRetry;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n \n if (attempt === maxRetries) {\n break;\n }\n \n if (!retryCheck(error)) {\n break;\n }\n \n // Calculate delay with exponential backoff and jitter\n const delay = baseDelay * Math.pow(2, attempt) + Math.random() * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n \n throw lastError;\n}\n\n/**\n * Debounce async function calls\n */\nexport function debounceAsync<T extends (...args: any[]) => Promise<any>>(\n func: T,\n delay: number\n): (...args: Parameters<T>) => Promise<ReturnType<T>> {\n let timeoutId: ReturnType<typeof setTimeout>;\n const lastPromise: Promise<ReturnType<T>> | null = null;\n \n return (...args: Parameters<T>): Promise<ReturnType<T>> => {\n return new Promise((resolve, reject) => {\n clearTimeout(timeoutId);\n \n timeoutId = setTimeout(async () => {\n try {\n const result = await func(...args);\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }, delay);\n });\n };\n}\n\n/**\n * Throttle async function calls\n */\nexport function throttleAsync<T extends (...args: any[]) => Promise<any>>(\n func: T,\n limit: number,\n interval: number\n): (...args: Parameters<T>) => Promise<ReturnType<T>> {\n let inThrottle = false;\n let lastPromise: Promise<ReturnType<T>> | null = null;\n \n return (...args: Parameters<T>): Promise<ReturnType<T>> => {\n if (inThrottle) {\n return lastPromise!;\n }\n \n inThrottle = true;\n lastPromise = func(...args);\n \n setTimeout(() => {\n inThrottle = false;\n }, interval);\n \n return lastPromise;\n };\n}\n\n/**\n * Execute async operations sequentially with progress tracking\n */\nexport async function sequentialWithProgress<T>(\n operations: (() => Promise<T>)[],\n onProgress?: (completed: number, total: number) => void\n): Promise<T[]> {\n const results: T[] = [];\n \n for (let i = 0; i < operations.length; i++) {\n const result = await operations[i]();\n results.push(result);\n onProgress?.(i + 1, operations.length);\n }\n \n return results;\n}\n\n/**\n * Batch async operations\n */\nexport async function batchAsync<T>(\n items: T[],\n batchSize: number,\n processor: (batch: T[]) => Promise<void>\n): Promise<void> {\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n await processor(batch);\n }\n}\n\n/**\n * Create a cancellable async operation\n */\nexport function createCancellableAsync<T>(\n operation: (signal: AbortSignal) => Promise<T>\n): { execute: () => Promise<T>; cancel: () => void } {\n let abortController: AbortController | null = null;\n \n return {\n execute: async () => {\n abortController = new AbortController();\n return await operation(abortController.signal);\n },\n cancel: () => {\n abortController?.abort();\n }\n };\n}\n\n/**\n * Timeout wrapper for async operations\n */\nexport async function withTimeout<T>(\n operation: Promise<T>,\n timeoutMs: number,\n timeoutMessage?: string\n): Promise<T> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(timeoutMessage || `Operation timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n \n return Promise.race([operation, timeoutPromise]);\n}\n\n/**\n * Execute async operation with loading state\n */\nexport async function withLoadingState<T>(\n operation: () => Promise<T>,\n setLoading: (loading: boolean) => void\n): Promise<T> {\n setLoading(true);\n try {\n return await operation();\n } finally {\n setLoading(false);\n }\n}\n\n/**\n * Create a promise that resolves after a delay\n */\nexport const delay = (ms: number): Promise<void> => \n new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Execute async operation with retry on specific errors\n */\nexport async function retryOnError<T>(\n operation: () => Promise<T>,\n retryableErrors: (string | number)[],\n maxRetries = 3\n): Promise<T> {\n return retryAsync(operation, maxRetries, 1000, (error) => {\n const errorCode = error?.code || error?.status || error?.message;\n return retryableErrors.includes(errorCode);\n });\n} ","/**\n * Platform Detection Utility\n *\n * Provides platform detection WITHOUT importing from 'react-native'.\n * This allows core modules to be used in web/Node.js environments\n * without bundlers failing on react-native imports.\n */\n\nexport type PlatformOS = 'ios' | 'android' | 'web' | 'windows' | 'macos' | 'unknown';\n\n/**\n * Detect the current platform without importing react-native\n *\n * Detection order:\n * 1. Check for React Native's Platform object on globalThis (set by RN runtime)\n * 2. Check for Node.js environment\n * 3. Check for browser environment\n * 4. Fall back to 'unknown'\n */\nfunction detectPlatform(): PlatformOS {\n // Check if React Native Platform is available globally (set by RN runtime)\n // This avoids static imports while still detecting RN environment\n const rnPlatform = (globalThis as any).__REACT_NATIVE_PLATFORM__;\n if (rnPlatform) {\n return rnPlatform as PlatformOS;\n }\n\n // Check navigator.product for React Native\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n // We're in React Native but Platform wasn't set globally\n // Try to get OS from userAgent or default to 'unknown'\n return 'unknown';\n }\n\n // Check for Node.js environment\n if (typeof process !== 'undefined' && process.versions?.node) {\n return 'web'; // Treat Node.js as 'web' for compatibility (no native features)\n }\n\n // Check for browser/web environment\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'web';\n }\n\n return 'unknown';\n}\n\n// Cache the platform detection result\nlet cachedPlatform: PlatformOS | null = null;\n\n/**\n * Get the current platform OS\n * Safe to call from any environment (web, Node.js, React Native)\n */\nexport function getPlatformOS(): PlatformOS {\n if (cachedPlatform === null) {\n cachedPlatform = detectPlatform();\n }\n return cachedPlatform;\n}\n\n/**\n * Check if running on web platform (browser or Node.js)\n */\nexport function isWeb(): boolean {\n return getPlatformOS() === 'web';\n}\n\n/**\n * Check if running in a native app (iOS or Android)\n */\nexport function isNative(): boolean {\n const os = getPlatformOS();\n return os === 'ios' || os === 'android';\n}\n\n/**\n * Check if running on iOS\n */\nexport function isIOS(): boolean {\n return getPlatformOS() === 'ios';\n}\n\n/**\n * Check if running on Android\n */\nexport function isAndroid(): boolean {\n return getPlatformOS() === 'android';\n}\n\n/**\n * Set the platform OS explicitly\n * Called by React Native entry point to register the platform\n * This allows lazy detection in environments where react-native is available\n */\nexport function setPlatformOS(os: PlatformOS): void {\n cachedPlatform = os;\n (globalThis as any).__REACT_NATIVE_PLATFORM__ = os;\n}\n\n/**\n * Try to initialize platform from react-native if available\n * This is called lazily when needed, avoiding top-level imports\n */\nexport async function initPlatformFromReactNative(): Promise<void> {\n if (cachedPlatform !== null && cachedPlatform !== 'unknown') {\n return; // Already initialized\n }\n\n try {\n // Dynamic import to avoid bundler issues\n const { Platform } = await import('react-native');\n setPlatformOS(Platform.OS as PlatformOS);\n } catch {\n // react-native not available, use detected platform\n }\n}\n","/**\n * Unified HTTP Service\n * \n * Consolidates HttpClient + RequestManager into a single efficient class.\n * Uses native fetch instead of axios for smaller bundle size.\n * \n * Handles:\n * - Authentication (token management, auto-refresh)\n * - Caching (TTL-based)\n * - Deduplication (concurrent requests)\n * - Retry logic\n * - Error handling\n * - Request queuing\n */\n\nimport { TTLCache, registerCacheForCleanup } from '../utils/cache';\nimport { RequestDeduplicator, RequestQueue, SimpleLogger } from '../utils/requestUtils';\nimport { retryAsync } from '../utils/asyncUtils';\nimport { handleHttpError } from '../utils/errorUtils';\nimport { jwtDecode } from 'jwt-decode';\nimport { isNative, getPlatformOS } from '../utils/platform';\nimport type { OxyConfig } from '../models/interfaces';\n\n/**\n * Check if we're running in a native app environment (React Native, not web)\n * This is used to determine CSRF handling mode\n */\nconst isNativeApp = isNative();\n\ninterface JwtPayload {\n exp?: number;\n userId?: string;\n id?: string;\n sessionId?: string;\n [key: string]: any;\n}\n\nexport interface RequestOptions {\n cache?: boolean;\n cacheTTL?: number;\n deduplicate?: boolean;\n retry?: boolean;\n maxRetries?: number;\n timeout?: number;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ninterface RequestConfig extends RequestOptions {\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n url: string;\n data?: unknown;\n params?: Record<string, unknown>;\n}\n\n/**\n * Token store for authentication (singleton)\n */\nclass TokenStore {\n private static instance: TokenStore;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private csrfToken: string | null = null;\n private csrfTokenFetchPromise: Promise<string | null> | null = null;\n\n private constructor() {}\n\n static getInstance(): TokenStore {\n if (!TokenStore.instance) {\n TokenStore.instance = new TokenStore();\n }\n return TokenStore.instance;\n }\n\n setTokens(accessToken: string, refreshToken = ''): void {\n this.accessToken = accessToken;\n this.refreshToken = refreshToken;\n }\n\n getAccessToken(): string | null {\n return this.accessToken;\n }\n\n getRefreshToken(): string | null {\n return this.refreshToken;\n }\n\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n }\n\n hasAccessToken(): boolean {\n return !!this.accessToken;\n }\n\n setCsrfToken(token: string | null): void {\n this.csrfToken = token;\n }\n\n getCsrfToken(): string | null {\n return this.csrfToken;\n }\n\n setCsrfTokenFetchPromise(promise: Promise<string | null> | null): void {\n this.csrfTokenFetchPromise = promise;\n }\n\n getCsrfTokenFetchPromise(): Promise<string | null> | null {\n return this.csrfTokenFetchPromise;\n }\n\n clearCsrfToken(): void {\n this.csrfToken = null;\n this.csrfTokenFetchPromise = null;\n }\n}\n\n/**\n * Unified HTTP Service\n * \n * Consolidates HttpClient + RequestManager into a single efficient class.\n * Uses native fetch instead of axios for smaller bundle size.\n */\nexport class HttpService {\n private baseURL: string;\n private tokenStore: TokenStore;\n private cache: TTLCache<any>;\n private deduplicator: RequestDeduplicator;\n private requestQueue: RequestQueue;\n private logger: SimpleLogger;\n private config: OxyConfig;\n\n // Performance monitoring\n private requestMetrics = {\n totalRequests: 0,\n successfulRequests: 0,\n failedRequests: 0,\n cacheHits: 0,\n cacheMisses: 0,\n averageResponseTime: 0,\n };\n\n constructor(config: OxyConfig) {\n this.config = config;\n this.baseURL = config.baseURL;\n this.tokenStore = TokenStore.getInstance();\n \n this.logger = new SimpleLogger(\n config.enableLogging || false,\n config.logLevel || 'error',\n 'HttpService'\n );\n\n // Initialize performance infrastructure\n this.cache = new TTLCache<any>(config.cacheTTL || 5 * 60 * 1000);\n registerCacheForCleanup(this.cache);\n this.deduplicator = new RequestDeduplicator();\n this.requestQueue = new RequestQueue(\n config.maxConcurrentRequests || 10,\n config.requestQueueSize || 100\n );\n }\n\n /**\n * Robust FormData detection that works in browser and Node.js environments\n * Checks multiple conditions to handle different FormData implementations\n */\n private isFormData(data: unknown): boolean {\n if (!data) {\n return false;\n }\n\n // Primary check: instanceof FormData (works in browser and Node.js with proper polyfills)\n if (data instanceof FormData) {\n return true;\n }\n\n // Fallback: Check constructor name (handles Node.js polyfills like form-data)\n if (typeof data === 'object' && data !== null) {\n const constructorName = data.constructor?.name;\n if (constructorName === 'FormData' || constructorName === 'FormDataImpl') {\n return true;\n }\n\n // Additional check: Look for FormData-like methods\n if (typeof (data as any).append === 'function' && \n typeof (data as any).get === 'function' &&\n typeof (data as any).has === 'function') {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Main request method - handles everything in one place\n */\n async request<T = unknown>(config: RequestConfig): Promise<T> {\n const {\n method,\n url,\n data,\n params,\n timeout = this.config.requestTimeout || 5000,\n signal,\n cache = method === 'GET',\n cacheTTL,\n deduplicate = true,\n retry = this.config.enableRetry !== false,\n maxRetries = this.config.maxRetries || 3,\n } = config;\n\n // Generate cache key (optimized for large objects)\n const cacheKey = cache ? this.generateCacheKey(method, url, data || params) : null;\n\n // Check cache first\n if (cache && cacheKey) {\n const cached = this.cache.get(cacheKey) as T | null;\n if (cached !== null) {\n this.requestMetrics.cacheHits++;\n this.logger.debug('Cache hit:', url);\n return cached;\n }\n this.requestMetrics.cacheMisses++;\n }\n\n // Request function\n const requestFn = async (): Promise<T> => {\n const startTime = Date.now();\n try {\n // Build URL with params\n const fullUrl = this.buildURL(url, params);\n \n // Get auth token (with auto-refresh)\n const authHeader = await this.getAuthHeader();\n\n // Get CSRF token for state-changing requests\n const isStateChangingMethod = ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method);\n const csrfToken = isStateChangingMethod ? await this.fetchCsrfToken() : null;\n\n // Determine if data is FormData using robust detection\n const isFormData = this.isFormData(data);\n\n // Make fetch request\n const controller = new AbortController();\n const timeoutId = timeout ? setTimeout(() => controller.abort(), timeout) : null;\n \n if (signal) {\n signal.addEventListener('abort', () => controller.abort());\n }\n\n // Build headers - start with defaults\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n };\n\n // Only set Content-Type for non-FormData requests (FormData sets it automatically with boundary)\n if (!isFormData) {\n headers['Content-Type'] = 'application/json';\n }\n\n // Add authorization header if available\n if (authHeader) {\n headers['Authorization'] = authHeader;\n }\n\n // Add CSRF token header for state-changing requests\n if (csrfToken) {\n headers['X-CSRF-Token'] = csrfToken;\n }\n\n // Add native app header for React Native (required for CSRF validation)\n // Native apps can't persist cookies like browsers, so the server uses\n // header-only CSRF validation when this header is present\n if (isNativeApp && isStateChangingMethod) {\n headers['X-Native-App'] = 'true';\n }\n\n // Debug logging for CSRF issues\n if (isStateChangingMethod && __DEV__) {\n console.log('[HttpService] CSRF Debug:', {\n url,\n method,\n isNativeApp,\n platformOS: getPlatformOS(),\n hasCsrfToken: !!csrfToken,\n csrfTokenLength: csrfToken?.length,\n hasNativeAppHeader: headers['X-Native-App'] === 'true',\n });\n }\n\n // Merge custom headers if provided\n if (config.headers) {\n Object.entries(config.headers).forEach(([key, value]) => {\n // For FormData, explicitly remove Content-Type if user tries to set it\n // The browser/fetch API will set it automatically with the boundary\n if (isFormData && key.toLowerCase() === 'content-type') {\n this.logger.debug('Ignoring Content-Type header for FormData - will be set automatically');\n return;\n }\n headers[key] = value;\n });\n }\n\n const bodyValue = method !== 'GET' && data \n ? (isFormData ? data : JSON.stringify(data)) \n : undefined;\n \n const response = await fetch(fullUrl, {\n method,\n headers,\n body: bodyValue as BodyInit | null | undefined,\n signal: controller.signal,\n credentials: 'include', // Include cookies for cross-origin requests (CSRF, session)\n });\n\n if (timeoutId) clearTimeout(timeoutId);\n\n // Handle response\n if (!response.ok) {\n if (response.status === 401) {\n this.tokenStore.clearTokens();\n }\n \n // Try to parse error response (handle empty/malformed JSON)\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n try {\n const errorData = await response.json() as { message?: string; error?: string } | null;\n // Check both 'message' and 'error' fields for backwards compatibility\n if (errorData?.message) {\n errorMessage = errorData.message;\n } else if (errorData?.error) {\n errorMessage = errorData.error;\n }\n } catch (parseError) {\n // Malformed JSON or empty response - use status text\n this.logger.warn('Failed to parse error response JSON:', parseError);\n }\n }\n \n const error = new Error(errorMessage) as Error & { \n status?: number; \n response?: { status: number; statusText: string } \n };\n error.status = response.status;\n error.response = { status: response.status, statusText: response.statusText };\n throw error;\n }\n\n // Handle different response types (optimized - read response once)\n const contentType = response.headers.get('content-type');\n let responseData: unknown;\n \n if (contentType && contentType.includes('application/json')) {\n // Use response.json() directly for better performance\n try {\n responseData = await response.json();\n // Handle null/undefined responses\n if (responseData === null || responseData === undefined) {\n responseData = null;\n } else {\n // Unwrap standardized API response format for JSON\n responseData = this.unwrapResponse(responseData);\n }\n } catch (parseError) {\n // Handle malformed JSON or empty responses gracefully\n // Note: Once response.json() is called, the body is consumed and cannot be read again\n // So we check the error type to determine if it's empty or malformed\n if (parseError instanceof SyntaxError) {\n this.logger.warn('Failed to parse JSON response (malformed or empty):', parseError);\n // SyntaxError typically means empty or malformed JSON\n // For empty responses, return null; for malformed JSON, throw descriptive error\n responseData = null; // Treat as empty response for safety\n } else {\n this.logger.warn('Failed to read response:', parseError);\n throw new Error('Failed to read response from server');\n }\n }\n } else if (contentType && (contentType.includes('application/octet-stream') || contentType.includes('image/') || contentType.includes('video/') || contentType.includes('audio/'))) {\n // For binary responses (blobs), return the blob directly without unwrapping\n responseData = await response.blob();\n } else {\n // For other responses, return as text\n const text = await response.text();\n responseData = text || null;\n }\n\n const duration = Date.now() - startTime;\n this.updateMetrics(true, duration);\n this.config.onRequestEnd?.(url, method, duration, true);\n\n return responseData as T;\n } catch (error: unknown) {\n const duration = Date.now() - startTime;\n this.updateMetrics(false, duration);\n this.config.onRequestEnd?.(url, method, duration, false);\n this.config.onRequestError?.(url, method, error instanceof Error ? error : new Error(String(error)));\n \n // Handle AbortError specifically for better error messages\n if (error instanceof Error && error.name === 'AbortError') {\n throw handleHttpError(error);\n }\n \n throw handleHttpError(error);\n }\n };\n\n // Wrap with retry if enabled\n const requestWithRetry = retry\n ? () => retryAsync(requestFn, maxRetries, this.config.retryDelay || 1000)\n : requestFn;\n\n // Wrap with deduplication if enabled (use optimized key generation)\n const dedupeKey = deduplicate ? this.generateCacheKey(method, url, data || params) : null;\n const finalRequest = dedupeKey\n ? () => this.deduplicator.deduplicate(dedupeKey, requestWithRetry)\n : requestWithRetry;\n\n // Execute request (with queue if needed)\n const result = await this.requestQueue.enqueue(finalRequest);\n\n // Cache the result if caching is enabled\n if (cache && cacheKey && result) {\n this.cache.set(cacheKey, result, cacheTTL);\n }\n\n return result;\n }\n\n /**\n * Generate cache key efficiently\n * Uses simple hash for large objects to avoid expensive JSON.stringify\n */\n private generateCacheKey(method: string, url: string, data?: unknown): string {\n if (!data || (typeof data === 'object' && Object.keys(data).length === 0)) {\n return `${method}:${url}`;\n }\n\n // For small objects, use JSON.stringify\n const dataStr = JSON.stringify(data);\n if (dataStr.length < 1000) {\n return `${method}:${url}:${dataStr}`;\n }\n\n // For large objects, use a simple hash based on keys and values length\n // This avoids expensive serialization while still being unique enough\n const hash = typeof data === 'object' && data !== null\n ? Object.keys(data).sort().join(',') + ':' + dataStr.length\n : String(data).substring(0, 100);\n \n return `${method}:${url}:${hash}`;\n }\n\n /**\n * Build full URL with query params\n */\n private buildURL(url: string, params?: Record<string, unknown>): string {\n const base = url.startsWith('http') ? url : `${this.baseURL}${url}`;\n \n if (!params || Object.keys(params).length === 0) {\n return base;\n }\n\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? `${base}${base.includes('?') ? '&' : '?'}${queryString}` : base;\n }\n\n /**\n * Fetch CSRF token from server (with deduplication)\n * Required for state-changing requests (POST, PUT, PATCH, DELETE)\n */\n private async fetchCsrfToken(): Promise<string | null> {\n // Return cached token if available\n const cachedToken = this.tokenStore.getCsrfToken();\n if (cachedToken) {\n if (__DEV__) console.log('[HttpService] Using cached CSRF token');\n return cachedToken;\n }\n\n // Deduplicate concurrent CSRF token fetches\n const existingPromise = this.tokenStore.getCsrfTokenFetchPromise();\n if (existingPromise) {\n if (__DEV__) console.log('[HttpService] Waiting for existing CSRF fetch');\n return existingPromise;\n }\n\n const fetchPromise = (async () => {\n try {\n if (__DEV__) console.log('[HttpService] Fetching CSRF token from:', `${this.baseURL}/api/csrf-token`);\n\n // Use AbortController for timeout (more compatible than AbortSignal.timeout)\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`${this.baseURL}/api/csrf-token`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n credentials: 'include', // Required to receive and send cookies\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (__DEV__) console.log('[HttpService] CSRF fetch response:', response.status, response.ok);\n\n if (response.ok) {\n const data = await response.json() as { csrfToken?: string };\n if (__DEV__) console.log('[HttpService] CSRF response data:', data);\n const token = data.csrfToken || null;\n this.tokenStore.setCsrfToken(token);\n this.logger.debug('CSRF token fetched');\n return token;\n }\n\n // Also check response header for CSRF token\n const headerToken = response.headers.get('X-CSRF-Token');\n if (headerToken) {\n this.tokenStore.setCsrfToken(headerToken);\n this.logger.debug('CSRF token from header');\n return headerToken;\n }\n\n if (__DEV__) console.log('[HttpService] CSRF fetch failed with status:', response.status);\n this.logger.warn('Failed to fetch CSRF token:', response.status);\n return null;\n } catch (error) {\n if (__DEV__) console.log('[HttpService] CSRF fetch error:', error);\n this.logger.warn('CSRF token fetch error:', error);\n return null;\n } finally {\n this.tokenStore.setCsrfTokenFetchPromise(null);\n }\n })();\n\n this.tokenStore.setCsrfTokenFetchPromise(fetchPromise);\n return fetchPromise;\n }\n\n /**\n * Get auth header with automatic token refresh\n */\n private async getAuthHeader(): Promise<string | null> {\n const accessToken = this.tokenStore.getAccessToken();\n if (!accessToken) {\n return null;\n }\n\n try {\n const decoded = jwtDecode<JwtPayload>(accessToken);\n const currentTime = Math.floor(Date.now() / 1000);\n\n // If token expires in less than 60 seconds, refresh it\n if (decoded.exp && decoded.exp - currentTime < 60 && decoded.sessionId) {\n try {\n const refreshUrl = `${this.baseURL}/api/session/token/${decoded.sessionId}`;\n \n // Use AbortSignal.timeout for consistent timeout handling\n const response = await fetch(refreshUrl, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: AbortSignal.timeout(5000),\n credentials: 'include', // Include cookies for cross-origin requests\n });\n\n if (response.ok) {\n const { accessToken: newToken } = await response.json();\n this.tokenStore.setTokens(newToken);\n this.logger.debug('Token refreshed');\n return `Bearer ${newToken}`;\n }\n } catch (refreshError) {\n this.logger.warn('Token refresh failed, using current token');\n }\n }\n\n return `Bearer ${accessToken}`;\n } catch (error) {\n this.logger.error('Error processing token:', error);\n return `Bearer ${accessToken}`;\n }\n }\n\n /**\n * Unwrap standardized API response format\n */\n private unwrapResponse(responseData: unknown): unknown {\n // Handle paginated responses: { data: [...], pagination: {...} }\n if (responseData && typeof responseData === 'object' && 'data' in responseData && 'pagination' in responseData) {\n return responseData;\n }\n \n // Handle regular success responses: { data: ... }\n if (responseData && typeof responseData === 'object' && 'data' in responseData && !Array.isArray(responseData)) {\n return responseData.data;\n }\n \n // Return as-is for responses that don't use sendSuccess wrapper\n return responseData;\n }\n\n /**\n * Update request metrics\n */\n private updateMetrics(success: boolean, duration: number): void {\n this.requestMetrics.totalRequests++;\n if (success) {\n this.requestMetrics.successfulRequests++;\n } else {\n this.requestMetrics.failedRequests++;\n }\n\n const alpha = 0.1;\n this.requestMetrics.averageResponseTime =\n this.requestMetrics.averageResponseTime * (1 - alpha) + duration * alpha;\n }\n\n // Convenience methods (for backward compatibility)\n /**\n * GET request convenience method\n */\n async get<T = unknown>(url: string, config?: Omit<RequestConfig, 'method' | 'url'>): Promise<{ data: T }> {\n const result = await this.request<T>({ method: 'GET', url, ...config });\n return { data: result as T };\n }\n\n /**\n * POST request convenience method\n * Supports FormData uploads - Content-Type will be set automatically for FormData\n * @param url - Request URL\n * @param data - Request body (can be FormData for file uploads)\n * @param config - Request configuration including optional headers\n * @example\n * ```typescript\n * const formData = new FormData();\n * formData.append('file', file);\n * await api.post('/upload', formData, { headers: { 'X-Custom-Header': 'value' } });\n * ```\n */\n async post<T = unknown>(url: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'url' | 'data'>): Promise<{ data: T }> {\n const result = await this.request<T>({ method: 'POST', url, data, ...config });\n return { data: result as T };\n }\n\n /**\n * PUT request convenience method\n * Supports FormData uploads - Content-Type will be set automatically for FormData\n * @param url - Request URL\n * @param data - Request body (can be FormData for file uploads)\n * @param config - Request configuration including optional headers\n * @example\n * ```typescript\n * const formData = new FormData();\n * formData.append('file', file);\n * await api.put('/upload', formData, { headers: { 'X-Custom-Header': 'value' } });\n * ```\n */\n async put<T = unknown>(url: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'url' | 'data'>): Promise<{ data: T }> {\n const result = await this.request<T>({ method: 'PUT', url, data, ...config });\n return { data: result as T };\n }\n\n /**\n * PATCH request convenience method\n * Supports FormData uploads - Content-Type will be set automatically for FormData\n * @param url - Request URL\n * @param data - Request body (can be FormData for file uploads)\n * @param config - Request configuration including optional headers\n * @example\n * ```typescript\n * const formData = new FormData();\n * formData.append('file', file);\n * await api.patch('/upload', formData, { headers: { 'X-Custom-Header': 'value' } });\n * ```\n */\n async patch<T = unknown>(url: string, data?: unknown, config?: Omit<RequestConfig, 'method' | 'url' | 'data'>): Promise<{ data: T }> {\n const result = await this.request<T>({ method: 'PATCH', url, data, ...config });\n return { data: result as T };\n }\n\n async delete<T = unknown>(url: string, config?: Omit<RequestConfig, 'method' | 'url'>): Promise<{ data: T }> {\n const result = await this.request<T>({ method: 'DELETE', url, ...config });\n return { data: result as T };\n }\n\n // Token management\n setTokens(accessToken: string, refreshToken = ''): void {\n this.tokenStore.setTokens(accessToken, refreshToken);\n }\n\n clearTokens(): void {\n this.tokenStore.clearTokens();\n this.tokenStore.clearCsrfToken();\n }\n\n getAccessToken(): string | null {\n return this.tokenStore.getAccessToken();\n }\n\n hasAccessToken(): boolean {\n return this.tokenStore.hasAccessToken();\n }\n\n getBaseURL(): string {\n return this.baseURL;\n }\n\n // Cache management\n clearCache(): void {\n this.cache.clear();\n }\n\n clearCacheEntry(key: string): void {\n this.cache.delete(key);\n }\n\n getCacheStats() {\n const cacheStats = this.cache.getStats();\n const total = this.requestMetrics.cacheHits + this.requestMetrics.cacheMisses;\n return {\n size: cacheStats.size,\n hits: this.requestMetrics.cacheHits,\n misses: this.requestMetrics.cacheMisses,\n hitRate: total > 0 ? this.requestMetrics.cacheHits / total : 0,\n };\n }\n\n getMetrics() {\n return { ...this.requestMetrics };\n }\n\n // Test-only utility\n static __resetTokensForTests(): void {\n try {\n TokenStore.getInstance().clearTokens();\n } catch (error) {\n // Silently fail in test cleanup - this is expected behavior\n // TokenStore might not be initialized in some test scenarios\n }\n }\n}\n\n","/**\n * OxyServices Base Class\n * \n * Contains core infrastructure, HTTP client, request management, and error handling\n */\nimport { jwtDecode } from 'jwt-decode';\nimport type { OxyConfig as OxyConfigBase, ApiError, User } from '../models/interfaces';\nimport { handleHttpError } from '../utils/errorUtils';\nimport { HttpService, type RequestOptions } from './HttpService';\nimport { OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices.errors';\n\nexport interface OxyConfig extends OxyConfigBase {\n cloudURL?: string;\n}\n\ninterface JwtPayload {\n exp?: number;\n userId?: string;\n id?: string;\n sessionId?: string;\n [key: string]: any;\n}\n\n/**\n * Base class for OxyServices with core infrastructure\n */\nexport class OxyServicesBase {\n public httpService: HttpService;\n public cloudURL: string;\n public config: OxyConfig;\n\n constructor(...args: any[]) {\n const config = args[0] as OxyConfig;\n if (!config || typeof config !== 'object') {\n throw new Error('OxyConfig is required');\n }\n this.config = config;\n this.cloudURL = config.cloudURL || 'https://cloud.oxy.so';\n\n // Initialize unified HTTP service (handles auth, caching, deduplication, queuing, retry)\n this.httpService = new HttpService(config);\n }\n\n // Test-only utility to reset global tokens between jest tests\n static __resetTokensForTests(): void {\n HttpService.__resetTokensForTests();\n }\n\n /**\n * Make a request with all performance optimizations\n * This is the main method for all API calls - ensures authentication and performance features\n */\n public async makeRequest<T>(\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n url: string,\n data?: any,\n options: RequestOptions = {}\n ): Promise<T> {\n return this.httpService.request<T>({\n method,\n url,\n data: method !== 'GET' ? data : undefined,\n params: method === 'GET' ? data : undefined,\n ...options,\n });\n }\n\n // ============================================================================\n // CORE METHODS (HTTP Client, Token Management, Error Handling)\n // ============================================================================\n\n /**\n * Get the configured Oxy API base URL\n */\n public getBaseURL(): string {\n return this.httpService.getBaseURL();\n }\n\n /**\n * Get the HTTP service instance\n * Useful for advanced use cases where direct access to the HTTP service is needed\n */\n public getClient(): HttpService {\n return this.httpService;\n }\n\n /**\n * Get performance metrics\n */\n public getMetrics() {\n return this.httpService.getMetrics();\n }\n\n /**\n * Clear request cache\n */\n public clearCache(): void {\n this.httpService.clearCache();\n }\n\n /**\n * Clear specific cache entry\n */\n public clearCacheEntry(key: string): void {\n this.httpService.clearCacheEntry(key);\n }\n\n /**\n * Get cache statistics\n */\n public getCacheStats() {\n return this.httpService.getCacheStats();\n }\n\n /**\n * Get the configured Oxy Cloud (file storage/CDN) URL\n */\n public getCloudURL(): string {\n return this.cloudURL;\n }\n\n /**\n * Set authentication tokens\n */\n public setTokens(accessToken: string, refreshToken = ''): void {\n this.httpService.setTokens(accessToken, refreshToken);\n }\n\n /**\n * Clear stored authentication tokens\n */\n public clearTokens(): void {\n this.httpService.clearTokens();\n }\n\n /**\n * Get the current user ID from the access token\n */\n public getCurrentUserId(): string | null {\n const accessToken = this.httpService.getAccessToken();\n if (!accessToken) {\n return null;\n }\n \n try {\n const decoded = jwtDecode<JwtPayload>(accessToken);\n return decoded.userId || decoded.id || null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Check if the client has a valid access token (public method)\n */\n public hasValidToken(): boolean {\n return this.httpService.hasAccessToken();\n }\n\n /**\n * Get the raw access token (for constructing anchor URLs when needed)\n */\n public getAccessToken(): string | null {\n return this.httpService.getAccessToken();\n }\n\n /**\n * Wait for authentication to be ready\n * \n * Optimized for high-scale usage with immediate synchronous check and adaptive polling.\n * Returns immediately if token is already available (0ms delay), otherwise uses\n * adaptive polling that starts fast (50ms) and gradually increases to reduce CPU usage.\n * \n * @param timeoutMs Maximum time to wait in milliseconds (default: 5000ms)\n * @returns Promise that resolves to true if authentication is ready, false if timeout\n * \n * @example\n * ```typescript\n * const isReady = await oxyServices.waitForAuth(3000);\n * if (isReady) {\n * // Proceed with authenticated operations\n * }\n * ```\n */\n public async waitForAuth(timeoutMs = 5000): Promise<boolean> {\n // Immediate synchronous check - no delay if token is ready\n if (this.httpService.hasAccessToken()) {\n return true;\n }\n\n const startTime = performance.now();\n const maxTime = startTime + timeoutMs;\n \n // Adaptive polling: start fast, then slow down to reduce CPU usage\n let pollInterval = 50; // Start with 50ms\n \n while (performance.now() < maxTime) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n \n if (this.httpService.hasAccessToken()) {\n return true;\n }\n \n // Increase interval after first few checks (adaptive polling)\n // This reduces CPU usage for long waits while maintaining responsiveness\n if (pollInterval < 200) {\n pollInterval = Math.min(pollInterval * 1.5, 200);\n }\n }\n \n return false;\n }\n\n /**\n * Execute a function with automatic authentication retry logic\n * This handles the common case where API calls are made before authentication completes\n */\n public async withAuthRetry<T>(\n operation: () => Promise<T>, \n operationName: string,\n options: {\n maxRetries?: number;\n retryDelay?: number;\n authTimeoutMs?: number;\n } = {}\n ): Promise<T> {\n const { \n maxRetries = 2, \n retryDelay = 1000,\n authTimeoutMs = 5000 \n } = options;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // First attempt: check if we have a token\n if (!this.httpService.hasAccessToken()) {\n if (attempt === 0) {\n // On first attempt, wait briefly for authentication to complete\n const authReady = await this.waitForAuth(authTimeoutMs);\n \n if (!authReady) {\n throw new OxyAuthenticationTimeoutError(operationName, authTimeoutMs);\n }\n } else {\n // On retry attempts, fail immediately if no token\n throw new OxyAuthenticationError(\n `Authentication required: ${operationName} requires a valid access token.`,\n 'AUTH_REQUIRED'\n );\n }\n }\n\n // Execute the operation\n return await operation();\n\n } catch (error: unknown) {\n const isLastAttempt = attempt === maxRetries;\n const errorObj = error && typeof error === 'object' ? error as { response?: { status?: number }; code?: string; message?: string } : null;\n const isAuthError = errorObj?.response?.status === 401 || \n errorObj?.code === 'MISSING_TOKEN' ||\n errorObj?.message?.includes('Authentication') ||\n error instanceof OxyAuthenticationError;\n\n if (isAuthError && !isLastAttempt && !(error instanceof OxyAuthenticationTimeoutError)) {\n await new Promise(resolve => setTimeout(resolve, retryDelay));\n continue;\n }\n\n // If it's not an auth error, or it's the last attempt, throw the error\n if (error instanceof OxyAuthenticationError) {\n throw error;\n }\n throw this.handleError(error);\n }\n }\n\n // This should never be reached, but TypeScript requires it\n throw new OxyAuthenticationError(`${operationName} failed after ${maxRetries + 1} attempts`);\n }\n\n /**\n * Validate the current access token with the server\n */\n async validate(): Promise<boolean> {\n if (!this.hasValidToken()) {\n return false;\n }\n\n try {\n const res = await this.makeRequest<{ valid: boolean }>('GET', '/api/auth/validate', undefined, {\n cache: false,\n retry: false,\n });\n return res.valid === true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Centralized error handling\n */\n public handleError(error: unknown): Error {\n const api = handleHttpError(error);\n // Ensure we always have a non-empty message\n const message = api.message?.trim() || 'An unexpected error occurred';\n const err = new Error(message) as Error & { code?: string; status?: number; details?: Record<string, unknown> };\n err.code = api.code;\n err.status = api.status;\n err.details = api.details;\n return err;\n }\n\n /**\n * Health check endpoint\n */\n async healthCheck(): Promise<{ \n status: string; \n users?: number; \n timestamp?: string; \n [key: string]: any \n }> {\n try {\n return await this.makeRequest('GET', '/health', undefined, { \n cache: false,\n retry: false,\n timeout: 5000\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n}\n\n","/**\n * Debug Utilities\n *\n * Provides safe logging functions that only output in development mode.\n * All logs are stripped in production builds.\n *\n * @module shared/utils/debugUtils\n */\n\n/* global __DEV__ */\ndeclare const __DEV__: boolean | undefined;\n\n/**\n * Check if running in development mode\n */\nexport const isDev = (): boolean => {\n return typeof __DEV__ !== 'undefined' && __DEV__;\n};\n\n/**\n * Log a debug message (only in development)\n * @param prefix - Log prefix (e.g., '[FedCM]')\n * @param args - Arguments to log\n */\nexport const debugLog = (prefix: string, ...args: unknown[]): void => {\n if (isDev()) {\n console.log(prefix, ...args);\n }\n};\n\n/**\n * Log a debug warning (only in development)\n * @param prefix - Log prefix\n * @param args - Arguments to log\n */\nexport const debugWarn = (prefix: string, ...args: unknown[]): void => {\n if (isDev()) {\n console.warn(prefix, ...args);\n }\n};\n\n/**\n * Log a debug error (only in development)\n * @param prefix - Log prefix\n * @param args - Arguments to log\n */\nexport const debugError = (prefix: string, ...args: unknown[]): void => {\n if (isDev()) {\n console.error(prefix, ...args);\n }\n};\n\n/**\n * Create a namespaced debug logger\n * @param namespace - Logger namespace (e.g., 'FedCM', 'PopupAuth')\n * @returns Object with log, warn, error methods\n *\n * @example\n * ```ts\n * const debug = createDebugLogger('FedCM');\n * debug.log('Starting authentication');\n * debug.warn('Token expires soon');\n * debug.error('Authentication failed', error);\n * ```\n */\nexport const createDebugLogger = (namespace: string) => {\n const prefix = `[${namespace}]`;\n return {\n log: (...args: unknown[]) => debugLog(prefix, ...args),\n warn: (...args: unknown[]) => debugWarn(prefix, ...args),\n error: (...args: unknown[]) => debugError(prefix, ...args),\n };\n};\n","import type { OxyServicesBase } from '../OxyServices.base';\nimport { OxyAuthenticationError } from '../OxyServices.errors';\nimport type { SessionLoginResponse } from '../../models/session';\nimport { createDebugLogger } from '../../shared/utils/debugUtils';\n\nconst debug = createDebugLogger('FedCM');\n\nexport interface FedCMAuthOptions {\n nonce?: string;\n context?: 'signin' | 'signup' | 'continue' | 'use';\n}\n\nexport interface FedCMConfig {\n enabled: boolean;\n configURL: string;\n clientId?: string;\n}\n\n// Global lock to prevent concurrent FedCM requests\n// FedCM only allows one navigator.credentials.get request at a time\nlet fedCMRequestInProgress = false;\nlet fedCMRequestPromise: Promise<any> | null = null;\nlet currentMediationMode: string | null = null;\n\n/**\n * Federated Credential Management (FedCM) Authentication Mixin\n *\n * Implements the modern browser-native identity federation API that enables\n * Google-style cross-domain authentication without third-party cookies.\n *\n * Browser Support:\n * - Chrome 108+\n * - Safari 16.4+\n * - Edge 108+\n * - Firefox: Not yet supported (fallback required)\n *\n * Key Features:\n * - No redirects or popups required\n * - Browser-native UI prompts\n * - Privacy-preserving (IdP can't track users)\n * - Automatic SSO across domains\n * - Silent re-authentication support\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API\n */\nexport function OxyServicesFedCMMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n public static readonly DEFAULT_CONFIG_URL = 'https://auth.oxy.so/fedcm.json';\n public static readonly FEDCM_TIMEOUT = 60000; // 1 minute for interactive\n public static readonly FEDCM_SILENT_TIMEOUT = 10000; // 10 seconds for silent mediation\n\n /**\n * Check if FedCM is supported in the current browser\n */\n static isFedCMSupported(): boolean {\n if (typeof window === 'undefined') return false;\n return 'IdentityCredential' in window && 'navigator' in window && 'credentials' in navigator;\n }\n\n /**\n * Instance method to check FedCM support\n */\n isFedCMSupported(): boolean {\n return (this.constructor as typeof OxyServicesBase & { isFedCMSupported: () => boolean }).isFedCMSupported();\n }\n\n /**\n * Sign in using FedCM (Federated Credential Management API)\n *\n * This provides a Google-style authentication experience:\n * - Browser shows native \"Sign in with Oxy\" prompt\n * - No redirect or popup required\n * - User approves → credential exchange happens in browser\n * - All apps automatically get SSO after first sign-in\n *\n * @param options - Authentication options\n * @returns Session with access token and user data\n * @throws {OxyAuthenticationError} If FedCM not supported or user cancels\n *\n * @example\n * ```typescript\n * try {\n * const session = await oxyServices.signInWithFedCM();\n * console.log('Signed in:', session.user);\n * } catch (error) {\n * // Fallback to popup or redirect auth\n * await oxyServices.signInWithPopup();\n * }\n * ```\n */\n async signInWithFedCM(options: FedCMAuthOptions = {}): Promise<SessionLoginResponse> {\n if (!this.isFedCMSupported()) {\n throw new OxyAuthenticationError(\n 'FedCM not supported in this browser. Please update your browser or use an alternative sign-in method.'\n );\n }\n\n try {\n const nonce = options.nonce || this.generateNonce();\n const clientId = this.getClientId();\n\n debug.log('Interactive sign-in: Requesting credential for', clientId);\n\n // Request credential from browser's native identity flow\n const credential = await this.requestIdentityCredential({\n configURL: (this.constructor as any).DEFAULT_CONFIG_URL,\n clientId,\n nonce,\n context: options.context,\n });\n\n if (!credential || !credential.token) {\n throw new OxyAuthenticationError('No credential received from browser');\n }\n\n debug.log('Interactive sign-in: Got credential, exchanging for session');\n\n // Exchange FedCM ID token for Oxy session\n const session = await this.exchangeIdTokenForSession(credential.token);\n\n // Store access token in HttpService (extract from response or get from session)\n if (session && (session as any).accessToken) {\n this.httpService.setTokens((session as any).accessToken);\n }\n\n debug.log('Interactive sign-in: Success!', { userId: (session as any)?.user?.id });\n\n return session;\n } catch (error) {\n debug.log('Interactive sign-in failed:', error);\n if ((error as any).name === 'AbortError') {\n throw new OxyAuthenticationError('Sign-in was cancelled by user');\n }\n if ((error as any).name === 'NetworkError') {\n throw new OxyAuthenticationError('Network error during sign-in. Please check your connection.');\n }\n throw error;\n }\n }\n\n /**\n * Silent sign-in using FedCM\n *\n * Attempts to automatically re-authenticate the user without any UI.\n * This is what enables \"instant sign-in\" across all Oxy domains after\n * the user has signed in once.\n *\n * The browser will:\n * 1. Check if user has previously signed in to Oxy\n * 2. Check if user is still signed in at auth.oxy.so\n * 3. If yes, automatically provide credential without prompting\n *\n * @returns Session if user is already signed in, null otherwise\n *\n * @example\n * ```typescript\n * // On app startup\n * useEffect(() => {\n * const checkAuth = async () => {\n * const session = await oxyServices.silentSignInWithFedCM();\n * if (session) {\n * setUser(session.user);\n * } else {\n * // Show sign-in button\n * }\n * };\n * checkAuth();\n * }, []);\n * ```\n */\n async silentSignInWithFedCM(): Promise<SessionLoginResponse | null> {\n if (!this.isFedCMSupported()) {\n debug.log('Silent SSO: FedCM not supported in this browser');\n return null;\n }\n\n const clientId = this.getClientId();\n debug.log('Silent SSO: Starting for', clientId);\n\n // First try silent mediation (no UI) - works if user previously consented\n let credential: { token: string } | null = null;\n\n try {\n const nonce = this.generateNonce();\n debug.log('Silent SSO: Attempting silent mediation...');\n\n credential = await this.requestIdentityCredential({\n configURL: (this.constructor as any).DEFAULT_CONFIG_URL,\n clientId,\n nonce,\n mediation: 'silent',\n });\n\n debug.log('Silent SSO: Silent mediation result:', { hasCredential: !!credential, hasToken: !!credential?.token });\n } catch (silentError) {\n // Silent mediation failed - this is expected if user hasn't consented before or is in quiet period\n const errorName = silentError instanceof Error ? silentError.name : 'Unknown';\n const errorMessage = silentError instanceof Error ? silentError.message : String(silentError);\n debug.log('Silent SSO: Silent mediation error (will try optional):', { name: errorName, message: errorMessage });\n }\n\n // If silent failed, try optional mediation which shows browser UI if needed\n if (!credential || !credential.token) {\n try {\n const nonce = this.generateNonce();\n debug.log('Silent SSO: Trying optional mediation (may show browser UI)...');\n\n credential = await this.requestIdentityCredential({\n configURL: (this.constructor as any).DEFAULT_CONFIG_URL,\n clientId,\n nonce,\n mediation: 'optional',\n });\n\n debug.log('Silent SSO: Optional mediation result:', { hasCredential: !!credential, hasToken: !!credential?.token });\n } catch (optionalError) {\n const errorName = optionalError instanceof Error ? optionalError.name : 'Unknown';\n const errorMessage = optionalError instanceof Error ? optionalError.message : String(optionalError);\n debug.log('Silent SSO: Optional mediation also failed:', { name: errorName, message: errorMessage });\n return null;\n }\n }\n\n if (!credential || !credential.token) {\n debug.log('Silent SSO: No credential returned (user may have dismissed prompt or is not logged in at IdP)');\n return null;\n }\n\n debug.log('Silent SSO: Got credential, exchanging for session...');\n\n let session: SessionLoginResponse;\n try {\n session = await this.exchangeIdTokenForSession(credential.token);\n } catch (exchangeError) {\n debug.error('Silent SSO: Token exchange failed:', exchangeError);\n return null;\n }\n\n // Validate session response has required fields\n if (!session) {\n debug.error('Silent SSO: Exchange returned null session');\n return null;\n }\n\n if (!session.sessionId) {\n debug.error('Silent SSO: Exchange returned session without sessionId:', session);\n return null;\n }\n\n if (!session.user) {\n debug.error('Silent SSO: Exchange returned session without user:', session);\n return null;\n }\n\n // Set the access token\n if ((session as any).accessToken) {\n this.httpService.setTokens((session as any).accessToken);\n debug.log('Silent SSO: Access token set');\n } else {\n debug.warn('Silent SSO: No accessToken in session response');\n }\n\n debug.log('Silent SSO: Success!', {\n sessionId: session.sessionId?.substring(0, 8) + '...',\n userId: session.user?.id\n });\n\n return session;\n }\n\n /**\n * Request identity credential from browser using FedCM API\n *\n * Uses a global lock to prevent concurrent requests, as FedCM only\n * allows one navigator.credentials.get request at a time.\n *\n * Interactive requests (optional/required) wait for any silent request to finish first.\n *\n * @private\n */\n public async requestIdentityCredential(options: {\n configURL: string;\n clientId: string;\n nonce: string;\n context?: string;\n mediation?: 'silent' | 'optional' | 'required';\n }): Promise<{ token: string } | null> {\n const requestedMediation = options.mediation || 'optional';\n const isInteractive = requestedMediation !== 'silent';\n\n debug.log('requestIdentityCredential called:', {\n mediation: requestedMediation,\n clientId: options.clientId,\n inProgress: fedCMRequestInProgress,\n });\n\n // If a request is already in progress...\n if (fedCMRequestInProgress && fedCMRequestPromise) {\n debug.log('Request already in progress, waiting...');\n // If current request is silent and new request is interactive,\n // wait for silent to finish, then make the interactive request\n if (currentMediationMode === 'silent' && isInteractive) {\n try {\n await fedCMRequestPromise;\n } catch {\n // Ignore silent request errors\n }\n // Now fall through to make the interactive request\n } else {\n // Same type of request - wait for the existing one\n try {\n return await fedCMRequestPromise;\n } catch {\n return null;\n }\n }\n }\n\n fedCMRequestInProgress = true;\n currentMediationMode = requestedMediation;\n const controller = new AbortController();\n // Use shorter timeout for silent mediation since it should be quick\n const timeoutMs = requestedMediation === 'silent'\n ? (this.constructor as any).FEDCM_SILENT_TIMEOUT\n : (this.constructor as any).FEDCM_TIMEOUT;\n const timeout = setTimeout(() => {\n debug.log('Request timed out after', timeoutMs, 'ms (mediation:', requestedMediation + ')');\n controller.abort();\n }, timeoutMs);\n\n fedCMRequestPromise = (async () => {\n try {\n debug.log('Calling navigator.credentials.get with mediation:', requestedMediation);\n // Type assertion needed as FedCM types may not be in all TypeScript versions\n const credential = (await (navigator.credentials as any).get({\n identity: {\n providers: [\n {\n configURL: options.configURL,\n clientId: options.clientId,\n // Send nonce at both levels for backward compatibility\n nonce: options.nonce, // For older browsers\n params: {\n nonce: options.nonce, // For Chrome 145+\n },\n ...(options.context && { loginHint: options.context }),\n },\n ],\n },\n mediation: requestedMediation,\n signal: controller.signal,\n })) as any;\n\n debug.log('navigator.credentials.get returned:', {\n hasCredential: !!credential,\n type: credential?.type,\n hasToken: !!credential?.token,\n });\n\n if (!credential || credential.type !== 'identity') {\n debug.log('No valid identity credential returned');\n return null;\n }\n\n debug.log('Got valid identity credential with token');\n return { token: credential.token };\n } catch (error) {\n const errorName = error instanceof Error ? error.name : 'Unknown';\n const errorMessage = error instanceof Error ? error.message : String(error);\n debug.log('navigator.credentials.get error:', { name: errorName, message: errorMessage });\n throw error;\n } finally {\n clearTimeout(timeout);\n fedCMRequestInProgress = false;\n fedCMRequestPromise = null;\n currentMediationMode = null;\n }\n })();\n\n return fedCMRequestPromise;\n }\n\n /**\n * Exchange FedCM ID token for Oxy session\n *\n * The ID token is a JWT issued by auth.oxy.so that proves the user's\n * identity. We exchange it for a full Oxy session with access token.\n *\n * @private\n */\n public async exchangeIdTokenForSession(idToken: string): Promise<SessionLoginResponse> {\n debug.log('exchangeIdTokenForSession: Starting exchange...');\n debug.log('exchangeIdTokenForSession: Token length:', idToken?.length);\n debug.log('exchangeIdTokenForSession: Token preview:', idToken?.substring(0, 50) + '...');\n\n try {\n const response = await this.makeRequest<SessionLoginResponse>(\n 'POST',\n '/api/fedcm/exchange',\n { id_token: idToken },\n { cache: false }\n );\n\n debug.log('exchangeIdTokenForSession: Response received:', {\n hasResponse: !!response,\n hasSessionId: !!(response as any)?.sessionId,\n hasUser: !!(response as any)?.user,\n hasAccessToken: !!(response as any)?.accessToken,\n userId: (response as any)?.user?.id,\n username: (response as any)?.user?.username,\n responseKeys: response ? Object.keys(response) : [],\n });\n\n return response;\n } catch (error) {\n debug.error('exchangeIdTokenForSession: Error:', {\n name: error instanceof Error ? error.name : 'Unknown',\n message: error instanceof Error ? error.message : String(error),\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n }\n }\n\n /**\n * Revoke FedCM credential (sign out)\n *\n * This tells the browser to forget the FedCM credential for this app.\n * The user will need to re-authenticate next time.\n */\n async revokeFedCMCredential(): Promise<void> {\n if (!this.isFedCMSupported()) {\n return;\n }\n\n try {\n // FedCM logout API (if available)\n if ('IdentityCredential' in window && 'logout' in (window as any).IdentityCredential) {\n const clientId = this.getClientId();\n await (window as any).IdentityCredential.logout({\n configURL: (this.constructor as any).DEFAULT_CONFIG_URL,\n clientId,\n });\n }\n } catch (error) {\n // Silent failure\n }\n }\n\n /**\n * Get configuration for FedCM\n *\n * @returns FedCM configuration with browser support info\n */\n getFedCMConfig(): FedCMConfig {\n return {\n enabled: this.isFedCMSupported(),\n configURL: (this.constructor as any).DEFAULT_CONFIG_URL,\n clientId: this.getClientId(),\n };\n }\n\n /**\n * Generate a cryptographically secure nonce for FedCM\n *\n * @private\n */\n public generateNonce(): string {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n // Fallback for older browsers\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Get the client ID for this origin\n *\n * @private\n */\n public getClientId(): string {\n if (typeof window === 'undefined') {\n return 'unknown';\n }\n return window.location.origin;\n }\n };\n}\n\n// Export the mixin function as both named and default\nexport { OxyServicesFedCMMixin as FedCMMixin };\n","import type { OxyServicesBase } from '../OxyServices.base';\nimport { OxyAuthenticationError } from '../OxyServices.errors';\nimport type { SessionLoginResponse } from '../../models/session';\nimport { createDebugLogger } from '../../shared/utils/debugUtils';\n\nconst debug = createDebugLogger('PopupAuth');\n\nexport interface PopupAuthOptions {\n width?: number;\n height?: number;\n timeout?: number;\n mode?: 'login' | 'signup';\n}\n\nexport interface SilentAuthOptions {\n timeout?: number;\n}\n\n/**\n * Popup-based Cross-Domain Authentication Mixin\n *\n * Implements OAuth2-style authentication using popup windows and postMessage.\n * This is the primary authentication method for modern browsers, providing a\n * Google-like experience without full page redirects.\n *\n * Flow:\n * 1. Opens small popup window to auth.oxy.so\n * 2. User signs in (auth.oxy.so sets its own first-party cookie)\n * 3. auth.oxy.so sends token back via postMessage\n * 4. Popup closes, parent app has the session\n *\n * Features:\n * - No full page redirect (preserves app state)\n * - Works across different domains (homiio.com, mention.earth, etc.)\n * - Silent refresh using hidden iframe for seamless SSO\n * - CSRF protection via state parameter\n * - XSS protection via origin validation\n *\n * Browser Support: All modern browsers (IE11+)\n */\nexport function OxyServicesPopupAuthMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n public static readonly AUTH_URL = 'https://auth.oxy.so';\n public static readonly POPUP_WIDTH = 500;\n public static readonly POPUP_HEIGHT = 700;\n public static readonly POPUP_TIMEOUT = 60000; // 1 minute\n public static readonly SILENT_TIMEOUT = 5000; // 5 seconds\n\n /**\n * Sign in using popup window\n *\n * Opens a centered popup window to auth.oxy.so where the user can sign in.\n * The popup automatically closes after successful authentication and the\n * session is returned to the parent window.\n *\n * @param options - Popup configuration options\n * @returns Session with access token and user data\n * @throws {OxyAuthenticationError} If popup is blocked or auth fails\n *\n * @example\n * ```typescript\n * const handleSignIn = async () => {\n * try {\n * const session = await oxyServices.signInWithPopup();\n * console.log('Signed in:', session.user);\n * } catch (error) {\n * if (error.message.includes('blocked')) {\n * alert('Please allow popups for this site');\n * }\n * }\n * };\n * ```\n */\n async signInWithPopup(options: PopupAuthOptions = {}): Promise<SessionLoginResponse> {\n if (typeof window === 'undefined') {\n throw new OxyAuthenticationError('Popup authentication requires browser environment');\n }\n\n const state = this.generateState();\n const nonce = this.generateNonce();\n\n // Store state for CSRF protection\n this.storeAuthState(state, nonce);\n\n const width = options.width || (this.constructor as any).POPUP_WIDTH;\n const height = options.height || (this.constructor as any).POPUP_HEIGHT;\n const timeout = options.timeout || (this.constructor as any).POPUP_TIMEOUT;\n const mode = options.mode || 'login';\n\n const authUrl = this.buildAuthUrl({\n mode,\n state,\n nonce,\n clientId: window.location.origin,\n redirectUri: `${(this.constructor as any).AUTH_URL}/auth/callback`,\n });\n\n const popup = this.openCenteredPopup(authUrl, 'Oxy Sign In', width, height);\n\n if (!popup) {\n throw new OxyAuthenticationError(\n 'Popup blocked. Please allow popups for this site and try again.'\n );\n }\n\n try {\n const session = await this.waitForPopupAuth(popup, state, timeout);\n\n // Store access token if present\n if (session && (session as any).accessToken) {\n this.httpService.setTokens((session as any).accessToken);\n }\n\n // Fetch user data using the session ID\n // The callback page only sends sessionId/accessToken, not user data\n if (session && session.sessionId && !session.user) {\n try {\n const userData = await this.makeRequest<any>(\n 'GET',\n `/api/session/user/${session.sessionId}`,\n undefined,\n { cache: false }\n );\n if (userData) {\n (session as any).user = userData;\n }\n } catch (userError) {\n debug.warn('Failed to fetch user data:', userError);\n // Continue without user data - caller can fetch separately\n }\n }\n\n return session;\n } catch (error) {\n throw error;\n } finally {\n this.clearAuthState(state);\n }\n }\n\n /**\n * Sign up using popup window\n *\n * Same as signInWithPopup but opens the signup page by default.\n *\n * @param options - Popup configuration options\n * @returns Session with access token and user data\n */\n async signUpWithPopup(options: PopupAuthOptions = {}): Promise<SessionLoginResponse> {\n return this.signInWithPopup({ ...options, mode: 'signup' });\n }\n\n /**\n * Silent sign-in using hidden iframe\n *\n * Attempts to automatically re-authenticate the user without any UI.\n * This is what enables seamless SSO across all Oxy domains.\n *\n * How it works:\n * 1. Creates hidden iframe pointing to auth.oxy.so/silent-auth\n * 2. If user has valid session at auth.oxy.so, it sends token via postMessage\n * 3. If not, iframe responds with null (no error thrown)\n *\n * This should be called on app startup to check for existing sessions.\n *\n * @param options - Silent auth options\n * @returns Session if user is signed in, null otherwise\n *\n * @example\n * ```typescript\n * useEffect(() => {\n * const checkAuth = async () => {\n * const session = await oxyServices.silentSignIn();\n * if (session) {\n * setUser(session.user);\n * }\n * };\n * checkAuth();\n * }, []);\n * ```\n */\n async silentSignIn(options: SilentAuthOptions = {}): Promise<SessionLoginResponse | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const timeout = options.timeout || (this.constructor as any).SILENT_TIMEOUT;\n const nonce = this.generateNonce();\n const clientId = window.location.origin;\n\n const iframe = document.createElement('iframe');\n iframe.style.display = 'none';\n iframe.style.position = 'absolute';\n iframe.style.width = '0';\n iframe.style.height = '0';\n iframe.style.border = 'none';\n\n const silentUrl = `${(this.constructor as any).AUTH_URL}/auth/silent?` + `client_id=${encodeURIComponent(clientId)}&` + `nonce=${nonce}`;\n\n iframe.src = silentUrl;\n document.body.appendChild(iframe);\n\n try {\n const session = await this.waitForIframeAuth(iframe, timeout, clientId);\n\n if (session && (session as any).accessToken) {\n this.httpService.setTokens((session as any).accessToken);\n }\n\n return session;\n } catch (error) {\n return null;\n } finally {\n document.body.removeChild(iframe);\n }\n }\n\n /**\n * Open a centered popup window\n *\n * @private\n */\n public openCenteredPopup(url: string, title: string, width: number, height: number): Window | null {\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const features = [\n `width=${width}`,\n `height=${height}`,\n `left=${left}`,\n `top=${top}`,\n 'toolbar=no',\n 'menubar=no',\n 'scrollbars=yes',\n 'resizable=yes',\n 'status=no',\n 'location=no',\n ].join(',');\n\n return window.open(url, title, features);\n }\n\n /**\n * Wait for authentication response from popup\n *\n * @private\n */\n public async waitForPopupAuth(\n popup: Window,\n expectedState: string,\n timeout: number\n ): Promise<SessionLoginResponse> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n cleanup();\n reject(new OxyAuthenticationError('Authentication timeout'));\n }, timeout);\n\n const messageHandler = (event: MessageEvent) => {\n const authUrl = (this.constructor as any).AUTH_URL;\n\n // Log all messages for debugging\n if (event.data && typeof event.data === 'object' && event.data.type) {\n debug.log('Message received:', {\n origin: event.origin,\n expectedOrigin: authUrl,\n type: event.data.type,\n hasSession: !!event.data.session,\n hasError: !!event.data.error,\n });\n }\n\n // CRITICAL: Verify origin to prevent XSS attacks\n if (event.origin !== authUrl) {\n return;\n }\n\n const { type, state, session, error } = event.data;\n\n if (type !== 'oxy_auth_response') {\n return;\n }\n\n debug.log('Valid auth response:', { state, expectedState, hasSession: !!session, error });\n\n // Verify state parameter to prevent CSRF attacks\n if (state !== expectedState) {\n cleanup();\n debug.error('State mismatch');\n reject(new OxyAuthenticationError('Invalid state parameter. Possible CSRF attack.'));\n return;\n }\n\n cleanup();\n\n if (error) {\n debug.error('Auth error:', error);\n reject(new OxyAuthenticationError(error));\n } else if (session) {\n debug.log('Session received successfully');\n resolve(session);\n } else {\n debug.error('No session in response');\n reject(new OxyAuthenticationError('No session received from authentication server'));\n }\n };\n\n // Poll to detect if user closed the popup\n const pollInterval = setInterval(() => {\n if (popup.closed) {\n cleanup();\n reject(new OxyAuthenticationError('Authentication cancelled by user'));\n }\n }, 500);\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n clearInterval(pollInterval);\n window.removeEventListener('message', messageHandler);\n if (!popup.closed) {\n popup.close();\n }\n };\n\n window.addEventListener('message', messageHandler);\n });\n }\n\n /**\n * Wait for authentication response from iframe\n *\n * @private\n */\n public async waitForIframeAuth(\n iframe: HTMLIFrameElement,\n timeout: number,\n expectedOrigin: string\n ): Promise<SessionLoginResponse | null> {\n return new Promise((resolve) => {\n const timeoutId = setTimeout(() => {\n cleanup();\n resolve(null); // Silent failure - don't throw\n }, timeout);\n\n const messageHandler = (event: MessageEvent) => {\n // Verify origin\n if (event.origin !== (this.constructor as any).AUTH_URL) {\n return;\n }\n\n const { type, session } = event.data;\n\n if (type !== 'oxy_silent_auth') {\n return;\n }\n\n cleanup();\n resolve(session || null);\n };\n\n const cleanup = () => {\n clearTimeout(timeoutId);\n window.removeEventListener('message', messageHandler);\n };\n\n window.addEventListener('message', messageHandler);\n });\n }\n\n /**\n * Build authentication URL with query parameters\n *\n * @private\n */\n public buildAuthUrl(params: {\n mode: string;\n state: string;\n nonce: string;\n clientId: string;\n redirectUri: string;\n }): string {\n const url = new URL(`${(this.constructor as any).AUTH_URL}/${params.mode}`);\n url.searchParams.set('response_type', 'token');\n url.searchParams.set('client_id', params.clientId);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('state', params.state);\n url.searchParams.set('nonce', params.nonce);\n return url.toString();\n }\n\n /**\n * Generate cryptographically secure state for CSRF protection\n *\n * @private\n */\n public generateState(): string {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Generate nonce for replay attack prevention\n *\n * @private\n */\n public generateNonce(): string {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Store auth state in session storage\n *\n * @private\n */\n public storeAuthState(state: string, nonce: string): void {\n if (typeof window !== 'undefined' && window.sessionStorage) {\n sessionStorage.setItem(`oxy_auth_state_${state}`, JSON.stringify({ nonce, timestamp: Date.now() }));\n }\n }\n\n /**\n * Clear auth state from session storage\n *\n * @private\n */\n public clearAuthState(state: string): void {\n if (typeof window !== 'undefined' && window.sessionStorage) {\n sessionStorage.removeItem(`oxy_auth_state_${state}`);\n }\n }\n };\n}\n\n// Export the mixin function as both named and default\nexport { OxyServicesPopupAuthMixin as PopupAuthMixin };\n","/**\n * Utility functions for common API patterns\n */\n\n/**\n * Build URL search parameters from an object\n * @param params Object with parameter key-value pairs\n * @returns URLSearchParams instance\n */\nexport function buildSearchParams(params: Record<string, any>): URLSearchParams {\n const searchParams = new URLSearchParams();\n \n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.append(key, value.toString());\n }\n }\n \n return searchParams;\n}\n\n/**\n * Build URL with search parameters\n * @param baseUrl Base URL\n * @param params Object with parameter key-value pairs\n * @returns Complete URL with search parameters\n */\nexport function buildUrl(baseUrl: string, params?: Record<string, any>): string {\n if (!params) return baseUrl;\n \n const searchParams = buildSearchParams(params);\n const queryString = searchParams.toString();\n \n return queryString ? `${baseUrl}?${queryString}` : baseUrl;\n}\n\n/**\n * Common pagination parameters\n */\nexport interface PaginationParams {\n limit?: number;\n offset?: number;\n}\n\n/**\n * Build pagination search parameters\n * @param params Pagination parameters\n * @returns URLSearchParams with pagination\n */\nexport function buildPaginationParams(params: PaginationParams): URLSearchParams {\n return buildSearchParams(params);\n}\n\n/**\n * Common API response wrapper\n */\nexport interface ApiResponse<T = any> {\n data: T;\n message?: string;\n success?: boolean;\n}\n\n/**\n * Common error response wrapper\n */\nexport interface ErrorResponse {\n message: string;\n code: string;\n status: number;\n details?: any;\n}\n\n/**\n * Safe JSON parsing with error handling\n * @param data Data to parse\n * @param fallback Fallback value if parsing fails\n * @returns Parsed data or fallback\n */\nexport function safeJsonParse<T>(data: any, fallback: T): T {\n if (typeof data === 'string') {\n try {\n return JSON.parse(data);\n } catch {\n return fallback;\n }\n }\n return data as T;\n} ","/**\n * Language utilities for OxyServices\n * Provides access to supported languages and language metadata\n */\n\nexport interface LanguageMetadata {\n id: string;\n name: string;\n nativeName: string;\n flag: string;\n icon: string;\n color: string;\n}\n\n// Supported languages with their metadata\nexport const SUPPORTED_LANGUAGES: LanguageMetadata[] = [\n {\n id: 'en-US',\n name: 'English',\n nativeName: 'English',\n flag: '🇺🇸',\n icon: 'translate',\n color: '#007AFF',\n },\n {\n id: 'es-ES',\n name: 'Spanish',\n nativeName: 'Español',\n flag: '🇪🇸',\n icon: 'translate',\n color: '#FF3B30',\n },\n {\n id: 'ca-ES',\n name: 'Catalan',\n nativeName: 'Català',\n flag: '🇪🇸',\n icon: 'translate',\n color: '#0CA678',\n },\n {\n id: 'fr-FR',\n name: 'French',\n nativeName: 'Français',\n flag: '🇫🇷',\n icon: 'translate',\n color: '#5856D6',\n },\n {\n id: 'de-DE',\n name: 'German',\n nativeName: 'Deutsch',\n flag: '🇩🇪',\n icon: 'translate',\n color: '#FF9500',\n },\n {\n id: 'it-IT',\n name: 'Italian',\n nativeName: 'Italiano',\n flag: '🇮🇹',\n icon: 'translate',\n color: '#34C759',\n },\n {\n id: 'pt-PT',\n name: 'Portuguese',\n nativeName: 'Português',\n flag: '🇵🇹',\n icon: 'translate',\n color: '#AF52DE',\n },\n {\n id: 'ja-JP',\n name: 'Japanese',\n nativeName: '日本語',\n flag: '🇯🇵',\n icon: 'translate',\n color: '#FF2D92',\n },\n {\n id: 'ko-KR',\n name: 'Korean',\n nativeName: '한국어',\n flag: '🇰🇷',\n icon: 'translate',\n color: '#32D74B',\n },\n {\n id: 'zh-CN',\n name: 'Chinese',\n nativeName: '中文',\n flag: '🇨🇳',\n icon: 'translate',\n color: '#FF9F0A',\n },\n {\n id: 'ar-SA',\n name: 'Arabic',\n nativeName: 'العربية',\n flag: '🇸🇦',\n icon: 'translate',\n color: '#30B0C7',\n },\n];\n\nconst FALLBACK_LANGUAGE = 'en-US';\n\n/**\n * Get language metadata by language code\n * @param languageCode - BCP-47 language code (e.g., 'en-US', 'es-ES')\n * @returns Language metadata or null if not found\n */\nexport function getLanguageMetadata(languageCode: string | null | undefined): LanguageMetadata | null {\n if (!languageCode) return null;\n \n // Direct match\n const exactMatch = SUPPORTED_LANGUAGES.find(lang => lang.id === languageCode);\n if (exactMatch) return exactMatch;\n \n // Try to match base language code (e.g., 'en' matches 'en-US')\n const baseCode = languageCode.split('-')[0];\n const baseMatch = SUPPORTED_LANGUAGES.find(lang => lang.id.startsWith(baseCode + '-'));\n if (baseMatch) return baseMatch;\n \n return null;\n}\n\n/**\n * Get language name by language code\n * @param languageCode - BCP-47 language code (e.g., 'en-US', 'es-ES')\n * @returns Language name (e.g., 'English') or the code if not found\n */\nexport function getLanguageName(languageCode: string | null | undefined): string {\n const metadata = getLanguageMetadata(languageCode);\n return metadata?.name || languageCode || FALLBACK_LANGUAGE;\n}\n\n/**\n * Get native language name by language code\n * @param languageCode - BCP-47 language code (e.g., 'en-US', 'es-ES')\n * @returns Native language name (e.g., 'Español') or the code if not found\n */\nexport function getNativeLanguageName(languageCode: string | null | undefined): string {\n const metadata = getLanguageMetadata(languageCode);\n return metadata?.nativeName || languageCode || FALLBACK_LANGUAGE;\n}\n\n/**\n * Normalize language code to BCP-47 format\n * @param lang - Language code (may be short like 'en' or full like 'en-US')\n * @returns Normalized BCP-47 language code\n */\nexport function normalizeLanguageCode(lang?: string | null): string {\n if (!lang) return FALLBACK_LANGUAGE;\n if (lang.includes('-')) return lang;\n \n const map: Record<string, string> = {\n en: 'en-US',\n es: 'es-ES',\n ca: 'ca-ES',\n fr: 'fr-FR',\n de: 'de-DE',\n it: 'it-IT',\n pt: 'pt-PT',\n ja: 'ja-JP',\n ko: 'ko-KR',\n zh: 'zh-CN',\n ar: 'ar-SA',\n };\n \n return map[lang] || lang;\n}\n\n","/**\n * Helper utilities for mixin classes\n * Provides common patterns to reduce code duplication\n */\n\nimport type { OxyServicesBase } from '../OxyServices.base';\n\n/**\n * Wraps an async method with standard error handling\n * Reduces boilerplate in mixin methods\n */\nexport async function withErrorHandling<T>(\n operation: () => Promise<T>,\n handleError: (error: any) => Error\n): Promise<T> {\n try {\n return await operation();\n } catch (error) {\n throw handleError(error);\n }\n}\n\n/**\n * Creates a standard API request method with error handling\n * Reduces duplication across mixin methods\n */\nexport function createApiMethod<T>(\n makeRequest: OxyServicesBase['makeRequest'],\n handleError: OxyServicesBase['handleError'],\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE',\n url: string | ((...args: any[]) => string),\n options: {\n cache?: boolean;\n cacheTTL?: number;\n retry?: boolean;\n transformData?: (data: any) => any;\n transformResponse?: (response: any) => T;\n } = {}\n) {\n return async (...args: any[]): Promise<T> => {\n const urlString = typeof url === 'function' ? url(...args) : url;\n const requestData = options.transformData ? options.transformData(args) : args[0];\n \n const requestOptions = {\n cache: options.cache ?? true,\n cacheTTL: options.cacheTTL,\n retry: options.retry ?? true,\n };\n\n try {\n const response = await makeRequest<T>(method, urlString, requestData, requestOptions);\n return options.transformResponse ? options.transformResponse(response) : response;\n } catch (error) {\n throw handleError(error);\n }\n };\n}\n\n/**\n * Cache time constants (in milliseconds)\n */\nexport const CACHE_TIMES = {\n SHORT: 1 * 60 * 1000, // 1 minute\n MEDIUM: 2 * 60 * 1000, // 2 minutes\n LONG: 5 * 60 * 1000, // 5 minutes\n VERY_LONG: 10 * 60 * 1000, // 10 minutes\n EXTRA_LONG: 30 * 60 * 1000, // 30 minutes\n} as const;\n\n","/**\n * Centralized mixin exports and composition helper\n *\n * This module provides a clean way to compose all mixins\n * and ensures consistent ordering for better maintainability\n */\n\nimport { OxyServicesBase } from '../OxyServices.base';\nimport { OxyServicesAuthMixin } from './OxyServices.auth';\nimport { OxyServicesFedCMMixin } from './OxyServices.fedcm';\nimport { OxyServicesPopupAuthMixin } from './OxyServices.popup';\nimport { OxyServicesRedirectAuthMixin } from './OxyServices.redirect';\nimport { OxyServicesUserMixin } from './OxyServices.user';\nimport { OxyServicesPrivacyMixin } from './OxyServices.privacy';\nimport { OxyServicesLanguageMixin } from './OxyServices.language';\nimport { OxyServicesPaymentMixin } from './OxyServices.payment';\nimport { OxyServicesKarmaMixin } from './OxyServices.karma';\nimport { OxyServicesAssetsMixin } from './OxyServices.assets';\nimport { OxyServicesDeveloperMixin } from './OxyServices.developer';\nimport { OxyServicesLocationMixin } from './OxyServices.location';\nimport { OxyServicesAnalyticsMixin } from './OxyServices.analytics';\nimport { OxyServicesDevicesMixin } from './OxyServices.devices';\nimport { OxyServicesSecurityMixin } from './OxyServices.security';\nimport { OxyServicesUtilityMixin } from './OxyServices.utility';\nimport { OxyServicesFeaturesMixin } from './OxyServices.features';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MixinFunction = (Base: any) => any;\n\n/**\n * Mixin pipeline - applied in order from first to last.\n *\n * Order matters for dependencies:\n * 1. Base auth mixin first (required by all others)\n * 2. Cross-domain auth mixins (FedCM, Popup, Redirect)\n * 3. User mixin (requires auth)\n * 4. Feature mixins (can depend on user)\n * 5. Utility mixin last (augments all)\n *\n * To add a new mixin: insert it at the appropriate position in this array.\n */\nconst MIXIN_PIPELINE: MixinFunction[] = [\n // Base authentication\n OxyServicesAuthMixin,\n\n // Cross-domain authentication (web-only)\n // - FedCM: Modern browser-native identity federation (Google-style)\n // - Popup: OAuth2-style popup authentication\n // - Redirect: Traditional redirect-based authentication\n OxyServicesFedCMMixin,\n OxyServicesPopupAuthMixin,\n OxyServicesRedirectAuthMixin,\n\n // User management (requires auth)\n OxyServicesUserMixin,\n OxyServicesPrivacyMixin,\n\n // Feature mixins\n OxyServicesLanguageMixin,\n OxyServicesPaymentMixin,\n OxyServicesKarmaMixin,\n OxyServicesAssetsMixin,\n OxyServicesDeveloperMixin,\n OxyServicesLocationMixin,\n OxyServicesAnalyticsMixin,\n OxyServicesDevicesMixin,\n OxyServicesSecurityMixin,\n OxyServicesFeaturesMixin,\n\n // Utility (last, can use all above)\n OxyServicesUtilityMixin,\n];\n\n/**\n * Composes all OxyServices mixins using a pipeline pattern.\n *\n * This is equivalent to the nested calls but more readable and maintainable.\n * Adding a new mixin: just add it to MIXIN_PIPELINE at the appropriate position.\n *\n * @returns The fully composed OxyServices class with all mixins applied\n */\nexport function composeOxyServices() {\n return MIXIN_PIPELINE.reduce(\n (Base, mixin) => mixin(Base),\n OxyServicesBase as unknown as ReturnType<MixinFunction>\n );\n}\n\n// Export the pipeline for testing/debugging\nexport { MIXIN_PIPELINE };\n\n","/**\n * Authentication Methods Mixin\n * \n * Supports password-based login (email/username) and public key challenge-response.\n */\nimport type { User } from '../../models/interfaces';\nimport type { SessionLoginResponse } from '../../models/session';\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { OxyAuthenticationError } from '../OxyServices.errors';\n\nexport interface ChallengeResponse {\n challenge: string;\n expiresAt: string;\n}\n\nexport interface RegistrationRequest {\n publicKey: string;\n username: string;\n email?: string;\n signature: string;\n timestamp: number;\n}\n\nexport interface ChallengeVerifyRequest {\n publicKey: string;\n challenge: string;\n signature: string;\n timestamp: number;\n deviceName?: string;\n deviceFingerprint?: string;\n}\n\nexport interface PublicKeyCheckResponse {\n registered: boolean;\n message: string;\n}\n\nexport function OxyServicesAuthMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Register a new identity with public key authentication\n * Identity is purely cryptographic - username and profile data are optional\n * \n * @param publicKey - The user's ECDSA public key (hex)\n * @param signature - Signature of the registration request\n * @param timestamp - Timestamp when the signature was created\n */\n async register(\n publicKey: string,\n signature: string,\n timestamp: number\n ): Promise<{ message: string; user: User }> {\n try {\n const res = await this.makeRequest<{ message: string; user: User }>('POST', '/api/auth/register', {\n publicKey,\n signature,\n timestamp,\n }, { cache: false });\n\n if (!res || (typeof res === 'object' && Object.keys(res).length === 0)) {\n throw new OxyAuthenticationError('Registration failed', 'REGISTER_FAILED', 400);\n }\n\n return res;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Request an authentication challenge\n * The client must sign this challenge with their private key\n * \n * @param publicKey - The user's public key\n */\n async requestChallenge(publicKey: string): Promise<ChallengeResponse> {\n try {\n return await this.makeRequest<ChallengeResponse>('POST', '/api/auth/challenge', {\n publicKey,\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Verify a signed challenge and create a session\n * \n * @param publicKey - The user's public key\n * @param challenge - The challenge string from requestChallenge\n * @param signature - Signature of the auth message\n * @param timestamp - Timestamp when the signature was created\n * @param deviceName - Optional device name\n * @param deviceFingerprint - Optional device fingerprint\n */\n async verifyChallenge(\n publicKey: string,\n challenge: string,\n signature: string,\n timestamp: number,\n deviceName?: string,\n deviceFingerprint?: string\n ): Promise<SessionLoginResponse> {\n try {\n return await this.makeRequest<SessionLoginResponse>('POST', '/api/auth/verify', {\n publicKey,\n challenge,\n signature,\n timestamp,\n deviceName,\n deviceFingerprint,\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Check if a public key is already registered\n */\n async checkPublicKeyRegistered(publicKey: string): Promise<PublicKeyCheckResponse> {\n try {\n return await this.makeRequest<PublicKeyCheckResponse>(\n 'GET',\n `/api/auth/check-publickey/${encodeURIComponent(publicKey)}`,\n undefined,\n { cache: false }\n );\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user by public key\n */\n async getUserByPublicKey(publicKey: string): Promise<User> {\n try {\n return await this.makeRequest<User>(\n 'GET',\n `/api/auth/user/${encodeURIComponent(publicKey)}`,\n undefined,\n { cache: true, cacheTTL: 2 * 60 * 1000 }\n );\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user by session ID\n */\n async getUserBySession(sessionId: string): Promise<User> {\n try {\n return await this.makeRequest<User>('GET', `/api/session/user/${sessionId}`, undefined, {\n cache: true,\n cacheTTL: 2 * 60 * 1000,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Batch get multiple user profiles by session IDs\n */\n async getUsersBySessions(sessionIds: string[]): Promise<Array<{ sessionId: string; user: User | null }>> {\n try {\n if (!Array.isArray(sessionIds) || sessionIds.length === 0) {\n return [];\n }\n \n const uniqueSessionIds = Array.from(new Set(sessionIds)).sort();\n \n return await this.makeRequest<Array<{ sessionId: string; user: User | null }>>(\n 'POST',\n '/api/session/users/batch',\n { sessionIds: uniqueSessionIds },\n {\n cache: true,\n cacheTTL: 2 * 60 * 1000,\n deduplicate: true,\n }\n );\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get access token by session ID\n */\n async getTokenBySession(sessionId: string): Promise<{ accessToken: string; expiresAt: string }> {\n try {\n const res = await this.makeRequest<{ accessToken: string; expiresAt: string }>(\n 'GET',\n `/api/session/token/${sessionId}`,\n undefined,\n { cache: false, retry: false }\n );\n \n this.setTokens(res.accessToken);\n \n return res;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get sessions by session ID\n */\n async getSessionsBySessionId(sessionId: string): Promise<any[]> {\n try {\n return await this.makeRequest('GET', `/api/session/sessions/${sessionId}`, undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Logout from a specific session\n */\n async logoutSession(sessionId: string, targetSessionId?: string): Promise<void> {\n try {\n const url = targetSessionId \n ? `/api/session/logout/${sessionId}/${targetSessionId}`\n : `/api/session/logout/${sessionId}`;\n \n await this.makeRequest('POST', url, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Logout from all sessions\n */\n async logoutAllSessions(sessionId: string): Promise<void> {\n try {\n await this.makeRequest('POST', `/api/session/logout-all/${sessionId}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Validate session\n */\n async validateSession(\n sessionId: string, \n options: {\n deviceFingerprint?: string;\n useHeaderValidation?: boolean;\n } = {}\n ): Promise<{ \n valid: boolean; \n expiresAt: string; \n lastActivity: string; \n user: User;\n sessionId?: string;\n source?: string;\n }> {\n try {\n const urlParams: any = {};\n if (options.deviceFingerprint) urlParams.deviceFingerprint = options.deviceFingerprint;\n if (options.useHeaderValidation) urlParams.useHeaderValidation = 'true';\n return await this.makeRequest('GET', `/api/session/validate/${sessionId}`, urlParams, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Check username availability\n */\n async checkUsernameAvailability(username: string): Promise<{ available: boolean; message: string }> {\n try {\n return await this.makeRequest('GET', `/api/auth/check-username/${username}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Check email availability\n */\n async checkEmailAvailability(email: string): Promise<{ available: boolean; message: string }> {\n try {\n return await this.makeRequest('GET', `/api/auth/check-email/${email}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Register a new user with email/username and password\n */\n async signUp(\n username: string,\n email: string,\n password: string,\n deviceName?: string,\n deviceFingerprint?: any\n ): Promise<SessionLoginResponse> {\n try {\n return await this.makeRequest<SessionLoginResponse>('POST', '/api/auth/signup', {\n username,\n email,\n password,\n deviceName,\n deviceFingerprint,\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Sign in with email or username and password\n */\n async signIn(\n identifier: string,\n password: string,\n deviceName?: string,\n deviceFingerprint?: any\n ): Promise<SessionLoginResponse> {\n try {\n return await this.makeRequest<SessionLoginResponse>('POST', '/api/auth/login', {\n identifier,\n password,\n deviceName,\n deviceFingerprint,\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Convenience helper for email sign-in\n */\n async signInWithEmail(\n email: string,\n password: string,\n deviceName?: string,\n deviceFingerprint?: any\n ): Promise<SessionLoginResponse> {\n return this.signIn(email, password, deviceName, deviceFingerprint);\n }\n };\n}\n","import type { OxyServicesBase } from '../OxyServices.base';\nimport { OxyAuthenticationError } from '../OxyServices.errors';\nimport type { SessionLoginResponse } from '../../models/session';\n\nexport interface RedirectAuthOptions {\n redirectUri?: string;\n mode?: 'login' | 'signup';\n preserveUrl?: boolean;\n}\n\n/**\n * Redirect-based Cross-Domain Authentication Mixin\n *\n * Implements traditional OAuth2 redirect flow as a fallback when popup or\n * FedCM are not available or fail (e.g., mobile browsers, popup blockers).\n *\n * Flow:\n * 1. Save current URL\n * 2. Redirect to auth.oxy.so/login\n * 3. User signs in\n * 4. Redirect back with token in URL\n * 5. Extract token, restore session, clean URL\n *\n * Features:\n * - Works on all browsers (including old mobile browsers)\n * - Automatic URL cleanup after auth\n * - State preservation option\n * - CSRF protection via state parameter\n *\n * Trade-offs:\n * - Loses JavaScript app state (full page navigation)\n * - Visible redirect (user sees navigation)\n * - Slower perceived performance\n */\nexport function OxyServicesRedirectAuthMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n public static readonly AUTH_URL = 'https://auth.oxy.so';\n public static readonly TOKEN_STORAGE_KEY = 'oxy_access_token';\n public static readonly SESSION_STORAGE_KEY = 'oxy_session_id';\n public static readonly STATE_STORAGE_KEY = 'oxy_auth_state';\n public static readonly PRE_AUTH_URL_KEY = 'oxy_pre_auth_url';\n public static readonly NONCE_STORAGE_KEY = 'oxy_auth_nonce';\n\n /**\n * Sign in using full page redirect\n *\n * Redirects the user to auth.oxy.so for authentication. After successful\n * sign-in, the user will be redirected back to the current page (or custom\n * redirect URI) with authentication tokens in the URL.\n *\n * Call handleAuthCallback() on app startup to complete the flow.\n *\n * @param options - Redirect configuration options\n *\n * @example\n * ```typescript\n * // Initiate sign-in\n * const handleSignIn = () => {\n * oxyServices.signInWithRedirect();\n * };\n *\n * // Handle callback on app startup\n * useEffect(() => {\n * const session = oxyServices.handleAuthCallback();\n * if (session) {\n * setUser(session.user);\n * }\n * }, []);\n * ```\n */\n signInWithRedirect(options: RedirectAuthOptions = {}): void {\n if (typeof window === 'undefined') {\n throw new OxyAuthenticationError('Redirect authentication requires browser environment');\n }\n\n const redirectUri = options.redirectUri || window.location.href;\n const mode = options.mode || 'login';\n const state = this.generateState();\n const nonce = this.generateNonce();\n\n // Store state for CSRF protection\n this.storeAuthState(state, nonce);\n\n // Save current URL to restore after auth (optional)\n if (options.preserveUrl !== false) {\n this.savePreAuthUrl(window.location.href);\n }\n\n const authUrl = this.buildAuthUrl({\n mode,\n redirectUri,\n state,\n nonce,\n clientId: window.location.origin,\n });\n\n // Perform redirect\n window.location.href = authUrl;\n }\n\n /**\n * Sign up using full page redirect\n *\n * Same as signInWithRedirect but opens the signup page by default.\n */\n signUpWithRedirect(options: RedirectAuthOptions = {}): void {\n this.signInWithRedirect({ ...options, mode: 'signup' });\n }\n\n /**\n * Handle authentication callback\n *\n * Call this on app startup to check if the current page load is a\n * redirect back from the authentication server. If it is, this method\n * will extract the tokens, store them, and clean up the URL.\n *\n * @returns Session data if this is a callback, null otherwise\n * @throws {OxyAuthenticationError} If state validation fails (CSRF attack)\n *\n * @example\n * ```typescript\n * // In your app's root component or startup logic\n * useEffect(() => {\n * try {\n * const session = oxyServices.handleAuthCallback();\n * if (session) {\n * console.log('Logged in:', session.user);\n * setUser(session.user);\n * } else {\n * // Not a callback, check for existing session\n * const restored = oxyServices.restoreSession();\n * if (!restored) {\n * // No session, show login button\n * }\n * }\n * } catch (error) {\n * console.error('Auth callback failed:', error);\n * }\n * }, []);\n * ```\n */\n handleAuthCallback(): SessionLoginResponse | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n const url = new URL(window.location.href);\n const accessToken = url.searchParams.get('access_token');\n const sessionId = url.searchParams.get('session_id');\n const expiresAt = url.searchParams.get('expires_at');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n const errorDescription = url.searchParams.get('error_description');\n\n // Check if this is an error callback\n if (error) {\n this.clearAuthState();\n throw new OxyAuthenticationError(errorDescription || error);\n }\n\n // Check if this is an auth callback\n if (!accessToken || !sessionId) {\n return null; // Not a callback\n }\n\n // Verify state to prevent CSRF attacks\n const savedState = this.getStoredState();\n if (!savedState || state !== savedState) {\n this.clearAuthState();\n throw new OxyAuthenticationError('Invalid state parameter. Possible CSRF attack.');\n }\n\n // Store tokens\n this.storeTokens(accessToken, sessionId);\n this.httpService.setTokens(accessToken);\n\n // Build session response (minimal - we'll fetch full user data separately)\n const session: SessionLoginResponse = {\n sessionId,\n deviceId: '', // Not available in redirect flow\n expiresAt: expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n user: {} as any, // Will be fetched separately\n };\n\n // Clean up URL (remove auth parameters)\n this.cleanAuthCallbackUrl(url);\n\n // Clean up storage\n this.clearAuthState();\n\n return session;\n }\n\n /**\n * Restore session from storage\n *\n * Attempts to restore a previously authenticated session from localStorage.\n * Call this on app startup if handleAuthCallback() returns null.\n *\n * @returns True if session was restored, false otherwise\n *\n * @example\n * ```typescript\n * useEffect(() => {\n * const session = oxyServices.handleAuthCallback();\n * if (!session) {\n * const restored = oxyServices.restoreSession();\n * if (!restored) {\n * // No session, user needs to sign in\n * setShowLogin(true);\n * }\n * }\n * }, []);\n * ```\n */\n restoreSession(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n\n const token = localStorage.getItem((this.constructor as any).TOKEN_STORAGE_KEY);\n const sessionId = localStorage.getItem((this.constructor as any).SESSION_STORAGE_KEY);\n\n if (token && sessionId) {\n this.httpService.setTokens(token);\n return true;\n }\n\n return false;\n }\n\n /**\n * Clear stored session\n *\n * Removes all authentication data from storage. Call this on logout.\n */\n clearStoredSession(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n localStorage.removeItem((this.constructor as any).TOKEN_STORAGE_KEY);\n localStorage.removeItem((this.constructor as any).SESSION_STORAGE_KEY);\n this.httpService.clearTokens();\n }\n\n /**\n * Get stored session ID\n */\n getStoredSessionId(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n return localStorage.getItem((this.constructor as any).SESSION_STORAGE_KEY);\n }\n\n /**\n * Build authentication URL with query parameters\n *\n * @private\n */\n public buildAuthUrl(params: {\n mode: string;\n redirectUri: string;\n state: string;\n nonce: string;\n clientId: string;\n }): string {\n const url = new URL(`${(this.constructor as any).AUTH_URL}/${params.mode}`);\n url.searchParams.set('redirect_uri', params.redirectUri);\n url.searchParams.set('state', params.state);\n url.searchParams.set('nonce', params.nonce);\n url.searchParams.set('client_id', params.clientId);\n url.searchParams.set('response_type', 'token');\n return url.toString();\n }\n\n /**\n * Store tokens in localStorage\n *\n * @private\n */\n public storeTokens(accessToken: string, sessionId: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n localStorage.setItem((this.constructor as any).TOKEN_STORAGE_KEY, accessToken);\n localStorage.setItem((this.constructor as any).SESSION_STORAGE_KEY, sessionId);\n }\n\n /**\n * Generate cryptographically secure state for CSRF protection\n *\n * @private\n */\n public generateState(): string {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Generate nonce for replay attack prevention\n *\n * @private\n */\n public generateNonce(): string {\n if (typeof window !== 'undefined' && window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * Store auth state in session storage\n *\n * @private\n */\n public storeAuthState(state: string, nonce: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n sessionStorage.setItem((this.constructor as any).STATE_STORAGE_KEY, state);\n sessionStorage.setItem((this.constructor as any).NONCE_STORAGE_KEY, nonce);\n }\n\n /**\n * Get stored state\n *\n * @private\n */\n public getStoredState(): string | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n return sessionStorage.getItem((this.constructor as any).STATE_STORAGE_KEY);\n }\n\n /**\n * Clear auth state from storage\n *\n * @private\n */\n public clearAuthState(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n sessionStorage.removeItem((this.constructor as any).STATE_STORAGE_KEY);\n sessionStorage.removeItem((this.constructor as any).NONCE_STORAGE_KEY);\n sessionStorage.removeItem((this.constructor as any).PRE_AUTH_URL_KEY);\n }\n\n /**\n * Save pre-authentication URL to restore later\n *\n * @private\n */\n public savePreAuthUrl(url: string): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n sessionStorage.setItem((this.constructor as any).PRE_AUTH_URL_KEY, url);\n }\n\n /**\n * Clean authentication parameters from URL\n *\n * @private\n */\n public cleanAuthCallbackUrl(url: URL): void {\n // Remove auth parameters\n url.searchParams.delete('access_token');\n url.searchParams.delete('session_id');\n url.searchParams.delete('expires_at');\n url.searchParams.delete('state');\n url.searchParams.delete('nonce');\n url.searchParams.delete('error');\n url.searchParams.delete('error_description');\n\n // Update URL without reloading page\n window.history.replaceState({}, '', url.toString());\n }\n };\n}\n\n// Export the mixin function as both named and default\nexport { OxyServicesRedirectAuthMixin as RedirectAuthMixin };\n","/**\n * User Management Methods Mixin\n */\nimport type { User, Notification, SearchProfilesResponse, PaginationInfo } from '../../models/interfaces';\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { buildSearchParams, buildPaginationParams, type PaginationParams } from '../../utils/apiUtils';\n\nexport function OxyServicesUserMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n /**\n * Get profile by username\n */\n async getProfileByUsername(username: string): Promise<User> {\n try {\n return await this.makeRequest<User>('GET', `/api/profiles/username/${username}`, undefined, {\n cache: true,\n cacheTTL: 5 * 60 * 1000, // 5 minutes cache for profiles\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Search user profiles\n */\n async searchProfiles(query: string, pagination?: PaginationParams): Promise<SearchProfilesResponse> {\n try {\n const params = { query, ...pagination };\n const searchParams = buildSearchParams(params);\n const paramsObj = Object.fromEntries(searchParams.entries());\n\n const response = await this.makeRequest<SearchProfilesResponse | User[]>(\n 'GET',\n '/api/profiles/search',\n paramsObj,\n {\n cache: true,\n cacheTTL: 2 * 60 * 1000, // 2 minutes cache\n }\n );\n\n // New API shape: { data: User[], pagination: {...} }\n const isSearchProfilesResponse = (payload: unknown): payload is SearchProfilesResponse =>\n typeof payload === 'object' &&\n payload !== null &&\n Array.isArray((payload as SearchProfilesResponse).data);\n\n if (isSearchProfilesResponse(response)) {\n const typedResponse = response;\n const paginationInfo: PaginationInfo = typedResponse.pagination ?? {\n total: typedResponse.data.length,\n limit: pagination?.limit ?? typedResponse.data.length,\n offset: pagination?.offset ?? 0,\n hasMore: typedResponse.data.length === (pagination?.limit ?? typedResponse.data.length) &&\n (pagination?.limit ?? typedResponse.data.length) > 0,\n };\n\n return {\n data: typedResponse.data,\n pagination: paginationInfo,\n };\n }\n\n // Legacy API shape: returns raw User[]\n if (Array.isArray(response)) {\n const fallbackLimit = pagination?.limit ?? response.length;\n const fallbackPagination: PaginationInfo = {\n total: response.length,\n limit: fallbackLimit,\n offset: pagination?.offset ?? 0,\n hasMore: fallbackLimit > 0 && response.length === fallbackLimit,\n };\n\n return { data: response, pagination: fallbackPagination };\n }\n\n // If response is unexpected, throw an error\n throw new Error('Unexpected search response format');\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get profile recommendations\n */\n async getProfileRecommendations(): Promise<Array<{\n id: string;\n username: string;\n name?: { first?: string; last?: string; full?: string };\n description?: string;\n _count?: { followers: number; following: number };\n [key: string]: any;\n }>> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest('GET', '/api/profiles/recommendations', undefined, { cache: true });\n }, 'getProfileRecommendations');\n }\n\n /**\n * Get user by ID\n */\n async getUserById(userId: string): Promise<User> {\n try {\n return await this.makeRequest<User>('GET', `/api/users/${userId}`, undefined, {\n cache: true,\n cacheTTL: 5 * 60 * 1000, // 5 minutes cache\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get current user\n */\n async getCurrentUser(): Promise<User> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest<User>('GET', '/api/users/me', undefined, {\n cache: true,\n cacheTTL: 1 * 60 * 1000, // 1 minute cache for current user\n });\n }, 'getCurrentUser');\n }\n\n /**\n * Update user profile\n * TanStack Query handles offline queuing automatically\n */\n async updateProfile(updates: Record<string, any>): Promise<User> {\n try {\n return await this.makeRequest<User>('PUT', '/api/users/me', updates, { cache: false });\n } catch (error) {\n const errorAny = error as any;\n const errorMessage = error instanceof Error ? error.message : String(error);\n const status = errorAny?.status || errorAny?.response?.status;\n \n // Check if it's an authentication error (401)\n const isAuthError = status === 401 || \n errorMessage.includes('Authentication required') ||\n errorMessage.includes('Invalid or missing authorization header');\n\n // If authentication error and we don't have a token, this might be an offline session\n // The caller should handle syncing the session before retrying\n if (isAuthError && !this.hasValidToken()) {\n // Re-throw with a specific message so the caller knows to sync\n throw new Error('AUTH_REQUIRED_OFFLINE_SESSION: Session needs to be synced to get a token');\n }\n\n throw this.handleError(error);\n }\n }\n\n /**\n * Get privacy settings for a user\n * @param userId - The user ID (defaults to current user)\n */\n async getPrivacySettings(userId?: string): Promise<any> {\n try {\n const id = userId || (await this.getCurrentUser()).id;\n return await this.makeRequest<any>('GET', `/api/privacy/${id}/privacy`, undefined, {\n cache: true,\n cacheTTL: 2 * 60 * 1000, // 2 minutes cache\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Update privacy settings\n * @param settings - Partial privacy settings object\n * @param userId - The user ID (defaults to current user)\n */\n async updatePrivacySettings(settings: Record<string, any>, userId?: string): Promise<any> {\n try {\n const id = userId || (await this.getCurrentUser()).id;\n return await this.makeRequest<any>('PATCH', `/api/privacy/${id}/privacy`, settings, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Request account verification\n */\n async requestAccountVerification(reason: string, evidence?: string): Promise<{ message: string; requestId: string }> {\n try {\n return await this.makeRequest<{ message: string; requestId: string }>('POST', '/api/users/verify/request', {\n reason,\n evidence,\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Download account data export\n */\n async downloadAccountData(format: 'json' | 'csv' = 'json'): Promise<Blob> {\n try {\n // Use httpService for blob responses (it handles blob responses automatically)\n const result = await this.getClient().request<Blob>({\n method: 'GET',\n url: `/api/users/me/data`,\n params: { format },\n cache: false,\n });\n \n return result;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Delete account permanently\n * @param password - User password for confirmation\n * @param confirmText - Confirmation text (usually username)\n */\n async deleteAccount(password: string, confirmText: string): Promise<{ message: string }> {\n try {\n return await this.makeRequest<{ message: string }>('DELETE', '/api/users/me', {\n password,\n confirmText,\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n\n /**\n * Follow a user\n */\n async followUser(userId: string): Promise<{ success: boolean; message: string }> {\n try {\n return await this.makeRequest('POST', `/api/users/${userId}/follow`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Unfollow a user\n */\n async unfollowUser(userId: string): Promise<{ success: boolean; message: string }> {\n try {\n return await this.makeRequest('DELETE', `/api/users/${userId}/follow`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get follow status\n */\n async getFollowStatus(userId: string): Promise<{ isFollowing: boolean }> {\n try {\n return await this.makeRequest('GET', `/api/users/${userId}/follow-status`, undefined, {\n cache: true,\n cacheTTL: 1 * 60 * 1000, // 1 minute cache\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user followers\n */\n async getUserFollowers(\n userId: string,\n pagination?: PaginationParams\n ): Promise<{ followers: User[]; total: number; hasMore: boolean }> {\n try {\n const params = buildPaginationParams(pagination || {});\n const response = await this.makeRequest<{ data: User[]; pagination: { total: number; hasMore: boolean } }>('GET', `/api/users/${userId}/followers`, params, {\n cache: true,\n cacheTTL: 2 * 60 * 1000, // 2 minutes cache\n });\n return {\n followers: response.data || [],\n total: response.pagination.total,\n hasMore: response.pagination.hasMore,\n };\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user following\n */\n async getUserFollowing(\n userId: string,\n pagination?: PaginationParams\n ): Promise<{ following: User[]; total: number; hasMore: boolean }> {\n try {\n const params = buildPaginationParams(pagination || {});\n const response = await this.makeRequest<{ data: User[]; pagination: { total: number; hasMore: boolean } }>('GET', `/api/users/${userId}/following`, params, {\n cache: true,\n cacheTTL: 2 * 60 * 1000, // 2 minutes cache\n });\n return {\n following: response.data || [],\n total: response.pagination.total,\n hasMore: response.pagination.hasMore,\n };\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get notifications\n */\n async getNotifications(): Promise<Notification[]> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest<Notification[]>('GET', '/api/notifications', undefined, {\n cache: false, // Don't cache notifications - always get fresh data\n });\n }, 'getNotifications');\n }\n\n /**\n * Get unread notification count\n */\n async getUnreadCount(): Promise<number> {\n try {\n const res = await this.makeRequest<{ count: number }>('GET', '/api/notifications/unread-count', undefined, {\n cache: false, // Don't cache unread count - always get fresh data\n });\n return res.count;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Create notification\n */\n async createNotification(data: Partial<Notification>): Promise<Notification> {\n try {\n return await this.makeRequest<Notification>('POST', '/api/notifications', data, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Mark notification as read\n */\n async markNotificationAsRead(notificationId: string): Promise<void> {\n try {\n await this.makeRequest('PUT', `/api/notifications/${notificationId}/read`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Mark all notifications as read\n */\n async markAllNotificationsAsRead(): Promise<void> {\n try {\n await this.makeRequest('PUT', '/api/notifications/read-all', undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Delete notification\n */\n async deleteNotification(notificationId: string): Promise<void> {\n try {\n await this.makeRequest('DELETE', `/api/notifications/${notificationId}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","/**\n * Privacy Methods Mixin (Blocked & Restricted Users)\n */\nimport type { BlockedUser, RestrictedUser } from '../../models/interfaces';\nimport type { OxyServicesBase } from '../OxyServices.base';\n\nexport function OxyServicesPrivacyMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n /**\n * Extract user ID from blocked/restricted user object\n */\n public extractUserId(userIdField: string | { _id: string; username?: string; avatar?: string }): string {\n return typeof userIdField === 'string' ? userIdField : userIdField._id;\n }\n\n /**\n * Check if a user is in a list (blocked or restricted)\n */\n public async isUserInList<T extends BlockedUser | RestrictedUser>(\n userId: string,\n getUserList: () => Promise<T[]>,\n getIdField: (item: T) => string | { _id: string; username?: string; avatar?: string }\n ): Promise<boolean> {\n try {\n if (!userId) {\n return false;\n }\n const users = await getUserList();\n return users.some(item => {\n const itemId = this.extractUserId(getIdField(item));\n return itemId === userId;\n });\n } catch (error) {\n // If there's an error, assume not in list to avoid breaking functionality\n if (__DEV__) {\n console.warn('Error checking user list:', error);\n }\n return false;\n }\n }\n\n // ============================================================================\n // BLOCKED USERS METHODS\n // ============================================================================\n\n /**\n * Get list of blocked users\n * @returns Array of blocked users\n */\n async getBlockedUsers(): Promise<BlockedUser[]> {\n try {\n return await this.makeRequest<BlockedUser[]>('GET', '/api/privacy/blocked', undefined, {\n cache: true,\n cacheTTL: 1 * 60 * 1000, // 1 minute cache\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Block a user\n * @param userId - The user ID to block\n * @returns Success message\n */\n async blockUser(userId: string): Promise<{ message: string }> {\n try {\n if (!userId) {\n throw new Error('User ID is required');\n }\n return await this.makeRequest<{ message: string }>('POST', `/api/privacy/blocked/${userId}`, undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Unblock a user\n * @param userId - The user ID to unblock\n * @returns Success message\n */\n async unblockUser(userId: string): Promise<{ message: string }> {\n try {\n if (!userId) {\n throw new Error('User ID is required');\n }\n return await this.makeRequest<{ message: string }>('DELETE', `/api/privacy/blocked/${userId}`, undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Check if a user is blocked\n * @param userId - The user ID to check\n * @returns True if the user is blocked, false otherwise\n */\n async isUserBlocked(userId: string): Promise<boolean> {\n return this.isUserInList(\n userId,\n () => this.getBlockedUsers(),\n (block) => block.blockedId\n );\n }\n\n // ============================================================================\n // RESTRICTED USERS METHODS\n // ============================================================================\n\n /**\n * Get list of restricted users\n * @returns Array of restricted users\n */\n async getRestrictedUsers(): Promise<RestrictedUser[]> {\n try {\n return await this.makeRequest<RestrictedUser[]>('GET', '/api/privacy/restricted', undefined, {\n cache: true,\n cacheTTL: 1 * 60 * 1000, // 1 minute cache\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Restrict a user (limit their interactions without fully blocking)\n * @param userId - The user ID to restrict\n * @returns Success message\n */\n async restrictUser(userId: string): Promise<{ message: string }> {\n try {\n if (!userId) {\n throw new Error('User ID is required');\n }\n return await this.makeRequest<{ message: string }>('POST', `/api/privacy/restricted/${userId}`, undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Unrestrict a user\n * @param userId - The user ID to unrestrict\n * @returns Success message\n */\n async unrestrictUser(userId: string): Promise<{ message: string }> {\n try {\n if (!userId) {\n throw new Error('User ID is required');\n }\n return await this.makeRequest<{ message: string }>('DELETE', `/api/privacy/restricted/${userId}`, undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Check if a user is restricted\n * @param userId - The user ID to check\n * @returns True if the user is restricted, false otherwise\n */\n async isUserRestricted(userId: string): Promise<boolean> {\n return this.isUserInList(\n userId,\n () => this.getRestrictedUsers(),\n (restrict) => restrict.restrictedId\n );\n }\n };\n}\n\n","/**\n * Language Methods Mixin\n */\nimport { normalizeLanguageCode, getLanguageMetadata, getLanguageName, getNativeLanguageName } from '../../utils/languageUtils';\nimport type { LanguageMetadata } from '../../utils/languageUtils';\nimport type { OxyServicesBase } from '../OxyServices.base';\n\nexport function OxyServicesLanguageMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n /**\n * Get appropriate storage for the platform (similar to DeviceManager)\n */\n public async getStorage(): Promise<{\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n }> {\n const isReactNative = typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n \n if (isReactNative) {\n try {\n const asyncStorageModule = await import('@react-native-async-storage/async-storage');\n const storage = (asyncStorageModule.default as unknown) as import('@react-native-async-storage/async-storage').AsyncStorageStatic;\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n };\n } catch (error) {\n console.error('AsyncStorage not available in React Native:', error);\n throw new Error('AsyncStorage is required in React Native environment');\n }\n } else {\n // Use localStorage for web\n return {\n getItem: async (key: string) => {\n if (typeof window !== 'undefined' && window.localStorage) {\n return localStorage.getItem(key);\n }\n return null;\n },\n setItem: async (key: string, value: string) => {\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem(key, value);\n }\n },\n removeItem: async (key: string) => {\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.removeItem(key);\n }\n }\n };\n }\n }\n\n /**\n * Get the current language from storage or user profile\n * @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')\n * @returns The current language code (e.g., 'en-US') or null if not set\n */\n async getCurrentLanguage(storageKeyPrefix: string = 'oxy_session'): Promise<string | null> {\n try {\n // First try to get from user profile if authenticated\n try {\n const user = await (this as any).getCurrentUser();\n const userLanguage = (user as Record<string, unknown>)?.language as string | undefined;\n if (userLanguage) {\n return normalizeLanguageCode(userLanguage) || userLanguage;\n }\n } catch (e) {\n // User not authenticated or error, continue to storage\n }\n\n // Fall back to storage\n const storage = await this.getStorage();\n const storageKey = `${storageKeyPrefix}_language`;\n const storedLanguage = await storage.getItem(storageKey);\n if (storedLanguage) {\n return normalizeLanguageCode(storedLanguage) || storedLanguage;\n }\n\n return null;\n } catch (error) {\n if (__DEV__) {\n console.warn('Failed to get current language:', error);\n }\n return null;\n }\n }\n\n /**\n * Get the current language with metadata (name, nativeName, etc.)\n * @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')\n * @returns Language metadata object or null if not set\n */\n async getCurrentLanguageMetadata(storageKeyPrefix: string = 'oxy_session'): Promise<LanguageMetadata | null> {\n const languageCode = await this.getCurrentLanguage(storageKeyPrefix);\n return getLanguageMetadata(languageCode);\n }\n\n /**\n * Get the current language name (e.g., 'English')\n * @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')\n * @returns Language name or null if not set\n */\n async getCurrentLanguageName(storageKeyPrefix: string = 'oxy_session'): Promise<string | null> {\n const languageCode = await this.getCurrentLanguage(storageKeyPrefix);\n if (!languageCode) return null;\n return getLanguageName(languageCode);\n }\n\n /**\n * Get the current native language name (e.g., 'Español')\n * @param storageKeyPrefix - Optional prefix for storage key (default: 'oxy_session')\n * @returns Native language name or null if not set\n */\n async getCurrentNativeLanguageName(storageKeyPrefix: string = 'oxy_session'): Promise<string | null> {\n const languageCode = await this.getCurrentLanguage(storageKeyPrefix);\n if (!languageCode) return null;\n return getNativeLanguageName(languageCode);\n }\n };\n}\n\n","/**\n * Payment Methods Mixin\n * \n * Provides methods for payment processing and management\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { CACHE_TIMES } from './mixinHelpers';\n\nexport function OxyServicesPaymentMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Create a payment\n * @param data - Payment data\n * @returns Created payment object\n */\n async createPayment(data: any): Promise<any> {\n try {\n return await this.makeRequest('POST', '/api/payments', data, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get payment by ID\n * @param paymentId - The payment ID\n * @returns Payment object\n */\n async getPayment(paymentId: string): Promise<any> {\n try {\n return await this.makeRequest('GET', `/api/payments/${paymentId}`, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user payments\n * @returns Array of user payments\n */\n async getUserPayments(): Promise<any[]> {\n try {\n return await this.makeRequest('GET', '/api/payments/user', undefined, {\n cache: false, // Don't cache user payments - always get fresh data\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user subscription\n * @param userId - The user ID\n * @returns Subscription object\n */\n async getSubscription(userId: string): Promise<any> {\n try {\n return await this.makeRequest('GET', `/api/subscription/${userId}`, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get current user's subscription\n * @returns Subscription object\n */\n async getCurrentUserSubscription(): Promise<any> {\n try {\n const userId = this.getCurrentUserId();\n if (!userId) {\n throw new Error('User not authenticated');\n }\n return await this.getSubscription(userId);\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user wallet\n * @param userId - The user ID\n * @returns Wallet object with balance\n */\n async getWallet(userId: string): Promise<any> {\n try {\n return await this.makeRequest('GET', `/api/wallet/${userId}`, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.SHORT, // Cache wallet for short time as balance changes frequently\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get current user's wallet\n * @returns Wallet object with balance\n */\n async getCurrentUserWallet(): Promise<any> {\n try {\n const userId = this.getCurrentUserId();\n if (!userId) {\n throw new Error('User not authenticated');\n }\n return await this.getWallet(userId);\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get wallet transaction history\n * @param userId - The user ID\n * @param options - Pagination options\n * @returns Transaction history\n */\n async getWalletTransactions(userId: string, options?: { limit?: number; offset?: number }): Promise<any> {\n try {\n const params = new URLSearchParams();\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.offset) params.append('offset', options.offset.toString());\n \n const queryString = params.toString();\n const url = `/api/wallet/transactions/${userId}${queryString ? `?${queryString}` : ''}`;\n \n return await this.makeRequest('GET', url, undefined, {\n cache: false, // Don't cache transactions - always get fresh data\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get current user's wallet transaction history\n * @param options - Pagination options\n * @returns Transaction history\n */\n async getCurrentUserWalletTransactions(options?: { limit?: number; offset?: number }): Promise<any> {\n try {\n const userId = this.getCurrentUserId();\n if (!userId) {\n throw new Error('User not authenticated');\n }\n return await this.getWalletTransactions(userId, options);\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","/**\n * Karma Methods Mixin\n * \n * Provides methods for karma system management\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { CACHE_TIMES } from './mixinHelpers';\n\nexport function OxyServicesKarmaMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n /**\n * Get user karma\n */\n async getUserKarma(userId: string): Promise<any> {\n try {\n return await this.makeRequest('GET', `/api/karma/${userId}`, undefined, {\n cache: true,\n cacheTTL: 2 * 60 * 1000, // 2 minutes cache\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Give karma to user\n */\n async giveKarma(userId: string, amount: number, reason?: string): Promise<any> {\n try {\n return await this.makeRequest('POST', `/api/karma/${userId}/give`, {\n amount,\n reason\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user karma total\n * @param userId - The user ID\n * @returns User karma total\n */\n async getUserKarmaTotal(userId: string): Promise<any> {\n try {\n return await this.makeRequest('GET', `/api/karma/${userId}/total`, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get user karma history\n * @param userId - The user ID\n * @param limit - Optional limit for results\n * @param offset - Optional offset for pagination\n * @returns User karma history\n */\n async getUserKarmaHistory(userId: string, limit?: number, offset?: number): Promise<any> {\n try {\n const params: any = {};\n if (limit) params.limit = limit;\n if (offset) params.offset = offset;\n \n return await this.makeRequest('GET', `/api/karma/${userId}/history`, params, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get karma leaderboard\n * @returns Karma leaderboard\n */\n async getKarmaLeaderboard(): Promise<any> {\n try {\n return await this.makeRequest('GET', '/api/karma/leaderboard', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get karma rules\n * @returns Karma rules\n */\n async getKarmaRules(): Promise<any> {\n try {\n return await this.makeRequest('GET', '/api/karma/rules', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.EXTRA_LONG, // Rules don't change often\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","import type { AccountStorageUsageResponse, AssetUrlResponse, AssetVariant } from '../../models/interfaces';\nimport type { OxyServicesBase } from '../OxyServices.base';\n\nexport function OxyServicesAssetsMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Delete file\n */\n async deleteFile(fileId: string): Promise<any> {\n try {\n return await this.makeRequest('DELETE', `/api/assets/${encodeURIComponent(fileId)}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get file download URL (synchronous - uses stream endpoint for images to avoid ORB blocking)\n */\n getFileDownloadUrl(fileId: string, variant?: string, expiresIn?: number): string {\n const base = this.getBaseURL();\n const params = new URLSearchParams();\n if (variant) params.set('variant', variant);\n if (expiresIn) params.set('expiresIn', String(expiresIn));\n params.set('fallback', 'placeholderVisible');\n const token = this.getClient().getAccessToken();\n if (token) params.set('token', token);\n\n const qs = params.toString();\n return `${base}/api/assets/${encodeURIComponent(fileId)}/stream${qs ? `?${qs}` : ''}`;\n }\n\n /**\n * Get file download URL asynchronously (returns signed URL directly from CDN)\n */\n async getFileDownloadUrlAsync(fileId: string, variant?: string, expiresIn?: number): Promise<string> {\n try {\n const url = await this.fetchAssetDownloadUrl(\n fileId,\n variant,\n this.getAssetUrlCacheTTL(expiresIn),\n expiresIn\n );\n\n return url || this.getFileDownloadUrl(fileId, variant, expiresIn);\n } catch (error) {\n return this.getFileDownloadUrl(fileId, variant, expiresIn);\n }\n }\n\n /**\n * List user files\n */\n async listUserFiles(limit?: number, offset?: number): Promise<{ files: any[]; total: number; hasMore: boolean }> {\n try {\n const paramsObj: any = {};\n if (limit) paramsObj.limit = limit;\n if (offset) paramsObj.offset = offset;\n return await this.makeRequest('GET', '/api/assets', paramsObj, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get account storage usage (server-side usage aggregated from assets)\n */\n async getAccountStorageUsage(): Promise<AccountStorageUsageResponse> {\n try {\n return await this.makeRequest<AccountStorageUsageResponse>('GET', '/api/storage/usage', undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get file content as text\n */\n async getFileContentAsText(fileId: string, variant?: string): Promise<string> {\n try {\n const downloadUrl = await this.fetchAssetDownloadUrl(\n fileId,\n variant,\n this.getAssetUrlCacheTTL()\n );\n\n if (!downloadUrl) {\n throw new Error('No download URL returned for asset');\n }\n\n return await this.fetchAssetContent(downloadUrl, 'text');\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get file content as blob\n */\n async getFileContentAsBlob(fileId: string, variant?: string): Promise<Blob> {\n try {\n const downloadUrl = await this.fetchAssetDownloadUrl(\n fileId,\n variant,\n this.getAssetUrlCacheTTL()\n );\n\n if (!downloadUrl) {\n throw new Error('No download URL returned for asset');\n }\n\n return await this.fetchAssetContent(downloadUrl, 'blob');\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get batch access to multiple files\n */\n async getBatchFileAccess(fileIds: string[], context?: string): Promise<Record<string, any>> {\n try {\n return await this.makeRequest('POST', '/api/assets/batch-access', { \n fileIds, \n context \n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get download URLs for multiple files efficiently\n */\n async getFileDownloadUrls(fileIds: string[], context?: string): Promise<Record<string, string>> {\n const response: any = await this.getBatchFileAccess(fileIds, context);\n const urls: Record<string, string> = {};\n const results = response.results || {};\n for (const [id, result] of Object.entries(results as Record<string, any>)) {\n if (result.allowed && result.url) {\n urls[id] = result.url;\n }\n }\n return urls;\n }\n\n /**\n * Upload raw file data\n */\n async uploadRawFile(file: File | Blob, visibility?: 'private' | 'public' | 'unlisted', metadata?: Record<string, any>): Promise<any> {\n return this.assetUpload(file as File, visibility, metadata);\n }\n\n /**\n * Upload file using Central Asset Service\n */\n async assetUpload(file: File, visibility?: 'private' | 'public' | 'unlisted', metadata?: Record<string, any>, onProgress?: (progress: number) => void): Promise<any> {\n const fileName = file.name || 'unknown';\n const fileSize = file.size;\n \n try {\n const formData = new FormData();\n // Convert File to Blob to avoid read-only 'name' property error in Expo 54\n // This is a known issue in Expo SDK 52+ where FormData tries to set the read-only 'name' property\n let fileBlob: Blob;\n if (file instanceof Blob) {\n // Already a Blob, use directly\n fileBlob = file;\n } else if (typeof (file as any).blob === 'function') {\n // Use async blob() method if available (Expo 54+ recommended approach)\n fileBlob = await (file as any).blob();\n } else {\n // Fallback: create Blob from File (works in all environments)\n fileBlob = new Blob([file], { type: (file as any).type || 'application/octet-stream' });\n }\n formData.append('file', fileBlob, fileName);\n if (visibility) {\n formData.append('visibility', visibility);\n }\n if (metadata) {\n formData.append('metadata', JSON.stringify(metadata));\n }\n\n const response = await this.getClient().request<{ file: any }>({\n method: 'POST',\n url: '/api/assets/upload',\n data: formData,\n cache: false,\n });\n\n if (onProgress && response) {\n onProgress(100);\n }\n\n return response;\n } catch (error) {\n console.error('File upload error:', error);\n \n let errorMessage = 'File upload failed';\n \n if (error instanceof Error) {\n errorMessage = error.message || errorMessage;\n } else if (error && typeof error === 'object') {\n if ('message' in error) {\n errorMessage = String((error as any).message) || errorMessage;\n } else if ('error' in error && typeof (error as any).error === 'string') {\n errorMessage = (error as any).error;\n } else if ('data' in error && (error as any).data?.message) {\n errorMessage = String((error as any).data.message);\n }\n } else if (error) {\n errorMessage = String(error) || errorMessage;\n }\n \n const contextError = error as Error & { fileContext?: Record<string, unknown> };\n if (!contextError.fileContext) {\n contextError.fileContext = {\n fileName,\n fileSize,\n };\n }\n \n if (error instanceof Error && error.message) {\n const handledError = this.handleError(contextError);\n if (!handledError.message || handledError.message.trim() === 'An unexpected error occurred') {\n handledError.message = errorMessage;\n }\n throw handledError;\n }\n \n const newError = new Error(errorMessage);\n (newError as any).fileContext = contextError.fileContext;\n throw this.handleError(newError);\n }\n }\n\n /**\n * Link asset to an entity\n */\n async assetLink(fileId: string, app: string, entityType: string, entityId: string, visibility?: 'private' | 'public' | 'unlisted', webhookUrl?: string): Promise<any> {\n try {\n const body: any = { app, entityType, entityId };\n if (visibility) body.visibility = visibility;\n if (webhookUrl) body.webhookUrl = webhookUrl;\n return await this.makeRequest('POST', `/api/assets/${fileId}/links`, body, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Unlink asset from an entity\n */\n async assetUnlink(fileId: string, app: string, entityType: string, entityId: string): Promise<any> {\n try {\n return await this.makeRequest('DELETE', `/api/assets/${fileId}/links`, {\n app,\n entityType,\n entityId\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get asset metadata\n */\n async assetGet(fileId: string): Promise<any> {\n try {\n return await this.makeRequest('GET', `/api/assets/${fileId}`, undefined, {\n cache: true,\n cacheTTL: 5 * 60 * 1000,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get asset URL (CDN or signed URL)\n */\n async assetGetUrl(fileId: string, variant?: string, expiresIn?: number): Promise<AssetUrlResponse> {\n try {\n const params: any = {};\n if (variant) params.variant = variant;\n if (expiresIn) params.expiresIn = expiresIn;\n \n return await this.makeRequest<AssetUrlResponse>('GET', `/api/assets/${fileId}/url`, params, {\n cache: true,\n cacheTTL: 10 * 60 * 1000,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Restore asset from trash\n */\n async assetRestore(fileId: string): Promise<any> {\n try {\n return await this.makeRequest('POST', `/api/assets/${fileId}/restore`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Delete asset with optional force\n */\n async assetDelete(fileId: string, force: boolean = false): Promise<any> {\n try {\n const params: any = force ? { force: 'true' } : undefined;\n return await this.makeRequest('DELETE', `/api/assets/${fileId}`, params, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get list of available variants for an asset\n */\n async assetGetVariants(fileId: string): Promise<AssetVariant[]> {\n try {\n const assetData = await this.assetGet(fileId);\n return assetData.file?.variants || [];\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Update asset visibility\n */\n async assetUpdateVisibility(fileId: string, visibility: 'private' | 'public' | 'unlisted'): Promise<any> {\n try {\n return await this.makeRequest('PATCH', `/api/assets/${fileId}/visibility`, {\n visibility\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n async uploadAvatar(file: File, userId: string, app: string = 'profiles'): Promise<any> {\n try {\n const asset = await this.assetUpload(file, 'public');\n await this.assetLink(asset.file.id, app, 'avatar', userId, 'public');\n return asset;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n async uploadProfileBanner(file: File, userId: string, app: string = 'profiles'): Promise<any> {\n try {\n const asset = await this.assetUpload(file, 'public');\n await this.assetLink(asset.file.id, app, 'profile-banner', userId, 'public');\n return asset;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n public getAssetUrlCacheTTL(expiresIn?: number) {\n const desiredTtlMs = (expiresIn ?? 3600) * 1000;\n return Math.min(desiredTtlMs, 10 * 60 * 1000);\n }\n\n public async fetchAssetDownloadUrl(\n fileId: string,\n variant?: string,\n cacheTTL?: number,\n expiresIn?: number\n ): Promise<string | null> {\n const params: any = {};\n if (variant) params.variant = variant;\n if (expiresIn) params.expiresIn = expiresIn;\n\n const urlRes = await this.makeRequest<{ url: string }>(\n 'GET',\n `/api/assets/${encodeURIComponent(fileId)}/url`,\n Object.keys(params).length ? params : undefined,\n {\n cache: true,\n cacheTTL: cacheTTL ?? 10 * 60 * 1000,\n }\n );\n\n return urlRes?.url || null;\n }\n\n public async fetchAssetContent(url: string, type: 'text'): Promise<string>;\n public async fetchAssetContent(url: string, type: 'blob'): Promise<Blob>;\n public async fetchAssetContent(url: string, type: 'text' | 'blob') {\n const response = await fetch(url, { credentials: 'include' });\n if (!response?.ok) {\n throw new Error(`Failed to fetch asset content (status ${response?.status})`);\n }\n return type === 'text' ? response.text() : response.blob();\n }\n };\n}\n","/**\n * Developer API Methods Mixin\n * \n * Provides methods for managing developer applications and API keys\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { CACHE_TIMES } from './mixinHelpers';\n\nexport function OxyServicesDeveloperMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Get developer apps for the current user\n * @returns Array of developer apps\n */\n async getDeveloperApps(): Promise<any[]> {\n try {\n const res = await this.makeRequest<{ apps?: any[] }>('GET', '/api/developer/apps', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n return res.apps || [];\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Create a new developer app\n * @param data - Developer app configuration\n * @returns Created developer app\n */\n async createDeveloperApp(data: {\n name: string;\n description?: string;\n webhookUrl: string;\n devWebhookUrl?: string;\n scopes?: string[];\n }): Promise<any> {\n try {\n const res = await this.makeRequest<{ app: any }>('POST', '/api/developer/apps', data, { cache: false });\n return res.app;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get a specific developer app\n */\n async getDeveloperApp(appId: string): Promise<any> {\n try {\n const res = await this.makeRequest<{ app: any }>('GET', `/api/developer/apps/${appId}`, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n return res.app;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Update a developer app\n * @param appId - The developer app ID\n * @param data - Updated app configuration\n * @returns Updated developer app\n */\n async updateDeveloperApp(appId: string, data: {\n name?: string;\n description?: string;\n webhookUrl?: string;\n devWebhookUrl?: string;\n scopes?: string[];\n }): Promise<any> {\n try {\n const res = await this.makeRequest<{ app: any }>('PATCH', `/api/developer/apps/${appId}`, data, { cache: false });\n return res.app;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Regenerate API secret for a developer app\n * @param appId - The developer app ID\n * @returns App with new secret\n */\n async regenerateDeveloperAppSecret(appId: string): Promise<any> {\n try {\n return await this.makeRequest('POST', `/api/developer/apps/${appId}/regenerate-secret`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Delete a developer app\n * @param appId - The developer app ID\n * @returns Deletion result\n */\n async deleteDeveloperApp(appId: string): Promise<any> {\n try {\n return await this.makeRequest('DELETE', `/api/developer/apps/${appId}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","/**\n * Location Methods Mixin\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\n\nexport function OxyServicesLocationMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Update user location\n * @param latitude - Latitude coordinate\n * @param longitude - Longitude coordinate\n * @returns Location update result\n */\n async updateLocation(latitude: number, longitude: number): Promise<any> {\n try {\n return await this.makeRequest('POST', '/api/location', {\n latitude,\n longitude\n }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get nearby users\n * @param radius - Optional search radius in meters\n * @returns Array of nearby users\n */\n async getNearbyUsers(radius?: number): Promise<any[]> {\n try {\n const params: any = radius ? { radius } : undefined;\n return await this.makeRequest('GET', '/api/location/nearby', params, {\n cache: false, // Don't cache location data - always get fresh data\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","/**\n * Analytics Methods Mixin\n * \n * Provides methods for analytics tracking and data retrieval\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { CACHE_TIMES } from './mixinHelpers';\n\nexport function OxyServicesAnalyticsMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Track an analytics event\n * @param eventName - Name of the event to track\n * @param properties - Optional event properties\n */\n async trackEvent(eventName: string, properties?: Record<string, any>): Promise<void> {\n try {\n await this.makeRequest('POST', '/api/analytics/events', {\n event: eventName,\n properties\n }, { cache: false, retry: false }); // Don't retry analytics events\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get analytics data for a date range\n * @param startDate - Optional start date (ISO string)\n * @param endDate - Optional end date (ISO string)\n * @returns Analytics data\n */\n async getAnalytics(startDate?: string, endDate?: string): Promise<any> {\n try {\n const params: any = {};\n if (startDate) params.startDate = startDate;\n if (endDate) params.endDate = endDate;\n \n return await this.makeRequest('GET', '/api/analytics', params, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","/**\n * Device Methods Mixin\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\n\nexport function OxyServicesDevicesMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Register a new device\n * @param deviceData - Device information\n * @returns Registered device object\n */\n async registerDevice(deviceData: any): Promise<any> {\n try {\n return await this.makeRequest('POST', '/api/devices', deviceData, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get all devices for the current user\n * @returns Array of user devices\n */\n async getUserDevices(): Promise<any[]> {\n try {\n return await this.makeRequest('GET', '/api/devices', undefined, {\n cache: false, // Don't cache device list - always get fresh data\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Remove a device\n * @param deviceId - The device ID to remove\n */\n async removeDevice(deviceId: string): Promise<void> {\n try {\n await this.makeRequest('DELETE', `/api/devices/${deviceId}`, undefined, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get device sessions for a given session ID\n * Note: Not cached by default to ensure fresh data\n * @param sessionId - The session ID\n * @returns Array of device sessions\n */\n async getDeviceSessions(sessionId: string): Promise<any[]> {\n try {\n // Use makeRequest for consistent error handling and optional caching\n // Cache disabled by default to ensure fresh session data\n return await this.makeRequest<any[]>('GET', `/api/session/device/sessions/${sessionId}`, undefined, {\n cache: false, // Don't cache sessions - always get fresh data\n deduplicate: true, // Deduplicate concurrent requests for same sessionId\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Logout all device sessions\n * @param sessionId - The session ID\n * @param deviceId - Optional device ID to target\n * @param excludeCurrent - Whether to exclude the current session\n * @returns Logout result\n */\n async logoutAllDeviceSessions(sessionId: string, deviceId?: string, excludeCurrent?: boolean): Promise<any> {\n try {\n const urlParams: any = {};\n if (deviceId) urlParams.deviceId = deviceId;\n if (excludeCurrent) urlParams.excludeCurrent = 'true';\n return await this.makeRequest('POST', `/api/session/device/logout-all/${sessionId}`, urlParams, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Update device name\n * @param sessionId - The session ID\n * @param deviceName - New device name\n * @returns Updated device object\n */\n async updateDeviceName(sessionId: string, deviceName: string): Promise<any> {\n try {\n return await this.makeRequest('PUT', `/api/session/device/name/${sessionId}`, { deviceName }, { cache: false });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get security information\n * @returns Security information object\n */\n async getSecurityInfo(): Promise<{\n recoveryEmail: string | null;\n }> {\n try {\n return await this.makeRequest('GET', '/api/devices/security', undefined, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n };\n}\n\n","/**\n * Security Methods Mixin\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport type { SecurityActivity, SecurityActivityResponse, SecurityEventType } from '../../models/interfaces';\n\nexport function OxyServicesSecurityMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n /**\n * Get user's security activity with pagination\n * @param limit - Number of results (default: 50, max: 100)\n * @param offset - Pagination offset (default: 0)\n * @param eventType - Optional filter by event type\n * @returns Security activity response with pagination\n */\n async getSecurityActivity(\n limit?: number,\n offset?: number,\n eventType?: SecurityEventType\n ): Promise<SecurityActivityResponse> {\n try {\n const params: any = {};\n if (limit !== undefined) params.limit = limit;\n if (offset !== undefined) params.offset = offset;\n if (eventType) params.eventType = eventType;\n\n const response = await this.makeRequest<SecurityActivityResponse>(\n 'GET',\n '/api/security/activity',\n params,\n { cache: false }\n );\n\n return response;\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get recent security activity (convenience method)\n * @param limit - Number of recent events to fetch (default: 10)\n * @returns Array of recent security activities\n */\n async getRecentSecurityActivity(limit: number = 10): Promise<SecurityActivity[]> {\n try {\n const response = await this.getSecurityActivity(limit, 0);\n return response.data || [];\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Log private key exported event\n * @param deviceId - Optional device ID for tracking\n * @returns Promise that resolves when event is logged\n */\n async logPrivateKeyExported(deviceId?: string): Promise<void> {\n try {\n await this.makeRequest<{ success: boolean }>(\n 'POST',\n '/api/security/activity/private-key-exported',\n { deviceId },\n { cache: false }\n );\n } catch (error) {\n // Don't throw - logging failures shouldn't break user flow\n // But log for monitoring\n if (__DEV__) {\n console.warn('[OxyServices] Failed to log private key exported event:', error);\n }\n }\n }\n\n /**\n * Log backup created event\n * @param deviceId - Optional device ID for tracking\n * @returns Promise that resolves when event is logged\n */\n async logBackupCreated(deviceId?: string): Promise<void> {\n try {\n await this.makeRequest<{ success: boolean }>(\n 'POST',\n '/api/security/activity/backup-created',\n { deviceId },\n { cache: false }\n );\n } catch (error) {\n // Don't throw - logging failures shouldn't break user flow\n // But log for monitoring\n if (__DEV__) {\n console.warn('[OxyServices] Failed to log backup created event:', error);\n }\n }\n }\n };\n}\n\n","/**\n * Features Methods Mixin\n *\n * Provides methods for various features:\n * - Feedback submission\n * - Subscription plans\n * - Saves/Collections\n * - User history\n * - FAQ\n * - User stats\n * - Achievements\n */\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { CACHE_TIMES } from './mixinHelpers';\n\n// Types\nexport interface FeedbackPayload {\n type: 'bug' | 'feature' | 'general' | 'support';\n title: string;\n description: string;\n priority: 'low' | 'medium' | 'high' | 'critical';\n category: string;\n contactEmail?: string;\n systemInfo?: {\n platform: string;\n version: string;\n appVersion: string;\n userId?: string;\n username?: string;\n timestamp: string;\n };\n}\n\nexport interface FeedbackResult {\n id: string;\n status: string;\n createdAt: string;\n}\n\nexport interface SubscriptionPlan {\n id: string;\n name: string;\n description: string;\n price: number;\n currency: string;\n interval: 'month' | 'year';\n features: string[];\n}\n\nexport interface SubscriptionResult {\n subscriptionId: string;\n status: string;\n currentPeriodEnd: string;\n}\n\nexport interface SavedItem {\n id: string;\n itemId: string;\n itemType: string;\n title: string;\n createdAt: string;\n}\n\nexport interface Collection {\n id: string;\n name: string;\n description?: string;\n itemCount: number;\n createdAt: string;\n}\n\nexport interface UserStats {\n postCount: number;\n commentCount: number;\n followerCount: number;\n followingCount: number;\n karmaScore?: number;\n}\n\nexport interface HistoryItem {\n id: string;\n type: string;\n title: string;\n timestamp: string;\n metadata?: Record<string, any>;\n}\n\nexport interface FAQ {\n id: string;\n question: string;\n answer: string;\n category: string;\n}\n\nexport interface Achievement {\n id: string;\n name: string;\n description: string;\n icon: string;\n unlockedAt?: string;\n}\n\nexport function OxyServicesFeaturesMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n\n // ==================\n // FEEDBACK METHODS\n // ==================\n\n /**\n * Submit user feedback\n */\n async submitFeedback(payload: FeedbackPayload): Promise<FeedbackResult> {\n try {\n return await this.makeRequest<FeedbackResult>('POST', '/api/feedback', payload, {\n cache: false,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n // ==================\n // SUBSCRIPTION METHODS\n // ==================\n\n /**\n * Get available subscription plans\n */\n async getSubscriptionPlans(): Promise<SubscriptionPlan[]> {\n try {\n return await this.makeRequest<SubscriptionPlan[]>('GET', '/api/subscriptions/plans', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Get individual purchasable features\n */\n async getIndividualFeatures(): Promise<any[]> {\n try {\n return await this.makeRequest<any[]>('GET', '/api/subscriptions/features', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Subscribe to a plan\n */\n async subscribe(planId: string, paymentMethodId?: string): Promise<SubscriptionResult> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest<SubscriptionResult>('POST', '/api/subscriptions/subscribe', {\n planId,\n paymentMethodId,\n }, { cache: false });\n }, 'subscribe');\n }\n\n /**\n * Subscribe to an individual feature\n */\n async subscribeToFeature(featureId: string, paymentMethodId?: string): Promise<SubscriptionResult> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest<SubscriptionResult>('POST', '/api/subscriptions/features/subscribe', {\n featureId,\n paymentMethodId,\n }, { cache: false });\n }, 'subscribeToFeature');\n }\n\n /**\n * Cancel subscription\n */\n async cancelSubscription(subscriptionId: string): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('POST', `/api/subscriptions/${subscriptionId}/cancel`, undefined, {\n cache: false,\n });\n }, 'cancelSubscription');\n }\n\n /**\n * Reactivate subscription\n */\n async reactivateSubscription(subscriptionId: string): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('POST', `/api/subscriptions/${subscriptionId}/reactivate`, undefined, {\n cache: false,\n });\n }, 'reactivateSubscription');\n }\n\n /**\n * Get current user's subscription\n */\n async getCurrentSubscription(): Promise<SubscriptionResult | null> {\n return this.withAuthRetry(async () => {\n try {\n return await this.makeRequest<SubscriptionResult>('GET', '/api/subscriptions/current', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.SHORT,\n });\n } catch (error: any) {\n if (error.status === 404) return null;\n throw error;\n }\n }, 'getCurrentSubscription');\n }\n\n // ==================\n // SAVES/COLLECTIONS\n // ==================\n\n /**\n * Get user's saved items\n */\n async getSavedItems(userId?: string): Promise<SavedItem[]> {\n return this.withAuthRetry(async () => {\n const endpoint = userId ? `/api/users/${userId}/saves` : '/api/saves';\n return await this.makeRequest<SavedItem[]>('GET', endpoint, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.SHORT,\n });\n }, 'getSavedItems');\n }\n\n /**\n * Get user's collections\n */\n async getCollections(userId?: string): Promise<Collection[]> {\n return this.withAuthRetry(async () => {\n const endpoint = userId ? `/api/users/${userId}/collections` : '/api/collections';\n return await this.makeRequest<Collection[]>('GET', endpoint, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.SHORT,\n });\n }, 'getCollections');\n }\n\n /**\n * Save an item\n */\n async saveItem(itemId: string, itemType: string, collectionId?: string): Promise<SavedItem> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest<SavedItem>('POST', '/api/saves', {\n itemId,\n itemType,\n collectionId,\n }, { cache: false });\n }, 'saveItem');\n }\n\n /**\n * Remove an item from saves\n */\n async removeSavedItem(saveId: string): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('DELETE', `/api/saves/${saveId}`, undefined, { cache: false });\n }, 'removeSavedItem');\n }\n\n /**\n * Create a collection\n */\n async createCollection(name: string, description?: string): Promise<Collection> {\n return this.withAuthRetry(async () => {\n return await this.makeRequest<Collection>('POST', '/api/collections', {\n name,\n description,\n }, { cache: false });\n }, 'createCollection');\n }\n\n /**\n * Delete a collection\n */\n async deleteCollection(collectionId: string): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('DELETE', `/api/collections/${collectionId}`, undefined, { cache: false });\n }, 'deleteCollection');\n }\n\n // ==================\n // USER STATS\n // ==================\n\n /**\n * Get user statistics\n */\n async getUserStats(userId: string): Promise<UserStats> {\n try {\n return await this.makeRequest<UserStats>('GET', `/api/users/${userId}/stats`, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n // ==================\n // HISTORY\n // ==================\n\n /**\n * Get user history\n */\n async getUserHistory(userId?: string, limit?: number, offset?: number): Promise<HistoryItem[]> {\n return this.withAuthRetry(async () => {\n const params: any = {};\n if (limit) params.limit = limit;\n if (offset) params.offset = offset;\n\n const endpoint = userId ? `/api/users/${userId}/history` : '/api/history';\n return await this.makeRequest<HistoryItem[]>('GET', endpoint, params, {\n cache: true,\n cacheTTL: CACHE_TIMES.SHORT,\n });\n }, 'getUserHistory');\n }\n\n /**\n * Clear user history\n */\n async clearUserHistory(): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('DELETE', '/api/history', undefined, { cache: false });\n }, 'clearUserHistory');\n }\n\n /**\n * Delete a history item\n */\n async deleteHistoryItem(itemId: string): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('DELETE', `/api/history/${itemId}`, undefined, { cache: false });\n }, 'deleteHistoryItem');\n }\n\n // ==================\n // FAQ\n // ==================\n\n /**\n * Get FAQs\n */\n async getFAQs(category?: string): Promise<FAQ[]> {\n try {\n const params = category ? { category } : undefined;\n return await this.makeRequest<FAQ[]>('GET', '/api/faqs', params, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Search FAQs\n */\n async searchFAQs(query: string): Promise<FAQ[]> {\n try {\n return await this.makeRequest<FAQ[]>('GET', '/api/faqs/search', { query }, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n // ==================\n // ACHIEVEMENTS\n // ==================\n\n /**\n * Get user achievements\n */\n async getUserAchievements(userId?: string): Promise<Achievement[]> {\n return this.withAuthRetry(async () => {\n const endpoint = userId ? `/api/users/${userId}/achievements` : '/api/achievements';\n return await this.makeRequest<Achievement[]>('GET', endpoint, undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.MEDIUM,\n });\n }, 'getUserAchievements');\n }\n\n /**\n * Get all available achievements\n */\n async getAllAchievements(): Promise<Achievement[]> {\n try {\n return await this.makeRequest<Achievement[]>('GET', '/api/achievements/all', undefined, {\n cache: true,\n cacheTTL: CACHE_TIMES.LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n // ==================\n // ACCOUNT\n // ==================\n\n /**\n * Delete user account (requires password confirmation)\n */\n async deleteAccount(password: string): Promise<void> {\n return this.withAuthRetry(async () => {\n await this.makeRequest('DELETE', '/api/account', { password }, { cache: false });\n }, 'deleteAccount');\n }\n };\n}\n","/**\n * Utility Methods Mixin\n * \n * Provides utility methods including link metadata fetching\n * and Express.js authentication middleware\n */\nimport { jwtDecode } from 'jwt-decode';\nimport type { ApiError, User } from '../../models/interfaces';\nimport type { OxyServicesBase } from '../OxyServices.base';\nimport { CACHE_TIMES } from './mixinHelpers';\n\ninterface JwtPayload {\n exp?: number;\n userId?: string;\n id?: string;\n sessionId?: string;\n [key: string]: any;\n}\n\nexport function OxyServicesUtilityMixin<T extends typeof OxyServicesBase>(Base: T) {\n return class extends Base {\n constructor(...args: any[]) {\n super(...(args as [any]));\n }\n /**\n * Fetch link metadata\n */\n async fetchLinkMetadata(url: string): Promise<{\n url: string;\n title: string;\n description: string;\n image?: string;\n }> {\n try {\n return await this.makeRequest<{\n url: string;\n title: string;\n description: string;\n image?: string;\n }>('GET', '/api/link-metadata', { url }, {\n cache: true,\n cacheTTL: CACHE_TIMES.EXTRA_LONG,\n });\n } catch (error) {\n throw this.handleError(error);\n }\n }\n\n /**\n * Simple Express.js authentication middleware\n * \n * Built-in authentication middleware that validates JWT tokens and adds user data to requests.\n * \n * @example\n * ```typescript\n * // Basic usage - just add it to your routes\n * app.use('/api/protected', oxyServices.auth());\n * \n * // With debug logging\n * app.use('/api/protected', oxyServices.auth({ debug: true }));\n * \n * // With custom error handling\n * app.use('/api/protected', oxyServices.auth({\n * onError: (error) => console.error('Auth failed:', error)\n * }));\n * \n * // Load full user data\n * app.use('/api/protected', oxyServices.auth({ loadUser: true }));\n * ```\n * \n * @param options Optional configuration\n * @param options.debug Enable debug logging (default: false)\n * @param options.onError Custom error handler\n * @param options.loadUser Load full user data (default: false for performance)\n * @param options.session Use session-based validation (default: false)\n * @returns Express middleware function\n */\n auth(options: {\n debug?: boolean;\n onError?: (error: ApiError) => any;\n loadUser?: boolean;\n session?: boolean;\n } = {}) {\n const { debug = false, onError, loadUser = false, session = false } = options;\n \n // Return a synchronous middleware function\n return (req: any, res: any, next: any) => {\n try {\n // Extract token from Authorization header\n const authHeader = req.headers['authorization'];\n const token = authHeader?.startsWith('Bearer ') ? authHeader.substring(7) : null;\n \n if (debug) {\n console.log(`🔐 Auth: Processing ${req.method} ${req.path}`);\n console.log(`🔐 Auth: Token present: ${!!token}`);\n }\n \n if (!token) {\n const error = {\n message: 'Access token required',\n code: 'MISSING_TOKEN',\n status: 401\n };\n \n if (debug) console.log(`❌ Auth: Missing token`);\n \n if (onError) return onError(error);\n return res.status(401).json(error);\n }\n \n // Decode and validate token\n let decoded: JwtPayload;\n try {\n decoded = jwtDecode<JwtPayload>(token);\n \n if (debug) {\n console.log(`🔐 Auth: Token decoded, User ID: ${decoded.userId || decoded.id}`);\n }\n } catch (decodeError) {\n const error = {\n message: 'Invalid token format',\n code: 'INVALID_TOKEN_FORMAT',\n status: 403\n };\n \n if (debug) console.log(`❌ Auth: Token decode failed`);\n \n if (onError) return onError(error);\n return res.status(403).json(error);\n }\n \n const userId = decoded.userId || decoded.id;\n if (!userId) {\n const error = {\n message: 'Token missing user ID',\n code: 'INVALID_TOKEN_PAYLOAD',\n status: 403\n };\n \n if (debug) console.log(`❌ Auth: Token missing user ID`);\n \n if (onError) return onError(error);\n return res.status(403).json(error);\n }\n \n // Check token expiration\n if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1000)) {\n const error = {\n message: 'Token expired',\n code: 'TOKEN_EXPIRED',\n status: 403\n };\n \n if (debug) console.log(`❌ Auth: Token expired`);\n \n if (onError) return onError(error);\n return res.status(403).json(error);\n }\n \n // For now, skip session validation to keep it simple\n // Session validation can be added later if needed\n \n // Set request properties immediately\n req.userId = userId;\n req.accessToken = token;\n req.user = { id: userId } as User;\n \n // Automatically authenticate the OxyServices instance so all subsequent API calls are authenticated\n this.setTokens(token);\n \n if (debug) {\n console.log(`✅ Auth: Authentication successful for user ${userId}`);\n }\n \n next();\n } catch (error) {\n const apiError = this.handleError(error) as any;\n \n if (debug) {\n // Debug logging - using console.log is acceptable here for development\n console.log(`❌ Auth: Unexpected error:`, apiError);\n }\n \n if (onError) return onError(apiError);\n return res.status((apiError && apiError.status) || 500).json(apiError);\n }\n };\n }\n };\n}\n\n","/**\n * OxyServices - Unified client for Oxy API and Oxy Cloud\n *\n * # Usage Examples\n *\n * ## Browser (ESM/TypeScript)\n *\n * ```typescript\n * import { OxyServices } from './core/OxyServices';\n *\n * const oxy = new OxyServices({\n * baseURL: 'https://api.oxy.so',\n * cloudURL: 'https://cloud.oxy.so',\n * });\n *\n * // Authenticate and fetch user\n * await oxy.setTokens('ACCESS_TOKEN');\n * const user = await oxy.getCurrentUser();\n *\n * // Upload a file (browser File API)\n * const fileInput = document.querySelector('input[type=file]');\n * const file = fileInput.files[0];\n * await oxy.uploadRawFile(file);\n *\n * // Get a file download URL for <img src>\n * const url = oxy.getFileDownloadUrl('fileId', 'thumb');\n * ```\n *\n * ## Node.js (CommonJS/TypeScript)\n *\n * ```typescript\n * import { OxyServices } from './core/OxyServices';\n * import fs from 'fs';\n *\n * const oxy = new OxyServices({\n * baseURL: 'https://api.oxy.so',\n * cloudURL: 'https://cloud.oxy.so',\n * });\n *\n * // Authenticate and fetch user\n * await oxy.setTokens('ACCESS_TOKEN');\n * const user = await oxy.getCurrentUser();\n *\n * // Upload a file (Node.js Buffer)\n * const buffer = fs.readFileSync('myfile.png');\n * const blob = new Blob([buffer]);\n * await oxy.uploadRawFile(blob, { filename: 'myfile.png' });\n *\n * // Get a file download URL\n * const url = oxy.getFileDownloadUrl('fileId');\n * ```\n *\n * ## Configuration\n * - `baseURL`: Oxy API endpoint (e.g., https://api.oxy.so)\n * - `cloudURL`: Oxy Cloud/CDN endpoint (e.g., https://cloud.oxy.so)\n *\n * See method JSDoc for more details and options.\n */\nimport { OxyServicesBase, type OxyConfig } from './OxyServices.base';\nimport { OxyAuthenticationError, OxyAuthenticationTimeoutError } from './OxyServices.errors';\n\n// Import mixin composition helper\nimport { composeOxyServices } from './mixins';\n\n/**\n * OxyServices - Unified client library for interacting with the Oxy API\n * \n * This class provides all API functionality in one simple, easy-to-use interface.\n * \n * ## Architecture\n * - **HttpService**: Unified HTTP service handling authentication, caching, deduplication, queuing, and retry\n * - **OxyServices**: Provides high-level API methods\n * \n * ## Mixin Composition\n * The class is composed using TypeScript mixins for better code organization:\n * - **Base**: Core infrastructure (HTTP client, request management, error handling)\n * - **Auth**: Authentication and session management\n * - **User**: User profiles, follow, notifications\n * - **Privacy**: Blocked and restricted users\n * - **Language**: Language detection and metadata\n * - **Payment**: Payment processing\n * - **Karma**: Karma system\n * - **Assets**: File upload and asset management\n * - **Developer**: Developer API management\n * - **Location**: Location-based features\n * - **Analytics**: Analytics tracking\n * - **Devices**: Device management\n * - **Utility**: Utility methods and Express middleware\n * \n * @example\n * ```typescript\n * const oxy = new OxyServices({\n * baseURL: 'https://api.oxy.so',\n * cloudURL: 'https://cloud.oxy.so'\n * });\n * ```\n */\n// Compose all mixins into the final OxyServices class\nconst OxyServicesComposed = composeOxyServices();\n\n// Export as a named class to avoid TypeScript issues with anonymous class types\nexport class OxyServices extends (OxyServicesComposed as any) {\n constructor(config: OxyConfig) {\n super(config);\n }\n}\n\n// Type augmentation to expose mixin methods to TypeScript\n// This allows proper type checking while avoiding complex mixin type inference\nexport interface OxyServices extends InstanceType<ReturnType<typeof composeOxyServices>> {}\n\n// Re-export error classes for convenience\nexport { OxyAuthenticationError, OxyAuthenticationTimeoutError };\n\n/**\n * Export the default Oxy Cloud URL (for backward compatibility)\n */\nexport const OXY_CLOUD_URL = 'https://cloud.oxy.so';\n\n/**\n * Export the default Oxy API URL (for documentation)\n */\nexport const OXY_API_URL = (typeof process !== 'undefined' && process.env && process.env.OXY_API_URL) || 'https://api.oxy.so';\n\n/**\n * Pre-configured client instance for easy import\n * Uses OXY_API_URL as baseURL and OXY_CLOUD_URL as cloudURL\n */\nexport const oxyClient = new OxyServices({ baseURL: OXY_API_URL, cloudURL: OXY_CLOUD_URL });\n","/**\n * Cross-Domain Authentication Helper\n *\n * Provides a simplified API for cross-domain SSO authentication that automatically\n * selects the best authentication method based on browser capabilities:\n *\n * 1. FedCM (if supported) - Modern, Google-style browser-native auth\n * 2. Popup (fallback) - OAuth2-style popup window\n * 3. Redirect (final fallback) - Traditional full-page redirect\n *\n * Usage:\n * ```typescript\n * import { CrossDomainAuth } from '@oxyhq/services';\n *\n * const auth = new CrossDomainAuth(oxyServices);\n *\n * // Automatic method selection\n * const session = await auth.signIn();\n *\n * // Or use specific method\n * const session = await auth.signInWithPopup();\n * ```\n */\n\nimport type { OxyServices } from './OxyServices';\nimport type { SessionLoginResponse } from '../models/session';\n\nexport interface CrossDomainAuthOptions {\n /**\n * Preferred authentication method\n * - 'auto': Automatically select best method (default)\n * - 'fedcm': Use FedCM (browser-native)\n * - 'popup': Use popup window\n * - 'redirect': Use full-page redirect\n */\n method?: 'auto' | 'fedcm' | 'popup' | 'redirect';\n\n /**\n * Custom redirect URI (for redirect method)\n */\n redirectUri?: string;\n\n /**\n * Whether to open signup page instead of login\n */\n isSignup?: boolean;\n\n /**\n * Popup window dimensions (for popup method)\n */\n popupDimensions?: {\n width?: number;\n height?: number;\n };\n\n /**\n * Callback when auth method is selected\n */\n onMethodSelected?: (method: 'fedcm' | 'popup' | 'redirect') => void;\n}\n\nexport class CrossDomainAuth {\n constructor(private oxyServices: OxyServices) {}\n\n /**\n * Sign in with automatic method selection\n *\n * Tries methods in this order:\n * 1. FedCM (if supported and not in private browsing)\n * 2. Popup (if not blocked)\n * 3. Redirect (always works)\n *\n * @param options - Authentication options\n * @returns Session with user data and access token\n */\n async signIn(options: CrossDomainAuthOptions = {}): Promise<SessionLoginResponse | null> {\n const method = options.method || 'auto';\n\n // If specific method requested, use it directly\n if (method === 'fedcm') {\n return this.signInWithFedCM(options);\n }\n\n if (method === 'popup') {\n return this.signInWithPopup(options);\n }\n\n if (method === 'redirect') {\n this.signInWithRedirect(options);\n return null; // Redirect doesn't return immediately\n }\n\n // Auto mode: Try methods in order of preference\n return this.autoSignIn(options);\n }\n\n /**\n * Automatic sign-in with progressive enhancement\n *\n * @private\n */\n private async autoSignIn(options: CrossDomainAuthOptions): Promise<SessionLoginResponse | null> {\n // 1. Try FedCM first (best UX, most modern)\n if (this.isFedCMSupported()) {\n try {\n options.onMethodSelected?.('fedcm');\n return await this.signInWithFedCM(options);\n } catch (error) {\n console.warn('[CrossDomainAuth] FedCM failed, trying popup...', error);\n }\n }\n\n // 2. Try popup (good UX, widely supported)\n try {\n options.onMethodSelected?.('popup');\n return await this.signInWithPopup(options);\n } catch (error) {\n console.warn('[CrossDomainAuth] Popup failed, falling back to redirect...', error);\n }\n\n // 3. Fallback to redirect (always works)\n options.onMethodSelected?.('redirect');\n this.signInWithRedirect(options);\n return null;\n }\n\n /**\n * Sign in using FedCM (Federated Credential Management)\n *\n * Best method - browser-native, no popups, Google-like experience\n */\n async signInWithFedCM(options: CrossDomainAuthOptions = {}): Promise<SessionLoginResponse> {\n return (this.oxyServices as any).signInWithFedCM({\n context: options.isSignup ? 'signup' : 'signin',\n });\n }\n\n /**\n * Sign in using popup window\n *\n * Good method - preserves app state, no full page reload\n */\n async signInWithPopup(options: CrossDomainAuthOptions = {}): Promise<SessionLoginResponse> {\n return (this.oxyServices as any).signInWithPopup({\n mode: options.isSignup ? 'signup' : 'login',\n width: options.popupDimensions?.width,\n height: options.popupDimensions?.height,\n });\n }\n\n /**\n * Sign in using full-page redirect\n *\n * Fallback method - works everywhere but loses app state\n */\n signInWithRedirect(options: CrossDomainAuthOptions = {}): void {\n (this.oxyServices as any).signInWithRedirect({\n redirectUri: options.redirectUri,\n mode: options.isSignup ? 'signup' : 'login',\n });\n }\n\n /**\n * Handle redirect callback\n *\n * Call this on app startup to check if we're returning from auth redirect\n */\n handleRedirectCallback(): SessionLoginResponse | null {\n return (this.oxyServices as any).handleAuthCallback();\n }\n\n /**\n * Silent sign-in (check for existing session)\n *\n * Tries to automatically sign in without user interaction.\n * Works with both FedCM and popup/iframe methods.\n *\n * @returns Session if user is already signed in, null otherwise\n */\n async silentSignIn(): Promise<SessionLoginResponse | null> {\n // Try FedCM silent sign-in first (if supported)\n if (this.isFedCMSupported()) {\n try {\n const session = await (this.oxyServices as any).silentSignInWithFedCM();\n if (session) {\n return session;\n }\n } catch (error) {\n console.warn('[CrossDomainAuth] FedCM silent sign-in failed:', error);\n }\n }\n\n // Fallback to iframe-based silent auth\n try {\n return await (this.oxyServices as any).silentSignIn();\n } catch (error) {\n console.warn('[CrossDomainAuth] Silent sign-in failed:', error);\n return null;\n }\n }\n\n /**\n * Restore session from storage\n *\n * For redirect method - restores previously authenticated session from localStorage\n */\n restoreSession(): boolean {\n return (this.oxyServices as any).restoreSession?.() || false;\n }\n\n /**\n * Check if FedCM is supported in current browser\n */\n isFedCMSupported(): boolean {\n return (this.oxyServices as any).constructor.isFedCMSupported?.() || false;\n }\n\n /**\n * Get recommended authentication method for current environment\n *\n * @returns Recommended method name and reason\n */\n getRecommendedMethod(): { method: 'fedcm' | 'popup' | 'redirect'; reason: string } {\n if (this.isFedCMSupported()) {\n return {\n method: 'fedcm',\n reason: 'FedCM is supported - provides best UX with browser-native auth',\n };\n }\n\n if (typeof window !== 'undefined') {\n return {\n method: 'popup',\n reason: 'Browser environment - popup preserves app state',\n };\n }\n\n return {\n method: 'redirect',\n reason: 'Fallback method - works in all environments',\n };\n }\n\n /**\n * Initialize cross-domain auth on app startup\n *\n * This handles:\n * 1. Redirect callback (if returning from auth.oxy.so)\n * 2. Session restoration (from localStorage)\n * 3. Silent sign-in (check for existing SSO session)\n *\n * @returns Session if user is authenticated, null otherwise\n */\n async initialize(): Promise<SessionLoginResponse | null> {\n // 1. Check if this is a redirect callback\n const callbackSession = this.handleRedirectCallback();\n if (callbackSession) {\n return callbackSession;\n }\n\n // 2. Try to restore existing session from storage\n const restored = this.restoreSession();\n if (restored) {\n // Verify session is still valid by fetching user\n try {\n const user = await (this.oxyServices as any).getCurrentUser();\n if (user) {\n return {\n sessionId: (this.oxyServices as any).getStoredSessionId?.() || '',\n deviceId: '',\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n user,\n };\n }\n } catch (error) {\n console.warn('[CrossDomainAuth] Stored session invalid:', error);\n }\n }\n\n // 3. Try silent sign-in (check for SSO session at auth.oxy.so)\n return await this.silentSignIn();\n }\n}\n\n/**\n * Helper function to create CrossDomainAuth instance\n *\n * @example\n * ```typescript\n * import { createCrossDomainAuth } from '@oxyhq/services';\n *\n * const oxyServices = new OxyServices({ baseURL: 'https://api.oxy.so' });\n * const auth = createCrossDomainAuth(oxyServices);\n *\n * // On app startup\n * const session = await auth.initialize();\n * if (session) {\n * console.log('User is signed in:', session.user);\n * }\n *\n * // Sign in button click\n * const session = await auth.signIn();\n * ```\n */\nexport function createCrossDomainAuth(oxyServices: OxyServices): CrossDomainAuth {\n return new CrossDomainAuth(oxyServices);\n}\n","export interface OxyConfig {\n baseURL: string;\n cloudURL?: string;\n authWebUrl?: string;\n authRedirectUri?: string;\n // Performance & caching options\n enableCache?: boolean;\n cacheTTL?: number; // Cache TTL in milliseconds (default: 5 minutes)\n enableRequestDeduplication?: boolean;\n enableRetry?: boolean;\n maxRetries?: number;\n retryDelay?: number;\n requestTimeout?: number; // Default timeout in milliseconds (default: 5000)\n // Rate limiting\n maxConcurrentRequests?: number;\n requestQueueSize?: number;\n // Logging\n enableLogging?: boolean;\n logLevel?: 'none' | 'error' | 'warn' | 'info' | 'debug';\n // Performance monitoring\n onRequestStart?: (url: string, method: string) => void;\n onRequestEnd?: (url: string, method: string, duration: number, success: boolean) => void;\n onRequestError?: (url: string, method: string, error: Error) => void;\n}\n\nexport interface User {\n id: string;\n publicKey: string;\n username: string;\n email?: string;\n // Avatar file id (asset id)\n avatar?: string;\n // Privacy and security settings\n privacySettings?: {\n [key: string]: unknown;\n };\n name?: {\n first?: string;\n last?: string;\n full?: string; // virtual, not stored in DB, returned by API\n [key: string]: unknown;\n };\n bio?: string;\n karma?: number;\n location?: string;\n website?: string;\n createdAt?: string;\n updatedAt?: string;\n links?: Array<{\n title?: string;\n description?: string;\n image?: string;\n link: string;\n }>;\n // Social counts\n _count?: {\n followers?: number;\n following?: number;\n };\n accountExpiresAfterInactivityDays?: number | null; // Days of inactivity before account expires (null = never expire)\n [key: string]: unknown;\n}\n\nexport interface LoginResponse {\n accessToken?: string;\n refreshToken?: string;\n token?: string; // For backwards compatibility\n user: User;\n message?: string;\n}\n\nexport interface Notification {\n id: string;\n message: string;\n // Add other notification fields as needed\n}\n\nexport interface Wallet {\n id: string;\n balance: number;\n // Add other wallet fields as needed\n}\n\nexport interface Transaction {\n id: string;\n amount: number;\n type: string;\n timestamp: string;\n // Add other transaction fields as needed\n}\n\nexport interface BlockedUser {\n _id?: string;\n blockedId: string | {\n _id: string;\n username: string;\n avatar?: string;\n };\n userId: string;\n createdAt?: string;\n blockedAt?: string;\n username?: string;\n avatar?: string;\n}\n\nexport interface RestrictedUser {\n _id?: string;\n restrictedId: string | {\n _id: string;\n username: string;\n avatar?: string;\n };\n userId: string;\n createdAt?: string;\n restrictedAt?: string;\n username?: string;\n avatar?: string;\n}\n\nexport interface TransferFundsRequest {\n fromUserId: string;\n toUserId: string;\n amount: number;\n}\n\nexport interface PurchaseRequest {\n userId: string;\n itemId: string;\n amount: number;\n}\n\nexport interface WithdrawalRequest {\n userId: string;\n amount: number;\n address: string;\n}\n\nexport interface TransactionResponse {\n success: boolean;\n transaction: Transaction;\n}\n\nexport interface PaginationInfo {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\nexport interface SearchProfilesResponse {\n data: User[];\n pagination: PaginationInfo;\n}\n\nexport interface KarmaRule {\n id: string;\n description: string;\n // Add other karma rule fields as needed\n}\n\nexport interface KarmaHistory {\n id: string;\n userId: string;\n points: number;\n // Add other karma history fields as needed\n}\n\nexport interface KarmaLeaderboardEntry {\n userId: string;\n total: number;\n}\n\nexport interface KarmaAwardRequest {\n userId: string;\n points: number;\n reason?: string;\n}\n\nexport interface ApiError {\n message: string;\n code: string;\n status: number;\n details?: Record<string, unknown>;\n}\n\nexport interface PaymentMethod {\n id: string;\n type: string;\n // Add other payment method fields as needed\n}\n\nexport interface PaymentRequest {\n userId: string;\n planId: string;\n paymentMethodId: string;\n}\n\nexport interface PaymentResponse {\n transactionId: string;\n status: string;\n}\n\nexport interface AnalyticsData {\n userId: string;\n // Add other analytics fields as needed\n}\n\nexport interface FollowerDetails {\n userId: string;\n followers: number;\n // Add other follower details as needed\n}\n\nexport interface ContentViewer {\n userId: string;\n viewedAt: string;\n // Add other content viewer fields as needed\n}\n\n/**\n * File management interfaces\n */\nexport interface FileMetadata {\n id: string;\n filename: string;\n contentType: string;\n length: number;\n chunkSize: number;\n uploadDate: string;\n metadata?: {\n userId?: string;\n description?: string;\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n variants?: Array<{\n type: string; // e.g. 'thumb', 'poster'\n key: string; // storage key/path\n width?: number;\n height?: number;\n readyAt?: string;\n metadata?: Record<string, unknown>;\n }>;\n}\n\nexport interface FileUploadResponse {\n files: FileMetadata[];\n}\n\nexport interface FileListResponse {\n files: FileMetadata[];\n total: number;\n hasMore: boolean;\n}\n\nexport interface FileUpdateRequest {\n filename?: string;\n metadata?: {\n description?: string;\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n}\n\nexport interface FileDeleteResponse {\n success: boolean;\n message: string;\n fileId: string;\n}\n\n/**\n * Central Asset Service interfaces\n */\n\n/**\n * File visibility levels\n * - private: Only accessible by owner (default)\n * - public: Accessible by anyone without authentication (e.g., avatars, public profile content)\n * - unlisted: Accessible with direct link but not listed publicly\n */\nexport type FileVisibility = 'private' | 'public' | 'unlisted';\n\nexport interface AssetLink {\n app: string;\n entityType: string;\n entityId: string;\n createdBy: string;\n createdAt: string;\n}\n\nexport type AssetMetadata = Record<string, string | number | boolean | null | undefined>;\n\nexport interface AssetVariant {\n type: string;\n key: string;\n width?: number;\n height?: number;\n readyAt?: string;\n size?: number;\n metadata?: AssetMetadata;\n}\n\nexport interface Asset {\n id: string;\n sha256: string;\n size: number;\n mime: string;\n ext: string;\n originalName?: string;\n ownerUserId: string;\n status: 'active' | 'trash' | 'deleted';\n visibility: FileVisibility;\n usageCount: number;\n createdAt: string;\n updatedAt: string;\n links: AssetLink[];\n variants: AssetVariant[];\n metadata?: AssetMetadata;\n}\n\nexport interface AssetInitRequest {\n sha256: string;\n size: number;\n mime: string;\n}\n\nexport interface AssetInitResponse {\n uploadUrl: string;\n fileId: string;\n sha256: string;\n}\n\nexport interface AssetCompleteRequest {\n fileId: string;\n originalName: string;\n size: number;\n mime: string;\n visibility?: FileVisibility;\n metadata?: AssetMetadata;\n}\n\nexport interface AssetLinkRequest {\n app: string;\n entityType: string;\n entityId: string;\n visibility?: FileVisibility;\n}\n\nexport interface AssetUnlinkRequest {\n app: string;\n entityType: string;\n entityId: string;\n}\n\nexport interface AssetUrlResponse {\n success: boolean;\n url: string;\n variant?: string;\n expiresIn: number;\n}\n\nexport interface AssetDeleteSummary {\n fileId: string;\n wouldDelete: boolean;\n affectedApps: string[];\n remainingLinks: number;\n variants: string[];\n}\n\nexport interface AssetUpdateVisibilityRequest {\n visibility: FileVisibility;\n}\n\nexport interface AssetUpdateVisibilityResponse {\n success: boolean;\n file: {\n id: string;\n visibility: FileVisibility;\n updatedAt: string;\n };\n}\n\n/**\n * Account storage usage (server-side usage, not local AsyncStorage)\n */\nexport interface AccountStorageCategoryUsage {\n bytes: number;\n count: number;\n}\n\nexport interface AccountStorageUsageResponse {\n plan: 'basic' | 'pro' | 'business';\n totalUsedBytes: number;\n totalLimitBytes: number;\n categories: {\n documents: AccountStorageCategoryUsage;\n mail: AccountStorageCategoryUsage;\n photosVideos: AccountStorageCategoryUsage;\n recordings: AccountStorageCategoryUsage;\n family: AccountStorageCategoryUsage;\n other: AccountStorageCategoryUsage;\n };\n updatedAt: string;\n}\n\n/**\n * Security activity event types\n */\nexport type SecurityEventType = \n | 'sign_in'\n | 'sign_out'\n | 'email_changed'\n | 'profile_updated'\n | 'device_added'\n | 'device_removed'\n | 'account_recovery'\n | 'security_settings_changed'\n | 'private_key_exported'\n | 'backup_created'\n | 'suspicious_activity';\n\n/**\n * Security event severity levels\n */\nexport type SecurityEventSeverity = 'low' | 'medium' | 'high' | 'critical';\n\n/**\n * Security event severity mapping (single source of truth)\n * Maps each event type to its default severity level\n */\nexport const SECURITY_EVENT_SEVERITY_MAP: Record<SecurityEventType, SecurityEventSeverity> = {\n 'sign_in': 'low',\n 'sign_out': 'low',\n 'profile_updated': 'low',\n 'email_changed': 'medium',\n 'device_added': 'medium',\n 'device_removed': 'medium',\n 'security_settings_changed': 'medium',\n 'account_recovery': 'high',\n 'private_key_exported': 'high',\n 'backup_created': 'high',\n 'suspicious_activity': 'critical',\n};\n\n/**\n * Security activity event\n */\nexport interface SecurityActivity {\n id: string;\n userId: string;\n eventType: SecurityEventType;\n eventDescription: string;\n metadata?: Record<string, any>;\n ipAddress?: string;\n userAgent?: string;\n deviceId?: string;\n timestamp: string;\n severity: SecurityEventSeverity;\n createdAt: string;\n}\n\n/**\n * Security activity response with pagination\n */\nexport interface SecurityActivityResponse {\n data: SecurityActivity[];\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n}\n\nexport interface AssetUploadProgress {\n fileId: string;\n uploaded: number;\n total: number;\n percentage: number;\n status: 'uploading' | 'processing' | 'complete' | 'error';\n error?: string;\n}\n\n// Device Session interfaces\nexport interface DeviceSession {\n sessionId: string;\n deviceId: string;\n deviceName: string;\n isActive: boolean;\n lastActive: string;\n expiresAt: string;\n isCurrent: boolean;\n user?: User;\n createdAt?: string;\n}\n\nexport interface DeviceSessionsResponse {\n deviceId: string;\n sessions: DeviceSession[];\n}\n\nexport interface DeviceSessionLogoutResponse {\n message: string;\n deviceId: string;\n sessionsTerminated: number;\n}\n\nexport interface UpdateDeviceNameResponse {\n message: string;\n deviceName: string;\n}\n","export interface DeviceFingerprint {\n userAgent: string;\n platform: string;\n language?: string;\n timezone?: string;\n screen?: {\n width: number;\n height: number;\n colorDepth: number;\n };\n}\n\nexport interface StoredDeviceInfo {\n deviceId: string;\n deviceName?: string;\n fingerprint?: string;\n createdAt: string;\n lastUsed: string;\n}\n\n/**\n * Client-side device management utility\n * Handles persistent device identification across app sessions\n */\nexport class DeviceManager {\n private static DEVICE_KEY = 'oxy_device_info';\n \n /**\n * Check if we're in React Native environment\n */\n private static isReactNative(): boolean {\n return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n }\n \n /**\n * Get appropriate storage for the platform\n */\n private static async getStorage(): Promise<{\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n }> {\n if (this.isReactNative()) {\n try {\n const asyncStorageModule = await import('@react-native-async-storage/async-storage');\n const storage = (asyncStorageModule.default as unknown) as import('@react-native-async-storage/async-storage').AsyncStorageStatic;\n return {\n getItem: storage.getItem.bind(storage),\n setItem: storage.setItem.bind(storage),\n removeItem: storage.removeItem.bind(storage),\n };\n } catch (error) {\n console.error('AsyncStorage not available in React Native:', error);\n throw new Error('AsyncStorage is required in React Native environment');\n }\n } else {\n // Use localStorage for web\n return {\n getItem: async (key: string) => localStorage.getItem(key),\n setItem: async (key: string, value: string) => localStorage.setItem(key, value),\n removeItem: async (key: string) => localStorage.removeItem(key)\n };\n }\n }\n \n /**\n * Get or create device fingerprint for current device\n */\n static getDeviceFingerprint(): DeviceFingerprint {\n const fingerprint: DeviceFingerprint = {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown',\n platform: typeof navigator !== 'undefined' ? navigator.platform : 'unknown',\n language: typeof navigator !== 'undefined' ? navigator.language : undefined,\n timezone: typeof Intl !== 'undefined' ? Intl.DateTimeFormat().resolvedOptions().timeZone : undefined,\n };\n\n // Add screen info if available\n if (typeof screen !== 'undefined') {\n fingerprint.screen = {\n width: screen.width,\n height: screen.height,\n colorDepth: screen.colorDepth\n };\n }\n\n return fingerprint;\n }\n\n /**\n * Get stored device info or create new one\n */\n static async getDeviceInfo(): Promise<StoredDeviceInfo> {\n try {\n const storage = await this.getStorage();\n const stored = await storage.getItem(this.DEVICE_KEY);\n \n if (stored) {\n const deviceInfo: StoredDeviceInfo = JSON.parse(stored);\n \n // Update last used timestamp\n deviceInfo.lastUsed = new Date().toISOString();\n await this.saveDeviceInfo(deviceInfo);\n \n return deviceInfo;\n }\n \n // Create new device info\n return await this.createNewDeviceInfo();\n } catch (error) {\n console.error('Error getting device info:', error);\n return await this.createNewDeviceInfo();\n }\n }\n\n /**\n * Create new device info and store it\n */\n static async createNewDeviceInfo(): Promise<StoredDeviceInfo> {\n const deviceInfo: StoredDeviceInfo = {\n deviceId: this.generateDeviceId(),\n fingerprint: JSON.stringify(this.getDeviceFingerprint()),\n createdAt: new Date().toISOString(),\n lastUsed: new Date().toISOString()\n };\n\n await this.saveDeviceInfo(deviceInfo);\n return deviceInfo;\n }\n\n /**\n * Save device info to storage\n */\n static async saveDeviceInfo(deviceInfo: StoredDeviceInfo): Promise<void> {\n try {\n const storage = await this.getStorage();\n await storage.setItem(this.DEVICE_KEY, JSON.stringify(deviceInfo));\n } catch (error) {\n console.error('Error saving device info:', error);\n }\n }\n\n /**\n * Update device name\n */\n static async updateDeviceName(deviceName: string): Promise<void> {\n try {\n const deviceInfo = await this.getDeviceInfo();\n deviceInfo.deviceName = deviceName;\n await this.saveDeviceInfo(deviceInfo);\n } catch (error) {\n console.error('Error updating device name:', error);\n }\n }\n\n /**\n * Clear stored device info (useful for testing or reset)\n */\n static async clearDeviceInfo(): Promise<void> {\n try {\n const storage = await this.getStorage();\n await storage.removeItem(this.DEVICE_KEY);\n } catch (error) {\n console.error('Error clearing device info:', error);\n }\n }\n\n /**\n * Generate a unique device ID\n */\n private static generateDeviceId(): string {\n // Use crypto.getRandomValues if available, otherwise fallback to Math.random\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n } else {\n // Fallback for environments without crypto.getRandomValues\n return 'device_' + Date.now().toString(36) + Math.random().toString(36).substr(2);\n }\n }\n\n /**\n * Get a user-friendly device name based on platform\n */\n static getDefaultDeviceName(): string {\n const fingerprint = this.getDeviceFingerprint();\n const platform = (fingerprint.platform || '').toLowerCase();\n \n if (platform.includes('win')) return 'Windows Computer';\n if (platform.includes('mac')) return 'Mac Computer';\n if (platform.includes('linux')) return 'Linux Computer';\n if (platform.includes('iphone')) return 'iPhone';\n if (platform.includes('ipad')) return 'iPad';\n if (platform.includes('android')) return 'Android Device';\n \n return 'Unknown Device';\n }\n}\n","(function (module, exports) {\n 'use strict';\n\n // Utils\n function assert (val, msg) {\n if (!val) throw new Error(msg || 'Assertion failed');\n }\n\n // Could use `inherits` module, but don't want to move from single file\n // architecture yet.\n function inherits (ctor, superCtor) {\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n\n // BN\n\n function BN (number, base, endian) {\n if (BN.isBN(number)) {\n return number;\n }\n\n this.negative = 0;\n this.words = null;\n this.length = 0;\n\n // Reduction context\n this.red = null;\n\n if (number !== null) {\n if (base === 'le' || base === 'be') {\n endian = base;\n base = 10;\n }\n\n this._init(number || 0, base || 10, endian || 'be');\n }\n }\n if (typeof module === 'object') {\n module.exports = BN;\n } else {\n exports.BN = BN;\n }\n\n BN.BN = BN;\n BN.wordSize = 26;\n\n var Buffer;\n try {\n if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n Buffer = window.Buffer;\n } else {\n Buffer = require('buffer').Buffer;\n }\n } catch (e) {\n }\n\n BN.isBN = function isBN (num) {\n if (num instanceof BN) {\n return true;\n }\n\n return num !== null && typeof num === 'object' &&\n num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n };\n\n BN.max = function max (left, right) {\n if (left.cmp(right) > 0) return left;\n return right;\n };\n\n BN.min = function min (left, right) {\n if (left.cmp(right) < 0) return left;\n return right;\n };\n\n BN.prototype._init = function init (number, base, endian) {\n if (typeof number === 'number') {\n return this._initNumber(number, base, endian);\n }\n\n if (typeof number === 'object') {\n return this._initArray(number, base, endian);\n }\n\n if (base === 'hex') {\n base = 16;\n }\n assert(base === (base | 0) && base >= 2 && base <= 36);\n\n number = number.toString().replace(/\\s+/g, '');\n var start = 0;\n if (number[0] === '-') {\n start++;\n this.negative = 1;\n }\n\n if (start < number.length) {\n if (base === 16) {\n this._parseHex(number, start, endian);\n } else {\n this._parseBase(number, base, start);\n if (endian === 'le') {\n this._initArray(this.toArray(), base, endian);\n }\n }\n }\n };\n\n BN.prototype._initNumber = function _initNumber (number, base, endian) {\n if (number < 0) {\n this.negative = 1;\n number = -number;\n }\n if (number < 0x4000000) {\n this.words = [ number & 0x3ffffff ];\n this.length = 1;\n } else if (number < 0x10000000000000) {\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff\n ];\n this.length = 2;\n } else {\n assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n this.words = [\n number & 0x3ffffff,\n (number / 0x4000000) & 0x3ffffff,\n 1\n ];\n this.length = 3;\n }\n\n if (endian !== 'le') return;\n\n // Reverse the bytes\n this._initArray(this.toArray(), base, endian);\n };\n\n BN.prototype._initArray = function _initArray (number, base, endian) {\n // Perhaps a Uint8Array\n assert(typeof number.length === 'number');\n if (number.length <= 0) {\n this.words = [ 0 ];\n this.length = 1;\n return this;\n }\n\n this.length = Math.ceil(number.length / 3);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n var j, w;\n var off = 0;\n if (endian === 'be') {\n for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n } else if (endian === 'le') {\n for (i = 0, j = 0; i < number.length; i += 3) {\n w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n this.words[j] |= (w << off) & 0x3ffffff;\n this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n off += 24;\n if (off >= 26) {\n off -= 26;\n j++;\n }\n }\n }\n return this.strip();\n };\n\n function parseHex4Bits (string, index) {\n var c = string.charCodeAt(index);\n // 'A' - 'F'\n if (c >= 65 && c <= 70) {\n return c - 55;\n // 'a' - 'f'\n } else if (c >= 97 && c <= 102) {\n return c - 87;\n // '0' - '9'\n } else {\n return (c - 48) & 0xf;\n }\n }\n\n function parseHexByte (string, lowerBound, index) {\n var r = parseHex4Bits(string, index);\n if (index - 1 >= lowerBound) {\n r |= parseHex4Bits(string, index - 1) << 4;\n }\n return r;\n }\n\n BN.prototype._parseHex = function _parseHex (number, start, endian) {\n // Create possibly bigger array to ensure that it fits the number\n this.length = Math.ceil((number.length - start) / 6);\n this.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n this.words[i] = 0;\n }\n\n // 24-bits chunks\n var off = 0;\n var j = 0;\n\n var w;\n if (endian === 'be') {\n for (i = number.length - 1; i >= start; i -= 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n } else {\n var parseLength = number.length - start;\n for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n w = parseHexByte(number, start, i) << off;\n this.words[j] |= w & 0x3ffffff;\n if (off >= 18) {\n off -= 18;\n j += 1;\n this.words[j] |= w >>> 26;\n } else {\n off += 8;\n }\n }\n }\n\n this.strip();\n };\n\n function parseBase (str, start, end, mul) {\n var r = 0;\n var len = Math.min(str.length, end);\n for (var i = start; i < len; i++) {\n var c = str.charCodeAt(i) - 48;\n\n r *= mul;\n\n // 'a'\n if (c >= 49) {\n r += c - 49 + 0xa;\n\n // 'A'\n } else if (c >= 17) {\n r += c - 17 + 0xa;\n\n // '0' - '9'\n } else {\n r += c;\n }\n }\n return r;\n }\n\n BN.prototype._parseBase = function _parseBase (number, base, start) {\n // Initialize as zero\n this.words = [ 0 ];\n this.length = 1;\n\n // Find length of limb in base\n for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n limbLen++;\n }\n limbLen--;\n limbPow = (limbPow / base) | 0;\n\n var total = number.length - start;\n var mod = total % limbLen;\n var end = Math.min(total, total - mod) + start;\n\n var word = 0;\n for (var i = start; i < end; i += limbLen) {\n word = parseBase(number, i, i + limbLen, base);\n\n this.imuln(limbPow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n if (mod !== 0) {\n var pow = 1;\n word = parseBase(number, i, number.length, base);\n\n for (i = 0; i < mod; i++) {\n pow *= base;\n }\n\n this.imuln(pow);\n if (this.words[0] + word < 0x4000000) {\n this.words[0] += word;\n } else {\n this._iaddn(word);\n }\n }\n\n this.strip();\n };\n\n BN.prototype.copy = function copy (dest) {\n dest.words = new Array(this.length);\n for (var i = 0; i < this.length; i++) {\n dest.words[i] = this.words[i];\n }\n dest.length = this.length;\n dest.negative = this.negative;\n dest.red = this.red;\n };\n\n BN.prototype.clone = function clone () {\n var r = new BN(null);\n this.copy(r);\n return r;\n };\n\n BN.prototype._expand = function _expand (size) {\n while (this.length < size) {\n this.words[this.length++] = 0;\n }\n return this;\n };\n\n // Remove leading `0` from `this`\n BN.prototype.strip = function strip () {\n while (this.length > 1 && this.words[this.length - 1] === 0) {\n this.length--;\n }\n return this._normSign();\n };\n\n BN.prototype._normSign = function _normSign () {\n // -0 = 0\n if (this.length === 1 && this.words[0] === 0) {\n this.negative = 0;\n }\n return this;\n };\n\n BN.prototype.inspect = function inspect () {\n return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n };\n\n /*\n\n var zeros = [];\n var groupSizes = [];\n var groupBases = [];\n\n var s = '';\n var i = -1;\n while (++i < BN.wordSize) {\n zeros[i] = s;\n s += '0';\n }\n groupSizes[0] = 0;\n groupSizes[1] = 0;\n groupBases[0] = 0;\n groupBases[1] = 0;\n var base = 2 - 1;\n while (++base < 36 + 1) {\n var groupSize = 0;\n var groupBase = 1;\n while (groupBase < (1 << BN.wordSize) / base) {\n groupBase *= base;\n groupSize += 1;\n }\n groupSizes[base] = groupSize;\n groupBases[base] = groupBase;\n }\n\n */\n\n var zeros = [\n '',\n '0',\n '00',\n '000',\n '0000',\n '00000',\n '000000',\n '0000000',\n '00000000',\n '000000000',\n '0000000000',\n '00000000000',\n '000000000000',\n '0000000000000',\n '00000000000000',\n '000000000000000',\n '0000000000000000',\n '00000000000000000',\n '000000000000000000',\n '0000000000000000000',\n '00000000000000000000',\n '000000000000000000000',\n '0000000000000000000000',\n '00000000000000000000000',\n '000000000000000000000000',\n '0000000000000000000000000'\n ];\n\n var groupSizes = [\n 0, 0,\n 25, 16, 12, 11, 10, 9, 8,\n 8, 7, 7, 7, 7, 6, 6,\n 6, 6, 6, 6, 6, 5, 5,\n 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5\n ];\n\n var groupBases = [\n 0, 0,\n 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n ];\n\n BN.prototype.toString = function toString (base, padding) {\n base = base || 10;\n padding = padding | 0 || 1;\n\n var out;\n if (base === 16 || base === 'hex') {\n out = '';\n var off = 0;\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = this.words[i];\n var word = (((w << off) | carry) & 0xffffff).toString(16);\n carry = (w >>> (24 - off)) & 0xffffff;\n off += 2;\n if (off >= 26) {\n off -= 26;\n i--;\n }\n if (carry !== 0 || i !== this.length - 1) {\n out = zeros[6 - word.length] + word + out;\n } else {\n out = word + out;\n }\n }\n if (carry !== 0) {\n out = carry.toString(16) + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n if (base === (base | 0) && base >= 2 && base <= 36) {\n // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n var groupSize = groupSizes[base];\n // var groupBase = Math.pow(base, groupSize);\n var groupBase = groupBases[base];\n out = '';\n var c = this.clone();\n c.negative = 0;\n while (!c.isZero()) {\n var r = c.modn(groupBase).toString(base);\n c = c.idivn(groupBase);\n\n if (!c.isZero()) {\n out = zeros[groupSize - r.length] + r + out;\n } else {\n out = r + out;\n }\n }\n if (this.isZero()) {\n out = '0' + out;\n }\n while (out.length % padding !== 0) {\n out = '0' + out;\n }\n if (this.negative !== 0) {\n out = '-' + out;\n }\n return out;\n }\n\n assert(false, 'Base should be between 2 and 36');\n };\n\n BN.prototype.toNumber = function toNumber () {\n var ret = this.words[0];\n if (this.length === 2) {\n ret += this.words[1] * 0x4000000;\n } else if (this.length === 3 && this.words[2] === 0x01) {\n // NOTE: at this stage it is known that the top bit is set\n ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n } else if (this.length > 2) {\n assert(false, 'Number can only safely store up to 53 bits');\n }\n return (this.negative !== 0) ? -ret : ret;\n };\n\n BN.prototype.toJSON = function toJSON () {\n return this.toString(16);\n };\n\n BN.prototype.toBuffer = function toBuffer (endian, length) {\n assert(typeof Buffer !== 'undefined');\n return this.toArrayLike(Buffer, endian, length);\n };\n\n BN.prototype.toArray = function toArray (endian, length) {\n return this.toArrayLike(Array, endian, length);\n };\n\n BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n var byteLength = this.byteLength();\n var reqLength = length || Math.max(1, byteLength);\n assert(byteLength <= reqLength, 'byte array longer than desired length');\n assert(reqLength > 0, 'Requested array length <= 0');\n\n this.strip();\n var littleEndian = endian === 'le';\n var res = new ArrayType(reqLength);\n\n var b, i;\n var q = this.clone();\n if (!littleEndian) {\n // Assume big-endian\n for (i = 0; i < reqLength - byteLength; i++) {\n res[i] = 0;\n }\n\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[reqLength - i - 1] = b;\n }\n } else {\n for (i = 0; !q.isZero(); i++) {\n b = q.andln(0xff);\n q.iushrn(8);\n\n res[i] = b;\n }\n\n for (; i < reqLength; i++) {\n res[i] = 0;\n }\n }\n\n return res;\n };\n\n if (Math.clz32) {\n BN.prototype._countBits = function _countBits (w) {\n return 32 - Math.clz32(w);\n };\n } else {\n BN.prototype._countBits = function _countBits (w) {\n var t = w;\n var r = 0;\n if (t >= 0x1000) {\n r += 13;\n t >>>= 13;\n }\n if (t >= 0x40) {\n r += 7;\n t >>>= 7;\n }\n if (t >= 0x8) {\n r += 4;\n t >>>= 4;\n }\n if (t >= 0x02) {\n r += 2;\n t >>>= 2;\n }\n return r + t;\n };\n }\n\n BN.prototype._zeroBits = function _zeroBits (w) {\n // Short-cut\n if (w === 0) return 26;\n\n var t = w;\n var r = 0;\n if ((t & 0x1fff) === 0) {\n r += 13;\n t >>>= 13;\n }\n if ((t & 0x7f) === 0) {\n r += 7;\n t >>>= 7;\n }\n if ((t & 0xf) === 0) {\n r += 4;\n t >>>= 4;\n }\n if ((t & 0x3) === 0) {\n r += 2;\n t >>>= 2;\n }\n if ((t & 0x1) === 0) {\n r++;\n }\n return r;\n };\n\n // Return number of used bits in a BN\n BN.prototype.bitLength = function bitLength () {\n var w = this.words[this.length - 1];\n var hi = this._countBits(w);\n return (this.length - 1) * 26 + hi;\n };\n\n function toBitArray (num) {\n var w = new Array(num.bitLength());\n\n for (var bit = 0; bit < w.length; bit++) {\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;\n }\n\n return w;\n }\n\n // Number of trailing zero bits\n BN.prototype.zeroBits = function zeroBits () {\n if (this.isZero()) return 0;\n\n var r = 0;\n for (var i = 0; i < this.length; i++) {\n var b = this._zeroBits(this.words[i]);\n r += b;\n if (b !== 26) break;\n }\n return r;\n };\n\n BN.prototype.byteLength = function byteLength () {\n return Math.ceil(this.bitLength() / 8);\n };\n\n BN.prototype.toTwos = function toTwos (width) {\n if (this.negative !== 0) {\n return this.abs().inotn(width).iaddn(1);\n }\n return this.clone();\n };\n\n BN.prototype.fromTwos = function fromTwos (width) {\n if (this.testn(width - 1)) {\n return this.notn(width).iaddn(1).ineg();\n }\n return this.clone();\n };\n\n BN.prototype.isNeg = function isNeg () {\n return this.negative !== 0;\n };\n\n // Return negative clone of `this`\n BN.prototype.neg = function neg () {\n return this.clone().ineg();\n };\n\n BN.prototype.ineg = function ineg () {\n if (!this.isZero()) {\n this.negative ^= 1;\n }\n\n return this;\n };\n\n // Or `num` with `this` in-place\n BN.prototype.iuor = function iuor (num) {\n while (this.length < num.length) {\n this.words[this.length++] = 0;\n }\n\n for (var i = 0; i < num.length; i++) {\n this.words[i] = this.words[i] | num.words[i];\n }\n\n return this.strip();\n };\n\n BN.prototype.ior = function ior (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuor(num);\n };\n\n // Or `num` with `this`\n BN.prototype.or = function or (num) {\n if (this.length > num.length) return this.clone().ior(num);\n return num.clone().ior(this);\n };\n\n BN.prototype.uor = function uor (num) {\n if (this.length > num.length) return this.clone().iuor(num);\n return num.clone().iuor(this);\n };\n\n // And `num` with `this` in-place\n BN.prototype.iuand = function iuand (num) {\n // b = min-length(num, this)\n var b;\n if (this.length > num.length) {\n b = num;\n } else {\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = this.words[i] & num.words[i];\n }\n\n this.length = b.length;\n\n return this.strip();\n };\n\n BN.prototype.iand = function iand (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuand(num);\n };\n\n // And `num` with `this`\n BN.prototype.and = function and (num) {\n if (this.length > num.length) return this.clone().iand(num);\n return num.clone().iand(this);\n };\n\n BN.prototype.uand = function uand (num) {\n if (this.length > num.length) return this.clone().iuand(num);\n return num.clone().iuand(this);\n };\n\n // Xor `num` with `this` in-place\n BN.prototype.iuxor = function iuxor (num) {\n // a.length > b.length\n var a;\n var b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n for (var i = 0; i < b.length; i++) {\n this.words[i] = a.words[i] ^ b.words[i];\n }\n\n if (this !== a) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = a.length;\n\n return this.strip();\n };\n\n BN.prototype.ixor = function ixor (num) {\n assert((this.negative | num.negative) === 0);\n return this.iuxor(num);\n };\n\n // Xor `num` with `this`\n BN.prototype.xor = function xor (num) {\n if (this.length > num.length) return this.clone().ixor(num);\n return num.clone().ixor(this);\n };\n\n BN.prototype.uxor = function uxor (num) {\n if (this.length > num.length) return this.clone().iuxor(num);\n return num.clone().iuxor(this);\n };\n\n // Not ``this`` with ``width`` bitwidth\n BN.prototype.inotn = function inotn (width) {\n assert(typeof width === 'number' && width >= 0);\n\n var bytesNeeded = Math.ceil(width / 26) | 0;\n var bitsLeft = width % 26;\n\n // Extend the buffer with leading zeroes\n this._expand(bytesNeeded);\n\n if (bitsLeft > 0) {\n bytesNeeded--;\n }\n\n // Handle complete words\n for (var i = 0; i < bytesNeeded; i++) {\n this.words[i] = ~this.words[i] & 0x3ffffff;\n }\n\n // Handle the residue\n if (bitsLeft > 0) {\n this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n }\n\n // And remove leading zeroes\n return this.strip();\n };\n\n BN.prototype.notn = function notn (width) {\n return this.clone().inotn(width);\n };\n\n // Set `bit` of `this`\n BN.prototype.setn = function setn (bit, val) {\n assert(typeof bit === 'number' && bit >= 0);\n\n var off = (bit / 26) | 0;\n var wbit = bit % 26;\n\n this._expand(off + 1);\n\n if (val) {\n this.words[off] = this.words[off] | (1 << wbit);\n } else {\n this.words[off] = this.words[off] & ~(1 << wbit);\n }\n\n return this.strip();\n };\n\n // Add `num` to `this` in-place\n BN.prototype.iadd = function iadd (num) {\n var r;\n\n // negative + positive\n if (this.negative !== 0 && num.negative === 0) {\n this.negative = 0;\n r = this.isub(num);\n this.negative ^= 1;\n return this._normSign();\n\n // positive + negative\n } else if (this.negative === 0 && num.negative !== 0) {\n num.negative = 0;\n r = this.isub(num);\n num.negative = 1;\n return r._normSign();\n }\n\n // a.length > b.length\n var a, b;\n if (this.length > num.length) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n this.words[i] = r & 0x3ffffff;\n carry = r >>> 26;\n }\n\n this.length = a.length;\n if (carry !== 0) {\n this.words[this.length] = carry;\n this.length++;\n // Copy the rest of the words\n } else if (a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n return this;\n };\n\n // Add `num` to `this`\n BN.prototype.add = function add (num) {\n var res;\n if (num.negative !== 0 && this.negative === 0) {\n num.negative = 0;\n res = this.sub(num);\n num.negative ^= 1;\n return res;\n } else if (num.negative === 0 && this.negative !== 0) {\n this.negative = 0;\n res = num.sub(this);\n this.negative = 1;\n return res;\n }\n\n if (this.length > num.length) return this.clone().iadd(num);\n\n return num.clone().iadd(this);\n };\n\n // Subtract `num` from `this` in-place\n BN.prototype.isub = function isub (num) {\n // this - (-num) = this + num\n if (num.negative !== 0) {\n num.negative = 0;\n var r = this.iadd(num);\n num.negative = 1;\n return r._normSign();\n\n // -this - num = -(this + num)\n } else if (this.negative !== 0) {\n this.negative = 0;\n this.iadd(num);\n this.negative = 1;\n return this._normSign();\n }\n\n // At this point both numbers are positive\n var cmp = this.cmp(num);\n\n // Optimization - zeroify\n if (cmp === 0) {\n this.negative = 0;\n this.length = 1;\n this.words[0] = 0;\n return this;\n }\n\n // a > b\n var a, b;\n if (cmp > 0) {\n a = this;\n b = num;\n } else {\n a = num;\n b = this;\n }\n\n var carry = 0;\n for (var i = 0; i < b.length; i++) {\n r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n for (; carry !== 0 && i < a.length; i++) {\n r = (a.words[i] | 0) + carry;\n carry = r >> 26;\n this.words[i] = r & 0x3ffffff;\n }\n\n // Copy rest of the words\n if (carry === 0 && i < a.length && a !== this) {\n for (; i < a.length; i++) {\n this.words[i] = a.words[i];\n }\n }\n\n this.length = Math.max(this.length, i);\n\n if (a !== this) {\n this.negative = 1;\n }\n\n return this.strip();\n };\n\n // Subtract `num` from `this`\n BN.prototype.sub = function sub (num) {\n return this.clone().isub(num);\n };\n\n function smallMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n var len = (self.length + num.length) | 0;\n out.length = len;\n len = (len - 1) | 0;\n\n // Peel one iteration (compiler can't do it, because of code complexity)\n var a = self.words[0] | 0;\n var b = num.words[0] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n var carry = (r / 0x4000000) | 0;\n out.words[0] = lo;\n\n for (var k = 1; k < len; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = carry >>> 26;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = (k - j) | 0;\n a = self.words[i] | 0;\n b = num.words[j] | 0;\n r = a * b + rword;\n ncarry += (r / 0x4000000) | 0;\n rword = r & 0x3ffffff;\n }\n out.words[k] = rword | 0;\n carry = ncarry | 0;\n }\n if (carry !== 0) {\n out.words[k] = carry | 0;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n // TODO(indutny): it may be reasonable to omit it for users who don't need\n // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n // multiplication (like elliptic secp256k1).\n var comb10MulTo = function comb10MulTo (self, num, out) {\n var a = self.words;\n var b = num.words;\n var o = out.words;\n var c = 0;\n var lo;\n var mid;\n var hi;\n var a0 = a[0] | 0;\n var al0 = a0 & 0x1fff;\n var ah0 = a0 >>> 13;\n var a1 = a[1] | 0;\n var al1 = a1 & 0x1fff;\n var ah1 = a1 >>> 13;\n var a2 = a[2] | 0;\n var al2 = a2 & 0x1fff;\n var ah2 = a2 >>> 13;\n var a3 = a[3] | 0;\n var al3 = a3 & 0x1fff;\n var ah3 = a3 >>> 13;\n var a4 = a[4] | 0;\n var al4 = a4 & 0x1fff;\n var ah4 = a4 >>> 13;\n var a5 = a[5] | 0;\n var al5 = a5 & 0x1fff;\n var ah5 = a5 >>> 13;\n var a6 = a[6] | 0;\n var al6 = a6 & 0x1fff;\n var ah6 = a6 >>> 13;\n var a7 = a[7] | 0;\n var al7 = a7 & 0x1fff;\n var ah7 = a7 >>> 13;\n var a8 = a[8] | 0;\n var al8 = a8 & 0x1fff;\n var ah8 = a8 >>> 13;\n var a9 = a[9] | 0;\n var al9 = a9 & 0x1fff;\n var ah9 = a9 >>> 13;\n var b0 = b[0] | 0;\n var bl0 = b0 & 0x1fff;\n var bh0 = b0 >>> 13;\n var b1 = b[1] | 0;\n var bl1 = b1 & 0x1fff;\n var bh1 = b1 >>> 13;\n var b2 = b[2] | 0;\n var bl2 = b2 & 0x1fff;\n var bh2 = b2 >>> 13;\n var b3 = b[3] | 0;\n var bl3 = b3 & 0x1fff;\n var bh3 = b3 >>> 13;\n var b4 = b[4] | 0;\n var bl4 = b4 & 0x1fff;\n var bh4 = b4 >>> 13;\n var b5 = b[5] | 0;\n var bl5 = b5 & 0x1fff;\n var bh5 = b5 >>> 13;\n var b6 = b[6] | 0;\n var bl6 = b6 & 0x1fff;\n var bh6 = b6 >>> 13;\n var b7 = b[7] | 0;\n var bl7 = b7 & 0x1fff;\n var bh7 = b7 >>> 13;\n var b8 = b[8] | 0;\n var bl8 = b8 & 0x1fff;\n var bh8 = b8 >>> 13;\n var b9 = b[9] | 0;\n var bl9 = b9 & 0x1fff;\n var bh9 = b9 >>> 13;\n\n out.negative = self.negative ^ num.negative;\n out.length = 19;\n /* k = 0 */\n lo = Math.imul(al0, bl0);\n mid = Math.imul(al0, bh0);\n mid = (mid + Math.imul(ah0, bl0)) | 0;\n hi = Math.imul(ah0, bh0);\n var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n w0 &= 0x3ffffff;\n /* k = 1 */\n lo = Math.imul(al1, bl0);\n mid = Math.imul(al1, bh0);\n mid = (mid + Math.imul(ah1, bl0)) | 0;\n hi = Math.imul(ah1, bh0);\n lo = (lo + Math.imul(al0, bl1)) | 0;\n mid = (mid + Math.imul(al0, bh1)) | 0;\n mid = (mid + Math.imul(ah0, bl1)) | 0;\n hi = (hi + Math.imul(ah0, bh1)) | 0;\n var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n w1 &= 0x3ffffff;\n /* k = 2 */\n lo = Math.imul(al2, bl0);\n mid = Math.imul(al2, bh0);\n mid = (mid + Math.imul(ah2, bl0)) | 0;\n hi = Math.imul(ah2, bh0);\n lo = (lo + Math.imul(al1, bl1)) | 0;\n mid = (mid + Math.imul(al1, bh1)) | 0;\n mid = (mid + Math.imul(ah1, bl1)) | 0;\n hi = (hi + Math.imul(ah1, bh1)) | 0;\n lo = (lo + Math.imul(al0, bl2)) | 0;\n mid = (mid + Math.imul(al0, bh2)) | 0;\n mid = (mid + Math.imul(ah0, bl2)) | 0;\n hi = (hi + Math.imul(ah0, bh2)) | 0;\n var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n w2 &= 0x3ffffff;\n /* k = 3 */\n lo = Math.imul(al3, bl0);\n mid = Math.imul(al3, bh0);\n mid = (mid + Math.imul(ah3, bl0)) | 0;\n hi = Math.imul(ah3, bh0);\n lo = (lo + Math.imul(al2, bl1)) | 0;\n mid = (mid + Math.imul(al2, bh1)) | 0;\n mid = (mid + Math.imul(ah2, bl1)) | 0;\n hi = (hi + Math.imul(ah2, bh1)) | 0;\n lo = (lo + Math.imul(al1, bl2)) | 0;\n mid = (mid + Math.imul(al1, bh2)) | 0;\n mid = (mid + Math.imul(ah1, bl2)) | 0;\n hi = (hi + Math.imul(ah1, bh2)) | 0;\n lo = (lo + Math.imul(al0, bl3)) | 0;\n mid = (mid + Math.imul(al0, bh3)) | 0;\n mid = (mid + Math.imul(ah0, bl3)) | 0;\n hi = (hi + Math.imul(ah0, bh3)) | 0;\n var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n w3 &= 0x3ffffff;\n /* k = 4 */\n lo = Math.imul(al4, bl0);\n mid = Math.imul(al4, bh0);\n mid = (mid + Math.imul(ah4, bl0)) | 0;\n hi = Math.imul(ah4, bh0);\n lo = (lo + Math.imul(al3, bl1)) | 0;\n mid = (mid + Math.imul(al3, bh1)) | 0;\n mid = (mid + Math.imul(ah3, bl1)) | 0;\n hi = (hi + Math.imul(ah3, bh1)) | 0;\n lo = (lo + Math.imul(al2, bl2)) | 0;\n mid = (mid + Math.imul(al2, bh2)) | 0;\n mid = (mid + Math.imul(ah2, bl2)) | 0;\n hi = (hi + Math.imul(ah2, bh2)) | 0;\n lo = (lo + Math.imul(al1, bl3)) | 0;\n mid = (mid + Math.imul(al1, bh3)) | 0;\n mid = (mid + Math.imul(ah1, bl3)) | 0;\n hi = (hi + Math.imul(ah1, bh3)) | 0;\n lo = (lo + Math.imul(al0, bl4)) | 0;\n mid = (mid + Math.imul(al0, bh4)) | 0;\n mid = (mid + Math.imul(ah0, bl4)) | 0;\n hi = (hi + Math.imul(ah0, bh4)) | 0;\n var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n w4 &= 0x3ffffff;\n /* k = 5 */\n lo = Math.imul(al5, bl0);\n mid = Math.imul(al5, bh0);\n mid = (mid + Math.imul(ah5, bl0)) | 0;\n hi = Math.imul(ah5, bh0);\n lo = (lo + Math.imul(al4, bl1)) | 0;\n mid = (mid + Math.imul(al4, bh1)) | 0;\n mid = (mid + Math.imul(ah4, bl1)) | 0;\n hi = (hi + Math.imul(ah4, bh1)) | 0;\n lo = (lo + Math.imul(al3, bl2)) | 0;\n mid = (mid + Math.imul(al3, bh2)) | 0;\n mid = (mid + Math.imul(ah3, bl2)) | 0;\n hi = (hi + Math.imul(ah3, bh2)) | 0;\n lo = (lo + Math.imul(al2, bl3)) | 0;\n mid = (mid + Math.imul(al2, bh3)) | 0;\n mid = (mid + Math.imul(ah2, bl3)) | 0;\n hi = (hi + Math.imul(ah2, bh3)) | 0;\n lo = (lo + Math.imul(al1, bl4)) | 0;\n mid = (mid + Math.imul(al1, bh4)) | 0;\n mid = (mid + Math.imul(ah1, bl4)) | 0;\n hi = (hi + Math.imul(ah1, bh4)) | 0;\n lo = (lo + Math.imul(al0, bl5)) | 0;\n mid = (mid + Math.imul(al0, bh5)) | 0;\n mid = (mid + Math.imul(ah0, bl5)) | 0;\n hi = (hi + Math.imul(ah0, bh5)) | 0;\n var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n w5 &= 0x3ffffff;\n /* k = 6 */\n lo = Math.imul(al6, bl0);\n mid = Math.imul(al6, bh0);\n mid = (mid + Math.imul(ah6, bl0)) | 0;\n hi = Math.imul(ah6, bh0);\n lo = (lo + Math.imul(al5, bl1)) | 0;\n mid = (mid + Math.imul(al5, bh1)) | 0;\n mid = (mid + Math.imul(ah5, bl1)) | 0;\n hi = (hi + Math.imul(ah5, bh1)) | 0;\n lo = (lo + Math.imul(al4, bl2)) | 0;\n mid = (mid + Math.imul(al4, bh2)) | 0;\n mid = (mid + Math.imul(ah4, bl2)) | 0;\n hi = (hi + Math.imul(ah4, bh2)) | 0;\n lo = (lo + Math.imul(al3, bl3)) | 0;\n mid = (mid + Math.imul(al3, bh3)) | 0;\n mid = (mid + Math.imul(ah3, bl3)) | 0;\n hi = (hi + Math.imul(ah3, bh3)) | 0;\n lo = (lo + Math.imul(al2, bl4)) | 0;\n mid = (mid + Math.imul(al2, bh4)) | 0;\n mid = (mid + Math.imul(ah2, bl4)) | 0;\n hi = (hi + Math.imul(ah2, bh4)) | 0;\n lo = (lo + Math.imul(al1, bl5)) | 0;\n mid = (mid + Math.imul(al1, bh5)) | 0;\n mid = (mid + Math.imul(ah1, bl5)) | 0;\n hi = (hi + Math.imul(ah1, bh5)) | 0;\n lo = (lo + Math.imul(al0, bl6)) | 0;\n mid = (mid + Math.imul(al0, bh6)) | 0;\n mid = (mid + Math.imul(ah0, bl6)) | 0;\n hi = (hi + Math.imul(ah0, bh6)) | 0;\n var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n w6 &= 0x3ffffff;\n /* k = 7 */\n lo = Math.imul(al7, bl0);\n mid = Math.imul(al7, bh0);\n mid = (mid + Math.imul(ah7, bl0)) | 0;\n hi = Math.imul(ah7, bh0);\n lo = (lo + Math.imul(al6, bl1)) | 0;\n mid = (mid + Math.imul(al6, bh1)) | 0;\n mid = (mid + Math.imul(ah6, bl1)) | 0;\n hi = (hi + Math.imul(ah6, bh1)) | 0;\n lo = (lo + Math.imul(al5, bl2)) | 0;\n mid = (mid + Math.imul(al5, bh2)) | 0;\n mid = (mid + Math.imul(ah5, bl2)) | 0;\n hi = (hi + Math.imul(ah5, bh2)) | 0;\n lo = (lo + Math.imul(al4, bl3)) | 0;\n mid = (mid + Math.imul(al4, bh3)) | 0;\n mid = (mid + Math.imul(ah4, bl3)) | 0;\n hi = (hi + Math.imul(ah4, bh3)) | 0;\n lo = (lo + Math.imul(al3, bl4)) | 0;\n mid = (mid + Math.imul(al3, bh4)) | 0;\n mid = (mid + Math.imul(ah3, bl4)) | 0;\n hi = (hi + Math.imul(ah3, bh4)) | 0;\n lo = (lo + Math.imul(al2, bl5)) | 0;\n mid = (mid + Math.imul(al2, bh5)) | 0;\n mid = (mid + Math.imul(ah2, bl5)) | 0;\n hi = (hi + Math.imul(ah2, bh5)) | 0;\n lo = (lo + Math.imul(al1, bl6)) | 0;\n mid = (mid + Math.imul(al1, bh6)) | 0;\n mid = (mid + Math.imul(ah1, bl6)) | 0;\n hi = (hi + Math.imul(ah1, bh6)) | 0;\n lo = (lo + Math.imul(al0, bl7)) | 0;\n mid = (mid + Math.imul(al0, bh7)) | 0;\n mid = (mid + Math.imul(ah0, bl7)) | 0;\n hi = (hi + Math.imul(ah0, bh7)) | 0;\n var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n w7 &= 0x3ffffff;\n /* k = 8 */\n lo = Math.imul(al8, bl0);\n mid = Math.imul(al8, bh0);\n mid = (mid + Math.imul(ah8, bl0)) | 0;\n hi = Math.imul(ah8, bh0);\n lo = (lo + Math.imul(al7, bl1)) | 0;\n mid = (mid + Math.imul(al7, bh1)) | 0;\n mid = (mid + Math.imul(ah7, bl1)) | 0;\n hi = (hi + Math.imul(ah7, bh1)) | 0;\n lo = (lo + Math.imul(al6, bl2)) | 0;\n mid = (mid + Math.imul(al6, bh2)) | 0;\n mid = (mid + Math.imul(ah6, bl2)) | 0;\n hi = (hi + Math.imul(ah6, bh2)) | 0;\n lo = (lo + Math.imul(al5, bl3)) | 0;\n mid = (mid + Math.imul(al5, bh3)) | 0;\n mid = (mid + Math.imul(ah5, bl3)) | 0;\n hi = (hi + Math.imul(ah5, bh3)) | 0;\n lo = (lo + Math.imul(al4, bl4)) | 0;\n mid = (mid + Math.imul(al4, bh4)) | 0;\n mid = (mid + Math.imul(ah4, bl4)) | 0;\n hi = (hi + Math.imul(ah4, bh4)) | 0;\n lo = (lo + Math.imul(al3, bl5)) | 0;\n mid = (mid + Math.imul(al3, bh5)) | 0;\n mid = (mid + Math.imul(ah3, bl5)) | 0;\n hi = (hi + Math.imul(ah3, bh5)) | 0;\n lo = (lo + Math.imul(al2, bl6)) | 0;\n mid = (mid + Math.imul(al2, bh6)) | 0;\n mid = (mid + Math.imul(ah2, bl6)) | 0;\n hi = (hi + Math.imul(ah2, bh6)) | 0;\n lo = (lo + Math.imul(al1, bl7)) | 0;\n mid = (mid + Math.imul(al1, bh7)) | 0;\n mid = (mid + Math.imul(ah1, bl7)) | 0;\n hi = (hi + Math.imul(ah1, bh7)) | 0;\n lo = (lo + Math.imul(al0, bl8)) | 0;\n mid = (mid + Math.imul(al0, bh8)) | 0;\n mid = (mid + Math.imul(ah0, bl8)) | 0;\n hi = (hi + Math.imul(ah0, bh8)) | 0;\n var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n w8 &= 0x3ffffff;\n /* k = 9 */\n lo = Math.imul(al9, bl0);\n mid = Math.imul(al9, bh0);\n mid = (mid + Math.imul(ah9, bl0)) | 0;\n hi = Math.imul(ah9, bh0);\n lo = (lo + Math.imul(al8, bl1)) | 0;\n mid = (mid + Math.imul(al8, bh1)) | 0;\n mid = (mid + Math.imul(ah8, bl1)) | 0;\n hi = (hi + Math.imul(ah8, bh1)) | 0;\n lo = (lo + Math.imul(al7, bl2)) | 0;\n mid = (mid + Math.imul(al7, bh2)) | 0;\n mid = (mid + Math.imul(ah7, bl2)) | 0;\n hi = (hi + Math.imul(ah7, bh2)) | 0;\n lo = (lo + Math.imul(al6, bl3)) | 0;\n mid = (mid + Math.imul(al6, bh3)) | 0;\n mid = (mid + Math.imul(ah6, bl3)) | 0;\n hi = (hi + Math.imul(ah6, bh3)) | 0;\n lo = (lo + Math.imul(al5, bl4)) | 0;\n mid = (mid + Math.imul(al5, bh4)) | 0;\n mid = (mid + Math.imul(ah5, bl4)) | 0;\n hi = (hi + Math.imul(ah5, bh4)) | 0;\n lo = (lo + Math.imul(al4, bl5)) | 0;\n mid = (mid + Math.imul(al4, bh5)) | 0;\n mid = (mid + Math.imul(ah4, bl5)) | 0;\n hi = (hi + Math.imul(ah4, bh5)) | 0;\n lo = (lo + Math.imul(al3, bl6)) | 0;\n mid = (mid + Math.imul(al3, bh6)) | 0;\n mid = (mid + Math.imul(ah3, bl6)) | 0;\n hi = (hi + Math.imul(ah3, bh6)) | 0;\n lo = (lo + Math.imul(al2, bl7)) | 0;\n mid = (mid + Math.imul(al2, bh7)) | 0;\n mid = (mid + Math.imul(ah2, bl7)) | 0;\n hi = (hi + Math.imul(ah2, bh7)) | 0;\n lo = (lo + Math.imul(al1, bl8)) | 0;\n mid = (mid + Math.imul(al1, bh8)) | 0;\n mid = (mid + Math.imul(ah1, bl8)) | 0;\n hi = (hi + Math.imul(ah1, bh8)) | 0;\n lo = (lo + Math.imul(al0, bl9)) | 0;\n mid = (mid + Math.imul(al0, bh9)) | 0;\n mid = (mid + Math.imul(ah0, bl9)) | 0;\n hi = (hi + Math.imul(ah0, bh9)) | 0;\n var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n w9 &= 0x3ffffff;\n /* k = 10 */\n lo = Math.imul(al9, bl1);\n mid = Math.imul(al9, bh1);\n mid = (mid + Math.imul(ah9, bl1)) | 0;\n hi = Math.imul(ah9, bh1);\n lo = (lo + Math.imul(al8, bl2)) | 0;\n mid = (mid + Math.imul(al8, bh2)) | 0;\n mid = (mid + Math.imul(ah8, bl2)) | 0;\n hi = (hi + Math.imul(ah8, bh2)) | 0;\n lo = (lo + Math.imul(al7, bl3)) | 0;\n mid = (mid + Math.imul(al7, bh3)) | 0;\n mid = (mid + Math.imul(ah7, bl3)) | 0;\n hi = (hi + Math.imul(ah7, bh3)) | 0;\n lo = (lo + Math.imul(al6, bl4)) | 0;\n mid = (mid + Math.imul(al6, bh4)) | 0;\n mid = (mid + Math.imul(ah6, bl4)) | 0;\n hi = (hi + Math.imul(ah6, bh4)) | 0;\n lo = (lo + Math.imul(al5, bl5)) | 0;\n mid = (mid + Math.imul(al5, bh5)) | 0;\n mid = (mid + Math.imul(ah5, bl5)) | 0;\n hi = (hi + Math.imul(ah5, bh5)) | 0;\n lo = (lo + Math.imul(al4, bl6)) | 0;\n mid = (mid + Math.imul(al4, bh6)) | 0;\n mid = (mid + Math.imul(ah4, bl6)) | 0;\n hi = (hi + Math.imul(ah4, bh6)) | 0;\n lo = (lo + Math.imul(al3, bl7)) | 0;\n mid = (mid + Math.imul(al3, bh7)) | 0;\n mid = (mid + Math.imul(ah3, bl7)) | 0;\n hi = (hi + Math.imul(ah3, bh7)) | 0;\n lo = (lo + Math.imul(al2, bl8)) | 0;\n mid = (mid + Math.imul(al2, bh8)) | 0;\n mid = (mid + Math.imul(ah2, bl8)) | 0;\n hi = (hi + Math.imul(ah2, bh8)) | 0;\n lo = (lo + Math.imul(al1, bl9)) | 0;\n mid = (mid + Math.imul(al1, bh9)) | 0;\n mid = (mid + Math.imul(ah1, bl9)) | 0;\n hi = (hi + Math.imul(ah1, bh9)) | 0;\n var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n w10 &= 0x3ffffff;\n /* k = 11 */\n lo = Math.imul(al9, bl2);\n mid = Math.imul(al9, bh2);\n mid = (mid + Math.imul(ah9, bl2)) | 0;\n hi = Math.imul(ah9, bh2);\n lo = (lo + Math.imul(al8, bl3)) | 0;\n mid = (mid + Math.imul(al8, bh3)) | 0;\n mid = (mid + Math.imul(ah8, bl3)) | 0;\n hi = (hi + Math.imul(ah8, bh3)) | 0;\n lo = (lo + Math.imul(al7, bl4)) | 0;\n mid = (mid + Math.imul(al7, bh4)) | 0;\n mid = (mid + Math.imul(ah7, bl4)) | 0;\n hi = (hi + Math.imul(ah7, bh4)) | 0;\n lo = (lo + Math.imul(al6, bl5)) | 0;\n mid = (mid + Math.imul(al6, bh5)) | 0;\n mid = (mid + Math.imul(ah6, bl5)) | 0;\n hi = (hi + Math.imul(ah6, bh5)) | 0;\n lo = (lo + Math.imul(al5, bl6)) | 0;\n mid = (mid + Math.imul(al5, bh6)) | 0;\n mid = (mid + Math.imul(ah5, bl6)) | 0;\n hi = (hi + Math.imul(ah5, bh6)) | 0;\n lo = (lo + Math.imul(al4, bl7)) | 0;\n mid = (mid + Math.imul(al4, bh7)) | 0;\n mid = (mid + Math.imul(ah4, bl7)) | 0;\n hi = (hi + Math.imul(ah4, bh7)) | 0;\n lo = (lo + Math.imul(al3, bl8)) | 0;\n mid = (mid + Math.imul(al3, bh8)) | 0;\n mid = (mid + Math.imul(ah3, bl8)) | 0;\n hi = (hi + Math.imul(ah3, bh8)) | 0;\n lo = (lo + Math.imul(al2, bl9)) | 0;\n mid = (mid + Math.imul(al2, bh9)) | 0;\n mid = (mid + Math.imul(ah2, bl9)) | 0;\n hi = (hi + Math.imul(ah2, bh9)) | 0;\n var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n w11 &= 0x3ffffff;\n /* k = 12 */\n lo = Math.imul(al9, bl3);\n mid = Math.imul(al9, bh3);\n mid = (mid + Math.imul(ah9, bl3)) | 0;\n hi = Math.imul(ah9, bh3);\n lo = (lo + Math.imul(al8, bl4)) | 0;\n mid = (mid + Math.imul(al8, bh4)) | 0;\n mid = (mid + Math.imul(ah8, bl4)) | 0;\n hi = (hi + Math.imul(ah8, bh4)) | 0;\n lo = (lo + Math.imul(al7, bl5)) | 0;\n mid = (mid + Math.imul(al7, bh5)) | 0;\n mid = (mid + Math.imul(ah7, bl5)) | 0;\n hi = (hi + Math.imul(ah7, bh5)) | 0;\n lo = (lo + Math.imul(al6, bl6)) | 0;\n mid = (mid + Math.imul(al6, bh6)) | 0;\n mid = (mid + Math.imul(ah6, bl6)) | 0;\n hi = (hi + Math.imul(ah6, bh6)) | 0;\n lo = (lo + Math.imul(al5, bl7)) | 0;\n mid = (mid + Math.imul(al5, bh7)) | 0;\n mid = (mid + Math.imul(ah5, bl7)) | 0;\n hi = (hi + Math.imul(ah5, bh7)) | 0;\n lo = (lo + Math.imul(al4, bl8)) | 0;\n mid = (mid + Math.imul(al4, bh8)) | 0;\n mid = (mid + Math.imul(ah4, bl8)) | 0;\n hi = (hi + Math.imul(ah4, bh8)) | 0;\n lo = (lo + Math.imul(al3, bl9)) | 0;\n mid = (mid + Math.imul(al3, bh9)) | 0;\n mid = (mid + Math.imul(ah3, bl9)) | 0;\n hi = (hi + Math.imul(ah3, bh9)) | 0;\n var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n w12 &= 0x3ffffff;\n /* k = 13 */\n lo = Math.imul(al9, bl4);\n mid = Math.imul(al9, bh4);\n mid = (mid + Math.imul(ah9, bl4)) | 0;\n hi = Math.imul(ah9, bh4);\n lo = (lo + Math.imul(al8, bl5)) | 0;\n mid = (mid + Math.imul(al8, bh5)) | 0;\n mid = (mid + Math.imul(ah8, bl5)) | 0;\n hi = (hi + Math.imul(ah8, bh5)) | 0;\n lo = (lo + Math.imul(al7, bl6)) | 0;\n mid = (mid + Math.imul(al7, bh6)) | 0;\n mid = (mid + Math.imul(ah7, bl6)) | 0;\n hi = (hi + Math.imul(ah7, bh6)) | 0;\n lo = (lo + Math.imul(al6, bl7)) | 0;\n mid = (mid + Math.imul(al6, bh7)) | 0;\n mid = (mid + Math.imul(ah6, bl7)) | 0;\n hi = (hi + Math.imul(ah6, bh7)) | 0;\n lo = (lo + Math.imul(al5, bl8)) | 0;\n mid = (mid + Math.imul(al5, bh8)) | 0;\n mid = (mid + Math.imul(ah5, bl8)) | 0;\n hi = (hi + Math.imul(ah5, bh8)) | 0;\n lo = (lo + Math.imul(al4, bl9)) | 0;\n mid = (mid + Math.imul(al4, bh9)) | 0;\n mid = (mid + Math.imul(ah4, bl9)) | 0;\n hi = (hi + Math.imul(ah4, bh9)) | 0;\n var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n w13 &= 0x3ffffff;\n /* k = 14 */\n lo = Math.imul(al9, bl5);\n mid = Math.imul(al9, bh5);\n mid = (mid + Math.imul(ah9, bl5)) | 0;\n hi = Math.imul(ah9, bh5);\n lo = (lo + Math.imul(al8, bl6)) | 0;\n mid = (mid + Math.imul(al8, bh6)) | 0;\n mid = (mid + Math.imul(ah8, bl6)) | 0;\n hi = (hi + Math.imul(ah8, bh6)) | 0;\n lo = (lo + Math.imul(al7, bl7)) | 0;\n mid = (mid + Math.imul(al7, bh7)) | 0;\n mid = (mid + Math.imul(ah7, bl7)) | 0;\n hi = (hi + Math.imul(ah7, bh7)) | 0;\n lo = (lo + Math.imul(al6, bl8)) | 0;\n mid = (mid + Math.imul(al6, bh8)) | 0;\n mid = (mid + Math.imul(ah6, bl8)) | 0;\n hi = (hi + Math.imul(ah6, bh8)) | 0;\n lo = (lo + Math.imul(al5, bl9)) | 0;\n mid = (mid + Math.imul(al5, bh9)) | 0;\n mid = (mid + Math.imul(ah5, bl9)) | 0;\n hi = (hi + Math.imul(ah5, bh9)) | 0;\n var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n w14 &= 0x3ffffff;\n /* k = 15 */\n lo = Math.imul(al9, bl6);\n mid = Math.imul(al9, bh6);\n mid = (mid + Math.imul(ah9, bl6)) | 0;\n hi = Math.imul(ah9, bh6);\n lo = (lo + Math.imul(al8, bl7)) | 0;\n mid = (mid + Math.imul(al8, bh7)) | 0;\n mid = (mid + Math.imul(ah8, bl7)) | 0;\n hi = (hi + Math.imul(ah8, bh7)) | 0;\n lo = (lo + Math.imul(al7, bl8)) | 0;\n mid = (mid + Math.imul(al7, bh8)) | 0;\n mid = (mid + Math.imul(ah7, bl8)) | 0;\n hi = (hi + Math.imul(ah7, bh8)) | 0;\n lo = (lo + Math.imul(al6, bl9)) | 0;\n mid = (mid + Math.imul(al6, bh9)) | 0;\n mid = (mid + Math.imul(ah6, bl9)) | 0;\n hi = (hi + Math.imul(ah6, bh9)) | 0;\n var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n w15 &= 0x3ffffff;\n /* k = 16 */\n lo = Math.imul(al9, bl7);\n mid = Math.imul(al9, bh7);\n mid = (mid + Math.imul(ah9, bl7)) | 0;\n hi = Math.imul(ah9, bh7);\n lo = (lo + Math.imul(al8, bl8)) | 0;\n mid = (mid + Math.imul(al8, bh8)) | 0;\n mid = (mid + Math.imul(ah8, bl8)) | 0;\n hi = (hi + Math.imul(ah8, bh8)) | 0;\n lo = (lo + Math.imul(al7, bl9)) | 0;\n mid = (mid + Math.imul(al7, bh9)) | 0;\n mid = (mid + Math.imul(ah7, bl9)) | 0;\n hi = (hi + Math.imul(ah7, bh9)) | 0;\n var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n w16 &= 0x3ffffff;\n /* k = 17 */\n lo = Math.imul(al9, bl8);\n mid = Math.imul(al9, bh8);\n mid = (mid + Math.imul(ah9, bl8)) | 0;\n hi = Math.imul(ah9, bh8);\n lo = (lo + Math.imul(al8, bl9)) | 0;\n mid = (mid + Math.imul(al8, bh9)) | 0;\n mid = (mid + Math.imul(ah8, bl9)) | 0;\n hi = (hi + Math.imul(ah8, bh9)) | 0;\n var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n w17 &= 0x3ffffff;\n /* k = 18 */\n lo = Math.imul(al9, bl9);\n mid = Math.imul(al9, bh9);\n mid = (mid + Math.imul(ah9, bl9)) | 0;\n hi = Math.imul(ah9, bh9);\n var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n w18 &= 0x3ffffff;\n o[0] = w0;\n o[1] = w1;\n o[2] = w2;\n o[3] = w3;\n o[4] = w4;\n o[5] = w5;\n o[6] = w6;\n o[7] = w7;\n o[8] = w8;\n o[9] = w9;\n o[10] = w10;\n o[11] = w11;\n o[12] = w12;\n o[13] = w13;\n o[14] = w14;\n o[15] = w15;\n o[16] = w16;\n o[17] = w17;\n o[18] = w18;\n if (c !== 0) {\n o[19] = c;\n out.length++;\n }\n return out;\n };\n\n // Polyfill comb\n if (!Math.imul) {\n comb10MulTo = smallMulTo;\n }\n\n function bigMulTo (self, num, out) {\n out.negative = num.negative ^ self.negative;\n out.length = self.length + num.length;\n\n var carry = 0;\n var hncarry = 0;\n for (var k = 0; k < out.length - 1; k++) {\n // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n // note that ncarry could be >= 0x3ffffff\n var ncarry = hncarry;\n hncarry = 0;\n var rword = carry & 0x3ffffff;\n var maxJ = Math.min(k, num.length - 1);\n for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n var i = k - j;\n var a = self.words[i] | 0;\n var b = num.words[j] | 0;\n var r = a * b;\n\n var lo = r & 0x3ffffff;\n ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n lo = (lo + rword) | 0;\n rword = lo & 0x3ffffff;\n ncarry = (ncarry + (lo >>> 26)) | 0;\n\n hncarry += ncarry >>> 26;\n ncarry &= 0x3ffffff;\n }\n out.words[k] = rword;\n carry = ncarry;\n ncarry = hncarry;\n }\n if (carry !== 0) {\n out.words[k] = carry;\n } else {\n out.length--;\n }\n\n return out.strip();\n }\n\n function jumboMulTo (self, num, out) {\n var fftm = new FFTM();\n return fftm.mulp(self, num, out);\n }\n\n BN.prototype.mulTo = function mulTo (num, out) {\n var res;\n var len = this.length + num.length;\n if (this.length === 10 && num.length === 10) {\n res = comb10MulTo(this, num, out);\n } else if (len < 63) {\n res = smallMulTo(this, num, out);\n } else if (len < 1024) {\n res = bigMulTo(this, num, out);\n } else {\n res = jumboMulTo(this, num, out);\n }\n\n return res;\n };\n\n // Cooley-Tukey algorithm for FFT\n // slightly revisited to rely on looping instead of recursion\n\n function FFTM (x, y) {\n this.x = x;\n this.y = y;\n }\n\n FFTM.prototype.makeRBT = function makeRBT (N) {\n var t = new Array(N);\n var l = BN.prototype._countBits(N) - 1;\n for (var i = 0; i < N; i++) {\n t[i] = this.revBin(i, l, N);\n }\n\n return t;\n };\n\n // Returns binary-reversed representation of `x`\n FFTM.prototype.revBin = function revBin (x, l, N) {\n if (x === 0 || x === N - 1) return x;\n\n var rb = 0;\n for (var i = 0; i < l; i++) {\n rb |= (x & 1) << (l - i - 1);\n x >>= 1;\n }\n\n return rb;\n };\n\n // Performs \"tweedling\" phase, therefore 'emulating'\n // behaviour of the recursive algorithm\n FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n for (var i = 0; i < N; i++) {\n rtws[i] = rws[rbt[i]];\n itws[i] = iws[rbt[i]];\n }\n };\n\n FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n this.permute(rbt, rws, iws, rtws, itws, N);\n\n for (var s = 1; s < N; s <<= 1) {\n var l = s << 1;\n\n var rtwdf = Math.cos(2 * Math.PI / l);\n var itwdf = Math.sin(2 * Math.PI / l);\n\n for (var p = 0; p < N; p += l) {\n var rtwdf_ = rtwdf;\n var itwdf_ = itwdf;\n\n for (var j = 0; j < s; j++) {\n var re = rtws[p + j];\n var ie = itws[p + j];\n\n var ro = rtws[p + j + s];\n var io = itws[p + j + s];\n\n var rx = rtwdf_ * ro - itwdf_ * io;\n\n io = rtwdf_ * io + itwdf_ * ro;\n ro = rx;\n\n rtws[p + j] = re + ro;\n itws[p + j] = ie + io;\n\n rtws[p + j + s] = re - ro;\n itws[p + j + s] = ie - io;\n\n /* jshint maxdepth : false */\n if (j !== l) {\n rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n rtwdf_ = rx;\n }\n }\n }\n }\n };\n\n FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n var N = Math.max(m, n) | 1;\n var odd = N & 1;\n var i = 0;\n for (N = N / 2 | 0; N; N = N >>> 1) {\n i++;\n }\n\n return 1 << i + 1 + odd;\n };\n\n FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n if (N <= 1) return;\n\n for (var i = 0; i < N / 2; i++) {\n var t = rws[i];\n\n rws[i] = rws[N - i - 1];\n rws[N - i - 1] = t;\n\n t = iws[i];\n\n iws[i] = -iws[N - i - 1];\n iws[N - i - 1] = -t;\n }\n };\n\n FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n var carry = 0;\n for (var i = 0; i < N / 2; i++) {\n var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n Math.round(ws[2 * i] / N) +\n carry;\n\n ws[i] = w & 0x3ffffff;\n\n if (w < 0x4000000) {\n carry = 0;\n } else {\n carry = w / 0x4000000 | 0;\n }\n }\n\n return ws;\n };\n\n FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n var carry = 0;\n for (var i = 0; i < len; i++) {\n carry = carry + (ws[i] | 0);\n\n rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n }\n\n // Pad with zeroes\n for (i = 2 * len; i < N; ++i) {\n rws[i] = 0;\n }\n\n assert(carry === 0);\n assert((carry & ~0x1fff) === 0);\n };\n\n FFTM.prototype.stub = function stub (N) {\n var ph = new Array(N);\n for (var i = 0; i < N; i++) {\n ph[i] = 0;\n }\n\n return ph;\n };\n\n FFTM.prototype.mulp = function mulp (x, y, out) {\n var N = 2 * this.guessLen13b(x.length, y.length);\n\n var rbt = this.makeRBT(N);\n\n var _ = this.stub(N);\n\n var rws = new Array(N);\n var rwst = new Array(N);\n var iwst = new Array(N);\n\n var nrws = new Array(N);\n var nrwst = new Array(N);\n var niwst = new Array(N);\n\n var rmws = out.words;\n rmws.length = N;\n\n this.convert13b(x.words, x.length, rws, N);\n this.convert13b(y.words, y.length, nrws, N);\n\n this.transform(rws, _, rwst, iwst, N, rbt);\n this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n for (var i = 0; i < N; i++) {\n var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n rwst[i] = rx;\n }\n\n this.conjugate(rwst, iwst, N);\n this.transform(rwst, iwst, rmws, _, N, rbt);\n this.conjugate(rmws, _, N);\n this.normalize13b(rmws, N);\n\n out.negative = x.negative ^ y.negative;\n out.length = x.length + y.length;\n return out.strip();\n };\n\n // Multiply `this` by `num`\n BN.prototype.mul = function mul (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return this.mulTo(num, out);\n };\n\n // Multiply employing FFT\n BN.prototype.mulf = function mulf (num) {\n var out = new BN(null);\n out.words = new Array(this.length + num.length);\n return jumboMulTo(this, num, out);\n };\n\n // In-place Multiplication\n BN.prototype.imul = function imul (num) {\n return this.clone().mulTo(num, this);\n };\n\n BN.prototype.imuln = function imuln (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n\n // Carry\n var carry = 0;\n for (var i = 0; i < this.length; i++) {\n var w = (this.words[i] | 0) * num;\n var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n carry >>= 26;\n carry += (w / 0x4000000) | 0;\n // NOTE: lo is 27bit maximum\n carry += lo >>> 26;\n this.words[i] = lo & 0x3ffffff;\n }\n\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n this.length = num === 0 ? 1 : this.length;\n\n return this;\n };\n\n BN.prototype.muln = function muln (num) {\n return this.clone().imuln(num);\n };\n\n // `this` * `this`\n BN.prototype.sqr = function sqr () {\n return this.mul(this);\n };\n\n // `this` * `this` in-place\n BN.prototype.isqr = function isqr () {\n return this.imul(this.clone());\n };\n\n // Math.pow(`this`, `num`)\n BN.prototype.pow = function pow (num) {\n var w = toBitArray(num);\n if (w.length === 0) return new BN(1);\n\n // Skip leading zeroes\n var res = this;\n for (var i = 0; i < w.length; i++, res = res.sqr()) {\n if (w[i] !== 0) break;\n }\n\n if (++i < w.length) {\n for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n if (w[i] === 0) continue;\n\n res = res.mul(q);\n }\n }\n\n return res;\n };\n\n // Shift-left in-place\n BN.prototype.iushln = function iushln (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n var i;\n\n if (r !== 0) {\n var carry = 0;\n\n for (i = 0; i < this.length; i++) {\n var newCarry = this.words[i] & carryMask;\n var c = ((this.words[i] | 0) - newCarry) << r;\n this.words[i] = c | carry;\n carry = newCarry >>> (26 - r);\n }\n\n if (carry) {\n this.words[i] = carry;\n this.length++;\n }\n }\n\n if (s !== 0) {\n for (i = this.length - 1; i >= 0; i--) {\n this.words[i + s] = this.words[i];\n }\n\n for (i = 0; i < s; i++) {\n this.words[i] = 0;\n }\n\n this.length += s;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishln = function ishln (bits) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushln(bits);\n };\n\n // Shift-right in-place\n // NOTE: `hint` is a lowest bit before trailing zeroes\n // NOTE: if `extended` is present - it will be filled with destroyed bits\n BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n assert(typeof bits === 'number' && bits >= 0);\n var h;\n if (hint) {\n h = (hint - (hint % 26)) / 26;\n } else {\n h = 0;\n }\n\n var r = bits % 26;\n var s = Math.min((bits - r) / 26, this.length);\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n var maskedWords = extended;\n\n h -= s;\n h = Math.max(0, h);\n\n // Extended mode, copy masked part\n if (maskedWords) {\n for (var i = 0; i < s; i++) {\n maskedWords.words[i] = this.words[i];\n }\n maskedWords.length = s;\n }\n\n if (s === 0) {\n // No-op, we should not move anything at all\n } else if (this.length > s) {\n this.length -= s;\n for (i = 0; i < this.length; i++) {\n this.words[i] = this.words[i + s];\n }\n } else {\n this.words[0] = 0;\n this.length = 1;\n }\n\n var carry = 0;\n for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n var word = this.words[i] | 0;\n this.words[i] = (carry << (26 - r)) | (word >>> r);\n carry = word & mask;\n }\n\n // Push carried bits as a mask\n if (maskedWords && carry !== 0) {\n maskedWords.words[maskedWords.length++] = carry;\n }\n\n if (this.length === 0) {\n this.words[0] = 0;\n this.length = 1;\n }\n\n return this.strip();\n };\n\n BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n // TODO(indutny): implement me\n assert(this.negative === 0);\n return this.iushrn(bits, hint, extended);\n };\n\n // Shift-left\n BN.prototype.shln = function shln (bits) {\n return this.clone().ishln(bits);\n };\n\n BN.prototype.ushln = function ushln (bits) {\n return this.clone().iushln(bits);\n };\n\n // Shift-right\n BN.prototype.shrn = function shrn (bits) {\n return this.clone().ishrn(bits);\n };\n\n BN.prototype.ushrn = function ushrn (bits) {\n return this.clone().iushrn(bits);\n };\n\n // Test if n bit is set\n BN.prototype.testn = function testn (bit) {\n assert(typeof bit === 'number' && bit >= 0);\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) return false;\n\n // Check bit and return\n var w = this.words[s];\n\n return !!(w & q);\n };\n\n // Return only lowers bits of number (in-place)\n BN.prototype.imaskn = function imaskn (bits) {\n assert(typeof bits === 'number' && bits >= 0);\n var r = bits % 26;\n var s = (bits - r) / 26;\n\n assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n if (this.length <= s) {\n return this;\n }\n\n if (r !== 0) {\n s++;\n }\n this.length = Math.min(s, this.length);\n\n if (r !== 0) {\n var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n this.words[this.length - 1] &= mask;\n }\n\n return this.strip();\n };\n\n // Return only lowers bits of number\n BN.prototype.maskn = function maskn (bits) {\n return this.clone().imaskn(bits);\n };\n\n // Add plain number `num` to `this`\n BN.prototype.iaddn = function iaddn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.isubn(-num);\n\n // Possible sign change\n if (this.negative !== 0) {\n if (this.length === 1 && (this.words[0] | 0) < num) {\n this.words[0] = num - (this.words[0] | 0);\n this.negative = 0;\n return this;\n }\n\n this.negative = 0;\n this.isubn(num);\n this.negative = 1;\n return this;\n }\n\n // Add without checks\n return this._iaddn(num);\n };\n\n BN.prototype._iaddn = function _iaddn (num) {\n this.words[0] += num;\n\n // Carry\n for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n this.words[i] -= 0x4000000;\n if (i === this.length - 1) {\n this.words[i + 1] = 1;\n } else {\n this.words[i + 1]++;\n }\n }\n this.length = Math.max(this.length, i + 1);\n\n return this;\n };\n\n // Subtract plain number `num` from `this`\n BN.prototype.isubn = function isubn (num) {\n assert(typeof num === 'number');\n assert(num < 0x4000000);\n if (num < 0) return this.iaddn(-num);\n\n if (this.negative !== 0) {\n this.negative = 0;\n this.iaddn(num);\n this.negative = 1;\n return this;\n }\n\n this.words[0] -= num;\n\n if (this.length === 1 && this.words[0] < 0) {\n this.words[0] = -this.words[0];\n this.negative = 1;\n } else {\n // Carry\n for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n this.words[i] += 0x4000000;\n this.words[i + 1] -= 1;\n }\n }\n\n return this.strip();\n };\n\n BN.prototype.addn = function addn (num) {\n return this.clone().iaddn(num);\n };\n\n BN.prototype.subn = function subn (num) {\n return this.clone().isubn(num);\n };\n\n BN.prototype.iabs = function iabs () {\n this.negative = 0;\n\n return this;\n };\n\n BN.prototype.abs = function abs () {\n return this.clone().iabs();\n };\n\n BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n var len = num.length + shift;\n var i;\n\n this._expand(len);\n\n var w;\n var carry = 0;\n for (i = 0; i < num.length; i++) {\n w = (this.words[i + shift] | 0) + carry;\n var right = (num.words[i] | 0) * mul;\n w -= right & 0x3ffffff;\n carry = (w >> 26) - ((right / 0x4000000) | 0);\n this.words[i + shift] = w & 0x3ffffff;\n }\n for (; i < this.length - shift; i++) {\n w = (this.words[i + shift] | 0) + carry;\n carry = w >> 26;\n this.words[i + shift] = w & 0x3ffffff;\n }\n\n if (carry === 0) return this.strip();\n\n // Subtraction overflow\n assert(carry === -1);\n carry = 0;\n for (i = 0; i < this.length; i++) {\n w = -(this.words[i] | 0) + carry;\n carry = w >> 26;\n this.words[i] = w & 0x3ffffff;\n }\n this.negative = 1;\n\n return this.strip();\n };\n\n BN.prototype._wordDiv = function _wordDiv (num, mode) {\n var shift = this.length - num.length;\n\n var a = this.clone();\n var b = num;\n\n // Normalize\n var bhi = b.words[b.length - 1] | 0;\n var bhiBits = this._countBits(bhi);\n shift = 26 - bhiBits;\n if (shift !== 0) {\n b = b.ushln(shift);\n a.iushln(shift);\n bhi = b.words[b.length - 1] | 0;\n }\n\n // Initialize quotient\n var m = a.length - b.length;\n var q;\n\n if (mode !== 'mod') {\n q = new BN(null);\n q.length = m + 1;\n q.words = new Array(q.length);\n for (var i = 0; i < q.length; i++) {\n q.words[i] = 0;\n }\n }\n\n var diff = a.clone()._ishlnsubmul(b, 1, m);\n if (diff.negative === 0) {\n a = diff;\n if (q) {\n q.words[m] = 1;\n }\n }\n\n for (var j = m - 1; j >= 0; j--) {\n var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n (a.words[b.length + j - 1] | 0);\n\n // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n // (0x7ffffff)\n qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n a._ishlnsubmul(b, qj, j);\n while (a.negative !== 0) {\n qj--;\n a.negative = 0;\n a._ishlnsubmul(b, 1, j);\n if (!a.isZero()) {\n a.negative ^= 1;\n }\n }\n if (q) {\n q.words[j] = qj;\n }\n }\n if (q) {\n q.strip();\n }\n a.strip();\n\n // Denormalize\n if (mode !== 'div' && shift !== 0) {\n a.iushrn(shift);\n }\n\n return {\n div: q || null,\n mod: a\n };\n };\n\n // NOTE: 1) `mode` can be set to `mod` to request mod only,\n // to `div` to request div only, or be absent to\n // request both div & mod\n // 2) `positive` is true if unsigned mod is requested\n BN.prototype.divmod = function divmod (num, mode, positive) {\n assert(!num.isZero());\n\n if (this.isZero()) {\n return {\n div: new BN(0),\n mod: new BN(0)\n };\n }\n\n var div, mod, res;\n if (this.negative !== 0 && num.negative === 0) {\n res = this.neg().divmod(num, mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.iadd(num);\n }\n }\n\n return {\n div: div,\n mod: mod\n };\n }\n\n if (this.negative === 0 && num.negative !== 0) {\n res = this.divmod(num.neg(), mode);\n\n if (mode !== 'mod') {\n div = res.div.neg();\n }\n\n return {\n div: div,\n mod: res.mod\n };\n }\n\n if ((this.negative & num.negative) !== 0) {\n res = this.neg().divmod(num.neg(), mode);\n\n if (mode !== 'div') {\n mod = res.mod.neg();\n if (positive && mod.negative !== 0) {\n mod.isub(num);\n }\n }\n\n return {\n div: res.div,\n mod: mod\n };\n }\n\n // Both numbers are positive at this point\n\n // Strip both numbers to approximate shift value\n if (num.length > this.length || this.cmp(num) < 0) {\n return {\n div: new BN(0),\n mod: this\n };\n }\n\n // Very short reduction\n if (num.length === 1) {\n if (mode === 'div') {\n return {\n div: this.divn(num.words[0]),\n mod: null\n };\n }\n\n if (mode === 'mod') {\n return {\n div: null,\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return {\n div: this.divn(num.words[0]),\n mod: new BN(this.modn(num.words[0]))\n };\n }\n\n return this._wordDiv(num, mode);\n };\n\n // Find `this` / `num`\n BN.prototype.div = function div (num) {\n return this.divmod(num, 'div', false).div;\n };\n\n // Find `this` % `num`\n BN.prototype.mod = function mod (num) {\n return this.divmod(num, 'mod', false).mod;\n };\n\n BN.prototype.umod = function umod (num) {\n return this.divmod(num, 'mod', true).mod;\n };\n\n // Find Round(`this` / `num`)\n BN.prototype.divRound = function divRound (num) {\n var dm = this.divmod(num);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n var half = num.ushrn(1);\n var r2 = num.andln(1);\n var cmp = mod.cmp(half);\n\n // Round down\n if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;\n\n // Round up\n return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n };\n\n BN.prototype.modn = function modn (num) {\n assert(num <= 0x3ffffff);\n var p = (1 << 26) % num;\n\n var acc = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n acc = (p * acc + (this.words[i] | 0)) % num;\n }\n\n return acc;\n };\n\n // In-place division by number\n BN.prototype.idivn = function idivn (num) {\n assert(num <= 0x3ffffff);\n\n var carry = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var w = (this.words[i] | 0) + carry * 0x4000000;\n this.words[i] = (w / num) | 0;\n carry = w % num;\n }\n\n return this.strip();\n };\n\n BN.prototype.divn = function divn (num) {\n return this.clone().idivn(num);\n };\n\n BN.prototype.egcd = function egcd (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var x = this;\n var y = p.clone();\n\n if (x.negative !== 0) {\n x = x.umod(p);\n } else {\n x = x.clone();\n }\n\n // A * x + B * y = x\n var A = new BN(1);\n var B = new BN(0);\n\n // C * x + D * y = y\n var C = new BN(0);\n var D = new BN(1);\n\n var g = 0;\n\n while (x.isEven() && y.isEven()) {\n x.iushrn(1);\n y.iushrn(1);\n ++g;\n }\n\n var yp = y.clone();\n var xp = x.clone();\n\n while (!x.isZero()) {\n for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n x.iushrn(i);\n while (i-- > 0) {\n if (A.isOdd() || B.isOdd()) {\n A.iadd(yp);\n B.isub(xp);\n }\n\n A.iushrn(1);\n B.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n y.iushrn(j);\n while (j-- > 0) {\n if (C.isOdd() || D.isOdd()) {\n C.iadd(yp);\n D.isub(xp);\n }\n\n C.iushrn(1);\n D.iushrn(1);\n }\n }\n\n if (x.cmp(y) >= 0) {\n x.isub(y);\n A.isub(C);\n B.isub(D);\n } else {\n y.isub(x);\n C.isub(A);\n D.isub(B);\n }\n }\n\n return {\n a: C,\n b: D,\n gcd: y.iushln(g)\n };\n };\n\n // This is reduced incarnation of the binary EEA\n // above, designated to invert members of the\n // _prime_ fields F(p) at a maximal speed\n BN.prototype._invmp = function _invmp (p) {\n assert(p.negative === 0);\n assert(!p.isZero());\n\n var a = this;\n var b = p.clone();\n\n if (a.negative !== 0) {\n a = a.umod(p);\n } else {\n a = a.clone();\n }\n\n var x1 = new BN(1);\n var x2 = new BN(0);\n\n var delta = b.clone();\n\n while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n if (i > 0) {\n a.iushrn(i);\n while (i-- > 0) {\n if (x1.isOdd()) {\n x1.iadd(delta);\n }\n\n x1.iushrn(1);\n }\n }\n\n for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n if (j > 0) {\n b.iushrn(j);\n while (j-- > 0) {\n if (x2.isOdd()) {\n x2.iadd(delta);\n }\n\n x2.iushrn(1);\n }\n }\n\n if (a.cmp(b) >= 0) {\n a.isub(b);\n x1.isub(x2);\n } else {\n b.isub(a);\n x2.isub(x1);\n }\n }\n\n var res;\n if (a.cmpn(1) === 0) {\n res = x1;\n } else {\n res = x2;\n }\n\n if (res.cmpn(0) < 0) {\n res.iadd(p);\n }\n\n return res;\n };\n\n BN.prototype.gcd = function gcd (num) {\n if (this.isZero()) return num.abs();\n if (num.isZero()) return this.abs();\n\n var a = this.clone();\n var b = num.clone();\n a.negative = 0;\n b.negative = 0;\n\n // Remove common factor of two\n for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n a.iushrn(1);\n b.iushrn(1);\n }\n\n do {\n while (a.isEven()) {\n a.iushrn(1);\n }\n while (b.isEven()) {\n b.iushrn(1);\n }\n\n var r = a.cmp(b);\n if (r < 0) {\n // Swap `a` and `b` to make `a` always bigger than `b`\n var t = a;\n a = b;\n b = t;\n } else if (r === 0 || b.cmpn(1) === 0) {\n break;\n }\n\n a.isub(b);\n } while (true);\n\n return b.iushln(shift);\n };\n\n // Invert number in the field F(num)\n BN.prototype.invm = function invm (num) {\n return this.egcd(num).a.umod(num);\n };\n\n BN.prototype.isEven = function isEven () {\n return (this.words[0] & 1) === 0;\n };\n\n BN.prototype.isOdd = function isOdd () {\n return (this.words[0] & 1) === 1;\n };\n\n // And first word and num\n BN.prototype.andln = function andln (num) {\n return this.words[0] & num;\n };\n\n // Increment at the bit position in-line\n BN.prototype.bincn = function bincn (bit) {\n assert(typeof bit === 'number');\n var r = bit % 26;\n var s = (bit - r) / 26;\n var q = 1 << r;\n\n // Fast case: bit is much higher than all existing words\n if (this.length <= s) {\n this._expand(s + 1);\n this.words[s] |= q;\n return this;\n }\n\n // Add bit and propagate, if needed\n var carry = q;\n for (var i = s; carry !== 0 && i < this.length; i++) {\n var w = this.words[i] | 0;\n w += carry;\n carry = w >>> 26;\n w &= 0x3ffffff;\n this.words[i] = w;\n }\n if (carry !== 0) {\n this.words[i] = carry;\n this.length++;\n }\n return this;\n };\n\n BN.prototype.isZero = function isZero () {\n return this.length === 1 && this.words[0] === 0;\n };\n\n BN.prototype.cmpn = function cmpn (num) {\n var negative = num < 0;\n\n if (this.negative !== 0 && !negative) return -1;\n if (this.negative === 0 && negative) return 1;\n\n this.strip();\n\n var res;\n if (this.length > 1) {\n res = 1;\n } else {\n if (negative) {\n num = -num;\n }\n\n assert(num <= 0x3ffffff, 'Number is too big');\n\n var w = this.words[0] | 0;\n res = w === num ? 0 : w < num ? -1 : 1;\n }\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Compare two numbers and return:\n // 1 - if `this` > `num`\n // 0 - if `this` == `num`\n // -1 - if `this` < `num`\n BN.prototype.cmp = function cmp (num) {\n if (this.negative !== 0 && num.negative === 0) return -1;\n if (this.negative === 0 && num.negative !== 0) return 1;\n\n var res = this.ucmp(num);\n if (this.negative !== 0) return -res | 0;\n return res;\n };\n\n // Unsigned comparison\n BN.prototype.ucmp = function ucmp (num) {\n // At this point both numbers have the same sign\n if (this.length > num.length) return 1;\n if (this.length < num.length) return -1;\n\n var res = 0;\n for (var i = this.length - 1; i >= 0; i--) {\n var a = this.words[i] | 0;\n var b = num.words[i] | 0;\n\n if (a === b) continue;\n if (a < b) {\n res = -1;\n } else if (a > b) {\n res = 1;\n }\n break;\n }\n return res;\n };\n\n BN.prototype.gtn = function gtn (num) {\n return this.cmpn(num) === 1;\n };\n\n BN.prototype.gt = function gt (num) {\n return this.cmp(num) === 1;\n };\n\n BN.prototype.gten = function gten (num) {\n return this.cmpn(num) >= 0;\n };\n\n BN.prototype.gte = function gte (num) {\n return this.cmp(num) >= 0;\n };\n\n BN.prototype.ltn = function ltn (num) {\n return this.cmpn(num) === -1;\n };\n\n BN.prototype.lt = function lt (num) {\n return this.cmp(num) === -1;\n };\n\n BN.prototype.lten = function lten (num) {\n return this.cmpn(num) <= 0;\n };\n\n BN.prototype.lte = function lte (num) {\n return this.cmp(num) <= 0;\n };\n\n BN.prototype.eqn = function eqn (num) {\n return this.cmpn(num) === 0;\n };\n\n BN.prototype.eq = function eq (num) {\n return this.cmp(num) === 0;\n };\n\n //\n // A reduce context, could be using montgomery or something better, depending\n // on the `m` itself.\n //\n BN.red = function red (num) {\n return new Red(num);\n };\n\n BN.prototype.toRed = function toRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n assert(this.negative === 0, 'red works only with positives');\n return ctx.convertTo(this)._forceRed(ctx);\n };\n\n BN.prototype.fromRed = function fromRed () {\n assert(this.red, 'fromRed works only with numbers in reduction context');\n return this.red.convertFrom(this);\n };\n\n BN.prototype._forceRed = function _forceRed (ctx) {\n this.red = ctx;\n return this;\n };\n\n BN.prototype.forceRed = function forceRed (ctx) {\n assert(!this.red, 'Already a number in reduction context');\n return this._forceRed(ctx);\n };\n\n BN.prototype.redAdd = function redAdd (num) {\n assert(this.red, 'redAdd works only with red numbers');\n return this.red.add(this, num);\n };\n\n BN.prototype.redIAdd = function redIAdd (num) {\n assert(this.red, 'redIAdd works only with red numbers');\n return this.red.iadd(this, num);\n };\n\n BN.prototype.redSub = function redSub (num) {\n assert(this.red, 'redSub works only with red numbers');\n return this.red.sub(this, num);\n };\n\n BN.prototype.redISub = function redISub (num) {\n assert(this.red, 'redISub works only with red numbers');\n return this.red.isub(this, num);\n };\n\n BN.prototype.redShl = function redShl (num) {\n assert(this.red, 'redShl works only with red numbers');\n return this.red.shl(this, num);\n };\n\n BN.prototype.redMul = function redMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.mul(this, num);\n };\n\n BN.prototype.redIMul = function redIMul (num) {\n assert(this.red, 'redMul works only with red numbers');\n this.red._verify2(this, num);\n return this.red.imul(this, num);\n };\n\n BN.prototype.redSqr = function redSqr () {\n assert(this.red, 'redSqr works only with red numbers');\n this.red._verify1(this);\n return this.red.sqr(this);\n };\n\n BN.prototype.redISqr = function redISqr () {\n assert(this.red, 'redISqr works only with red numbers');\n this.red._verify1(this);\n return this.red.isqr(this);\n };\n\n // Square root over p\n BN.prototype.redSqrt = function redSqrt () {\n assert(this.red, 'redSqrt works only with red numbers');\n this.red._verify1(this);\n return this.red.sqrt(this);\n };\n\n BN.prototype.redInvm = function redInvm () {\n assert(this.red, 'redInvm works only with red numbers');\n this.red._verify1(this);\n return this.red.invm(this);\n };\n\n // Return negative clone of `this` % `red modulo`\n BN.prototype.redNeg = function redNeg () {\n assert(this.red, 'redNeg works only with red numbers');\n this.red._verify1(this);\n return this.red.neg(this);\n };\n\n BN.prototype.redPow = function redPow (num) {\n assert(this.red && !num.red, 'redPow(normalNum)');\n this.red._verify1(this);\n return this.red.pow(this, num);\n };\n\n // Prime numbers with efficient reduction\n var primes = {\n k256: null,\n p224: null,\n p192: null,\n p25519: null\n };\n\n // Pseudo-Mersenne prime\n function MPrime (name, p) {\n // P = 2 ^ N - K\n this.name = name;\n this.p = new BN(p, 16);\n this.n = this.p.bitLength();\n this.k = new BN(1).iushln(this.n).isub(this.p);\n\n this.tmp = this._tmp();\n }\n\n MPrime.prototype._tmp = function _tmp () {\n var tmp = new BN(null);\n tmp.words = new Array(Math.ceil(this.n / 13));\n return tmp;\n };\n\n MPrime.prototype.ireduce = function ireduce (num) {\n // Assumes that `num` is less than `P^2`\n // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n var r = num;\n var rlen;\n\n do {\n this.split(r, this.tmp);\n r = this.imulK(r);\n r = r.iadd(this.tmp);\n rlen = r.bitLength();\n } while (rlen > this.n);\n\n var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n if (cmp === 0) {\n r.words[0] = 0;\n r.length = 1;\n } else if (cmp > 0) {\n r.isub(this.p);\n } else {\n if (r.strip !== undefined) {\n // r is BN v4 instance\n r.strip();\n } else {\n // r is BN v5 instance\n r._strip();\n }\n }\n\n return r;\n };\n\n MPrime.prototype.split = function split (input, out) {\n input.iushrn(this.n, 0, out);\n };\n\n MPrime.prototype.imulK = function imulK (num) {\n return num.imul(this.k);\n };\n\n function K256 () {\n MPrime.call(\n this,\n 'k256',\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n }\n inherits(K256, MPrime);\n\n K256.prototype.split = function split (input, output) {\n // 256 = 9 * 26 + 22\n var mask = 0x3fffff;\n\n var outLen = Math.min(input.length, 9);\n for (var i = 0; i < outLen; i++) {\n output.words[i] = input.words[i];\n }\n output.length = outLen;\n\n if (input.length <= 9) {\n input.words[0] = 0;\n input.length = 1;\n return;\n }\n\n // Shift by 9 limbs\n var prev = input.words[9];\n output.words[output.length++] = prev & mask;\n\n for (i = 10; i < input.length; i++) {\n var next = input.words[i] | 0;\n input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n prev = next;\n }\n prev >>>= 22;\n input.words[i - 10] = prev;\n if (prev === 0 && input.length > 10) {\n input.length -= 10;\n } else {\n input.length -= 9;\n }\n };\n\n K256.prototype.imulK = function imulK (num) {\n // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n num.words[num.length] = 0;\n num.words[num.length + 1] = 0;\n num.length += 2;\n\n // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n var lo = 0;\n for (var i = 0; i < num.length; i++) {\n var w = num.words[i] | 0;\n lo += w * 0x3d1;\n num.words[i] = lo & 0x3ffffff;\n lo = w * 0x40 + ((lo / 0x4000000) | 0);\n }\n\n // Fast length reduction\n if (num.words[num.length - 1] === 0) {\n num.length--;\n if (num.words[num.length - 1] === 0) {\n num.length--;\n }\n }\n return num;\n };\n\n function P224 () {\n MPrime.call(\n this,\n 'p224',\n 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n }\n inherits(P224, MPrime);\n\n function P192 () {\n MPrime.call(\n this,\n 'p192',\n 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n }\n inherits(P192, MPrime);\n\n function P25519 () {\n // 2 ^ 255 - 19\n MPrime.call(\n this,\n '25519',\n '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n }\n inherits(P25519, MPrime);\n\n P25519.prototype.imulK = function imulK (num) {\n // K = 0x13\n var carry = 0;\n for (var i = 0; i < num.length; i++) {\n var hi = (num.words[i] | 0) * 0x13 + carry;\n var lo = hi & 0x3ffffff;\n hi >>>= 26;\n\n num.words[i] = lo;\n carry = hi;\n }\n if (carry !== 0) {\n num.words[num.length++] = carry;\n }\n return num;\n };\n\n // Exported mostly for testing purposes, use plain name instead\n BN._prime = function prime (name) {\n // Cached version of prime\n if (primes[name]) return primes[name];\n\n var prime;\n if (name === 'k256') {\n prime = new K256();\n } else if (name === 'p224') {\n prime = new P224();\n } else if (name === 'p192') {\n prime = new P192();\n } else if (name === 'p25519') {\n prime = new P25519();\n } else {\n throw new Error('Unknown prime ' + name);\n }\n primes[name] = prime;\n\n return prime;\n };\n\n //\n // Base reduction engine\n //\n function Red (m) {\n if (typeof m === 'string') {\n var prime = BN._prime(m);\n this.m = prime.p;\n this.prime = prime;\n } else {\n assert(m.gtn(1), 'modulus must be greater than 1');\n this.m = m;\n this.prime = null;\n }\n }\n\n Red.prototype._verify1 = function _verify1 (a) {\n assert(a.negative === 0, 'red works only with positives');\n assert(a.red, 'red works only with red numbers');\n };\n\n Red.prototype._verify2 = function _verify2 (a, b) {\n assert((a.negative | b.negative) === 0, 'red works only with positives');\n assert(a.red && a.red === b.red,\n 'red works only with red numbers');\n };\n\n Red.prototype.imod = function imod (a) {\n if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n return a.umod(this.m)._forceRed(this);\n };\n\n Red.prototype.neg = function neg (a) {\n if (a.isZero()) {\n return a.clone();\n }\n\n return this.m.sub(a)._forceRed(this);\n };\n\n Red.prototype.add = function add (a, b) {\n this._verify2(a, b);\n\n var res = a.add(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.iadd = function iadd (a, b) {\n this._verify2(a, b);\n\n var res = a.iadd(b);\n if (res.cmp(this.m) >= 0) {\n res.isub(this.m);\n }\n return res;\n };\n\n Red.prototype.sub = function sub (a, b) {\n this._verify2(a, b);\n\n var res = a.sub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res._forceRed(this);\n };\n\n Red.prototype.isub = function isub (a, b) {\n this._verify2(a, b);\n\n var res = a.isub(b);\n if (res.cmpn(0) < 0) {\n res.iadd(this.m);\n }\n return res;\n };\n\n Red.prototype.shl = function shl (a, num) {\n this._verify1(a);\n return this.imod(a.ushln(num));\n };\n\n Red.prototype.imul = function imul (a, b) {\n this._verify2(a, b);\n return this.imod(a.imul(b));\n };\n\n Red.prototype.mul = function mul (a, b) {\n this._verify2(a, b);\n return this.imod(a.mul(b));\n };\n\n Red.prototype.isqr = function isqr (a) {\n return this.imul(a, a.clone());\n };\n\n Red.prototype.sqr = function sqr (a) {\n return this.mul(a, a);\n };\n\n Red.prototype.sqrt = function sqrt (a) {\n if (a.isZero()) return a.clone();\n\n var mod3 = this.m.andln(3);\n assert(mod3 % 2 === 1);\n\n // Fast case\n if (mod3 === 3) {\n var pow = this.m.add(new BN(1)).iushrn(2);\n return this.pow(a, pow);\n }\n\n // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n //\n // Find Q and S, that Q * 2 ^ S = (P - 1)\n var q = this.m.subn(1);\n var s = 0;\n while (!q.isZero() && q.andln(1) === 0) {\n s++;\n q.iushrn(1);\n }\n assert(!q.isZero());\n\n var one = new BN(1).toRed(this);\n var nOne = one.redNeg();\n\n // Find quadratic non-residue\n // NOTE: Max is such because of generalized Riemann hypothesis.\n var lpow = this.m.subn(1).iushrn(1);\n var z = this.m.bitLength();\n z = new BN(2 * z * z).toRed(this);\n\n while (this.pow(z, lpow).cmp(nOne) !== 0) {\n z.redIAdd(nOne);\n }\n\n var c = this.pow(z, q);\n var r = this.pow(a, q.addn(1).iushrn(1));\n var t = this.pow(a, q);\n var m = s;\n while (t.cmp(one) !== 0) {\n var tmp = t;\n for (var i = 0; tmp.cmp(one) !== 0; i++) {\n tmp = tmp.redSqr();\n }\n assert(i < m);\n var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n r = r.redMul(b);\n c = b.redSqr();\n t = t.redMul(c);\n m = i;\n }\n\n return r;\n };\n\n Red.prototype.invm = function invm (a) {\n var inv = a._invmp(this.m);\n if (inv.negative !== 0) {\n inv.negative = 0;\n return this.imod(inv).redNeg();\n } else {\n return this.imod(inv);\n }\n };\n\n Red.prototype.pow = function pow (a, num) {\n if (num.isZero()) return new BN(1).toRed(this);\n if (num.cmpn(1) === 0) return a.clone();\n\n var windowSize = 4;\n var wnd = new Array(1 << windowSize);\n wnd[0] = new BN(1).toRed(this);\n wnd[1] = a;\n for (var i = 2; i < wnd.length; i++) {\n wnd[i] = this.mul(wnd[i - 1], a);\n }\n\n var res = wnd[0];\n var current = 0;\n var currentLen = 0;\n var start = num.bitLength() % 26;\n if (start === 0) {\n start = 26;\n }\n\n for (i = num.length - 1; i >= 0; i--) {\n var word = num.words[i];\n for (var j = start - 1; j >= 0; j--) {\n var bit = (word >> j) & 1;\n if (res !== wnd[0]) {\n res = this.sqr(res);\n }\n\n if (bit === 0 && current === 0) {\n currentLen = 0;\n continue;\n }\n\n current <<= 1;\n current |= bit;\n currentLen++;\n if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n res = this.mul(res, wnd[current]);\n currentLen = 0;\n current = 0;\n }\n start = 26;\n }\n\n return res;\n };\n\n Red.prototype.convertTo = function convertTo (num) {\n var r = num.umod(this.m);\n\n return r === num ? r.clone() : r;\n };\n\n Red.prototype.convertFrom = function convertFrom (num) {\n var res = num.clone();\n res.red = null;\n return res;\n };\n\n //\n // Montgomery method engine\n //\n\n BN.mont = function mont (num) {\n return new Mont(num);\n };\n\n function Mont (m) {\n Red.call(this, m);\n\n this.shift = this.m.bitLength();\n if (this.shift % 26 !== 0) {\n this.shift += 26 - (this.shift % 26);\n }\n\n this.r = new BN(1).iushln(this.shift);\n this.r2 = this.imod(this.r.sqr());\n this.rinv = this.r._invmp(this.m);\n\n this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n this.minv = this.minv.umod(this.r);\n this.minv = this.r.sub(this.minv);\n }\n inherits(Mont, Red);\n\n Mont.prototype.convertTo = function convertTo (num) {\n return this.imod(num.ushln(this.shift));\n };\n\n Mont.prototype.convertFrom = function convertFrom (num) {\n var r = this.imod(num.mul(this.rinv));\n r.red = null;\n return r;\n };\n\n Mont.prototype.imul = function imul (a, b) {\n if (a.isZero() || b.isZero()) {\n a.words[0] = 0;\n a.length = 1;\n return a;\n }\n\n var t = a.imul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.mul = function mul (a, b) {\n if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n var t = a.mul(b);\n var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n var u = t.isub(c).iushrn(this.shift);\n var res = u;\n if (u.cmp(this.m) >= 0) {\n res = u.isub(this.m);\n } else if (u.cmpn(0) < 0) {\n res = u.iadd(this.m);\n }\n\n return res._forceRed(this);\n };\n\n Mont.prototype.invm = function invm (a) {\n // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n var res = this.imod(a._invmp(this.m).mul(this.r2));\n return res._forceRed(this);\n };\n})(typeof module === 'undefined' || module, this);\n","module.exports = assert;\n\nfunction assert(val, msg) {\n if (!val)\n throw new Error(msg || 'Assertion failed');\n}\n\nassert.equal = function assertEqual(l, r, msg) {\n if (l != r)\n throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r));\n};\n","'use strict';\n\nvar utils = exports;\n\nfunction toArray(msg, enc) {\n if (Array.isArray(msg))\n return msg.slice();\n if (!msg)\n return [];\n var res = [];\n if (typeof msg !== 'string') {\n for (var i = 0; i < msg.length; i++)\n res[i] = msg[i] | 0;\n return res;\n }\n if (enc === 'hex') {\n msg = msg.replace(/[^a-z0-9]+/ig, '');\n if (msg.length % 2 !== 0)\n msg = '0' + msg;\n for (var i = 0; i < msg.length; i += 2)\n res.push(parseInt(msg[i] + msg[i + 1], 16));\n } else {\n for (var i = 0; i < msg.length; i++) {\n var c = msg.charCodeAt(i);\n var hi = c >> 8;\n var lo = c & 0xff;\n if (hi)\n res.push(hi, lo);\n else\n res.push(lo);\n }\n }\n return res;\n}\nutils.toArray = toArray;\n\nfunction zero2(word) {\n if (word.length === 1)\n return '0' + word;\n else\n return word;\n}\nutils.zero2 = zero2;\n\nfunction toHex(msg) {\n var res = '';\n for (var i = 0; i < msg.length; i++)\n res += zero2(msg[i].toString(16));\n return res;\n}\nutils.toHex = toHex;\n\nutils.encode = function encode(arr, enc) {\n if (enc === 'hex')\n return toHex(arr);\n else\n return arr;\n};\n","'use strict';\n\nvar utils = exports;\nvar BN = require('bn.js');\nvar minAssert = require('minimalistic-assert');\nvar minUtils = require('minimalistic-crypto-utils');\n\nutils.assert = minAssert;\nutils.toArray = minUtils.toArray;\nutils.zero2 = minUtils.zero2;\nutils.toHex = minUtils.toHex;\nutils.encode = minUtils.encode;\n\n// Represent num in a w-NAF form\nfunction getNAF(num, w, bits) {\n var naf = new Array(Math.max(num.bitLength(), bits) + 1);\n var i;\n for (i = 0; i < naf.length; i += 1) {\n naf[i] = 0;\n }\n\n var ws = 1 << (w + 1);\n var k = num.clone();\n\n for (i = 0; i < naf.length; i++) {\n var z;\n var mod = k.andln(ws - 1);\n if (k.isOdd()) {\n if (mod > (ws >> 1) - 1)\n z = (ws >> 1) - mod;\n else\n z = mod;\n k.isubn(z);\n } else {\n z = 0;\n }\n\n naf[i] = z;\n k.iushrn(1);\n }\n\n return naf;\n}\nutils.getNAF = getNAF;\n\n// Represent k1, k2 in a Joint Sparse Form\nfunction getJSF(k1, k2) {\n var jsf = [\n [],\n [],\n ];\n\n k1 = k1.clone();\n k2 = k2.clone();\n var d1 = 0;\n var d2 = 0;\n var m8;\n while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {\n // First phase\n var m14 = (k1.andln(3) + d1) & 3;\n var m24 = (k2.andln(3) + d2) & 3;\n if (m14 === 3)\n m14 = -1;\n if (m24 === 3)\n m24 = -1;\n var u1;\n if ((m14 & 1) === 0) {\n u1 = 0;\n } else {\n m8 = (k1.andln(7) + d1) & 7;\n if ((m8 === 3 || m8 === 5) && m24 === 2)\n u1 = -m14;\n else\n u1 = m14;\n }\n jsf[0].push(u1);\n\n var u2;\n if ((m24 & 1) === 0) {\n u2 = 0;\n } else {\n m8 = (k2.andln(7) + d2) & 7;\n if ((m8 === 3 || m8 === 5) && m14 === 2)\n u2 = -m24;\n else\n u2 = m24;\n }\n jsf[1].push(u2);\n\n // Second phase\n if (2 * d1 === u1 + 1)\n d1 = 1 - d1;\n if (2 * d2 === u2 + 1)\n d2 = 1 - d2;\n k1.iushrn(1);\n k2.iushrn(1);\n }\n\n return jsf;\n}\nutils.getJSF = getJSF;\n\nfunction cachedProperty(obj, name, computer) {\n var key = '_' + name;\n obj.prototype[name] = function cachedProperty() {\n return this[key] !== undefined ? this[key] :\n this[key] = computer.call(this);\n };\n}\nutils.cachedProperty = cachedProperty;\n\nfunction parseBytes(bytes) {\n return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') :\n bytes;\n}\nutils.parseBytes = parseBytes;\n\nfunction intFromLE(bytes) {\n return new BN(bytes, 'hex', 'le');\n}\nutils.intFromLE = intFromLE;\n\n","var r;\n\nmodule.exports = function rand(len) {\n if (!r)\n r = new Rand(null);\n\n return r.generate(len);\n};\n\nfunction Rand(rand) {\n this.rand = rand;\n}\nmodule.exports.Rand = Rand;\n\nRand.prototype.generate = function generate(len) {\n return this._rand(len);\n};\n\n// Emulate crypto API using randy\nRand.prototype._rand = function _rand(n) {\n if (this.rand.getBytes)\n return this.rand.getBytes(n);\n\n var res = new Uint8Array(n);\n for (var i = 0; i < res.length; i++)\n res[i] = this.rand.getByte();\n return res;\n};\n\nif (typeof self === 'object') {\n if (self.crypto && self.crypto.getRandomValues) {\n // Modern browsers\n Rand.prototype._rand = function _rand(n) {\n var arr = new Uint8Array(n);\n self.crypto.getRandomValues(arr);\n return arr;\n };\n } else if (self.msCrypto && self.msCrypto.getRandomValues) {\n // IE\n Rand.prototype._rand = function _rand(n) {\n var arr = new Uint8Array(n);\n self.msCrypto.getRandomValues(arr);\n return arr;\n };\n\n // Safari's WebWorkers do not have `crypto`\n } else if (typeof window === 'object') {\n // Old junk\n Rand.prototype._rand = function() {\n throw new Error('Not implemented yet');\n };\n }\n} else {\n // Node.js or Web worker with no crypto support\n try {\n var crypto = require('crypto');\n if (typeof crypto.randomBytes !== 'function')\n throw new Error('Not supported');\n\n Rand.prototype._rand = function _rand(n) {\n return crypto.randomBytes(n);\n };\n } catch (e) {\n }\n}\n","'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar getNAF = utils.getNAF;\nvar getJSF = utils.getJSF;\nvar assert = utils.assert;\n\nfunction BaseCurve(type, conf) {\n this.type = type;\n this.p = new BN(conf.p, 16);\n\n // Use Montgomery, when there is no fast reduction for the prime\n this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p);\n\n // Useful for many curves\n this.zero = new BN(0).toRed(this.red);\n this.one = new BN(1).toRed(this.red);\n this.two = new BN(2).toRed(this.red);\n\n // Curve configuration, optional\n this.n = conf.n && new BN(conf.n, 16);\n this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed);\n\n // Temporary arrays\n this._wnafT1 = new Array(4);\n this._wnafT2 = new Array(4);\n this._wnafT3 = new Array(4);\n this._wnafT4 = new Array(4);\n\n this._bitLength = this.n ? this.n.bitLength() : 0;\n\n // Generalized Greg Maxwell's trick\n var adjustCount = this.n && this.p.div(this.n);\n if (!adjustCount || adjustCount.cmpn(100) > 0) {\n this.redN = null;\n } else {\n this._maxwellTrick = true;\n this.redN = this.n.toRed(this.red);\n }\n}\nmodule.exports = BaseCurve;\n\nBaseCurve.prototype.point = function point() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype.validate = function validate() {\n throw new Error('Not implemented');\n};\n\nBaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) {\n assert(p.precomputed);\n var doubles = p._getDoubles();\n\n var naf = getNAF(k, 1, this._bitLength);\n var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1);\n I /= 3;\n\n // Translate into more windowed form\n var repr = [];\n var j;\n var nafW;\n for (j = 0; j < naf.length; j += doubles.step) {\n nafW = 0;\n for (var l = j + doubles.step - 1; l >= j; l--)\n nafW = (nafW << 1) + naf[l];\n repr.push(nafW);\n }\n\n var a = this.jpoint(null, null, null);\n var b = this.jpoint(null, null, null);\n for (var i = I; i > 0; i--) {\n for (j = 0; j < repr.length; j++) {\n nafW = repr[j];\n if (nafW === i)\n b = b.mixedAdd(doubles.points[j]);\n else if (nafW === -i)\n b = b.mixedAdd(doubles.points[j].neg());\n }\n a = a.add(b);\n }\n return a.toP();\n};\n\nBaseCurve.prototype._wnafMul = function _wnafMul(p, k) {\n var w = 4;\n\n // Precompute window\n var nafPoints = p._getNAFPoints(w);\n w = nafPoints.wnd;\n var wnd = nafPoints.points;\n\n // Get NAF form\n var naf = getNAF(k, w, this._bitLength);\n\n // Add `this`*(N+1) for every w-NAF index\n var acc = this.jpoint(null, null, null);\n for (var i = naf.length - 1; i >= 0; i--) {\n // Count zeroes\n for (var l = 0; i >= 0 && naf[i] === 0; i--)\n l++;\n if (i >= 0)\n l++;\n acc = acc.dblp(l);\n\n if (i < 0)\n break;\n var z = naf[i];\n assert(z !== 0);\n if (p.type === 'affine') {\n // J +- P\n if (z > 0)\n acc = acc.mixedAdd(wnd[(z - 1) >> 1]);\n else\n acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg());\n } else {\n // J +- J\n if (z > 0)\n acc = acc.add(wnd[(z - 1) >> 1]);\n else\n acc = acc.add(wnd[(-z - 1) >> 1].neg());\n }\n }\n return p.type === 'affine' ? acc.toP() : acc;\n};\n\nBaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW,\n points,\n coeffs,\n len,\n jacobianResult) {\n var wndWidth = this._wnafT1;\n var wnd = this._wnafT2;\n var naf = this._wnafT3;\n\n // Fill all arrays\n var max = 0;\n var i;\n var j;\n var p;\n for (i = 0; i < len; i++) {\n p = points[i];\n var nafPoints = p._getNAFPoints(defW);\n wndWidth[i] = nafPoints.wnd;\n wnd[i] = nafPoints.points;\n }\n\n // Comb small window NAFs\n for (i = len - 1; i >= 1; i -= 2) {\n var a = i - 1;\n var b = i;\n if (wndWidth[a] !== 1 || wndWidth[b] !== 1) {\n naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength);\n naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength);\n max = Math.max(naf[a].length, max);\n max = Math.max(naf[b].length, max);\n continue;\n }\n\n var comb = [\n points[a], /* 1 */\n null, /* 3 */\n null, /* 5 */\n points[b], /* 7 */\n ];\n\n // Try to avoid Projective points, if possible\n if (points[a].y.cmp(points[b].y) === 0) {\n comb[1] = points[a].add(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].add(points[b].neg());\n } else {\n comb[1] = points[a].toJ().mixedAdd(points[b]);\n comb[2] = points[a].toJ().mixedAdd(points[b].neg());\n }\n\n var index = [\n -3, /* -1 -1 */\n -1, /* -1 0 */\n -5, /* -1 1 */\n -7, /* 0 -1 */\n 0, /* 0 0 */\n 7, /* 0 1 */\n 5, /* 1 -1 */\n 1, /* 1 0 */\n 3, /* 1 1 */\n ];\n\n var jsf = getJSF(coeffs[a], coeffs[b]);\n max = Math.max(jsf[0].length, max);\n naf[a] = new Array(max);\n naf[b] = new Array(max);\n for (j = 0; j < max; j++) {\n var ja = jsf[0][j] | 0;\n var jb = jsf[1][j] | 0;\n\n naf[a][j] = index[(ja + 1) * 3 + (jb + 1)];\n naf[b][j] = 0;\n wnd[a] = comb;\n }\n }\n\n var acc = this.jpoint(null, null, null);\n var tmp = this._wnafT4;\n for (i = max; i >= 0; i--) {\n var k = 0;\n\n while (i >= 0) {\n var zero = true;\n for (j = 0; j < len; j++) {\n tmp[j] = naf[j][i] | 0;\n if (tmp[j] !== 0)\n zero = false;\n }\n if (!zero)\n break;\n k++;\n i--;\n }\n if (i >= 0)\n k++;\n acc = acc.dblp(k);\n if (i < 0)\n break;\n\n for (j = 0; j < len; j++) {\n var z = tmp[j];\n p;\n if (z === 0)\n continue;\n else if (z > 0)\n p = wnd[j][(z - 1) >> 1];\n else if (z < 0)\n p = wnd[j][(-z - 1) >> 1].neg();\n\n if (p.type === 'affine')\n acc = acc.mixedAdd(p);\n else\n acc = acc.add(p);\n }\n }\n // Zeroify references\n for (i = 0; i < len; i++)\n wnd[i] = null;\n\n if (jacobianResult)\n return acc;\n else\n return acc.toP();\n};\n\nfunction BasePoint(curve, type) {\n this.curve = curve;\n this.type = type;\n this.precomputed = null;\n}\nBaseCurve.BasePoint = BasePoint;\n\nBasePoint.prototype.eq = function eq(/*other*/) {\n throw new Error('Not implemented');\n};\n\nBasePoint.prototype.validate = function validate() {\n return this.curve.validate(this);\n};\n\nBaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n bytes = utils.toArray(bytes, enc);\n\n var len = this.p.byteLength();\n\n // uncompressed, hybrid-odd, hybrid-even\n if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) &&\n bytes.length - 1 === 2 * len) {\n if (bytes[0] === 0x06)\n assert(bytes[bytes.length - 1] % 2 === 0);\n else if (bytes[0] === 0x07)\n assert(bytes[bytes.length - 1] % 2 === 1);\n\n var res = this.point(bytes.slice(1, 1 + len),\n bytes.slice(1 + len, 1 + 2 * len));\n\n return res;\n } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) &&\n bytes.length - 1 === len) {\n return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03);\n }\n throw new Error('Unknown point format');\n};\n\nBasePoint.prototype.encodeCompressed = function encodeCompressed(enc) {\n return this.encode(enc, true);\n};\n\nBasePoint.prototype._encode = function _encode(compact) {\n var len = this.curve.p.byteLength();\n var x = this.getX().toArray('be', len);\n\n if (compact)\n return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x);\n\n return [ 0x04 ].concat(x, this.getY().toArray('be', len));\n};\n\nBasePoint.prototype.encode = function encode(enc, compact) {\n return utils.encode(this._encode(compact), enc);\n};\n\nBasePoint.prototype.precompute = function precompute(power) {\n if (this.precomputed)\n return this;\n\n var precomputed = {\n doubles: null,\n naf: null,\n beta: null,\n };\n precomputed.naf = this._getNAFPoints(8);\n precomputed.doubles = this._getDoubles(4, power);\n precomputed.beta = this._getBeta();\n this.precomputed = precomputed;\n\n return this;\n};\n\nBasePoint.prototype._hasDoubles = function _hasDoubles(k) {\n if (!this.precomputed)\n return false;\n\n var doubles = this.precomputed.doubles;\n if (!doubles)\n return false;\n\n return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step);\n};\n\nBasePoint.prototype._getDoubles = function _getDoubles(step, power) {\n if (this.precomputed && this.precomputed.doubles)\n return this.precomputed.doubles;\n\n var doubles = [ this ];\n var acc = this;\n for (var i = 0; i < power; i += step) {\n for (var j = 0; j < step; j++)\n acc = acc.dbl();\n doubles.push(acc);\n }\n return {\n step: step,\n points: doubles,\n };\n};\n\nBasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) {\n if (this.precomputed && this.precomputed.naf)\n return this.precomputed.naf;\n\n var res = [ this ];\n var max = (1 << wnd) - 1;\n var dbl = max === 1 ? null : this.dbl();\n for (var i = 1; i < max; i++)\n res[i] = res[i - 1].add(dbl);\n return {\n wnd: wnd,\n points: res,\n };\n};\n\nBasePoint.prototype._getBeta = function _getBeta() {\n return null;\n};\n\nBasePoint.prototype.dblp = function dblp(k) {\n var r = this;\n for (var i = 0; i < k; i++)\n r = r.dbl();\n return r;\n};\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nvar curve = exports;\n\ncurve.base = require('./base');\ncurve.short = require('./short');\ncurve.mont = require('./mont');\ncurve.edwards = require('./edwards');\n","'use strict';\n\nvar utils = require('../utils');\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar assert = utils.assert;\n\nfunction ShortCurve(conf) {\n Base.call(this, 'short', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.tinv = this.two.redInvm();\n\n this.zeroA = this.a.fromRed().cmpn(0) === 0;\n this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0;\n\n // If the curve is endomorphic, precalculate beta and lambda\n this.endo = this._getEndomorphism(conf);\n this._endoWnafT1 = new Array(4);\n this._endoWnafT2 = new Array(4);\n}\ninherits(ShortCurve, Base);\nmodule.exports = ShortCurve;\n\nShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) {\n // No efficient endomorphism\n if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1)\n return;\n\n // Compute beta and lambda, that lambda * P = (beta * Px; Py)\n var beta;\n var lambda;\n if (conf.beta) {\n beta = new BN(conf.beta, 16).toRed(this.red);\n } else {\n var betas = this._getEndoRoots(this.p);\n // Choose the smallest beta\n beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1];\n beta = beta.toRed(this.red);\n }\n if (conf.lambda) {\n lambda = new BN(conf.lambda, 16);\n } else {\n // Choose the lambda that is matching selected beta\n var lambdas = this._getEndoRoots(this.n);\n if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) {\n lambda = lambdas[0];\n } else {\n lambda = lambdas[1];\n assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0);\n }\n }\n\n // Get basis vectors, used for balanced length-two representation\n var basis;\n if (conf.basis) {\n basis = conf.basis.map(function(vec) {\n return {\n a: new BN(vec.a, 16),\n b: new BN(vec.b, 16),\n };\n });\n } else {\n basis = this._getEndoBasis(lambda);\n }\n\n return {\n beta: beta,\n lambda: lambda,\n basis: basis,\n };\n};\n\nShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) {\n // Find roots of for x^2 + x + 1 in F\n // Root = (-1 +- Sqrt(-3)) / 2\n //\n var red = num === this.p ? this.red : BN.mont(num);\n var tinv = new BN(2).toRed(red).redInvm();\n var ntinv = tinv.redNeg();\n\n var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv);\n\n var l1 = ntinv.redAdd(s).fromRed();\n var l2 = ntinv.redSub(s).fromRed();\n return [ l1, l2 ];\n};\n\nShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) {\n // aprxSqrt >= sqrt(this.n)\n var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2));\n\n // 3.74\n // Run EGCD, until r(L + 1) < aprxSqrt\n var u = lambda;\n var v = this.n.clone();\n var x1 = new BN(1);\n var y1 = new BN(0);\n var x2 = new BN(0);\n var y2 = new BN(1);\n\n // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n)\n var a0;\n var b0;\n // First vector\n var a1;\n var b1;\n // Second vector\n var a2;\n var b2;\n\n var prevR;\n var i = 0;\n var r;\n var x;\n while (u.cmpn(0) !== 0) {\n var q = v.div(u);\n r = v.sub(q.mul(u));\n x = x2.sub(q.mul(x1));\n var y = y2.sub(q.mul(y1));\n\n if (!a1 && r.cmp(aprxSqrt) < 0) {\n a0 = prevR.neg();\n b0 = x1;\n a1 = r.neg();\n b1 = x;\n } else if (a1 && ++i === 2) {\n break;\n }\n prevR = r;\n\n v = u;\n u = r;\n x2 = x1;\n x1 = x;\n y2 = y1;\n y1 = y;\n }\n a2 = r.neg();\n b2 = x;\n\n var len1 = a1.sqr().add(b1.sqr());\n var len2 = a2.sqr().add(b2.sqr());\n if (len2.cmp(len1) >= 0) {\n a2 = a0;\n b2 = b0;\n }\n\n // Normalize signs\n if (a1.negative) {\n a1 = a1.neg();\n b1 = b1.neg();\n }\n if (a2.negative) {\n a2 = a2.neg();\n b2 = b2.neg();\n }\n\n return [\n { a: a1, b: b1 },\n { a: a2, b: b2 },\n ];\n};\n\nShortCurve.prototype._endoSplit = function _endoSplit(k) {\n var basis = this.endo.basis;\n var v1 = basis[0];\n var v2 = basis[1];\n\n var c1 = v2.b.mul(k).divRound(this.n);\n var c2 = v1.b.neg().mul(k).divRound(this.n);\n\n var p1 = c1.mul(v1.a);\n var p2 = c2.mul(v2.a);\n var q1 = c1.mul(v1.b);\n var q2 = c2.mul(v2.b);\n\n // Calculate answer\n var k1 = k.sub(p1).sub(p2);\n var k2 = q1.add(q2).neg();\n return { k1: k1, k2: k2 };\n};\n\nShortCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b);\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n // XXX Is there any way to tell if the number is odd without converting it\n // to non-red form?\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nShortCurve.prototype.validate = function validate(point) {\n if (point.inf)\n return true;\n\n var x = point.x;\n var y = point.y;\n\n var ax = this.a.redMul(x);\n var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b);\n return y.redSqr().redISub(rhs).cmpn(0) === 0;\n};\n\nShortCurve.prototype._endoWnafMulAdd =\n function _endoWnafMulAdd(points, coeffs, jacobianResult) {\n var npoints = this._endoWnafT1;\n var ncoeffs = this._endoWnafT2;\n for (var i = 0; i < points.length; i++) {\n var split = this._endoSplit(coeffs[i]);\n var p = points[i];\n var beta = p._getBeta();\n\n if (split.k1.negative) {\n split.k1.ineg();\n p = p.neg(true);\n }\n if (split.k2.negative) {\n split.k2.ineg();\n beta = beta.neg(true);\n }\n\n npoints[i * 2] = p;\n npoints[i * 2 + 1] = beta;\n ncoeffs[i * 2] = split.k1;\n ncoeffs[i * 2 + 1] = split.k2;\n }\n var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult);\n\n // Clean-up references to points and coefficients\n for (var j = 0; j < i * 2; j++) {\n npoints[j] = null;\n ncoeffs[j] = null;\n }\n return res;\n };\n\nfunction Point(curve, x, y, isRed) {\n Base.BasePoint.call(this, curve, 'affine');\n if (x === null && y === null) {\n this.x = null;\n this.y = null;\n this.inf = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n // Force redgomery representation when loading from JSON\n if (isRed) {\n this.x.forceRed(this.curve.red);\n this.y.forceRed(this.curve.red);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n this.inf = false;\n }\n}\ninherits(Point, Base.BasePoint);\n\nShortCurve.prototype.point = function point(x, y, isRed) {\n return new Point(this, x, y, isRed);\n};\n\nShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) {\n return Point.fromJSON(this, obj, red);\n};\n\nPoint.prototype._getBeta = function _getBeta() {\n if (!this.curve.endo)\n return;\n\n var pre = this.precomputed;\n if (pre && pre.beta)\n return pre.beta;\n\n var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y);\n if (pre) {\n var curve = this.curve;\n var endoMul = function(p) {\n return curve.point(p.x.redMul(curve.endo.beta), p.y);\n };\n pre.beta = beta;\n beta.precomputed = {\n beta: null,\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(endoMul),\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(endoMul),\n },\n };\n }\n return beta;\n};\n\nPoint.prototype.toJSON = function toJSON() {\n if (!this.precomputed)\n return [ this.x, this.y ];\n\n return [ this.x, this.y, this.precomputed && {\n doubles: this.precomputed.doubles && {\n step: this.precomputed.doubles.step,\n points: this.precomputed.doubles.points.slice(1),\n },\n naf: this.precomputed.naf && {\n wnd: this.precomputed.naf.wnd,\n points: this.precomputed.naf.points.slice(1),\n },\n } ];\n};\n\nPoint.fromJSON = function fromJSON(curve, obj, red) {\n if (typeof obj === 'string')\n obj = JSON.parse(obj);\n var res = curve.point(obj[0], obj[1], red);\n if (!obj[2])\n return res;\n\n function obj2point(obj) {\n return curve.point(obj[0], obj[1], red);\n }\n\n var pre = obj[2];\n res.precomputed = {\n beta: null,\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: [ res ].concat(pre.doubles.points.map(obj2point)),\n },\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: [ res ].concat(pre.naf.points.map(obj2point)),\n },\n };\n return res;\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n return this.inf;\n};\n\nPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.inf)\n return p;\n\n // P + O = P\n if (p.inf)\n return this;\n\n // P + P = 2P\n if (this.eq(p))\n return this.dbl();\n\n // P + (-P) = O\n if (this.neg().eq(p))\n return this.curve.point(null, null);\n\n // P + Q = O\n if (this.x.cmp(p.x) === 0)\n return this.curve.point(null, null);\n\n var c = this.y.redSub(p.y);\n if (c.cmpn(0) !== 0)\n c = c.redMul(this.x.redSub(p.x).redInvm());\n var nx = c.redSqr().redISub(this.x).redISub(p.x);\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.inf)\n return this;\n\n // 2P = O\n var ys1 = this.y.redAdd(this.y);\n if (ys1.cmpn(0) === 0)\n return this.curve.point(null, null);\n\n var a = this.curve.a;\n\n var x2 = this.x.redSqr();\n var dyinv = ys1.redInvm();\n var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv);\n\n var nx = c.redSqr().redISub(this.x.redAdd(this.x));\n var ny = c.redMul(this.x.redSub(nx)).redISub(this.y);\n return this.curve.point(nx, ny);\n};\n\nPoint.prototype.getX = function getX() {\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n return this.y.fromRed();\n};\n\nPoint.prototype.mul = function mul(k) {\n k = new BN(k, 16);\n if (this.isInfinity())\n return this;\n else if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else if (this.curve.endo)\n return this.curve._endoWnafMulAdd([ this ], [ k ]);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p2, k2) {\n var points = [ this, p2 ];\n var coeffs = [ k1, k2 ];\n if (this.curve.endo)\n return this.curve._endoWnafMulAdd(points, coeffs, true);\n else\n return this.curve._wnafMulAdd(1, points, coeffs, 2, true);\n};\n\nPoint.prototype.eq = function eq(p) {\n return this === p ||\n this.inf === p.inf &&\n (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0);\n};\n\nPoint.prototype.neg = function neg(_precompute) {\n if (this.inf)\n return this;\n\n var res = this.curve.point(this.x, this.y.redNeg());\n if (_precompute && this.precomputed) {\n var pre = this.precomputed;\n var negate = function(p) {\n return p.neg();\n };\n res.precomputed = {\n naf: pre.naf && {\n wnd: pre.naf.wnd,\n points: pre.naf.points.map(negate),\n },\n doubles: pre.doubles && {\n step: pre.doubles.step,\n points: pre.doubles.points.map(negate),\n },\n };\n }\n return res;\n};\n\nPoint.prototype.toJ = function toJ() {\n if (this.inf)\n return this.curve.jpoint(null, null, null);\n\n var res = this.curve.jpoint(this.x, this.y, this.curve.one);\n return res;\n};\n\nfunction JPoint(curve, x, y, z) {\n Base.BasePoint.call(this, curve, 'jacobian');\n if (x === null && y === null && z === null) {\n this.x = this.curve.one;\n this.y = this.curve.one;\n this.z = new BN(0);\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = new BN(z, 16);\n }\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n\n this.zOne = this.z === this.curve.one;\n}\ninherits(JPoint, Base.BasePoint);\n\nShortCurve.prototype.jpoint = function jpoint(x, y, z) {\n return new JPoint(this, x, y, z);\n};\n\nJPoint.prototype.toP = function toP() {\n if (this.isInfinity())\n return this.curve.point(null, null);\n\n var zinv = this.z.redInvm();\n var zinv2 = zinv.redSqr();\n var ax = this.x.redMul(zinv2);\n var ay = this.y.redMul(zinv2).redMul(zinv);\n\n return this.curve.point(ax, ay);\n};\n\nJPoint.prototype.neg = function neg() {\n return this.curve.jpoint(this.x, this.y.redNeg(), this.z);\n};\n\nJPoint.prototype.add = function add(p) {\n // O + P = P\n if (this.isInfinity())\n return p;\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 12M + 4S + 7A\n var pz2 = p.z.redSqr();\n var z2 = this.z.redSqr();\n var u1 = this.x.redMul(pz2);\n var u2 = p.x.redMul(z2);\n var s1 = this.y.redMul(pz2.redMul(p.z));\n var s2 = p.y.redMul(z2.redMul(this.z));\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(p.z).redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mixedAdd = function mixedAdd(p) {\n // O + P = P\n if (this.isInfinity())\n return p.toJ();\n\n // P + O = P\n if (p.isInfinity())\n return this;\n\n // 8M + 3S + 7A\n var z2 = this.z.redSqr();\n var u1 = this.x;\n var u2 = p.x.redMul(z2);\n var s1 = this.y;\n var s2 = p.y.redMul(z2).redMul(this.z);\n\n var h = u1.redSub(u2);\n var r = s1.redSub(s2);\n if (h.cmpn(0) === 0) {\n if (r.cmpn(0) !== 0)\n return this.curve.jpoint(null, null, null);\n else\n return this.dbl();\n }\n\n var h2 = h.redSqr();\n var h3 = h2.redMul(h);\n var v = u1.redMul(h2);\n\n var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v);\n var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3));\n var nz = this.z.redMul(h);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.dblp = function dblp(pow) {\n if (pow === 0)\n return this;\n if (this.isInfinity())\n return this;\n if (!pow)\n return this.dbl();\n\n var i;\n if (this.curve.zeroA || this.curve.threeA) {\n var r = this;\n for (i = 0; i < pow; i++)\n r = r.dbl();\n return r;\n }\n\n // 1M + 2S + 1A + N * (4S + 5M + 8A)\n // N = 1 => 6M + 6S + 9A\n var a = this.curve.a;\n var tinv = this.curve.tinv;\n\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n // Reuse results\n var jyd = jy.redAdd(jy);\n for (i = 0; i < pow; i++) {\n var jx2 = jx.redSqr();\n var jyd2 = jyd.redSqr();\n var jyd4 = jyd2.redSqr();\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var t1 = jx.redMul(jyd2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n var dny = c.redMul(t2);\n dny = dny.redIAdd(dny).redISub(jyd4);\n var nz = jyd.redMul(jz);\n if (i + 1 < pow)\n jz4 = jz4.redMul(jyd4);\n\n jx = nx;\n jz = nz;\n jyd = dny;\n }\n\n return this.curve.jpoint(jx, jyd.redMul(tinv), jz);\n};\n\nJPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n if (this.curve.zeroA)\n return this._zeroDbl();\n else if (this.curve.threeA)\n return this._threeDbl();\n else\n return this._dbl();\n};\n\nJPoint.prototype._zeroDbl = function _zeroDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 14A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // T = M ^ 2 - 2*S\n var t = m.redSqr().redISub(s).redISub(s);\n\n // 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2*Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html\n // #doubling-dbl-2009-l\n // 2M + 5S + 13A\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = B^2\n var c = b.redSqr();\n // D = 2 * ((X1 + B)^2 - A - C)\n var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c);\n d = d.redIAdd(d);\n // E = 3 * A\n var e = a.redAdd(a).redIAdd(a);\n // F = E^2\n var f = e.redSqr();\n\n // 8 * C\n var c8 = c.redIAdd(c);\n c8 = c8.redIAdd(c8);\n c8 = c8.redIAdd(c8);\n\n // X3 = F - 2 * D\n nx = f.redISub(d).redISub(d);\n // Y3 = E * (D - X3) - 8 * C\n ny = e.redMul(d.redISub(nx)).redISub(c8);\n // Z3 = 2 * Y1 * Z1\n nz = this.y.redMul(this.z);\n nz = nz.redIAdd(nz);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._threeDbl = function _threeDbl() {\n var nx;\n var ny;\n var nz;\n // Z = 1\n if (this.zOne) {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html\n // #doubling-mdbl-2007-bl\n // 1M + 5S + 15A\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // S = 2 * ((X1 + YY)^2 - XX - YYYY)\n var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n s = s.redIAdd(s);\n // M = 3 * XX + a\n var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a);\n // T = M^2 - 2 * S\n var t = m.redSqr().redISub(s).redISub(s);\n // X3 = T\n nx = t;\n // Y3 = M * (S - T) - 8 * YYYY\n var yyyy8 = yyyy.redIAdd(yyyy);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n yyyy8 = yyyy8.redIAdd(yyyy8);\n ny = m.redMul(s.redISub(t)).redISub(yyyy8);\n // Z3 = 2 * Y1\n nz = this.y.redAdd(this.y);\n } else {\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b\n // 3M + 5S\n\n // delta = Z1^2\n var delta = this.z.redSqr();\n // gamma = Y1^2\n var gamma = this.y.redSqr();\n // beta = X1 * gamma\n var beta = this.x.redMul(gamma);\n // alpha = 3 * (X1 - delta) * (X1 + delta)\n var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta));\n alpha = alpha.redAdd(alpha).redIAdd(alpha);\n // X3 = alpha^2 - 8 * beta\n var beta4 = beta.redIAdd(beta);\n beta4 = beta4.redIAdd(beta4);\n var beta8 = beta4.redAdd(beta4);\n nx = alpha.redSqr().redISub(beta8);\n // Z3 = (Y1 + Z1)^2 - gamma - delta\n nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta);\n // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2\n var ggamma8 = gamma.redSqr();\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ggamma8 = ggamma8.redIAdd(ggamma8);\n ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8);\n }\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype._dbl = function _dbl() {\n var a = this.curve.a;\n\n // 4M + 6S + 10A\n var jx = this.x;\n var jy = this.y;\n var jz = this.z;\n var jz4 = jz.redSqr().redSqr();\n\n var jx2 = jx.redSqr();\n var jy2 = jy.redSqr();\n\n var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4));\n\n var jxd4 = jx.redAdd(jx);\n jxd4 = jxd4.redIAdd(jxd4);\n var t1 = jxd4.redMul(jy2);\n var nx = c.redSqr().redISub(t1.redAdd(t1));\n var t2 = t1.redISub(nx);\n\n var jyd8 = jy2.redSqr();\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n jyd8 = jyd8.redIAdd(jyd8);\n var ny = c.redMul(t2).redISub(jyd8);\n var nz = jy.redAdd(jy).redMul(jz);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.trpl = function trpl() {\n if (!this.curve.zeroA)\n return this.dbl().add(this);\n\n // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl\n // 5M + 10S + ...\n\n // XX = X1^2\n var xx = this.x.redSqr();\n // YY = Y1^2\n var yy = this.y.redSqr();\n // ZZ = Z1^2\n var zz = this.z.redSqr();\n // YYYY = YY^2\n var yyyy = yy.redSqr();\n // M = 3 * XX + a * ZZ2; a = 0\n var m = xx.redAdd(xx).redIAdd(xx);\n // MM = M^2\n var mm = m.redSqr();\n // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM\n var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy);\n e = e.redIAdd(e);\n e = e.redAdd(e).redIAdd(e);\n e = e.redISub(mm);\n // EE = E^2\n var ee = e.redSqr();\n // T = 16*YYYY\n var t = yyyy.redIAdd(yyyy);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n t = t.redIAdd(t);\n // U = (M + E)^2 - MM - EE - T\n var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t);\n // X3 = 4 * (X1 * EE - 4 * YY * U)\n var yyu4 = yy.redMul(u);\n yyu4 = yyu4.redIAdd(yyu4);\n yyu4 = yyu4.redIAdd(yyu4);\n var nx = this.x.redMul(ee).redISub(yyu4);\n nx = nx.redIAdd(nx);\n nx = nx.redIAdd(nx);\n // Y3 = 8 * Y1 * (U * (T - U) - E * EE)\n var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee)));\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n ny = ny.redIAdd(ny);\n // Z3 = (Z1 + E)^2 - ZZ - EE\n var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee);\n\n return this.curve.jpoint(nx, ny, nz);\n};\n\nJPoint.prototype.mul = function mul(k, kbase) {\n k = new BN(k, kbase);\n\n return this.curve._wnafMul(this, k);\n};\n\nJPoint.prototype.eq = function eq(p) {\n if (p.type === 'affine')\n return this.eq(p.toJ());\n\n if (this === p)\n return true;\n\n // x1 * z2^2 == x2 * z1^2\n var z2 = this.z.redSqr();\n var pz2 = p.z.redSqr();\n if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0)\n return false;\n\n // y1 * z2^3 == y2 * z1^3\n var z3 = z2.redMul(this.z);\n var pz3 = pz2.redMul(p.z);\n return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0;\n};\n\nJPoint.prototype.eqXToP = function eqXToP(x) {\n var zs = this.z.redSqr();\n var rx = x.toRed(this.curve.red).redMul(zs);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(zs);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\nJPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC JPoint Infinity>';\n return '<EC JPoint x: ' + this.x.toString(16, 2) +\n ' y: ' + this.y.toString(16, 2) +\n ' z: ' + this.z.toString(16, 2) + '>';\n};\n\nJPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n","'use strict';\n\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar utils = require('../utils');\n\nfunction MontCurve(conf) {\n Base.call(this, 'mont', conf);\n\n this.a = new BN(conf.a, 16).toRed(this.red);\n this.b = new BN(conf.b, 16).toRed(this.red);\n this.i4 = new BN(4).toRed(this.red).redInvm();\n this.two = new BN(2).toRed(this.red);\n this.a24 = this.i4.redMul(this.a.redAdd(this.two));\n}\ninherits(MontCurve, Base);\nmodule.exports = MontCurve;\n\nMontCurve.prototype.validate = function validate(point) {\n var x = point.normalize().x;\n var x2 = x.redSqr();\n var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x);\n var y = rhs.redSqrt();\n\n return y.redSqr().cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, z) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && z === null) {\n this.x = this.curve.one;\n this.z = this.curve.zero;\n } else {\n this.x = new BN(x, 16);\n this.z = new BN(z, 16);\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n }\n}\ninherits(Point, Base.BasePoint);\n\nMontCurve.prototype.decodePoint = function decodePoint(bytes, enc) {\n return this.point(utils.toArray(bytes, enc), 1);\n};\n\nMontCurve.prototype.point = function point(x, z) {\n return new Point(this, x, z);\n};\n\nMontCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nPoint.prototype.precompute = function precompute() {\n // No-op\n};\n\nPoint.prototype._encode = function _encode() {\n return this.getX().toArray('be', this.curve.p.byteLength());\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1] || curve.one);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' z: ' + this.z.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.z.cmpn(0) === 0;\n};\n\nPoint.prototype.dbl = function dbl() {\n // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#doubling-dbl-1987-m-3\n // 2M + 2S + 4A\n\n // A = X1 + Z1\n var a = this.x.redAdd(this.z);\n // AA = A^2\n var aa = a.redSqr();\n // B = X1 - Z1\n var b = this.x.redSub(this.z);\n // BB = B^2\n var bb = b.redSqr();\n // C = AA - BB\n var c = aa.redSub(bb);\n // X3 = AA * BB\n var nx = aa.redMul(bb);\n // Z3 = C * (BB + A24 * C)\n var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c)));\n return this.curve.point(nx, nz);\n};\n\nPoint.prototype.add = function add() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.diffAdd = function diffAdd(p, diff) {\n // http://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html#diffadd-dadd-1987-m-3\n // 4M + 2S + 6A\n\n // A = X2 + Z2\n var a = this.x.redAdd(this.z);\n // B = X2 - Z2\n var b = this.x.redSub(this.z);\n // C = X3 + Z3\n var c = p.x.redAdd(p.z);\n // D = X3 - Z3\n var d = p.x.redSub(p.z);\n // DA = D * A\n var da = d.redMul(a);\n // CB = C * B\n var cb = c.redMul(b);\n // X5 = Z1 * (DA + CB)^2\n var nx = diff.z.redMul(da.redAdd(cb).redSqr());\n // Z5 = X1 * (DA - CB)^2\n var nz = diff.x.redMul(da.redISub(cb).redSqr());\n return this.curve.point(nx, nz);\n};\n\nPoint.prototype.mul = function mul(k) {\n var t = k.clone();\n var a = this; // (N / 2) * Q + Q\n var b = this.curve.point(null, null); // (N / 2) * Q\n var c = this; // Q\n\n for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1))\n bits.push(t.andln(1));\n\n for (var i = bits.length - 1; i >= 0; i--) {\n if (bits[i] === 0) {\n // N * Q + Q = ((N / 2) * Q + Q)) + (N / 2) * Q\n a = a.diffAdd(b, c);\n // N * Q = 2 * ((N / 2) * Q + Q))\n b = b.dbl();\n } else {\n // N * Q = ((N / 2) * Q + Q) + ((N / 2) * Q)\n b = a.diffAdd(b, c);\n // N * Q + Q = 2 * ((N / 2) * Q + Q)\n a = a.dbl();\n }\n }\n return b;\n};\n\nPoint.prototype.mulAdd = function mulAdd() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.jumlAdd = function jumlAdd() {\n throw new Error('Not supported on Montgomery curve');\n};\n\nPoint.prototype.eq = function eq(other) {\n return this.getX().cmp(other.getX()) === 0;\n};\n\nPoint.prototype.normalize = function normalize() {\n this.x = this.x.redMul(this.z.redInvm());\n this.z = this.curve.one;\n return this;\n};\n\nPoint.prototype.getX = function getX() {\n // Normalize coordinates\n this.normalize();\n\n return this.x.fromRed();\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar BN = require('bn.js');\nvar inherits = require('inherits');\nvar Base = require('./base');\n\nvar assert = utils.assert;\n\nfunction EdwardsCurve(conf) {\n // NOTE: Important as we are creating point in Base.call()\n this.twisted = (conf.a | 0) !== 1;\n this.mOneA = this.twisted && (conf.a | 0) === -1;\n this.extended = this.mOneA;\n\n Base.call(this, 'edwards', conf);\n\n this.a = new BN(conf.a, 16).umod(this.red.m);\n this.a = this.a.toRed(this.red);\n this.c = new BN(conf.c, 16).toRed(this.red);\n this.c2 = this.c.redSqr();\n this.d = new BN(conf.d, 16).toRed(this.red);\n this.dd = this.d.redAdd(this.d);\n\n assert(!this.twisted || this.c.fromRed().cmpn(1) === 0);\n this.oneC = (conf.c | 0) === 1;\n}\ninherits(EdwardsCurve, Base);\nmodule.exports = EdwardsCurve;\n\nEdwardsCurve.prototype._mulA = function _mulA(num) {\n if (this.mOneA)\n return num.redNeg();\n else\n return this.a.redMul(num);\n};\n\nEdwardsCurve.prototype._mulC = function _mulC(num) {\n if (this.oneC)\n return num;\n else\n return this.c.redMul(num);\n};\n\n// Just for compatibility with Short curve\nEdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) {\n return this.point(x, y, z, t);\n};\n\nEdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) {\n x = new BN(x, 16);\n if (!x.red)\n x = x.toRed(this.red);\n\n var x2 = x.redSqr();\n var rhs = this.c2.redSub(this.a.redMul(x2));\n var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2));\n\n var y2 = rhs.redMul(lhs.redInvm());\n var y = y2.redSqrt();\n if (y.redSqr().redSub(y2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n var isOdd = y.fromRed().isOdd();\n if (odd && !isOdd || !odd && isOdd)\n y = y.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) {\n y = new BN(y, 16);\n if (!y.red)\n y = y.toRed(this.red);\n\n // x^2 = (y^2 - c^2) / (c^2 d y^2 - a)\n var y2 = y.redSqr();\n var lhs = y2.redSub(this.c2);\n var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a);\n var x2 = lhs.redMul(rhs.redInvm());\n\n if (x2.cmp(this.zero) === 0) {\n if (odd)\n throw new Error('invalid point');\n else\n return this.point(this.zero, y);\n }\n\n var x = x2.redSqrt();\n if (x.redSqr().redSub(x2).cmp(this.zero) !== 0)\n throw new Error('invalid point');\n\n if (x.fromRed().isOdd() !== odd)\n x = x.redNeg();\n\n return this.point(x, y);\n};\n\nEdwardsCurve.prototype.validate = function validate(point) {\n if (point.isInfinity())\n return true;\n\n // Curve: A * X^2 + Y^2 = C^2 * (1 + D * X^2 * Y^2)\n point.normalize();\n\n var x2 = point.x.redSqr();\n var y2 = point.y.redSqr();\n var lhs = x2.redMul(this.a).redAdd(y2);\n var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2)));\n\n return lhs.cmp(rhs) === 0;\n};\n\nfunction Point(curve, x, y, z, t) {\n Base.BasePoint.call(this, curve, 'projective');\n if (x === null && y === null && z === null) {\n this.x = this.curve.zero;\n this.y = this.curve.one;\n this.z = this.curve.one;\n this.t = this.curve.zero;\n this.zOne = true;\n } else {\n this.x = new BN(x, 16);\n this.y = new BN(y, 16);\n this.z = z ? new BN(z, 16) : this.curve.one;\n this.t = t && new BN(t, 16);\n if (!this.x.red)\n this.x = this.x.toRed(this.curve.red);\n if (!this.y.red)\n this.y = this.y.toRed(this.curve.red);\n if (!this.z.red)\n this.z = this.z.toRed(this.curve.red);\n if (this.t && !this.t.red)\n this.t = this.t.toRed(this.curve.red);\n this.zOne = this.z === this.curve.one;\n\n // Use extended coordinates\n if (this.curve.extended && !this.t) {\n this.t = this.x.redMul(this.y);\n if (!this.zOne)\n this.t = this.t.redMul(this.z.redInvm());\n }\n }\n}\ninherits(Point, Base.BasePoint);\n\nEdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) {\n return Point.fromJSON(this, obj);\n};\n\nEdwardsCurve.prototype.point = function point(x, y, z, t) {\n return new Point(this, x, y, z, t);\n};\n\nPoint.fromJSON = function fromJSON(curve, obj) {\n return new Point(curve, obj[0], obj[1], obj[2]);\n};\n\nPoint.prototype.inspect = function inspect() {\n if (this.isInfinity())\n return '<EC Point Infinity>';\n return '<EC Point x: ' + this.x.fromRed().toString(16, 2) +\n ' y: ' + this.y.fromRed().toString(16, 2) +\n ' z: ' + this.z.fromRed().toString(16, 2) + '>';\n};\n\nPoint.prototype.isInfinity = function isInfinity() {\n // XXX This code assumes that zero is always zero in red\n return this.x.cmpn(0) === 0 &&\n (this.y.cmp(this.z) === 0 ||\n (this.zOne && this.y.cmp(this.curve.c) === 0));\n};\n\nPoint.prototype._extDbl = function _extDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #doubling-dbl-2008-hwcd\n // 4M + 4S\n\n // A = X1^2\n var a = this.x.redSqr();\n // B = Y1^2\n var b = this.y.redSqr();\n // C = 2 * Z1^2\n var c = this.z.redSqr();\n c = c.redIAdd(c);\n // D = a * A\n var d = this.curve._mulA(a);\n // E = (X1 + Y1)^2 - A - B\n var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b);\n // G = D + B\n var g = d.redAdd(b);\n // F = G - C\n var f = g.redSub(c);\n // H = D - B\n var h = d.redSub(b);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projDbl = function _projDbl() {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #doubling-dbl-2008-bbjlp\n // #doubling-dbl-2007-bl\n // and others\n // Generally 3M + 4S or 2M + 4S\n\n // B = (X1 + Y1)^2\n var b = this.x.redAdd(this.y).redSqr();\n // C = X1^2\n var c = this.x.redSqr();\n // D = Y1^2\n var d = this.y.redSqr();\n\n var nx;\n var ny;\n var nz;\n var e;\n var h;\n var j;\n if (this.curve.twisted) {\n // E = a * C\n e = this.curve._mulA(c);\n // F = E + D\n var f = e.redAdd(d);\n if (this.zOne) {\n // X3 = (B - C - D) * (F - 2)\n nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two));\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F^2 - 2 * F\n nz = f.redSqr().redSub(f).redSub(f);\n } else {\n // H = Z1^2\n h = this.z.redSqr();\n // J = F - 2 * H\n j = f.redSub(h).redISub(h);\n // X3 = (B-C-D)*J\n nx = b.redSub(c).redISub(d).redMul(j);\n // Y3 = F * (E - D)\n ny = f.redMul(e.redSub(d));\n // Z3 = F * J\n nz = f.redMul(j);\n }\n } else {\n // E = C + D\n e = c.redAdd(d);\n // H = (c * Z1)^2\n h = this.curve._mulC(this.z).redSqr();\n // J = E - 2 * H\n j = e.redSub(h).redSub(h);\n // X3 = c * (B - E) * J\n nx = this.curve._mulC(b.redISub(e)).redMul(j);\n // Y3 = c * E * (C - D)\n ny = this.curve._mulC(e).redMul(c.redISub(d));\n // Z3 = E * J\n nz = e.redMul(j);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.dbl = function dbl() {\n if (this.isInfinity())\n return this;\n\n // Double in extended coordinates\n if (this.curve.extended)\n return this._extDbl();\n else\n return this._projDbl();\n};\n\nPoint.prototype._extAdd = function _extAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html\n // #addition-add-2008-hwcd-3\n // 8M\n\n // A = (Y1 - X1) * (Y2 - X2)\n var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x));\n // B = (Y1 + X1) * (Y2 + X2)\n var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x));\n // C = T1 * k * T2\n var c = this.t.redMul(this.curve.dd).redMul(p.t);\n // D = Z1 * 2 * Z2\n var d = this.z.redMul(p.z.redAdd(p.z));\n // E = B - A\n var e = b.redSub(a);\n // F = D - C\n var f = d.redSub(c);\n // G = D + C\n var g = d.redAdd(c);\n // H = B + A\n var h = b.redAdd(a);\n // X3 = E * F\n var nx = e.redMul(f);\n // Y3 = G * H\n var ny = g.redMul(h);\n // T3 = E * H\n var nt = e.redMul(h);\n // Z3 = F * G\n var nz = f.redMul(g);\n return this.curve.point(nx, ny, nz, nt);\n};\n\nPoint.prototype._projAdd = function _projAdd(p) {\n // hyperelliptic.org/EFD/g1p/auto-twisted-projective.html\n // #addition-add-2008-bbjlp\n // #addition-add-2007-bl\n // 10M + 1S\n\n // A = Z1 * Z2\n var a = this.z.redMul(p.z);\n // B = A^2\n var b = a.redSqr();\n // C = X1 * X2\n var c = this.x.redMul(p.x);\n // D = Y1 * Y2\n var d = this.y.redMul(p.y);\n // E = d * C * D\n var e = this.curve.d.redMul(c).redMul(d);\n // F = B - E\n var f = b.redSub(e);\n // G = B + E\n var g = b.redAdd(e);\n // X3 = A * F * ((X1 + Y1) * (X2 + Y2) - C - D)\n var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d);\n var nx = a.redMul(f).redMul(tmp);\n var ny;\n var nz;\n if (this.curve.twisted) {\n // Y3 = A * G * (D - a * C)\n ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c)));\n // Z3 = F * G\n nz = f.redMul(g);\n } else {\n // Y3 = A * G * (D - C)\n ny = a.redMul(g).redMul(d.redSub(c));\n // Z3 = c * F * G\n nz = this.curve._mulC(f).redMul(g);\n }\n return this.curve.point(nx, ny, nz);\n};\n\nPoint.prototype.add = function add(p) {\n if (this.isInfinity())\n return p;\n if (p.isInfinity())\n return this;\n\n if (this.curve.extended)\n return this._extAdd(p);\n else\n return this._projAdd(p);\n};\n\nPoint.prototype.mul = function mul(k) {\n if (this._hasDoubles(k))\n return this.curve._fixedNafMul(this, k);\n else\n return this.curve._wnafMul(this, k);\n};\n\nPoint.prototype.mulAdd = function mulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, false);\n};\n\nPoint.prototype.jmulAdd = function jmulAdd(k1, p, k2) {\n return this.curve._wnafMulAdd(1, [ this, p ], [ k1, k2 ], 2, true);\n};\n\nPoint.prototype.normalize = function normalize() {\n if (this.zOne)\n return this;\n\n // Normalize coordinates\n var zi = this.z.redInvm();\n this.x = this.x.redMul(zi);\n this.y = this.y.redMul(zi);\n if (this.t)\n this.t = this.t.redMul(zi);\n this.z = this.curve.one;\n this.zOne = true;\n return this;\n};\n\nPoint.prototype.neg = function neg() {\n return this.curve.point(this.x.redNeg(),\n this.y,\n this.z,\n this.t && this.t.redNeg());\n};\n\nPoint.prototype.getX = function getX() {\n this.normalize();\n return this.x.fromRed();\n};\n\nPoint.prototype.getY = function getY() {\n this.normalize();\n return this.y.fromRed();\n};\n\nPoint.prototype.eq = function eq(other) {\n return this === other ||\n this.getX().cmp(other.getX()) === 0 &&\n this.getY().cmp(other.getY()) === 0;\n};\n\nPoint.prototype.eqXToP = function eqXToP(x) {\n var rx = x.toRed(this.curve.red).redMul(this.z);\n if (this.x.cmp(rx) === 0)\n return true;\n\n var xc = x.clone();\n var t = this.curve.redN.redMul(this.z);\n for (;;) {\n xc.iadd(this.curve.n);\n if (xc.cmp(this.curve.p) >= 0)\n return false;\n\n rx.redIAdd(t);\n if (this.x.cmp(rx) === 0)\n return true;\n }\n};\n\n// Compatibility with BaseCurve\nPoint.prototype.toP = Point.prototype.normalize;\nPoint.prototype.mixedAdd = Point.prototype.add;\n","'use strict';\n\nvar assert = require('minimalistic-assert');\nvar inherits = require('inherits');\n\nexports.inherits = inherits;\n\nfunction isSurrogatePair(msg, i) {\n if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) {\n return false;\n }\n if (i < 0 || i + 1 >= msg.length) {\n return false;\n }\n return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00;\n}\n\nfunction toArray(msg, enc) {\n if (Array.isArray(msg))\n return msg.slice();\n if (!msg)\n return [];\n var res = [];\n if (typeof msg === 'string') {\n if (!enc) {\n // Inspired by stringToUtf8ByteArray() in closure-library by Google\n // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143\n // Apache License 2.0\n // https://github.com/google/closure-library/blob/master/LICENSE\n var p = 0;\n for (var i = 0; i < msg.length; i++) {\n var c = msg.charCodeAt(i);\n if (c < 128) {\n res[p++] = c;\n } else if (c < 2048) {\n res[p++] = (c >> 6) | 192;\n res[p++] = (c & 63) | 128;\n } else if (isSurrogatePair(msg, i)) {\n c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF);\n res[p++] = (c >> 18) | 240;\n res[p++] = ((c >> 12) & 63) | 128;\n res[p++] = ((c >> 6) & 63) | 128;\n res[p++] = (c & 63) | 128;\n } else {\n res[p++] = (c >> 12) | 224;\n res[p++] = ((c >> 6) & 63) | 128;\n res[p++] = (c & 63) | 128;\n }\n }\n } else if (enc === 'hex') {\n msg = msg.replace(/[^a-z0-9]+/ig, '');\n if (msg.length % 2 !== 0)\n msg = '0' + msg;\n for (i = 0; i < msg.length; i += 2)\n res.push(parseInt(msg[i] + msg[i + 1], 16));\n }\n } else {\n for (i = 0; i < msg.length; i++)\n res[i] = msg[i] | 0;\n }\n return res;\n}\nexports.toArray = toArray;\n\nfunction toHex(msg) {\n var res = '';\n for (var i = 0; i < msg.length; i++)\n res += zero2(msg[i].toString(16));\n return res;\n}\nexports.toHex = toHex;\n\nfunction htonl(w) {\n var res = (w >>> 24) |\n ((w >>> 8) & 0xff00) |\n ((w << 8) & 0xff0000) |\n ((w & 0xff) << 24);\n return res >>> 0;\n}\nexports.htonl = htonl;\n\nfunction toHex32(msg, endian) {\n var res = '';\n for (var i = 0; i < msg.length; i++) {\n var w = msg[i];\n if (endian === 'little')\n w = htonl(w);\n res += zero8(w.toString(16));\n }\n return res;\n}\nexports.toHex32 = toHex32;\n\nfunction zero2(word) {\n if (word.length === 1)\n return '0' + word;\n else\n return word;\n}\nexports.zero2 = zero2;\n\nfunction zero8(word) {\n if (word.length === 7)\n return '0' + word;\n else if (word.length === 6)\n return '00' + word;\n else if (word.length === 5)\n return '000' + word;\n else if (word.length === 4)\n return '0000' + word;\n else if (word.length === 3)\n return '00000' + word;\n else if (word.length === 2)\n return '000000' + word;\n else if (word.length === 1)\n return '0000000' + word;\n else\n return word;\n}\nexports.zero8 = zero8;\n\nfunction join32(msg, start, end, endian) {\n var len = end - start;\n assert(len % 4 === 0);\n var res = new Array(len / 4);\n for (var i = 0, k = start; i < res.length; i++, k += 4) {\n var w;\n if (endian === 'big')\n w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3];\n else\n w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k];\n res[i] = w >>> 0;\n }\n return res;\n}\nexports.join32 = join32;\n\nfunction split32(msg, endian) {\n var res = new Array(msg.length * 4);\n for (var i = 0, k = 0; i < msg.length; i++, k += 4) {\n var m = msg[i];\n if (endian === 'big') {\n res[k] = m >>> 24;\n res[k + 1] = (m >>> 16) & 0xff;\n res[k + 2] = (m >>> 8) & 0xff;\n res[k + 3] = m & 0xff;\n } else {\n res[k + 3] = m >>> 24;\n res[k + 2] = (m >>> 16) & 0xff;\n res[k + 1] = (m >>> 8) & 0xff;\n res[k] = m & 0xff;\n }\n }\n return res;\n}\nexports.split32 = split32;\n\nfunction rotr32(w, b) {\n return (w >>> b) | (w << (32 - b));\n}\nexports.rotr32 = rotr32;\n\nfunction rotl32(w, b) {\n return (w << b) | (w >>> (32 - b));\n}\nexports.rotl32 = rotl32;\n\nfunction sum32(a, b) {\n return (a + b) >>> 0;\n}\nexports.sum32 = sum32;\n\nfunction sum32_3(a, b, c) {\n return (a + b + c) >>> 0;\n}\nexports.sum32_3 = sum32_3;\n\nfunction sum32_4(a, b, c, d) {\n return (a + b + c + d) >>> 0;\n}\nexports.sum32_4 = sum32_4;\n\nfunction sum32_5(a, b, c, d, e) {\n return (a + b + c + d + e) >>> 0;\n}\nexports.sum32_5 = sum32_5;\n\nfunction sum64(buf, pos, ah, al) {\n var bh = buf[pos];\n var bl = buf[pos + 1];\n\n var lo = (al + bl) >>> 0;\n var hi = (lo < al ? 1 : 0) + ah + bh;\n buf[pos] = hi >>> 0;\n buf[pos + 1] = lo;\n}\nexports.sum64 = sum64;\n\nfunction sum64_hi(ah, al, bh, bl) {\n var lo = (al + bl) >>> 0;\n var hi = (lo < al ? 1 : 0) + ah + bh;\n return hi >>> 0;\n}\nexports.sum64_hi = sum64_hi;\n\nfunction sum64_lo(ah, al, bh, bl) {\n var lo = al + bl;\n return lo >>> 0;\n}\nexports.sum64_lo = sum64_lo;\n\nfunction sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) {\n var carry = 0;\n var lo = al;\n lo = (lo + bl) >>> 0;\n carry += lo < al ? 1 : 0;\n lo = (lo + cl) >>> 0;\n carry += lo < cl ? 1 : 0;\n lo = (lo + dl) >>> 0;\n carry += lo < dl ? 1 : 0;\n\n var hi = ah + bh + ch + dh + carry;\n return hi >>> 0;\n}\nexports.sum64_4_hi = sum64_4_hi;\n\nfunction sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) {\n var lo = al + bl + cl + dl;\n return lo >>> 0;\n}\nexports.sum64_4_lo = sum64_4_lo;\n\nfunction sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n var carry = 0;\n var lo = al;\n lo = (lo + bl) >>> 0;\n carry += lo < al ? 1 : 0;\n lo = (lo + cl) >>> 0;\n carry += lo < cl ? 1 : 0;\n lo = (lo + dl) >>> 0;\n carry += lo < dl ? 1 : 0;\n lo = (lo + el) >>> 0;\n carry += lo < el ? 1 : 0;\n\n var hi = ah + bh + ch + dh + eh + carry;\n return hi >>> 0;\n}\nexports.sum64_5_hi = sum64_5_hi;\n\nfunction sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) {\n var lo = al + bl + cl + dl + el;\n\n return lo >>> 0;\n}\nexports.sum64_5_lo = sum64_5_lo;\n\nfunction rotr64_hi(ah, al, num) {\n var r = (al << (32 - num)) | (ah >>> num);\n return r >>> 0;\n}\nexports.rotr64_hi = rotr64_hi;\n\nfunction rotr64_lo(ah, al, num) {\n var r = (ah << (32 - num)) | (al >>> num);\n return r >>> 0;\n}\nexports.rotr64_lo = rotr64_lo;\n\nfunction shr64_hi(ah, al, num) {\n return ah >>> num;\n}\nexports.shr64_hi = shr64_hi;\n\nfunction shr64_lo(ah, al, num) {\n var r = (ah << (32 - num)) | (al >>> num);\n return r >>> 0;\n}\nexports.shr64_lo = shr64_lo;\n","'use strict';\n\nvar utils = require('./utils');\nvar assert = require('minimalistic-assert');\n\nfunction BlockHash() {\n this.pending = null;\n this.pendingTotal = 0;\n this.blockSize = this.constructor.blockSize;\n this.outSize = this.constructor.outSize;\n this.hmacStrength = this.constructor.hmacStrength;\n this.padLength = this.constructor.padLength / 8;\n this.endian = 'big';\n\n this._delta8 = this.blockSize / 8;\n this._delta32 = this.blockSize / 32;\n}\nexports.BlockHash = BlockHash;\n\nBlockHash.prototype.update = function update(msg, enc) {\n // Convert message to array, pad it, and join into 32bit blocks\n msg = utils.toArray(msg, enc);\n if (!this.pending)\n this.pending = msg;\n else\n this.pending = this.pending.concat(msg);\n this.pendingTotal += msg.length;\n\n // Enough data, try updating\n if (this.pending.length >= this._delta8) {\n msg = this.pending;\n\n // Process pending data in blocks\n var r = msg.length % this._delta8;\n this.pending = msg.slice(msg.length - r, msg.length);\n if (this.pending.length === 0)\n this.pending = null;\n\n msg = utils.join32(msg, 0, msg.length - r, this.endian);\n for (var i = 0; i < msg.length; i += this._delta32)\n this._update(msg, i, i + this._delta32);\n }\n\n return this;\n};\n\nBlockHash.prototype.digest = function digest(enc) {\n this.update(this._pad());\n assert(this.pending === null);\n\n return this._digest(enc);\n};\n\nBlockHash.prototype._pad = function pad() {\n var len = this.pendingTotal;\n var bytes = this._delta8;\n var k = bytes - ((len + this.padLength) % bytes);\n var res = new Array(k + this.padLength);\n res[0] = 0x80;\n for (var i = 1; i < k; i++)\n res[i] = 0;\n\n // Append length\n len <<= 3;\n if (this.endian === 'big') {\n for (var t = 8; t < this.padLength; t++)\n res[i++] = 0;\n\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = (len >>> 24) & 0xff;\n res[i++] = (len >>> 16) & 0xff;\n res[i++] = (len >>> 8) & 0xff;\n res[i++] = len & 0xff;\n } else {\n res[i++] = len & 0xff;\n res[i++] = (len >>> 8) & 0xff;\n res[i++] = (len >>> 16) & 0xff;\n res[i++] = (len >>> 24) & 0xff;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n res[i++] = 0;\n\n for (t = 8; t < this.padLength; t++)\n res[i++] = 0;\n }\n\n return res;\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar rotr32 = utils.rotr32;\n\nfunction ft_1(s, x, y, z) {\n if (s === 0)\n return ch32(x, y, z);\n if (s === 1 || s === 3)\n return p32(x, y, z);\n if (s === 2)\n return maj32(x, y, z);\n}\nexports.ft_1 = ft_1;\n\nfunction ch32(x, y, z) {\n return (x & y) ^ ((~x) & z);\n}\nexports.ch32 = ch32;\n\nfunction maj32(x, y, z) {\n return (x & y) ^ (x & z) ^ (y & z);\n}\nexports.maj32 = maj32;\n\nfunction p32(x, y, z) {\n return x ^ y ^ z;\n}\nexports.p32 = p32;\n\nfunction s0_256(x) {\n return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22);\n}\nexports.s0_256 = s0_256;\n\nfunction s1_256(x) {\n return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25);\n}\nexports.s1_256 = s1_256;\n\nfunction g0_256(x) {\n return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3);\n}\nexports.g0_256 = g0_256;\n\nfunction g1_256(x) {\n return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10);\n}\nexports.g1_256 = g1_256;\n","'use strict';\n\nvar utils = require('../utils');\nvar common = require('../common');\nvar shaCommon = require('./common');\nvar assert = require('minimalistic-assert');\n\nvar sum32 = utils.sum32;\nvar sum32_4 = utils.sum32_4;\nvar sum32_5 = utils.sum32_5;\nvar ch32 = shaCommon.ch32;\nvar maj32 = shaCommon.maj32;\nvar s0_256 = shaCommon.s0_256;\nvar s1_256 = shaCommon.s1_256;\nvar g0_256 = shaCommon.g0_256;\nvar g1_256 = shaCommon.g1_256;\n\nvar BlockHash = common.BlockHash;\n\nvar sha256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n];\n\nfunction SHA256() {\n if (!(this instanceof SHA256))\n return new SHA256();\n\n BlockHash.call(this);\n this.h = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n ];\n this.k = sha256_K;\n this.W = new Array(64);\n}\nutils.inherits(SHA256, BlockHash);\nmodule.exports = SHA256;\n\nSHA256.blockSize = 512;\nSHA256.outSize = 256;\nSHA256.hmacStrength = 192;\nSHA256.padLength = 64;\n\nSHA256.prototype._update = function _update(msg, start) {\n var W = this.W;\n\n for (var i = 0; i < 16; i++)\n W[i] = msg[start + i];\n for (; i < W.length; i++)\n W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]);\n\n var a = this.h[0];\n var b = this.h[1];\n var c = this.h[2];\n var d = this.h[3];\n var e = this.h[4];\n var f = this.h[5];\n var g = this.h[6];\n var h = this.h[7];\n\n assert(this.k.length === W.length);\n for (i = 0; i < W.length; i++) {\n var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]);\n var T2 = sum32(s0_256(a), maj32(a, b, c));\n h = g;\n g = f;\n f = e;\n e = sum32(d, T1);\n d = c;\n c = b;\n b = a;\n a = sum32(T1, T2);\n }\n\n this.h[0] = sum32(this.h[0], a);\n this.h[1] = sum32(this.h[1], b);\n this.h[2] = sum32(this.h[2], c);\n this.h[3] = sum32(this.h[3], d);\n this.h[4] = sum32(this.h[4], e);\n this.h[5] = sum32(this.h[5], f);\n this.h[6] = sum32(this.h[6], g);\n this.h[7] = sum32(this.h[7], h);\n};\n\nSHA256.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar common = require('../common');\nvar assert = require('minimalistic-assert');\n\nvar rotr64_hi = utils.rotr64_hi;\nvar rotr64_lo = utils.rotr64_lo;\nvar shr64_hi = utils.shr64_hi;\nvar shr64_lo = utils.shr64_lo;\nvar sum64 = utils.sum64;\nvar sum64_hi = utils.sum64_hi;\nvar sum64_lo = utils.sum64_lo;\nvar sum64_4_hi = utils.sum64_4_hi;\nvar sum64_4_lo = utils.sum64_4_lo;\nvar sum64_5_hi = utils.sum64_5_hi;\nvar sum64_5_lo = utils.sum64_5_lo;\n\nvar BlockHash = common.BlockHash;\n\nvar sha512_K = [\n 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction SHA512() {\n if (!(this instanceof SHA512))\n return new SHA512();\n\n BlockHash.call(this);\n this.h = [\n 0x6a09e667, 0xf3bcc908,\n 0xbb67ae85, 0x84caa73b,\n 0x3c6ef372, 0xfe94f82b,\n 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1,\n 0x9b05688c, 0x2b3e6c1f,\n 0x1f83d9ab, 0xfb41bd6b,\n 0x5be0cd19, 0x137e2179 ];\n this.k = sha512_K;\n this.W = new Array(160);\n}\nutils.inherits(SHA512, BlockHash);\nmodule.exports = SHA512;\n\nSHA512.blockSize = 1024;\nSHA512.outSize = 512;\nSHA512.hmacStrength = 192;\nSHA512.padLength = 128;\n\nSHA512.prototype._prepareBlock = function _prepareBlock(msg, start) {\n var W = this.W;\n\n // 32 x 32bit words\n for (var i = 0; i < 32; i++)\n W[i] = msg[start + i];\n for (; i < W.length; i += 2) {\n var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2\n var c0_lo = g1_512_lo(W[i - 4], W[i - 3]);\n var c1_hi = W[i - 14]; // i - 7\n var c1_lo = W[i - 13];\n var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15\n var c2_lo = g0_512_lo(W[i - 30], W[i - 29]);\n var c3_hi = W[i - 32]; // i - 16\n var c3_lo = W[i - 31];\n\n W[i] = sum64_4_hi(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo);\n W[i + 1] = sum64_4_lo(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo);\n }\n};\n\nSHA512.prototype._update = function _update(msg, start) {\n this._prepareBlock(msg, start);\n\n var W = this.W;\n\n var ah = this.h[0];\n var al = this.h[1];\n var bh = this.h[2];\n var bl = this.h[3];\n var ch = this.h[4];\n var cl = this.h[5];\n var dh = this.h[6];\n var dl = this.h[7];\n var eh = this.h[8];\n var el = this.h[9];\n var fh = this.h[10];\n var fl = this.h[11];\n var gh = this.h[12];\n var gl = this.h[13];\n var hh = this.h[14];\n var hl = this.h[15];\n\n assert(this.k.length === W.length);\n for (var i = 0; i < W.length; i += 2) {\n var c0_hi = hh;\n var c0_lo = hl;\n var c1_hi = s1_512_hi(eh, el);\n var c1_lo = s1_512_lo(eh, el);\n var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl);\n var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl);\n var c3_hi = this.k[i];\n var c3_lo = this.k[i + 1];\n var c4_hi = W[i];\n var c4_lo = W[i + 1];\n\n var T1_hi = sum64_5_hi(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo,\n c4_hi, c4_lo);\n var T1_lo = sum64_5_lo(\n c0_hi, c0_lo,\n c1_hi, c1_lo,\n c2_hi, c2_lo,\n c3_hi, c3_lo,\n c4_hi, c4_lo);\n\n c0_hi = s0_512_hi(ah, al);\n c0_lo = s0_512_lo(ah, al);\n c1_hi = maj64_hi(ah, al, bh, bl, ch, cl);\n c1_lo = maj64_lo(ah, al, bh, bl, ch, cl);\n\n var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo);\n var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo);\n\n hh = gh;\n hl = gl;\n\n gh = fh;\n gl = fl;\n\n fh = eh;\n fl = el;\n\n eh = sum64_hi(dh, dl, T1_hi, T1_lo);\n el = sum64_lo(dl, dl, T1_hi, T1_lo);\n\n dh = ch;\n dl = cl;\n\n ch = bh;\n cl = bl;\n\n bh = ah;\n bl = al;\n\n ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo);\n al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo);\n }\n\n sum64(this.h, 0, ah, al);\n sum64(this.h, 2, bh, bl);\n sum64(this.h, 4, ch, cl);\n sum64(this.h, 6, dh, dl);\n sum64(this.h, 8, eh, el);\n sum64(this.h, 10, fh, fl);\n sum64(this.h, 12, gh, gl);\n sum64(this.h, 14, hh, hl);\n};\n\nSHA512.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n\nfunction ch64_hi(xh, xl, yh, yl, zh) {\n var r = (xh & yh) ^ ((~xh) & zh);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction ch64_lo(xh, xl, yh, yl, zh, zl) {\n var r = (xl & yl) ^ ((~xl) & zl);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction maj64_hi(xh, xl, yh, yl, zh) {\n var r = (xh & yh) ^ (xh & zh) ^ (yh & zh);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction maj64_lo(xh, xl, yh, yl, zh, zl) {\n var r = (xl & yl) ^ (xl & zl) ^ (yl & zl);\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s0_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 28);\n var c1_hi = rotr64_hi(xl, xh, 2); // 34\n var c2_hi = rotr64_hi(xl, xh, 7); // 39\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s0_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 28);\n var c1_lo = rotr64_lo(xl, xh, 2); // 34\n var c2_lo = rotr64_lo(xl, xh, 7); // 39\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s1_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 14);\n var c1_hi = rotr64_hi(xh, xl, 18);\n var c2_hi = rotr64_hi(xl, xh, 9); // 41\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction s1_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 14);\n var c1_lo = rotr64_lo(xh, xl, 18);\n var c2_lo = rotr64_lo(xl, xh, 9); // 41\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g0_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 1);\n var c1_hi = rotr64_hi(xh, xl, 8);\n var c2_hi = shr64_hi(xh, xl, 7);\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g0_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 1);\n var c1_lo = rotr64_lo(xh, xl, 8);\n var c2_lo = shr64_lo(xh, xl, 7);\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g1_512_hi(xh, xl) {\n var c0_hi = rotr64_hi(xh, xl, 19);\n var c1_hi = rotr64_hi(xl, xh, 29); // 61\n var c2_hi = shr64_hi(xh, xl, 6);\n\n var r = c0_hi ^ c1_hi ^ c2_hi;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n\nfunction g1_512_lo(xh, xl) {\n var c0_lo = rotr64_lo(xh, xl, 19);\n var c1_lo = rotr64_lo(xl, xh, 29); // 61\n var c2_lo = shr64_lo(xh, xl, 6);\n\n var r = c0_lo ^ c1_lo ^ c2_lo;\n if (r < 0)\n r += 0x100000000;\n return r;\n}\n","'use strict';\n\nexports.sha1 = require('./sha/1');\nexports.sha224 = require('./sha/224');\nexports.sha256 = require('./sha/256');\nexports.sha384 = require('./sha/384');\nexports.sha512 = require('./sha/512');\n","'use strict';\n\nvar utils = require('../utils');\nvar common = require('../common');\nvar shaCommon = require('./common');\n\nvar rotl32 = utils.rotl32;\nvar sum32 = utils.sum32;\nvar sum32_5 = utils.sum32_5;\nvar ft_1 = shaCommon.ft_1;\nvar BlockHash = common.BlockHash;\n\nvar sha1_K = [\n 0x5A827999, 0x6ED9EBA1,\n 0x8F1BBCDC, 0xCA62C1D6\n];\n\nfunction SHA1() {\n if (!(this instanceof SHA1))\n return new SHA1();\n\n BlockHash.call(this);\n this.h = [\n 0x67452301, 0xefcdab89, 0x98badcfe,\n 0x10325476, 0xc3d2e1f0 ];\n this.W = new Array(80);\n}\n\nutils.inherits(SHA1, BlockHash);\nmodule.exports = SHA1;\n\nSHA1.blockSize = 512;\nSHA1.outSize = 160;\nSHA1.hmacStrength = 80;\nSHA1.padLength = 64;\n\nSHA1.prototype._update = function _update(msg, start) {\n var W = this.W;\n\n for (var i = 0; i < 16; i++)\n W[i] = msg[start + i];\n\n for(; i < W.length; i++)\n W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);\n\n var a = this.h[0];\n var b = this.h[1];\n var c = this.h[2];\n var d = this.h[3];\n var e = this.h[4];\n\n for (i = 0; i < W.length; i++) {\n var s = ~~(i / 20);\n var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]);\n e = d;\n d = c;\n c = rotl32(b, 30);\n b = a;\n a = t;\n }\n\n this.h[0] = sum32(this.h[0], a);\n this.h[1] = sum32(this.h[1], b);\n this.h[2] = sum32(this.h[2], c);\n this.h[3] = sum32(this.h[3], d);\n this.h[4] = sum32(this.h[4], e);\n};\n\nSHA1.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'big');\n else\n return utils.split32(this.h, 'big');\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar SHA256 = require('./256');\n\nfunction SHA224() {\n if (!(this instanceof SHA224))\n return new SHA224();\n\n SHA256.call(this);\n this.h = [\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ];\n}\nutils.inherits(SHA224, SHA256);\nmodule.exports = SHA224;\n\nSHA224.blockSize = 512;\nSHA224.outSize = 224;\nSHA224.hmacStrength = 192;\nSHA224.padLength = 64;\n\nSHA224.prototype._digest = function digest(enc) {\n // Just truncate output\n if (enc === 'hex')\n return utils.toHex32(this.h.slice(0, 7), 'big');\n else\n return utils.split32(this.h.slice(0, 7), 'big');\n};\n\n","'use strict';\n\nvar utils = require('../utils');\n\nvar SHA512 = require('./512');\n\nfunction SHA384() {\n if (!(this instanceof SHA384))\n return new SHA384();\n\n SHA512.call(this);\n this.h = [\n 0xcbbb9d5d, 0xc1059ed8,\n 0x629a292a, 0x367cd507,\n 0x9159015a, 0x3070dd17,\n 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31,\n 0x8eb44a87, 0x68581511,\n 0xdb0c2e0d, 0x64f98fa7,\n 0x47b5481d, 0xbefa4fa4 ];\n}\nutils.inherits(SHA384, SHA512);\nmodule.exports = SHA384;\n\nSHA384.blockSize = 1024;\nSHA384.outSize = 384;\nSHA384.hmacStrength = 192;\nSHA384.padLength = 128;\n\nSHA384.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h.slice(0, 12), 'big');\n else\n return utils.split32(this.h.slice(0, 12), 'big');\n};\n","var hash = exports;\n\nhash.utils = require('./hash/utils');\nhash.common = require('./hash/common');\nhash.sha = require('./hash/sha');\nhash.ripemd = require('./hash/ripemd');\nhash.hmac = require('./hash/hmac');\n\n// Proxy hash functions to the main object\nhash.sha1 = hash.sha.sha1;\nhash.sha256 = hash.sha.sha256;\nhash.sha224 = hash.sha.sha224;\nhash.sha384 = hash.sha.sha384;\nhash.sha512 = hash.sha.sha512;\nhash.ripemd160 = hash.ripemd.ripemd160;\n","'use strict';\n\nvar utils = require('./utils');\nvar common = require('./common');\n\nvar rotl32 = utils.rotl32;\nvar sum32 = utils.sum32;\nvar sum32_3 = utils.sum32_3;\nvar sum32_4 = utils.sum32_4;\nvar BlockHash = common.BlockHash;\n\nfunction RIPEMD160() {\n if (!(this instanceof RIPEMD160))\n return new RIPEMD160();\n\n BlockHash.call(this);\n\n this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ];\n this.endian = 'little';\n}\nutils.inherits(RIPEMD160, BlockHash);\nexports.ripemd160 = RIPEMD160;\n\nRIPEMD160.blockSize = 512;\nRIPEMD160.outSize = 160;\nRIPEMD160.hmacStrength = 192;\nRIPEMD160.padLength = 64;\n\nRIPEMD160.prototype._update = function update(msg, start) {\n var A = this.h[0];\n var B = this.h[1];\n var C = this.h[2];\n var D = this.h[3];\n var E = this.h[4];\n var Ah = A;\n var Bh = B;\n var Ch = C;\n var Dh = D;\n var Eh = E;\n for (var j = 0; j < 80; j++) {\n var T = sum32(\n rotl32(\n sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)),\n s[j]),\n E);\n A = E;\n E = D;\n D = rotl32(C, 10);\n C = B;\n B = T;\n T = sum32(\n rotl32(\n sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)),\n sh[j]),\n Eh);\n Ah = Eh;\n Eh = Dh;\n Dh = rotl32(Ch, 10);\n Ch = Bh;\n Bh = T;\n }\n T = sum32_3(this.h[1], C, Dh);\n this.h[1] = sum32_3(this.h[2], D, Eh);\n this.h[2] = sum32_3(this.h[3], E, Ah);\n this.h[3] = sum32_3(this.h[4], A, Bh);\n this.h[4] = sum32_3(this.h[0], B, Ch);\n this.h[0] = T;\n};\n\nRIPEMD160.prototype._digest = function digest(enc) {\n if (enc === 'hex')\n return utils.toHex32(this.h, 'little');\n else\n return utils.split32(this.h, 'little');\n};\n\nfunction f(j, x, y, z) {\n if (j <= 15)\n return x ^ y ^ z;\n else if (j <= 31)\n return (x & y) | ((~x) & z);\n else if (j <= 47)\n return (x | (~y)) ^ z;\n else if (j <= 63)\n return (x & z) | (y & (~z));\n else\n return x ^ (y | (~z));\n}\n\nfunction K(j) {\n if (j <= 15)\n return 0x00000000;\n else if (j <= 31)\n return 0x5a827999;\n else if (j <= 47)\n return 0x6ed9eba1;\n else if (j <= 63)\n return 0x8f1bbcdc;\n else\n return 0xa953fd4e;\n}\n\nfunction Kh(j) {\n if (j <= 15)\n return 0x50a28be6;\n else if (j <= 31)\n return 0x5c4dd124;\n else if (j <= 47)\n return 0x6d703ef3;\n else if (j <= 63)\n return 0x7a6d76e9;\n else\n return 0x00000000;\n}\n\nvar r = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\n 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\n 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13\n];\n\nvar rh = [\n 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\n 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\n 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\n 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\n 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11\n];\n\nvar s = [\n 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\n 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\n 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\n 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\n 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6\n];\n\nvar sh = [\n 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\n 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\n 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\n 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\n 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11\n];\n","'use strict';\n\nvar utils = require('./utils');\nvar assert = require('minimalistic-assert');\n\nfunction Hmac(hash, key, enc) {\n if (!(this instanceof Hmac))\n return new Hmac(hash, key, enc);\n this.Hash = hash;\n this.blockSize = hash.blockSize / 8;\n this.outSize = hash.outSize / 8;\n this.inner = null;\n this.outer = null;\n\n this._init(utils.toArray(key, enc));\n}\nmodule.exports = Hmac;\n\nHmac.prototype._init = function init(key) {\n // Shorten key, if needed\n if (key.length > this.blockSize)\n key = new this.Hash().update(key).digest();\n assert(key.length <= this.blockSize);\n\n // Add padding to key\n for (var i = key.length; i < this.blockSize; i++)\n key.push(0);\n\n for (i = 0; i < key.length; i++)\n key[i] ^= 0x36;\n this.inner = new this.Hash().update(key);\n\n // 0x36 ^ 0x5c = 0x6a\n for (i = 0; i < key.length; i++)\n key[i] ^= 0x6a;\n this.outer = new this.Hash().update(key);\n};\n\nHmac.prototype.update = function update(msg, enc) {\n this.inner.update(msg, enc);\n return this;\n};\n\nHmac.prototype.digest = function digest(enc) {\n this.outer.update(this.inner.digest());\n return this.outer.digest(enc);\n};\n","'use strict';\n\nvar curves = exports;\n\nvar hash = require('hash.js');\nvar curve = require('./curve');\nvar utils = require('./utils');\n\nvar assert = utils.assert;\n\nfunction PresetCurve(options) {\n if (options.type === 'short')\n this.curve = new curve.short(options);\n else if (options.type === 'edwards')\n this.curve = new curve.edwards(options);\n else\n this.curve = new curve.mont(options);\n this.g = this.curve.g;\n this.n = this.curve.n;\n this.hash = options.hash;\n\n assert(this.g.validate(), 'Invalid curve');\n assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O');\n}\ncurves.PresetCurve = PresetCurve;\n\nfunction defineCurve(name, options) {\n Object.defineProperty(curves, name, {\n configurable: true,\n enumerable: true,\n get: function() {\n var curve = new PresetCurve(options);\n Object.defineProperty(curves, name, {\n configurable: true,\n enumerable: true,\n value: curve,\n });\n return curve;\n },\n });\n}\n\ndefineCurve('p192', {\n type: 'short',\n prime: 'p192',\n p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff',\n a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc',\n b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1',\n n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831',\n hash: hash.sha256,\n gRed: false,\n g: [\n '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012',\n '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811',\n ],\n});\n\ndefineCurve('p224', {\n type: 'short',\n prime: 'p224',\n p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001',\n a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe',\n b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4',\n n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d',\n hash: hash.sha256,\n gRed: false,\n g: [\n 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21',\n 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34',\n ],\n});\n\ndefineCurve('p256', {\n type: 'short',\n prime: null,\n p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff',\n a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc',\n b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b',\n n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551',\n hash: hash.sha256,\n gRed: false,\n g: [\n '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296',\n '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5',\n ],\n});\n\ndefineCurve('p384', {\n type: 'short',\n prime: null,\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'fffffffe ffffffff 00000000 00000000 ffffffff',\n a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'fffffffe ffffffff 00000000 00000000 fffffffc',\n b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' +\n '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef',\n n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' +\n 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973',\n hash: hash.sha384,\n gRed: false,\n g: [\n 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' +\n '5502f25d bf55296c 3a545e38 72760ab7',\n '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' +\n '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f',\n ],\n});\n\ndefineCurve('p521', {\n type: 'short',\n prime: null,\n p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff',\n a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff ffffffff ffffffff fffffffc',\n b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' +\n '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' +\n '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00',\n n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' +\n 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' +\n 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409',\n hash: hash.sha512,\n gRed: false,\n g: [\n '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' +\n '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' +\n 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66',\n '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' +\n '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' +\n '3fad0761 353c7086 a272c240 88be9476 9fd16650',\n ],\n});\n\ndefineCurve('curve25519', {\n type: 'mont',\n prime: 'p25519',\n p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',\n a: '76d06',\n b: '1',\n n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',\n hash: hash.sha256,\n gRed: false,\n g: [\n '9',\n ],\n});\n\ndefineCurve('ed25519', {\n type: 'edwards',\n prime: 'p25519',\n p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed',\n a: '-1',\n c: '1',\n // -121665 * (121666^(-1)) (mod P)\n d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3',\n n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed',\n hash: hash.sha256,\n gRed: false,\n g: [\n '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a',\n\n // 4/5\n '6666666666666666666666666666666666666666666666666666666666666658',\n ],\n});\n\nvar pre;\ntry {\n pre = require('./precomputed/secp256k1');\n} catch (e) {\n pre = undefined;\n}\n\ndefineCurve('secp256k1', {\n type: 'short',\n prime: 'k256',\n p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f',\n a: '0',\n b: '7',\n n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141',\n h: '1',\n hash: hash.sha256,\n\n // Precomputed endomorphism\n beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee',\n lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72',\n basis: [\n {\n a: '3086d221a7d46bcde86c90e49284eb15',\n b: '-e4437ed6010e88286f547fa90abfe4c3',\n },\n {\n a: '114ca50f7a8e2f3f657c1108d9d44cfd8',\n b: '3086d221a7d46bcde86c90e49284eb15',\n },\n ],\n\n gRed: false,\n g: [\n '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798',\n '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8',\n pre,\n ],\n});\n","module.exports = {\n doubles: {\n step: 4,\n points: [\n [\n 'e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a',\n 'f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821',\n ],\n [\n '8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508',\n '11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf',\n ],\n [\n '175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739',\n 'd3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695',\n ],\n [\n '363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640',\n '4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9',\n ],\n [\n '8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c',\n '4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36',\n ],\n [\n '723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda',\n '96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f',\n ],\n [\n 'eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa',\n '5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999',\n ],\n [\n '100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0',\n 'cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09',\n ],\n [\n 'e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d',\n '9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d',\n ],\n [\n 'feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d',\n 'e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088',\n ],\n [\n 'da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1',\n '9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d',\n ],\n [\n '53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0',\n '5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8',\n ],\n [\n '8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047',\n '10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a',\n ],\n [\n '385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862',\n '283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453',\n ],\n [\n '6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7',\n '7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160',\n ],\n [\n '3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd',\n '56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0',\n ],\n [\n '85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83',\n '7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6',\n ],\n [\n '948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a',\n '53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589',\n ],\n [\n '6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8',\n 'bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17',\n ],\n [\n 'e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d',\n '4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda',\n ],\n [\n 'e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725',\n '7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd',\n ],\n [\n '213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754',\n '4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2',\n ],\n [\n '4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c',\n '17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6',\n ],\n [\n 'fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6',\n '6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f',\n ],\n [\n '76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39',\n 'c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01',\n ],\n [\n 'c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891',\n '893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3',\n ],\n [\n 'd895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b',\n 'febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f',\n ],\n [\n 'b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03',\n '2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7',\n ],\n [\n 'e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d',\n 'eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78',\n ],\n [\n 'a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070',\n '7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1',\n ],\n [\n '90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4',\n 'e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150',\n ],\n [\n '8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da',\n '662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82',\n ],\n [\n 'e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11',\n '1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc',\n ],\n [\n '8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e',\n 'efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b',\n ],\n [\n 'e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41',\n '2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51',\n ],\n [\n 'b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef',\n '67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45',\n ],\n [\n 'd68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8',\n 'db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120',\n ],\n [\n '324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d',\n '648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84',\n ],\n [\n '4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96',\n '35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d',\n ],\n [\n '9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd',\n 'ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d',\n ],\n [\n '6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5',\n '9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8',\n ],\n [\n 'a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266',\n '40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8',\n ],\n [\n '7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71',\n '34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac',\n ],\n [\n '928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac',\n 'c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f',\n ],\n [\n '85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751',\n '1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962',\n ],\n [\n 'ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e',\n '493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907',\n ],\n [\n '827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241',\n 'c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec',\n ],\n [\n 'eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3',\n 'be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d',\n ],\n [\n 'e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f',\n '4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414',\n ],\n [\n '1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19',\n 'aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd',\n ],\n [\n '146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be',\n 'b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0',\n ],\n [\n 'fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9',\n '6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811',\n ],\n [\n 'da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2',\n '8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1',\n ],\n [\n 'a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13',\n '7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c',\n ],\n [\n '174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c',\n 'ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73',\n ],\n [\n '959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba',\n '2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd',\n ],\n [\n 'd2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151',\n 'e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405',\n ],\n [\n '64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073',\n 'd99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589',\n ],\n [\n '8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458',\n '38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e',\n ],\n [\n '13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b',\n '69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27',\n ],\n [\n 'bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366',\n 'd3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1',\n ],\n [\n '8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa',\n '40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482',\n ],\n [\n '8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0',\n '620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945',\n ],\n [\n 'dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787',\n '7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573',\n ],\n [\n 'f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e',\n 'ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82',\n ],\n ],\n },\n naf: {\n wnd: 7,\n points: [\n [\n 'f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9',\n '388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672',\n ],\n [\n '2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4',\n 'd8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6',\n ],\n [\n '5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc',\n '6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da',\n ],\n [\n 'acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe',\n 'cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37',\n ],\n [\n '774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb',\n 'd984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b',\n ],\n [\n 'f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8',\n 'ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81',\n ],\n [\n 'd7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e',\n '581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58',\n ],\n [\n 'defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34',\n '4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77',\n ],\n [\n '2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c',\n '85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a',\n ],\n [\n '352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5',\n '321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c',\n ],\n [\n '2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f',\n '2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67',\n ],\n [\n '9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714',\n '73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402',\n ],\n [\n 'daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729',\n 'a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55',\n ],\n [\n 'c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db',\n '2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482',\n ],\n [\n '6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4',\n 'e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82',\n ],\n [\n '1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5',\n 'b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396',\n ],\n [\n '605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479',\n '2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49',\n ],\n [\n '62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d',\n '80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf',\n ],\n [\n '80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f',\n '1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a',\n ],\n [\n '7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb',\n 'd0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7',\n ],\n [\n 'd528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9',\n 'eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933',\n ],\n [\n '49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963',\n '758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a',\n ],\n [\n '77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74',\n '958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6',\n ],\n [\n 'f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530',\n 'e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37',\n ],\n [\n '463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b',\n '5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e',\n ],\n [\n 'f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247',\n 'cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6',\n ],\n [\n 'caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1',\n 'cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476',\n ],\n [\n '2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120',\n '4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40',\n ],\n [\n '7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435',\n '91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61',\n ],\n [\n '754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18',\n '673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683',\n ],\n [\n 'e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8',\n '59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5',\n ],\n [\n '186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb',\n '3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b',\n ],\n [\n 'df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f',\n '55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417',\n ],\n [\n '5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143',\n 'efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868',\n ],\n [\n '290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba',\n 'e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a',\n ],\n [\n 'af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45',\n 'f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6',\n ],\n [\n '766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a',\n '744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996',\n ],\n [\n '59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e',\n 'c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e',\n ],\n [\n 'f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8',\n 'e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d',\n ],\n [\n '7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c',\n '30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2',\n ],\n [\n '948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519',\n 'e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e',\n ],\n [\n '7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab',\n '100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437',\n ],\n [\n '3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca',\n 'ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311',\n ],\n [\n 'd3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf',\n '8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4',\n ],\n [\n '1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610',\n '68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575',\n ],\n [\n '733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4',\n 'f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d',\n ],\n [\n '15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c',\n 'd56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d',\n ],\n [\n 'a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940',\n 'edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629',\n ],\n [\n 'e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980',\n 'a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06',\n ],\n [\n '311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3',\n '66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374',\n ],\n [\n '34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf',\n '9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee',\n ],\n [\n 'f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63',\n '4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1',\n ],\n [\n 'd7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448',\n 'fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b',\n ],\n [\n '32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf',\n '5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661',\n ],\n [\n '7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5',\n '8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6',\n ],\n [\n 'ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6',\n '8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e',\n ],\n [\n '16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5',\n '5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d',\n ],\n [\n 'eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99',\n 'f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc',\n ],\n [\n '78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51',\n 'f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4',\n ],\n [\n '494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5',\n '42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c',\n ],\n [\n 'a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5',\n '204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b',\n ],\n [\n 'c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997',\n '4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913',\n ],\n [\n '841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881',\n '73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154',\n ],\n [\n '5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5',\n '39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865',\n ],\n [\n '36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66',\n 'd2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc',\n ],\n [\n '336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726',\n 'ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224',\n ],\n [\n '8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede',\n '6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e',\n ],\n [\n '1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94',\n '60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6',\n ],\n [\n '85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31',\n '3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511',\n ],\n [\n '29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51',\n 'b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b',\n ],\n [\n 'a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252',\n 'ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2',\n ],\n [\n '4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5',\n 'cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c',\n ],\n [\n 'd24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b',\n '6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3',\n ],\n [\n 'ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4',\n '322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d',\n ],\n [\n 'af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f',\n '6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700',\n ],\n [\n 'e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889',\n '2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4',\n ],\n [\n '591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246',\n 'b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196',\n ],\n [\n '11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984',\n '998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4',\n ],\n [\n '3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a',\n 'b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257',\n ],\n [\n 'cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030',\n 'bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13',\n ],\n [\n 'c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197',\n '6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096',\n ],\n [\n 'c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593',\n 'c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38',\n ],\n [\n 'a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef',\n '21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f',\n ],\n [\n '347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38',\n '60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448',\n ],\n [\n 'da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a',\n '49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a',\n ],\n [\n 'c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111',\n '5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4',\n ],\n [\n '4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502',\n '7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437',\n ],\n [\n '3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea',\n 'be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7',\n ],\n [\n 'cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26',\n '8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d',\n ],\n [\n 'b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986',\n '39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a',\n ],\n [\n 'd4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e',\n '62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54',\n ],\n [\n '48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4',\n '25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77',\n ],\n [\n 'dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda',\n 'ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517',\n ],\n [\n '6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859',\n 'cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10',\n ],\n [\n 'e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f',\n 'f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125',\n ],\n [\n 'eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c',\n '6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e',\n ],\n [\n '13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942',\n 'fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1',\n ],\n [\n 'ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a',\n '1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2',\n ],\n [\n 'b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80',\n '5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423',\n ],\n [\n 'ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d',\n '438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8',\n ],\n [\n '8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1',\n 'cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758',\n ],\n [\n '52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63',\n 'c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375',\n ],\n [\n 'e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352',\n '6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d',\n ],\n [\n '7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193',\n 'ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec',\n ],\n [\n '5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00',\n '9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0',\n ],\n [\n '32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58',\n 'ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c',\n ],\n [\n 'e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7',\n 'd3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4',\n ],\n [\n '8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8',\n 'c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f',\n ],\n [\n '4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e',\n '67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649',\n ],\n [\n '3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d',\n 'cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826',\n ],\n [\n '674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b',\n '299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5',\n ],\n [\n 'd32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f',\n 'f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87',\n ],\n [\n '30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6',\n '462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b',\n ],\n [\n 'be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297',\n '62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc',\n ],\n [\n '93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a',\n '7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c',\n ],\n [\n 'b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c',\n 'ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f',\n ],\n [\n 'd5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52',\n '4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a',\n ],\n [\n 'd3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb',\n 'bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46',\n ],\n [\n '463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065',\n 'bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f',\n ],\n [\n '7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917',\n '603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03',\n ],\n [\n '74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9',\n 'cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08',\n ],\n [\n '30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3',\n '553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8',\n ],\n [\n '9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57',\n '712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373',\n ],\n [\n '176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66',\n 'ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3',\n ],\n [\n '75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8',\n '9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8',\n ],\n [\n '809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721',\n '9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1',\n ],\n [\n '1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180',\n '4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9',\n ],\n ],\n },\n};\n","'use strict';\n\nvar BN = require('bn.js');\nvar HmacDRBG = require('hmac-drbg');\nvar utils = require('../utils');\nvar curves = require('../curves');\nvar rand = require('brorand');\nvar assert = utils.assert;\n\nvar KeyPair = require('./key');\nvar Signature = require('./signature');\n\nfunction EC(options) {\n if (!(this instanceof EC))\n return new EC(options);\n\n // Shortcut `elliptic.ec(curve-name)`\n if (typeof options === 'string') {\n assert(Object.prototype.hasOwnProperty.call(curves, options),\n 'Unknown curve ' + options);\n\n options = curves[options];\n }\n\n // Shortcut for `elliptic.ec(elliptic.curves.curveName)`\n if (options instanceof curves.PresetCurve)\n options = { curve: options };\n\n this.curve = options.curve.curve;\n this.n = this.curve.n;\n this.nh = this.n.ushrn(1);\n this.g = this.curve.g;\n\n // Point on curve\n this.g = options.curve.g;\n this.g.precompute(options.curve.n.bitLength() + 1);\n\n // Hash for function for DRBG\n this.hash = options.hash || options.curve.hash;\n}\nmodule.exports = EC;\n\nEC.prototype.keyPair = function keyPair(options) {\n return new KeyPair(this, options);\n};\n\nEC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) {\n return KeyPair.fromPrivate(this, priv, enc);\n};\n\nEC.prototype.keyFromPublic = function keyFromPublic(pub, enc) {\n return KeyPair.fromPublic(this, pub, enc);\n};\n\nEC.prototype.genKeyPair = function genKeyPair(options) {\n if (!options)\n options = {};\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8',\n entropy: options.entropy || rand(this.hash.hmacStrength),\n entropyEnc: options.entropy && options.entropyEnc || 'utf8',\n nonce: this.n.toArray(),\n });\n\n var bytes = this.n.byteLength();\n var ns2 = this.n.sub(new BN(2));\n for (;;) {\n var priv = new BN(drbg.generate(bytes));\n if (priv.cmp(ns2) > 0)\n continue;\n\n priv.iaddn(1);\n return this.keyFromPrivate(priv);\n }\n};\n\nEC.prototype._truncateToN = function _truncateToN(msg, truncOnly, bitLength) {\n var byteLength;\n if (BN.isBN(msg) || typeof msg === 'number') {\n msg = new BN(msg, 16);\n byteLength = msg.byteLength();\n } else if (typeof msg === 'object') {\n // BN assumes an array-like input and asserts length\n byteLength = msg.length;\n msg = new BN(msg, 16);\n } else {\n // BN converts the value to string\n var str = msg.toString();\n // HEX encoding\n byteLength = (str.length + 1) >>> 1;\n msg = new BN(str, 16);\n }\n // Allow overriding\n if (typeof bitLength !== 'number') {\n bitLength = byteLength * 8;\n }\n var delta = bitLength - this.n.bitLength();\n if (delta > 0)\n msg = msg.ushrn(delta);\n if (!truncOnly && msg.cmp(this.n) >= 0)\n return msg.sub(this.n);\n else\n return msg;\n};\n\nEC.prototype.sign = function sign(msg, key, enc, options) {\n if (typeof enc === 'object') {\n options = enc;\n enc = null;\n }\n if (!options)\n options = {};\n\n if (typeof msg !== 'string' && typeof msg !== 'number' && !BN.isBN(msg)) {\n assert(typeof msg === 'object' && msg && typeof msg.length === 'number',\n 'Expected message to be an array-like, a hex string, or a BN instance');\n assert((msg.length >>> 0) === msg.length); // non-negative 32-bit integer\n for (var i = 0; i < msg.length; i++) assert((msg[i] & 255) === msg[i]);\n }\n\n key = this.keyFromPrivate(key, enc);\n msg = this._truncateToN(msg, false, options.msgBitLength);\n\n // Would fail further checks, but let's make the error message clear\n assert(!msg.isNeg(), 'Can not sign a negative message');\n\n // Zero-extend key to provide enough entropy\n var bytes = this.n.byteLength();\n var bkey = key.getPrivate().toArray('be', bytes);\n\n // Zero-extend nonce to have the same byte size as N\n var nonce = msg.toArray('be', bytes);\n\n // Recheck nonce to be bijective to msg\n assert((new BN(nonce)).eq(msg), 'Can not sign message');\n\n // Instantiate Hmac_DRBG\n var drbg = new HmacDRBG({\n hash: this.hash,\n entropy: bkey,\n nonce: nonce,\n pers: options.pers,\n persEnc: options.persEnc || 'utf8',\n });\n\n // Number of bytes to generate\n var ns1 = this.n.sub(new BN(1));\n\n for (var iter = 0; ; iter++) {\n var k = options.k ?\n options.k(iter) :\n new BN(drbg.generate(this.n.byteLength()));\n k = this._truncateToN(k, true);\n if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0)\n continue;\n\n var kp = this.g.mul(k);\n if (kp.isInfinity())\n continue;\n\n var kpX = kp.getX();\n var r = kpX.umod(this.n);\n if (r.cmpn(0) === 0)\n continue;\n\n var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg));\n s = s.umod(this.n);\n if (s.cmpn(0) === 0)\n continue;\n\n var recoveryParam = (kp.getY().isOdd() ? 1 : 0) |\n (kpX.cmp(r) !== 0 ? 2 : 0);\n\n // Use complement of `s`, if it is > `n / 2`\n if (options.canonical && s.cmp(this.nh) > 0) {\n s = this.n.sub(s);\n recoveryParam ^= 1;\n }\n\n return new Signature({ r: r, s: s, recoveryParam: recoveryParam });\n }\n};\n\nEC.prototype.verify = function verify(msg, signature, key, enc, options) {\n if (!options)\n options = {};\n\n msg = this._truncateToN(msg, false, options.msgBitLength);\n key = this.keyFromPublic(key, enc);\n signature = new Signature(signature, 'hex');\n\n // Perform primitive values validation\n var r = signature.r;\n var s = signature.s;\n if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0)\n return false;\n if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0)\n return false;\n\n // Validate signature\n var sinv = s.invm(this.n);\n var u1 = sinv.mul(msg).umod(this.n);\n var u2 = sinv.mul(r).umod(this.n);\n var p;\n\n if (!this.curve._maxwellTrick) {\n p = this.g.mulAdd(u1, key.getPublic(), u2);\n if (p.isInfinity())\n return false;\n\n return p.getX().umod(this.n).cmp(r) === 0;\n }\n\n // NOTE: Greg Maxwell's trick, inspired by:\n // https://git.io/vad3K\n\n p = this.g.jmulAdd(u1, key.getPublic(), u2);\n if (p.isInfinity())\n return false;\n\n // Compare `p.x` of Jacobian point with `r`,\n // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the\n // inverse of `p.z^2`\n return p.eqXToP(r);\n};\n\nEC.prototype.recoverPubKey = function(msg, signature, j, enc) {\n assert((3 & j) === j, 'The recovery param is more than two bits');\n signature = new Signature(signature, enc);\n\n var n = this.n;\n var e = new BN(msg);\n var r = signature.r;\n var s = signature.s;\n\n // A set LSB signifies that the y-coordinate is odd\n var isYOdd = j & 1;\n var isSecondKey = j >> 1;\n if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey)\n throw new Error('Unable to find sencond key candinate');\n\n // 1.1. Let x = r + jn.\n if (isSecondKey)\n r = this.curve.pointFromX(r.add(this.curve.n), isYOdd);\n else\n r = this.curve.pointFromX(r, isYOdd);\n\n var rInv = signature.r.invm(n);\n var s1 = n.sub(e).mul(rInv).umod(n);\n var s2 = s.mul(rInv).umod(n);\n\n // 1.6.1 Compute Q = r^-1 (sR - eG)\n // Q = r^-1 (sR + -eG)\n return this.g.mulAdd(s1, r, s2);\n};\n\nEC.prototype.getKeyRecoveryParam = function(e, signature, Q, enc) {\n signature = new Signature(signature, enc);\n if (signature.recoveryParam !== null)\n return signature.recoveryParam;\n\n for (var i = 0; i < 4; i++) {\n var Qprime;\n try {\n Qprime = this.recoverPubKey(e, signature, i);\n } catch (e) {\n continue;\n }\n\n if (Qprime.eq(Q))\n return i;\n }\n throw new Error('Unable to find valid recovery factor');\n};\n","'use strict';\n\nvar hash = require('hash.js');\nvar utils = require('minimalistic-crypto-utils');\nvar assert = require('minimalistic-assert');\n\nfunction HmacDRBG(options) {\n if (!(this instanceof HmacDRBG))\n return new HmacDRBG(options);\n this.hash = options.hash;\n this.predResist = !!options.predResist;\n\n this.outLen = this.hash.outSize;\n this.minEntropy = options.minEntropy || this.hash.hmacStrength;\n\n this._reseed = null;\n this.reseedInterval = null;\n this.K = null;\n this.V = null;\n\n var entropy = utils.toArray(options.entropy, options.entropyEnc || 'hex');\n var nonce = utils.toArray(options.nonce, options.nonceEnc || 'hex');\n var pers = utils.toArray(options.pers, options.persEnc || 'hex');\n assert(entropy.length >= (this.minEntropy / 8),\n 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');\n this._init(entropy, nonce, pers);\n}\nmodule.exports = HmacDRBG;\n\nHmacDRBG.prototype._init = function init(entropy, nonce, pers) {\n var seed = entropy.concat(nonce).concat(pers);\n\n this.K = new Array(this.outLen / 8);\n this.V = new Array(this.outLen / 8);\n for (var i = 0; i < this.V.length; i++) {\n this.K[i] = 0x00;\n this.V[i] = 0x01;\n }\n\n this._update(seed);\n this._reseed = 1;\n this.reseedInterval = 0x1000000000000; // 2^48\n};\n\nHmacDRBG.prototype._hmac = function hmac() {\n return new hash.hmac(this.hash, this.K);\n};\n\nHmacDRBG.prototype._update = function update(seed) {\n var kmac = this._hmac()\n .update(this.V)\n .update([ 0x00 ]);\n if (seed)\n kmac = kmac.update(seed);\n this.K = kmac.digest();\n this.V = this._hmac().update(this.V).digest();\n if (!seed)\n return;\n\n this.K = this._hmac()\n .update(this.V)\n .update([ 0x01 ])\n .update(seed)\n .digest();\n this.V = this._hmac().update(this.V).digest();\n};\n\nHmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) {\n // Optional entropy enc\n if (typeof entropyEnc !== 'string') {\n addEnc = add;\n add = entropyEnc;\n entropyEnc = null;\n }\n\n entropy = utils.toArray(entropy, entropyEnc);\n add = utils.toArray(add, addEnc);\n\n assert(entropy.length >= (this.minEntropy / 8),\n 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits');\n\n this._update(entropy.concat(add || []));\n this._reseed = 1;\n};\n\nHmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) {\n if (this._reseed > this.reseedInterval)\n throw new Error('Reseed is required');\n\n // Optional encoding\n if (typeof enc !== 'string') {\n addEnc = add;\n add = enc;\n enc = null;\n }\n\n // Optional additional data\n if (add) {\n add = utils.toArray(add, addEnc || 'hex');\n this._update(add);\n }\n\n var temp = [];\n while (temp.length < len) {\n this.V = this._hmac().update(this.V).digest();\n temp = temp.concat(this.V);\n }\n\n var res = temp.slice(0, len);\n this._update(add);\n this._reseed++;\n return utils.encode(res, enc);\n};\n","'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar assert = utils.assert;\n\nfunction KeyPair(ec, options) {\n this.ec = ec;\n this.priv = null;\n this.pub = null;\n\n // KeyPair(ec, { priv: ..., pub: ... })\n if (options.priv)\n this._importPrivate(options.priv, options.privEnc);\n if (options.pub)\n this._importPublic(options.pub, options.pubEnc);\n}\nmodule.exports = KeyPair;\n\nKeyPair.fromPublic = function fromPublic(ec, pub, enc) {\n if (pub instanceof KeyPair)\n return pub;\n\n return new KeyPair(ec, {\n pub: pub,\n pubEnc: enc,\n });\n};\n\nKeyPair.fromPrivate = function fromPrivate(ec, priv, enc) {\n if (priv instanceof KeyPair)\n return priv;\n\n return new KeyPair(ec, {\n priv: priv,\n privEnc: enc,\n });\n};\n\nKeyPair.prototype.validate = function validate() {\n var pub = this.getPublic();\n\n if (pub.isInfinity())\n return { result: false, reason: 'Invalid public key' };\n if (!pub.validate())\n return { result: false, reason: 'Public key is not a point' };\n if (!pub.mul(this.ec.curve.n).isInfinity())\n return { result: false, reason: 'Public key * N != O' };\n\n return { result: true, reason: null };\n};\n\nKeyPair.prototype.getPublic = function getPublic(compact, enc) {\n // compact is optional argument\n if (typeof compact === 'string') {\n enc = compact;\n compact = null;\n }\n\n if (!this.pub)\n this.pub = this.ec.g.mul(this.priv);\n\n if (!enc)\n return this.pub;\n\n return this.pub.encode(enc, compact);\n};\n\nKeyPair.prototype.getPrivate = function getPrivate(enc) {\n if (enc === 'hex')\n return this.priv.toString(16, 2);\n else\n return this.priv;\n};\n\nKeyPair.prototype._importPrivate = function _importPrivate(key, enc) {\n this.priv = new BN(key, enc || 16);\n\n // Ensure that the priv won't be bigger than n, otherwise we may fail\n // in fixed multiplication method\n this.priv = this.priv.umod(this.ec.curve.n);\n};\n\nKeyPair.prototype._importPublic = function _importPublic(key, enc) {\n if (key.x || key.y) {\n // Montgomery points only have an `x` coordinate.\n // Weierstrass/Edwards points on the other hand have both `x` and\n // `y` coordinates.\n if (this.ec.curve.type === 'mont') {\n assert(key.x, 'Need x coordinate');\n } else if (this.ec.curve.type === 'short' ||\n this.ec.curve.type === 'edwards') {\n assert(key.x && key.y, 'Need both x and y coordinate');\n }\n this.pub = this.ec.curve.point(key.x, key.y);\n return;\n }\n this.pub = this.ec.curve.decodePoint(key, enc);\n};\n\n// ECDH\nKeyPair.prototype.derive = function derive(pub) {\n if(!pub.validate()) {\n assert(pub.validate(), 'public point not validated');\n }\n return pub.mul(this.priv).getX();\n};\n\n// ECDSA\nKeyPair.prototype.sign = function sign(msg, enc, options) {\n return this.ec.sign(msg, this, enc, options);\n};\n\nKeyPair.prototype.verify = function verify(msg, signature, options) {\n return this.ec.verify(msg, signature, this, undefined, options);\n};\n\nKeyPair.prototype.inspect = function inspect() {\n return '<Key priv: ' + (this.priv && this.priv.toString(16, 2)) +\n ' pub: ' + (this.pub && this.pub.inspect()) + ' >';\n};\n","'use strict';\n\nvar BN = require('bn.js');\n\nvar utils = require('../utils');\nvar assert = utils.assert;\n\nfunction Signature(options, enc) {\n if (options instanceof Signature)\n return options;\n\n if (this._importDER(options, enc))\n return;\n\n assert(options.r && options.s, 'Signature without r or s');\n this.r = new BN(options.r, 16);\n this.s = new BN(options.s, 16);\n if (options.recoveryParam === undefined)\n this.recoveryParam = null;\n else\n this.recoveryParam = options.recoveryParam;\n}\nmodule.exports = Signature;\n\nfunction Position() {\n this.place = 0;\n}\n\nfunction getLength(buf, p) {\n var initial = buf[p.place++];\n if (!(initial & 0x80)) {\n return initial;\n }\n var octetLen = initial & 0xf;\n\n // Indefinite length or overflow\n if (octetLen === 0 || octetLen > 4) {\n return false;\n }\n\n if(buf[p.place] === 0x00) {\n return false;\n }\n\n var val = 0;\n for (var i = 0, off = p.place; i < octetLen; i++, off++) {\n val <<= 8;\n val |= buf[off];\n val >>>= 0;\n }\n\n // Leading zeroes\n if (val <= 0x7f) {\n return false;\n }\n\n p.place = off;\n return val;\n}\n\nfunction rmPadding(buf) {\n var i = 0;\n var len = buf.length - 1;\n while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) {\n i++;\n }\n if (i === 0) {\n return buf;\n }\n return buf.slice(i);\n}\n\nSignature.prototype._importDER = function _importDER(data, enc) {\n data = utils.toArray(data, enc);\n var p = new Position();\n if (data[p.place++] !== 0x30) {\n return false;\n }\n var len = getLength(data, p);\n if (len === false) {\n return false;\n }\n if ((len + p.place) !== data.length) {\n return false;\n }\n if (data[p.place++] !== 0x02) {\n return false;\n }\n var rlen = getLength(data, p);\n if (rlen === false) {\n return false;\n }\n if ((data[p.place] & 128) !== 0) {\n return false;\n }\n var r = data.slice(p.place, rlen + p.place);\n p.place += rlen;\n if (data[p.place++] !== 0x02) {\n return false;\n }\n var slen = getLength(data, p);\n if (slen === false) {\n return false;\n }\n if (data.length !== slen + p.place) {\n return false;\n }\n if ((data[p.place] & 128) !== 0) {\n return false;\n }\n var s = data.slice(p.place, slen + p.place);\n if (r[0] === 0) {\n if (r[1] & 0x80) {\n r = r.slice(1);\n } else {\n // Leading zeroes\n return false;\n }\n }\n if (s[0] === 0) {\n if (s[1] & 0x80) {\n s = s.slice(1);\n } else {\n // Leading zeroes\n return false;\n }\n }\n\n this.r = new BN(r);\n this.s = new BN(s);\n this.recoveryParam = null;\n\n return true;\n};\n\nfunction constructLength(arr, len) {\n if (len < 0x80) {\n arr.push(len);\n return;\n }\n var octets = 1 + (Math.log(len) / Math.LN2 >>> 3);\n arr.push(octets | 0x80);\n while (--octets) {\n arr.push((len >>> (octets << 3)) & 0xff);\n }\n arr.push(len);\n}\n\nSignature.prototype.toDER = function toDER(enc) {\n var r = this.r.toArray();\n var s = this.s.toArray();\n\n // Pad values\n if (r[0] & 0x80)\n r = [ 0 ].concat(r);\n // Pad values\n if (s[0] & 0x80)\n s = [ 0 ].concat(s);\n\n r = rmPadding(r);\n s = rmPadding(s);\n\n while (!s[0] && !(s[1] & 0x80)) {\n s = s.slice(1);\n }\n var arr = [ 0x02 ];\n constructLength(arr, r.length);\n arr = arr.concat(r);\n arr.push(0x02);\n constructLength(arr, s.length);\n var backHalf = arr.concat(s);\n var res = [ 0x30 ];\n constructLength(res, backHalf.length);\n res = res.concat(backHalf);\n return utils.encode(res, enc);\n};\n","'use strict';\n\nvar hash = require('hash.js');\nvar curves = require('../curves');\nvar utils = require('../utils');\nvar assert = utils.assert;\nvar parseBytes = utils.parseBytes;\nvar KeyPair = require('./key');\nvar Signature = require('./signature');\n\nfunction EDDSA(curve) {\n assert(curve === 'ed25519', 'only tested with ed25519 so far');\n\n if (!(this instanceof EDDSA))\n return new EDDSA(curve);\n\n curve = curves[curve].curve;\n this.curve = curve;\n this.g = curve.g;\n this.g.precompute(curve.n.bitLength() + 1);\n\n this.pointClass = curve.point().constructor;\n this.encodingLength = Math.ceil(curve.n.bitLength() / 8);\n this.hash = hash.sha512;\n}\n\nmodule.exports = EDDSA;\n\n/**\n* @param {Array|String} message - message bytes\n* @param {Array|String|KeyPair} secret - secret bytes or a keypair\n* @returns {Signature} - signature\n*/\nEDDSA.prototype.sign = function sign(message, secret) {\n message = parseBytes(message);\n var key = this.keyFromSecret(secret);\n var r = this.hashInt(key.messagePrefix(), message);\n var R = this.g.mul(r);\n var Rencoded = this.encodePoint(R);\n var s_ = this.hashInt(Rencoded, key.pubBytes(), message)\n .mul(key.priv());\n var S = r.add(s_).umod(this.curve.n);\n return this.makeSignature({ R: R, S: S, Rencoded: Rencoded });\n};\n\n/**\n* @param {Array} message - message bytes\n* @param {Array|String|Signature} sig - sig bytes\n* @param {Array|String|Point|KeyPair} pub - public key\n* @returns {Boolean} - true if public key matches sig of message\n*/\nEDDSA.prototype.verify = function verify(message, sig, pub) {\n message = parseBytes(message);\n sig = this.makeSignature(sig);\n if (sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()) {\n return false;\n }\n var key = this.keyFromPublic(pub);\n var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);\n var SG = this.g.mul(sig.S());\n var RplusAh = sig.R().add(key.pub().mul(h));\n return RplusAh.eq(SG);\n};\n\nEDDSA.prototype.hashInt = function hashInt() {\n var hash = this.hash();\n for (var i = 0; i < arguments.length; i++)\n hash.update(arguments[i]);\n return utils.intFromLE(hash.digest()).umod(this.curve.n);\n};\n\nEDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {\n return KeyPair.fromPublic(this, pub);\n};\n\nEDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {\n return KeyPair.fromSecret(this, secret);\n};\n\nEDDSA.prototype.makeSignature = function makeSignature(sig) {\n if (sig instanceof Signature)\n return sig;\n return new Signature(this, sig);\n};\n\n/**\n* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2\n*\n* EDDSA defines methods for encoding and decoding points and integers. These are\n* helper convenience methods, that pass along to utility functions implied\n* parameters.\n*\n*/\nEDDSA.prototype.encodePoint = function encodePoint(point) {\n var enc = point.getY().toArray('le', this.encodingLength);\n enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0;\n return enc;\n};\n\nEDDSA.prototype.decodePoint = function decodePoint(bytes) {\n bytes = utils.parseBytes(bytes);\n\n var lastIx = bytes.length - 1;\n var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80);\n var xIsOdd = (bytes[lastIx] & 0x80) !== 0;\n\n var y = utils.intFromLE(normed);\n return this.curve.pointFromY(y, xIsOdd);\n};\n\nEDDSA.prototype.encodeInt = function encodeInt(num) {\n return num.toArray('le', this.encodingLength);\n};\n\nEDDSA.prototype.decodeInt = function decodeInt(bytes) {\n return utils.intFromLE(bytes);\n};\n\nEDDSA.prototype.isPoint = function isPoint(val) {\n return val instanceof this.pointClass;\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar assert = utils.assert;\nvar parseBytes = utils.parseBytes;\nvar cachedProperty = utils.cachedProperty;\n\n/**\n* @param {EDDSA} eddsa - instance\n* @param {Object} params - public/private key parameters\n*\n* @param {Array<Byte>} [params.secret] - secret seed bytes\n* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms)\n* @param {Array<Byte>} [params.pub] - public key point encoded as bytes\n*\n*/\nfunction KeyPair(eddsa, params) {\n this.eddsa = eddsa;\n this._secret = parseBytes(params.secret);\n if (eddsa.isPoint(params.pub))\n this._pub = params.pub;\n else\n this._pubBytes = parseBytes(params.pub);\n}\n\nKeyPair.fromPublic = function fromPublic(eddsa, pub) {\n if (pub instanceof KeyPair)\n return pub;\n return new KeyPair(eddsa, { pub: pub });\n};\n\nKeyPair.fromSecret = function fromSecret(eddsa, secret) {\n if (secret instanceof KeyPair)\n return secret;\n return new KeyPair(eddsa, { secret: secret });\n};\n\nKeyPair.prototype.secret = function secret() {\n return this._secret;\n};\n\ncachedProperty(KeyPair, 'pubBytes', function pubBytes() {\n return this.eddsa.encodePoint(this.pub());\n});\n\ncachedProperty(KeyPair, 'pub', function pub() {\n if (this._pubBytes)\n return this.eddsa.decodePoint(this._pubBytes);\n return this.eddsa.g.mul(this.priv());\n});\n\ncachedProperty(KeyPair, 'privBytes', function privBytes() {\n var eddsa = this.eddsa;\n var hash = this.hash();\n var lastIx = eddsa.encodingLength - 1;\n\n var a = hash.slice(0, eddsa.encodingLength);\n a[0] &= 248;\n a[lastIx] &= 127;\n a[lastIx] |= 64;\n\n return a;\n});\n\ncachedProperty(KeyPair, 'priv', function priv() {\n return this.eddsa.decodeInt(this.privBytes());\n});\n\ncachedProperty(KeyPair, 'hash', function hash() {\n return this.eddsa.hash().update(this.secret()).digest();\n});\n\ncachedProperty(KeyPair, 'messagePrefix', function messagePrefix() {\n return this.hash().slice(this.eddsa.encodingLength);\n});\n\nKeyPair.prototype.sign = function sign(message) {\n assert(this._secret, 'KeyPair can only verify');\n return this.eddsa.sign(message, this);\n};\n\nKeyPair.prototype.verify = function verify(message, sig) {\n return this.eddsa.verify(message, sig, this);\n};\n\nKeyPair.prototype.getSecret = function getSecret(enc) {\n assert(this._secret, 'KeyPair is public only');\n return utils.encode(this.secret(), enc);\n};\n\nKeyPair.prototype.getPublic = function getPublic(enc) {\n return utils.encode(this.pubBytes(), enc);\n};\n\nmodule.exports = KeyPair;\n","'use strict';\n\nvar BN = require('bn.js');\nvar utils = require('../utils');\nvar assert = utils.assert;\nvar cachedProperty = utils.cachedProperty;\nvar parseBytes = utils.parseBytes;\n\n/**\n* @param {EDDSA} eddsa - eddsa instance\n* @param {Array<Bytes>|Object} sig -\n* @param {Array<Bytes>|Point} [sig.R] - R point as Point or bytes\n* @param {Array<Bytes>|bn} [sig.S] - S scalar as bn or bytes\n* @param {Array<Bytes>} [sig.Rencoded] - R point encoded\n* @param {Array<Bytes>} [sig.Sencoded] - S scalar encoded\n*/\nfunction Signature(eddsa, sig) {\n this.eddsa = eddsa;\n\n if (typeof sig !== 'object')\n sig = parseBytes(sig);\n\n if (Array.isArray(sig)) {\n assert(sig.length === eddsa.encodingLength * 2, 'Signature has invalid size');\n sig = {\n R: sig.slice(0, eddsa.encodingLength),\n S: sig.slice(eddsa.encodingLength),\n };\n }\n\n assert(sig.R && sig.S, 'Signature without R or S');\n\n if (eddsa.isPoint(sig.R))\n this._R = sig.R;\n if (sig.S instanceof BN)\n this._S = sig.S;\n\n this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;\n this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;\n}\n\ncachedProperty(Signature, 'S', function S() {\n return this.eddsa.decodeInt(this.Sencoded());\n});\n\ncachedProperty(Signature, 'R', function R() {\n return this.eddsa.decodePoint(this.Rencoded());\n});\n\ncachedProperty(Signature, 'Rencoded', function Rencoded() {\n return this.eddsa.encodePoint(this.R());\n});\n\ncachedProperty(Signature, 'Sencoded', function Sencoded() {\n return this.eddsa.encodeInt(this.S());\n});\n\nSignature.prototype.toBytes = function toBytes() {\n return this.Rencoded().concat(this.Sencoded());\n};\n\nSignature.prototype.toHex = function toHex() {\n return utils.encode(this.toBytes(), 'hex').toUpperCase();\n};\n\nmodule.exports = Signature;\n","'use strict';\n\nvar elliptic = exports;\n\nelliptic.version = require('../package.json').version;\nelliptic.utils = require('./elliptic/utils');\nelliptic.rand = require('brorand');\nelliptic.curve = require('./elliptic/curve');\nelliptic.curves = require('./elliptic/curves');\n\n// Protocols\nelliptic.ec = require('./elliptic/ec');\nelliptic.eddsa = require('./elliptic/eddsa');\n","/**\n * Key Manager - ECDSA secp256k1 Key Generation and Storage\n * \n * Handles secure generation, storage, and retrieval of cryptographic keys.\n * Private keys are stored securely using expo-secure-store and never leave the device.\n */\n\nimport { ec as EC } from 'elliptic';\nimport type { ECKeyPair } from 'elliptic';\nimport { isWeb, isIOS, isAndroid } from '../utils/platform';\nimport { logger } from '../utils/loggerUtils';\n\n// Lazy imports for React Native specific modules\nlet SecureStore: typeof import('expo-secure-store') | null = null;\nlet ExpoCrypto: typeof import('expo-crypto') | null = null;\n\nconst ec = new EC('secp256k1');\n\nconst STORAGE_KEYS = {\n PRIVATE_KEY: 'oxy_identity_private_key',\n PUBLIC_KEY: 'oxy_identity_public_key',\n BACKUP_PRIVATE_KEY: 'oxy_identity_backup_private_key',\n BACKUP_PUBLIC_KEY: 'oxy_identity_backup_public_key',\n BACKUP_TIMESTAMP: 'oxy_identity_backup_timestamp',\n // Shared keys accessible across all Oxy apps (iOS Keychain Group / Android Account Manager)\n SHARED_PRIVATE_KEY: 'oxy_shared_identity_private_key',\n SHARED_PUBLIC_KEY: 'oxy_shared_identity_public_key',\n SHARED_SESSION_TOKEN: 'oxy_shared_session_token',\n SHARED_SESSION_ID: 'oxy_shared_session_id',\n} as const;\n\n/**\n * iOS Keychain Access Group for sharing identities across Oxy apps\n * All Oxy apps must have this access group enabled in their entitlements\n * Format: [Team ID].com.oxy.shared or group.com.oxy.shared\n */\nconst IOS_KEYCHAIN_GROUP = 'group.com.oxy.shared';\n\n/**\n * Android Account Manager type for shared authentication\n * Used with sharedUserId to share sessions across apps\n */\nconst ANDROID_ACCOUNT_TYPE = 'com.oxy.account';\n\n/**\n * Initialize React Native specific modules\n * This allows the module to work in both Node.js and React Native environments\n */\nasync function initSecureStore(): Promise<typeof import('expo-secure-store')> {\n if (!SecureStore) {\n try {\n SecureStore = await import('expo-secure-store');\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to load expo-secure-store: ${errorMessage}. Make sure expo-secure-store is installed and properly configured.`);\n }\n }\n if (!SecureStore) {\n throw new Error('expo-secure-store module is not available');\n }\n return SecureStore;\n}\n\n/**\n * Check if we're in a React Native environment\n */\nfunction isReactNative(): boolean {\n return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n}\n\n/**\n * Check if we're in a Node.js environment\n */\nfunction isNodeJS(): boolean {\n return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;\n}\n\n/**\n * Check if we're on web platform\n * Identity storage is only available on native platforms (iOS/Android)\n */\nfunction isWebPlatform(): boolean {\n return isWeb();\n}\n\nasync function initExpoCrypto(): Promise<typeof import('expo-crypto')> {\n if (!ExpoCrypto) {\n ExpoCrypto = await import('expo-crypto');\n }\n return ExpoCrypto;\n}\n\n/**\n * Convert Uint8Array to hexadecimal string\n * Works in both Node.js and React Native\n */\nfunction uint8ArrayToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Generate cryptographically secure random bytes\n */\nasync function getSecureRandomBytes(length: number): Promise<Uint8Array> {\n // In React Native, always use expo-crypto\n if (isReactNative() || !isNodeJS()) {\n const Crypto = await initExpoCrypto();\n return Crypto.getRandomBytes(length);\n }\n \n // In Node.js, use Node's crypto module\n // Use Function constructor to prevent Metro bundler from statically analyzing this require\n // This ensures the require is only evaluated in Node.js runtime, not during Metro bundling\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const getCrypto = new Function('return require(\"crypto\")');\n const crypto = getCrypto();\n return new Uint8Array(crypto.randomBytes(length));\n } catch (error) {\n // Fallback to expo-crypto if Node crypto fails\n const Crypto = await initExpoCrypto();\n return Crypto.getRandomBytes(length);\n }\n}\n\nexport interface KeyPair {\n publicKey: string;\n privateKey: string;\n}\n\nexport class KeyManager {\n // In-memory cache for identity state (invalidated on identity changes)\n private static cachedPublicKey: string | null = null;\n private static cachedHasIdentity: boolean | null = null;\n private static cachedSharedPublicKey: string | null = null;\n private static cachedHasSharedIdentity: boolean | null = null;\n\n /**\n * Invalidate cached identity state\n * Called internally when identity is created/deleted/imported\n */\n private static invalidateCache(): void {\n KeyManager.cachedPublicKey = null;\n KeyManager.cachedHasIdentity = null;\n }\n\n /**\n * Invalidate cached shared identity state\n * Called internally when shared identity is created/deleted/imported\n */\n private static invalidateSharedCache(): void {\n KeyManager.cachedSharedPublicKey = null;\n KeyManager.cachedHasSharedIdentity = null;\n }\n\n /**\n * Generate a new ECDSA secp256k1 key pair\n * Returns the keys in hexadecimal format\n */\n static generateKeyPairSync(): KeyPair {\n const keyPair = ec.genKeyPair();\n return {\n privateKey: keyPair.getPrivate('hex'),\n publicKey: keyPair.getPublic('hex'),\n };\n }\n\n /**\n * Generate a new key pair using secure random bytes\n */\n static async generateKeyPair(): Promise<KeyPair> {\n const randomBytes = await getSecureRandomBytes(32);\n const privateKeyHex = uint8ArrayToHex(randomBytes);\n const keyPair = ec.keyFromPrivate(privateKeyHex);\n \n return {\n privateKey: keyPair.getPrivate('hex'),\n publicKey: keyPair.getPublic('hex'),\n };\n }\n\n // ==================== SHARED IDENTITY METHODS ====================\n // These methods enable cross-app session sharing (like Google)\n // iOS: Uses Keychain Access Groups\n // Android: Uses Account Manager with shared user ID\n // =================================================================\n\n /**\n * Create a shared identity accessible across all Oxy apps\n *\n * iOS: Stores in shared keychain group (requires entitlement configuration)\n * Android: Stores in Account Manager (requires sharedUserId in manifest)\n *\n * This enables true cross-app SSO - when user signs in to one Oxy app,\n * they're automatically signed in to all other Oxy apps.\n *\n * @returns Public key of the shared identity\n * @throws Error if not on native platform or if sharing is not configured\n */\n static async createSharedIdentity(): Promise<string> {\n if (isWebPlatform()) {\n throw new Error('Shared identity is only available on native platforms (iOS/Android).');\n }\n\n const store = await initSecureStore();\n const { privateKey, publicKey } = await KeyManager.generateKeyPair();\n\n if (isIOS()) {\n // iOS: Store in shared keychain group\n // Note: keychainAccessGroup requires Keychain Sharing capability in Xcode\n try {\n await store.setItemAsync(STORAGE_KEYS.SHARED_PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n keychainAccessGroup: IOS_KEYCHAIN_GROUP, // This enables sharing across apps\n } as any); // Type assertion: keychainAccessGroup may not be in older @types but is supported\n\n await store.setItemAsync(STORAGE_KEYS.SHARED_PUBLIC_KEY, publicKey, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } catch (error) {\n throw new Error(\n `Failed to create shared identity on iOS. Ensure your app has the Keychain Sharing capability enabled with access group \"${IOS_KEYCHAIN_GROUP}\". Error: ${error}`\n );\n }\n } else if (isAndroid()) {\n // Android: Store in secure store (accessible via sharedUserId)\n // Note: All Oxy apps must have the same sharedUserId in AndroidManifest.xml\n await store.setItemAsync(STORAGE_KEYS.SHARED_PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n });\n\n await store.setItemAsync(STORAGE_KEYS.SHARED_PUBLIC_KEY, publicKey);\n }\n\n // Update cache\n KeyManager.cachedSharedPublicKey = publicKey;\n KeyManager.cachedHasSharedIdentity = true;\n\n if (__DEV__) {\n logger.debug('Shared identity created successfully', { component: 'KeyManager' });\n }\n\n return publicKey;\n }\n\n /**\n * Get the shared public key (accessible across all Oxy apps)\n *\n * @returns Shared public key or null if no shared identity exists\n */\n static async getSharedPublicKey(): Promise<string | null> {\n if (isWebPlatform()) {\n return null;\n }\n\n // Return cached value if available\n if (KeyManager.cachedSharedPublicKey !== null) {\n return KeyManager.cachedSharedPublicKey;\n }\n\n try {\n const store = await initSecureStore();\n let publicKey: string | null = null;\n\n if (isIOS()) {\n publicKey = await store.getItemAsync(STORAGE_KEYS.SHARED_PUBLIC_KEY, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } else if (isAndroid()) {\n publicKey = await store.getItemAsync(STORAGE_KEYS.SHARED_PUBLIC_KEY);\n }\n\n // Cache result\n KeyManager.cachedSharedPublicKey = publicKey;\n\n return publicKey;\n } catch (error) {\n if (__DEV__) {\n logger.warn('Failed to get shared public key', { component: 'KeyManager' }, error);\n }\n KeyManager.cachedSharedPublicKey = null;\n return null;\n }\n }\n\n /**\n * Get the shared private key (for signing operations)\n *\n * WARNING: Only use this for signing operations within the app.\n * The private key should NEVER be transmitted or exposed.\n *\n * @returns Shared private key or null if no shared identity exists\n */\n static async getSharedPrivateKey(): Promise<string | null> {\n if (isWebPlatform()) {\n return null;\n }\n\n try {\n const store = await initSecureStore();\n let privateKey: string | null = null;\n\n if (isIOS()) {\n privateKey = await store.getItemAsync(STORAGE_KEYS.SHARED_PRIVATE_KEY, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } else if (isAndroid()) {\n privateKey = await store.getItemAsync(STORAGE_KEYS.SHARED_PRIVATE_KEY);\n }\n\n return privateKey;\n } catch (error) {\n if (__DEV__) {\n logger.warn('Failed to get shared private key', { component: 'KeyManager' }, error);\n }\n return null;\n }\n }\n\n /**\n * Check if a shared identity exists (accessible across all Oxy apps)\n *\n * @returns True if shared identity exists, false otherwise\n */\n static async hasSharedIdentity(): Promise<boolean> {\n if (isWebPlatform()) {\n return false;\n }\n\n // Return cached value if available\n if (KeyManager.cachedHasSharedIdentity !== null) {\n return KeyManager.cachedHasSharedIdentity;\n }\n\n try {\n const privateKey = await KeyManager.getSharedPrivateKey();\n const hasShared = privateKey !== null;\n\n // Cache result\n KeyManager.cachedHasSharedIdentity = hasShared;\n\n return hasShared;\n } catch (error) {\n if (__DEV__) {\n logger.warn('Failed to check shared identity', { component: 'KeyManager' }, error);\n }\n KeyManager.cachedHasSharedIdentity = false;\n return false;\n }\n }\n\n /**\n * Import an existing key pair as shared identity\n *\n * This is used when:\n * 1. User signs in to a new Oxy app for the first time\n * 2. User has existing identity on another Oxy app\n * 3. We want to sync the identity across apps\n *\n * @param privateKey - Private key in hex format\n * @returns Public key\n */\n static async importSharedIdentity(privateKey: string): Promise<string> {\n if (isWebPlatform()) {\n throw new Error('Shared identity import is only available on native platforms.');\n }\n\n const store = await initSecureStore();\n const keyPair = ec.keyFromPrivate(privateKey);\n const publicKey = keyPair.getPublic('hex');\n\n if (isIOS()) {\n await store.setItemAsync(STORAGE_KEYS.SHARED_PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n\n await store.setItemAsync(STORAGE_KEYS.SHARED_PUBLIC_KEY, publicKey, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } else if (isAndroid()) {\n await store.setItemAsync(STORAGE_KEYS.SHARED_PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n });\n\n await store.setItemAsync(STORAGE_KEYS.SHARED_PUBLIC_KEY, publicKey);\n }\n\n // Update cache\n KeyManager.cachedSharedPublicKey = publicKey;\n KeyManager.cachedHasSharedIdentity = true;\n\n if (__DEV__) {\n logger.debug('Shared identity imported successfully', { component: 'KeyManager' });\n }\n\n return publicKey;\n }\n\n /**\n * Store session information in shared storage\n *\n * This allows all Oxy apps to access the same session without\n * re-authenticating. When user signs in to one app, all apps\n * get the session automatically.\n *\n * @param sessionId - Session ID from authentication\n * @param accessToken - Access token for API calls\n */\n static async storeSharedSession(sessionId: string, accessToken: string): Promise<void> {\n if (isWebPlatform()) {\n return; // Not supported on web\n }\n\n try {\n const store = await initSecureStore();\n\n if (isIOS()) {\n await store.setItemAsync(STORAGE_KEYS.SHARED_SESSION_ID, sessionId, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n\n await store.setItemAsync(STORAGE_KEYS.SHARED_SESSION_TOKEN, accessToken, {\n keychainAccessible: store.WHEN_UNLOCKED,\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } else if (isAndroid()) {\n await store.setItemAsync(STORAGE_KEYS.SHARED_SESSION_ID, sessionId);\n await store.setItemAsync(STORAGE_KEYS.SHARED_SESSION_TOKEN, accessToken);\n }\n\n if (__DEV__) {\n logger.debug('Shared session stored successfully', { component: 'KeyManager' });\n }\n } catch (error) {\n if (__DEV__) {\n logger.error('Failed to store shared session', error, { component: 'KeyManager' });\n }\n throw error;\n }\n }\n\n /**\n * Get shared session information\n *\n * This allows any Oxy app to check if user is already signed in\n * via another Oxy app. Enables instant cross-app SSO.\n *\n * @returns Session data or null if no shared session exists\n */\n static async getSharedSession(): Promise<{ sessionId: string; accessToken: string } | null> {\n if (isWebPlatform()) {\n return null;\n }\n\n try {\n const store = await initSecureStore();\n let sessionId: string | null = null;\n let accessToken: string | null = null;\n\n if (isIOS()) {\n sessionId = await store.getItemAsync(STORAGE_KEYS.SHARED_SESSION_ID, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n\n accessToken = await store.getItemAsync(STORAGE_KEYS.SHARED_SESSION_TOKEN, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } else if (isAndroid()) {\n sessionId = await store.getItemAsync(STORAGE_KEYS.SHARED_SESSION_ID);\n accessToken = await store.getItemAsync(STORAGE_KEYS.SHARED_SESSION_TOKEN);\n }\n\n if (!sessionId || !accessToken) {\n return null;\n }\n\n return { sessionId, accessToken };\n } catch (error) {\n if (__DEV__) {\n logger.warn('Failed to get shared session', { component: 'KeyManager' }, error);\n }\n return null;\n }\n }\n\n /**\n * Clear shared session (on logout)\n *\n * This signs out the user from ALL Oxy apps simultaneously.\n * Call this when user explicitly logs out.\n */\n static async clearSharedSession(): Promise<void> {\n if (isWebPlatform()) {\n return;\n }\n\n try {\n const store = await initSecureStore();\n\n if (isIOS()) {\n await store.deleteItemAsync(STORAGE_KEYS.SHARED_SESSION_ID, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n await store.deleteItemAsync(STORAGE_KEYS.SHARED_SESSION_TOKEN, {\n keychainAccessGroup: IOS_KEYCHAIN_GROUP,\n } as any);\n } else if (isAndroid()) {\n await store.deleteItemAsync(STORAGE_KEYS.SHARED_SESSION_ID);\n await store.deleteItemAsync(STORAGE_KEYS.SHARED_SESSION_TOKEN);\n }\n\n if (__DEV__) {\n logger.debug('Shared session cleared successfully', { component: 'KeyManager' });\n }\n } catch (error) {\n if (__DEV__) {\n logger.error('Failed to clear shared session', error, { component: 'KeyManager' });\n }\n }\n }\n\n /**\n * Migrate local identity to shared identity\n *\n * Call this when upgrading existing apps to use shared identities.\n * Copies the device-specific identity to shared storage so it can\n * be accessed by other Oxy apps.\n *\n * @returns True if migration was successful, false if no local identity exists\n */\n static async migrateToSharedIdentity(): Promise<boolean> {\n if (isWebPlatform()) {\n return false;\n }\n\n try {\n // Check if we already have a shared identity\n const hasShared = await KeyManager.hasSharedIdentity();\n if (hasShared) {\n if (__DEV__) {\n logger.debug('Shared identity already exists, skipping migration', { component: 'KeyManager' });\n }\n return true;\n }\n\n // Get local identity\n const privateKey = await KeyManager.getPrivateKey();\n if (!privateKey) {\n if (__DEV__) {\n logger.debug('No local identity to migrate', { component: 'KeyManager' });\n }\n return false;\n }\n\n // Import to shared storage\n await KeyManager.importSharedIdentity(privateKey);\n\n if (__DEV__) {\n logger.debug('Successfully migrated local identity to shared identity', { component: 'KeyManager' });\n }\n\n return true;\n } catch (error) {\n if (__DEV__) {\n logger.error('Failed to migrate to shared identity', error, { component: 'KeyManager' });\n }\n return false;\n }\n }\n\n // ==================== END SHARED IDENTITY METHODS ====================\n\n /**\n * Generate and securely store a new key pair on the device\n * Returns only the public key (private key is stored securely)\n */\n static async createIdentity(): Promise<string> {\n if (isWebPlatform()) {\n throw new Error('Identity creation is only available on native platforms (iOS/Android). Please use the native app to create your identity.');\n }\n const store = await initSecureStore();\n const { privateKey, publicKey } = await KeyManager.generateKeyPair();\n\n await store.setItemAsync(STORAGE_KEYS.PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n });\n\n await store.setItemAsync(STORAGE_KEYS.PUBLIC_KEY, publicKey);\n\n // Update cache\n KeyManager.cachedPublicKey = publicKey;\n KeyManager.cachedHasIdentity = true;\n\n return publicKey;\n }\n\n /**\n * Import an existing key pair (e.g., from recovery phrase)\n */\n static async importKeyPair(privateKey: string): Promise<string> {\n if (isWebPlatform()) {\n throw new Error('Identity import is only available on native platforms (iOS/Android). Please use the native app to import your identity.');\n }\n const store = await initSecureStore();\n \n const keyPair = ec.keyFromPrivate(privateKey);\n const publicKey = keyPair.getPublic('hex');\n\n await store.setItemAsync(STORAGE_KEYS.PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n });\n await store.setItemAsync(STORAGE_KEYS.PUBLIC_KEY, publicKey);\n\n // Update cache\n KeyManager.cachedPublicKey = publicKey;\n KeyManager.cachedHasIdentity = true;\n\n return publicKey;\n }\n\n /**\n * Get the stored private key\n * WARNING: Only use this for signing operations within the app\n */\n static async getPrivateKey(): Promise<string | null> {\n if (isWebPlatform()) {\n return null; // Identity storage is only available on native platforms\n }\n try {\n const store = await initSecureStore();\n return await store.getItemAsync(STORAGE_KEYS.PRIVATE_KEY);\n } catch (error) {\n // If secure store is not available, return null (no identity)\n // This allows the app to continue functioning even if secure store fails to load\n if (__DEV__) {\n logger.warn('Failed to access secure store', { component: 'KeyManager' }, error);\n }\n return null;\n }\n }\n\n /**\n * Get the stored public key (cached for performance)\n */\n static async getPublicKey(): Promise<string | null> {\n if (isWebPlatform()) {\n return null; // Identity storage is only available on native platforms\n }\n if (KeyManager.cachedPublicKey !== null) {\n return KeyManager.cachedPublicKey;\n }\n\n try {\n const store = await initSecureStore();\n const publicKey = await store.getItemAsync(STORAGE_KEYS.PUBLIC_KEY);\n \n // Cache result (null is a valid cache value meaning no identity)\n KeyManager.cachedPublicKey = publicKey;\n \n return publicKey;\n } catch (error) {\n // If secure store is not available, return null (no identity)\n // Cache null to avoid repeated failed attempts\n KeyManager.cachedPublicKey = null;\n if (__DEV__) {\n logger.warn('Failed to access secure store', { component: 'KeyManager' }, error);\n }\n return null;\n }\n }\n\n /**\n * Check if an identity (key pair) exists on this device (cached for performance)\n */\n static async hasIdentity(): Promise<boolean> {\n if (isWebPlatform()) {\n return false; // Identity storage is only available on native platforms\n }\n if (KeyManager.cachedHasIdentity !== null) {\n return KeyManager.cachedHasIdentity;\n }\n\n try {\n const privateKey = await KeyManager.getPrivateKey();\n const hasIdentity = privateKey !== null;\n \n // Cache result\n KeyManager.cachedHasIdentity = hasIdentity;\n \n return hasIdentity;\n } catch (error) {\n // If we can't check, assume no identity (safer default)\n // Cache false to avoid repeated failed attempts\n KeyManager.cachedHasIdentity = false;\n if (__DEV__) {\n logger.warn('Failed to check identity', { component: 'KeyManager' }, error);\n }\n return false;\n }\n }\n\n /**\n * Delete the stored identity (both keys)\n * Use with EXTREME caution - this is irreversible without a recovery phrase\n * This should ONLY be called when explicitly requested by the user\n * @param skipBackup - If true, skip backup before deletion (default: false)\n * @param force - If true, skip confirmation checks (default: false)\n * @param userConfirmed - If true, user has explicitly confirmed deletion (default: false)\n */\n static async deleteIdentity(\n skipBackup: boolean = false, \n force: boolean = false,\n userConfirmed: boolean = false\n ): Promise<void> {\n if (isWebPlatform()) {\n return; // Identity storage is only available on native platforms, nothing to delete\n }\n // CRITICAL SAFEGUARD: Require explicit user confirmation unless force is true\n if (!force && !userConfirmed) {\n throw new Error('Identity deletion requires explicit user confirmation. This is a safety measure to prevent accidental data loss.');\n }\n\n if (!force) {\n const hasIdentity = await KeyManager.hasIdentity();\n if (!hasIdentity) {\n return; // Nothing to delete\n }\n }\n\n const store = await initSecureStore();\n \n // ALWAYS create backup before deletion unless explicitly skipped\n if (!skipBackup) {\n try {\n const backupSuccess = await KeyManager.backupIdentity();\n if (!backupSuccess && typeof __DEV__ !== 'undefined' && __DEV__) {\n logger.warn('Failed to backup identity before deletion - proceeding anyway', { component: 'KeyManager' });\n }\n } catch (backupError) {\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n logger.warn('Failed to backup identity before deletion', { component: 'KeyManager' }, backupError);\n }\n }\n }\n\n await store.deleteItemAsync(STORAGE_KEYS.PRIVATE_KEY);\n await store.deleteItemAsync(STORAGE_KEYS.PUBLIC_KEY);\n \n // Invalidate cache\n KeyManager.invalidateCache();\n \n // Also clear backup if force deletion\n if (force) {\n try {\n await store.deleteItemAsync(STORAGE_KEYS.BACKUP_PRIVATE_KEY);\n await store.deleteItemAsync(STORAGE_KEYS.BACKUP_PUBLIC_KEY);\n await store.deleteItemAsync(STORAGE_KEYS.BACKUP_TIMESTAMP);\n } catch (error) {\n // Ignore backup deletion errors\n }\n }\n }\n\n /**\n * Backup identity to SecureStore (separate backup storage)\n * This provides a recovery mechanism if primary storage fails\n */\n static async backupIdentity(): Promise<boolean> {\n if (isWebPlatform()) {\n return false; // Identity storage is only available on native platforms\n }\n try {\n const store = await initSecureStore();\n const privateKey = await KeyManager.getPrivateKey();\n const publicKey = await KeyManager.getPublicKey();\n\n if (!privateKey || !publicKey) {\n return false; // Nothing to backup\n }\n\n // Store backup in SecureStore (still secure, but separate from primary storage)\n await store.setItemAsync(STORAGE_KEYS.BACKUP_PRIVATE_KEY, privateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n });\n await store.setItemAsync(STORAGE_KEYS.BACKUP_PUBLIC_KEY, publicKey);\n await store.setItemAsync(STORAGE_KEYS.BACKUP_TIMESTAMP, Date.now().toString());\n\n return true;\n } catch (error) {\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n logger.error('Failed to backup identity', error, { component: 'KeyManager' });\n }\n return false;\n }\n }\n\n /**\n * Verify identity integrity - checks if keys are valid and accessible\n */\n static async verifyIdentityIntegrity(): Promise<boolean> {\n if (isWebPlatform()) {\n return false; // Identity storage is only available on native platforms\n }\n try {\n const privateKey = await KeyManager.getPrivateKey();\n const publicKey = await KeyManager.getPublicKey();\n\n if (!privateKey || !publicKey) {\n return false;\n }\n\n // Validate private key format\n if (!KeyManager.isValidPrivateKey(privateKey)) {\n return false;\n }\n\n // Validate public key format\n if (!KeyManager.isValidPublicKey(publicKey)) {\n return false;\n }\n\n // Verify public key can be derived from private key\n const derivedPublicKey = KeyManager.derivePublicKey(privateKey);\n if (derivedPublicKey !== publicKey) {\n return false; // Keys don't match\n }\n\n // Verify we can create a key pair object (tests elliptic curve operations)\n const keyPair = await KeyManager.getKeyPairObject();\n if (!keyPair) {\n return false;\n }\n\n return true;\n } catch (error) {\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n logger.error('Identity integrity check failed', error, { component: 'KeyManager' });\n }\n return false;\n }\n }\n\n /**\n * Restore identity from backup if primary storage is corrupted\n */\n static async restoreIdentityFromBackup(): Promise<boolean> {\n if (isWebPlatform()) {\n return false; // Identity storage is only available on native platforms\n }\n try {\n const store = await initSecureStore();\n \n // Check if backup exists\n const backupPrivateKey = await store.getItemAsync(STORAGE_KEYS.BACKUP_PRIVATE_KEY);\n const backupPublicKey = await store.getItemAsync(STORAGE_KEYS.BACKUP_PUBLIC_KEY);\n\n if (!backupPrivateKey || !backupPublicKey) {\n return false; // No backup available\n }\n\n // Verify backup integrity\n if (!KeyManager.isValidPrivateKey(backupPrivateKey)) {\n return false;\n }\n\n if (!KeyManager.isValidPublicKey(backupPublicKey)) {\n return false;\n }\n\n // Verify keys match\n const derivedPublicKey = KeyManager.derivePublicKey(backupPrivateKey);\n if (derivedPublicKey !== backupPublicKey) {\n return false; // Backup keys don't match\n }\n\n await store.setItemAsync(STORAGE_KEYS.PRIVATE_KEY, backupPrivateKey, {\n keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,\n });\n await store.setItemAsync(STORAGE_KEYS.PUBLIC_KEY, backupPublicKey);\n\n const restored = await KeyManager.verifyIdentityIntegrity();\n if (restored) {\n // Update cache\n KeyManager.cachedPublicKey = backupPublicKey;\n KeyManager.cachedHasIdentity = true;\n\n await store.setItemAsync(STORAGE_KEYS.BACKUP_TIMESTAMP, Date.now().toString());\n return true;\n }\n\n return false;\n } catch (error) {\n if (typeof __DEV__ !== 'undefined' && __DEV__) {\n logger.error('Failed to restore identity from backup', error, { component: 'KeyManager' });\n }\n return false;\n }\n }\n\n /**\n * Get the elliptic curve key object from the stored private key\n * Used internally for signing operations\n */\n static async getKeyPairObject(): Promise<ECKeyPair | null> {\n if (isWebPlatform()) {\n return null; // Identity storage is only available on native platforms\n }\n const privateKey = await KeyManager.getPrivateKey();\n if (!privateKey) return null;\n return ec.keyFromPrivate(privateKey);\n }\n\n /**\n * Derive public key from a private key (without storing)\n */\n static derivePublicKey(privateKey: string): string {\n const keyPair = ec.keyFromPrivate(privateKey);\n return keyPair.getPublic('hex');\n }\n\n /**\n * Validate that a string is a valid public key\n */\n static isValidPublicKey(publicKey: string): boolean {\n try {\n ec.keyFromPublic(publicKey, 'hex');\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Validate that a string is a valid private key\n */\n static isValidPrivateKey(privateKey: string): boolean {\n try {\n const keyPair = ec.keyFromPrivate(privateKey);\n // Verify it can derive a public key\n keyPair.getPublic('hex');\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get a shortened version of the public key for display\n * Format: first 8 chars...last 8 chars\n */\n static shortenPublicKey(publicKey: string): string {\n if (publicKey.length <= 20) return publicKey;\n return `${publicKey.slice(0, 8)}...${publicKey.slice(-8)}`;\n }\n}\n\nexport default KeyManager;\n\n\n","/**\n * Signature Service - ECDSA Digital Signatures\n * \n * Handles signing and verification of messages using ECDSA secp256k1.\n * Used for authenticating requests and proving identity ownership.\n */\n\nimport { ec as EC } from 'elliptic';\nimport { KeyManager } from './keyManager';\n\n// Lazy import for expo-crypto\nlet ExpoCrypto: typeof import('expo-crypto') | null = null;\n\nconst ec = new EC('secp256k1');\n\n/**\n * Check if we're in a React Native environment\n */\nfunction isReactNative(): boolean {\n return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n}\n\n/**\n * Check if we're in a Node.js environment\n */\nfunction isNodeJS(): boolean {\n return typeof process !== 'undefined' && process.versions != null && process.versions.node != null;\n}\n\n/**\n * Initialize expo-crypto module\n */\nasync function initExpoCrypto(): Promise<typeof import('expo-crypto')> {\n if (!ExpoCrypto) {\n ExpoCrypto = await import('expo-crypto');\n }\n return ExpoCrypto;\n}\n\n/**\n * Compute SHA-256 hash of a string\n */\nasync function sha256(message: string): Promise<string> {\n // In React Native, always use expo-crypto\n if (isReactNative() || !isNodeJS()) {\n const Crypto = await initExpoCrypto();\n return Crypto.digestStringAsync(\n Crypto.CryptoDigestAlgorithm.SHA256,\n message\n );\n }\n \n // In Node.js, use Node's crypto module\n // Use Function constructor to prevent Metro bundler from statically analyzing this require\n // This ensures the require is only evaluated in Node.js runtime, not during Metro bundling\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const getCrypto = new Function('return require(\"crypto\")');\n const crypto = getCrypto();\n return crypto.createHash('sha256').update(message).digest('hex');\n } catch (error) {\n // Fallback to expo-crypto if Node crypto fails\n const Crypto = await initExpoCrypto();\n return Crypto.digestStringAsync(\n Crypto.CryptoDigestAlgorithm.SHA256,\n message\n );\n }\n}\n\nexport interface SignedMessage {\n message: string;\n signature: string;\n publicKey: string;\n timestamp: number;\n}\n\nexport interface AuthChallenge {\n challenge: string;\n publicKey: string;\n timestamp: number;\n}\n\nexport class SignatureService {\n /**\n * Generate a random challenge string (for offline use)\n * Uses expo-crypto in React Native, crypto.randomBytes in Node.js\n */\n static async generateChallenge(): Promise<string> {\n if (isReactNative() || !isNodeJS()) {\n // Use expo-crypto for React Native (expo-random is deprecated)\n const Crypto = await initExpoCrypto();\n const randomBytes = await Crypto.getRandomBytesAsync(32);\n return Array.from(randomBytes)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n \n // Node.js fallback\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const getCrypto = new Function('return require(\"crypto\")');\n const crypto = getCrypto();\n return crypto.randomBytes(32).toString('hex');\n } catch (error) {\n // Fallback to expo-crypto if Node crypto fails\n const Crypto = await initExpoCrypto();\n const randomBytes = await Crypto.getRandomBytesAsync(32);\n return Array.from(randomBytes)\n .map((b: number) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n }\n\n /**\n * Hash a message using SHA-256\n */\n static async hashMessage(message: string): Promise<string> {\n return sha256(message);\n }\n\n /**\n * Sign a message using the stored private key\n * Returns the signature in DER format (hex encoded)\n */\n static async sign(message: string): Promise<string> {\n const keyPair = await KeyManager.getKeyPairObject();\n if (!keyPair) {\n throw new Error('No identity found. Please create or import an identity first.');\n }\n\n const messageHash = await sha256(message);\n const signature = keyPair.sign(messageHash);\n return signature.toDER('hex');\n }\n\n /**\n * Sign a message with an explicit private key (without storing)\n * Useful for one-time operations or testing\n */\n static async signWithKey(message: string, privateKey: string): Promise<string> {\n const keyPair = ec.keyFromPrivate(privateKey);\n const messageHash = await sha256(message);\n const signature = keyPair.sign(messageHash);\n return signature.toDER('hex');\n }\n\n /**\n * Verify a signature against a message and public key\n */\n static async verify(message: string, signature: string, publicKey: string): Promise<boolean> {\n try {\n const key = ec.keyFromPublic(publicKey, 'hex');\n const messageHash = await sha256(message);\n return key.verify(messageHash, signature);\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous verification (for Node.js backend)\n * Uses crypto module directly for hashing\n * Note: This method should only be used in Node.js environments\n */\n static verifySync(message: string, signature: string, publicKey: string): boolean {\n try {\n if (!isNodeJS()) {\n // In React Native, use async verify instead\n throw new Error('verifySync should only be used in Node.js. Use verify() in React Native.');\n }\n // Use Function constructor to prevent Metro bundler from statically analyzing this require\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const getCrypto = new Function('return require(\"crypto\")');\n const crypto = getCrypto();\n const key = ec.keyFromPublic(publicKey, 'hex');\n const messageHash = crypto.createHash('sha256').update(message).digest('hex');\n return key.verify(messageHash, signature);\n } catch {\n return false;\n }\n }\n\n /**\n * Create a signed message object with metadata\n */\n static async createSignedMessage(message: string): Promise<SignedMessage> {\n const publicKey = await KeyManager.getPublicKey();\n if (!publicKey) {\n throw new Error('No identity found. Please create or import an identity first.');\n }\n\n const timestamp = Date.now();\n const messageWithTimestamp = `${message}:${timestamp}`;\n const signature = await SignatureService.sign(messageWithTimestamp);\n\n return {\n message,\n signature,\n publicKey,\n timestamp,\n };\n }\n\n /**\n * Verify a signed message object\n * Checks both signature validity and timestamp freshness\n */\n static async verifySignedMessage(\n signedMessage: SignedMessage,\n maxAgeMs: number = 5 * 60 * 1000 // 5 minutes default\n ): Promise<boolean> {\n const { message, signature, publicKey, timestamp } = signedMessage;\n\n // Check timestamp freshness\n const now = Date.now();\n if (now - timestamp > maxAgeMs) {\n return false;\n }\n\n // Verify signature\n const messageWithTimestamp = `${message}:${timestamp}`;\n return SignatureService.verify(messageWithTimestamp, signature, publicKey);\n }\n\n /**\n * Create a signed authentication challenge response\n * Used for challenge-response authentication\n */\n static async signChallenge(challenge: string): Promise<AuthChallenge> {\n const publicKey = await KeyManager.getPublicKey();\n if (!publicKey) {\n throw new Error('No identity found. Please create or import an identity first.');\n }\n\n const timestamp = Date.now();\n const message = `auth:${publicKey}:${challenge}:${timestamp}`;\n const signature = await SignatureService.sign(message);\n\n return {\n challenge: signature,\n publicKey,\n timestamp,\n };\n }\n\n /**\n * Verify a challenge response\n */\n static async verifyChallengeResponse(\n originalChallenge: string,\n response: AuthChallenge,\n maxAgeMs: number = 5 * 60 * 1000\n ): Promise<boolean> {\n const { challenge: signature, publicKey, timestamp } = response;\n\n // Check timestamp freshness\n const now = Date.now();\n if (now - timestamp > maxAgeMs) {\n return false;\n }\n\n const message = `auth:${publicKey}:${originalChallenge}:${timestamp}`;\n return SignatureService.verify(message, signature, publicKey);\n }\n\n /**\n * Create a registration signature\n * Used when registering a new identity with the server\n * Format matches server expectation: oxy:register:{publicKey}:{timestamp}\n */\n static async createRegistrationSignature(): Promise<{ signature: string; publicKey: string; timestamp: number }> {\n const publicKey = await KeyManager.getPublicKey();\n if (!publicKey) {\n throw new Error('No identity found. Please create or import an identity first.');\n }\n\n const timestamp = Date.now();\n const message = `oxy:register:${publicKey}:${timestamp}`;\n const signature = await SignatureService.sign(message);\n\n return {\n signature,\n publicKey,\n timestamp,\n };\n }\n\n /**\n * Sign arbitrary data for API requests\n * Creates a canonical string representation and signs it\n */\n static async signRequestData(data: Record<string, unknown>): Promise<{\n signature: string;\n publicKey: string;\n timestamp: number;\n }> {\n const publicKey = await KeyManager.getPublicKey();\n if (!publicKey) {\n throw new Error('No identity found. Please create or import an identity first.');\n }\n\n const timestamp = Date.now();\n \n // Create canonical string representation\n const sortedKeys = Object.keys(data).sort();\n const canonicalParts = sortedKeys.map(key => `${key}:${JSON.stringify(data[key])}`);\n const canonicalString = canonicalParts.join('|');\n \n const message = `request:${publicKey}:${timestamp}:${canonicalString}`;\n const signature = await SignatureService.sign(message);\n\n return {\n signature,\n publicKey,\n timestamp,\n };\n }\n}\n\nexport default SignatureService;\n\n\n","\"use strict\";\n/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.wrapXOFConstructorWithOpts = exports.wrapConstructorWithOpts = exports.wrapConstructor = exports.Hash = exports.nextTick = exports.swap32IfBE = exports.byteSwapIfBE = exports.swap8IfBE = exports.isLE = void 0;\nexports.isBytes = isBytes;\nexports.anumber = anumber;\nexports.abytes = abytes;\nexports.ahash = ahash;\nexports.aexists = aexists;\nexports.aoutput = aoutput;\nexports.u8 = u8;\nexports.u32 = u32;\nexports.clean = clean;\nexports.createView = createView;\nexports.rotr = rotr;\nexports.rotl = rotl;\nexports.byteSwap = byteSwap;\nexports.byteSwap32 = byteSwap32;\nexports.bytesToHex = bytesToHex;\nexports.hexToBytes = hexToBytes;\nexports.asyncLoop = asyncLoop;\nexports.utf8ToBytes = utf8ToBytes;\nexports.bytesToUtf8 = bytesToUtf8;\nexports.toBytes = toBytes;\nexports.kdfInputToBytes = kdfInputToBytes;\nexports.concatBytes = concatBytes;\nexports.checkOpts = checkOpts;\nexports.createHasher = createHasher;\nexports.createOptHasher = createOptHasher;\nexports.createXOFer = createXOFer;\nexports.randomBytes = randomBytes;\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nconst crypto_1 = require(\"@noble/hashes/crypto\");\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nfunction isBytes(a) {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nfunction anumber(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b, ...lengths) {\n if (!isBytes(b))\n throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nfunction ahash(h) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nfunction aexists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nfunction aoutput(out, instance) {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n/** Cast u8 / u16 / u32 to u8. */\nfunction u8(arr) {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nfunction u32(arr) {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nfunction clean(...arrays) {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nfunction createView(arr) {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nfunction rotr(word, shift) {\n return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nfunction rotl(word, shift) {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexports.isLE = (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nfunction byteSwap(word) {\n return (((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nexports.swap8IfBE = exports.isLE\n ? (n) => n\n : (n) => byteSwap(n);\n/** @deprecated */\nexports.byteSwapIfBE = exports.swap8IfBE;\n/** In place byte swap for Uint32Array */\nfunction byteSwap32(arr) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\nexports.swap32IfBE = exports.isLE\n ? (u) => u\n : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nfunction bytesToHex(bytes) {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin)\n return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n if (ch >= asciis._0 && ch <= asciis._9)\n return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F)\n return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f)\n return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nfunction hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin)\n return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nconst nextTick = async () => { };\nexports.nextTick = nextTick;\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nasync function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await (0, exports.nextTick)();\n ts += diff;\n }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nfunction utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nfunction bytesToUtf8(bytes) {\n return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nfunction toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nfunction kdfInputToBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n/** Copies several Uint8Arrays into one. */\nfunction concatBytes(...arrays) {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\nfunction checkOpts(defaults, opts) {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\n/** For runtime check if class implements interface */\nclass Hash {\n}\nexports.Hash = Hash;\n/** Wraps hash function, creating an interface on top of it */\nfunction createHasher(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nfunction createOptHasher(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nfunction createXOFer(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexports.wrapConstructor = createHasher;\nexports.wrapConstructorWithOpts = createOptHasher;\nexports.wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nfunction randomBytes(bytesLength = 32) {\n if (crypto_1.crypto && typeof crypto_1.crypto.getRandomValues === 'function') {\n return crypto_1.crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto_1.crypto && typeof crypto_1.crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto_1.crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.crypto = void 0;\nexports.crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SHA512_IV = exports.SHA384_IV = exports.SHA224_IV = exports.SHA256_IV = exports.HashMD = void 0;\nexports.setBigUint64 = setBigUint64;\nexports.Chi = Chi;\nexports.Maj = Maj;\n/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nconst utils_ts_1 = require(\"./utils.js\");\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nfunction setBigUint64(view, byteOffset, value, isLE) {\n if (typeof view.setBigUint64 === 'function')\n return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nfunction Chi(a, b, c) {\n return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nfunction Maj(a, b, c) {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nclass HashMD extends utils_ts_1.Hash {\n constructor(blockLen, outputLen, padOffset, isLE) {\n super();\n this.finished = false;\n this.length = 0;\n this.pos = 0;\n this.destroyed = false;\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = (0, utils_ts_1.createView)(this.buffer);\n }\n update(data) {\n (0, utils_ts_1.aexists)(this);\n data = (0, utils_ts_1.toBytes)(data);\n (0, utils_ts_1.abytes)(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = (0, utils_ts_1.createView)(data);\n for (; blockLen <= len - pos; pos += blockLen)\n this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out) {\n (0, utils_ts_1.aexists)(this);\n (0, utils_ts_1.aoutput)(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n (0, utils_ts_1.clean)(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++)\n buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = (0, utils_ts_1.createView)(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4)\n throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length)\n throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++)\n oview.setUint32(4 * i, state[i], isLE);\n }\n digest() {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to) {\n to || (to = new this.constructor());\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen)\n to.buffer.set(buffer);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n}\nexports.HashMD = HashMD;\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexports.SHA256_IV = Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexports.SHA224_IV = Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexports.SHA384_IV = Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexports.SHA512_IV = Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.toBig = exports.shrSL = exports.shrSH = exports.rotrSL = exports.rotrSH = exports.rotrBL = exports.rotrBH = exports.rotr32L = exports.rotr32H = exports.rotlSL = exports.rotlSH = exports.rotlBL = exports.rotlBH = exports.add5L = exports.add5H = exports.add4L = exports.add4H = exports.add3L = exports.add3H = void 0;\nexports.add = add;\nexports.fromBig = fromBig;\nexports.split = split;\n/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\nexports.toBig = toBig;\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nexports.shrSH = shrSH;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\nexports.shrSL = shrSL;\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nexports.rotrSH = rotrSH;\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\nexports.rotrSL = rotrSL;\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nexports.rotrBH = rotrBH;\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\nexports.rotrBL = rotrBL;\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nexports.rotr32H = rotr32H;\nconst rotr32L = (h, _l) => h;\nexports.rotr32L = rotr32L;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nexports.rotlSH = rotlSH;\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\nexports.rotlSL = rotlSL;\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nexports.rotlBH = rotlBH;\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\nexports.rotlBL = rotlBL;\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nexports.add3L = add3L;\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nexports.add3H = add3H;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nexports.add4L = add4L;\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nexports.add4H = add4H;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nexports.add5L = add5L;\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\nexports.add5H = add5H;\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexports.default = u64;\n//# sourceMappingURL=_u64.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sha512_224 = exports.sha512_256 = exports.sha384 = exports.sha512 = exports.sha224 = exports.sha256 = exports.SHA512_256 = exports.SHA512_224 = exports.SHA384 = exports.SHA512 = exports.SHA224 = exports.SHA256 = void 0;\n/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nconst _md_ts_1 = require(\"./_md.js\");\nconst u64 = require(\"./_u64.js\");\nconst utils_ts_1 = require(\"./utils.js\");\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nclass SHA256 extends _md_ts_1.HashMD {\n constructor(outputLen = 32) {\n super(64, outputLen, 8, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n this.A = _md_ts_1.SHA256_IV[0] | 0;\n this.B = _md_ts_1.SHA256_IV[1] | 0;\n this.C = _md_ts_1.SHA256_IV[2] | 0;\n this.D = _md_ts_1.SHA256_IV[3] | 0;\n this.E = _md_ts_1.SHA256_IV[4] | 0;\n this.F = _md_ts_1.SHA256_IV[5] | 0;\n this.G = _md_ts_1.SHA256_IV[6] | 0;\n this.H = _md_ts_1.SHA256_IV[7] | 0;\n }\n get() {\n const { A, B, C, D, E, F, G, H } = this;\n return [A, B, C, D, E, F, G, H];\n }\n // prettier-ignore\n set(A, B, C, D, E, F, G, H) {\n this.A = A | 0;\n this.B = B | 0;\n this.C = C | 0;\n this.D = D | 0;\n this.E = E | 0;\n this.F = F | 0;\n this.G = G | 0;\n this.H = H | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4)\n SHA256_W[i] = view.getUint32(offset, false);\n for (let i = 16; i < 64; i++) {\n const W15 = SHA256_W[i - 15];\n const W2 = SHA256_W[i - 2];\n const s0 = (0, utils_ts_1.rotr)(W15, 7) ^ (0, utils_ts_1.rotr)(W15, 18) ^ (W15 >>> 3);\n const s1 = (0, utils_ts_1.rotr)(W2, 17) ^ (0, utils_ts_1.rotr)(W2, 19) ^ (W2 >>> 10);\n SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n }\n // Compression function main loop, 64 rounds\n let { A, B, C, D, E, F, G, H } = this;\n for (let i = 0; i < 64; i++) {\n const sigma1 = (0, utils_ts_1.rotr)(E, 6) ^ (0, utils_ts_1.rotr)(E, 11) ^ (0, utils_ts_1.rotr)(E, 25);\n const T1 = (H + sigma1 + (0, _md_ts_1.Chi)(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const sigma0 = (0, utils_ts_1.rotr)(A, 2) ^ (0, utils_ts_1.rotr)(A, 13) ^ (0, utils_ts_1.rotr)(A, 22);\n const T2 = (sigma0 + (0, _md_ts_1.Maj)(A, B, C)) | 0;\n H = G;\n G = F;\n F = E;\n E = (D + T1) | 0;\n D = C;\n C = B;\n B = A;\n A = (T1 + T2) | 0;\n }\n // Add the compressed chunk to the current hash value\n A = (A + this.A) | 0;\n B = (B + this.B) | 0;\n C = (C + this.C) | 0;\n D = (D + this.D) | 0;\n E = (E + this.E) | 0;\n F = (F + this.F) | 0;\n G = (G + this.G) | 0;\n H = (H + this.H) | 0;\n this.set(A, B, C, D, E, F, G, H);\n }\n roundClean() {\n (0, utils_ts_1.clean)(SHA256_W);\n }\n destroy() {\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n (0, utils_ts_1.clean)(this.buffer);\n }\n}\nexports.SHA256 = SHA256;\nclass SHA224 extends SHA256 {\n constructor() {\n super(28);\n this.A = _md_ts_1.SHA224_IV[0] | 0;\n this.B = _md_ts_1.SHA224_IV[1] | 0;\n this.C = _md_ts_1.SHA224_IV[2] | 0;\n this.D = _md_ts_1.SHA224_IV[3] | 0;\n this.E = _md_ts_1.SHA224_IV[4] | 0;\n this.F = _md_ts_1.SHA224_IV[5] | 0;\n this.G = _md_ts_1.SHA224_IV[6] | 0;\n this.H = _md_ts_1.SHA224_IV[7] | 0;\n }\n}\nexports.SHA224 = SHA224;\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nclass SHA512 extends _md_ts_1.HashMD {\n constructor(outputLen = 64) {\n super(128, outputLen, 16, false);\n // We cannot use array here since array allows indexing by variable\n // which means optimizer/compiler cannot use registers.\n // h -- high 32 bits, l -- low 32 bits\n this.Ah = _md_ts_1.SHA512_IV[0] | 0;\n this.Al = _md_ts_1.SHA512_IV[1] | 0;\n this.Bh = _md_ts_1.SHA512_IV[2] | 0;\n this.Bl = _md_ts_1.SHA512_IV[3] | 0;\n this.Ch = _md_ts_1.SHA512_IV[4] | 0;\n this.Cl = _md_ts_1.SHA512_IV[5] | 0;\n this.Dh = _md_ts_1.SHA512_IV[6] | 0;\n this.Dl = _md_ts_1.SHA512_IV[7] | 0;\n this.Eh = _md_ts_1.SHA512_IV[8] | 0;\n this.El = _md_ts_1.SHA512_IV[9] | 0;\n this.Fh = _md_ts_1.SHA512_IV[10] | 0;\n this.Fl = _md_ts_1.SHA512_IV[11] | 0;\n this.Gh = _md_ts_1.SHA512_IV[12] | 0;\n this.Gl = _md_ts_1.SHA512_IV[13] | 0;\n this.Hh = _md_ts_1.SHA512_IV[14] | 0;\n this.Hl = _md_ts_1.SHA512_IV[15] | 0;\n }\n // prettier-ignore\n get() {\n const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n }\n // prettier-ignore\n set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n this.Ah = Ah | 0;\n this.Al = Al | 0;\n this.Bh = Bh | 0;\n this.Bl = Bl | 0;\n this.Ch = Ch | 0;\n this.Cl = Cl | 0;\n this.Dh = Dh | 0;\n this.Dl = Dl | 0;\n this.Eh = Eh | 0;\n this.El = El | 0;\n this.Fh = Fh | 0;\n this.Fl = Fl | 0;\n this.Gh = Gh | 0;\n this.Gl = Gl | 0;\n this.Hh = Hh | 0;\n this.Hl = Hl | 0;\n }\n process(view, offset) {\n // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n for (let i = 0; i < 16; i++, offset += 4) {\n SHA512_W_H[i] = view.getUint32(offset);\n SHA512_W_L[i] = view.getUint32((offset += 4));\n }\n for (let i = 16; i < 80; i++) {\n // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n const W15h = SHA512_W_H[i - 15] | 0;\n const W15l = SHA512_W_L[i - 15] | 0;\n const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n const W2h = SHA512_W_H[i - 2] | 0;\n const W2l = SHA512_W_L[i - 2] | 0;\n const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n SHA512_W_H[i] = SUMh | 0;\n SHA512_W_L[i] = SUMl | 0;\n }\n let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n // Compression function main loop, 80 rounds\n for (let i = 0; i < 80; i++) {\n // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n const CHIl = (El & Fl) ^ (~El & Gl);\n // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n // prettier-ignore\n const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n const T1l = T1ll | 0;\n // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n Hh = Gh | 0;\n Hl = Gl | 0;\n Gh = Fh | 0;\n Gl = Fl | 0;\n Fh = Eh | 0;\n Fl = El | 0;\n ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n Dh = Ch | 0;\n Dl = Cl | 0;\n Ch = Bh | 0;\n Cl = Bl | 0;\n Bh = Ah | 0;\n Bl = Al | 0;\n const All = u64.add3L(T1l, sigma0l, MAJl);\n Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n Al = All | 0;\n }\n // Add the compressed chunk to the current hash value\n ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n }\n roundClean() {\n (0, utils_ts_1.clean)(SHA512_W_H, SHA512_W_L);\n }\n destroy() {\n (0, utils_ts_1.clean)(this.buffer);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\nexports.SHA512 = SHA512;\nclass SHA384 extends SHA512 {\n constructor() {\n super(48);\n this.Ah = _md_ts_1.SHA384_IV[0] | 0;\n this.Al = _md_ts_1.SHA384_IV[1] | 0;\n this.Bh = _md_ts_1.SHA384_IV[2] | 0;\n this.Bl = _md_ts_1.SHA384_IV[3] | 0;\n this.Ch = _md_ts_1.SHA384_IV[4] | 0;\n this.Cl = _md_ts_1.SHA384_IV[5] | 0;\n this.Dh = _md_ts_1.SHA384_IV[6] | 0;\n this.Dl = _md_ts_1.SHA384_IV[7] | 0;\n this.Eh = _md_ts_1.SHA384_IV[8] | 0;\n this.El = _md_ts_1.SHA384_IV[9] | 0;\n this.Fh = _md_ts_1.SHA384_IV[10] | 0;\n this.Fl = _md_ts_1.SHA384_IV[11] | 0;\n this.Gh = _md_ts_1.SHA384_IV[12] | 0;\n this.Gl = _md_ts_1.SHA384_IV[13] | 0;\n this.Hh = _md_ts_1.SHA384_IV[14] | 0;\n this.Hl = _md_ts_1.SHA384_IV[15] | 0;\n }\n}\nexports.SHA384 = SHA384;\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n 0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n 0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n 0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n 0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nclass SHA512_224 extends SHA512 {\n constructor() {\n super(28);\n this.Ah = T224_IV[0] | 0;\n this.Al = T224_IV[1] | 0;\n this.Bh = T224_IV[2] | 0;\n this.Bl = T224_IV[3] | 0;\n this.Ch = T224_IV[4] | 0;\n this.Cl = T224_IV[5] | 0;\n this.Dh = T224_IV[6] | 0;\n this.Dl = T224_IV[7] | 0;\n this.Eh = T224_IV[8] | 0;\n this.El = T224_IV[9] | 0;\n this.Fh = T224_IV[10] | 0;\n this.Fl = T224_IV[11] | 0;\n this.Gh = T224_IV[12] | 0;\n this.Gl = T224_IV[13] | 0;\n this.Hh = T224_IV[14] | 0;\n this.Hl = T224_IV[15] | 0;\n }\n}\nexports.SHA512_224 = SHA512_224;\nclass SHA512_256 extends SHA512 {\n constructor() {\n super(32);\n this.Ah = T256_IV[0] | 0;\n this.Al = T256_IV[1] | 0;\n this.Bh = T256_IV[2] | 0;\n this.Bl = T256_IV[3] | 0;\n this.Ch = T256_IV[4] | 0;\n this.Cl = T256_IV[5] | 0;\n this.Dh = T256_IV[6] | 0;\n this.Dl = T256_IV[7] | 0;\n this.Eh = T256_IV[8] | 0;\n this.El = T256_IV[9] | 0;\n this.Fh = T256_IV[10] | 0;\n this.Fl = T256_IV[11] | 0;\n this.Gh = T256_IV[12] | 0;\n this.Gl = T256_IV[13] | 0;\n this.Hh = T256_IV[14] | 0;\n this.Hl = T256_IV[15] | 0;\n }\n}\nexports.SHA512_256 = SHA512_256;\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexports.sha256 = (0, utils_ts_1.createHasher)(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexports.sha224 = (0, utils_ts_1.createHasher)(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nexports.sha512 = (0, utils_ts_1.createHasher)(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexports.sha384 = (0, utils_ts_1.createHasher)(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexports.sha512_256 = (0, utils_ts_1.createHasher)(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexports.sha512_224 = (0, utils_ts_1.createHasher)(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sha224 = exports.SHA224 = exports.sha256 = exports.SHA256 = void 0;\n/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nconst sha2_ts_1 = require(\"./sha2.js\");\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.SHA256 = sha2_ts_1.SHA256;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.sha256 = sha2_ts_1.sha256;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.SHA224 = sha2_ts_1.SHA224;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.sha224 = sha2_ts_1.sha224;\n//# sourceMappingURL=sha256.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.sha512_256 = exports.SHA512_256 = exports.sha512_224 = exports.SHA512_224 = exports.sha384 = exports.SHA384 = exports.sha512 = exports.SHA512 = void 0;\n/**\n * SHA2-512 a.k.a. sha512 and sha384. It is slower than sha256 in js because u64 operations are slow.\n *\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [the paper on truncated SHA512/256](https://eprint.iacr.org/2010/548.pdf).\n * @module\n * @deprecated\n */\nconst sha2_ts_1 = require(\"./sha2.js\");\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.SHA512 = sha2_ts_1.SHA512;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.sha512 = sha2_ts_1.sha512;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.SHA384 = sha2_ts_1.SHA384;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.sha384 = sha2_ts_1.sha384;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.SHA512_224 = sha2_ts_1.SHA512_224;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.sha512_224 = sha2_ts_1.sha512_224;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.SHA512_256 = sha2_ts_1.SHA512_256;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexports.sha512_256 = sha2_ts_1.sha512_256;\n//# sourceMappingURL=sha512.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hmac = exports.HMAC = void 0;\n/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nconst utils_ts_1 = require(\"./utils.js\");\nclass HMAC extends utils_ts_1.Hash {\n constructor(hash, _key) {\n super();\n this.finished = false;\n this.destroyed = false;\n (0, utils_ts_1.ahash)(hash);\n const key = (0, utils_ts_1.toBytes)(_key);\n this.iHash = hash.create();\n if (typeof this.iHash.update !== 'function')\n throw new Error('Expected instance of class which extends utils.Hash');\n this.blockLen = this.iHash.blockLen;\n this.outputLen = this.iHash.outputLen;\n const blockLen = this.blockLen;\n const pad = new Uint8Array(blockLen);\n // blockLen can be bigger than outputLen\n pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36;\n this.iHash.update(pad);\n // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n this.oHash = hash.create();\n // Undo internal XOR && apply outer XOR\n for (let i = 0; i < pad.length; i++)\n pad[i] ^= 0x36 ^ 0x5c;\n this.oHash.update(pad);\n (0, utils_ts_1.clean)(pad);\n }\n update(buf) {\n (0, utils_ts_1.aexists)(this);\n this.iHash.update(buf);\n return this;\n }\n digestInto(out) {\n (0, utils_ts_1.aexists)(this);\n (0, utils_ts_1.abytes)(out, this.outputLen);\n this.finished = true;\n this.iHash.digestInto(out);\n this.oHash.update(out);\n this.oHash.digestInto(out);\n this.destroy();\n }\n digest() {\n const out = new Uint8Array(this.oHash.outputLen);\n this.digestInto(out);\n return out;\n }\n _cloneInto(to) {\n // Create new instance without calling constructor since key already in state and we don't know it.\n to || (to = Object.create(Object.getPrototypeOf(this), {}));\n const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n to = to;\n to.finished = finished;\n to.destroyed = destroyed;\n to.blockLen = blockLen;\n to.outputLen = outputLen;\n to.oHash = oHash._cloneInto(to.oHash);\n to.iHash = iHash._cloneInto(to.iHash);\n return to;\n }\n clone() {\n return this._cloneInto();\n }\n destroy() {\n this.destroyed = true;\n this.oHash.destroy();\n this.iHash.destroy();\n }\n}\nexports.HMAC = HMAC;\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nconst hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nexports.hmac = hmac;\nexports.hmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.pbkdf2 = pbkdf2;\nexports.pbkdf2Async = pbkdf2Async;\n/**\n * PBKDF (RFC 2898). Can be used to create a key from password and salt.\n * @module\n */\nconst hmac_ts_1 = require(\"./hmac.js\");\n// prettier-ignore\nconst utils_ts_1 = require(\"./utils.js\");\n// Common prologue and epilogue for sync/async functions\nfunction pbkdf2Init(hash, _password, _salt, _opts) {\n (0, utils_ts_1.ahash)(hash);\n const opts = (0, utils_ts_1.checkOpts)({ dkLen: 32, asyncTick: 10 }, _opts);\n const { c, dkLen, asyncTick } = opts;\n (0, utils_ts_1.anumber)(c);\n (0, utils_ts_1.anumber)(dkLen);\n (0, utils_ts_1.anumber)(asyncTick);\n if (c < 1)\n throw new Error('iterations (c) should be >= 1');\n const password = (0, utils_ts_1.kdfInputToBytes)(_password);\n const salt = (0, utils_ts_1.kdfInputToBytes)(_salt);\n // DK = PBKDF2(PRF, Password, Salt, c, dkLen);\n const DK = new Uint8Array(dkLen);\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n const PRF = hmac_ts_1.hmac.create(hash, password);\n const PRFSalt = PRF._cloneInto().update(salt);\n return { c, dkLen, asyncTick, DK, PRF, PRFSalt };\n}\nfunction pbkdf2Output(PRF, PRFSalt, DK, prfW, u) {\n PRF.destroy();\n PRFSalt.destroy();\n if (prfW)\n prfW.destroy();\n (0, utils_ts_1.clean)(u);\n return DK;\n}\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function\n * @param hash - hash function that would be used e.g. sha256\n * @param password - password from which a derived key is generated\n * @param salt - cryptographic salt\n * @param opts - {c, dkLen} where c is work factor and dkLen is output message size\n * @example\n * const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });\n */\nfunction pbkdf2(hash, password, salt, opts) {\n const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW; // Working copy\n const arr = new Uint8Array(4);\n const view = (0, utils_ts_1.createView)(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n for (let ui = 1; ui < c; ui++) {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++)\n Ti[i] ^= u[i];\n }\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n/**\n * PBKDF2-HMAC: RFC 2898 key derivation function. Async version.\n * @example\n * await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });\n */\nasync function pbkdf2Async(hash, password, salt, opts) {\n const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);\n let prfW; // Working copy\n const arr = new Uint8Array(4);\n const view = (0, utils_ts_1.createView)(arr);\n const u = new Uint8Array(PRF.outputLen);\n // DK = T1 + T2 + ⋯ + Tdklen/hlen\n for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {\n // Ti = F(Password, Salt, c, i)\n const Ti = DK.subarray(pos, pos + PRF.outputLen);\n view.setInt32(0, ti, false);\n // F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc\n // U1 = PRF(Password, Salt + INT_32_BE(i))\n (prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);\n Ti.set(u.subarray(0, Ti.length));\n await (0, utils_ts_1.asyncLoop)(c - 1, asyncTick, () => {\n // Uc = PRF(Password, Uc−1)\n PRF._cloneInto(prfW).update(u).digestInto(u);\n for (let i = 0; i < Ti.length; i++)\n Ti[i] ^= u[i];\n });\n }\n return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);\n}\n//# sourceMappingURL=pbkdf2.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// browserify by default only pulls in files that are hard coded in requires\n// In order of last to first in this file, the default wordlist will be chosen\n// based on what is present. (Bundles may remove wordlists they don't need)\nconst wordlists = {};\nexports.wordlists = wordlists;\nlet _default;\nexports._default = _default;\ntry {\n exports._default = _default = require('./wordlists/czech.json');\n wordlists.czech = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/chinese_simplified.json');\n wordlists.chinese_simplified = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/chinese_traditional.json');\n wordlists.chinese_traditional = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/korean.json');\n wordlists.korean = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/french.json');\n wordlists.french = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/italian.json');\n wordlists.italian = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/spanish.json');\n wordlists.spanish = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/japanese.json');\n wordlists.japanese = _default;\n wordlists.JA = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/portuguese.json');\n wordlists.portuguese = _default;\n}\ncatch (err) { }\ntry {\n exports._default = _default = require('./wordlists/english.json');\n wordlists.english = _default;\n wordlists.EN = _default;\n}\ncatch (err) { }\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sha256_1 = require(\"@noble/hashes/sha256\");\nconst sha512_1 = require(\"@noble/hashes/sha512\");\nconst pbkdf2_1 = require(\"@noble/hashes/pbkdf2\");\nconst utils_1 = require(\"@noble/hashes/utils\");\nconst _wordlists_1 = require(\"./_wordlists\");\nlet DEFAULT_WORDLIST = _wordlists_1._default;\nconst INVALID_MNEMONIC = 'Invalid mnemonic';\nconst INVALID_ENTROPY = 'Invalid entropy';\nconst INVALID_CHECKSUM = 'Invalid mnemonic checksum';\nconst WORDLIST_REQUIRED = 'A wordlist is required but a default could not be found.\\n' +\n 'Please pass a 2048 word array explicitly.';\nfunction normalize(str) {\n return (str || '').normalize('NFKD');\n}\nfunction lpad(str, padString, length) {\n while (str.length < length) {\n str = padString + str;\n }\n return str;\n}\nfunction binaryToByte(bin) {\n return parseInt(bin, 2);\n}\nfunction bytesToBinary(bytes) {\n return bytes.map((x) => lpad(x.toString(2), '0', 8)).join('');\n}\nfunction deriveChecksumBits(entropyBuffer) {\n const ENT = entropyBuffer.length * 8;\n const CS = ENT / 32;\n const hash = sha256_1.sha256(Uint8Array.from(entropyBuffer));\n return bytesToBinary(Array.from(hash)).slice(0, CS);\n}\nfunction salt(password) {\n return 'mnemonic' + (password || '');\n}\nfunction mnemonicToSeedSync(mnemonic, password) {\n const mnemonicBuffer = Uint8Array.from(Buffer.from(normalize(mnemonic), 'utf8'));\n const saltBuffer = Uint8Array.from(Buffer.from(salt(normalize(password)), 'utf8'));\n const res = pbkdf2_1.pbkdf2(sha512_1.sha512, mnemonicBuffer, saltBuffer, {\n c: 2048,\n dkLen: 64,\n });\n return Buffer.from(res);\n}\nexports.mnemonicToSeedSync = mnemonicToSeedSync;\nfunction mnemonicToSeed(mnemonic, password) {\n const mnemonicBuffer = Uint8Array.from(Buffer.from(normalize(mnemonic), 'utf8'));\n const saltBuffer = Uint8Array.from(Buffer.from(salt(normalize(password)), 'utf8'));\n return pbkdf2_1.pbkdf2Async(sha512_1.sha512, mnemonicBuffer, saltBuffer, {\n c: 2048,\n dkLen: 64,\n }).then((res) => Buffer.from(res));\n}\nexports.mnemonicToSeed = mnemonicToSeed;\nfunction mnemonicToEntropy(mnemonic, wordlist) {\n wordlist = wordlist || DEFAULT_WORDLIST;\n if (!wordlist) {\n throw new Error(WORDLIST_REQUIRED);\n }\n const words = normalize(mnemonic).split(' ');\n if (words.length % 3 !== 0) {\n throw new Error(INVALID_MNEMONIC);\n }\n // convert word indices to 11 bit binary strings\n const bits = words\n .map((word) => {\n const index = wordlist.indexOf(word);\n if (index === -1) {\n throw new Error(INVALID_MNEMONIC);\n }\n return lpad(index.toString(2), '0', 11);\n })\n .join('');\n // split the binary string into ENT/CS\n const dividerIndex = Math.floor(bits.length / 33) * 32;\n const entropyBits = bits.slice(0, dividerIndex);\n const checksumBits = bits.slice(dividerIndex);\n // calculate the checksum and compare\n const entropyBytes = entropyBits.match(/(.{1,8})/g).map(binaryToByte);\n if (entropyBytes.length < 16) {\n throw new Error(INVALID_ENTROPY);\n }\n if (entropyBytes.length > 32) {\n throw new Error(INVALID_ENTROPY);\n }\n if (entropyBytes.length % 4 !== 0) {\n throw new Error(INVALID_ENTROPY);\n }\n const entropy = Buffer.from(entropyBytes);\n const newChecksum = deriveChecksumBits(entropy);\n if (newChecksum !== checksumBits) {\n throw new Error(INVALID_CHECKSUM);\n }\n return entropy.toString('hex');\n}\nexports.mnemonicToEntropy = mnemonicToEntropy;\nfunction entropyToMnemonic(entropy, wordlist) {\n if (!Buffer.isBuffer(entropy)) {\n entropy = Buffer.from(entropy, 'hex');\n }\n wordlist = wordlist || DEFAULT_WORDLIST;\n if (!wordlist) {\n throw new Error(WORDLIST_REQUIRED);\n }\n // 128 <= ENT <= 256\n if (entropy.length < 16) {\n throw new TypeError(INVALID_ENTROPY);\n }\n if (entropy.length > 32) {\n throw new TypeError(INVALID_ENTROPY);\n }\n if (entropy.length % 4 !== 0) {\n throw new TypeError(INVALID_ENTROPY);\n }\n const entropyBits = bytesToBinary(Array.from(entropy));\n const checksumBits = deriveChecksumBits(entropy);\n const bits = entropyBits + checksumBits;\n const chunks = bits.match(/(.{1,11})/g);\n const words = chunks.map((binary) => {\n const index = binaryToByte(binary);\n return wordlist[index];\n });\n return wordlist[0] === '\\u3042\\u3044\\u3053\\u304f\\u3057\\u3093' // Japanese wordlist\n ? words.join('\\u3000')\n : words.join(' ');\n}\nexports.entropyToMnemonic = entropyToMnemonic;\nfunction generateMnemonic(strength, rng, wordlist) {\n strength = strength || 128;\n if (strength % 32 !== 0) {\n throw new TypeError(INVALID_ENTROPY);\n }\n rng = rng || ((size) => Buffer.from(utils_1.randomBytes(size)));\n return entropyToMnemonic(rng(strength / 8), wordlist);\n}\nexports.generateMnemonic = generateMnemonic;\nfunction validateMnemonic(mnemonic, wordlist) {\n try {\n mnemonicToEntropy(mnemonic, wordlist);\n }\n catch (e) {\n return false;\n }\n return true;\n}\nexports.validateMnemonic = validateMnemonic;\nfunction setDefaultWordlist(language) {\n const result = _wordlists_1.wordlists[language];\n if (result) {\n DEFAULT_WORDLIST = result;\n }\n else {\n throw new Error('Could not find wordlist for language \"' + language + '\"');\n }\n}\nexports.setDefaultWordlist = setDefaultWordlist;\nfunction getDefaultWordlist() {\n if (!DEFAULT_WORDLIST) {\n throw new Error('No Default Wordlist set');\n }\n return Object.keys(_wordlists_1.wordlists).filter((lang) => {\n if (lang === 'JA' || lang === 'EN') {\n return false;\n }\n return _wordlists_1.wordlists[lang].every((word, index) => word === DEFAULT_WORDLIST[index]);\n })[0];\n}\nexports.getDefaultWordlist = getDefaultWordlist;\nvar _wordlists_2 = require(\"./_wordlists\");\nexports.wordlists = _wordlists_2.wordlists;\n","/**\n * Recovery Phrase Service - BIP39 Mnemonic Generation\n * \n * Handles generation and restoration of recovery phrases (mnemonic seeds)\n * for backing up and restoring user identities.\n * \n * Note: This module requires the polyfill to be loaded first (done via crypto/index.ts)\n */\n\nimport * as bip39 from 'bip39';\nimport { KeyManager } from './keyManager';\n\n/**\n * Convert Uint8Array or array-like to hexadecimal string\n * Works in both Node.js and React Native without depending on Buffer\n */\nfunction toHex(data: Uint8Array | ArrayLike<number>): string {\n // Convert to array of numbers if needed\n const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nexport interface RecoveryPhraseResult {\n phrase: string;\n words: string[];\n publicKey: string;\n}\n\nexport class RecoveryPhraseService {\n /**\n * Generate a new identity with a recovery phrase\n * Returns the mnemonic phrase (should only be shown once to the user)\n */\n static async generateIdentityWithRecovery(): Promise<RecoveryPhraseResult> {\n // Generate 128-bit entropy for 12-word mnemonic\n const mnemonic = bip39.generateMnemonic(128);\n \n // Derive private key from mnemonic\n // Using the seed directly as the private key (simplified approach)\n const seed = await bip39.mnemonicToSeed(mnemonic);\n \n // Use first 32 bytes of seed as private key\n const seedSlice = seed.subarray ? seed.subarray(0, 32) : seed.slice(0, 32);\n const privateKeyHex = toHex(seedSlice);\n \n // Import the derived key pair\n const publicKey = await KeyManager.importKeyPair(privateKeyHex);\n\n return {\n phrase: mnemonic,\n words: mnemonic.split(' '),\n publicKey,\n };\n }\n\n /**\n * Generate a 24-word recovery phrase for higher security\n */\n static async generateIdentityWithRecovery24(): Promise<RecoveryPhraseResult> {\n // Generate 256-bit entropy for 24-word mnemonic\n const mnemonic = bip39.generateMnemonic(256);\n \n const seed = await bip39.mnemonicToSeed(mnemonic);\n const seedSlice = seed.subarray ? seed.subarray(0, 32) : seed.slice(0, 32);\n const privateKeyHex = toHex(seedSlice);\n const publicKey = await KeyManager.importKeyPair(privateKeyHex);\n\n return {\n phrase: mnemonic,\n words: mnemonic.split(' '),\n publicKey,\n };\n }\n\n /**\n * Restore an identity from a recovery phrase\n */\n static async restoreFromPhrase(phrase: string): Promise<string> {\n // Normalize and validate the phrase\n const normalizedPhrase = phrase.trim().toLowerCase();\n \n if (!bip39.validateMnemonic(normalizedPhrase)) {\n throw new Error('Invalid recovery phrase. Please check the words and try again.');\n }\n\n // Derive the same private key from the mnemonic\n const seed = await bip39.mnemonicToSeed(normalizedPhrase);\n const seedSlice = seed.subarray ? seed.subarray(0, 32) : seed.slice(0, 32);\n const privateKeyHex = toHex(seedSlice);\n \n // Import and store the key pair\n const publicKey = await KeyManager.importKeyPair(privateKeyHex);\n\n return publicKey;\n }\n\n /**\n * Validate a recovery phrase without importing it\n */\n static validatePhrase(phrase: string): boolean {\n const normalizedPhrase = phrase.trim().toLowerCase();\n return bip39.validateMnemonic(normalizedPhrase);\n }\n\n /**\n * Get the word list for autocomplete/validation\n */\n static getWordList(): string[] {\n return bip39.wordlists.english;\n }\n\n /**\n * Check if a word is valid in the BIP39 word list\n */\n static isValidWord(word: string): boolean {\n return bip39.wordlists.english.includes(word.toLowerCase());\n }\n\n /**\n * Get suggestions for a partial word\n */\n static getSuggestions(partial: string, limit: number = 5): string[] {\n const lowerPartial = partial.toLowerCase();\n return bip39.wordlists.english\n .filter((word: string) => word.startsWith(lowerPartial))\n .slice(0, limit);\n }\n\n /**\n * Derive the public key from a phrase without storing\n * Useful for verification before importing\n */\n static async derivePublicKeyFromPhrase(phrase: string): Promise<string> {\n const normalizedPhrase = phrase.trim().toLowerCase();\n \n if (!bip39.validateMnemonic(normalizedPhrase)) {\n throw new Error('Invalid recovery phrase');\n }\n\n const seed = await bip39.mnemonicToSeed(normalizedPhrase);\n const seedSlice = seed.subarray ? seed.subarray(0, 32) : seed.slice(0, 32);\n const privateKeyHex = toHex(seedSlice);\n \n return KeyManager.derivePublicKey(privateKeyHex);\n }\n\n /**\n * Convert a phrase to its word array\n */\n static phraseToWords(phrase: string): string[] {\n return phrase.trim().toLowerCase().split(/\\s+/);\n }\n\n /**\n * Convert a word array to a phrase string\n */\n static wordsToPhrase(words: string[]): string {\n return words.map(w => w.toLowerCase().trim()).join(' ');\n }\n}\n\nexport default RecoveryPhraseService;\n\n\n","/**\n * Sonner Toast - Web Implementation\n *\n * This file is resolved by web bundlers (Vite, Webpack, etc.)\n * Only imports 'sonner' (web version), not 'sonner-native'\n */\nimport * as WebSonner from 'sonner';\n\n// Define proper types for the toast components\ninterface ToastFunction {\n (message: string, options?: Record<string, unknown>): void;\n success: (message: string, options?: Record<string, unknown>) => void;\n error: (message: string, options?: Record<string, unknown>) => void;\n info: (message: string, options?: Record<string, unknown>) => void;\n warning: (message: string, options?: Record<string, unknown>) => void;\n loading: (message: string, options?: Record<string, unknown>) => void;\n}\n\ntype ToasterComponent = (props?: Record<string, unknown>) => React.ReactElement | null;\n\nconst { toast: webToast, Toaster: WebToaster } = WebSonner as {\n toast: ToastFunction;\n Toaster: ToasterComponent;\n};\n\nexport const toast = webToast;\nexport const Toaster = WebToaster;\nexport type ToastT = typeof webToast;\n","import { create } from 'zustand';\nimport type { User } from '../../models/interfaces';\nimport { createDebugLogger } from '../../shared/utils/debugUtils';\n\nconst debug = createDebugLogger('AuthStore');\n\nexport interface AuthState {\n user: User | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n lastUserFetch: number | null; // Timestamp of last user fetch for caching\n \n loginSuccess: (user: User) => void;\n loginFailure: (error: string) => void;\n logout: () => void;\n fetchUser: (oxyServices: { getCurrentUser: () => Promise<User> }, forceRefresh?: boolean) => Promise<void>;\n setUser: (user: User) => void; // Direct user setter for caching\n}\n\nexport const useAuthStore = create<AuthState>((set: (state: Partial<AuthState>) => void, get: () => AuthState) => ({\n user: null,\n isAuthenticated: false,\n isLoading: false,\n error: null,\n lastUserFetch: null,\n \n loginSuccess: (user: User) => set({ \n isLoading: false, \n isAuthenticated: true, \n user, \n lastUserFetch: Date.now(),\n }),\n loginFailure: (error: string) => set({ isLoading: false, error }),\n logout: () => set({ \n user: null, \n isAuthenticated: false, \n lastUserFetch: null,\n }),\n setUser: (user: User) => set({ user, lastUserFetch: Date.now() }),\n fetchUser: async (oxyServices, forceRefresh = false) => {\n const state = get();\n const now = Date.now();\n const cacheAge = state.lastUserFetch ? now - state.lastUserFetch : Number.POSITIVE_INFINITY;\n const cacheValid = cacheAge < 5 * 60 * 1000; // 5 minutes cache\n\n // Use cached data if available and not forcing refresh\n if (!forceRefresh && state.user && cacheValid) {\n debug.log('Using cached user data (age:', cacheAge, 'ms)');\n return;\n }\n\n set({ isLoading: true, error: null });\n try {\n const user = await oxyServices.getCurrentUser();\n set({ user, isLoading: false, isAuthenticated: true, lastUserFetch: now });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to fetch user';\n debug.error('Error fetching user:', error);\n set({ error: errorMessage, isLoading: false });\n }\n },\n})); ","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach((key) => {\n PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n if (withNativeBlob && data instanceof Blob) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(data, callback);\n }\n }\n else if (withNativeArrayBuffer &&\n (data instanceof ArrayBuffer || isView(data))) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(new Blob([data]), callback);\n }\n }\n // plain string\n return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n const fileReader = new FileReader();\n fileReader.onload = function () {\n const content = fileReader.result.split(\",\")[1];\n callback(\"b\" + (content || \"\"));\n };\n return fileReader.readAsDataURL(data);\n};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data.arrayBuffer().then(toArray).then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, (encoded) => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\n","// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nexport const decode = (base64) => {\n let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE, } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const decodePacket = (encodedPacket, binaryType) => {\n if (typeof encodedPacket !== \"string\") {\n return {\n type: \"message\",\n data: mapBinary(encodedPacket, binaryType),\n };\n }\n const type = encodedPacket.charAt(0);\n if (type === \"b\") {\n return {\n type: \"message\",\n data: decodeBase64Packet(encodedPacket.substring(1), binaryType),\n };\n }\n const packetType = PACKET_TYPES_REVERSE[type];\n if (!packetType) {\n return ERROR_PACKET;\n }\n return encodedPacket.length > 1\n ? {\n type: PACKET_TYPES_REVERSE[type],\n data: encodedPacket.substring(1),\n }\n : {\n type: PACKET_TYPES_REVERSE[type],\n };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n if (withNativeArrayBuffer) {\n const decoded = decode(data);\n return mapBinary(decoded, binaryType);\n }\n else {\n return { base64: true, data }; // fallback for old browsers\n }\n};\nconst mapBinary = (data, binaryType) => {\n switch (binaryType) {\n case \"blob\":\n if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET, } from \"./commons.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n // some packets may be added to the array while encoding, so the initial length must be saved\n const length = packets.length;\n const encodedPackets = new Array(length);\n let count = 0;\n packets.forEach((packet, i) => {\n // force base64 encoding for binary packets\n encodePacket(packet, false, (encodedPacket) => {\n encodedPackets[i] = encodedPacket;\n if (++count === length) {\n callback(encodedPackets.join(SEPARATOR));\n }\n });\n });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n const encodedPackets = encodedPayload.split(SEPARATOR);\n const packets = [];\n for (let i = 0; i < encodedPackets.length; i++) {\n const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n packets.push(decodedPacket);\n if (decodedPacket.type === \"error\") {\n break;\n }\n }\n return packets;\n};\nexport function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, (encodedPacket) => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n },\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* State.READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* State.READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* State.READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* State.READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* State.READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* State.READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* State.READ_PAYLOAD */;\n }\n else if (state === 2 /* State.READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* State.READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* State.READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n },\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload, };\n","/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n // Remove event specific arrays for event types that no\n // one is subscribed for to avoid memory leak.\n if (callbacks.length === 0) {\n delete this._callbacks['$' + event];\n }\n\n return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n\n var args = new Array(arguments.length - 1)\n , callbacks = this._callbacks['$' + event];\n\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n","export const nextTick = (() => {\n const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n if (isPromiseAvailable) {\n return (cb) => Promise.resolve().then(cb);\n }\n else {\n return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n }\n})();\nexport const globalThisShim = (() => {\n if (typeof self !== \"undefined\") {\n return self;\n }\n else if (typeof window !== \"undefined\") {\n return window;\n }\n else {\n return Function(\"return this\")();\n }\n})();\nexport const defaultBinaryType = \"arraybuffer\";\nexport function createCookieJar() { }\n","import { globalThisShim as globalThis } from \"./globals.node.js\";\nexport function pick(obj, ...attr) {\n return attr.reduce((acc, k) => {\n if (obj.hasOwnProperty(k)) {\n acc[k] = obj[k];\n }\n return acc;\n }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n if (opts.useNativeTimers) {\n obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n }\n else {\n obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n if (typeof obj === \"string\") {\n return utf8Length(obj);\n }\n // arraybuffer or blob\n return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n let c = 0, length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n}\n/**\n * Generates a random 8-characters string.\n */\nexport function randomString() {\n return (Date.now().toString(36).substring(3) +\n Math.random().toString(36).substring(2, 5));\n}\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.js\";\nexport class TransportError extends Error {\n constructor(reason, description, context) {\n super(reason);\n this.description = description;\n this.context = context;\n this.type = \"TransportError\";\n }\n}\nexport class Transport extends Emitter {\n /**\n * Transport abstract constructor.\n *\n * @param {Object} opts - options\n * @protected\n */\n constructor(opts) {\n super();\n this.writable = false;\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.query = opts.query;\n this.socket = opts.socket;\n this.supportsBinary = !opts.forceBase64;\n }\n /**\n * Emits an error.\n *\n * @param {String} reason\n * @param description\n * @param context - the error context\n * @return {Transport} for chaining\n * @protected\n */\n onError(reason, description, context) {\n super.emitReserved(\"error\", new TransportError(reason, description, context));\n return this;\n }\n /**\n * Opens the transport.\n */\n open() {\n this.readyState = \"opening\";\n this.doOpen();\n return this;\n }\n /**\n * Closes the transport.\n */\n close() {\n if (this.readyState === \"opening\" || this.readyState === \"open\") {\n this.doClose();\n this.onClose();\n }\n return this;\n }\n /**\n * Sends multiple packets.\n *\n * @param {Array} packets\n */\n send(packets) {\n if (this.readyState === \"open\") {\n this.write(packets);\n }\n else {\n // this might happen if the transport was silently closed in the beforeunload event handler\n }\n }\n /**\n * Called upon open\n *\n * @protected\n */\n onOpen() {\n this.readyState = \"open\";\n this.writable = true;\n super.emitReserved(\"open\");\n }\n /**\n * Called with data.\n *\n * @param {String} data\n * @protected\n */\n onData(data) {\n const packet = decodePacket(data, this.socket.binaryType);\n this.onPacket(packet);\n }\n /**\n * Called with a decoded packet.\n *\n * @protected\n */\n onPacket(packet) {\n super.emitReserved(\"packet\", packet);\n }\n /**\n * Called upon close.\n *\n * @protected\n */\n onClose(details) {\n this.readyState = \"closed\";\n super.emitReserved(\"close\", details);\n }\n /**\n * Pauses the transport, in order not to lose packets during an upgrade.\n *\n * @param onPause\n */\n pause(onPause) { }\n createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port) !== 443) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\n}\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n let str = '';\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n if (str.length)\n str += '&';\n str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n }\n }\n return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n let qry = {};\n let pairs = qs.split('&');\n for (let i = 0, l = pairs.length; i < l; i++) {\n let pair = pairs[i].split('=');\n qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n return qry;\n}\n","import { Transport } from \"../transport.js\";\nimport { randomString } from \"../util.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nexport class Polling extends Transport {\n constructor() {\n super(...arguments);\n this._polling = false;\n }\n get name() {\n return \"polling\";\n }\n /**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @protected\n */\n doOpen() {\n this._poll();\n }\n /**\n * Pauses polling.\n *\n * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n * @package\n */\n pause(onPause) {\n this.readyState = \"pausing\";\n const pause = () => {\n this.readyState = \"paused\";\n onPause();\n };\n if (this._polling || !this.writable) {\n let total = 0;\n if (this._polling) {\n total++;\n this.once(\"pollComplete\", function () {\n --total || pause();\n });\n }\n if (!this.writable) {\n total++;\n this.once(\"drain\", function () {\n --total || pause();\n });\n }\n }\n else {\n pause();\n }\n }\n /**\n * Starts polling cycle.\n *\n * @private\n */\n _poll() {\n this._polling = true;\n this.doPoll();\n this.emitReserved(\"poll\");\n }\n /**\n * Overloads onData to detect payloads.\n *\n * @protected\n */\n onData(data) {\n const callback = (packet) => {\n // if its the first message we consider the transport open\n if (\"opening\" === this.readyState && packet.type === \"open\") {\n this.onOpen();\n }\n // if its a close packet, we close the ongoing requests\n if (\"close\" === packet.type) {\n this.onClose({ description: \"transport closed by the server\" });\n return false;\n }\n // otherwise bypass onData and handle the message\n this.onPacket(packet);\n };\n // decode payload\n decodePayload(data, this.socket.binaryType).forEach(callback);\n // if an event did not trigger closing\n if (\"closed\" !== this.readyState) {\n // if we got data we're not polling\n this._polling = false;\n this.emitReserved(\"pollComplete\");\n if (\"open\" === this.readyState) {\n this._poll();\n }\n else {\n }\n }\n }\n /**\n * For polling, send a close packet.\n *\n * @protected\n */\n doClose() {\n const close = () => {\n this.write([{ type: \"close\" }]);\n };\n if (\"open\" === this.readyState) {\n close();\n }\n else {\n // in case we're trying to close while\n // handshaking is in progress (GH-164)\n this.once(\"open\", close);\n }\n }\n /**\n * Writes a packets payload.\n *\n * @param {Array} packets - data packets\n * @protected\n */\n write(packets) {\n this.writable = false;\n encodePayload(packets, (data) => {\n this.doWrite(data, () => {\n this.writable = true;\n this.emitReserved(\"drain\");\n });\n });\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\n // cache busting is forced\n if (false !== this.opts.timestampRequests) {\n query[this.opts.timestampParam] = randomString();\n }\n if (!this.supportsBinary && !query.sid) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n}\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n value = typeof XMLHttpRequest !== 'undefined' &&\n 'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n // if XMLHttp support is disabled in IE then it will throw\n // when trying to create\n}\nexport const hasCORS = value;\n","import { Polling } from \"./polling.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globals.node.js\";\nimport { hasCORS } from \"../contrib/has-cors.js\";\nfunction empty() { }\nexport class BaseXHR extends Polling {\n /**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @package\n */\n constructor(opts) {\n super(opts);\n if (typeof location !== \"undefined\") {\n const isSSL = \"https:\" === location.protocol;\n let port = location.port;\n // some user agents have empty `location.port`\n if (!port) {\n port = isSSL ? \"443\" : \"80\";\n }\n this.xd =\n (typeof location !== \"undefined\" &&\n opts.hostname !== location.hostname) ||\n port !== opts.port;\n }\n }\n /**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @private\n */\n doWrite(data, fn) {\n const req = this.request({\n method: \"POST\",\n data: data,\n });\n req.on(\"success\", fn);\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr post error\", xhrStatus, context);\n });\n }\n /**\n * Starts a poll cycle.\n *\n * @private\n */\n doPoll() {\n const req = this.request();\n req.on(\"data\", this.onData.bind(this));\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr poll error\", xhrStatus, context);\n });\n this.pollXhr = req;\n }\n}\nexport class Request extends Emitter {\n /**\n * Request constructor\n *\n * @param {Object} options\n * @package\n */\n constructor(createRequest, uri, opts) {\n super();\n this.createRequest = createRequest;\n installTimerFunctions(this, opts);\n this._opts = opts;\n this._method = opts.method || \"GET\";\n this._uri = uri;\n this._data = undefined !== opts.data ? opts.data : null;\n this._create();\n }\n /**\n * Creates the XHR object and sends the request.\n *\n * @private\n */\n _create() {\n var _a;\n const opts = pick(this._opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this._opts.xd;\n const xhr = (this._xhr = this.createRequest(opts));\n try {\n xhr.open(this._method, this._uri, true);\n try {\n if (this._opts.extraHeaders) {\n // @ts-ignore\n xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n for (let i in this._opts.extraHeaders) {\n if (this._opts.extraHeaders.hasOwnProperty(i)) {\n xhr.setRequestHeader(i, this._opts.extraHeaders[i]);\n }\n }\n }\n }\n catch (e) { }\n if (\"POST\" === this._method) {\n try {\n xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n }\n catch (e) { }\n }\n try {\n xhr.setRequestHeader(\"Accept\", \"*/*\");\n }\n catch (e) { }\n (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\n // ie6 check\n if (\"withCredentials\" in xhr) {\n xhr.withCredentials = this._opts.withCredentials;\n }\n if (this._opts.requestTimeout) {\n xhr.timeout = this._opts.requestTimeout;\n }\n xhr.onreadystatechange = () => {\n var _a;\n if (xhr.readyState === 3) {\n (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(\n // @ts-ignore\n xhr.getResponseHeader(\"set-cookie\"));\n }\n if (4 !== xhr.readyState)\n return;\n if (200 === xhr.status || 1223 === xhr.status) {\n this._onLoad();\n }\n else {\n // make sure the `error` event handler that's user-set\n // does not throw in the same tick and gets caught here\n this.setTimeoutFn(() => {\n this._onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n }, 0);\n }\n };\n xhr.send(this._data);\n }\n catch (e) {\n // Need to defer since .create() is called directly from the constructor\n // and thus the 'error' event can only be only bound *after* this exception\n // occurs. Therefore, also, we cannot throw here at all.\n this.setTimeoutFn(() => {\n this._onError(e);\n }, 0);\n return;\n }\n if (typeof document !== \"undefined\") {\n this._index = Request.requestsCount++;\n Request.requests[this._index] = this;\n }\n }\n /**\n * Called upon error.\n *\n * @private\n */\n _onError(err) {\n this.emitReserved(\"error\", err, this._xhr);\n this._cleanup(true);\n }\n /**\n * Cleans up house.\n *\n * @private\n */\n _cleanup(fromError) {\n if (\"undefined\" === typeof this._xhr || null === this._xhr) {\n return;\n }\n this._xhr.onreadystatechange = empty;\n if (fromError) {\n try {\n this._xhr.abort();\n }\n catch (e) { }\n }\n if (typeof document !== \"undefined\") {\n delete Request.requests[this._index];\n }\n this._xhr = null;\n }\n /**\n * Called upon load.\n *\n * @private\n */\n _onLoad() {\n const data = this._xhr.responseText;\n if (data !== null) {\n this.emitReserved(\"data\", data);\n this.emitReserved(\"success\");\n this._cleanup();\n }\n }\n /**\n * Aborts the request.\n *\n * @package\n */\n abort() {\n this._cleanup();\n }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n // @ts-ignore\n if (typeof attachEvent === \"function\") {\n // @ts-ignore\n attachEvent(\"onunload\", unloadHandler);\n }\n else if (typeof addEventListener === \"function\") {\n const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n addEventListener(terminationEvent, unloadHandler, false);\n }\n}\nfunction unloadHandler() {\n for (let i in Request.requests) {\n if (Request.requests.hasOwnProperty(i)) {\n Request.requests[i].abort();\n }\n }\n}\nconst hasXHR2 = (function () {\n const xhr = newRequest({\n xdomain: false,\n });\n return xhr && xhr.responseType !== null;\n})();\n/**\n * HTTP long-polling based on the built-in `XMLHttpRequest` object.\n *\n * Usage: browser\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n */\nexport class XHR extends BaseXHR {\n constructor(opts) {\n super(opts);\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n }\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd }, this.opts);\n return new Request(newRequest, this.uri(), opts);\n }\n}\nfunction newRequest(opts) {\n const xdomain = opts.xdomain;\n // XMLHttpRequest can be disabled on IE\n try {\n if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n return new XMLHttpRequest();\n }\n }\n catch (e) { }\n if (!xdomain) {\n try {\n return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n }\n catch (e) { }\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { pick, randomString } from \"../util.js\";\nimport { encodePacket } from \"engine.io-parser\";\nimport { globalThisShim as globalThis, nextTick } from \"../globals.node.js\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n typeof navigator.product === \"string\" &&\n navigator.product.toLowerCase() === \"reactnative\";\nexport class BaseWS extends Transport {\n get name() {\n return \"websocket\";\n }\n doOpen() {\n const uri = this.uri();\n const protocols = this.opts.protocols;\n // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n const opts = isReactNative\n ? {}\n : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n if (this.opts.extraHeaders) {\n opts.headers = this.opts.extraHeaders;\n }\n try {\n this.ws = this.createSocket(uri, protocols, opts);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this.ws.binaryType = this.socket.binaryType;\n this.addEventListeners();\n }\n /**\n * Adds event listeners to the socket\n *\n * @private\n */\n addEventListeners() {\n this.ws.onopen = () => {\n if (this.opts.autoUnref) {\n this.ws._socket.unref();\n }\n this.onOpen();\n };\n this.ws.onclose = (closeEvent) => this.onClose({\n description: \"websocket connection closed\",\n context: closeEvent,\n });\n this.ws.onmessage = (ev) => this.onData(ev.data);\n this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n }\n write(packets) {\n this.writable = false;\n // encodePacket efficient as it uses WS framing\n // no need for encodePayload\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n encodePacket(packet, this.supportsBinary, (data) => {\n // Sometimes the websocket has already been closed but the browser didn't\n // have a chance of informing us about it yet, in that case send will\n // throw an error\n try {\n this.doWrite(packet, data);\n }\n catch (e) {\n }\n if (lastPacket) {\n // fake drain\n // defer to next tick to allow Socket to clear writeBuffer\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n if (typeof this.ws !== \"undefined\") {\n this.ws.onerror = () => { };\n this.ws.close();\n this.ws = null;\n }\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\n // append timestamp to URI\n if (this.opts.timestampRequests) {\n query[this.opts.timestampParam] = randomString();\n }\n // communicate binary support capabilities\n if (!this.supportsBinary) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n}\nconst WebSocketCtor = globalThis.WebSocket || globalThis.MozWebSocket;\n/**\n * WebSocket transport based on the built-in `WebSocket` object.\n *\n * Usage: browser, Node.js (since v21), Deno, Bun\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @see https://caniuse.com/mdn-api_websocket\n * @see https://nodejs.org/api/globals.html#websocket\n */\nexport class WS extends BaseWS {\n createSocket(uri, protocols, opts) {\n return !isReactNative\n ? protocols\n ? new WebSocketCtor(uri, protocols)\n : new WebSocketCtor(uri)\n : new WebSocketCtor(uri, protocols, opts);\n }\n doWrite(_packet, data) {\n this.ws.send(data);\n }\n}\n","import { XHR } from \"./polling-xhr.node.js\";\nimport { WS } from \"./websocket.node.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: XHR,\n};\n","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"../globals.node.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\n/**\n * WebTransport transport based on the built-in `WebTransport` object.\n *\n * Usage: browser, Node.js (with the `@fails-components/webtransport` package)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport\n * @see https://caniuse.com/webtransport\n */\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n try {\n // @ts-ignore\n this._transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this._transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this._transport.ready.then(() => {\n this._transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this._writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this._writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this._writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this._transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n if (str.length > 8000) {\n throw \"URI too long\";\n }\n const src = str, b = str.indexOf('['), e = str.indexOf(']');\n if (b != -1 && e != -1) {\n str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n }\n let m = re.exec(str || ''), uri = {}, i = 14;\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n if (b != -1 && e != -1) {\n uri.source = src;\n uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n uri.ipv6uri = true;\n }\n uri.pathNames = pathNames(uri, uri['path']);\n uri.queryKey = queryKey(uri, uri['query']);\n return uri;\n}\nfunction pathNames(obj, path) {\n const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n if (path.slice(0, 1) == '/' || path.length === 0) {\n names.splice(0, 1);\n }\n if (path.slice(-1) == '/') {\n names.splice(names.length - 1, 1);\n }\n return names;\n}\nfunction queryKey(uri, query) {\n const data = {};\n query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n if ($1) {\n data[$1] = $2;\n }\n });\n return data;\n}\n","import { transports as DEFAULT_TRANSPORTS } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nimport { createCookieJar, defaultBinaryType, nextTick, } from \"./globals.node.js\";\nconst withEventListeners = typeof addEventListener === \"function\" &&\n typeof removeEventListener === \"function\";\nconst OFFLINE_EVENT_LISTENERS = [];\nif (withEventListeners) {\n // within a ServiceWorker, any event handler for the 'offline' event must be added on the initial evaluation of the\n // script, so we create one single event listener here which will forward the event to the socket instances\n addEventListener(\"offline\", () => {\n OFFLINE_EVENT_LISTENERS.forEach((listener) => listener());\n }, false);\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that\n * successfully establishes the connection.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithoutUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithoutUpgrade({\n * transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithUpgrade\n * @see Socket\n */\nexport class SocketWithoutUpgrade extends Emitter {\n /**\n * Socket constructor.\n *\n * @param {String|Object} uri - uri or options\n * @param {Object} opts - options\n */\n constructor(uri, opts) {\n super();\n this.binaryType = defaultBinaryType;\n this.writeBuffer = [];\n this._prevBufferLen = 0;\n this._pingInterval = -1;\n this._pingTimeout = -1;\n this._maxPayload = -1;\n /**\n * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the\n * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.\n */\n this._pingTimeoutTime = Infinity;\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = null;\n }\n if (uri) {\n const parsedUri = parse(uri);\n opts.hostname = parsedUri.host;\n opts.secure =\n parsedUri.protocol === \"https\" || parsedUri.protocol === \"wss\";\n opts.port = parsedUri.port;\n if (parsedUri.query)\n opts.query = parsedUri.query;\n }\n else if (opts.host) {\n opts.hostname = parse(opts.host).host;\n }\n installTimerFunctions(this, opts);\n this.secure =\n null != opts.secure\n ? opts.secure\n : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n if (opts.hostname && !opts.port) {\n // if no port is specified manually, use the protocol default\n opts.port = this.secure ? \"443\" : \"80\";\n }\n this.hostname =\n opts.hostname ||\n (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n this.port =\n opts.port ||\n (typeof location !== \"undefined\" && location.port\n ? location.port\n : this.secure\n ? \"443\"\n : \"80\");\n this.transports = [];\n this._transportsByName = {};\n opts.transports.forEach((t) => {\n const transportName = t.prototype.name;\n this.transports.push(transportName);\n this._transportsByName[transportName] = t;\n });\n this.opts = Object.assign({\n path: \"/engine.io\",\n agent: false,\n withCredentials: false,\n upgrade: true,\n timestampParam: \"t\",\n rememberUpgrade: false,\n addTrailingSlash: true,\n rejectUnauthorized: true,\n perMessageDeflate: {\n threshold: 1024,\n },\n transportOptions: {},\n closeOnBeforeunload: false,\n }, opts);\n this.opts.path =\n this.opts.path.replace(/\\/$/, \"\") +\n (this.opts.addTrailingSlash ? \"/\" : \"\");\n if (typeof this.opts.query === \"string\") {\n this.opts.query = decode(this.opts.query);\n }\n if (withEventListeners) {\n if (this.opts.closeOnBeforeunload) {\n // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n // closed/reloaded)\n this._beforeunloadEventListener = () => {\n if (this.transport) {\n // silently close the transport\n this.transport.removeAllListeners();\n this.transport.close();\n }\n };\n addEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n }\n if (this.hostname !== \"localhost\") {\n this._offlineEventListener = () => {\n this._onClose(\"transport close\", {\n description: \"network connection lost\",\n });\n };\n OFFLINE_EVENT_LISTENERS.push(this._offlineEventListener);\n }\n }\n if (this.opts.withCredentials) {\n this._cookieJar = createCookieJar();\n }\n this._open();\n }\n /**\n * Creates transport of the given type.\n *\n * @param {String} name - transport name\n * @return {Transport}\n * @private\n */\n createTransport(name) {\n const query = Object.assign({}, this.opts.query);\n // append engine.io protocol identifier\n query.EIO = protocol;\n // transport name\n query.transport = name;\n // session id if we already have one\n if (this.id)\n query.sid = this.id;\n const opts = Object.assign({}, this.opts, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\n return new this._transportsByName[name](opts);\n }\n /**\n * Initializes transport to use and starts probe.\n *\n * @private\n */\n _open() {\n if (this.transports.length === 0) {\n // Emit error on next tick so it can be listened to\n this.setTimeoutFn(() => {\n this.emitReserved(\"error\", \"No transports available\");\n }, 0);\n return;\n }\n const transportName = this.opts.rememberUpgrade &&\n SocketWithoutUpgrade.priorWebsocketSuccess &&\n this.transports.indexOf(\"websocket\") !== -1\n ? \"websocket\"\n : this.transports[0];\n this.readyState = \"opening\";\n const transport = this.createTransport(transportName);\n transport.open();\n this.setTransport(transport);\n }\n /**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @private\n */\n setTransport(transport) {\n if (this.transport) {\n this.transport.removeAllListeners();\n }\n // set up transport\n this.transport = transport;\n // set up transport listeners\n transport\n .on(\"drain\", this._onDrain.bind(this))\n .on(\"packet\", this._onPacket.bind(this))\n .on(\"error\", this._onError.bind(this))\n .on(\"close\", (reason) => this._onClose(\"transport close\", reason));\n }\n /**\n * Called when connection is deemed open.\n *\n * @private\n */\n onOpen() {\n this.readyState = \"open\";\n SocketWithoutUpgrade.priorWebsocketSuccess =\n \"websocket\" === this.transport.name;\n this.emitReserved(\"open\");\n this.flush();\n }\n /**\n * Handles a packet.\n *\n * @private\n */\n _onPacket(packet) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n this.emitReserved(\"packet\", packet);\n // Socket is live - any packet counts\n this.emitReserved(\"heartbeat\");\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\n this._sendPacket(\"pong\");\n this.emitReserved(\"ping\");\n this.emitReserved(\"pong\");\n this._resetPingTimeout();\n break;\n case \"error\":\n const err = new Error(\"server error\");\n // @ts-ignore\n err.code = packet.data;\n this._onError(err);\n break;\n case \"message\":\n this.emitReserved(\"data\", packet.data);\n this.emitReserved(\"message\", packet.data);\n break;\n }\n }\n else {\n }\n }\n /**\n * Called upon handshake completion.\n *\n * @param {Object} data - handshake obj\n * @private\n */\n onHandshake(data) {\n this.emitReserved(\"handshake\", data);\n this.id = data.sid;\n this.transport.query.sid = data.sid;\n this._pingInterval = data.pingInterval;\n this._pingTimeout = data.pingTimeout;\n this._maxPayload = data.maxPayload;\n this.onOpen();\n // In case open handler closes socket\n if (\"closed\" === this.readyState)\n return;\n this._resetPingTimeout();\n }\n /**\n * Sets and resets ping timeout timer based on server pings.\n *\n * @private\n */\n _resetPingTimeout() {\n this.clearTimeoutFn(this._pingTimeoutTimer);\n const delay = this._pingInterval + this._pingTimeout;\n this._pingTimeoutTime = Date.now() + delay;\n this._pingTimeoutTimer = this.setTimeoutFn(() => {\n this._onClose(\"ping timeout\");\n }, delay);\n if (this.opts.autoUnref) {\n this._pingTimeoutTimer.unref();\n }\n }\n /**\n * Called on `drain` event\n *\n * @private\n */\n _onDrain() {\n this.writeBuffer.splice(0, this._prevBufferLen);\n // setting prevBufferLen = 0 is very important\n // for example, when upgrading, upgrade packet is sent over,\n // and a nonzero prevBufferLen could cause problems on `drain`\n this._prevBufferLen = 0;\n if (0 === this.writeBuffer.length) {\n this.emitReserved(\"drain\");\n }\n else {\n this.flush();\n }\n }\n /**\n * Flush write buffers.\n *\n * @private\n */\n flush() {\n if (\"closed\" !== this.readyState &&\n this.transport.writable &&\n !this.upgrading &&\n this.writeBuffer.length) {\n const packets = this._getWritablePackets();\n this.transport.send(packets);\n // keep track of current length of writeBuffer\n // splice writeBuffer and callbackBuffer on `drain`\n this._prevBufferLen = packets.length;\n this.emitReserved(\"flush\");\n }\n }\n /**\n * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n * long-polling)\n *\n * @private\n */\n _getWritablePackets() {\n const shouldCheckPayloadSize = this._maxPayload &&\n this.transport.name === \"polling\" &&\n this.writeBuffer.length > 1;\n if (!shouldCheckPayloadSize) {\n return this.writeBuffer;\n }\n let payloadSize = 1; // first packet type\n for (let i = 0; i < this.writeBuffer.length; i++) {\n const data = this.writeBuffer[i].data;\n if (data) {\n payloadSize += byteLength(data);\n }\n if (i > 0 && payloadSize > this._maxPayload) {\n return this.writeBuffer.slice(0, i);\n }\n payloadSize += 2; // separator + packet type\n }\n return this.writeBuffer;\n }\n /**\n * Checks whether the heartbeat timer has expired but the socket has not yet been notified.\n *\n * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the\n * `write()` method then the message would not be buffered by the Socket.IO client.\n *\n * @return {boolean}\n * @private\n */\n /* private */ _hasPingExpired() {\n if (!this._pingTimeoutTime)\n return true;\n const hasExpired = Date.now() > this._pingTimeoutTime;\n if (hasExpired) {\n this._pingTimeoutTime = 0;\n nextTick(() => {\n this._onClose(\"ping timeout\");\n }, this.setTimeoutFn);\n }\n return hasExpired;\n }\n /**\n * Sends a message.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @return {Socket} for chaining.\n */\n write(msg, options, fn) {\n this._sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a message. Alias of {@link Socket#write}.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @return {Socket} for chaining.\n */\n send(msg, options, fn) {\n this._sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a packet.\n *\n * @param {String} type: packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @private\n */\n _sendPacket(type, data, options, fn) {\n if (\"function\" === typeof data) {\n fn = data;\n data = undefined;\n }\n if (\"function\" === typeof options) {\n fn = options;\n options = null;\n }\n if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n return;\n }\n options = options || {};\n options.compress = false !== options.compress;\n const packet = {\n type: type,\n data: data,\n options: options,\n };\n this.emitReserved(\"packetCreate\", packet);\n this.writeBuffer.push(packet);\n if (fn)\n this.once(\"flush\", fn);\n this.flush();\n }\n /**\n * Closes the connection.\n */\n close() {\n const close = () => {\n this._onClose(\"forced close\");\n this.transport.close();\n };\n const cleanupAndClose = () => {\n this.off(\"upgrade\", cleanupAndClose);\n this.off(\"upgradeError\", cleanupAndClose);\n close();\n };\n const waitForUpgrade = () => {\n // wait for upgrade to finish since we can't send packets while pausing a transport\n this.once(\"upgrade\", cleanupAndClose);\n this.once(\"upgradeError\", cleanupAndClose);\n };\n if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n this.readyState = \"closing\";\n if (this.writeBuffer.length) {\n this.once(\"drain\", () => {\n if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n });\n }\n else if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n }\n return this;\n }\n /**\n * Called upon transport error\n *\n * @private\n */\n _onError(err) {\n SocketWithoutUpgrade.priorWebsocketSuccess = false;\n if (this.opts.tryAllTransports &&\n this.transports.length > 1 &&\n this.readyState === \"opening\") {\n this.transports.shift();\n return this._open();\n }\n this.emitReserved(\"error\", err);\n this._onClose(\"transport error\", err);\n }\n /**\n * Called upon transport close.\n *\n * @private\n */\n _onClose(reason, description) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n // clear timers\n this.clearTimeoutFn(this._pingTimeoutTimer);\n // stop event from firing again for transport\n this.transport.removeAllListeners(\"close\");\n // ensure transport won't stay open\n this.transport.close();\n // ignore further transport communication\n this.transport.removeAllListeners();\n if (withEventListeners) {\n if (this._beforeunloadEventListener) {\n removeEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n }\n if (this._offlineEventListener) {\n const i = OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);\n if (i !== -1) {\n OFFLINE_EVENT_LISTENERS.splice(i, 1);\n }\n }\n }\n // set ready state\n this.readyState = \"closed\";\n // clear session id\n this.id = null;\n // emit close event\n this.emitReserved(\"close\", reason, description);\n // clean buffers after, so users can still\n // grab the buffers on `close` event\n this.writeBuffer = [];\n this._prevBufferLen = 0;\n }\n }\n}\nSocketWithoutUpgrade.protocol = protocol;\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithUpgrade({\n * transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see Socket\n */\nexport class SocketWithUpgrade extends SocketWithoutUpgrade {\n constructor() {\n super(...arguments);\n this._upgrades = [];\n }\n onOpen() {\n super.onOpen();\n if (\"open\" === this.readyState && this.opts.upgrade) {\n for (let i = 0; i < this._upgrades.length; i++) {\n this._probe(this._upgrades[i]);\n }\n }\n }\n /**\n * Probes a transport.\n *\n * @param {String} name - transport name\n * @private\n */\n _probe(name) {\n let transport = this.createTransport(name);\n let failed = false;\n SocketWithoutUpgrade.priorWebsocketSuccess = false;\n const onTransportOpen = () => {\n if (failed)\n return;\n transport.send([{ type: \"ping\", data: \"probe\" }]);\n transport.once(\"packet\", (msg) => {\n if (failed)\n return;\n if (\"pong\" === msg.type && \"probe\" === msg.data) {\n this.upgrading = true;\n this.emitReserved(\"upgrading\", transport);\n if (!transport)\n return;\n SocketWithoutUpgrade.priorWebsocketSuccess =\n \"websocket\" === transport.name;\n this.transport.pause(() => {\n if (failed)\n return;\n if (\"closed\" === this.readyState)\n return;\n cleanup();\n this.setTransport(transport);\n transport.send([{ type: \"upgrade\" }]);\n this.emitReserved(\"upgrade\", transport);\n transport = null;\n this.upgrading = false;\n this.flush();\n });\n }\n else {\n const err = new Error(\"probe error\");\n // @ts-ignore\n err.transport = transport.name;\n this.emitReserved(\"upgradeError\", err);\n }\n });\n };\n function freezeTransport() {\n if (failed)\n return;\n // Any callback called by transport should be ignored since now\n failed = true;\n cleanup();\n transport.close();\n transport = null;\n }\n // Handle any error that happens while probing\n const onerror = (err) => {\n const error = new Error(\"probe error: \" + err);\n // @ts-ignore\n error.transport = transport.name;\n freezeTransport();\n this.emitReserved(\"upgradeError\", error);\n };\n function onTransportClose() {\n onerror(\"transport closed\");\n }\n // When the socket is closed while we're probing\n function onclose() {\n onerror(\"socket closed\");\n }\n // When the socket is upgraded while we're probing\n function onupgrade(to) {\n if (transport && to.name !== transport.name) {\n freezeTransport();\n }\n }\n // Remove all listeners on the transport and on self\n const cleanup = () => {\n transport.removeListener(\"open\", onTransportOpen);\n transport.removeListener(\"error\", onerror);\n transport.removeListener(\"close\", onTransportClose);\n this.off(\"close\", onclose);\n this.off(\"upgrading\", onupgrade);\n };\n transport.once(\"open\", onTransportOpen);\n transport.once(\"error\", onerror);\n transport.once(\"close\", onTransportClose);\n this.once(\"close\", onclose);\n this.once(\"upgrading\", onupgrade);\n if (this._upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\n }\n onHandshake(data) {\n this._upgrades = this._filterUpgrades(data.upgrades);\n super.onHandshake(data);\n }\n /**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} upgrades - server upgrades\n * @private\n */\n _filterUpgrades(upgrades) {\n const filteredUpgrades = [];\n for (let i = 0; i < upgrades.length; i++) {\n if (~this.transports.indexOf(upgrades[i]))\n filteredUpgrades.push(upgrades[i]);\n }\n return filteredUpgrades;\n }\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * @example\n * import { Socket } from \"engine.io-client\";\n *\n * const socket = new Socket();\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see SocketWithUpgrade\n */\nexport class Socket extends SocketWithUpgrade {\n constructor(uri, opts = {}) {\n const o = typeof uri === \"object\" ? uri : opts;\n if (!o.transports ||\n (o.transports && typeof o.transports[0] === \"string\")) {\n o.transports = (o.transports || [\"polling\", \"websocket\", \"webtransport\"])\n .map((transportName) => DEFAULT_TRANSPORTS[transportName])\n .filter((t) => !!t);\n }\n super(uri, o);\n }\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n (typeof File !== \"undefined\" &&\n toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n (withNativeBlob && obj instanceof Blob) ||\n (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (hasBinary(obj[i])) {\n return true;\n }\n }\n return false;\n }\n if (isBinary(obj)) {\n return true;\n }\n if (obj.toJSON &&\n typeof obj.toJSON === \"function\" &&\n arguments.length === 1) {\n return hasBinary(obj.toJSON(), true);\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n return true;\n }\n }\n return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n const buffers = [];\n const packetData = packet.data;\n const pack = packet;\n pack.data = _deconstructPacket(packetData, buffers);\n pack.attachments = buffers.length; // number of binary 'attachments'\n return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (isBinary(data)) {\n const placeholder = { _placeholder: true, num: buffers.length };\n buffers.push(data);\n return placeholder;\n }\n else if (Array.isArray(data)) {\n const newData = new Array(data.length);\n for (let i = 0; i < data.length; i++) {\n newData[i] = _deconstructPacket(data[i], buffers);\n }\n return newData;\n }\n else if (typeof data === \"object\" && !(data instanceof Date)) {\n const newData = {};\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n newData[key] = _deconstructPacket(data[key], buffers);\n }\n }\n return newData;\n }\n return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n packet.data = _reconstructPacket(packet.data, buffers);\n delete packet.attachments; // no longer useful\n return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (data && data._placeholder === true) {\n const isIndexValid = typeof data.num === \"number\" &&\n data.num >= 0 &&\n data.num < buffers.length;\n if (isIndexValid) {\n return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n }\n else {\n throw new Error(\"illegal attachments\");\n }\n }\n else if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n data[i] = _reconstructPacket(data[i], buffers);\n }\n }\n else if (typeof data === \"object\") {\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n data[key] = _reconstructPacket(data[key], buffers);\n }\n }\n }\n return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\", // used on the client side\n \"connect_error\", // used on the client side\n \"disconnect\", // used on both sides\n \"disconnecting\", // used on the server side\n \"newListener\", // used by the Node.js EventEmitter\n \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if (hasBinary(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = deconstructPacket(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n /**\n * Decoder constructor\n *\n * @param {function} reviver - custom reviver to pass down to JSON.stringify\n */\n constructor(reviver) {\n super();\n this.reviver = reviver;\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if (isBinary(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n p.attachments = Number(buf);\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = reconstructPacket(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\nfunction isNamespaceValid(nsp) {\n return typeof nsp === \"string\";\n}\n// see https://caniuse.com/mdn-javascript_builtins_number_isinteger\nconst isInteger = Number.isInteger ||\n function (value) {\n return (typeof value === \"number\" &&\n isFinite(value) &&\n Math.floor(value) === value);\n };\nfunction isAckIdValid(id) {\n return id === undefined || isInteger(id);\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\nfunction isDataValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return payload === undefined || isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n return Array.isArray(payload);\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n default:\n return false;\n }\n}\nexport function isPacketValid(packet) {\n return (isNamespaceValid(packet.nsp) &&\n isAckIdValid(packet.id) &&\n isDataValid(packet.type, packet.data));\n}\n","export function on(obj, ev, fn) {\n obj.on(ev, fn);\n return function subDestroy() {\n obj.off(ev, fn);\n };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n connect: 1,\n connect_error: 1,\n disconnect: 1,\n disconnecting: 1,\n // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n newListener: 1,\n removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n * // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n * console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n /**\n * `Socket` constructor.\n */\n constructor(io, nsp, opts) {\n super();\n /**\n * Whether the socket is currently connected to the server.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.connected); // true\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.connected); // false\n * });\n */\n this.connected = false;\n /**\n * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n * be transmitted by the server.\n */\n this.recovered = false;\n /**\n * Buffer for packets received before the CONNECT packet\n */\n this.receiveBuffer = [];\n /**\n * Buffer for packets that will be sent once the socket is connected\n */\n this.sendBuffer = [];\n /**\n * The queue of packets to be sent with retry in case of failure.\n *\n * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n * @private\n */\n this._queue = [];\n /**\n * A sequence to generate the ID of the {@link QueuedPacket}.\n * @private\n */\n this._queueSeq = 0;\n this.ids = 0;\n /**\n * A map containing acknowledgement handlers.\n *\n * The `withError` attribute is used to differentiate handlers that accept an error as first argument:\n *\n * - `socket.emit(\"test\", (err, value) => { ... })` with `ackTimeout` option\n * - `socket.timeout(5000).emit(\"test\", (err, value) => { ... })`\n * - `const value = await socket.emitWithAck(\"test\")`\n *\n * From those that don't:\n *\n * - `socket.emit(\"test\", (value) => { ... });`\n *\n * In the first case, the handlers will be called with an error when:\n *\n * - the timeout is reached\n * - the socket gets disconnected\n *\n * In the second case, the handlers will be simply discarded upon disconnection, since the client will never receive\n * an acknowledgement from the server.\n *\n * @private\n */\n this.acks = {};\n this.flags = {};\n this.io = io;\n this.nsp = nsp;\n if (opts && opts.auth) {\n this.auth = opts.auth;\n }\n this._opts = Object.assign({}, opts);\n if (this.io._autoConnect)\n this.open();\n }\n /**\n * Whether the socket is currently disconnected\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.disconnected); // false\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.disconnected); // true\n * });\n */\n get disconnected() {\n return !this.connected;\n }\n /**\n * Subscribe to open, close and packet events\n *\n * @private\n */\n subEvents() {\n if (this.subs)\n return;\n const io = this.io;\n this.subs = [\n on(io, \"open\", this.onopen.bind(this)),\n on(io, \"packet\", this.onpacket.bind(this)),\n on(io, \"error\", this.onerror.bind(this)),\n on(io, \"close\", this.onclose.bind(this)),\n ];\n }\n /**\n * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n *\n * @example\n * const socket = io();\n *\n * console.log(socket.active); // true\n *\n * socket.on(\"disconnect\", (reason) => {\n * if (reason === \"io server disconnect\") {\n * // the disconnection was initiated by the server, you need to manually reconnect\n * console.log(socket.active); // false\n * }\n * // else the socket will automatically try to reconnect\n * console.log(socket.active); // true\n * });\n */\n get active() {\n return !!this.subs;\n }\n /**\n * \"Opens\" the socket.\n *\n * @example\n * const socket = io({\n * autoConnect: false\n * });\n *\n * socket.connect();\n */\n connect() {\n if (this.connected)\n return this;\n this.subEvents();\n if (!this.io[\"_reconnecting\"])\n this.io.open(); // ensure open\n if (\"open\" === this.io._readyState)\n this.onopen();\n return this;\n }\n /**\n * Alias for {@link connect()}.\n */\n open() {\n return this.connect();\n }\n /**\n * Sends a `message` event.\n *\n * This method mimics the WebSocket.send() method.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n *\n * @example\n * socket.send(\"hello\");\n *\n * // this is equivalent to\n * socket.emit(\"message\", \"hello\");\n *\n * @return self\n */\n send(...args) {\n args.unshift(\"message\");\n this.emit.apply(this, args);\n return this;\n }\n /**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @example\n * socket.emit(\"hello\", \"world\");\n *\n * // all serializable datastructures are supported (no need to call JSON.stringify)\n * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n *\n * // with an acknowledgement from the server\n * socket.emit(\"hello\", \"world\", (val) => {\n * // ...\n * });\n *\n * @return self\n */\n emit(ev, ...args) {\n var _a, _b, _c;\n if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n }\n args.unshift(ev);\n if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n this._addToQueue(args);\n return this;\n }\n const packet = {\n type: PacketType.EVENT,\n data: args,\n };\n packet.options = {};\n packet.options.compress = this.flags.compress !== false;\n // event ack callback\n if (\"function\" === typeof args[args.length - 1]) {\n const id = this.ids++;\n const ack = args.pop();\n this._registerAckCallback(id, ack);\n packet.id = id;\n }\n const isTransportWritable = (_b = (_a = this.io.engine) === null || _a === void 0 ? void 0 : _a.transport) === null || _b === void 0 ? void 0 : _b.writable;\n const isConnected = this.connected && !((_c = this.io.engine) === null || _c === void 0 ? void 0 : _c._hasPingExpired());\n const discardPacket = this.flags.volatile && !isTransportWritable;\n if (discardPacket) {\n }\n else if (isConnected) {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n }\n else {\n this.sendBuffer.push(packet);\n }\n this.flags = {};\n return this;\n }\n /**\n * @private\n */\n _registerAckCallback(id, ack) {\n var _a;\n const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n if (timeout === undefined) {\n this.acks[id] = ack;\n return;\n }\n // @ts-ignore\n const timer = this.io.setTimeoutFn(() => {\n delete this.acks[id];\n for (let i = 0; i < this.sendBuffer.length; i++) {\n if (this.sendBuffer[i].id === id) {\n this.sendBuffer.splice(i, 1);\n }\n }\n ack.call(this, new Error(\"operation has timed out\"));\n }, timeout);\n const fn = (...args) => {\n // @ts-ignore\n this.io.clearTimeoutFn(timer);\n ack.apply(this, args);\n };\n fn.withError = true;\n this.acks[id] = fn;\n }\n /**\n * Emits an event and waits for an acknowledgement\n *\n * @example\n * // without timeout\n * const response = await socket.emitWithAck(\"hello\", \"world\");\n *\n * // with a specific timeout\n * try {\n * const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n * } catch (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n *\n * @return a Promise that will be fulfilled when the server acknowledges the event\n */\n emitWithAck(ev, ...args) {\n return new Promise((resolve, reject) => {\n const fn = (arg1, arg2) => {\n return arg1 ? reject(arg1) : resolve(arg2);\n };\n fn.withError = true;\n args.push(fn);\n this.emit(ev, ...args);\n });\n }\n /**\n * Add the packet to the queue.\n * @param args\n * @private\n */\n _addToQueue(args) {\n let ack;\n if (typeof args[args.length - 1] === \"function\") {\n ack = args.pop();\n }\n const packet = {\n id: this._queueSeq++,\n tryCount: 0,\n pending: false,\n args,\n flags: Object.assign({ fromQueue: true }, this.flags),\n };\n args.push((err, ...responseArgs) => {\n if (packet !== this._queue[0]) {\n }\n const hasError = err !== null;\n if (hasError) {\n if (packet.tryCount > this._opts.retries) {\n this._queue.shift();\n if (ack) {\n ack(err);\n }\n }\n }\n else {\n this._queue.shift();\n if (ack) {\n ack(null, ...responseArgs);\n }\n }\n packet.pending = false;\n return this._drainQueue();\n });\n this._queue.push(packet);\n this._drainQueue();\n }\n /**\n * Send the first packet of the queue, and wait for an acknowledgement from the server.\n * @param force - whether to resend a packet that has not been acknowledged yet\n *\n * @private\n */\n _drainQueue(force = false) {\n if (!this.connected || this._queue.length === 0) {\n return;\n }\n const packet = this._queue[0];\n if (packet.pending && !force) {\n return;\n }\n packet.pending = true;\n packet.tryCount++;\n this.flags = packet.flags;\n this.emit.apply(this, packet.args);\n }\n /**\n * Sends a packet.\n *\n * @param packet\n * @private\n */\n packet(packet) {\n packet.nsp = this.nsp;\n this.io._packet(packet);\n }\n /**\n * Called upon engine `open`.\n *\n * @private\n */\n onopen() {\n if (typeof this.auth == \"function\") {\n this.auth((data) => {\n this._sendConnectPacket(data);\n });\n }\n else {\n this._sendConnectPacket(this.auth);\n }\n }\n /**\n * Sends a CONNECT packet to initiate the Socket.IO session.\n *\n * @param data\n * @private\n */\n _sendConnectPacket(data) {\n this.packet({\n type: PacketType.CONNECT,\n data: this._pid\n ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n : data,\n });\n }\n /**\n * Called upon engine or manager `error`.\n *\n * @param err\n * @private\n */\n onerror(err) {\n if (!this.connected) {\n this.emitReserved(\"connect_error\", err);\n }\n }\n /**\n * Called upon engine `close`.\n *\n * @param reason\n * @param description\n * @private\n */\n onclose(reason, description) {\n this.connected = false;\n delete this.id;\n this.emitReserved(\"disconnect\", reason, description);\n this._clearAcks();\n }\n /**\n * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from\n * the server.\n *\n * @private\n */\n _clearAcks() {\n Object.keys(this.acks).forEach((id) => {\n const isBuffered = this.sendBuffer.some((packet) => String(packet.id) === id);\n if (!isBuffered) {\n // note: handlers that do not accept an error as first argument are ignored here\n const ack = this.acks[id];\n delete this.acks[id];\n if (ack.withError) {\n ack.call(this, new Error(\"socket has been disconnected\"));\n }\n }\n });\n }\n /**\n * Called with socket packet.\n *\n * @param packet\n * @private\n */\n onpacket(packet) {\n const sameNamespace = packet.nsp === this.nsp;\n if (!sameNamespace)\n return;\n switch (packet.type) {\n case PacketType.CONNECT:\n if (packet.data && packet.data.sid) {\n this.onconnect(packet.data.sid, packet.data.pid);\n }\n else {\n this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n }\n break;\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n this.onevent(packet);\n break;\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n this.onack(packet);\n break;\n case PacketType.DISCONNECT:\n this.ondisconnect();\n break;\n case PacketType.CONNECT_ERROR:\n this.destroy();\n const err = new Error(packet.data.message);\n // @ts-ignore\n err.data = packet.data.data;\n this.emitReserved(\"connect_error\", err);\n break;\n }\n }\n /**\n * Called upon a server event.\n *\n * @param packet\n * @private\n */\n onevent(packet) {\n const args = packet.data || [];\n if (null != packet.id) {\n args.push(this.ack(packet.id));\n }\n if (this.connected) {\n this.emitEvent(args);\n }\n else {\n this.receiveBuffer.push(Object.freeze(args));\n }\n }\n emitEvent(args) {\n if (this._anyListeners && this._anyListeners.length) {\n const listeners = this._anyListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, args);\n }\n }\n super.emit.apply(this, args);\n if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n this._lastOffset = args[args.length - 1];\n }\n }\n /**\n * Produces an ack callback to emit with an event.\n *\n * @private\n */\n ack(id) {\n const self = this;\n let sent = false;\n return function (...args) {\n // prevent double callbacks\n if (sent)\n return;\n sent = true;\n self.packet({\n type: PacketType.ACK,\n id: id,\n data: args,\n });\n };\n }\n /**\n * Called upon a server acknowledgement.\n *\n * @param packet\n * @private\n */\n onack(packet) {\n const ack = this.acks[packet.id];\n if (typeof ack !== \"function\") {\n return;\n }\n delete this.acks[packet.id];\n // @ts-ignore FIXME ack is incorrectly inferred as 'never'\n if (ack.withError) {\n packet.data.unshift(null);\n }\n // @ts-ignore\n ack.apply(this, packet.data);\n }\n /**\n * Called upon server connect.\n *\n * @private\n */\n onconnect(id, pid) {\n this.id = id;\n this.recovered = pid && this._pid === pid;\n this._pid = pid; // defined only if connection state recovery is enabled\n this.connected = true;\n this.emitBuffered();\n this._drainQueue(true);\n this.emitReserved(\"connect\");\n }\n /**\n * Emit buffered events (received and emitted).\n *\n * @private\n */\n emitBuffered() {\n this.receiveBuffer.forEach((args) => this.emitEvent(args));\n this.receiveBuffer = [];\n this.sendBuffer.forEach((packet) => {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n });\n this.sendBuffer = [];\n }\n /**\n * Called upon server disconnect.\n *\n * @private\n */\n ondisconnect() {\n this.destroy();\n this.onclose(\"io server disconnect\");\n }\n /**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @private\n */\n destroy() {\n if (this.subs) {\n // clean subscriptions to avoid reconnections\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs = undefined;\n }\n this.io[\"_destroy\"](this);\n }\n /**\n * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n *\n * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"disconnect\", (reason) => {\n * // console.log(reason); prints \"io client disconnect\"\n * });\n *\n * socket.disconnect();\n *\n * @return self\n */\n disconnect() {\n if (this.connected) {\n this.packet({ type: PacketType.DISCONNECT });\n }\n // remove socket from pool\n this.destroy();\n if (this.connected) {\n // fire events\n this.onclose(\"io client disconnect\");\n }\n return this;\n }\n /**\n * Alias for {@link disconnect()}.\n *\n * @return self\n */\n close() {\n return this.disconnect();\n }\n /**\n * Sets the compress flag.\n *\n * @example\n * socket.compress(false).emit(\"hello\");\n *\n * @param compress - if `true`, compresses the sending data\n * @return self\n */\n compress(compress) {\n this.flags.compress = compress;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n * ready to send messages.\n *\n * @example\n * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n *\n * @returns self\n */\n get volatile() {\n this.flags.volatile = true;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n * given number of milliseconds have elapsed without an acknowledgement from the server:\n *\n * @example\n * socket.timeout(5000).emit(\"my-event\", (err) => {\n * if (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n * });\n *\n * @returns self\n */\n timeout(timeout) {\n this.flags.timeout = timeout;\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * @example\n * socket.onAny((event, ...args) => {\n * console.log(`got ${event}`);\n * });\n *\n * @param listener\n */\n onAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * @example\n * socket.prependAny((event, ...args) => {\n * console.log(`got event ${event}`);\n * });\n *\n * @param listener\n */\n prependAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`got event ${event}`);\n * }\n *\n * socket.onAny(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAny(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAny();\n *\n * @param listener\n */\n offAny(listener) {\n if (!this._anyListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAny() {\n return this._anyListeners || [];\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.onAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n onAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.prependAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n prependAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`sent event ${event}`);\n * }\n *\n * socket.onAnyOutgoing(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAnyOutgoing(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAnyOutgoing();\n *\n * @param [listener] - the catch-all listener (optional)\n */\n offAnyOutgoing(listener) {\n if (!this._anyOutgoingListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyOutgoingListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyOutgoingListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAnyOutgoing() {\n return this._anyOutgoingListeners || [];\n }\n /**\n * Notify the listeners for each packet sent\n *\n * @param packet\n *\n * @private\n */\n notifyOutgoingListeners(packet) {\n if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n const listeners = this._anyOutgoingListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, packet.data);\n }\n }\n }\n}\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n opts = opts || {};\n this.ms = opts.min || 100;\n this.max = opts.max || 10000;\n this.factor = opts.factor || 2;\n this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n var ms = this.ms * Math.pow(this.factor, this.attempts++);\n if (this.jitter) {\n var rand = Math.random();\n var deviation = Math.floor(rand * this.jitter * ms);\n ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n }\n return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n this.jitter = jitter;\n};\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n constructor(uri, opts) {\n var _a;\n super();\n this.nsps = {};\n this.subs = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n opts.path = opts.path || \"/socket.io\";\n this.opts = opts;\n installTimerFunctions(this, opts);\n this.reconnection(opts.reconnection !== false);\n this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n this.reconnectionDelay(opts.reconnectionDelay || 1000);\n this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n this.backoff = new Backoff({\n min: this.reconnectionDelay(),\n max: this.reconnectionDelayMax(),\n jitter: this.randomizationFactor(),\n });\n this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n this._readyState = \"closed\";\n this.uri = uri;\n const _parser = opts.parser || parser;\n this.encoder = new _parser.Encoder();\n this.decoder = new _parser.Decoder();\n this._autoConnect = opts.autoConnect !== false;\n if (this._autoConnect)\n this.open();\n }\n reconnection(v) {\n if (!arguments.length)\n return this._reconnection;\n this._reconnection = !!v;\n if (!v) {\n this.skipReconnect = true;\n }\n return this;\n }\n reconnectionAttempts(v) {\n if (v === undefined)\n return this._reconnectionAttempts;\n this._reconnectionAttempts = v;\n return this;\n }\n reconnectionDelay(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelay;\n this._reconnectionDelay = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n return this;\n }\n randomizationFactor(v) {\n var _a;\n if (v === undefined)\n return this._randomizationFactor;\n this._randomizationFactor = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n return this;\n }\n reconnectionDelayMax(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelayMax;\n this._reconnectionDelayMax = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n return this;\n }\n timeout(v) {\n if (!arguments.length)\n return this._timeout;\n this._timeout = v;\n return this;\n }\n /**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @private\n */\n maybeReconnectOnOpen() {\n // Only try to reconnect if it's the first time we're connecting\n if (!this._reconnecting &&\n this._reconnection &&\n this.backoff.attempts === 0) {\n // keeps reconnection from firing twice for the same reconnection loop\n this.reconnect();\n }\n }\n /**\n * Sets the current transport `socket`.\n *\n * @param {Function} fn - optional, callback\n * @return self\n * @public\n */\n open(fn) {\n if (~this._readyState.indexOf(\"open\"))\n return this;\n this.engine = new Engine(this.uri, this.opts);\n const socket = this.engine;\n const self = this;\n this._readyState = \"opening\";\n this.skipReconnect = false;\n // emit `open`\n const openSubDestroy = on(socket, \"open\", function () {\n self.onopen();\n fn && fn();\n });\n const onError = (err) => {\n this.cleanup();\n this._readyState = \"closed\";\n this.emitReserved(\"error\", err);\n if (fn) {\n fn(err);\n }\n else {\n // Only do this if there is no fn to handle the error\n this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n this.subs.push(openSubDestroy);\n this.subs.push(errorSub);\n return this;\n }\n /**\n * Alias for open()\n *\n * @return self\n * @public\n */\n connect(fn) {\n return this.open(fn);\n }\n /**\n * Called upon transport open.\n *\n * @private\n */\n onopen() {\n // clear old subs\n this.cleanup();\n // mark as open\n this._readyState = \"open\";\n this.emitReserved(\"open\");\n // add new subs\n const socket = this.engine;\n this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), \n // @ts-ignore\n on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n }\n /**\n * Called upon a ping.\n *\n * @private\n */\n onping() {\n this.emitReserved(\"ping\");\n }\n /**\n * Called with data.\n *\n * @private\n */\n ondata(data) {\n try {\n this.decoder.add(data);\n }\n catch (e) {\n this.onclose(\"parse error\", e);\n }\n }\n /**\n * Called when parser fully decodes a packet.\n *\n * @private\n */\n ondecoded(packet) {\n // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n nextTick(() => {\n this.emitReserved(\"packet\", packet);\n }, this.setTimeoutFn);\n }\n /**\n * Called upon socket error.\n *\n * @private\n */\n onerror(err) {\n this.emitReserved(\"error\", err);\n }\n /**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @public\n */\n socket(nsp, opts) {\n let socket = this.nsps[nsp];\n if (!socket) {\n socket = new Socket(this, nsp, opts);\n this.nsps[nsp] = socket;\n }\n else if (this._autoConnect && !socket.active) {\n socket.connect();\n }\n return socket;\n }\n /**\n * Called upon a socket close.\n *\n * @param socket\n * @private\n */\n _destroy(socket) {\n const nsps = Object.keys(this.nsps);\n for (const nsp of nsps) {\n const socket = this.nsps[nsp];\n if (socket.active) {\n return;\n }\n }\n this._close();\n }\n /**\n * Writes a packet.\n *\n * @param packet\n * @private\n */\n _packet(packet) {\n const encodedPackets = this.encoder.encode(packet);\n for (let i = 0; i < encodedPackets.length; i++) {\n this.engine.write(encodedPackets[i], packet.options);\n }\n }\n /**\n * Clean up transport subscriptions and packet buffer.\n *\n * @private\n */\n cleanup() {\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs.length = 0;\n this.decoder.destroy();\n }\n /**\n * Close the current socket.\n *\n * @private\n */\n _close() {\n this.skipReconnect = true;\n this._reconnecting = false;\n this.onclose(\"forced close\");\n }\n /**\n * Alias for close()\n *\n * @private\n */\n disconnect() {\n return this._close();\n }\n /**\n * Called when:\n *\n * - the low-level engine is closed\n * - the parser encountered a badly formatted packet\n * - all sockets are disconnected\n *\n * @private\n */\n onclose(reason, description) {\n var _a;\n this.cleanup();\n (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();\n this.backoff.reset();\n this._readyState = \"closed\";\n this.emitReserved(\"close\", reason, description);\n if (this._reconnection && !this.skipReconnect) {\n this.reconnect();\n }\n }\n /**\n * Attempt a reconnection.\n *\n * @private\n */\n reconnect() {\n if (this._reconnecting || this.skipReconnect)\n return this;\n const self = this;\n if (this.backoff.attempts >= this._reconnectionAttempts) {\n this.backoff.reset();\n this.emitReserved(\"reconnect_failed\");\n this._reconnecting = false;\n }\n else {\n const delay = this.backoff.duration();\n this._reconnecting = true;\n const timer = this.setTimeoutFn(() => {\n if (self.skipReconnect)\n return;\n this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n // check again for the case socket closed in above events\n if (self.skipReconnect)\n return;\n self.open((err) => {\n if (err) {\n self._reconnecting = false;\n self.reconnect();\n this.emitReserved(\"reconnect_error\", err);\n }\n else {\n self.onreconnect();\n }\n });\n }, delay);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n }\n /**\n * Called upon successful reconnect.\n *\n * @private\n */\n onreconnect() {\n const attempt = this.backoff.attempts;\n this._reconnecting = false;\n this.backoff.reset();\n this.emitReserved(\"reconnect\", attempt);\n }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n if (typeof uri === \"object\") {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n const parsed = url(uri, opts.path || \"/socket.io\");\n const source = parsed.source;\n const id = parsed.id;\n const path = parsed.path;\n const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n const newConnection = opts.forceNew ||\n opts[\"force new connection\"] ||\n false === opts.multiplex ||\n sameNamespace;\n let io;\n if (newConnection) {\n io = new Manager(source, opts);\n }\n else {\n if (!cache[id]) {\n cache[id] = new Manager(source, opts);\n }\n io = cache[id];\n }\n if (parsed.query && !opts.query) {\n opts.query = parsed.queryKey;\n }\n return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n Manager,\n Socket,\n io: lookup,\n connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\nexport { Fetch, NodeXHR, XHR, NodeWebSocket, WebSocket, WebTransport, } from \"engine.io-client\";\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n * Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n let obj = uri;\n // default to window.location\n loc = loc || (typeof location !== \"undefined\" && location);\n if (null == uri)\n uri = loc.protocol + \"//\" + loc.host;\n // relative path support\n if (typeof uri === \"string\") {\n if (\"/\" === uri.charAt(0)) {\n if (\"/\" === uri.charAt(1)) {\n uri = loc.protocol + uri;\n }\n else {\n uri = loc.host + uri;\n }\n }\n if (!/^(https?|wss?):\\/\\//.test(uri)) {\n if (\"undefined\" !== typeof loc) {\n uri = loc.protocol + \"//\" + uri;\n }\n else {\n uri = \"https://\" + uri;\n }\n }\n // parse\n obj = parse(uri);\n }\n // make sure we treat `localhost:80` and `localhost` equally\n if (!obj.port) {\n if (/^(http|ws)$/.test(obj.protocol)) {\n obj.port = \"80\";\n }\n else if (/^(http|ws)s$/.test(obj.protocol)) {\n obj.port = \"443\";\n }\n }\n obj.path = obj.path || \"/\";\n const ipv6 = obj.host.indexOf(\":\") !== -1;\n const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n // define unique id\n obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n // define href\n obj.href =\n obj.protocol +\n \"://\" +\n host +\n (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n return obj;\n}\n","import { useEffect, useRef } from 'react';\nimport io from 'socket.io-client';\nimport { toast } from '../../lib/sonner';\nimport { logger } from '../../utils/loggerUtils';\nimport { createDebugLogger } from '../../shared/utils/debugUtils';\n\nconst debug = createDebugLogger('SessionSocket');\n\ninterface UseSessionSocketProps {\n userId: string | null | undefined;\n activeSessionId: string | null | undefined;\n currentDeviceId: string | null | undefined;\n refreshSessions: () => Promise<void>;\n logout: () => Promise<void>;\n clearSessionState: () => Promise<void>;\n baseURL: string;\n onRemoteSignOut?: () => void;\n onSessionRemoved?: (sessionId: string) => void;\n}\n\nexport function useSessionSocket({ userId, activeSessionId, currentDeviceId, refreshSessions, logout, clearSessionState, baseURL, onRemoteSignOut, onSessionRemoved }: UseSessionSocketProps) {\n const socketRef = useRef<any>(null);\n const joinedRoomRef = useRef<string | null>(null);\n \n // Store callbacks in refs to avoid re-joining when they change\n const refreshSessionsRef = useRef(refreshSessions);\n const logoutRef = useRef(logout);\n const clearSessionStateRef = useRef(clearSessionState);\n const onRemoteSignOutRef = useRef(onRemoteSignOut);\n const onSessionRemovedRef = useRef(onSessionRemoved);\n const activeSessionIdRef = useRef(activeSessionId);\n const currentDeviceIdRef = useRef(currentDeviceId);\n\n // Update refs when callbacks change\n useEffect(() => {\n refreshSessionsRef.current = refreshSessions;\n logoutRef.current = logout;\n clearSessionStateRef.current = clearSessionState;\n onRemoteSignOutRef.current = onRemoteSignOut;\n onSessionRemovedRef.current = onSessionRemoved;\n activeSessionIdRef.current = activeSessionId;\n currentDeviceIdRef.current = currentDeviceId;\n }, [refreshSessions, logout, clearSessionState, onRemoteSignOut, onSessionRemoved, activeSessionId, currentDeviceId]);\n\n useEffect(() => {\n if (!userId || !baseURL) {\n // Clean up if userId or baseURL becomes invalid\n if (socketRef.current && joinedRoomRef.current) {\n socketRef.current.emit('leave', { userId: joinedRoomRef.current });\n joinedRoomRef.current = null;\n }\n return;\n }\n\n const roomId = `user:${userId}`;\n \n // Only create socket if it doesn't exist\n if (!socketRef.current) {\n socketRef.current = io(baseURL, {\n transports: ['websocket'],\n });\n }\n const socket = socketRef.current;\n\n // Only join if we haven't already joined this room\n if (joinedRoomRef.current !== roomId) {\n // Leave previous room if switching users\n if (joinedRoomRef.current) {\n socket.emit('leave', { userId: joinedRoomRef.current });\n }\n \n socket.emit('join', { userId: roomId });\n joinedRoomRef.current = roomId;\n \n debug.log('Emitting join for room:', roomId);\n }\n\n // Set up event handlers (only once per socket instance)\n const handleConnect = () => {\n debug.log('Socket connected:', socket.id);\n };\n\n const handleSessionUpdate = async (data: {\n type: string;\n sessionId?: string;\n deviceId?: string;\n sessionIds?: string[]\n }) => {\n debug.log('Received session_update:', data);\n \n const currentActiveSessionId = activeSessionIdRef.current;\n const currentDeviceId = currentDeviceIdRef.current;\n \n // Handle different event types\n if (data.type === 'session_removed') {\n // Track removed session\n if (data.sessionId && onSessionRemovedRef.current) {\n onSessionRemovedRef.current(data.sessionId);\n }\n \n // If the removed sessionId matches the current activeSessionId, immediately clear state\n if (data.sessionId === currentActiveSessionId) {\n if (onRemoteSignOutRef.current) {\n onRemoteSignOutRef.current();\n } else {\n toast.info('You have been signed out remotely.');\n }\n // Use clearSessionState since session was already removed server-side\n // Await to ensure storage cleanup completes before continuing\n try {\n await clearSessionStateRef.current();\n } catch (error) {\n if (__DEV__) {\n logger.error('Failed to clear session state after session_removed', error instanceof Error ? error : new Error(String(error)), { component: 'useSessionSocket' });\n }\n }\n } else {\n // Otherwise, just refresh the sessions list (with error handling)\n refreshSessionsRef.current().catch((error) => {\n // Silently handle errors from refresh - they're expected if sessions were removed\n if (__DEV__) {\n logger.debug('Failed to refresh sessions after session_removed', { component: 'useSessionSocket' }, error as unknown);\n }\n });\n }\n } else if (data.type === 'device_removed') {\n // Track all removed sessions from this device\n if (data.sessionIds && onSessionRemovedRef.current) {\n for (const sessionId of data.sessionIds) {\n onSessionRemovedRef.current(sessionId);\n }\n }\n \n // If the removed deviceId matches the current device, immediately clear state\n if (data.deviceId && data.deviceId === currentDeviceId) {\n if (onRemoteSignOutRef.current) {\n onRemoteSignOutRef.current();\n } else {\n toast.info('This device has been removed. You have been signed out.');\n }\n // Use clearSessionState since sessions were already removed server-side\n // Await to ensure storage cleanup completes before continuing\n try {\n await clearSessionStateRef.current();\n } catch (error) {\n if (__DEV__) {\n logger.error('Failed to clear session state after device_removed', error instanceof Error ? error : new Error(String(error)), { component: 'useSessionSocket' });\n }\n }\n } else {\n // Otherwise, refresh sessions and device list (with error handling)\n refreshSessionsRef.current().catch((error) => {\n // Silently handle errors from refresh - they're expected if sessions were removed\n if (__DEV__) {\n logger.debug('Failed to refresh sessions after device_removed', { component: 'useSessionSocket' }, error as unknown);\n }\n });\n }\n } else if (data.type === 'sessions_removed') {\n // Track all removed sessions\n if (data.sessionIds && onSessionRemovedRef.current) {\n for (const sessionId of data.sessionIds) {\n onSessionRemovedRef.current(sessionId);\n }\n }\n \n // If the current activeSessionId is in the removed sessionIds list, immediately clear state\n if (data.sessionIds && currentActiveSessionId && data.sessionIds.includes(currentActiveSessionId)) {\n if (onRemoteSignOutRef.current) {\n onRemoteSignOutRef.current();\n } else {\n toast.info('You have been signed out remotely.');\n }\n // Use clearSessionState since sessions were already removed server-side\n // Await to ensure storage cleanup completes before continuing\n try {\n await clearSessionStateRef.current();\n } catch (error) {\n if (__DEV__) {\n logger.error('Failed to clear session state after sessions_removed', error instanceof Error ? error : new Error(String(error)), { component: 'useSessionSocket' });\n }\n }\n } else {\n // Otherwise, refresh sessions list (with error handling)\n refreshSessionsRef.current().catch((error) => {\n // Silently handle errors from refresh - they're expected if sessions were removed\n if (__DEV__) {\n logger.debug('Failed to refresh sessions after sessions_removed', { component: 'useSessionSocket' }, error as unknown);\n }\n });\n }\n } else {\n // For other event types (e.g., session_created), refresh sessions (with error handling)\n refreshSessionsRef.current().catch((error) => {\n // Log but don't throw - refresh errors shouldn't break the socket handler\n if (__DEV__) {\n logger.debug('Failed to refresh sessions after session_update', { component: 'useSessionSocket' }, error as unknown);\n }\n });\n \n // If the current session was logged out (legacy behavior), handle it specially\n if (data.sessionId === currentActiveSessionId) {\n if (onRemoteSignOutRef.current) {\n onRemoteSignOutRef.current();\n } else {\n toast.info('You have been signed out remotely.');\n }\n // Use clearSessionState since session was already removed server-side\n // Await to ensure storage cleanup completes before continuing\n try {\n await clearSessionStateRef.current();\n } catch (error) {\n debug.error('Failed to clear session state after session_update:', error);\n }\n }\n }\n };\n\n socket.on('connect', handleConnect);\n socket.on('session_update', handleSessionUpdate);\n\n return () => {\n socket.off('connect', handleConnect);\n socket.off('session_update', handleSessionUpdate);\n \n // Only leave on unmount if we're still in this room\n if (joinedRoomRef.current === roomId) {\n socket.emit('leave', { userId: roomId });\n joinedRoomRef.current = null;\n }\n };\n }, [userId, baseURL]); // Only depend on userId and baseURL - callbacks are in refs\n} ","import type { ApiError } from '../../models/interfaces';\n\ntype ErrorWithMessage = {\n message?: string;\n};\n\ntype ErrorWithResponse = {\n response?: {\n status?: number;\n data?: {\n message?: string;\n error?: string;\n };\n };\n};\n\nexport interface HandleAuthErrorOptions {\n defaultMessage: string;\n code: string;\n status?: number;\n onError?: (error: ApiError) => void;\n setAuthError?: (message: string) => void;\n logger?: (message: string, error?: unknown) => void;\n}\n\nconst DEFAULT_INVALID_SESSION_MESSAGES = [\n 'Invalid or expired session',\n 'Session is invalid',\n 'Session not found',\n 'Session expired',\n];\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null;\n\nconst getResponseStatus = (error: unknown): number | undefined => {\n if (!isObject(error)) return undefined;\n const response = (error as ErrorWithResponse).response;\n return response?.status;\n};\n\n/**\n * Determine whether the error represents an invalid session condition.\n * This centralizes 401 detection across different fetch clients.\n */\nexport const isInvalidSessionError = (error: unknown): boolean => {\n const status = getResponseStatus(error);\n if (status === 401) {\n return true;\n }\n\n if (!isObject(error)) {\n return false;\n }\n\n // Check error.status directly (HttpService sets this)\n if ((error as any).status === 401) {\n return true;\n }\n\n const normalizedMessage = extractErrorMessage(error)?.toLowerCase();\n if (!normalizedMessage) {\n return false;\n }\n\n // Check for HTTP 401 in message (HttpService creates errors with \"HTTP 401:\" format)\n if (normalizedMessage.includes('http 401') || normalizedMessage.includes('401')) {\n return true;\n }\n\n return DEFAULT_INVALID_SESSION_MESSAGES.some((msg) =>\n normalizedMessage.includes(msg.toLowerCase()),\n );\n};\n\n/**\n * Determine whether the error represents a timeout or network error.\n * These are expected when the device is offline or has poor connectivity.\n */\nexport const isTimeoutOrNetworkError = (error: unknown): boolean => {\n if (!isObject(error) && !(error instanceof Error)) {\n return false;\n }\n\n const message = extractErrorMessage(error, '').toLowerCase();\n const errorCode = (error as any).code;\n\n // Check for timeout/cancelled messages\n if (\n message.includes('timeout') ||\n message.includes('cancelled') ||\n message.includes('econnaborted') ||\n message.includes('aborted') ||\n message.includes('request timeout or cancelled')\n ) {\n return true;\n }\n\n // Check for timeout/network error codes\n if (errorCode === 'TIMEOUT' || errorCode === 'NETWORK_ERROR' || errorCode === 'ECONNABORTED') {\n return true;\n }\n\n // Check for AbortError\n if (error instanceof Error && error.name === 'AbortError') {\n return true;\n }\n\n // Check for network-related TypeErrors\n if (error instanceof TypeError) {\n const typeErrorMessage = error.message.toLowerCase();\n if (\n typeErrorMessage.includes('fetch') ||\n typeErrorMessage.includes('network') ||\n typeErrorMessage.includes('failed to fetch')\n ) {\n return true;\n }\n }\n\n return false;\n};\n\n/**\n * Extract a consistent error message from unknown error shapes.\n *\n * @param error - The unknown error payload\n * @param fallbackMessage - Message to return when no concrete message is available\n */\nexport const extractErrorMessage = (\n error: unknown,\n fallbackMessage = 'Unexpected error',\n): string => {\n if (typeof error === 'string' && error.trim().length > 0) {\n return error;\n }\n\n if (!isObject(error)) {\n return fallbackMessage;\n }\n\n const withMessage = error as ErrorWithMessage;\n if (withMessage.message && withMessage.message.trim().length > 0) {\n return withMessage.message;\n }\n\n const withResponse = error as ErrorWithResponse;\n const responseMessage =\n withResponse.response?.data?.message ?? withResponse.response?.data?.error;\n\n if (typeof responseMessage === 'string' && responseMessage.trim().length > 0) {\n return responseMessage;\n }\n\n return fallbackMessage;\n};\n\n/**\n * Centralized error handler for auth-related operations.\n *\n * @param error - Unknown error object\n * @param options - Error handling configuration\n * @returns Resolved error message\n */\nexport const handleAuthError = (\n error: unknown,\n {\n defaultMessage,\n code,\n status,\n onError,\n setAuthError,\n logger,\n }: HandleAuthErrorOptions,\n): string => {\n const resolvedStatus = status ?? getResponseStatus(error) ?? (isInvalidSessionError(error) ? 401 : 500);\n const message = extractErrorMessage(error, defaultMessage);\n\n if (logger) {\n logger(message, error);\n }\n\n setAuthError?.(message);\n\n onError?.({\n message,\n code,\n status: resolvedStatus,\n });\n\n return message;\n};\n\n\n","/**\n * Session management utilities\n * \n * Provides consistent session normalization, deduplication, and sorting\n * to ensure sessions are always displayed in a predictable order.\n */\n\nimport type { ClientSession } from '../models/session';\n\n/**\n * Normalize a session to ensure all required fields are present\n */\nexport function normalizeSession(session: Partial<ClientSession> & { sessionId: string }): ClientSession {\n const now = new Date().toISOString();\n return {\n sessionId: session.sessionId,\n deviceId: session.deviceId || '',\n expiresAt: session.expiresAt || now,\n lastActive: session.lastActive || now,\n userId: session.userId || '',\n };\n}\n\n/**\n * Compare two sessions for equality\n */\nexport function sessionsEqual(a: ClientSession, b: ClientSession): boolean {\n return a.sessionId === b.sessionId;\n}\n\n/**\n * Sort sessions by lastActive (most recent first), then by sessionId for stability\n */\nexport function sortSessions(sessions: ClientSession[]): ClientSession[] {\n return [...sessions].sort((a, b) => {\n // Sort by lastActive descending (most recent first)\n const timeA = new Date(a.lastActive).getTime();\n const timeB = new Date(b.lastActive).getTime();\n if (timeA !== timeB) {\n return timeB - timeA; // Descending order\n }\n // If lastActive is the same, sort by sessionId for stability\n return a.sessionId.localeCompare(b.sessionId);\n });\n}\n\n/**\n * Deduplicate sessions by sessionId, keeping the most recent version\n */\nexport function deduplicateSessions(sessions: ClientSession[]): ClientSession[] {\n const sessionMap = new Map<string, ClientSession>();\n \n for (const session of sessions) {\n const existing = sessionMap.get(session.sessionId);\n if (!existing) {\n sessionMap.set(session.sessionId, session);\n } else {\n // Keep the one with more recent lastActive\n const existingTime = new Date(existing.lastActive).getTime();\n const currentTime = new Date(session.lastActive).getTime();\n if (currentTime > existingTime) {\n sessionMap.set(session.sessionId, session);\n }\n }\n }\n \n return Array.from(sessionMap.values());\n}\n\n/**\n * Deduplicate sessions by userId, keeping only one session per user\n * Priority: 1) Active session (if provided), 2) Most recent session\n * This prevents showing duplicate accounts for the same user\n */\nexport function deduplicateSessionsByUserId(\n sessions: ClientSession[],\n activeSessionId?: string | null\n): ClientSession[] {\n if (!sessions.length) return [];\n \n const userSessionMap = new Map<string, ClientSession>();\n \n for (const session of sessions) {\n if (!session.userId) continue; // Skip sessions without userId\n \n const existing = userSessionMap.get(session.userId);\n if (!existing) {\n userSessionMap.set(session.userId, session);\n } else {\n // Prioritize active session\n const isCurrentActive = activeSessionId && session.sessionId === activeSessionId;\n const isExistingActive = activeSessionId && existing.sessionId === activeSessionId;\n \n if (isCurrentActive && !isExistingActive) {\n userSessionMap.set(session.userId, session);\n } else if (!isCurrentActive && isExistingActive) {\n // Keep existing (active) session\n continue;\n } else {\n // Neither is active, keep the one with more recent lastActive\n const existingTime = new Date(existing.lastActive).getTime();\n const currentTime = new Date(session.lastActive).getTime();\n if (currentTime > existingTime) {\n userSessionMap.set(session.userId, session);\n }\n }\n }\n }\n \n return Array.from(userSessionMap.values());\n}\n\n/**\n * Normalize, deduplicate, and sort sessions\n * This ensures consistent session ordering across the application\n * \n * @param sessions - Array of sessions to normalize\n * @param activeSessionId - Optional active session ID to prioritize\n * @param deduplicateByUserId - If true, deduplicate by userId (one account per user). Default: true\n */\nexport function normalizeAndSortSessions(\n sessions: ClientSession[],\n activeSessionId?: string | null,\n deduplicateByUserId: boolean = true\n): ClientSession[] {\n if (!sessions.length) return [];\n \n // Normalize all sessions\n const normalized = sessions.map(normalizeSession);\n \n // First deduplicate by sessionId (exact duplicates)\n const deduplicatedBySessionId = deduplicateSessions(normalized);\n \n // Then deduplicate by userId if requested (one account per user)\n const finalSessions = deduplicateByUserId\n ? deduplicateSessionsByUserId(deduplicatedBySessionId, activeSessionId)\n : deduplicatedBySessionId;\n \n // Sort consistently\n return sortSessions(finalSessions);\n}\n\n/**\n * Merge two session arrays, prioritizing newer data\n * Returns normalized, deduplicated, and sorted sessions\n * \n * @param existing - Existing sessions array\n * @param incoming - New sessions to merge in\n * @param activeSessionId - Optional active session ID to prioritize\n * @param deduplicateByUserId - If true, deduplicate by userId (one account per user). Default: true\n */\nexport function mergeSessions(\n existing: ClientSession[],\n incoming: ClientSession[],\n activeSessionId?: string | null,\n deduplicateByUserId: boolean = true\n): ClientSession[] {\n if (!existing.length && !incoming.length) return [];\n if (!existing.length) return normalizeAndSortSessions(incoming, activeSessionId, deduplicateByUserId);\n if (!incoming.length) return normalizeAndSortSessions(existing, activeSessionId, deduplicateByUserId);\n \n // Normalize both arrays\n const normalizedExisting = existing.map(normalizeSession);\n const normalizedIncoming = incoming.map(normalizeSession);\n \n // Create a map with existing sessions (by sessionId)\n const sessionMap = new Map<string, ClientSession>();\n \n // Add existing sessions first\n for (const session of normalizedExisting) {\n sessionMap.set(session.sessionId, session);\n }\n \n // Merge incoming sessions - backend data always replaces existing\n for (const session of normalizedIncoming) {\n sessionMap.set(session.sessionId, session);\n }\n \n // Convert to array\n const merged = Array.from(sessionMap.values());\n \n // Apply userId deduplication if requested\n const finalSessions = deduplicateByUserId\n ? deduplicateSessionsByUserId(merged, activeSessionId)\n : merged;\n \n // Sort consistently\n return sortSessions(finalSessions);\n}\n\n/**\n * Check if two session arrays are equal (same sessionIds in same order)\n */\nexport function sessionsArraysEqual(a: ClientSession[], b: ClientSession[]): boolean {\n if (a.length !== b.length) {\n return false;\n }\n \n const sortedA = sortSessions(a);\n const sortedB = sortSessions(b);\n \n return sortedA.every((session, index) => \n sessionsEqual(session, sortedB[index])\n );\n}\n\n","import type { ClientSession } from '../../models/session';\n\ninterface DeviceSession {\n sessionId: string;\n deviceId?: string;\n deviceName?: string;\n expiresAt?: string;\n lastActive?: string;\n user?: { id?: string; _id?: { toString(): string } };\n userId?: string;\n isCurrent?: boolean;\n}\n\n/**\n * Service type for session helpers.\n * Uses 'any' to work around TypeScript mixin composition type inference issues.\n * The OxyServices class has these methods but TypeScript can't see them due to the mixin pattern.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype OxyServicesAny = any;\n\nexport interface FetchSessionsWithFallbackOptions {\n fallbackDeviceId?: string;\n fallbackUserId?: string;\n logger?: (message: string, error?: unknown) => void;\n}\n\nexport interface ValidateSessionBatchOptions {\n useHeaderValidation?: boolean;\n maxConcurrency?: number;\n}\n\nexport interface SessionValidationResult {\n sessionId: string;\n valid: boolean;\n user?: unknown;\n raw?: unknown;\n error?: unknown;\n}\n\n/**\n * Normalize backend session payloads into `ClientSession` objects.\n *\n * @param sessions - Raw session array returned from the API\n * @param fallbackDeviceId - Device identifier to use when missing from payload\n * @param fallbackUserId - User identifier to use when missing from payload\n */\nexport const mapSessionsToClient = (\n sessions: DeviceSession[],\n fallbackDeviceId?: string,\n fallbackUserId?: string,\n): ClientSession[] => {\n const now = new Date();\n\n return sessions.map((session) => ({\n sessionId: session.sessionId,\n deviceId: session.deviceId || fallbackDeviceId || '',\n expiresAt: session.expiresAt || new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n lastActive: session.lastActive || now.toISOString(),\n userId:\n session.user?.id ||\n session.userId ||\n (session.user?._id ? session.user._id.toString() : undefined) ||\n fallbackUserId ||\n '',\n isCurrent: Boolean(session.isCurrent),\n }));\n};\n\n/**\n * Fetch device sessions with fallback to the legacy session endpoint when needed.\n *\n * @param oxyServices - Oxy service instance\n * @param sessionId - Session identifier to fetch\n * @param options - Optional fallback options\n */\nexport const fetchSessionsWithFallback = async (\n oxyServices: OxyServicesAny,\n sessionId: string,\n {\n fallbackDeviceId,\n fallbackUserId,\n logger,\n }: FetchSessionsWithFallbackOptions = {},\n): Promise<ClientSession[]> => {\n try {\n const deviceSessions = await oxyServices.getDeviceSessions(sessionId);\n return mapSessionsToClient(deviceSessions, fallbackDeviceId, fallbackUserId);\n } catch (error) {\n if (__DEV__ && logger) {\n logger('Failed to get device sessions, falling back to user sessions', error);\n }\n\n const userSessions = await oxyServices.getSessionsBySessionId(sessionId);\n return mapSessionsToClient(userSessions, fallbackDeviceId, fallbackUserId);\n }\n};\n\n/**\n * Validate multiple sessions concurrently with configurable concurrency.\n *\n * @param oxyServices - Oxy service instance\n * @param sessionIds - Session identifiers to validate\n * @param options - Validation options\n */\nexport const validateSessionBatch = async (\n oxyServices: OxyServicesAny,\n sessionIds: string[],\n { useHeaderValidation = true, maxConcurrency = 5 }: ValidateSessionBatchOptions = {},\n): Promise<SessionValidationResult[]> => {\n if (!sessionIds.length) {\n return [];\n }\n\n const uniqueSessionIds = Array.from(new Set(sessionIds));\n const safeConcurrency = Math.max(1, Math.min(maxConcurrency, uniqueSessionIds.length));\n const results: SessionValidationResult[] = [];\n let index = 0;\n\n const worker = async () => {\n while (index < uniqueSessionIds.length) {\n const currentIndex = index;\n index += 1;\n const sessionId = uniqueSessionIds[currentIndex];\n\n try {\n const validation = await oxyServices.validateSession(sessionId, { useHeaderValidation });\n const valid = Boolean(validation?.valid);\n\n results.push({\n sessionId,\n valid,\n user: validation?.user,\n raw: validation,\n });\n } catch (error) {\n results.push({\n sessionId,\n valid: false,\n error,\n });\n }\n }\n };\n\n await Promise.all(Array.from({ length: safeConcurrency }, worker));\n\n return results;\n};\n\n\n","export interface StorageInterface {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n clear: () => Promise<void>;\n}\n\nexport interface SessionStorageKeys {\n activeSessionId: string;\n sessionIds: string;\n language: string;\n}\n\n/**\n * Create an in-memory storage implementation used as a safe fallback.\n */\nconst MEMORY_STORAGE = (): StorageInterface => {\n const store = new Map<string, string>();\n\n return {\n async getItem(key: string) {\n return store.has(key) ? store.get(key)! : null;\n },\n async setItem(key: string, value: string) {\n store.set(key, value);\n },\n async removeItem(key: string) {\n store.delete(key);\n },\n async clear() {\n store.clear();\n },\n };\n};\n\n/**\n * Create a web storage implementation backed by `localStorage`.\n * Falls back to in-memory storage when unavailable.\n */\nconst createWebStorage = (): StorageInterface => {\n if (typeof window === 'undefined' || typeof window.localStorage === 'undefined') {\n return MEMORY_STORAGE();\n }\n\n return {\n async getItem(key: string) {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n async setItem(key: string, value: string) {\n try {\n window.localStorage.setItem(key, value);\n } catch {\n // Ignore quota or access issues for now.\n }\n },\n async removeItem(key: string) {\n try {\n window.localStorage.removeItem(key);\n } catch {\n // Ignore failures.\n }\n },\n async clear() {\n try {\n window.localStorage.clear();\n } catch {\n // Ignore failures.\n }\n },\n };\n};\n\nlet asyncStorageInstance: StorageInterface | null = null;\n\n/**\n * Lazily import React Native AsyncStorage implementation.\n */\nconst createNativeStorage = async (): Promise<StorageInterface> => {\n if (asyncStorageInstance) {\n return asyncStorageInstance;\n }\n\n try {\n const asyncStorageModule = await import('@react-native-async-storage/async-storage');\n asyncStorageInstance = asyncStorageModule.default as unknown as StorageInterface;\n return asyncStorageInstance;\n } catch (error) {\n if (__DEV__) {\n console.error('Failed to import AsyncStorage:', error);\n }\n throw new Error('AsyncStorage is required in React Native environment');\n }\n};\n\n/**\n * Detect whether the current runtime is React Native.\n */\nexport const isReactNative = (): boolean =>\n typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n\n/**\n * Create a platform-appropriate storage implementation.\n * Defaults to in-memory storage when no platform storage is available.\n */\nexport const createPlatformStorage = async (): Promise<StorageInterface> => {\n if (isReactNative()) {\n return createNativeStorage();\n }\n\n return createWebStorage();\n};\n\nexport const STORAGE_KEY_PREFIX = 'oxy_session';\n\n/**\n * Produce strongly typed storage key names for the supplied prefix.\n *\n * @param prefix - Storage key prefix\n */\nexport const getStorageKeys = (prefix: string = STORAGE_KEY_PREFIX): SessionStorageKeys => ({\n activeSessionId: `${prefix}_active_session_id`,\n sessionIds: `${prefix}_session_ids`,\n language: `${prefix}_language`,\n});\n\n\n","import { QueryClient } from '@tanstack/react-query';\nimport type { StorageInterface } from '../utils/storageHelpers';\n\nconst QUERY_CACHE_KEY = 'oxy_query_cache';\nconst QUERY_CACHE_VERSION = '1';\n\n/**\n * Custom persistence adapter for TanStack Query using our StorageInterface\n */\nexport const createPersistenceAdapter = (storage: StorageInterface) => {\n return {\n persistClient: async (client: any) => {\n try {\n const serialized = JSON.stringify({\n clientState: client,\n timestamp: Date.now(),\n version: QUERY_CACHE_VERSION,\n });\n await storage.setItem(QUERY_CACHE_KEY, serialized);\n } catch (error) {\n if (__DEV__) {\n console.warn('[QueryClient] Failed to persist cache:', error);\n }\n }\n },\n restoreClient: async () => {\n try {\n const cached = await storage.getItem(QUERY_CACHE_KEY);\n if (!cached) return undefined;\n\n const parsed = JSON.parse(cached);\n \n // Check version compatibility\n if (parsed.version !== QUERY_CACHE_VERSION) {\n // Clear old cache on version mismatch\n await storage.removeItem(QUERY_CACHE_KEY);\n return undefined;\n }\n\n // Check if cache is too old (30 days)\n const maxAge = 30 * 24 * 60 * 60 * 1000;\n if (parsed.timestamp && Date.now() - parsed.timestamp > maxAge) {\n await storage.removeItem(QUERY_CACHE_KEY);\n return undefined;\n }\n\n return parsed.clientState;\n } catch (error) {\n if (__DEV__) {\n console.warn('[QueryClient] Failed to restore cache:', error);\n }\n return undefined;\n }\n },\n removeClient: async () => {\n try {\n await storage.removeItem(QUERY_CACHE_KEY);\n } catch (error) {\n if (__DEV__) {\n console.warn('[QueryClient] Failed to remove cache:', error);\n }\n }\n },\n };\n};\n\n/**\n * Create a QueryClient with offline-first configuration\n */\nexport const createQueryClient = (storage?: StorageInterface | null): QueryClient => {\n const client = new QueryClient({\n defaultOptions: {\n queries: {\n // Data is fresh for 5 minutes\n staleTime: 5 * 60 * 1000,\n // Keep unused data in cache for 30 minutes\n gcTime: 30 * 60 * 1000,\n // Retry 3 times with exponential backoff\n retry: 3,\n retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),\n // Refetch on reconnect\n refetchOnReconnect: true,\n // Don't refetch on window focus (better for mobile)\n refetchOnWindowFocus: false,\n // Offline-first: use cache when offline\n networkMode: 'offlineFirst',\n },\n mutations: {\n // Retry once for mutations\n retry: 1,\n // Offline-first: queue mutations when offline\n networkMode: 'offlineFirst',\n },\n },\n });\n\n // Note: Persistence is handled by TanStack Query's built-in persistence\n // For now, we rely on the query client's default behavior with networkMode: 'offlineFirst'\n // The cache will be available in memory and queries will use cached data when offline\n // Full persistence to AsyncStorage can be added later with @tanstack/react-query-persist-client if needed\n\n return client;\n};\n\n/**\n * Clear persisted query cache\n */\nexport const clearQueryCache = async (storage: StorageInterface): Promise<void> => {\n const adapter = createPersistenceAdapter(storage);\n await adapter.removeClient();\n};\n\n","import { useCallback, useMemo, useRef, useState } from 'react';\nimport type { ApiError, User } from '../../models/interfaces';\nimport type { ClientSession } from '../../models/session';\nimport { mergeSessions, normalizeAndSortSessions, sessionsArraysEqual } from '../../utils/sessionUtils';\nimport { fetchSessionsWithFallback, mapSessionsToClient, validateSessionBatch } from '../utils/sessionHelpers';\nimport { getStorageKeys, type StorageInterface } from '../utils/storageHelpers';\nimport { handleAuthError, isInvalidSessionError } from '../utils/errorHandlers';\nimport type { OxyServices } from '../../core';\nimport type { QueryClient } from '@tanstack/react-query';\nimport { clearQueryCache } from './queryClient';\n\nexport interface UseSessionManagementOptions {\n oxyServices: OxyServices;\n storage: StorageInterface | null;\n storageKeyPrefix?: string;\n loginSuccess: (user: User) => void;\n logoutStore: () => void;\n applyLanguagePreference: (user: User) => Promise<void>;\n onAuthStateChange?: (user: User | null) => void;\n onError?: (error: ApiError) => void;\n setAuthError?: (message: string | null) => void;\n logger?: (message: string, error?: unknown) => void;\n setTokenReady?: (ready: boolean) => void;\n queryClient?: QueryClient | null;\n}\n\nexport interface UseSessionManagementResult {\n sessions: ClientSession[];\n activeSessionId: string | null;\n setActiveSessionId: (sessionId: string | null) => void;\n updateSessions: (incoming: ClientSession[], options?: { merge?: boolean }) => void;\n switchSession: (sessionId: string) => Promise<User>;\n refreshSessions: (activeUserId?: string) => Promise<void>;\n clearSessionState: () => Promise<void>;\n saveActiveSessionId: (sessionId: string) => Promise<void>;\n trackRemovedSession: (sessionId: string) => void;\n storageKeys: ReturnType<typeof getStorageKeys>;\n isRefreshInFlight: boolean;\n}\n\nconst DEFAULT_SAVE_ERROR_MESSAGE = 'Failed to save session data';\nconst CLEAR_STORAGE_ERROR = 'Failed to clear storage';\n\n/**\n * Manage session state, persistence, and high-level multi-session operations.\n *\n * @param options - Session management configuration\n */\nexport const useSessionManagement = ({\n oxyServices,\n storage,\n storageKeyPrefix,\n loginSuccess,\n logoutStore,\n applyLanguagePreference,\n onAuthStateChange,\n onError,\n setAuthError,\n logger,\n setTokenReady,\n queryClient,\n}: UseSessionManagementOptions): UseSessionManagementResult => {\n const [sessions, setSessions] = useState<ClientSession[]>([]);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n\n const refreshInFlightRef = useRef<Promise<void> | null>(null);\n const removedSessionsRef = useRef<Set<string>>(new Set());\n const lastRefreshRef = useRef<number>(0);\n\n const storageKeys = useMemo(() => getStorageKeys(storageKeyPrefix), [storageKeyPrefix]);\n\n const saveSessionIds = useCallback(\n async (sessionIds: string[]): Promise<void> => {\n if (!storage) return;\n try {\n const uniqueIds = Array.from(new Set(sessionIds));\n await storage.setItem(storageKeys.sessionIds, JSON.stringify(uniqueIds));\n } catch (error) {\n if (logger) {\n logger(DEFAULT_SAVE_ERROR_MESSAGE, error);\n } else if (__DEV__) {\n console.warn('Failed to save session IDs:', error);\n }\n }\n },\n [logger, storage, storageKeys.sessionIds],\n );\n\n const updateSessions = useCallback(\n (incoming: ClientSession[], options: { merge?: boolean } = {}): void => {\n setSessions((prevSessions) => {\n const processed = options.merge\n ? mergeSessions(prevSessions, incoming, activeSessionId, false)\n : normalizeAndSortSessions(incoming, activeSessionId, false);\n\n if (storage) {\n void saveSessionIds(processed.map((session) => session.sessionId));\n }\n\n if (sessionsArraysEqual(prevSessions, processed)) {\n return prevSessions;\n }\n return processed;\n });\n },\n [activeSessionId, saveSessionIds, storage],\n );\n\n const saveActiveSessionId = useCallback(\n async (sessionId: string): Promise<void> => {\n if (!storage) return;\n try {\n await storage.setItem(storageKeys.activeSessionId, sessionId);\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: DEFAULT_SAVE_ERROR_MESSAGE,\n code: 'SESSION_PERSISTENCE_ERROR',\n onError,\n setAuthError,\n logger,\n });\n }\n },\n [logger, onError, setAuthError, storage, storageKeys.activeSessionId],\n );\n\n const removeActiveSessionId = useCallback(async (): Promise<void> => {\n if (!storage) return;\n try {\n await storage.removeItem(storageKeys.activeSessionId);\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: DEFAULT_SAVE_ERROR_MESSAGE,\n code: 'SESSION_PERSISTENCE_ERROR',\n onError,\n setAuthError,\n logger,\n });\n }\n }, [logger, onError, setAuthError, storage, storageKeys.activeSessionId]);\n\n const clearSessionStorage = useCallback(async (): Promise<void> => {\n if (!storage) return;\n try {\n await storage.removeItem(storageKeys.activeSessionId);\n await storage.removeItem(storageKeys.sessionIds);\n // Note: Identity sync state ('oxy_identity_synced') is managed by accounts app\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: CLEAR_STORAGE_ERROR,\n code: 'STORAGE_ERROR',\n onError,\n setAuthError,\n logger,\n });\n }\n }, [logger, onError, setAuthError, storage, storageKeys.activeSessionId, storageKeys.sessionIds]);\n\n const clearSessionState = useCallback(async (): Promise<void> => {\n setSessions([]);\n setActiveSessionId(null);\n logoutStore();\n \n // Clear TanStack Query cache (in-memory)\n if (queryClient) {\n queryClient.clear();\n }\n \n // Clear persisted query cache\n if (storage) {\n try {\n await clearQueryCache(storage);\n } catch (error) {\n if (logger) {\n logger('Failed to clear persisted query cache', error);\n }\n }\n }\n \n await clearSessionStorage();\n onAuthStateChange?.(null);\n }, [clearSessionStorage, logoutStore, onAuthStateChange, queryClient, storage, logger]);\n\n const activateSession = useCallback(\n async (sessionId: string, user: User): Promise<void> => {\n await oxyServices.getTokenBySession(sessionId);\n setTokenReady?.(true);\n setActiveSessionId(sessionId);\n loginSuccess(user);\n await saveActiveSessionId(sessionId);\n await applyLanguagePreference(user);\n onAuthStateChange?.(user);\n },\n [\n applyLanguagePreference,\n loginSuccess,\n onAuthStateChange,\n oxyServices,\n saveActiveSessionId,\n setTokenReady,\n ],\n );\n\n const trackRemovedSession = useCallback((sessionId: string) => {\n removedSessionsRef.current.add(sessionId);\n setTimeout(() => {\n removedSessionsRef.current.delete(sessionId);\n }, 5000);\n }, []);\n\n const findReplacementSession = useCallback(\n async (sessionIds: string[]): Promise<User | null> => {\n if (!sessionIds.length) {\n return null;\n }\n\n const validationResults = await validateSessionBatch(oxyServices, sessionIds, {\n maxConcurrency: 3,\n });\n\n const validSession = validationResults.find((result) => result.valid);\n if (!validSession) {\n return null;\n }\n\n const validation = await oxyServices.validateSession(validSession.sessionId, {\n useHeaderValidation: true,\n });\n\n if (!validation?.valid || !validation.user) {\n return null;\n }\n\n const user = validation.user as User;\n await activateSession(validSession.sessionId, user);\n return user;\n },\n [activateSession, oxyServices],\n );\n\n const switchSession = useCallback(\n async (sessionId: string): Promise<User> => {\n try {\n const validation = await oxyServices.validateSession(sessionId, { useHeaderValidation: true });\n if (!validation?.valid) {\n throw new Error('Session is invalid or expired');\n }\n\n if (!validation.user) {\n throw new Error('User data not available from session validation');\n }\n\n const user = validation.user as User;\n await activateSession(sessionId, user);\n\n try {\n const deviceSessions = await fetchSessionsWithFallback(oxyServices, sessionId, {\n fallbackUserId: user.id,\n logger,\n });\n updateSessions(deviceSessions, { merge: true });\n } catch (error) {\n if (__DEV__) {\n console.warn('Failed to synchronize sessions after switch:', error);\n }\n }\n\n return user;\n } catch (error) {\n const invalidSession = isInvalidSessionError(error);\n\n if (invalidSession) {\n updateSessions(sessions.filter((session) => session.sessionId !== sessionId), {\n merge: false,\n });\n if (sessionId === activeSessionId) {\n const otherSessionIds = sessions\n .filter(\n (session) =>\n session.sessionId !== sessionId && !removedSessionsRef.current.has(session.sessionId),\n )\n .map((session) => session.sessionId);\n\n const replacementUser = await findReplacementSession(otherSessionIds);\n if (replacementUser) {\n return replacementUser;\n }\n }\n }\n\n handleAuthError(error, {\n defaultMessage: 'Failed to switch session',\n code: invalidSession ? 'INVALID_SESSION' : 'SESSION_SWITCH_ERROR',\n onError,\n setAuthError,\n logger,\n });\n throw error instanceof Error ? error : new Error('Failed to switch session');\n }\n },\n [\n activateSession,\n activeSessionId,\n findReplacementSession,\n logger,\n loginSuccess,\n onError,\n oxyServices,\n sessions,\n setAuthError,\n updateSessions,\n ],\n );\n\n const refreshSessions = useCallback(\n async (activeUserId?: string): Promise<void> => {\n if (!activeSessionId) return;\n\n if (refreshInFlightRef.current) {\n await refreshInFlightRef.current;\n return;\n }\n\n const now = Date.now();\n if (now - lastRefreshRef.current < 500) {\n return;\n }\n lastRefreshRef.current = now;\n\n const refreshPromise = (async () => {\n try {\n const deviceSessions = await fetchSessionsWithFallback(oxyServices, activeSessionId, {\n fallbackUserId: activeUserId,\n logger,\n });\n updateSessions(deviceSessions, { merge: true });\n } catch (error) {\n if (isInvalidSessionError(error)) {\n const otherSessions = sessions\n .filter(\n (session) =>\n session.sessionId !== activeSessionId &&\n !removedSessionsRef.current.has(session.sessionId),\n )\n .map((session) => session.sessionId);\n\n const replacementUser = await findReplacementSession(otherSessions);\n if (!replacementUser) {\n await clearSessionState();\n }\n return;\n }\n\n handleAuthError(error, {\n defaultMessage: 'Failed to refresh sessions',\n code: 'SESSION_REFRESH_ERROR',\n onError,\n setAuthError,\n logger,\n });\n } finally {\n refreshInFlightRef.current = null;\n lastRefreshRef.current = Date.now();\n }\n })();\n\n refreshInFlightRef.current = refreshPromise;\n await refreshPromise;\n },\n [\n activeSessionId,\n clearSessionState,\n findReplacementSession,\n logger,\n onError,\n oxyServices,\n sessions,\n setAuthError,\n updateSessions,\n ],\n );\n\n const isRefreshInFlight = Boolean(refreshInFlightRef.current);\n\n return {\n sessions,\n activeSessionId,\n setActiveSessionId,\n updateSessions,\n switchSession,\n refreshSessions,\n clearSessionState,\n saveActiveSessionId,\n trackRemovedSession,\n storageKeys,\n isRefreshInFlight,\n };\n};\n\n\n","import { useCallback } from 'react';\nimport type { ApiError, User } from '../../../models/interfaces';\nimport type { AuthState } from '../../stores/authStore';\nimport type { ClientSession, SessionLoginResponse } from '../../../models/session';\nimport { DeviceManager } from '../../../utils/deviceManager';\nimport { fetchSessionsWithFallback, mapSessionsToClient } from '../../utils/sessionHelpers';\nimport { handleAuthError, isInvalidSessionError } from '../../utils/errorHandlers';\nimport type { StorageInterface } from '../../utils/storageHelpers';\nimport type { OxyServices } from '../../../core';\nimport { SignatureService } from '../../../crypto';\n\nexport interface UseAuthOperationsOptions {\n oxyServices: OxyServices;\n storage: StorageInterface | null;\n sessions: ClientSession[];\n activeSessionId: string | null;\n setActiveSessionId: (sessionId: string | null) => void;\n updateSessions: (sessions: ClientSession[], options?: { merge?: boolean }) => void;\n saveActiveSessionId: (sessionId: string) => Promise<void>;\n clearSessionState: () => Promise<void>;\n switchSession: (sessionId: string) => Promise<User>;\n applyLanguagePreference: (user: User) => Promise<void>;\n onAuthStateChange?: (user: User | null) => void;\n onError?: (error: ApiError) => void;\n loginSuccess: (user: User) => void;\n loginFailure: (message: string) => void;\n logoutStore: () => void;\n setAuthState: (state: Partial<AuthState>) => void;\n logger?: (message: string, error?: unknown) => void;\n}\n\nexport interface UseAuthOperationsResult {\n /** Sign in with existing public key */\n signIn: (publicKey: string, deviceName?: string) => Promise<User>;\n /** Logout from current session */\n logout: (targetSessionId?: string) => Promise<void>;\n /** Logout from all sessions */\n logoutAll: () => Promise<void>;\n}\n\nconst LOGIN_ERROR_CODE = 'LOGIN_ERROR';\nconst LOGOUT_ERROR_CODE = 'LOGOUT_ERROR';\nconst LOGOUT_ALL_ERROR_CODE = 'LOGOUT_ALL_ERROR';\n\n/**\n * Authentication operations using public key cryptography.\n * Accepts public key as parameter - identity management is handled by the app layer.\n */\nexport const useAuthOperations = ({\n oxyServices,\n storage,\n sessions,\n activeSessionId,\n setActiveSessionId,\n updateSessions,\n saveActiveSessionId,\n clearSessionState,\n switchSession,\n applyLanguagePreference,\n onAuthStateChange,\n onError,\n loginSuccess,\n loginFailure,\n logoutStore,\n setAuthState,\n logger,\n}: UseAuthOperationsOptions): UseAuthOperationsResult => {\n \n /**\n * Internal function to perform challenge-response sign in (works offline)\n */\n const performSignIn = useCallback(\n async (publicKey: string): Promise<User> => {\n const deviceFingerprintObj = DeviceManager.getDeviceFingerprint();\n const deviceFingerprint = JSON.stringify(deviceFingerprintObj);\n const deviceInfo = await DeviceManager.getDeviceInfo();\n const deviceName = deviceInfo.deviceName || DeviceManager.getDefaultDeviceName();\n\n let challenge: string;\n let isOffline = false;\n\n // Try to request challenge from server (online)\n try {\n const challengeResponse = await oxyServices.requestChallenge(publicKey);\n challenge = challengeResponse.challenge;\n } catch (error) {\n // Network error - generate challenge locally for offline sign-in\n const errorMessage = error instanceof Error ? error.message : String(error);\n const isNetworkError = \n errorMessage.includes('Network') ||\n errorMessage.includes('network') ||\n errorMessage.includes('Failed to fetch') ||\n errorMessage.includes('fetch failed') ||\n (error as any)?.code === 'NETWORK_ERROR' ||\n (error as any)?.status === 0;\n\n if (isNetworkError) {\n if (__DEV__ && logger) {\n logger('Network unavailable, performing offline sign-in');\n }\n // Generate challenge locally\n challenge = await SignatureService.generateChallenge();\n isOffline = true;\n } else {\n // Re-throw non-network errors\n throw error;\n }\n }\n\n // Note: Biometric authentication check should be handled by the app layer\n // (e.g., accounts app) before calling signIn. The biometric preference is stored\n // in local storage as 'oxy_biometric_enabled' and can be checked there.\n\n // Sign the challenge\n const { challenge: signature, timestamp } = await SignatureService.signChallenge(challenge);\n\n let fullUser: User;\n let sessionResponse: SessionLoginResponse;\n\n if (isOffline) {\n // Offline sign-in: create local session and minimal user object\n if (__DEV__ && logger) {\n logger('Creating offline session');\n }\n\n // Generate a local session ID\n const localSessionId = `offline_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const localDeviceId = `device_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(); // 7 days\n\n // Create minimal user object with publicKey as id\n fullUser = {\n id: publicKey, // Use publicKey as id (per migration document)\n publicKey,\n username: '',\n privacySettings: {},\n } as User;\n\n sessionResponse = {\n sessionId: localSessionId,\n deviceId: localDeviceId,\n expiresAt,\n user: {\n id: publicKey,\n username: '',\n },\n };\n\n // Store offline session locally\n const offlineSession: ClientSession = {\n sessionId: localSessionId,\n deviceId: localDeviceId,\n expiresAt,\n lastActive: new Date().toISOString(),\n userId: publicKey,\n isCurrent: true,\n };\n\n setActiveSessionId(localSessionId);\n await saveActiveSessionId(localSessionId);\n updateSessions([offlineSession], { merge: true });\n\n // Mark session as offline for later sync\n if (storage) {\n await storage.setItem(`oxy_session_${localSessionId}_offline`, 'true');\n }\n\n if (__DEV__ && logger) {\n logger('Offline sign-in successful');\n }\n } else {\n // Online sign-in: use normal flow\n // Verify and create session\n sessionResponse = await oxyServices.verifyChallenge(\n publicKey,\n challenge,\n signature,\n timestamp,\n deviceName,\n deviceFingerprint,\n );\n\n // Get token for the session\n try {\n await oxyServices.getTokenBySession(sessionResponse.sessionId);\n } catch (tokenError: unknown) {\n const errorMessage = tokenError instanceof Error ? tokenError.message : String(tokenError);\n const status = (tokenError as any)?.status;\n if (status === 404 || errorMessage.includes('404')) {\n throw new Error(`Session was created but token could not be retrieved. Session ID: ${sessionResponse.sessionId.substring(0, 8)}...`);\n }\n throw tokenError;\n }\n\n // Get full user data\n fullUser = await oxyServices.getUserBySession(sessionResponse.sessionId);\n\n // Fetch device sessions\n let allDeviceSessions: ClientSession[] = [];\n try {\n allDeviceSessions = await fetchSessionsWithFallback(oxyServices, sessionResponse.sessionId, {\n fallbackDeviceId: sessionResponse.deviceId,\n fallbackUserId: fullUser.id,\n logger,\n });\n } catch (error) {\n if (__DEV__ && logger) {\n logger('Failed to fetch device sessions after login', error);\n }\n }\n\n // Check for existing session for same user and switch to it to avoid duplicates\n const existingSession = allDeviceSessions.find(\n (session) =>\n session.userId?.toString() === fullUser.id?.toString() &&\n session.sessionId !== sessionResponse.sessionId,\n );\n\n if (existingSession) {\n // Switch to existing session instead of creating duplicate\n try {\n await oxyServices.logoutSession(sessionResponse.sessionId, sessionResponse.sessionId);\n } catch (logoutError) {\n // Non-critical - continue to switch session even if logout fails\n if (__DEV__ && logger) {\n logger('Failed to logout duplicate session, continuing with switch', logoutError);\n }\n }\n await switchSession(existingSession.sessionId);\n updateSessions(\n allDeviceSessions.filter((session) => session.sessionId !== sessionResponse.sessionId),\n { merge: false },\n );\n onAuthStateChange?.(fullUser);\n return fullUser;\n }\n\n setActiveSessionId(sessionResponse.sessionId);\n await saveActiveSessionId(sessionResponse.sessionId);\n updateSessions(allDeviceSessions, { merge: true });\n }\n\n await applyLanguagePreference(fullUser);\n loginSuccess(fullUser);\n onAuthStateChange?.(fullUser);\n \n return fullUser;\n },\n [\n applyLanguagePreference,\n logger,\n loginSuccess,\n onAuthStateChange,\n oxyServices,\n saveActiveSessionId,\n setActiveSessionId,\n switchSession,\n updateSessions,\n storage,\n ],\n );\n\n /**\n * Sign in with existing public key\n */\n const signIn = useCallback(\n async (publicKey: string, deviceName?: string): Promise<User> => {\n setAuthState({ isLoading: true, error: null });\n\n try {\n return await performSignIn(publicKey);\n } catch (error) {\n const message = handleAuthError(error, {\n defaultMessage: 'Sign in failed',\n code: LOGIN_ERROR_CODE,\n onError,\n setAuthError: (msg: string) => setAuthState({ error: msg }),\n logger,\n });\n loginFailure(message);\n throw error;\n } finally {\n setAuthState({ isLoading: false });\n }\n },\n [setAuthState, performSignIn, loginFailure, onError, logger],\n );\n\n /**\n * Logout from session\n */\n const logout = useCallback(\n async (targetSessionId?: string): Promise<void> => {\n if (!activeSessionId) return;\n\n try {\n const sessionToLogout = targetSessionId || activeSessionId;\n await oxyServices.logoutSession(activeSessionId, sessionToLogout);\n\n const filteredSessions = sessions.filter((session) => session.sessionId !== sessionToLogout);\n updateSessions(filteredSessions, { merge: false });\n\n if (sessionToLogout === activeSessionId) {\n if (filteredSessions.length > 0) {\n await switchSession(filteredSessions[0].sessionId);\n } else {\n await clearSessionState();\n return;\n }\n }\n } catch (error) {\n const isInvalid = isInvalidSessionError(error);\n\n if (isInvalid && targetSessionId === activeSessionId) {\n await clearSessionState();\n return;\n }\n\n handleAuthError(error, {\n defaultMessage: 'Logout failed',\n code: LOGOUT_ERROR_CODE,\n onError,\n setAuthError: (msg: string) => setAuthState({ error: msg }),\n logger,\n status: isInvalid ? 401 : undefined,\n });\n }\n },\n [\n activeSessionId,\n clearSessionState,\n logger,\n onError,\n oxyServices,\n sessions,\n setAuthState,\n switchSession,\n updateSessions,\n ],\n );\n\n /**\n * Logout from all sessions\n */\n const logoutAll = useCallback(async (): Promise<void> => {\n if (!activeSessionId) {\n const error = new Error('No active session found');\n setAuthState({ error: error.message });\n onError?.({ message: error.message, code: LOGOUT_ALL_ERROR_CODE, status: 404 });\n throw error;\n }\n\n try {\n await oxyServices.logoutAllSessions(activeSessionId);\n await clearSessionState();\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: 'Logout all failed',\n code: LOGOUT_ALL_ERROR_CODE,\n onError,\n setAuthError: (msg: string) => setAuthState({ error: msg }),\n logger,\n });\n throw error instanceof Error ? error : new Error('Logout all failed');\n }\n }, [activeSessionId, clearSessionState, logger, onError, oxyServices, setAuthState]);\n\n return {\n signIn,\n logout,\n logoutAll,\n };\n};\n","import type { ComponentType } from 'react';\nimport type { BaseScreenProps } from '../types/navigation';\n\n// Lazy loading: Screens are loaded on-demand to break require cycles\n// This prevents screens (which import OxyContext) from being loaded\n// before OxyContext is fully initialized\n\n// Define all available route names\nexport type RouteName =\n | 'OxyAuth' // Sign in with Oxy (QR code / deep link to Accounts app)\n | 'AccountOverview'\n | 'AccountSettings'\n | 'AccountCenter'\n | 'AccountSwitcher'\n | 'AccountVerification'\n | 'SessionManagement'\n | 'PaymentGateway'\n | 'Profile'\n | 'LanguageSelector'\n | 'PrivacySettings'\n | 'SearchSettings'\n | 'FileManagement'\n | 'HelpSupport'\n | 'FAQ'\n | 'Feedback'\n | 'LegalDocuments'\n | 'AppInfo'\n | 'PremiumSubscription'\n | 'WelcomeNewUser'\n | 'UserLinks'\n | 'HistoryView'\n | 'SavesCollections'\n | 'EditProfileField' // Dedicated screen for editing a single profile field\n | 'LearnMoreUsernames' // Informational screen about usernames\n | 'KarmaCenter'\n | 'KarmaLeaderboard'\n | 'KarmaRewards'\n | 'KarmaRules'\n | 'AboutKarma'\n | 'KarmaFAQ'\n | 'FollowersList' // List of user's followers\n | 'FollowingList'; // List of users being followed\n\n// Lazy screen loaders - functions that return screen components on-demand\n// This breaks the require cycle by deferring imports until screens are actually needed\nconst screenLoaders: Record<RouteName, () => ComponentType<BaseScreenProps>> = {\n OxyAuth: () => require('../screens/OxyAuthScreen').default,\n AccountOverview: () => require('../screens/AccountOverviewScreen').default,\n AccountSettings: () => require('../screens/AccountSettingsScreen').default,\n AccountCenter: () => require('../screens/AccountCenterScreen').default,\n AccountSwitcher: () => require('../screens/AccountSwitcherScreen').default,\n AccountVerification: () => require('../screens/AccountVerificationScreen').default,\n SessionManagement: () => require('../screens/SessionManagementScreen').default,\n PaymentGateway: () => require('../screens/PaymentGatewayScreen').default,\n Profile: () => require('../screens/ProfileScreen').default,\n LanguageSelector: () => require('../screens/LanguageSelectorScreen').default,\n PrivacySettings: () => require('../screens/PrivacySettingsScreen').default,\n SearchSettings: () => require('../screens/SearchSettingsScreen').default,\n FileManagement: () => require('../screens/FileManagementScreen').default,\n HelpSupport: () => require('../screens/HelpSupportScreen').default,\n FAQ: () => require('../screens/FAQScreen').default,\n Feedback: () => require('../screens/FeedbackScreen').default,\n LegalDocuments: () => require('../screens/LegalDocumentsScreen').default,\n AppInfo: () => require('../screens/AppInfoScreen').default,\n PremiumSubscription: () => require('../screens/PremiumSubscriptionScreen').default,\n WelcomeNewUser: () => require('../screens/WelcomeNewUserScreen').default,\n UserLinks: () => require('../screens/UserLinksScreen').default,\n HistoryView: () => require('../screens/HistoryViewScreen').default,\n SavesCollections: () => require('../screens/SavesCollectionsScreen').default,\n EditProfileField: () => require('../screens/EditProfileFieldScreen').default,\n // Informational screens\n LearnMoreUsernames: () => require('../screens/LearnMoreUsernamesScreen').default,\n // Karma screens\n KarmaCenter: () => require('../screens/karma/KarmaCenterScreen').default,\n KarmaLeaderboard: () => require('../screens/karma/KarmaLeaderboardScreen').default,\n KarmaRewards: () => require('../screens/karma/KarmaRewardsScreen').default,\n KarmaRules: () => require('../screens/karma/KarmaRulesScreen').default,\n AboutKarma: () => require('../screens/karma/KarmaAboutScreen').default,\n KarmaFAQ: () => require('../screens/karma/KarmaFAQScreen').default,\n // User list screens (followers/following)\n FollowersList: () => require('../screens/FollowersListScreen').default,\n FollowingList: () => require('../screens/FollowingListScreen').default,\n};\n\n// Cache loaded components to avoid re-requiring\nconst screenCache = new Map<RouteName, ComponentType<BaseScreenProps>>();\n\n// Helper function to get a screen component by route name (lazy loaded)\nexport const getScreenComponent = (routeName: RouteName): ComponentType<BaseScreenProps> | undefined => {\n // Return cached component if available\n if (screenCache.has(routeName)) {\n return screenCache.get(routeName);\n }\n\n // Lazy load the component\n const loader = screenLoaders[routeName];\n if (loader) {\n try {\n const component = loader();\n screenCache.set(routeName, component);\n return component;\n } catch (error) {\n if (__DEV__) {\n console.error(`[Routes] Failed to load screen: ${routeName}`, error);\n }\n return undefined;\n }\n }\n\n return undefined;\n};\n\n// Helper function to check if a route exists\n// Uses the screenLoaders object to check existence without loading the screen\nexport const isValidRoute = (routeName: string): routeName is RouteName => {\n return routeName in screenLoaders;\n};\n","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import type { RouteName } from './routes';\nimport { isValidRoute } from './routes';\nimport { createStore } from 'zustand/vanilla';\n\n/**\n * Bottom Sheet State Manager\n */\n\nexport interface BottomSheetState {\n currentScreen: RouteName | null;\n screenProps: Record<string, unknown>;\n currentStep?: number;\n history: Array<{ screen: RouteName; props: Record<string, unknown>; step?: number }>;\n isOpen: boolean;\n fullScreen: boolean;\n}\n\nconst initialState: BottomSheetState = {\n currentScreen: null,\n screenProps: {},\n currentStep: undefined,\n history: [],\n isOpen: false,\n fullScreen: false,\n};\n\nexport const bottomSheetStore = createStore<BottomSheetState>(() => initialState);\n\nexport const getState = () => bottomSheetStore.getState();\n\nexport const showBottomSheet = (\n screenOrConfig: RouteName | { screen: RouteName; props?: Record<string, unknown>; fullScreen?: boolean },\n): void => {\n const screen = typeof screenOrConfig === 'string' ? screenOrConfig : screenOrConfig.screen;\n const props = typeof screenOrConfig === 'string' ? {} : (screenOrConfig.props || {});\n const fullScreen = typeof screenOrConfig === 'string' ? false : (screenOrConfig.fullScreen ?? false);\n\n if (!isValidRoute(screen)) {\n if (__DEV__) console.warn(`[BottomSheet] Invalid route: ${screen}`);\n return;\n }\n\n const state = bottomSheetStore.getState();\n\n // Push current screen to history if navigating to different screen\n if (state.currentScreen && state.currentScreen !== screen) {\n bottomSheetStore.setState({\n history: [...state.history, {\n screen: state.currentScreen,\n props: state.screenProps,\n step: state.currentStep,\n }],\n });\n }\n\n bottomSheetStore.setState({\n currentScreen: screen,\n screenProps: props,\n currentStep: typeof props.initialStep === 'number' ? props.initialStep : undefined,\n isOpen: true,\n fullScreen,\n });\n};\n\nexport const closeBottomSheet = (): void => {\n bottomSheetStore.setState(initialState);\n};\n\nexport const goBack = (): boolean => {\n const { history } = bottomSheetStore.getState();\n\n if (history.length > 0) {\n const prev = history[history.length - 1];\n bottomSheetStore.setState({\n currentScreen: prev.screen,\n screenProps: prev.props,\n currentStep: prev.step,\n history: history.slice(0, -1),\n });\n return true;\n }\n\n return false;\n};\n\nexport const updateState = (updates: Partial<BottomSheetState>) => {\n bottomSheetStore.setState((state) => ({ ...state, ...updates }));\n};\n","// Use JSON locale files (RN Metro supports static requires reliably)\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst enUS = require('./locales/en-US.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst esES = require('./locales/es-ES.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst caES = require('./locales/ca-ES.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst frFR = require('./locales/fr-FR.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst deDE = require('./locales/de-DE.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst itIT = require('./locales/it-IT.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst ptPT = require('./locales/pt-PT.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst jaJP = require('./locales/ja-JP.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst koKR = require('./locales/ko-KR.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst zhCN = require('./locales/zh-CN.json') as Record<string, any>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst arSA = require('./locales/ar-SA.json') as Record<string, any>;\n\nexport type LocaleDict = Record<string, any>;\n\nconst DICTS: Record<string, LocaleDict> = {\n 'en': enUS as LocaleDict,\n 'en-US': enUS as LocaleDict,\n 'es': esES as LocaleDict,\n 'es-ES': esES as LocaleDict,\n 'ca': caES as LocaleDict,\n 'ca-ES': caES as LocaleDict,\n 'fr': frFR as LocaleDict,\n 'fr-FR': frFR as LocaleDict,\n 'de': deDE as LocaleDict,\n 'de-DE': deDE as LocaleDict,\n 'it': itIT as LocaleDict,\n 'it-IT': itIT as LocaleDict,\n 'pt': ptPT as LocaleDict,\n 'pt-PT': ptPT as LocaleDict,\n 'ja': jaJP as LocaleDict,\n 'ja-JP': jaJP as LocaleDict,\n 'ko': koKR as LocaleDict,\n 'ko-KR': koKR as LocaleDict,\n 'zh': zhCN as LocaleDict,\n 'zh-CN': zhCN as LocaleDict,\n 'ar': arSA as LocaleDict,\n 'ar-SA': arSA as LocaleDict,\n};\n\nconst FALLBACK = 'en-US';\n\nfunction getNested(obj: any, path: string): any {\n return path.split('.').reduce((acc, key) => (acc && acc[key] != null ? acc[key] : undefined), obj);\n}\n\nexport function translate(locale: string | undefined, key: string, vars?: Record<string, string | number>): string {\n const lang = locale && DICTS[locale] ? locale : FALLBACK;\n const dict = DICTS[lang] || DICTS[FALLBACK];\n let val = getNested(dict, key);\n if (typeof val !== 'string') return key; // fallback to key if missing\n if (vars) {\n Object.keys(vars).forEach(k => {\n const token = `{{${k}}}`;\n val = val.replaceAll(token, String(vars[k]));\n });\n }\n return val;\n}\n\nexport function hasKey(locale: string | undefined, key: string): boolean {\n const lang = locale && DICTS[locale] ? locale : FALLBACK;\n return getNested(DICTS[lang], key) != null || getNested(DICTS[FALLBACK], key) != null;\n}\n","import { create } from 'zustand';\nimport { shallow } from 'zustand/shallow';\nimport type { OxyServices } from '../../core';\n\nexport interface QuickAccount {\n sessionId: string;\n userId?: string; // User ID for deduplication\n username: string;\n displayName: string;\n avatar?: string;\n avatarUrl?: string; // Cached avatar URL to prevent recalculation\n}\n\ninterface AccountState {\n // Account data\n accounts: Record<string, QuickAccount>;\n accountOrder: string[]; // Maintain order for display\n accountsArray: QuickAccount[]; // Cached array to prevent infinite loops\n \n // Loading states\n loading: boolean;\n loadingSessionIds: Set<string>;\n \n // Error state\n error: string | null;\n \n // Actions\n setAccounts: (accounts: QuickAccount[]) => void;\n addAccount: (account: QuickAccount) => void;\n updateAccount: (sessionId: string, updates: Partial<QuickAccount>) => void;\n removeAccount: (sessionId: string) => void;\n moveAccountToTop: (sessionId: string) => void;\n \n // Loading actions\n setLoading: (loading: boolean) => void;\n setLoadingSession: (sessionId: string, loading: boolean) => void;\n \n // Error actions\n setError: (error: string | null) => void;\n \n // Load accounts from API\n loadAccounts: (sessionIds: string[], oxyServices: OxyServices, existingAccounts?: QuickAccount[], preserveOrder?: boolean) => Promise<void>;\n \n // Reset store\n reset: () => void;\n}\n\nconst initialState = {\n accounts: {} as Record<string, QuickAccount>,\n accountOrder: [] as string[],\n accountsArray: [] as QuickAccount[],\n loading: false,\n loadingSessionIds: new Set<string>(),\n error: null,\n};\n\n// Helper: Build accounts array from accounts map and order\nconst buildAccountsArray = (accounts: Record<string, QuickAccount>, order: string[]): QuickAccount[] => {\n const result: QuickAccount[] = [];\n for (const id of order) {\n const account = accounts[id];\n if (account) result.push(account);\n }\n return result;\n};\n\n// Helper: Create QuickAccount from user data\nconst createQuickAccount = (sessionId: string, userData: any, existingAccount?: QuickAccount, oxyServices?: OxyServices): QuickAccount => {\n const displayName = userData.name?.full || userData.name?.first || userData.username || 'Account';\n const userId = userData.id || userData._id?.toString();\n \n // Preserve existing avatarUrl if avatar hasn't changed (prevents image reload)\n let avatarUrl: string | undefined;\n if (existingAccount && existingAccount.avatar === userData.avatar && existingAccount.avatarUrl) {\n avatarUrl = existingAccount.avatarUrl; // Reuse existing URL\n } else if (userData.avatar && oxyServices) {\n avatarUrl = oxyServices.getFileDownloadUrl(userData.avatar, 'thumb');\n }\n \n return {\n sessionId,\n userId,\n username: userData.username || '',\n displayName,\n avatar: userData.avatar,\n avatarUrl,\n };\n};\n\nexport const useAccountStore = create<AccountState>((set, get) => ({\n ...initialState,\n \n setAccounts: (accounts) => set((state) => {\n const accountMap: Record<string, QuickAccount> = {};\n const order: string[] = [];\n const seenSessionIds = new Set<string>();\n \n for (const account of accounts) {\n if (seenSessionIds.has(account.sessionId)) continue;\n seenSessionIds.add(account.sessionId);\n accountMap[account.sessionId] = account;\n order.push(account.sessionId);\n }\n \n const accountsArray = buildAccountsArray(accountMap, order);\n const sameOrder = order.length === state.accountOrder.length && \n order.every((id, i) => id === state.accountOrder[i]);\n const sameAccounts = sameOrder && \n order.every(id => {\n const existing = state.accounts[id];\n const newAccount = accountMap[id];\n return existing && \n existing.sessionId === newAccount.sessionId &&\n existing.userId === newAccount.userId &&\n existing.avatar === newAccount.avatar &&\n existing.avatarUrl === newAccount.avatarUrl;\n });\n \n if (sameAccounts) return {} as any;\n \n return { accounts: accountMap, accountOrder: order, accountsArray };\n }),\n \n addAccount: (account) => set((state) => {\n // Check if account with same sessionId exists\n if (state.accounts[account.sessionId]) {\n // Update existing\n const existing = state.accounts[account.sessionId];\n if (existing.avatar === account.avatar && existing.avatarUrl === account.avatarUrl) {\n return {} as any; // No change\n }\n const newAccounts = { ...state.accounts, [account.sessionId]: account };\n return {\n accounts: newAccounts,\n accountsArray: buildAccountsArray(newAccounts, state.accountOrder),\n };\n }\n \n const newAccounts = { ...state.accounts, [account.sessionId]: account };\n const newOrder = [account.sessionId, ...state.accountOrder];\n return {\n accounts: newAccounts,\n accountOrder: newOrder,\n accountsArray: buildAccountsArray(newAccounts, newOrder),\n };\n }),\n \n updateAccount: (sessionId, updates) => set((state) => {\n const existing = state.accounts[sessionId];\n if (!existing) return {} as any;\n \n const updated = { ...existing, ...updates };\n if (existing.avatar === updated.avatar && existing.avatarUrl === updated.avatarUrl) {\n return {} as any; // No change\n }\n \n const newAccounts = { ...state.accounts, [sessionId]: updated };\n return {\n accounts: newAccounts,\n accountsArray: buildAccountsArray(newAccounts, state.accountOrder),\n };\n }),\n \n removeAccount: (sessionId) => set((state) => {\n if (!state.accounts[sessionId]) return {} as any;\n \n const { [sessionId]: _removed, ...rest } = state.accounts;\n const newOrder = state.accountOrder.filter(id => id !== sessionId);\n \n return {\n accounts: rest,\n accountOrder: newOrder,\n accountsArray: buildAccountsArray(rest, newOrder),\n };\n }),\n \n moveAccountToTop: (sessionId) => set((state) => {\n if (!state.accounts[sessionId]) return {} as any;\n \n const filtered = state.accountOrder.filter(id => id !== sessionId);\n const newOrder = [sessionId, ...filtered];\n \n return {\n accountOrder: newOrder,\n accountsArray: buildAccountsArray(state.accounts, newOrder),\n };\n }),\n \n setLoading: (loading) => set({ loading }),\n \n setLoadingSession: (sessionId, loading) => set((state) => {\n const newSet = new Set(state.loadingSessionIds);\n if (loading) {\n newSet.add(sessionId);\n } else {\n newSet.delete(sessionId);\n }\n return { loadingSessionIds: newSet };\n }),\n \n setError: (error) => set({ error }),\n \n loadAccounts: async (sessionIds, oxyServices, existingAccounts = [], preserveOrder = true) => {\n const state = get();\n \n const uniqueSessionIds = Array.from(new Set(sessionIds));\n if (uniqueSessionIds.length === 0) {\n get().setAccounts([]);\n return;\n }\n \n // Try to get data from TanStack Query cache first\n try {\n // This will be called from a component, so we need to access queryClient differently\n // For now, we'll keep the API call but optimize it\n const existingMap = new Map(existingAccounts.map(a => [a.sessionId, a]));\n for (const account of Object.values(state.accounts)) {\n existingMap.set(account.sessionId, account);\n }\n \n const missingSessionIds = uniqueSessionIds.filter(id => !existingMap.has(id));\n \n if (missingSessionIds.length === 0) {\n const ordered = uniqueSessionIds\n .map(id => existingMap.get(id))\n .filter((acc): acc is QuickAccount => acc !== undefined);\n get().setAccounts(ordered);\n return;\n }\n \n if (state.loading) {\n return;\n }\n \n set({ loading: true, error: null });\n \n try {\n const batchResults = await oxyServices.getUsersBySessions(missingSessionIds);\n \n const accountMap = new Map<string, QuickAccount>();\n \n for (const { sessionId, user: userData } of batchResults) {\n if (userData && !accountMap.has(sessionId)) {\n const existing = existingMap.get(sessionId);\n accountMap.set(sessionId, createQuickAccount(sessionId, userData, existing, oxyServices));\n }\n }\n \n for (const [sessionId, account] of accountMap) {\n existingMap.set(sessionId, account);\n }\n \n const orderToUse = preserveOrder ? uniqueSessionIds : [...uniqueSessionIds, ...state.accountOrder];\n const seen = new Set<string>();\n const ordered: QuickAccount[] = [];\n \n for (const sessionId of orderToUse) {\n if (seen.has(sessionId)) continue;\n seen.add(sessionId);\n \n const account = existingMap.get(sessionId);\n if (account) ordered.push(account);\n }\n \n get().setAccounts(ordered);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to load accounts';\n if (__DEV__) {\n console.error('AccountStore: Failed to load accounts:', error);\n }\n set({ error: errorMessage });\n } finally {\n set({ loading: false });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to load accounts';\n if (__DEV__) {\n console.error('AccountStore: Failed to load accounts:', error);\n }\n set({ error: errorMessage, loading: false });\n }\n },\n \n reset: () => set(initialState),\n}));\n\n// Selectors for performance - return cached array to prevent infinite loops\nexport const useAccounts = (): QuickAccount[] => {\n return useAccountStore(state => state.accountsArray);\n};\n\nexport const useAccountLoading = () => useAccountStore(s => s.loading);\nexport const useAccountError = () => useAccountStore(s => s.error);\nexport const useAccountLoadingSession = (sessionId: string) => \n useAccountStore(s => s.loadingSessionIds.has(sessionId));\n\n","/**\n * Centralized query keys for TanStack Query\n * \n * Following best practices:\n * - Use arrays for hierarchical keys\n * - Include all parameters in the key\n * - Use consistent naming conventions\n */\n\nexport const queryKeys = {\n // Account queries\n accounts: {\n all: ['accounts'] as const,\n lists: () => [...queryKeys.accounts.all, 'list'] as const,\n list: (sessionIds: string[]) => [...queryKeys.accounts.lists(), sessionIds] as const,\n details: () => [...queryKeys.accounts.all, 'detail'] as const,\n detail: (sessionId: string) => [...queryKeys.accounts.details(), sessionId] as const,\n current: () => [...queryKeys.accounts.all, 'current'] as const,\n settings: () => [...queryKeys.accounts.all, 'settings'] as const,\n },\n\n // User queries\n users: {\n all: ['users'] as const,\n lists: () => [...queryKeys.users.all, 'list'] as const,\n list: (userIds: string[]) => [...queryKeys.users.lists(), userIds] as const,\n details: () => [...queryKeys.users.all, 'detail'] as const,\n detail: (userId: string) => [...queryKeys.users.details(), userId] as const,\n profile: (sessionId: string) => [...queryKeys.users.details(), sessionId, 'profile'] as const,\n },\n\n // Session queries\n sessions: {\n all: ['sessions'] as const,\n lists: () => [...queryKeys.sessions.all, 'list'] as const,\n list: (userId?: string) => [...queryKeys.sessions.lists(), userId] as const,\n details: () => [...queryKeys.sessions.all, 'detail'] as const,\n detail: (sessionId: string) => [...queryKeys.sessions.details(), sessionId] as const,\n active: () => [...queryKeys.sessions.all, 'active'] as const,\n device: (deviceId: string) => [...queryKeys.sessions.all, 'device', deviceId] as const,\n },\n\n // Device queries\n devices: {\n all: ['devices'] as const,\n lists: () => [...queryKeys.devices.all, 'list'] as const,\n list: (userId?: string) => [...queryKeys.devices.lists(), userId] as const,\n details: () => [...queryKeys.devices.all, 'detail'] as const,\n detail: (deviceId: string) => [...queryKeys.devices.details(), deviceId] as const,\n },\n\n // Privacy settings queries\n privacy: {\n all: ['privacy'] as const,\n settings: (userId?: string) => [...queryKeys.privacy.all, 'settings', userId || 'current'] as const,\n },\n\n // Security activity queries\n security: {\n all: ['security'] as const,\n activity: (limit?: number, offset?: number, eventType?: string) =>\n [...queryKeys.security.all, 'activity', limit, offset, eventType] as const,\n recent: (limit: number) =>\n [...queryKeys.security.all, 'recent', limit] as const,\n },\n} as const;\n\n/**\n * Helper to invalidate all account-related queries\n */\nexport const invalidateAccountQueries = (queryClient: any) => {\n queryClient.invalidateQueries({ queryKey: queryKeys.accounts.all });\n};\n\n/**\n * Helper to invalidate all user-related queries\n */\nexport const invalidateUserQueries = (queryClient: any) => {\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all });\n};\n\n/**\n * Helper to invalidate all session-related queries\n */\nexport const invalidateSessionQueries = (queryClient: any) => {\n queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all });\n};\n\n","/**\n * Authentication helper utilities to reduce code duplication across hooks and utilities.\n * These functions handle common token validation and authentication error patterns.\n */\n\nimport type { OxyServices } from '../../core';\n\n/**\n * Error thrown when session sync is required\n */\nexport class SessionSyncRequiredError extends Error {\n constructor(message = 'Session needs to be synced. Please try again.') {\n super(message);\n this.name = 'SessionSyncRequiredError';\n }\n}\n\n/**\n * Error thrown when authentication fails\n */\nexport class AuthenticationFailedError extends Error {\n constructor(message = 'Authentication failed. Please sign in again.') {\n super(message);\n this.name = 'AuthenticationFailedError';\n }\n}\n\n/**\n * Ensures a valid token exists before making authenticated API calls.\n * If no valid token exists and an active session ID is available,\n * attempts to refresh the token using the session.\n *\n * @param oxyServices - The OxyServices instance\n * @param activeSessionId - The active session ID (if available)\n * @throws {SessionSyncRequiredError} If the session needs to be synced (offline session)\n * @throws {Error} If token refresh fails for other reasons\n *\n * @example\n * ```ts\n * // In a mutation or query function:\n * await ensureValidToken(oxyServices, activeSessionId);\n * return await oxyServices.updateProfile(updates);\n * ```\n */\nexport async function ensureValidToken(\n oxyServices: OxyServices,\n activeSessionId: string | null | undefined\n): Promise<void> {\n if (oxyServices.hasValidToken() || !activeSessionId) {\n return;\n }\n\n try {\n await oxyServices.getTokenBySession(activeSessionId);\n } catch (tokenError) {\n const errorMessage = tokenError instanceof Error ? tokenError.message : String(tokenError);\n\n if (errorMessage.includes('AUTH_REQUIRED_OFFLINE_SESSION') || errorMessage.includes('offline')) {\n throw new SessionSyncRequiredError();\n }\n\n throw tokenError;\n }\n}\n\n/**\n * Options for handling API authentication errors\n */\nexport interface HandleApiErrorOptions {\n /** Optional callback to attempt session sync and retry */\n syncSession?: () => Promise<unknown>;\n /** The active session ID for retry attempts */\n activeSessionId?: string | null;\n /** The OxyServices instance for retry attempts */\n oxyServices?: OxyServices;\n}\n\n/**\n * Checks if an error is an authentication error (401 or auth-related message)\n *\n * @param error - The error to check\n * @returns True if the error is an authentication error\n */\nexport function isAuthenticationError(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const errorObj = error as { message?: string; status?: number; response?: { status?: number } };\n const errorMessage = errorObj.message || '';\n const status = errorObj.status || errorObj.response?.status;\n\n return (\n status === 401 ||\n errorMessage.includes('Authentication required') ||\n errorMessage.includes('Invalid or missing authorization header')\n );\n}\n\n/**\n * Wraps an API call with authentication error handling.\n * If an authentication error occurs, it can optionally attempt to sync the session and retry.\n *\n * @param apiCall - The API call function to execute\n * @param options - Optional error handling configuration\n * @returns The result of the API call\n * @throws {AuthenticationFailedError} If authentication fails and cannot be recovered\n * @throws {Error} If the API call fails for non-auth reasons\n *\n * @example\n * ```ts\n * // Simple usage:\n * const result = await withAuthErrorHandling(\n * () => oxyServices.updateProfile(updates)\n * );\n *\n * // With retry on auth failure:\n * const result = await withAuthErrorHandling(\n * () => oxyServices.updateProfile(updates),\n * { syncSession, activeSessionId, oxyServices }\n * );\n * ```\n */\nexport async function withAuthErrorHandling<T>(\n apiCall: () => Promise<T>,\n options?: HandleApiErrorOptions\n): Promise<T> {\n try {\n return await apiCall();\n } catch (error) {\n if (!isAuthenticationError(error)) {\n throw error;\n }\n\n // If we have sync capabilities, try to recover\n if (options?.syncSession && options?.activeSessionId && options?.oxyServices) {\n try {\n await options.syncSession();\n await options.oxyServices.getTokenBySession(options.activeSessionId);\n // Retry the API call after refreshing token\n return await apiCall();\n } catch {\n throw new AuthenticationFailedError();\n }\n }\n\n throw new AuthenticationFailedError();\n }\n}\n\n/**\n * Combines token validation and auth error handling for a complete authenticated API call.\n * This is the recommended helper for most authenticated API operations.\n *\n * @param oxyServices - The OxyServices instance\n * @param activeSessionId - The active session ID\n * @param apiCall - The API call function to execute\n * @param syncSession - Optional callback to sync session on auth failure\n * @returns The result of the API call\n *\n * @example\n * ```ts\n * return await authenticatedApiCall(\n * oxyServices,\n * activeSessionId,\n * () => oxyServices.updateProfile(updates)\n * );\n * ```\n */\nexport async function authenticatedApiCall<T>(\n oxyServices: OxyServices,\n activeSessionId: string | null | undefined,\n apiCall: () => Promise<T>,\n syncSession?: () => Promise<unknown>\n): Promise<T> {\n await ensureValidToken(oxyServices, activeSessionId);\n\n return withAuthErrorHandling(apiCall, {\n syncSession,\n activeSessionId,\n oxyServices,\n });\n}\n","import type { OxyServices } from '../../core';\nimport type { User } from '../../models/interfaces';\nimport { useAccountStore } from '../stores/accountStore';\nimport { useAuthStore } from '../stores/authStore';\nimport { QueryClient } from '@tanstack/react-query';\nimport { queryKeys, invalidateUserQueries, invalidateAccountQueries } from '../hooks/queries/queryKeys';\nimport { authenticatedApiCall } from './authHelpers';\n\n/**\n * Updates file visibility to public for avatar use.\n * Handles errors gracefully, only logging non-404 errors.\n * \n * @param fileId - The file ID to update visibility for\n * @param oxyServices - OxyServices instance\n * @param contextName - Optional context name for logging\n * @returns Promise that resolves when visibility is updated (or skipped)\n */\nexport async function updateAvatarVisibility(\n fileId: string | undefined,\n oxyServices: OxyServices,\n contextName: string = 'AvatarUtils'\n): Promise<void> {\n // Skip if temporary asset ID or no file ID\n if (!fileId || fileId.startsWith('temp-')) {\n return;\n }\n\n try {\n await oxyServices.assetUpdateVisibility(fileId, 'public');\n // Visibility update is logged by the API\n } catch (visError: any) {\n // Silently handle errors - 404 means asset doesn't exist yet (which is OK)\n // Other errors are logged by the API, so no need to log here\n // Function continues gracefully regardless of visibility update success\n }\n}\n\n/**\n * Refreshes avatar in accountStore with cache-busted URL to force image reload.\n * \n * @param sessionId - The session ID for the account to update\n * @param avatarFileId - The new avatar file ID\n * @param oxyServices - OxyServices instance to generate download URL\n */\nexport function refreshAvatarInStore(\n sessionId: string,\n avatarFileId: string,\n oxyServices: OxyServices\n): void {\n const { updateAccount } = useAccountStore.getState();\n const cacheBustedUrl = oxyServices.getFileDownloadUrl(avatarFileId, 'thumb') + `?t=${Date.now()}`;\n updateAccount(sessionId, {\n avatar: avatarFileId,\n avatarUrl: cacheBustedUrl,\n });\n}\n\n/**\n * Updates user profile with avatar and handles all side effects (query invalidation, accountStore update).\n * This function can be used from within OxyContext provider without requiring useOxy hook.\n *\n * @param updates - Profile updates including avatar\n * @param oxyServices - OxyServices instance\n * @param activeSessionId - Active session ID\n * @param queryClient - TanStack Query client\n * @param syncSession - Optional function to sync session/refresh token when auth errors occur\n * @returns Promise that resolves with updated user data\n */\nexport async function updateProfileWithAvatar(\n updates: Partial<User>,\n oxyServices: OxyServices,\n activeSessionId: string | null,\n queryClient: QueryClient,\n syncSession?: () => Promise<User>\n): Promise<User> {\n const data = await authenticatedApiCall<User>(\n oxyServices,\n activeSessionId,\n () => oxyServices.updateProfile(updates),\n syncSession\n );\n\n // Update cache with server response\n queryClient.setQueryData(queryKeys.accounts.current(), data);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);\n }\n\n // Update authStore so frontend components see the changes immediately\n useAuthStore.getState().setUser(data);\n\n // If avatar was updated, refresh accountStore with cache-busted URL\n if (updates.avatar && activeSessionId) {\n refreshAvatarInStore(activeSessionId, updates.avatar, oxyServices);\n }\n\n // Invalidate all related queries to refresh everywhere\n invalidateUserQueries(queryClient);\n invalidateAccountQueries(queryClient);\n\n return data;\n}\n\n","/**\n * Web SSO Hook\n *\n * Handles cross-domain SSO for web apps using FedCM (Federated Credential Management).\n *\n * FedCM is the modern, privacy-preserving standard for cross-domain identity federation.\n * It works across completely different TLDs (alia.onl, mention.earth, homiio.com, etc.)\n * without relying on third-party cookies.\n *\n * For browsers without FedCM support, users will need to click a sign-in button\n * which triggers a popup-based authentication flow.\n *\n * This is called automatically by OxyContext on web platforms.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport type { OxyServices } from '../../core/OxyServices';\nimport type { SessionLoginResponse } from '../../models/session';\n\ninterface UseWebSSOOptions {\n oxyServices: OxyServices;\n onSessionFound: (session: SessionLoginResponse) => Promise<void>;\n onSSOUnavailable?: () => void;\n onError?: (error: Error) => void;\n enabled?: boolean;\n}\n\ninterface UseWebSSOResult {\n /** Manually trigger SSO check */\n checkSSO: () => Promise<SessionLoginResponse | null>;\n /** Trigger interactive FedCM sign-in (shows browser UI) */\n signInWithFedCM: () => Promise<SessionLoginResponse | null>;\n /** Whether SSO check is in progress */\n isChecking: boolean;\n /** Whether FedCM is supported in this browser */\n isFedCMSupported: boolean;\n}\n\n/**\n * Check if we're running in a web browser environment (not React Native)\n */\nfunction isWebBrowser(): boolean {\n return typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n typeof document.documentElement !== 'undefined';\n}\n\n/**\n * Check if we're on the identity provider domain (where FedCM would authenticate against itself)\n * Only auth.oxy.so is the IdP - accounts.oxy.so is a client app like any other\n */\nfunction isIdentityProvider(): boolean {\n if (!isWebBrowser()) return false;\n const hostname = window.location.hostname;\n return hostname === 'auth.oxy.so';\n}\n\n/**\n * Hook for automatic cross-domain web SSO\n *\n * Uses FedCM (Federated Credential Management) - the modern browser-native\n * identity federation API. This is the same technology that powers\n * Google's cross-domain SSO (YouTube, Gmail, Maps, etc.).\n *\n * Key benefits:\n * - Works across different TLDs (alia.onl ↔ mention.earth ↔ homiio.com)\n * - No third-party cookies required\n * - Privacy-preserving (browser mediates identity, IdP can't track)\n * - Automatic silent sign-in after initial authentication\n *\n * For browsers without FedCM (Firefox, older browsers), automatic SSO\n * is not possible. Users will see a sign-in button instead.\n */\nexport function useWebSSO({\n oxyServices,\n onSessionFound,\n onSSOUnavailable,\n onError,\n enabled = true,\n}: UseWebSSOOptions): UseWebSSOResult {\n const isCheckingRef = useRef(false);\n const hasCheckedRef = useRef(false);\n\n // Check FedCM support once\n const fedCMSupported = isWebBrowser() && (oxyServices as any).isFedCMSupported?.();\n\n const checkSSO = useCallback(async (): Promise<SessionLoginResponse | null> => {\n if (!isWebBrowser() || isCheckingRef.current) {\n return null;\n }\n\n // Don't use FedCM on the auth domain itself - it would authenticate against itself\n if (isIdentityProvider()) {\n onSSOUnavailable?.();\n return null;\n }\n\n // FedCM is the only reliable cross-domain SSO mechanism\n if (!fedCMSupported) {\n onSSOUnavailable?.();\n return null;\n }\n\n isCheckingRef.current = true;\n\n try {\n const session = await (oxyServices as any).silentSignInWithFedCM?.();\n\n if (session) {\n await onSessionFound(session);\n return session;\n }\n\n onSSOUnavailable?.();\n return null;\n } catch (error) {\n onSSOUnavailable?.();\n onError?.(error instanceof Error ? error : new Error(String(error)));\n return null;\n } finally {\n isCheckingRef.current = false;\n }\n }, [oxyServices, onSessionFound, onSSOUnavailable, onError, fedCMSupported]);\n\n /**\n * Trigger interactive FedCM sign-in\n * This shows the browser's native \"Sign in with Oxy\" prompt.\n * Use this when silent mediation fails (user hasn't previously consented).\n */\n const signInWithFedCM = useCallback(async (): Promise<SessionLoginResponse | null> => {\n if (!isWebBrowser() || isCheckingRef.current) {\n return null;\n }\n\n if (!fedCMSupported) {\n onError?.(new Error('FedCM is not supported in this browser'));\n return null;\n }\n\n isCheckingRef.current = true;\n\n try {\n const session = await (oxyServices as any).signInWithFedCM?.();\n\n if (session) {\n await onSessionFound(session);\n return session;\n }\n\n return null;\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(String(error)));\n return null;\n } finally {\n isCheckingRef.current = false;\n }\n }, [oxyServices, onSessionFound, onError, fedCMSupported]);\n\n // Auto-check SSO on mount (web only, FedCM only, not on auth domain)\n useEffect(() => {\n if (!enabled || !isWebBrowser() || hasCheckedRef.current || isIdentityProvider()) {\n if (isIdentityProvider()) {\n onSSOUnavailable?.();\n }\n return;\n }\n\n hasCheckedRef.current = true;\n\n if (fedCMSupported) {\n checkSSO();\n } else {\n onSSOUnavailable?.();\n }\n }, [enabled, checkSSO, fedCMSupported, onSSOUnavailable]);\n\n return {\n checkSSO,\n signInWithFedCM,\n isChecking: isCheckingRef.current,\n isFedCMSupported: fedCMSupported,\n };\n}\n\nexport { isWebBrowser };\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { OxyServices } from '../../core';\nimport type { User, ApiError } from '../../models/interfaces';\nimport { KeyManager } from '../../crypto/keyManager';\nimport type { ClientSession } from '../../models/session';\nimport { toast } from '../../lib/sonner';\nimport { useAuthStore, type AuthState } from '../stores/authStore';\nimport { useShallow } from 'zustand/react/shallow';\nimport { useSessionSocket } from '../hooks/useSessionSocket';\nimport type { UseFollowHook } from '../hooks/useFollow.types';\nimport { useLanguageManagement } from '../hooks/useLanguageManagement';\nimport { useSessionManagement } from '../hooks/useSessionManagement';\nimport { useAuthOperations } from './hooks/useAuthOperations';\nimport { useDeviceManagement } from '../hooks/useDeviceManagement';\nimport { getStorageKeys, createPlatformStorage, type StorageInterface } from '../utils/storageHelpers';\nimport { isInvalidSessionError, isTimeoutOrNetworkError } from '../utils/errorHandlers';\nimport type { RouteName } from '../navigation/routes';\nimport { showBottomSheet as globalShowBottomSheet } from '../navigation/bottomSheetManager';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { clearQueryCache } from '../hooks/queryClient';\nimport { translate } from '../../i18n';\nimport { updateAvatarVisibility, updateProfileWithAvatar } from '../utils/avatarUtils';\nimport { useAccountStore } from '../stores/accountStore';\nimport { logger as loggerUtil } from '../../utils/loggerUtils';\nimport { useWebSSO, isWebBrowser } from '../hooks/useWebSSO';\n\nexport interface OxyContextState {\n user: User | null;\n sessions: ClientSession[];\n activeSessionId: string | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n isTokenReady: boolean;\n isStorageReady: boolean;\n error: string | null;\n currentLanguage: string;\n currentLanguageMetadata: ReturnType<typeof useLanguageManagement>['metadata'];\n currentLanguageName: string;\n currentNativeLanguageName: string;\n\n // Identity (cryptographic key pair)\n hasIdentity: () => Promise<boolean>;\n getPublicKey: () => Promise<string | null>;\n\n // Authentication\n signIn: (publicKey: string, deviceName?: string) => Promise<User>;\n\n /**\n * Handle session from popup authentication\n * Updates auth state, persists session to storage\n */\n handlePopupSession: (session: {\n sessionId: string;\n accessToken?: string;\n expiresAt?: string;\n user: User;\n deviceId?: string;\n }) => Promise<void>;\n\n // Session management\n logout: (targetSessionId?: string) => Promise<void>;\n logoutAll: () => Promise<void>;\n switchSession: (sessionId: string) => Promise<void>;\n removeSession: (sessionId: string) => Promise<void>;\n refreshSessions: () => Promise<void>;\n setLanguage: (languageId: string) => Promise<void>;\n getDeviceSessions: () => Promise<\n Array<{\n sessionId: string;\n deviceId: string;\n deviceName?: string;\n lastActive?: string;\n expiresAt?: string;\n }>\n >;\n logoutAllDeviceSessions: () => Promise<void>;\n updateDeviceName: (deviceName: string) => Promise<void>;\n clearSessionState: () => Promise<void>;\n clearAllAccountData: () => Promise<void>;\n oxyServices: OxyServices;\n useFollow?: UseFollowHook;\n showBottomSheet?: (screenOrConfig: RouteName | { screen: RouteName; props?: Record<string, unknown> }) => void;\n openAvatarPicker: () => void;\n}\n\nconst OxyContext = createContext<OxyContextState | null>(null);\n\nexport interface OxyContextProviderProps {\n children: ReactNode;\n oxyServices?: OxyServices;\n baseURL?: string;\n authWebUrl?: string;\n authRedirectUri?: string;\n storageKeyPrefix?: string;\n onAuthStateChange?: (user: User | null) => void;\n onError?: (error: ApiError) => void;\n}\n\nlet cachedUseFollowHook: UseFollowHook | null = null;\n\nconst loadUseFollowHook = (): UseFollowHook => {\n if (cachedUseFollowHook) {\n return cachedUseFollowHook;\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { useFollow } = require('../hooks/useFollow');\n cachedUseFollowHook = useFollow as UseFollowHook;\n return cachedUseFollowHook;\n } catch (error) {\n if (__DEV__) {\n loggerUtil.warn(\n 'useFollow hook is not available. Please import useFollow from @oxyhq/services directly.',\n { component: 'OxyContext', method: 'loadUseFollowHook' },\n error\n );\n }\n\n const fallback: UseFollowHook = () => {\n throw new Error('useFollow hook is only available in the UI bundle. Import it from @oxyhq/services.');\n };\n\n cachedUseFollowHook = fallback;\n return cachedUseFollowHook;\n }\n};\n\nexport const OxyProvider: React.FC<OxyContextProviderProps> = ({\n children,\n oxyServices: providedOxyServices,\n baseURL,\n authWebUrl,\n authRedirectUri,\n storageKeyPrefix = 'oxy_session',\n onAuthStateChange,\n onError,\n}) => {\n const oxyServicesRef = useRef<OxyServices | null>(null);\n\n if (!oxyServicesRef.current) {\n if (providedOxyServices) {\n oxyServicesRef.current = providedOxyServices;\n } else if (baseURL) {\n oxyServicesRef.current = new OxyServices({\n baseURL,\n authWebUrl,\n authRedirectUri,\n });\n } else {\n throw new Error('Either oxyServices or baseURL must be provided to OxyContextProvider');\n }\n }\n\n const oxyServices = oxyServicesRef.current;\n\n const {\n user,\n isAuthenticated,\n isLoading,\n error,\n loginSuccess,\n loginFailure,\n logoutStore,\n } = useAuthStore(\n useShallow((state: AuthState) => ({\n user: state.user,\n isAuthenticated: state.isAuthenticated,\n isLoading: state.isLoading,\n error: state.error,\n loginSuccess: state.loginSuccess,\n loginFailure: state.loginFailure,\n logoutStore: state.logout,\n })),\n );\n\n const [tokenReady, setTokenReady] = useState(true);\n const [initialized, setInitialized] = useState(false);\n const setAuthState = useAuthStore.setState;\n\n const logger = useCallback((message: string, err?: unknown) => {\n if (__DEV__) {\n console.warn(`[OxyContext] ${message}`, err);\n }\n }, []);\n\n const storageKeys = useMemo(() => getStorageKeys(storageKeyPrefix), [storageKeyPrefix]);\n\n // Simple storage initialization - no complex hook needed\n const storageRef = useRef<StorageInterface | null>(null);\n const [storage, setStorage] = useState<StorageInterface | null>(null);\n\n useEffect(() => {\n let mounted = true;\n createPlatformStorage()\n .then((storageInstance) => {\n if (mounted) {\n storageRef.current = storageInstance;\n setStorage(storageInstance);\n }\n })\n .catch((err) => {\n if (mounted) {\n logger('Failed to initialize storage', err);\n onError?.({\n message: 'Failed to initialize storage',\n code: 'STORAGE_INIT_ERROR',\n status: 500,\n });\n }\n });\n\n return () => {\n mounted = false;\n };\n }, [logger, onError]);\n\n\n // Offline queuing is now handled by TanStack Query mutations\n // No need for custom offline queue\n\n const {\n currentLanguage,\n metadata: currentLanguageMetadata,\n languageName: currentLanguageName,\n nativeLanguageName: currentNativeLanguageName,\n setLanguage,\n applyLanguagePreference,\n } = useLanguageManagement({\n storage,\n languageKey: storageKeys.language,\n onError,\n logger,\n });\n\n const queryClient = useQueryClient();\n\n const {\n sessions,\n activeSessionId,\n setActiveSessionId,\n updateSessions,\n switchSession,\n refreshSessions,\n clearSessionState,\n saveActiveSessionId,\n trackRemovedSession,\n } = useSessionManagement({\n oxyServices,\n storage,\n storageKeyPrefix,\n loginSuccess,\n logoutStore,\n applyLanguagePreference,\n onAuthStateChange,\n onError,\n setAuthError: (message) => setAuthState({ error: message }),\n logger,\n setTokenReady,\n queryClient,\n });\n\n const {\n signIn,\n logout,\n logoutAll,\n } = useAuthOperations({\n oxyServices,\n storage,\n sessions,\n activeSessionId,\n setActiveSessionId,\n updateSessions,\n saveActiveSessionId,\n clearSessionState,\n switchSession,\n applyLanguagePreference,\n onAuthStateChange,\n onError,\n loginSuccess,\n loginFailure,\n logoutStore,\n setAuthState,\n logger,\n });\n\n // Clear all account data (sessions, cache, etc.)\n const clearAllAccountData = useCallback(async (): Promise<void> => {\n // Clear TanStack Query cache (in-memory)\n queryClient.clear();\n\n // Clear persisted query cache\n if (storage) {\n try {\n await clearQueryCache(storage);\n } catch (error) {\n logger('Failed to clear persisted query cache', error);\n }\n }\n\n // Clear session state (sessions, activeSessionId, storage)\n await clearSessionState();\n\n // Reset account store\n useAccountStore.getState().reset();\n\n // Clear HTTP service cache\n oxyServices.clearCache();\n }, [queryClient, storage, clearSessionState, logger, oxyServices]);\n\n const { getDeviceSessions, logoutAllDeviceSessions, updateDeviceName } = useDeviceManagement({\n oxyServices,\n activeSessionId,\n onError,\n clearSessionState,\n logger,\n });\n\n const useFollowHook = loadUseFollowHook();\n\n const restoreSessionsFromStorage = useCallback(async (): Promise<void> => {\n if (!storage) {\n return;\n }\n\n setTokenReady(false);\n\n try {\n const storedSessionIdsJson = await storage.getItem(storageKeys.sessionIds);\n const storedSessionIds: string[] = storedSessionIdsJson ? JSON.parse(storedSessionIdsJson) : [];\n const storedActiveSessionId = await storage.getItem(storageKeys.activeSessionId);\n\n const validSessions: ClientSession[] = [];\n\n if (storedSessionIds.length > 0) {\n for (const sessionId of storedSessionIds) {\n try {\n const validation = await oxyServices.validateSession(sessionId, { useHeaderValidation: true });\n if (validation?.valid && validation.user) {\n const now = new Date();\n validSessions.push({\n sessionId,\n deviceId: '',\n expiresAt: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n lastActive: now.toISOString(),\n userId: validation.user.id?.toString() ?? '',\n isCurrent: sessionId === storedActiveSessionId,\n });\n }\n } catch (validationError) {\n // Silently handle expected errors (invalid sessions, timeouts, network issues) during restoration\n // Only log unexpected errors\n if (!isInvalidSessionError(validationError) && !isTimeoutOrNetworkError(validationError)) {\n logger('Session validation failed during init', validationError);\n } else if (__DEV__ && isTimeoutOrNetworkError(validationError)) {\n // Only log timeouts in dev mode for debugging\n loggerUtil.debug('Session validation timeout (expected when offline)', { component: 'OxyContext', method: 'restoreSessionsFromStorage' }, validationError as unknown);\n }\n }\n }\n\n if (validSessions.length > 0) {\n updateSessions(validSessions, { merge: false });\n }\n }\n\n if (storedActiveSessionId) {\n try {\n await switchSession(storedActiveSessionId);\n } catch (switchError) {\n // Silently handle expected errors (invalid sessions, timeouts, network issues)\n if (isInvalidSessionError(switchError)) {\n await storage.removeItem(storageKeys.activeSessionId);\n updateSessions(\n validSessions.filter((session) => session.sessionId !== storedActiveSessionId),\n { merge: false },\n );\n // Don't log expected session errors during restoration\n } else if (isTimeoutOrNetworkError(switchError)) {\n // Timeout/network error - non-critical, don't block\n if (__DEV__) {\n loggerUtil.debug('Active session validation timeout (expected when offline)', { component: 'OxyContext', method: 'restoreSessionsFromStorage' }, switchError as unknown);\n }\n } else {\n // Only log unexpected errors\n logger('Active session validation error', switchError);\n }\n }\n }\n } catch (error) {\n if (__DEV__) {\n loggerUtil.error('Auth init error', error instanceof Error ? error : new Error(String(error)), { component: 'OxyContext', method: 'restoreSessionsFromStorage' });\n }\n await clearSessionState();\n } finally {\n setTokenReady(true);\n }\n }, [\n clearSessionState,\n logger,\n oxyServices,\n storage,\n storageKeys.activeSessionId,\n storageKeys.sessionIds,\n switchSession,\n updateSessions,\n ]);\n\n useEffect(() => {\n if (!storage || initialized) {\n return;\n }\n\n setInitialized(true);\n void restoreSessionsFromStorage();\n }, [restoreSessionsFromStorage, storage, initialized]);\n\n // Web SSO: Automatically check for cross-domain session on web platforms\n // Also used for popup auth - updates all state and persists session\n const handleWebSSOSession = useCallback(async (session: any) => {\n if (!session?.user || !session?.sessionId) {\n if (__DEV__) {\n loggerUtil.warn('handleWebSSOSession: Invalid session', { component: 'OxyContext' });\n }\n return;\n }\n\n // Update sessions state\n const clientSession = {\n sessionId: session.sessionId,\n deviceId: session.deviceId || '',\n expiresAt: session.expiresAt || new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n lastActive: new Date().toISOString(),\n userId: session.user.id?.toString() ?? '',\n isCurrent: true,\n };\n\n updateSessions([clientSession], { merge: true });\n setActiveSessionId(session.sessionId);\n loginSuccess(session.user);\n onAuthStateChange?.(session.user);\n\n // Persist to storage\n if (storage) {\n await storage.setItem(storageKeys.activeSessionId, session.sessionId);\n const existingIds = await storage.getItem(storageKeys.sessionIds);\n const sessionIds = existingIds ? JSON.parse(existingIds) : [];\n if (!sessionIds.includes(session.sessionId)) {\n sessionIds.push(session.sessionId);\n await storage.setItem(storageKeys.sessionIds, JSON.stringify(sessionIds));\n }\n }\n }, [updateSessions, setActiveSessionId, loginSuccess, onAuthStateChange, storage, storageKeys]);\n\n // Enable web SSO only after local storage check completes and no user found\n const shouldTryWebSSO = isWebBrowser() && tokenReady && !user && initialized;\n\n useWebSSO({\n oxyServices,\n onSessionFound: handleWebSSOSession,\n onError: (error) => {\n if (__DEV__) {\n loggerUtil.debug('Web SSO check failed (non-critical)', { component: 'OxyContext' }, error);\n }\n },\n enabled: shouldTryWebSSO,\n });\n\n // IdP session validation via lightweight iframe check\n // When user returns to tab, verify auth.oxy.so still has their session\n // If session is gone (cleared/logged out), clear local session too\n const lastIdPCheckRef = useRef<number>(0);\n\n useEffect(() => {\n if (!isWebBrowser() || !user || !initialized) return;\n\n const checkIdPSession = () => {\n // Debounce: check at most once per 30 seconds\n const now = Date.now();\n if (now - lastIdPCheckRef.current < 30000) return;\n lastIdPCheckRef.current = now;\n\n // Load hidden iframe to check IdP session via postMessage\n const iframe = document.createElement('iframe');\n iframe.style.cssText = 'display:none;width:0;height:0;border:0';\n iframe.src = 'https://auth.oxy.so/api/auth/session-check';\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n window.removeEventListener('message', handleMessage);\n iframe.remove();\n };\n\n const handleMessage = async (event: MessageEvent) => {\n if (event.origin !== 'https://auth.oxy.so') return;\n if (event.data?.type !== 'oxy-session-check') return;\n cleanup();\n\n if (!event.data.hasSession) {\n toast.info('Your session has ended. Please sign in again.');\n await clearSessionState();\n }\n };\n\n window.addEventListener('message', handleMessage);\n document.body.appendChild(iframe);\n setTimeout(cleanup, 5000); // Timeout after 5s\n };\n\n const handleVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n checkIdPSession();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () => document.removeEventListener('visibilitychange', handleVisibilityChange);\n }, [user, initialized, clearSessionState]);\n\n const activeSession = activeSessionId\n ? sessions.find((session) => session.sessionId === activeSessionId)\n : undefined;\n const currentDeviceId = activeSession?.deviceId ?? null;\n\n const userId = user?.id;\n\n const refreshSessionsWithUser = useCallback(\n () => refreshSessions(userId),\n [refreshSessions, userId],\n );\n\n const handleSessionRemoved = useCallback(\n (sessionId: string) => {\n trackRemovedSession(sessionId);\n },\n [trackRemovedSession],\n );\n\n const handleRemoteSignOut = useCallback(() => {\n toast.info('You have been signed out remotely.');\n logout().catch((remoteError) => logger('Failed to process remote sign out', remoteError));\n }, [logger, logout]);\n\n useSessionSocket({\n userId,\n activeSessionId,\n currentDeviceId,\n refreshSessions: refreshSessionsWithUser,\n logout,\n clearSessionState,\n baseURL: oxyServices.getBaseURL(),\n onRemoteSignOut: handleRemoteSignOut,\n onSessionRemoved: handleSessionRemoved,\n });\n\n const switchSessionForContext = useCallback(\n async (sessionId: string): Promise<void> => {\n await switchSession(sessionId);\n },\n [switchSession],\n );\n\n // Identity management wrappers (delegate to KeyManager)\n const hasIdentity = useCallback(async (): Promise<boolean> => {\n return KeyManager.hasIdentity();\n }, []);\n\n const getPublicKey = useCallback(async (): Promise<string | null> => {\n return KeyManager.getPublicKey();\n }, []);\n\n // Create showBottomSheet function that uses the global function\n const showBottomSheetForContext = useCallback(\n (screenOrConfig: RouteName | { screen: RouteName; props?: Record<string, unknown> }) => {\n globalShowBottomSheet(screenOrConfig);\n },\n [],\n );\n\n // Create openAvatarPicker function\n const openAvatarPicker = useCallback(() => {\n showBottomSheetForContext({\n screen: 'FileManagement' as RouteName,\n props: {\n selectMode: true,\n multiSelect: false,\n disabledMimeTypes: ['video/', 'audio/', 'application/pdf'],\n afterSelect: 'none', // Don't navigate away - stay on current screen\n onSelect: async (file: any) => {\n if (!file.contentType.startsWith('image/')) {\n toast.error(translate(currentLanguage, 'editProfile.toasts.selectImage') || 'Please select an image file');\n return;\n }\n try {\n // Update file visibility to public for avatar\n await updateAvatarVisibility(file.id, oxyServices, 'OxyContext');\n\n // Update user profile (handles query invalidation and accountStore update)\n await updateProfileWithAvatar(\n { avatar: file.id },\n oxyServices,\n activeSessionId,\n queryClient\n );\n\n toast.success(translate(currentLanguage, 'editProfile.toasts.avatarUpdated') || 'Avatar updated');\n } catch (e: any) {\n toast.error(e.message || translate(currentLanguage, 'editProfile.toasts.updateAvatarFailed') || 'Failed to update avatar');\n }\n },\n },\n });\n }, [oxyServices, currentLanguage, showBottomSheetForContext, activeSessionId, queryClient]);\n\n const contextValue: OxyContextState = useMemo(() => ({\n user,\n sessions,\n activeSessionId,\n isAuthenticated,\n isLoading,\n isTokenReady: tokenReady,\n isStorageReady: storage !== null,\n error,\n currentLanguage,\n currentLanguageMetadata,\n currentLanguageName,\n currentNativeLanguageName,\n hasIdentity,\n getPublicKey,\n signIn,\n handlePopupSession: handleWebSSOSession,\n logout,\n logoutAll,\n switchSession: switchSessionForContext,\n removeSession: logout,\n refreshSessions: refreshSessionsWithUser,\n setLanguage,\n getDeviceSessions,\n logoutAllDeviceSessions,\n updateDeviceName,\n clearSessionState,\n clearAllAccountData,\n oxyServices,\n useFollow: useFollowHook,\n showBottomSheet: showBottomSheetForContext,\n openAvatarPicker,\n }), [\n activeSessionId,\n signIn,\n handleWebSSOSession,\n currentLanguage,\n currentLanguageMetadata,\n currentLanguageName,\n currentNativeLanguageName,\n error,\n getDeviceSessions,\n getPublicKey,\n hasIdentity,\n isAuthenticated,\n isLoading,\n logout,\n logoutAll,\n logoutAllDeviceSessions,\n oxyServices,\n refreshSessionsWithUser,\n sessions,\n setLanguage,\n storage,\n switchSessionForContext,\n tokenReady,\n updateDeviceName,\n clearAllAccountData,\n useFollowHook,\n user,\n showBottomSheetForContext,\n openAvatarPicker,\n ]);\n\n return (\n <OxyContext.Provider value={contextValue}>\n {children}\n </OxyContext.Provider>\n );\n};\n\nexport const OxyContextProvider = OxyProvider;\n\nexport const useOxy = (): OxyContextState => {\n const context = useContext(OxyContext);\n if (!context) {\n throw new Error('useOxy must be used within an OxyContextProvider');\n }\n return context;\n};\n\nexport default OxyContext;\n\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { ApiError, User } from '../../models/interfaces';\nimport {\n getLanguageMetadata,\n getLanguageName,\n getNativeLanguageName,\n normalizeLanguageCode,\n type LanguageMetadata,\n} from '../../utils/languageUtils';\nimport type { StorageInterface } from '../utils/storageHelpers';\nimport { extractErrorMessage } from '../utils/errorHandlers';\n\nexport interface UseLanguageManagementOptions {\n storage: StorageInterface | null;\n languageKey: string;\n onError?: (error: ApiError) => void;\n logger?: (message: string, error?: unknown) => void;\n}\n\nexport interface UseLanguageManagementResult {\n currentLanguage: string;\n metadata: LanguageMetadata | null;\n languageName: string;\n nativeLanguageName: string;\n setLanguage: (languageId: string) => Promise<void>;\n applyLanguagePreference: (user: User | null) => Promise<void>;\n hydrateLanguage: () => Promise<void>;\n}\n\nconst DEFAULT_LANGUAGE = 'en-US';\n\n/**\n * Manage UI language state, persistence, and metadata derivation.\n *\n * @param options - Configuration for storage access and error reporting\n */\nexport const useLanguageManagement = ({\n storage,\n languageKey,\n onError,\n logger,\n}: UseLanguageManagementOptions): UseLanguageManagementResult => {\n const [currentLanguage, setCurrentLanguage] = useState<string>(DEFAULT_LANGUAGE);\n\n const loadLanguageFromStorage = useCallback(async (): Promise<void> => {\n if (!storage) {\n return;\n }\n\n try {\n const savedLanguageRaw = await storage.getItem(languageKey);\n const normalized = normalizeLanguageCode(savedLanguageRaw) || savedLanguageRaw;\n if (normalized) {\n setCurrentLanguage(normalized);\n }\n } catch (error) {\n const message = extractErrorMessage(error, 'Failed to load language preference');\n onError?.({\n message,\n code: 'LANGUAGE_LOAD_ERROR',\n status: 500,\n });\n if (logger) {\n logger(message, error);\n } else if (__DEV__) {\n console.warn('Failed to load language preference:', error);\n }\n }\n }, [languageKey, logger, onError, storage]);\n\n useEffect(() => {\n loadLanguageFromStorage().catch((error) => {\n if (logger) {\n logger('Unexpected error loading language', error);\n }\n });\n }, [loadLanguageFromStorage, logger]);\n\n const setLanguage = useCallback(\n async (languageId: string): Promise<void> => {\n if (!storage) {\n throw new Error('Storage not initialized');\n }\n\n const normalized = normalizeLanguageCode(languageId) || languageId;\n\n try {\n await storage.setItem(languageKey, normalized);\n setCurrentLanguage(normalized);\n } catch (error) {\n const message = extractErrorMessage(error, 'Failed to save language preference');\n onError?.({\n message,\n code: 'LANGUAGE_SAVE_ERROR',\n status: 500,\n });\n if (logger) {\n logger(message, error);\n } else if (__DEV__) {\n console.warn('Failed to save language preference:', error);\n }\n throw error instanceof Error ? error : new Error(message);\n }\n },\n [languageKey, logger, onError, storage],\n );\n\n const applyLanguagePreference = useCallback(\n async (user: User | null): Promise<void> => {\n if (!storage || !user) {\n return;\n }\n\n const userLanguage = (user as Record<string, unknown>)?.language as string | undefined;\n if (!userLanguage) {\n return;\n }\n\n try {\n const normalized = normalizeLanguageCode(userLanguage) || userLanguage;\n await storage.setItem(languageKey, normalized);\n setCurrentLanguage(normalized);\n } catch (error) {\n if (logger) {\n logger('Failed to apply server language preference', error);\n } else if (__DEV__) {\n console.warn('Failed to apply server language preference', error);\n }\n }\n },\n [languageKey, logger, storage],\n );\n\n const metadata = useMemo(() => getLanguageMetadata(currentLanguage), [currentLanguage]);\n const languageName = useMemo(() => getLanguageName(currentLanguage), [currentLanguage]);\n const nativeLanguageName = useMemo(\n () => getNativeLanguageName(currentLanguage),\n [currentLanguage],\n );\n\n return {\n currentLanguage,\n metadata,\n languageName,\n nativeLanguageName,\n setLanguage,\n applyLanguagePreference,\n hydrateLanguage: loadLanguageFromStorage,\n };\n};\n\n\n","import { useCallback } from 'react';\nimport type { ApiError } from '../../models/interfaces';\nimport { DeviceManager } from '../../utils/deviceManager';\nimport type { OxyServices } from '../../core';\nimport { handleAuthError } from '../utils/errorHandlers';\n\nexport interface UseDeviceManagementOptions {\n oxyServices: OxyServices;\n activeSessionId: string | null;\n onError?: (error: ApiError) => void;\n clearSessionState: () => Promise<void>;\n logger?: (message: string, error?: unknown) => void;\n}\n\nexport interface UseDeviceManagementResult {\n getDeviceSessions: () => Promise<\n Array<{\n sessionId: string;\n deviceId: string;\n deviceName?: string;\n lastActive?: string;\n expiresAt?: string;\n }>\n >;\n logoutAllDeviceSessions: () => Promise<void>;\n updateDeviceName: (deviceName: string) => Promise<void>;\n}\n\n/**\n * Provide device session management helpers tied to the current active session.\n *\n * @param options - Device management configuration\n */\nexport const useDeviceManagement = ({\n oxyServices,\n activeSessionId,\n onError,\n clearSessionState,\n logger,\n}: UseDeviceManagementOptions): UseDeviceManagementResult => {\n const getDeviceSessions = useCallback(async (): Promise<\n Array<{\n sessionId: string;\n deviceId: string;\n deviceName?: string;\n lastActive?: string;\n expiresAt?: string;\n }>\n > => {\n if (!activeSessionId) throw new Error('No active session');\n try {\n return await oxyServices.getDeviceSessions(activeSessionId);\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: 'Failed to get device sessions',\n code: 'GET_DEVICE_SESSIONS_ERROR',\n onError,\n logger,\n });\n throw error instanceof Error ? error : new Error('Failed to get device sessions');\n }\n }, [activeSessionId, logger, onError, oxyServices]);\n\n const logoutAllDeviceSessions = useCallback(async (): Promise<void> => {\n if (!activeSessionId) throw new Error('No active session');\n\n try {\n await oxyServices.logoutAllDeviceSessions(activeSessionId);\n await clearSessionState();\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: 'Failed to logout all device sessions',\n code: 'LOGOUT_ALL_DEVICES_ERROR',\n onError,\n logger,\n });\n throw error instanceof Error ? error : new Error('Failed to logout all device sessions');\n }\n }, [activeSessionId, clearSessionState, logger, onError, oxyServices]);\n\n const updateDeviceName = useCallback(\n async (deviceName: string): Promise<void> => {\n if (!activeSessionId) throw new Error('No active session');\n\n try {\n await oxyServices.updateDeviceName(activeSessionId, deviceName);\n await DeviceManager.updateDeviceName(deviceName);\n } catch (error) {\n handleAuthError(error, {\n defaultMessage: 'Failed to update device name',\n code: 'UPDATE_DEVICE_NAME_ERROR',\n onError,\n logger,\n });\n throw error instanceof Error ? error : new Error('Failed to update device name');\n }\n },\n [activeSessionId, logger, onError, oxyServices],\n );\n\n return {\n getDeviceSessions,\n logoutAllDeviceSessions,\n updateDeviceName,\n };\n};\n\n\n","/**\n * Unified Auth Hook\n *\n * Provides a clean, standard interface for authentication across all platforms.\n * This is the recommended way to access auth state in Oxy apps.\n *\n * Usage:\n * ```tsx\n * import { useAuth } from '@oxyhq/services';\n *\n * function MyComponent() {\n * const { user, isAuthenticated, isLoading, signIn, signOut } = useAuth();\n *\n * if (isLoading) return <Loading />;\n * if (!isAuthenticated) return <SignInButton onClick={() => signIn()} />;\n * return <Welcome user={user} />;\n * }\n * ```\n *\n * Cross-domain SSO:\n * - Web: Automatic via FedCM (Chrome 108+, Safari 16.4+)\n * - Native: Automatic via shared Keychain/Account Manager\n * - Manual sign-in: signIn() opens popup (web) or auth sheet (native)\n */\n\nimport { useCallback, useState } from 'react';\nimport { useOxy } from '../context/OxyContext';\nimport type { User } from '../../models/interfaces';\nimport { isWebBrowser } from './useWebSSO';\n\nexport interface AuthState {\n /** Current authenticated user, null if not authenticated */\n user: User | null;\n\n /** Whether user is authenticated */\n isAuthenticated: boolean;\n\n /** Whether auth state is being determined (initial load) */\n isLoading: boolean;\n\n /** Whether the auth token is ready for API calls */\n isReady: boolean;\n\n /** Current error message, if any */\n error: string | null;\n}\n\nexport interface AuthActions {\n /**\n * Sign in\n * - Web: Opens popup to auth.oxy.so (no public key needed)\n * - Native: Uses cryptographic identity from keychain\n */\n signIn: (publicKey?: string) => Promise<User>;\n\n /**\n * Sign out current session\n */\n signOut: () => Promise<void>;\n\n /**\n * Sign out all sessions across all devices\n */\n signOutAll: () => Promise<void>;\n\n /**\n * Refresh auth state (re-check session validity)\n */\n refresh: () => Promise<void>;\n}\n\nexport interface UseAuthReturn extends AuthState, AuthActions {\n /** Access to full OxyServices instance for advanced usage */\n oxyServices: ReturnType<typeof useOxy>['oxyServices'];\n}\n\n/**\n * Unified auth hook for all Oxy apps\n *\n * Features:\n * - Zero config: Just wrap with OxyProvider and use\n * - Cross-platform: Same API on native and web\n * - Auto SSO: Web apps automatically check for cross-domain sessions\n * - Type-safe: Full TypeScript support\n */\nexport function useAuth(): UseAuthReturn {\n const {\n user,\n isAuthenticated,\n isLoading,\n isTokenReady,\n error,\n signIn: oxySignIn,\n handlePopupSession,\n logout,\n logoutAll,\n refreshSessions,\n oxyServices,\n hasIdentity,\n getPublicKey,\n showBottomSheet,\n } = useOxy();\n\n const signIn = useCallback(async (publicKey?: string): Promise<User> => {\n // Check if we're on the identity provider itself (auth.oxy.so)\n // Only auth.oxy.so has local login forms - accounts.oxy.so is a client app\n const isIdentityProvider = isWebBrowser() &&\n window.location.hostname === 'auth.oxy.so';\n\n // Web (not on IdP): Use popup-based authentication\n // We go straight to popup to preserve the \"user gesture\" (click event)\n // FedCM silent SSO already runs on page load via useWebSSO\n // If user is clicking \"Sign In\", they need interactive auth NOW\n if (isWebBrowser() && !publicKey && !isIdentityProvider) {\n try {\n const popupSession = await (oxyServices as any).signInWithPopup?.();\n if (popupSession?.user) {\n // Update context state with the session (this updates user, sessions, storage)\n await handlePopupSession(popupSession);\n return popupSession.user;\n }\n throw new Error('Sign-in failed. Please try again.');\n } catch (popupError) {\n if (popupError instanceof Error && popupError.message.includes('blocked')) {\n throw new Error('Popup blocked. Please allow popups for this site.');\n }\n throw popupError;\n }\n }\n\n // Native: Use cryptographic identity\n // If public key provided, use it directly\n if (publicKey) {\n return oxySignIn(publicKey);\n }\n\n // Try to get existing identity\n const hasExisting = await hasIdentity();\n\n if (hasExisting) {\n const existingKey = await getPublicKey();\n if (existingKey) {\n return oxySignIn(existingKey);\n }\n }\n\n // No identity - show auth UI\n if (showBottomSheet) {\n showBottomSheet('OxyAuth');\n // Return a promise that resolves when auth completes\n return new Promise((_, reject) => {\n reject(new Error('Please complete sign-in in the auth sheet'));\n });\n }\n\n // Web fallback: navigate to login page on auth domain\n if (isWebBrowser()) {\n const loginUrl = window.location.hostname.includes('oxy.so')\n ? '/login'\n : 'https://accounts.oxy.so/login';\n window.location.href = loginUrl;\n return new Promise(() => {}); // Never resolves, page will redirect\n }\n\n throw new Error('No authentication method available');\n }, [oxySignIn, hasIdentity, getPublicKey, showBottomSheet, oxyServices, handlePopupSession]);\n\n const signOut = useCallback(async (): Promise<void> => {\n await logout();\n }, [logout]);\n\n const signOutAll = useCallback(async (): Promise<void> => {\n await logoutAll();\n }, [logoutAll]);\n\n const refresh = useCallback(async (): Promise<void> => {\n await refreshSessions();\n }, [refreshSessions]);\n\n return {\n // State\n user,\n isAuthenticated,\n isLoading,\n isReady: isTokenReady,\n error,\n\n // Actions\n signIn,\n signOut,\n signOutAll,\n refresh,\n\n // Advanced\n oxyServices,\n };\n}\n\n// Re-export useOxy for backward compatibility and advanced usage\nexport { useOxy } from '../context/OxyContext';\n","/**\n * WebOxyProvider - Lightweight provider for pure React/Next.js apps\n *\n * Use this provider for web apps that DON'T use Expo/React Native.\n * For Expo apps (native + web), use `OxyProvider` instead - it works on all platforms.\n *\n * Features:\n * - Automatic cross-domain SSO via FedCM (Chrome 108+, Safari 16.4+, Edge 108+)\n * - No React Native dependencies\n * - Session management\n * - All useOxy/useAuth functionality\n *\n * Usage:\n * ```tsx\n * // For pure React/Next.js apps (no Expo):\n * import { WebOxyProvider, useAuth } from '@oxyhq/services';\n *\n * function App() {\n * return (\n * <WebOxyProvider baseURL=\"https://api.oxy.so\">\n * <YourApp />\n * </WebOxyProvider>\n * );\n * }\n *\n * // For Expo apps (native + web), use OxyProvider instead:\n * import { OxyProvider, useAuth } from '@oxyhq/services';\n * ```\n */\n\nimport { useEffect, useRef, useState, type FC, type ReactNode } from 'react';\nimport { OxyContextProvider } from '../context/OxyContext';\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { createQueryClient } from '../hooks/queryClient';\nimport { createPlatformStorage, type StorageInterface } from '../utils/storageHelpers';\n\nexport interface WebOxyProviderProps {\n children: ReactNode;\n baseURL: string;\n authWebUrl?: string;\n onAuthStateChange?: (user: any) => void;\n storageKeyPrefix?: string;\n queryClient?: ReturnType<typeof createQueryClient>;\n}\n\n/**\n * OxyProvider for web applications\n *\n * Features:\n * - Automatic cross-domain SSO via FedCM (browser-native identity API)\n * - Works across different TLDs (alia.onl, mention.earth, homiio.com, etc.)\n * - Session persistence in localStorage\n * - TanStack Query for data fetching\n * - No React Native dependencies\n */\nconst WebOxyProvider: FC<WebOxyProviderProps> = ({\n children,\n baseURL,\n authWebUrl,\n onAuthStateChange,\n storageKeyPrefix,\n queryClient: providedQueryClient,\n}) => {\n const storageRef = useRef<StorageInterface | null>(null);\n const queryClientRef = useRef<ReturnType<typeof createQueryClient> | null>(null);\n const [queryClient, setQueryClient] = useState<ReturnType<typeof createQueryClient> | null>(null);\n\n useEffect(() => {\n if (providedQueryClient) {\n queryClientRef.current = providedQueryClient;\n setQueryClient(providedQueryClient);\n return;\n }\n\n let mounted = true;\n createPlatformStorage()\n .then((storage) => {\n if (mounted && !queryClientRef.current) {\n storageRef.current = storage;\n const client = createQueryClient(storage);\n queryClientRef.current = client;\n setQueryClient(client);\n }\n })\n .catch(() => {\n if (mounted && !queryClientRef.current) {\n const client = createQueryClient(null);\n queryClientRef.current = client;\n setQueryClient(client);\n }\n });\n\n return () => {\n mounted = false;\n };\n }, [providedQueryClient]);\n\n // Wait for query client to be ready\n if (!queryClient) {\n return null;\n }\n\n return (\n <QueryClientProvider client={queryClient}>\n <OxyContextProvider\n baseURL={baseURL}\n authWebUrl={authWebUrl}\n storageKeyPrefix={storageKeyPrefix}\n onAuthStateChange={onAuthStateChange}\n >\n {children}\n </OxyContextProvider>\n </QueryClientProvider>\n );\n};\n\nexport default WebOxyProvider;\n","import { create } from 'zustand';\nimport { Asset, AssetUploadProgress, AssetLink } from '../../models/interfaces';\n\ninterface AssetState {\n // Asset data\n assets: Record<string, Asset>;\n uploadProgress: Record<string, AssetUploadProgress>;\n \n // Loading states\n loading: {\n uploading: boolean;\n linking: boolean;\n deleting: boolean;\n };\n \n // Error states\n errors: {\n upload?: string;\n link?: string;\n delete?: string;\n };\n \n // Actions\n setAsset: (asset: Asset) => void;\n setAssets: (assets: Asset[]) => void;\n removeAsset: (assetId: string) => void;\n \n // Upload progress actions\n setUploadProgress: (fileId: string, progress: AssetUploadProgress) => void;\n removeUploadProgress: (fileId: string) => void;\n \n // Link management\n addLink: (assetId: string, link: AssetLink) => void;\n removeLink: (assetId: string, app: string, entityType: string, entityId: string) => void;\n \n // Loading states\n setUploading: (uploading: boolean) => void;\n setLinking: (linking: boolean) => void;\n setDeleting: (deleting: boolean) => void;\n \n // Error management\n setUploadError: (error?: string) => void;\n setLinkError: (error?: string) => void;\n setDeleteError: (error?: string) => void;\n clearErrors: () => void;\n \n // Utility methods\n getAssetsByApp: (app: string) => Asset[];\n getAssetsByEntity: (app: string, entityType: string, entityId: string) => Asset[];\n getAssetUsageCount: (assetId: string) => number;\n isAssetLinked: (assetId: string, app: string, entityType: string, entityId: string) => boolean;\n \n // Reset store\n reset: () => void;\n}\n\nconst initialState = {\n assets: {},\n uploadProgress: {},\n loading: {\n uploading: false,\n linking: false,\n deleting: false,\n },\n errors: {},\n};\n\nexport const useAssetStore = create<AssetState>((set, get) => ({\n ...initialState,\n \n // Asset management\n setAsset: (asset: Asset) => {\n set((state) => ({\n assets: {\n ...state.assets,\n [asset.id]: asset,\n },\n }));\n },\n \n setAssets: (assets: Asset[]) => {\n set((state) => {\n const assetMap = assets.reduce((acc, asset) => {\n acc[asset.id] = asset;\n return acc;\n }, {} as Record<string, Asset>);\n \n return {\n assets: {\n ...state.assets,\n ...assetMap,\n },\n };\n });\n },\n \n removeAsset: (assetId: string) => {\n set((state) => {\n const { [assetId]: removed, ...rest } = state.assets;\n return { assets: rest };\n });\n },\n \n // Upload progress\n setUploadProgress: (fileId: string, progress: AssetUploadProgress) => {\n set((state) => ({\n uploadProgress: {\n ...state.uploadProgress,\n [fileId]: progress,\n },\n }));\n },\n \n removeUploadProgress: (fileId: string) => {\n set((state) => {\n const { [fileId]: removed, ...rest } = state.uploadProgress;\n return { uploadProgress: rest };\n });\n },\n \n // Link management\n addLink: (assetId: string, link: AssetLink) => {\n set((state) => {\n const asset = state.assets[assetId];\n if (!asset) return state;\n \n // Check if link already exists\n const existingLink = asset.links.find(\n (l: AssetLink) => l.app === link.app && \n l.entityType === link.entityType && \n l.entityId === link.entityId\n );\n \n if (existingLink) return state;\n \n const updatedAsset = {\n ...asset,\n links: [...asset.links, link],\n usageCount: asset.links.length + 1,\n };\n \n return {\n assets: {\n ...state.assets,\n [assetId]: updatedAsset,\n },\n };\n });\n },\n \n removeLink: (assetId: string, app: string, entityType: string, entityId: string) => {\n set((state) => {\n const asset = state.assets[assetId];\n if (!asset) return state;\n \n const filteredLinks = asset.links.filter(\n (link: AssetLink) => !(link.app === app && \n link.entityType === entityType && \n link.entityId === entityId)\n );\n \n const updatedAsset = {\n ...asset,\n links: filteredLinks,\n usageCount: filteredLinks.length,\n status: filteredLinks.length === 0 ? 'trash' as const : asset.status,\n };\n \n return {\n assets: {\n ...state.assets,\n [assetId]: updatedAsset,\n },\n };\n });\n },\n \n // Loading states\n setUploading: (uploading: boolean) => {\n set((state) => ({\n loading: { ...state.loading, uploading },\n }));\n },\n \n setLinking: (linking: boolean) => {\n set((state) => ({\n loading: { ...state.loading, linking },\n }));\n },\n \n setDeleting: (deleting: boolean) => {\n set((state) => ({\n loading: { ...state.loading, deleting },\n }));\n },\n \n // Error management\n setUploadError: (error?: string) => {\n set((state) => ({\n errors: { ...state.errors, upload: error },\n }));\n },\n \n setLinkError: (error?: string) => {\n set((state) => ({\n errors: { ...state.errors, link: error },\n }));\n },\n \n setDeleteError: (error?: string) => {\n set((state) => ({\n errors: { ...state.errors, delete: error },\n }));\n },\n \n clearErrors: () => {\n set({ errors: {} });\n },\n \n // Utility methods\n getAssetsByApp: (app: string) => {\n const { assets } = get();\n return Object.values(assets).filter((asset) =>\n asset.links.some((link: AssetLink) => link.app === app)\n );\n },\n \n getAssetsByEntity: (app: string, entityType: string, entityId: string) => {\n const { assets } = get();\n return Object.values(assets).filter((asset) =>\n asset.links.some(\n (link: AssetLink) => link.app === app && \n link.entityType === entityType && \n link.entityId === entityId\n )\n );\n },\n \n getAssetUsageCount: (assetId: string) => {\n const { assets } = get();\n const asset = assets[assetId];\n return asset ? asset.usageCount : 0;\n },\n \n isAssetLinked: (assetId: string, app: string, entityType: string, entityId: string) => {\n const { assets } = get();\n const asset = assets[assetId];\n if (!asset) return false;\n \n return asset.links.some(\n (link: AssetLink) => link.app === app && \n link.entityType === entityType && \n link.entityId === entityId\n );\n },\n \n // Reset store\n reset: () => {\n set(initialState);\n },\n}));\n\n// Selector hooks for convenience\nexport const useAssets = () => useAssetStore((state) => Object.values(state.assets));\nexport const useAsset = (assetId: string) => useAssetStore((state) => state.assets[assetId]);\nexport const useUploadProgress = () => useAssetStore((state) => state.uploadProgress);\nexport const useAssetLoading = () => useAssetStore((state) => state.loading);\nexport const useAssetErrors = () => useAssetStore((state) => state.errors);\n\n// Typed selectors for specific use cases\nexport const useAssetsByApp = (app: string) => \n useAssetStore((state) => state.getAssetsByApp(app));\n\nexport const useAssetsByEntity = (app: string, entityType: string, entityId: string) =>\n useAssetStore((state) => state.getAssetsByEntity(app, entityType, entityId));\n\nexport const useAssetUsageCount = (assetId: string) =>\n useAssetStore((state) => state.getAssetUsageCount(assetId));\n\nexport const useIsAssetLinked = (assetId: string, app: string, entityType: string, entityId: string) =>\n useAssetStore((state) => state.isAssetLinked(assetId, app, entityType, entityId));","import { useCallback } from 'react';\nimport { useAssetStore } from '../stores/assetStore';\nimport { OxyServices } from '../../core/OxyServices';\nimport { \n Asset, \n AssetLinkRequest, \n AssetUnlinkRequest, \n AssetUploadProgress \n} from '../../models/interfaces';\n\n// Create a singleton instance for the hook\nlet oxyInstance: OxyServices | null = null;\n\nexport const setOxyAssetInstance = (instance: OxyServices) => {\n oxyInstance = instance;\n};\n\n/**\n * Hook for managing assets with Zustand store integration\n */\nexport const useAssets = () => {\n const {\n assets,\n uploadProgress,\n loading,\n errors,\n setAsset,\n setAssets,\n removeAsset,\n setUploadProgress,\n removeUploadProgress,\n addLink,\n removeLink,\n setUploading,\n setLinking,\n setDeleting,\n setUploadError,\n setLinkError,\n setDeleteError,\n clearErrors,\n getAssetsByApp,\n getAssetsByEntity,\n getAssetUsageCount,\n isAssetLinked,\n reset\n } = useAssetStore();\n\n // Upload asset with progress tracking\n const upload = useCallback(async (\n file: File, \n metadata?: Record<string, any>\n ): Promise<Asset | null> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n clearErrors();\n setUploading(true);\n \n // Upload file (progress tracking simplified for now)\n const result = await oxyInstance.assetUpload(file as any, undefined, metadata);\n\n // Update progress with final status\n if (result?.file) {\n const fileId = result.file.id;\n setUploadProgress(fileId, {\n fileId,\n uploaded: file.size,\n total: file.size,\n percentage: 100,\n status: 'complete'\n });\n \n // Remove progress after a short delay\n setTimeout(() => {\n removeUploadProgress(fileId);\n }, 2000);\n }\n\n // Add asset to store\n if (result.file) {\n setAsset(result.file);\n return result.file;\n }\n \n return null;\n } catch (error: any) {\n setUploadError(error.message || 'Upload failed');\n throw error;\n } finally {\n setUploading(false);\n }\n }, [\n clearErrors, \n setUploading, \n setUploadProgress, \n removeUploadProgress, \n setAsset, \n setUploadError\n ]);\n\n // Link asset to entity\n const link = useCallback(async (\n assetId: string, \n app: string, \n entityType: string, \n entityId: string\n ): Promise<void> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n clearErrors();\n setLinking(true);\n \n // Auto-detect visibility for avatars and profile banners\n const visibility = (entityType === 'avatar' || entityType === 'profile-banner') \n ? 'public' as const\n : undefined;\n \n const result = await oxyInstance.assetLink(assetId, app, entityType, entityId, visibility);\n \n if (result.file) {\n setAsset(result.file);\n } else {\n // If API doesn't return full file, update store optimistically\n addLink(assetId, {\n app,\n entityType,\n entityId,\n createdBy: '', // Will be filled by server\n createdAt: new Date().toISOString()\n });\n }\n } catch (error: any) {\n setLinkError(error.message || 'Link failed');\n throw error;\n } finally {\n setLinking(false);\n }\n }, [clearErrors, setLinking, setAsset, addLink, setLinkError]);\n\n // Unlink asset from entity\n const unlink = useCallback(async (\n assetId: string, \n app: string, \n entityType: string, \n entityId: string\n ): Promise<void> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n clearErrors();\n setLinking(true);\n \n const result = await oxyInstance.assetUnlink(assetId, app, entityType, entityId);\n \n if (result.file) {\n setAsset(result.file);\n } else {\n // Update store optimistically\n removeLink(assetId, app, entityType, entityId);\n }\n } catch (error: any) {\n setLinkError(error.message || 'Unlink failed');\n throw error;\n } finally {\n setLinking(false);\n }\n }, [clearErrors, setLinking, setAsset, removeLink, setLinkError]);\n\n // Get asset URL\n const getUrl = useCallback(async (\n assetId: string, \n variant?: string, \n expiresIn?: number\n ): Promise<string> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n const result = await oxyInstance.assetGetUrl(assetId, variant, expiresIn);\n return result.url;\n } catch (error: any) {\n throw error;\n }\n }, []);\n\n // Get asset metadata\n const getAsset = useCallback(async (assetId: string): Promise<Asset> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n const result = await oxyInstance.assetGet(assetId);\n if (result.file) {\n setAsset(result.file);\n return result.file;\n }\n throw new Error('Asset not found');\n } catch (error: any) {\n throw error;\n }\n }, [setAsset]);\n\n // Delete asset\n const deleteAsset = useCallback(async (\n assetId: string, \n force: boolean = false\n ): Promise<void> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n clearErrors();\n setDeleting(true);\n \n await oxyInstance.assetDelete(assetId, force);\n removeAsset(assetId);\n } catch (error: any) {\n setDeleteError(error.message || 'Delete failed');\n throw error;\n } finally {\n setDeleting(false);\n }\n }, [clearErrors, setDeleting, removeAsset, setDeleteError]);\n\n // Restore asset from trash\n const restore = useCallback(async (assetId: string): Promise<void> => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n const result = await oxyInstance.assetRestore(assetId);\n if (result.file) {\n setAsset(result.file);\n }\n } catch (error: any) {\n throw error;\n }\n }, [setAsset]);\n\n // Get variants\n const getVariants = useCallback(async (assetId: string) => {\n if (!oxyInstance) {\n throw new Error('OxyServices instance not configured. Call setOxyAssetInstance first.');\n }\n\n try {\n return await oxyInstance.assetGetVariants(assetId);\n } catch (error: any) {\n throw error;\n }\n }, []);\n\n return {\n // State\n assets: Object.values(assets),\n uploadProgress,\n loading,\n errors,\n \n // Actions\n upload,\n link,\n unlink,\n getUrl,\n getAsset,\n deleteAsset,\n restore,\n getVariants,\n \n // Utility methods\n getAssetsByApp,\n getAssetsByEntity,\n getAssetUsageCount,\n isAssetLinked,\n \n // Store management\n clearErrors,\n reset\n };\n};","import { useEffect, useState } from 'react';\nimport { OxyServices } from '../../core/OxyServices';\n\nlet oxyInstance: OxyServices | null = null;\n\nexport const setOxyFileUrlInstance = (instance: OxyServices) => {\n oxyInstance = instance;\n};\n\nexport interface UseFileDownloadUrlOptions {\n variant?: string;\n expiresIn?: number;\n}\n\nexport interface UseFileDownloadUrlResult {\n url: string | null;\n loading: boolean;\n error: Error | null;\n}\n\n/**\n * Hook to resolve a file's download URL asynchronously.\n *\n * Prefers `getFileDownloadUrlAsync` and falls back to the synchronous\n * `getFileDownloadUrl` helper if the async call fails.\n */\nexport const useFileDownloadUrl = (\n fileId?: string | null,\n options?: UseFileDownloadUrlOptions\n): UseFileDownloadUrlResult => {\n const [url, setUrl] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!fileId) {\n setUrl(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n if (!oxyInstance) {\n // Fail silently but don't crash the UI – caller can decide what to do with null URL.\n setUrl(null);\n setLoading(false);\n setError(new Error('OxyServices instance not configured for useFileDownloadUrl'));\n return;\n }\n\n let cancelled = false;\n\n const load = async () => {\n setLoading(true);\n setError(null);\n\n // Store instance in local variable for TypeScript null checking\n const instance = oxyInstance;\n if (!instance) {\n setLoading(false);\n setError(new Error('OxyServices instance not configured for useFileDownloadUrl'));\n return;\n }\n\n try {\n const { variant, expiresIn } = options || {};\n let resolvedUrl: string | null = null;\n\n if (typeof instance.getFileDownloadUrlAsync === 'function') {\n resolvedUrl = await instance.getFileDownloadUrlAsync(fileId, variant, expiresIn);\n }\n\n if (!resolvedUrl && typeof instance.getFileDownloadUrl === 'function') {\n resolvedUrl = instance.getFileDownloadUrl(fileId, variant, expiresIn);\n }\n\n if (!cancelled) {\n setUrl(resolvedUrl || null);\n }\n } catch (err: any) {\n // Fallback to sync URL on error where possible\n try {\n if (typeof instance.getFileDownloadUrl === 'function') {\n const { variant, expiresIn } = options || {};\n const fallbackUrl = instance.getFileDownloadUrl(fileId, variant, expiresIn);\n if (!cancelled) {\n setUrl(fallbackUrl || null);\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n return;\n }\n } catch {\n // ignore secondary failure, we'll surface the original error below\n }\n\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (!cancelled) {\n setLoading(false);\n }\n }\n };\n\n load();\n\n return () => {\n cancelled = true;\n };\n }, [fileId, options?.variant, options?.expiresIn]);\n\n return { url, loading, error };\n};\n\n\n\n\n","import { useQuery, useQueries } from '@tanstack/react-query';\nimport type { User } from '../../../models/interfaces';\nimport { queryKeys } from './queryKeys';\nimport { useOxy } from '../../context/OxyContext';\nimport { authenticatedApiCall } from '../../utils/authHelpers';\n\n/**\n * Get user profile by session ID\n */\nexport const useUserProfile = (sessionId: string | null, options?: { enabled?: boolean }) => {\n const { oxyServices } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.users.profile(sessionId || ''),\n queryFn: async () => {\n if (!sessionId) {\n throw new Error('Session ID is required');\n }\n return await oxyServices.getUserBySession(sessionId);\n },\n enabled: (options?.enabled !== false) && !!sessionId,\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes\n });\n};\n\n/**\n * Get multiple user profiles by session IDs (batch query)\n */\nexport const useUserProfiles = (sessionIds: string[], options?: { enabled?: boolean }) => {\n const { oxyServices } = useOxy();\n\n return useQueries({\n queries: sessionIds.map((sessionId) => ({\n queryKey: queryKeys.users.profile(sessionId),\n queryFn: async () => {\n const results = await oxyServices.getUsersBySessions([sessionId]);\n return results[0]?.user || null;\n },\n enabled: (options?.enabled !== false) && !!sessionId,\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n })),\n });\n};\n\n/**\n * Get current authenticated user\n */\nexport const useCurrentUser = (options?: { enabled?: boolean }) => {\n const { oxyServices, activeSessionId, isAuthenticated } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.accounts.current(),\n queryFn: async () => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n return await oxyServices.getUserBySession(activeSessionId);\n },\n enabled: (options?.enabled !== false) && isAuthenticated && !!activeSessionId,\n staleTime: 1 * 60 * 1000, // 1 minute for current user\n gcTime: 30 * 60 * 1000,\n });\n};\n\n/**\n * Get user by ID\n */\nexport const useUserById = (userId: string | null, options?: { enabled?: boolean }) => {\n const { oxyServices } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.users.detail(userId || ''),\n queryFn: async () => {\n if (!userId) {\n throw new Error('User ID is required');\n }\n return await oxyServices.getUserById(userId);\n },\n enabled: (options?.enabled !== false) && !!userId,\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n });\n};\n\n/**\n * Get user profile by username\n */\nexport const useUserByUsername = (username: string | null, options?: { enabled?: boolean }) => {\n const { oxyServices } = useOxy();\n\n return useQuery({\n queryKey: [...queryKeys.users.details(), 'username', username || ''],\n queryFn: async () => {\n if (!username) {\n throw new Error('Username is required');\n }\n return await oxyServices.getProfileByUsername(username);\n },\n enabled: (options?.enabled !== false) && !!username,\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n });\n};\n\n/**\n * Batch get users by session IDs (optimized single API call)\n */\nexport const useUsersBySessions = (sessionIds: string[], options?: { enabled?: boolean }) => {\n const { oxyServices } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.accounts.list(sessionIds),\n queryFn: async () => {\n if (sessionIds.length === 0) {\n return [];\n }\n return await oxyServices.getUsersBySessions(sessionIds);\n },\n enabled: (options?.enabled !== false) && sessionIds.length > 0,\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n });\n};\n\n/**\n * Get privacy settings for a user\n */\nexport const usePrivacySettings = (userId?: string, options?: { enabled?: boolean }) => {\n const { oxyServices, activeSessionId, user } = useOxy();\n const targetUserId = userId || user?.id;\n\n return useQuery({\n queryKey: queryKeys.privacy.settings(targetUserId),\n queryFn: async () => {\n if (!targetUserId) {\n throw new Error('User ID is required');\n }\n\n return authenticatedApiCall(\n oxyServices,\n activeSessionId,\n () => oxyServices.getPrivacySettings(targetUserId)\n );\n },\n enabled: (options?.enabled !== false) && !!targetUserId,\n staleTime: 2 * 60 * 1000, // 2 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n });\n};\n\n","import { useQuery } from '@tanstack/react-query';\nimport type { ClientSession } from '../../../models/session';\nimport { queryKeys } from './queryKeys';\nimport { useOxy } from '../../context/OxyContext';\nimport { fetchSessionsWithFallback, mapSessionsToClient } from '../../utils/sessionHelpers';\nimport { authenticatedApiCall } from '../../utils/authHelpers';\n\n/**\n * Get all active sessions for the current user\n */\nexport const useSessions = (userId?: string, options?: { enabled?: boolean }) => {\n const { oxyServices, activeSessionId } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.sessions.list(userId),\n queryFn: async () => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n \n const sessions = await fetchSessionsWithFallback(oxyServices, activeSessionId, {\n fallbackDeviceId: undefined,\n fallbackUserId: userId,\n });\n \n return mapSessionsToClient(sessions, activeSessionId);\n },\n enabled: (options?.enabled !== false) && !!activeSessionId,\n staleTime: 2 * 60 * 1000, // 2 minutes (sessions change frequently)\n gcTime: 10 * 60 * 1000, // 10 minutes\n });\n};\n\n/**\n * Get specific session by ID\n */\nexport const useSession = (sessionId: string | null, options?: { enabled?: boolean }) => {\n const { oxyServices } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.sessions.detail(sessionId || ''),\n queryFn: async () => {\n if (!sessionId) {\n throw new Error('Session ID is required');\n }\n \n const validation = await oxyServices.validateSession(sessionId, { useHeaderValidation: true });\n if (!validation?.valid || !validation.user) {\n throw new Error('Session not found or invalid');\n }\n\n const now = new Date();\n return {\n sessionId,\n deviceId: '', // Device ID not available from validation response\n expiresAt: validation.expiresAt || new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000).toISOString(),\n lastActive: validation.lastActivity || now.toISOString(),\n userId: validation.user.id?.toString() ?? '',\n isCurrent: false,\n } as ClientSession;\n },\n enabled: (options?.enabled !== false) && !!sessionId,\n staleTime: 2 * 60 * 1000,\n gcTime: 10 * 60 * 1000,\n });\n};\n\n/**\n * Get device sessions for the current active session\n */\nexport const useDeviceSessions = (options?: { enabled?: boolean }) => {\n const { oxyServices, activeSessionId } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.sessions.active(),\n queryFn: async () => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n \n return await oxyServices.getDeviceSessions(activeSessionId);\n },\n enabled: (options?.enabled !== false) && !!activeSessionId,\n staleTime: 2 * 60 * 1000,\n gcTime: 10 * 60 * 1000,\n });\n};\n\n/**\n * Get user devices\n */\nexport const useUserDevices = (options?: { enabled?: boolean }) => {\n const { oxyServices, isAuthenticated, activeSessionId } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.devices.list(),\n queryFn: async () => {\n return authenticatedApiCall(\n oxyServices,\n activeSessionId,\n () => oxyServices.getUserDevices()\n );\n },\n enabled: (options?.enabled !== false) && isAuthenticated,\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n });\n};\n\n/**\n * Get security information\n */\nexport const useSecurityInfo = (options?: { enabled?: boolean }) => {\n const { oxyServices, isAuthenticated } = useOxy();\n\n return useQuery({\n queryKey: [...queryKeys.devices.all, 'security'],\n queryFn: async () => {\n return await oxyServices.getSecurityInfo();\n },\n enabled: (options?.enabled !== false) && isAuthenticated,\n staleTime: 5 * 60 * 1000,\n gcTime: 30 * 60 * 1000,\n });\n};\n\n","import { useQuery } from '@tanstack/react-query';\nimport { queryKeys } from './queryKeys';\nimport { useOxy } from '../../context/OxyContext';\nimport type { SecurityActivity, SecurityEventType } from '../../../models/interfaces';\n\n/**\n * Get user's security activity with pagination\n */\nexport const useSecurityActivity = (\n options?: {\n limit?: number;\n offset?: number;\n eventType?: SecurityEventType;\n enabled?: boolean;\n }\n) => {\n const { oxyServices, activeSessionId } = useOxy();\n\n return useQuery({\n queryKey: queryKeys.security.activity(\n options?.limit,\n options?.offset,\n options?.eventType\n ),\n queryFn: async () => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n\n const response = await oxyServices.getSecurityActivity(\n options?.limit,\n options?.offset,\n options?.eventType\n );\n\n return response;\n },\n enabled: (options?.enabled !== false) && !!activeSessionId,\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n });\n};\n\n/**\n * Get recent security activity (convenience hook)\n */\nexport const useRecentSecurityActivity = (limit: number = 10) => {\n const { oxyServices, activeSessionId } = useOxy();\n\n return useQuery<SecurityActivity[]>({\n queryKey: queryKeys.security.recent(limit),\n queryFn: async () => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n\n return await oxyServices.getRecentSecurityActivity(limit);\n },\n enabled: !!activeSessionId,\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 10 * 60 * 1000, // 10 minutes\n });\n};\n\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type { User } from '../../../models/interfaces';\nimport { queryKeys, invalidateAccountQueries, invalidateUserQueries } from '../queries/queryKeys';\nimport { useOxy } from '../../context/OxyContext';\nimport { toast } from '../../../lib/sonner';\nimport { refreshAvatarInStore } from '../../utils/avatarUtils';\nimport { useAuthStore } from '../../stores/authStore';\nimport { authenticatedApiCall } from '../../utils/authHelpers';\n\n/**\n * Update user profile with optimistic updates and offline queue support\n */\nexport const useUpdateProfile = () => {\n const { oxyServices, activeSessionId, user } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (updates: Partial<User>) => {\n return authenticatedApiCall<User>(\n oxyServices,\n activeSessionId,\n () => oxyServices.updateProfile(updates)\n );\n },\n // Optimistic update\n onMutate: async (updates) => {\n // Cancel outgoing refetches\n await queryClient.cancelQueries({ queryKey: queryKeys.accounts.current() });\n\n // Snapshot previous value\n const previousUser = queryClient.getQueryData<User>(queryKeys.accounts.current());\n\n // Optimistically update\n if (previousUser) {\n queryClient.setQueryData<User>(queryKeys.accounts.current(), {\n ...previousUser,\n ...updates,\n });\n\n // Also update profile query if sessionId is available\n if (activeSessionId) {\n queryClient.setQueryData<User>(queryKeys.users.profile(activeSessionId), {\n ...previousUser,\n ...updates,\n });\n }\n }\n\n return { previousUser };\n },\n // On error, rollback\n onError: (error, updates, context) => {\n if (context?.previousUser) {\n queryClient.setQueryData(queryKeys.accounts.current(), context.previousUser);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), context.previousUser);\n }\n }\n toast.error(error instanceof Error ? error.message : 'Failed to update profile');\n },\n // On success, invalidate and refetch\n onSuccess: (data, updates) => {\n // Update cache with server response\n queryClient.setQueryData(queryKeys.accounts.current(), data);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);\n }\n \n // Update authStore so frontend components see the changes immediately\n useAuthStore.getState().setUser(data);\n \n // If avatar was updated, refresh accountStore with cache-busted URL\n if (updates.avatar && activeSessionId && oxyServices) {\n refreshAvatarInStore(activeSessionId, updates.avatar, oxyServices);\n }\n \n // Invalidate all related queries to refresh everywhere\n invalidateUserQueries(queryClient);\n invalidateAccountQueries(queryClient);\n },\n });\n};\n\n/**\n * Upload avatar with progress tracking and offline queue support\n */\nexport const useUploadAvatar = () => {\n const { oxyServices, activeSessionId } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (file: { uri: string; type?: string; name?: string; size?: number }) => {\n return authenticatedApiCall<User>(oxyServices, activeSessionId, async () => {\n // Upload file first\n const uploadResult = await oxyServices.assetUpload(file as any, 'public');\n const fileId = uploadResult?.file?.id || uploadResult?.id || uploadResult;\n\n if (!fileId || typeof fileId !== 'string') {\n throw new Error('Failed to get file ID from upload result');\n }\n\n // Update profile with file ID\n return await oxyServices.updateProfile({ avatar: fileId });\n });\n },\n onMutate: async (file) => {\n await queryClient.cancelQueries({ queryKey: queryKeys.accounts.current() });\n const previousUser = queryClient.getQueryData<User>(queryKeys.accounts.current());\n\n // Optimistically set a temporary avatar (using file URI as placeholder)\n if (previousUser) {\n const optimisticUser = {\n ...previousUser,\n avatar: file.uri, // Temporary, will be replaced with fileId\n };\n queryClient.setQueryData<User>(queryKeys.accounts.current(), optimisticUser);\n if (activeSessionId) {\n queryClient.setQueryData<User>(queryKeys.users.profile(activeSessionId), optimisticUser);\n }\n }\n\n return { previousUser };\n },\n onError: (error, file, context) => {\n if (context?.previousUser) {\n queryClient.setQueryData(queryKeys.accounts.current(), context.previousUser);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), context.previousUser);\n }\n }\n toast.error(error instanceof Error ? error.message : 'Failed to upload avatar');\n },\n onSuccess: (data) => {\n queryClient.setQueryData(queryKeys.accounts.current(), data);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);\n }\n \n // Update authStore so frontend components see the changes immediately\n useAuthStore.getState().setUser(data);\n \n // Refresh accountStore with cache-busted URL if avatar was updated\n if (data?.avatar && activeSessionId && oxyServices) {\n refreshAvatarInStore(activeSessionId, data.avatar, oxyServices);\n }\n \n // Invalidate all related queries to refresh everywhere\n invalidateUserQueries(queryClient);\n invalidateAccountQueries(queryClient);\n toast.success('Avatar updated successfully');\n },\n });\n};\n\n/**\n * Update account settings\n */\nexport const useUpdateAccountSettings = () => {\n const { oxyServices, activeSessionId } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (settings: Record<string, any>) => {\n return await oxyServices.updateProfile({ privacySettings: settings });\n },\n onMutate: async (settings) => {\n await queryClient.cancelQueries({ queryKey: queryKeys.accounts.settings() });\n const previousUser = queryClient.getQueryData<User>(queryKeys.accounts.current());\n\n if (previousUser) {\n queryClient.setQueryData<User>(queryKeys.accounts.current(), {\n ...previousUser,\n privacySettings: {\n ...previousUser.privacySettings,\n ...settings,\n },\n });\n }\n\n return { previousUser };\n },\n onError: (error, settings, context) => {\n if (context?.previousUser) {\n queryClient.setQueryData(queryKeys.accounts.current(), context.previousUser);\n }\n toast.error(error instanceof Error ? error.message : 'Failed to update settings');\n },\n onSuccess: (data) => {\n queryClient.setQueryData(queryKeys.accounts.current(), data);\n \n // Update authStore so frontend components see the changes immediately\n useAuthStore.getState().setUser(data);\n \n invalidateAccountQueries(queryClient);\n toast.success('Settings updated successfully');\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.accounts.settings() });\n },\n });\n};\n\n/**\n * Update privacy settings with optimistic updates and authentication handling\n */\nexport const useUpdatePrivacySettings = () => {\n const { oxyServices, activeSessionId, user } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ settings, userId }: { settings: Record<string, any>; userId?: string }) => {\n const targetUserId = userId || user?.id;\n if (!targetUserId) {\n throw new Error('User ID is required');\n }\n\n return authenticatedApiCall<Record<string, unknown>>(\n oxyServices,\n activeSessionId,\n () => oxyServices.updatePrivacySettings(settings, targetUserId)\n );\n },\n // Optimistic update\n onMutate: async ({ settings, userId }) => {\n const targetUserId = userId || user?.id;\n if (!targetUserId) return;\n\n // Cancel outgoing refetches\n await queryClient.cancelQueries({ queryKey: queryKeys.privacy.settings(targetUserId) });\n await queryClient.cancelQueries({ queryKey: queryKeys.accounts.current() });\n\n // Snapshot previous values\n const previousPrivacySettings = queryClient.getQueryData(queryKeys.privacy.settings(targetUserId));\n const previousUser = queryClient.getQueryData<User>(queryKeys.accounts.current());\n\n // Optimistically update privacy settings\n if (previousPrivacySettings) {\n queryClient.setQueryData(queryKeys.privacy.settings(targetUserId), {\n ...previousPrivacySettings,\n ...settings,\n });\n }\n\n // Also update user query if available\n if (previousUser) {\n queryClient.setQueryData<User>(queryKeys.accounts.current(), {\n ...previousUser,\n privacySettings: {\n ...previousUser.privacySettings,\n ...settings,\n },\n });\n }\n\n return { previousPrivacySettings, previousUser };\n },\n // On error, rollback\n onError: (error, { userId }, context) => {\n const targetUserId = userId || user?.id;\n if (context?.previousPrivacySettings && targetUserId) {\n queryClient.setQueryData(queryKeys.privacy.settings(targetUserId), context.previousPrivacySettings);\n }\n if (context?.previousUser) {\n queryClient.setQueryData(queryKeys.accounts.current(), context.previousUser);\n }\n toast.error(error instanceof Error ? error.message : 'Failed to update privacy settings');\n },\n // On success, invalidate and refetch\n onSuccess: (data, { userId }) => {\n const targetUserId = userId || user?.id;\n if (targetUserId) {\n queryClient.setQueryData(queryKeys.privacy.settings(targetUserId), data);\n }\n // Also update account query if it contains privacy settings\n const currentUser = queryClient.getQueryData<User>(queryKeys.accounts.current());\n if (currentUser) {\n const updatedUser: User = {\n ...currentUser,\n privacySettings: data as { [key: string]: unknown },\n };\n queryClient.setQueryData<User>(queryKeys.accounts.current(), updatedUser);\n\n // Update authStore so frontend components see the changes immediately\n useAuthStore.getState().setUser(updatedUser);\n }\n invalidateAccountQueries(queryClient);\n },\n // Always refetch after error or success\n onSettled: (data, error, { userId }) => {\n const targetUserId = userId || user?.id;\n if (targetUserId) {\n queryClient.invalidateQueries({ queryKey: queryKeys.privacy.settings(targetUserId) });\n }\n queryClient.invalidateQueries({ queryKey: queryKeys.accounts.current() });\n },\n });\n};\n\n/** Uploaded file data structure from API */\ninterface UploadedFile {\n id: string;\n originalName?: string;\n sha256?: string;\n mime?: string;\n size?: number;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n variants?: Array<{ type: string; key: string; width?: number; height?: number; readyAt?: string; metadata?: Record<string, unknown> }>;\n}\n\n/** Upload result type that supports both single file and batch responses */\ninterface UploadResult {\n file?: UploadedFile;\n files?: UploadedFile[];\n id?: string;\n}\n\n/**\n * Upload file with authentication handling and progress tracking\n */\nexport const useUploadFile = () => {\n const { oxyServices, activeSessionId } = useOxy();\n\n return useMutation({\n mutationFn: async ({\n file,\n visibility,\n metadata,\n onProgress\n }: {\n file: File;\n visibility?: 'private' | 'public' | 'unlisted';\n metadata?: Record<string, any>;\n onProgress?: (progress: number) => void;\n }) => {\n return authenticatedApiCall<UploadResult>(\n oxyServices,\n activeSessionId,\n () => oxyServices.assetUpload(file as any, visibility, metadata, onProgress)\n );\n },\n });\n};\n\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type { User } from '../../../models/interfaces';\nimport { queryKeys, invalidateSessionQueries } from '../queries/queryKeys';\nimport { useOxy } from '../../context/OxyContext';\nimport { toast } from '../../../lib/sonner';\n\n/**\n * Switch active session\n */\nexport const useSwitchSession = () => {\n const { switchSession, activeSessionId } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (sessionId: string) => {\n return await switchSession(sessionId);\n },\n onSuccess: (user) => {\n // Invalidate all session queries\n invalidateSessionQueries(queryClient);\n \n // Update current user query\n queryClient.setQueryData(queryKeys.accounts.current(), user);\n \n // Invalidate account queries\n queryClient.invalidateQueries({ queryKey: queryKeys.accounts.all });\n },\n onError: (error) => {\n toast.error(error instanceof Error ? error.message : 'Failed to switch session');\n },\n });\n};\n\n/**\n * Logout from a session\n */\nexport const useLogoutSession = () => {\n const { oxyServices, activeSessionId, sessions } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (targetSessionId?: string) => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n \n const sessionToLogout = targetSessionId || activeSessionId;\n await oxyServices.logoutSession(activeSessionId, sessionToLogout);\n \n return sessionToLogout;\n },\n onMutate: async (targetSessionId) => {\n // Cancel outgoing queries\n await queryClient.cancelQueries({ queryKey: queryKeys.sessions.all });\n \n // Snapshot previous sessions\n const previousSessions = queryClient.getQueryData(queryKeys.sessions.list());\n \n // Optimistically remove session\n if (previousSessions) {\n const sessionToLogout = targetSessionId || activeSessionId;\n const updatedSessions = (previousSessions as any[]).filter(\n (s: any) => s.sessionId !== sessionToLogout\n );\n queryClient.setQueryData(queryKeys.sessions.list(), updatedSessions);\n }\n \n return { previousSessions };\n },\n onError: (error, targetSessionId, context) => {\n // Rollback on error\n if (context?.previousSessions) {\n queryClient.setQueryData(queryKeys.sessions.list(), context.previousSessions);\n }\n toast.error(error instanceof Error ? error.message : 'Failed to logout');\n },\n onSuccess: () => {\n // Invalidate all session queries\n invalidateSessionQueries(queryClient);\n },\n onSettled: () => {\n queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all });\n },\n });\n};\n\n/**\n * Logout from all sessions\n */\nexport const useLogoutAll = () => {\n const { oxyServices, activeSessionId, clearSessionState } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async () => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n \n await oxyServices.logoutAllSessions(activeSessionId);\n await clearSessionState();\n },\n onSuccess: () => {\n // Clear all queries\n queryClient.clear();\n toast.success('Logged out from all sessions');\n },\n onError: (error) => {\n toast.error(error instanceof Error ? error.message : 'Failed to logout from all sessions');\n },\n });\n};\n\n/**\n * Update device name\n */\nexport const useUpdateDeviceName = () => {\n const { oxyServices, activeSessionId } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (deviceName: string) => {\n if (!activeSessionId) {\n throw new Error('No active session');\n }\n \n return await oxyServices.updateDeviceName(activeSessionId, deviceName);\n },\n onSuccess: () => {\n // Invalidate device and session queries\n queryClient.invalidateQueries({ queryKey: queryKeys.devices.all });\n queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all });\n toast.success('Device name updated');\n },\n onError: (error) => {\n toast.error(error instanceof Error ? error.message : 'Failed to update device name');\n },\n });\n};\n\n/**\n * Remove a device\n */\nexport const useRemoveDevice = () => {\n const { oxyServices } = useOxy();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async (deviceId: string) => {\n await oxyServices.removeDevice(deviceId);\n return deviceId;\n },\n onSuccess: () => {\n // Invalidate device queries\n queryClient.invalidateQueries({ queryKey: queryKeys.devices.all });\n queryClient.invalidateQueries({ queryKey: queryKeys.sessions.all });\n toast.success('Device removed');\n },\n onError: (error) => {\n toast.error(error instanceof Error ? error.message : 'Failed to remove device');\n },\n });\n};\n\n","/**\n * Mutation Factory - Creates standardized mutations with optimistic updates\n *\n * This factory reduces boilerplate code for mutations that follow the common pattern:\n * 1. Cancel outgoing queries\n * 2. Snapshot previous data\n * 3. Apply optimistic update\n * 4. On error: rollback and show toast\n * 5. On success: update cache, stores, and invalidate queries\n */\n\nimport { QueryClient, UseMutationOptions } from '@tanstack/react-query';\nimport type { User } from '../../../models/interfaces';\nimport { queryKeys, invalidateAccountQueries, invalidateUserQueries } from '../queries/queryKeys';\nimport { toast } from '../../../lib/sonner';\nimport { useAuthStore } from '../../stores/authStore';\n\n/**\n * Configuration for creating a standard profile mutation\n */\nexport interface ProfileMutationConfig<TData, TVariables> {\n /** The mutation function that makes the API call */\n mutationFn: (variables: TVariables) => Promise<TData>;\n /** Query keys to cancel before mutation */\n cancelQueryKeys?: unknown[][];\n /** Function to apply optimistic update to the user data */\n optimisticUpdate?: (previousUser: User, variables: TVariables) => Partial<User>;\n /** Error message to show on failure */\n errorMessage?: string | ((error: Error) => string);\n /** Success message to show (optional) */\n successMessage?: string;\n /** Whether to update authStore on success (default: true) */\n updateAuthStore?: boolean;\n /** Whether to invalidate user queries on success (default: true) */\n invalidateUserQueries?: boolean;\n /** Whether to invalidate account queries on success (default: true) */\n invalidateAccountQueries?: boolean;\n /** Custom onSuccess handler */\n onSuccess?: (data: TData, variables: TVariables, queryClient: QueryClient) => void;\n}\n\n/**\n * Creates a standard profile mutation with optimistic updates\n *\n * @example\n * ```ts\n * const updateProfile = createProfileMutation({\n * mutationFn: (updates) => oxyServices.updateProfile(updates),\n * optimisticUpdate: (user, updates) => updates,\n * errorMessage: 'Failed to update profile',\n * });\n * ```\n */\nexport function createProfileMutation<TVariables>(\n config: ProfileMutationConfig<User, TVariables>,\n queryClient: QueryClient,\n activeSessionId: string | null\n): UseMutationOptions<User, Error, TVariables, { previousUser?: User }> {\n const {\n mutationFn,\n cancelQueryKeys = [],\n optimisticUpdate,\n errorMessage = 'Operation failed',\n successMessage,\n updateAuthStore = true,\n invalidateUserQueries: shouldInvalidateUserQueries = true,\n invalidateAccountQueries: shouldInvalidateAccountQueries = true,\n onSuccess: customOnSuccess,\n } = config;\n\n return {\n mutationFn,\n\n onMutate: async (variables) => {\n // Cancel queries that might conflict\n await queryClient.cancelQueries({ queryKey: queryKeys.accounts.current() });\n for (const key of cancelQueryKeys) {\n await queryClient.cancelQueries({ queryKey: key });\n }\n\n // Snapshot previous user data\n const previousUser = queryClient.getQueryData<User>(queryKeys.accounts.current());\n\n // Apply optimistic update if provided\n if (previousUser && optimisticUpdate) {\n const updates = optimisticUpdate(previousUser, variables);\n const optimisticUser = { ...previousUser, ...updates };\n\n queryClient.setQueryData<User>(queryKeys.accounts.current(), optimisticUser);\n\n if (activeSessionId) {\n queryClient.setQueryData<User>(queryKeys.users.profile(activeSessionId), optimisticUser);\n }\n }\n\n return { previousUser };\n },\n\n onError: (error, _variables, context) => {\n // Rollback optimistic update\n if (context?.previousUser) {\n queryClient.setQueryData(queryKeys.accounts.current(), context.previousUser);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), context.previousUser);\n }\n }\n\n // Show error toast\n const message = typeof errorMessage === 'function'\n ? errorMessage(error)\n : (error instanceof Error ? error.message : errorMessage);\n toast.error(message);\n },\n\n onSuccess: (data, variables) => {\n // Update cache with server response\n queryClient.setQueryData(queryKeys.accounts.current(), data);\n if (activeSessionId) {\n queryClient.setQueryData(queryKeys.users.profile(activeSessionId), data);\n }\n\n // Update authStore for immediate UI updates\n if (updateAuthStore) {\n useAuthStore.getState().setUser(data);\n }\n\n // Invalidate related queries\n if (shouldInvalidateUserQueries) {\n invalidateUserQueries(queryClient);\n }\n if (shouldInvalidateAccountQueries) {\n invalidateAccountQueries(queryClient);\n }\n\n // Show success toast if configured\n if (successMessage) {\n toast.success(successMessage);\n }\n\n // Call custom onSuccess handler\n if (customOnSuccess) {\n customOnSuccess(data, variables, queryClient);\n }\n },\n };\n}\n\n/**\n * Configuration for creating a generic mutation (non-profile)\n */\nexport interface GenericMutationConfig<TData, TVariables, TContext> {\n /** The mutation function */\n mutationFn: (variables: TVariables) => Promise<TData>;\n /** Query key for optimistic data */\n queryKey: unknown[];\n /** Function to create optimistic data */\n optimisticData?: (previous: TData | undefined, variables: TVariables) => TData;\n /** Error message */\n errorMessage?: string;\n /** Success message */\n successMessage?: string;\n /** Additional queries to invalidate on success */\n invalidateQueries?: unknown[][];\n}\n\n/**\n * Creates a generic mutation with optimistic updates\n */\nexport function createGenericMutation<TData, TVariables>(\n config: GenericMutationConfig<TData, TVariables, { previous?: TData }>,\n queryClient: QueryClient\n): UseMutationOptions<TData, Error, TVariables, { previous?: TData }> {\n const {\n mutationFn,\n queryKey,\n optimisticData,\n errorMessage = 'Operation failed',\n successMessage,\n invalidateQueries = [],\n } = config;\n\n return {\n mutationFn,\n\n onMutate: async (variables) => {\n await queryClient.cancelQueries({ queryKey });\n const previous = queryClient.getQueryData<TData>(queryKey);\n\n if (optimisticData) {\n queryClient.setQueryData<TData>(queryKey, optimisticData(previous, variables));\n }\n\n return { previous };\n },\n\n onError: (error, _variables, context) => {\n if (context?.previous !== undefined) {\n queryClient.setQueryData(queryKey, context.previous);\n }\n toast.error(error instanceof Error ? error.message : errorMessage);\n },\n\n onSuccess: (data) => {\n queryClient.setQueryData(queryKey, data);\n\n for (const key of invalidateQueries) {\n queryClient.invalidateQueries({ queryKey: key });\n }\n\n if (successMessage) {\n toast.success(successMessage);\n }\n },\n };\n}\n","import { useMemo, useState, useCallback } from 'react';\nimport type { FileMetadata } from '../../models/interfaces';\n\nexport type ViewMode = 'all' | 'photos' | 'videos' | 'documents' | 'audio';\nexport type SortBy = 'date' | 'size' | 'name' | 'type';\nexport type SortOrder = 'asc' | 'desc';\n\ninterface UseFileFilteringOptions {\n files: FileMetadata[];\n initialViewMode?: ViewMode;\n initialSortBy?: SortBy;\n initialSortOrder?: SortOrder;\n}\n\ninterface UseFileFilteringReturn {\n filteredFiles: FileMetadata[];\n viewMode: ViewMode;\n setViewMode: (mode: ViewMode) => void;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n sortBy: SortBy;\n setSortBy: (sort: SortBy) => void;\n sortOrder: SortOrder;\n setSortOrder: (order: SortOrder) => void;\n toggleSortOrder: () => void;\n}\n\n/**\n * Hook for file filtering, sorting, and search functionality\n * Extracts common file management logic for reuse across components\n */\nexport function useFileFiltering({\n files,\n initialViewMode = 'all',\n initialSortBy = 'date',\n initialSortOrder = 'desc',\n}: UseFileFilteringOptions): UseFileFilteringReturn {\n const [viewMode, setViewMode] = useState<ViewMode>(initialViewMode);\n const [searchQuery, setSearchQuery] = useState('');\n const [sortBy, setSortBy] = useState<SortBy>(initialSortBy);\n const [sortOrder, setSortOrder] = useState<SortOrder>(initialSortOrder);\n\n const toggleSortOrder = useCallback(() => {\n setSortOrder((prev) => (prev === 'asc' ? 'desc' : 'asc'));\n }, []);\n\n const filteredFiles = useMemo(() => {\n // Filter by view mode\n let filteredByMode = files;\n if (viewMode === 'photos') {\n filteredByMode = files.filter((file) => file.contentType.startsWith('image/'));\n } else if (viewMode === 'videos') {\n filteredByMode = files.filter((file) => file.contentType.startsWith('video/'));\n } else if (viewMode === 'documents') {\n filteredByMode = files.filter(\n (file) =>\n file.contentType.includes('pdf') ||\n file.contentType.includes('document') ||\n file.contentType.includes('text') ||\n file.contentType.includes('msword') ||\n file.contentType.includes('excel') ||\n file.contentType.includes('spreadsheet') ||\n file.contentType.includes('presentation') ||\n file.contentType.includes('powerpoint')\n );\n } else if (viewMode === 'audio') {\n filteredByMode = files.filter((file) => file.contentType.startsWith('audio/'));\n }\n\n // Filter by search query\n let filtered = filteredByMode;\n if (searchQuery.trim()) {\n const query = searchQuery.toLowerCase();\n filtered = filteredByMode.filter(\n (file) =>\n file.filename.toLowerCase().includes(query) ||\n file.contentType.toLowerCase().includes(query) ||\n (file.metadata?.description &&\n file.metadata.description.toLowerCase().includes(query))\n );\n }\n\n // Sort files\n const sorted = [...filtered].sort((a, b) => {\n let comparison = 0;\n if (sortBy === 'date') {\n const dateA = new Date(a.uploadDate || 0).getTime();\n const dateB = new Date(b.uploadDate || 0).getTime();\n comparison = dateA - dateB;\n } else if (sortBy === 'size') {\n comparison = (a.length || 0) - (b.length || 0);\n } else if (sortBy === 'name') {\n comparison = (a.filename || '').localeCompare(b.filename || '');\n } else if (sortBy === 'type') {\n comparison = (a.contentType || '').localeCompare(b.contentType || '');\n }\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n\n return sorted;\n }, [files, searchQuery, viewMode, sortBy, sortOrder]);\n\n return {\n filteredFiles,\n viewMode,\n setViewMode,\n searchQuery,\n setSearchQuery,\n sortBy,\n setSortBy,\n sortOrder,\n setSortOrder,\n toggleSortOrder,\n };\n}\n","/**\n * Validation utilities for common data validation patterns\n */\n\n/**\n * Email validation regex\n */\nexport const EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/**\n * Username validation regex (alphanumeric, underscores, and hyphens, 3-30 chars)\n */\nexport const USERNAME_REGEX = /^[a-zA-Z0-9_-]{3,30}$/;\n\n/**\n * Password validation regex (at least 8 chars, 1 uppercase, 1 lowercase, 1 number)\n */\n// At least 8 characters (tests expect len>=8 without complexity requirements)\nexport const PASSWORD_REGEX = /^.{8,}$/;\n\n/**\n * Validate email format\n */\nexport function isValidEmail(email: string): boolean {\n return EMAIL_REGEX.test(email);\n}\n\n/**\n * Validate username format\n */\nexport function isValidUsername(username: string): boolean {\n return USERNAME_REGEX.test(username);\n}\n\n/**\n * Validate password strength\n */\nexport function isValidPassword(password: string): boolean {\n return PASSWORD_REGEX.test(password);\n}\n\n/**\n * Validate required string\n */\nexport function isRequiredString(value: unknown): boolean {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\n/**\n * Validate required number\n */\nexport function isRequiredNumber(value: unknown): boolean {\n return typeof value === 'number' && !Number.isNaN(value);\n}\n\n/**\n * Validate required boolean\n */\nexport function isRequiredBoolean(value: unknown): boolean {\n return typeof value === 'boolean';\n}\n\n/**\n * Validate array\n */\nexport function isValidArray(value: unknown): boolean {\n return Array.isArray(value);\n}\n\n/**\n * Validate object\n */\nexport function isValidObject(value: unknown): boolean {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validate UUID format\n */\nexport function isValidUUID(uuid: string): boolean {\n const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return UUID_REGEX.test(uuid);\n}\n\n/**\n * Validate URL format\n */\nexport function isValidURL(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate date string\n */\nexport function isValidDate(dateString: string): boolean {\n const date = new Date(dateString);\n return !Number.isNaN(date.getTime());\n}\n\n/**\n * Validate file size (in bytes)\n */\nexport function isValidFileSize(size: number, maxSize: number): boolean {\n return size > 0 && size <= maxSize;\n}\n\n/**\n * Validate file type\n */\nexport function isValidFileType(filename: string, allowedTypes: string[]): boolean {\n const extension = filename.split('.').pop()?.toLowerCase();\n return extension ? allowedTypes.includes(extension) : false;\n}\n\n/**\n * Sanitize string input\n */\nexport function sanitizeString(input: string): string {\n // Remove HTML tags entirely and trim whitespace\n return input.trim().replace(/<[^>]*>/g, '');\n}\n\n/**\n * Sanitize HTML input\n */\nexport function sanitizeHTML(input: string): string {\n return input\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\n/**\n * Validate MongoDB ObjectId format\n * Note: This is a basic format check. For full validation, use mongoose.Types.ObjectId.isValid()\n * This function works in environments where mongoose may not be available (e.g., client-side)\n */\nexport function isValidObjectId(id: string): boolean {\n if (typeof id !== 'string') {\n return false;\n }\n // MongoDB ObjectId is 24 hex characters\n const OBJECT_ID_REGEX = /^[0-9a-fA-F]{24}$/;\n return OBJECT_ID_REGEX.test(id);\n}\n\n/**\n * Validate and sanitize user input\n */\nexport function validateAndSanitizeUserInput(input: unknown, type: 'string' | 'email' | 'username'): string | null {\n if (typeof input !== 'string') {\n return null;\n }\n\n const sanitized = sanitizeString(input);\n \n switch (type) {\n case 'email':\n return isValidEmail(sanitized) ? sanitized : null;\n case 'username':\n return isValidUsername(sanitized) ? sanitized : null;\n case 'string':\n return isRequiredString(sanitized) ? sanitized : null;\n default:\n return null;\n }\n} \n","/**\n * React hook utilities for common patterns and state management\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\n\n// Platform detection for SSR/Node.js/React Native safety\nconst isBrowser = typeof window !== 'undefined';\nconst hasLocalStorage = isBrowser && typeof window.localStorage !== 'undefined';\nconst hasSessionStorage = isBrowser && typeof window.sessionStorage !== 'undefined';\nconst hasNavigator = typeof navigator !== 'undefined';\n\n/**\n * Hook for managing async operations with loading, error, and data states\n */\nexport function useAsync<T>(\n asyncFn: () => Promise<T>,\n deps: React.DependencyList = []\n) {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const execute = useCallback(async () => {\n setLoading(true);\n setError(null);\n \n try {\n const result = await asyncFn();\n setData(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setLoading(false);\n }\n }, deps);\n\n return { data, loading, error, execute };\n}\n\n/**\n * Hook for managing async operations that execute on mount\n */\nexport function useAsyncEffect<T>(\n asyncFn: () => Promise<T>,\n deps: React.DependencyList = []\n) {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let mounted = true;\n \n const execute = async () => {\n try {\n const result = await asyncFn();\n if (mounted) {\n setData(result);\n setLoading(false);\n }\n } catch (err) {\n if (mounted) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setLoading(false);\n }\n }\n };\n\n execute();\n\n return () => {\n mounted = false;\n };\n }, deps);\n\n return { data, loading, error };\n}\n\n/**\n * Hook for debounced values\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Hook for throttled values\n */\nexport function useThrottle<T>(value: T, delay: number): T {\n const [throttledValue, setThrottledValue] = useState<T>(value);\n const lastRun = useRef(Date.now());\n\n useEffect(() => {\n const handler = setTimeout(() => {\n if (Date.now() - lastRun.current >= delay) {\n setThrottledValue(value);\n lastRun.current = Date.now();\n }\n }, delay - (Date.now() - lastRun.current));\n\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return throttledValue;\n}\n\n/**\n * Hook for previous value\n */\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n \n useEffect(() => {\n ref.current = value;\n });\n \n return ref.current;\n}\n\n/**\n * Hook for boolean state with toggle\n */\nexport function useToggle(initialValue = false) {\n const [value, setValue] = useState(initialValue);\n \n const toggle = useCallback(() => setValue(v => !v), []);\n const setTrue = useCallback(() => setValue(true), []);\n const setFalse = useCallback(() => setValue(false), []);\n \n return { value, toggle, setTrue, setFalse, setValue };\n}\n\n/**\n * Hook for counter state\n */\nexport function useCounter(initialValue = 0) {\n const [count, setCount] = useState(initialValue);\n \n const increment = useCallback(() => setCount(c => c + 1), []);\n const decrement = useCallback(() => setCount(c => c - 1), []);\n const reset = useCallback(() => setCount(initialValue), [initialValue]);\n const setValue = useCallback((value: number) => setCount(value), []);\n \n return { count, increment, decrement, reset, setValue };\n}\n\n/**\n * Hook for local storage (platform-safe)\n */\nexport function useLocalStorage<T>(key: string, initialValue: T) {\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (!hasLocalStorage) return initialValue;\n try {\n const item = window.localStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch {\n // Silently fail and return initial value\n return initialValue;\n }\n });\n\n const setValue = useCallback((value: T | ((val: T) => T)) => {\n try {\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n if (hasLocalStorage) {\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch {\n // Silently fail - storage might be full or blocked\n }\n }, [key, storedValue]);\n\n return [storedValue, setValue] as const;\n}\n\n/**\n * Hook for session storage (platform-safe)\n */\nexport function useSessionStorage<T>(key: string, initialValue: T) {\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (!hasSessionStorage) return initialValue;\n try {\n const item = window.sessionStorage.getItem(key);\n return item ? JSON.parse(item) : initialValue;\n } catch {\n // Silently fail and return initial value\n return initialValue;\n }\n });\n\n const setValue = useCallback((value: T | ((val: T) => T)) => {\n try {\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n setStoredValue(valueToStore);\n if (hasSessionStorage) {\n window.sessionStorage.setItem(key, JSON.stringify(valueToStore));\n }\n } catch {\n // Silently fail - storage might be full or blocked\n }\n }, [key, storedValue]);\n\n return [storedValue, setValue] as const;\n}\n\n/**\n * Hook for window size (platform-safe)\n */\nexport function useWindowSize() {\n const [windowSize, setWindowSize] = useState({\n width: isBrowser ? window.innerWidth : 0,\n height: isBrowser ? window.innerHeight : 0,\n });\n\n useEffect(() => {\n if (!isBrowser) return;\n\n const handleResize = () => {\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowSize;\n}\n\n/**\n * Hook for scroll position (platform-safe)\n */\nexport function useScrollPosition() {\n const [scrollPosition, setScrollPosition] = useState(0);\n\n useEffect(() => {\n if (!isBrowser) return;\n\n const handleScroll = () => {\n setScrollPosition(window.pageYOffset);\n };\n\n window.addEventListener('scroll', handleScroll);\n return () => window.removeEventListener('scroll', handleScroll);\n }, []);\n\n return scrollPosition;\n}\n\n/**\n * Hook for online/offline status (platform-safe)\n */\nexport function useOnlineStatus() {\n const [isOnline, setIsOnline] = useState(hasNavigator ? navigator.onLine : true);\n\n useEffect(() => {\n if (!isBrowser) return;\n\n const handleOnline = () => setIsOnline(true);\n const handleOffline = () => setIsOnline(false);\n\n window.addEventListener('online', handleOnline);\n window.addEventListener('offline', handleOffline);\n\n return () => {\n window.removeEventListener('online', handleOnline);\n window.removeEventListener('offline', handleOffline);\n };\n }, []);\n\n return isOnline;\n}\n\n/**\n * Hook for media queries (platform-safe)\n */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n if (!isBrowser) return;\n\n const media = window.matchMedia(query);\n if (media.matches !== matches) {\n setMatches(media.matches);\n }\n\n const listener = () => setMatches(media.matches);\n media.addEventListener('change', listener);\n\n return () => media.removeEventListener('change', listener);\n }, [matches, query]);\n\n return matches;\n}\n\n/**\n * Hook for keyboard events (platform-safe)\n */\nexport function useKeyPress(targetKey: string): boolean {\n const [keyPressed, setKeyPressed] = useState(false);\n\n useEffect(() => {\n if (!isBrowser) return;\n\n const downHandler = ({ key }: KeyboardEvent) => {\n if (key === targetKey) {\n setKeyPressed(true);\n }\n };\n\n const upHandler = ({ key }: KeyboardEvent) => {\n if (key === targetKey) {\n setKeyPressed(false);\n }\n };\n\n window.addEventListener('keydown', downHandler);\n window.addEventListener('keyup', upHandler);\n\n return () => {\n window.removeEventListener('keydown', downHandler);\n window.removeEventListener('keyup', upHandler);\n };\n }, [targetKey]);\n\n return keyPressed;\n}\n\n/**\n * Hook for click outside detection (platform-safe)\n */\nexport function useClickOutside(ref: React.RefObject<HTMLElement>, handler: () => void) {\n useEffect(() => {\n if (!isBrowser) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n if (!ref.current || ref.current.contains(event.target as Node)) {\n return;\n }\n handler();\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, handler]);\n}\n\n/**\n * Hook for form validation\n */\nexport function useFormValidation<T extends Record<string, unknown>>(\n initialValues: T,\n validationSchema: (values: T) => Partial<Record<keyof T, string>>\n) {\n const [values, setValues] = useState<T>(initialValues);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});\n\n const validate = useCallback((valuesToValidate: T) => {\n return validationSchema(valuesToValidate);\n }, [validationSchema]);\n\n const setValue = useCallback((field: keyof T, value: T[keyof T]) => {\n setValues(prev => ({ ...prev, [field]: value }));\n if (touched[field]) {\n const newErrors = validate({ ...values, [field]: value });\n setErrors(prev => ({ ...prev, [field]: newErrors[field] }));\n }\n }, [values, touched, validate]);\n\n const setTouchedField = useCallback((field: keyof T) => {\n setTouched(prev => ({ ...prev, [field]: true }));\n const newErrors = validate(values);\n setErrors(prev => ({ ...prev, [field]: newErrors[field] }));\n }, [values, validate]);\n\n const isValid = useMemo(() => {\n const validationErrors = validate(values);\n return Object.keys(validationErrors).length === 0;\n }, [values, validate]);\n\n return {\n values,\n errors,\n touched,\n isValid,\n setValue,\n setTouchedField,\n setValues,\n setErrors,\n setTouched\n };\n} "],"names":["ieee754","read","buffer","offset","isLE","mLen","nBytes","e","m","eLen","eMax","eBias","nBits","i","d","s","NaN","Infinity","Math","pow","write","value","c","rt","abs","isNaN","floor","log","LN2","base64","base64Js","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","length","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","Array","code","Error","indexOf","tripletToBase64","num","start","end","output","require$$0","require$$1","customInspectSymbol","Symbol","exports","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","buf","Object","setPrototypeOf","prototype","arg","encodingOrOffset","TypeError","allocUnsafe","from","string","encoding","isEncoding","actual","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","b","obj","isBuffer","checked","undefined","numberIsNaN","type","isArray","data","fromObject","toPrimitive","assertSize","size","array","toString","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","this","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","n","bidirectionalIndexOf","val","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","String","readUInt16BE","foundIndex","found","j","hexWrite","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","apply","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","proto","foo","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","fill","allocUnsafeSlow","_isBuffer","compare","a","x","y","concat","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","INVALID_BASE64_RE","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","globalObject","globalThis","global","window","self","expoCryptoModule","cryptoPolyfill","getRandomValues","byteCount","require","cryptoModule","getRandomBytes","getRandomBytesSync","crypto","OxyAuthenticationError","status","OxyAuthenticationTimeoutError","operationName","timeoutMs","InvalidTokenError","base64UrlDecode","decodeURIComponent","atob","p","toUpperCase","b64DecodeUnicode","err","jwtDecode","token","options","header","part","decoded","JSON","parse","LogLevel","logger","level","INFO","isDevelopment","setLevel","shouldLog","formatMessage","context","Date","toISOString","entries","map","k","v","debug","args","DEBUG","formattedMessage","info","warn","WARN","ERROR","auth","category","api","session","user","device","payment","performance","operation","duration","errorWithStack","group","label","groupEnd","logAuth","logApi","logSession","logUser","logDevice","logPayment","logPerformance","ErrorCodes","UNAUTHORIZED","FORBIDDEN","INVALID_TOKEN","MISSING_TOKEN","VALIDATION_ERROR","BAD_REQUEST","MISSING_PARAMETER","INVALID_FORMAT","NOT_FOUND","ALREADY_EXISTS","CONFLICT","INTERNAL_ERROR","SERVICE_UNAVAILABLE","TIMEOUT","NETWORK_ERROR","CONNECTION_FAILED","createApiError","details","handleHttpError","apiError","fetchError","response","getErrorCodeFromStatus","validateRequiredFields","fields","missing","filter","field","TTLCache","defaultTTL","cache","Map","hits","misses","key","entry","now","expiresAt","delete","ttl","timestamp","clear","has","keys","validKeys","cleanup","removed","getStats","total","hitRate","resetStats","cleanupInterval","activeCaches","Set","RequestDeduplicator","pendingRequests","deduplicate","requestFn","existing","promise","finally","RequestQueue","maxConcurrent","maxQueueSize","queue","running","enqueue","Promise","resolve","reject","async","result","process","shift","runningCount","SimpleLogger","enabled","prefix","levels","withErrorHandling","errorHandler","component","method","parallelWithErrorHandling","operations","allSettled","op","index","retryAsync","maxRetries","baseDelay","shouldRetry","lastError","retryCheck","attempt","delay","random","setTimeout","debounceAsync","func","timeoutId","clearTimeout","throttleAsync","interval","inThrottle","lastPromise","sequentialWithProgress","onProgress","results","batchAsync","items","batchSize","processor","batch","createCancellableAsync","abortController","execute","AbortController","signal","cancel","abort","withTimeout","timeoutMessage","timeoutPromise","_","race","withLoadingState","setLoading","ms","retryOnError","retryableErrors","errorCode","cachedPlatform","getPlatformOS","__REACT_NATIVE_PLATFORM__","navigator","product","versions","node","document","isIOS","isAndroid","isNativeApp","os","isNative","TokenStore","accessToken","refreshToken","csrfToken","csrfTokenFetchPromise","getInstance","instance","setTokens","getAccessToken","getRefreshToken","clearTokens","hasAccessToken","setCsrfToken","getCsrfToken","setCsrfTokenFetchPromise","getCsrfTokenFetchPromise","clearCsrfToken","HttpService","config","requestMetrics","totalRequests","successfulRequests","failedRequests","cacheHits","cacheMisses","averageResponseTime","baseURL","tokenStore","enableLogging","logLevel","cacheTTL","add","setInterval","registerCacheForCleanup","deduplicator","requestQueue","maxConcurrentRequests","requestQueueSize","isFormData","FormData","constructorName","append","request","url","params","timeout","requestTimeout","retry","enableRetry","cacheKey","generateCacheKey","cached","startTime","fullUrl","buildURL","authHeader","getAuthHeader","isStateChangingMethod","fetchCsrfToken","controller","addEventListener","headers","Accept","__DEV__","platformOS","hasCsrfToken","csrfTokenLength","hasNativeAppHeader","forEach","bodyValue","stringify","fetch","body","credentials","ok","errorMessage","statusText","contentType","errorData","json","parseError","responseData","unwrapResponse","SyntaxError","blob","text","updateMetrics","onRequestEnd","onRequestError","requestWithRetry","retryDelay","dedupeKey","finalRequest","dataStr","sort","substring","base","startsWith","searchParams","URLSearchParams","queryString","cachedToken","existingPromise","fetchPromise","headerToken","currentTime","exp","sessionId","refreshUrl","AbortSignal","newToken","refreshError","success","post","put","patch","getBaseURL","clearCache","clearCacheEntry","getCacheStats","cacheStats","getMetrics","__resetTokensForTests","OxyServicesBase","cloudURL","httpService","makeRequest","getClient","getCloudURL","getCurrentUserId","userId","id","hasValidToken","waitForAuth","maxTime","pollInterval","withAuthRetry","authTimeoutMs","isLastAttempt","errorObj","handleError","validate","valid","healthCheck","isDev","createDebugLogger","namespace","debugLog","debugWarn","debugError","fedCMRequestInProgress","fedCMRequestPromise","currentMediationMode","buildSearchParams","buildUrl","baseUrl","buildPaginationParams","safeJsonParse","fallback","SUPPORTED_LANGUAGES","nativeName","flag","icon","color","FALLBACK_LANGUAGE","getLanguageMetadata","languageCode","exactMatch","find","lang","baseCode","baseMatch","getLanguageName","metadata","getNativeLanguageName","normalizeLanguageCode","en","es","ca","fr","de","it","pt","ja","ko","zh","ar","CACHE_TIMES","SHORT","MEDIUM","LONG","VERY_LONG","EXTRA_LONG","MIXIN_PIPELINE","register","publicKey","signature","requestChallenge","verifyChallenge","challenge","deviceName","deviceFingerprint","checkPublicKeyRegistered","encodeURIComponent","getUserByPublicKey","getUserBySession","getUsersBySessions","sessionIds","uniqueSessionIds","getTokenBySession","getSessionsBySessionId","logoutSession","targetSessionId","logoutAllSessions","validateSession","urlParams","useHeaderValidation","checkUsernameAvailability","username","checkEmailAvailability","email","signUp","password","signIn","identifier","signInWithEmail","_a","isFedCMSupported","signInWithFedCM","nonce","generateNonce","clientId","getClientId","credential","requestIdentityCredential","configURL","DEFAULT_CONFIG_URL","exchangeIdTokenForSession","silentSignInWithFedCM","mediation","hasCredential","hasToken","silentError","errorName","optionalError","exchangeError","requestedMediation","isInteractive","inProgress","FEDCM_SILENT_TIMEOUT","FEDCM_TIMEOUT","identity","providers","loginHint","idToken","id_token","hasResponse","hasSessionId","hasUser","responseKeys","revokeFedCMCredential","IdentityCredential","logout","getFedCMConfig","randomUUID","location","origin","signInWithPopup","state","generateState","storeAuthState","width","POPUP_WIDTH","height","POPUP_HEIGHT","POPUP_TIMEOUT","mode","authUrl","buildAuthUrl","redirectUri","AUTH_URL","popup","openCenteredPopup","waitForPopupAuth","userData","userError","clearAuthState","signUpWithPopup","silentSignIn","SILENT_TIMEOUT","iframe","createElement","style","display","position","border","silentUrl","appendChild","waitForIframeAuth","removeChild","title","features","screenX","outerWidth","screenY","outerHeight","open","expectedState","messageHandler","event","expectedOrigin","hasSession","hasError","closed","clearInterval","removeEventListener","close","URL","sessionStorage","setItem","removeItem","signInWithRedirect","href","preserveUrl","savePreAuthUrl","signUpWithRedirect","handleAuthCallback","errorDescription","savedState","getStoredState","storeTokens","deviceId","cleanAuthCallbackUrl","restoreSession","localStorage","getItem","TOKEN_STORAGE_KEY","SESSION_STORAGE_KEY","clearStoredSession","getStoredSessionId","STATE_STORAGE_KEY","NONCE_STORAGE_KEY","PRE_AUTH_URL_KEY","history","replaceState","getProfileByUsername","searchProfiles","query","pagination","paramsObj","fromEntries","payload","isSearchProfilesResponse","typedResponse","paginationInfo","hasMore","fallbackLimit","getProfileRecommendations","getUserById","getCurrentUser","updateProfile","updates","errorAny","getPrivacySettings","updatePrivacySettings","settings","requestAccountVerification","reason","evidence","downloadAccountData","format","deleteAccount","confirmText","followUser","unfollowUser","getFollowStatus","getUserFollowers","followers","getUserFollowing","following","getNotifications","getUnreadCount","count","createNotification","markNotificationAsRead","notificationId","markAllNotificationsAsRead","deleteNotification","extractUserId","userIdField","_id","isUserInList","getUserList","getIdField","some","item","getBlockedUsers","blockUser","unblockUser","isUserBlocked","block","blockedId","getRestrictedUsers","restrictUser","unrestrictUser","isUserRestricted","restrict","restrictedId","getStorage","storage","import","default","bind","getCurrentLanguage","storageKeyPrefix","userLanguage","language","storageKey","storedLanguage","getCurrentLanguageMetadata","getCurrentLanguageName","getCurrentNativeLanguageName","createPayment","getPayment","paymentId","getUserPayments","getSubscription","getCurrentUserSubscription","getWallet","getCurrentUserWallet","getWalletTransactions","getCurrentUserWalletTransactions","getUserKarma","giveKarma","amount","getUserKarmaTotal","getUserKarmaHistory","getKarmaLeaderboard","getKarmaRules","deleteFile","fileId","getFileDownloadUrl","variant","expiresIn","qs","getFileDownloadUrlAsync","fetchAssetDownloadUrl","getAssetUrlCacheTTL","listUserFiles","getAccountStorageUsage","getFileContentAsText","downloadUrl","fetchAssetContent","getFileContentAsBlob","getBatchFileAccess","fileIds","getFileDownloadUrls","urls","allowed","uploadRawFile","file","visibility","assetUpload","fileName","fileSize","formData","fileBlob","Blob","contextError","fileContext","handledError","newError","assetLink","app","entityType","entityId","webhookUrl","assetUnlink","assetGet","assetGetUrl","assetRestore","assetDelete","force","assetGetVariants","assetData","variants","assetUpdateVisibility","uploadAvatar","asset","uploadProfileBanner","desiredTtlMs","urlRes","getDeveloperApps","apps","createDeveloperApp","getDeveloperApp","appId","updateDeveloperApp","regenerateDeveloperAppSecret","deleteDeveloperApp","updateLocation","latitude","longitude","getNearbyUsers","radius","trackEvent","eventName","properties","getAnalytics","startDate","endDate","registerDevice","deviceData","getUserDevices","removeDevice","getDeviceSessions","logoutAllDeviceSessions","excludeCurrent","updateDeviceName","getSecurityInfo","getSecurityActivity","eventType","getRecentSecurityActivity","logPrivateKeyExported","logBackupCreated","submitFeedback","getSubscriptionPlans","getIndividualFeatures","subscribe","planId","paymentMethodId","subscribeToFeature","featureId","cancelSubscription","subscriptionId","reactivateSubscription","getCurrentSubscription","getSavedItems","endpoint","getCollections","saveItem","itemId","itemType","collectionId","removeSavedItem","saveId","createCollection","description","deleteCollection","getUserStats","getUserHistory","clearUserHistory","deleteHistoryItem","getFAQs","searchFAQs","getUserAchievements","getAllAchievements","fetchLinkMetadata","onError","loadUser","req","next","path","decodeError","OxyServicesComposed","reduce","mixin","OxyServices","OXY_CLOUD_URL","OXY_API_URL","env","oxyClient","CrossDomainAuth","oxyServices","autoSignIn","onMethodSelected","isSignup","popupDimensions","handleRedirectCallback","getRecommendedMethod","initialize","callbackSession","createCrossDomainAuth","SECURITY_EVENT_SEVERITY_MAP","sign_in","sign_out","profile_updated","email_changed","device_added","device_removed","security_settings_changed","account_recovery","private_key_exported","backup_created","suspicious_activity","DeviceManager","isReactNative","getDeviceFingerprint","fingerprint","userAgent","platform","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","screen","colorDepth","getDeviceInfo","stored","DEVICE_KEY","deviceInfo","lastUsed","saveDeviceInfo","createNewDeviceInfo","generateDeviceId","createdAt","clearDeviceInfo","byte","padStart","getDefaultDeviceName","module","assert","inherits","ctor","superCtor","super_","TempCtor","BN","number","endian","isBN","negative","words","red","_init","wordSize","parseHex4Bits","parseHexByte","lowerBound","r","parseBase","left","right","cmp","_initNumber","_initArray","_parseHex","_parseBase","toArray","ceil","w","off","strip","limbLen","limbPow","mod","word","imuln","_iaddn","dest","clone","_expand","_normSign","zeros","groupSizes","groupBases","smallMulTo","carry","ncarry","rword","maxJ","padding","groupSize","groupBase","isZero","modn","idivn","toNumber","toBuffer","toArrayLike","ArrayType","reqLength","q","andln","iushrn","clz32","_countBits","t","_zeroBits","bitLength","zeroBits","toTwos","inotn","iaddn","fromTwos","testn","notn","ineg","isNeg","neg","iuor","ior","or","uor","iuand","iand","and","uand","iuxor","ixor","xor","uxor","bytesNeeded","bitsLeft","setn","bit","wbit","iadd","isub","comb10MulTo","mid","o","a0","al0","ah0","a1","al1","ah1","a2","al2","ah2","a3","al3","ah3","a4","al4","ah4","a5","al5","ah5","a6","al6","ah6","a7","al7","ah7","a8","al8","ah8","a9","al9","ah9","b0","bl0","bh0","b1","bl1","bh1","b2","bl2","bh2","b3","bl3","bh3","b4","bl4","bh4","b5","bl5","bh5","b6","bl6","bh6","b7","bl7","bh7","b8","bl8","bh8","b9","bl9","bh9","w0","imul","w1","w2","w3","w4","w5","w6","w7","w8","w9","w10","w11","w12","w13","w14","w15","w16","w17","w18","jumboMulTo","FFTM","mulp","mulTo","hncarry","bigMulTo","makeRBT","N","l","revBin","rb","permute","rbt","rws","iws","rtws","itws","transform","rtwdf","cos","PI","itwdf","sin","rtwdf_","itwdf_","re","ie","ro","io","rx","guessLen13b","odd","conjugate","normalize13b","ws","round","convert13b","stub","ph","rwst","iwst","nrws","nrwst","niwst","rmws","mulf","muln","sqr","isqr","toBitArray","iushln","bits","carryMask","newCarry","ishln","hint","extended","h","mask","maskedWords","ishrn","shln","ushln","shrn","ushrn","imaskn","maskn","isubn","addn","subn","iabs","_ishlnsubmul","_wordDiv","bhi","diff","qj","div","divmod","positive","divn","umod","divRound","dm","half","r2","acc","egcd","A","B","C","D","g","isEven","yp","xp","im","isOdd","jm","gcd","_invmp","x1","x2","delta","cmpn","invm","bincn","ucmp","gtn","gt","gten","gte","ltn","lt","lten","lte","eqn","eq","Red","toRed","ctx","convertTo","_forceRed","fromRed","convertFrom","forceRed","redAdd","redIAdd","redSub","redISub","redShl","shl","redMul","_verify2","redIMul","redSqr","_verify1","redISqr","redSqrt","sqrt","redInvm","redNeg","redPow","primes","k256","p224","p192","p25519","MPrime","_tmp","K256","P224","P192","P25519","prime","_prime","Mont","imod","rinv","minv","ireduce","rlen","imulK","_strip","outLen","prev","mod3","one","nOne","lpow","z","inv","wnd","current","currentLen","mont","u","minimalisticAssert","equal","utils","zero2","toHex","enc","encode","minAssert","minUtils","require$$2","getNAF","naf","getJSF","k1","k2","jsf","m8","d1","d2","u1","u2","m14","m24","cachedProperty","computer","parseBytes","intFromLE","Rand","rand","brorandModule","generate","_rand","getBytes","getByte","msCrypto","randomBytes","BaseCurve","conf","zero","two","pointFromJSON","gRed","_wnafT1","_wnafT2","_wnafT3","_wnafT4","_bitLength","adjustCount","redN","_maxwellTrick","BasePoint","curve","precomputed","point","_fixedNafMul","doubles","_getDoubles","I","step","nafW","repr","jpoint","mixedAdd","points","toP","_wnafMul","nafPoints","_getNAFPoints","dblp","_wnafMulAdd","defW","coeffs","jacobianResult","wndWidth","comb","toJ","jb","decodePoint","pointFromX","encodeCompressed","_encode","compact","getX","getY","precompute","power","beta","_getBeta","_hasDoubles","dbl","create","inherits_browserModule","short","require$$3","ShortCurve","tinv","zeroA","threeA","endo","_getEndomorphism","_endoWnafT1","_endoWnafT2","Point","isRed","inf","JPoint","zOne","lambda","betas","_getEndoRoots","lambdas","basis","vec","_getEndoBasis","ntinv","prevR","aprxSqrt","y1","y2","len1","_endoSplit","v1","v2","c1","c2","p1","p2","q1","q2","ax","rhs","_endoWnafMulAdd","npoints","ncoeffs","fromJSON","pre","endoMul","obj2point","isInfinity","nx","ny","ys1","dyinv","mulAdd","jmulAdd","_precompute","negate","zinv","zinv2","ay","pz2","z2","s1","s2","h2","h3","nz","jx","jy","jz","jz4","jyd","jx2","jyd2","jyd4","t1","t2","dny","_zeroDbl","_threeDbl","_dbl","xx","yy","yyyy","yyyy8","f","c8","gamma","alpha","beta4","beta8","ggamma8","jy2","jxd4","jyd8","trpl","zz","mm","ee","yyu4","kbase","z3","pz3","eqXToP","zs","xc","MontCurve","i4","a24","normalize","aa","bb","diffAdd","da","cb","jumlAdd","other","edwards","EdwardsCurve","twisted","mOneA","dd","oneC","_mulA","_mulC","lhs","pointFromY","_extDbl","nt","_projDbl","_extAdd","_projAdd","zi","isSurrogatePair","htonl","zero8","toHex32","join32","split32","rotr32","rotl32","sum32","sum32_3","sum32_4","sum32_5","sum64","ah","al","bh","sum64_hi","bl","sum64_lo","sum64_4_hi","ch","cl","dh","dl","sum64_4_lo","sum64_5_hi","eh","el","sum64_5_lo","rotr64_hi","rotr64_lo","shr64_hi","shr64_lo","BlockHash","pending","pendingTotal","blockSize","outSize","hmacStrength","padLength","_delta8","_delta32","common","update","_update","digest","_pad","_digest","ch32","maj32","p32","ft_1","s0_256","s1_256","g0_256","g1_256","shaCommon","sha256_K","SHA256","W","_256","T1","T2","sha512_K","SHA512","ch64_hi","xh","xl","yh","yl","ch64_lo","zl","maj64_hi","maj64_lo","s0_512_hi","s0_512_lo","s1_512_hi","s1_512_lo","g0_512_hi","g0_512_lo","g1_512_hi","g1_512_lo","_512","_prepareBlock","c0_hi","c0_lo","c1_hi","c1_lo","c2_hi","c2_lo","c3_hi","c3_lo","fh","fl","gh","gl","hh","hl","c4_hi","c4_lo","T1_hi","T1_lo","T2_hi","T2_lo","sha","sha1","sha1_K","SHA1","_1","sha224","SHA224","_224","sha256","sha384","SHA384","_384","sha512","require$$4","hash","ripemd","RIPEMD160","K","Kh","ripemd160","Ah","Bh","Ch","Dh","Eh","T","rh","sh","hmac","Hmac","Hash","inner","outer","curves","PresetCurve","defineCurve","secp256k1","HmacDRBG","predResist","minEntropy","_reseed","reseedInterval","V","entropy","entropyEnc","nonceEnc","pers","persEnc","hmacDrbg","seed","_hmac","kmac","reseed","addEnc","temp","KeyPair","ec","priv","pub","_importPrivate","privEnc","_importPublic","pubEnc","fromPublic","fromPrivate","getPublic","getPrivate","derive","sign","verify","require$$5","Signature","_importDER","recoveryParam","Position","place","getLength","initial","octetLen","rmPadding","constructLength","octets","slen","toDER","backHalf","require$$6","EC","hasOwnProperty","nh","keyPair","keyFromPrivate","keyFromPublic","genKeyPair","drbg","ns2","_truncateToN","truncOnly","msgBitLength","bkey","ns1","iter","kp","kpX","canonical","sinv","recoverPubKey","isYOdd","isSecondKey","rInv","getKeyRecoveryParam","Q","Qprime","eddsa","_secret","secret","isPoint","_pub","_pubBytes","fromSecret","encodePoint","lastIx","encodingLength","decodeInt","privBytes","sig","getSecret","pubBytes","R","S","_R","_S","_Rencoded","Rencoded","_Sencoded","Sencoded","encodeInt","toBytes","EDDSA","pointClass","keyFromSecret","hashInt","messagePrefix","s_","makeSignature","SG","normed","xIsOdd","elliptic","version","SecureStore","ExpoCrypto","STORAGE_KEYS","IOS_KEYCHAIN_GROUP","initSecureStore","isWebPlatform","initExpoCrypto","getSecureRandomBytes","Function","getCrypto","KeyManager","invalidateCache","cachedPublicKey","cachedHasIdentity","invalidateSharedCache","cachedSharedPublicKey","cachedHasSharedIdentity","generateKeyPairSync","privateKey","generateKeyPair","privateKeyHex","createSharedIdentity","store","setItemAsync","keychainAccessible","WHEN_UNLOCKED_THIS_DEVICE_ONLY","keychainAccessGroup","getSharedPublicKey","getItemAsync","getSharedPrivateKey","hasSharedIdentity","hasShared","importSharedIdentity","storeSharedSession","WHEN_UNLOCKED","getSharedSession","clearSharedSession","deleteItemAsync","migrateToSharedIdentity","getPrivateKey","createIdentity","importKeyPair","getPublicKey","hasIdentity","deleteIdentity","skipBackup","userConfirmed","backupIdentity","backupError","verifyIdentityIntegrity","isValidPrivateKey","isValidPublicKey","derivePublicKey","getKeyPairObject","restoreIdentityFromBackup","backupPrivateKey","backupPublicKey","shortenPublicKey","isNodeJS","Crypto","digestStringAsync","CryptoDigestAlgorithm","createHash","SignatureService","generateChallenge","getRandomBytesAsync","hashMessage","messageHash","signWithKey","verifySync","createSignedMessage","messageWithTimestamp","verifySignedMessage","signedMessage","maxAgeMs","signChallenge","verifyChallengeResponse","originalChallenge","createRegistrationSignature","signRequestData","canonicalParts","wrapXOFConstructorWithOpts","wrapConstructorWithOpts","nextTick","byteSwapIfBE","swap8IfBE","isBytes","anumber","abytes","ahash","outputLen","blockLen","aexists","checkFinished","destroyed","finished","aoutput","u8","u32","Uint32Array","clean","arrays","createView","DataView","rotr","rotl","byteSwap","byteSwap32","bytesToHex","hasHexBuiltin","hex","hexes","hexToBytes","fromHex","ai","n1","asciiToBase16","n2","char","asyncLoop","iters","tick","ts","bytesToUtf8","TextDecoder","decode","kdfInputToBytes","concatBytes","sum","pad","checkOpts","defaults","opts","assign","createHasher","createOptHasher","createXOFer","bytesLength","crypto_1","isSafeInteger","lengths","swap32IfBE","asciis","_0","_9","F","TextEncoder","hashCons","hashC","wrapConstructor","_md","SHA512_IV","SHA384_IV","SHA224_IV","HashMD","setBigUint64","Chi","Maj","utils_ts_1","view","_32n","_u32_max","wh","wl","setUint32","padOffset","take","dataView","roundClean","digestInto","oview","destroy","_cloneInto","to","SHA256_IV","_u64","toBig","shrSL","shrSH","rotrSH","rotrBL","rotrBH","rotr32H","rotlSL","rotlSH","rotlBH","add5L","add5H","add4L","add3L","add3H","fromBig","U32_MASK64","le","lst","Al","_l","rotrSL","_h","rotr32L","rotlBL","Bl","Cl","low","Dl","add4H","El","u64","sha2","sha512_224","sha512_256","SHA512_256","SHA512_224","_md_ts_1","SHA256_K","SHA256_W","G","H","getUint32","W15","W2","s0","K512","SHA512_Kh","SHA512_Kl","SHA512_W_H","SHA512_W_L","Fh","Fl","Gh","Gl","Hh","Hl","W15h","W15l","s0h","s0l","W2h","W2l","s1h","s1l","SUMl","SUMh","sigma1h","sigma1l","CHIh","CHIl","T1ll","T1h","T1l","sigma0h","sigma0l","MAJh","MAJl","All","T224_IV","T256_IV","sha2_ts_1","HMAC","_key","iHash","oHash","getPrototypeOf","pbkdf2_1","pbkdf2","salt","dkLen","DK","PRF","PRFSalt","pbkdf2Init","prfW","ti","Ti","setInt32","ui","pbkdf2Output","pbkdf2Async","asyncTick","hmac_ts_1","_password","_salt","_opts","_wordlists","wordlists","_default","czech","chinese_simplified","chinese_traditional","korean","french","italian","spanish","require$$7","japanese","JA","require$$8","portuguese","require$$9","english","EN","sha256_1","sha512_1","utils_1","_wordlists_1","DEFAULT_WORDLIST","INVALID_MNEMONIC","INVALID_ENTROPY","WORDLIST_REQUIRED","lpad","padString","binaryToByte","bin","bytesToBinary","deriveChecksumBits","entropyBuffer","CS","mnemonicToEntropy","mnemonic","wordlist","dividerIndex","entropyBits","checksumBits","entropyBytes","match","entropyToMnemonic","binary","mnemonicToSeedSync","mnemonicBuffer","saltBuffer","mnemonicToSeed","then","generateMnemonic","strength","rng","validateMnemonic","setDefaultWordlist","getDefaultWordlist","every","_wordlists_2","RecoveryPhraseService","generateIdentityWithRecovery","bip39.generateMnemonic","bip39.mnemonicToSeed","phrase","generateIdentityWithRecovery24","restoreFromPhrase","normalizedPhrase","bip39.validateMnemonic","validatePhrase","getWordList","bip39.wordlists","isValidWord","getSuggestions","partial","lowerPartial","derivePublicKeyFromPhrase","phraseToWords","wordsToPhrase","toast","webToast","WebSonner","useAuthStore","isAuthenticated","isLoading","lastUserFetch","loginSuccess","loginFailure","setUser","fetchUser","forceRefresh","cacheAge","POSITIVE_INFINITY","cacheValid","PACKET_TYPES","PACKET_TYPES_REVERSE","ERROR_PACKET","withNativeBlob","withNativeArrayBuffer","encodePacket","supportsBinary","callback","encodeBlobAsBase64","fileReader","FileReader","onload","content","readAsDataURL","TEXT_ENCODER","chars","decodePacket","encodedPacket","binaryType","mapBinary","charAt","decodeBase64Packet","encoded1","encoded2","encoded3","encoded4","bufferLength","arraybuffer","SEPARATOR","createPacketEncoderStream","TransformStream","packet","arrayBuffer","encoded","encodePacketToBinary","payloadLength","setUint8","setUint16","TEXT_DECODER","totalLength","chunks","chunk","concatChunks","Emitter","on","_callbacks","once","removeListener","removeAllListeners","callbacks","splice","emit","emitReserved","listeners","hasListeners","setTimeoutFn","globalThisShim","pick","attr","NATIVE_SET_TIMEOUT","NATIVE_CLEAR_TIMEOUT","installTimerFunctions","useNativeTimers","clearTimeoutFn","utf8Length","randomString","TransportError","Transport","socket","forceBase64","readyState","doOpen","doClose","onClose","send","packets","onOpen","onData","onPacket","pause","onPause","createUri","schema","_hostname","_port","_query","hostname","port","secure","encodedQuery","Polling","_polling","_poll","doPoll","encodedPayload","encodedPackets","decodedPacket","decodePayload","encodePayload","doWrite","uri","timestampRequests","timestampParam","sid","XMLHttpRequest","hasCORS","empty","BaseXHR","isSSL","protocol","xd","xhrStatus","pollXhr","Request","createRequest","_method","_uri","_data","_create","xdomain","xhr","_xhr","extraHeaders","setDisableHeaderCheck","setRequestHeader","cookieJar","addCookies","withCredentials","onreadystatechange","parseCookies","getResponseHeader","_onLoad","_onError","_index","requestsCount","requests","_cleanup","fromError","responseText","attachEvent","unloadHandler","hasXHR2","newRequest","responseType","BaseWS","protocols","createSocket","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","onmessage","ev","onerror","lastPacket","WebSocketCtor","WebSocket","MozWebSocket","transports","websocket","_packet","webtransport","_transport","WebTransport","transportOptions","catch","ready","createBidirectionalStream","stream","decoderStream","maxPayload","expectedLength","isBinary","headerArray","getUint16","createPacketDecoderStream","MAX_SAFE_INTEGER","reader","readable","pipeThrough","getReader","encoderStream","pipeTo","_writer","getWriter","done","polling","exec","source","host","authority","ipv6uri","pathNames","regx","names","queryKey","$0","$1","$2","withEventListeners","OFFLINE_EVENT_LISTENERS","listener","SocketWithoutUpgrade","writeBuffer","_prevBufferLen","_pingInterval","_pingTimeout","_maxPayload","_pingTimeoutTime","parsedUri","_transportsByName","transportName","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","threshold","closeOnBeforeunload","qry","pairs","pair","_beforeunloadEventListener","transport","_offlineEventListener","_onClose","_cookieJar","createCookieJar","_open","createTransport","EIO","priorWebsocketSuccess","setTransport","_onDrain","_onPacket","flush","onHandshake","_sendPacket","_resetPingTimeout","pingInterval","pingTimeout","_pingTimeoutTimer","upgrading","_getWritablePackets","payloadSize","_hasPingExpired","hasExpired","compress","cleanupAndClose","waitForUpgrade","tryAllTransports","SocketWithUpgrade","_upgrades","_probe","failed","onTransportOpen","freezeTransport","onTransportClose","onupgrade","_filterUpgrades","upgrades","filteredUpgrades","DEFAULT_TRANSPORTS","withNativeFile","File","hasBinary","deconstructPacket","buffers","packetData","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","RESERVED_EVENTS","PacketType","Decoder","reviver","reconstructor","decodeString","isBinaryEvent","BINARY_EVENT","BINARY_ACK","EVENT","ACK","BinaryReconstructor","takeBinaryData","nsp","tryParse","isPayloadValid","CONNECT","isObject","DISCONNECT","CONNECT_ERROR","finishedReconstruction","reconPack","binData","replacer","encodeAsString","encodeAsBinary","deconstruction","unshift","freeze","connect","connect_error","disconnect","disconnecting","newListener","Socket","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","ids","acks","flags","_autoConnect","disconnected","subEvents","subs","onpacket","active","_readyState","_b","_c","retries","fromQueue","volatile","_addToQueue","ack","pop","_registerAckCallback","isTransportWritable","engine","isConnected","notifyOutgoingListeners","ackTimeout","timer","withError","emitWithAck","arg1","arg2","tryCount","responseArgs","_drainQueue","_sendConnectPacket","_pid","pid","_lastOffset","_clearAcks","onconnect","onevent","onack","ondisconnect","emitEvent","_anyListeners","sent","emitBuffered","subDestroy","onAny","prependAny","offAny","listenersAny","onAnyOutgoing","_anyOutgoingListeners","prependAnyOutgoing","offAnyOutgoing","listenersAnyOutgoing","Backoff","factor","jitter","attempts","deviation","reset","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","Encoder","decoder","autoConnect","_reconnection","skipReconnect","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","maybeReconnectOnOpen","_reconnecting","reconnect","Engine","openSubDestroy","errorSub","onping","ondata","ondecoded","_destroy","_close","onreconnect","loc","test","sameNamespace","forceNew","multiplex","useSessionSocket","activeSessionId","currentDeviceId","refreshSessions","clearSessionState","onRemoteSignOut","onSessionRemoved","socketRef","useRef","joinedRoomRef","refreshSessionsRef","logoutRef","clearSessionStateRef","onRemoteSignOutRef","onSessionRemovedRef","activeSessionIdRef","currentDeviceIdRef","useEffect","roomId","handleConnect","handleSessionUpdate","currentActiveSessionId","DEFAULT_INVALID_SESSION_MESSAGES","getResponseStatus","isInvalidSessionError","normalizedMessage","extractErrorMessage","isTimeoutOrNetworkError","typeErrorMessage","fallbackMessage","withMessage","withResponse","responseMessage","handleAuthError","defaultMessage","setAuthError","resolvedStatus","normalizeSession","lastActive","sortSessions","sessions","timeA","getTime","timeB","localeCompare","deduplicateSessionsByUserId","userSessionMap","isCurrentActive","isExistingActive","existingTime","values","normalizeAndSortSessions","deduplicateByUserId","deduplicatedBySessionId","sessionMap","deduplicateSessions","mapSessionsToClient","fallbackDeviceId","fallbackUserId","isCurrent","Boolean","fetchSessionsWithFallback","deviceSessions","userSessions","createWebStorage","MEMORY_STORAGE","asyncStorageInstance","createPlatformStorage","asyncStorageModule","createNativeStorage","getStorageKeys","QUERY_CACHE_KEY","createQueryClient","QueryClient","defaultOptions","queries","staleTime","gcTime","attemptIndex","refetchOnReconnect","refetchOnWindowFocus","networkMode","mutations","clearQueryCache","adapter","persistClient","client","serialized","clientState","restoreClient","maxAge","removeClient","createPersistenceAdapter","DEFAULT_SAVE_ERROR_MESSAGE","useSessionManagement","logoutStore","applyLanguagePreference","onAuthStateChange","setTokenReady","queryClient","setSessions","useState","setActiveSessionId","refreshInFlightRef","removedSessionsRef","lastRefreshRef","storageKeys","useMemo","saveSessionIds","useCallback","uniqueIds","updateSessions","incoming","prevSessions","processed","merge","normalizedExisting","normalizedIncoming","merged","mergeSessions","sortedA","sortedB","sessionsEqual","sessionsArraysEqual","saveActiveSessionId","clearSessionStorage","activateSession","trackRemovedSession","findReplacementSession","validationResults","maxConcurrency","safeConcurrency","all","currentIndex","validation","raw","validateSessionBatch","validSession","switchSession","invalidSession","otherSessionIds","replacementUser","activeUserId","refreshPromise","otherSessions","isRefreshInFlight","LOGOUT_ALL_ERROR_CODE","screenLoaders","OxyAuth","AccountOverview","AccountSettings","AccountCenter","AccountSwitcher","AccountVerification","SessionManagement","PaymentGateway","Profile","LanguageSelector","PrivacySettings","SearchSettings","FileManagement","HelpSupport","FAQ","Feedback","LegalDocuments","AppInfo","PremiumSubscription","WelcomeNewUser","UserLinks","HistoryView","SavesCollections","EditProfileField","LearnMoreUsernames","KarmaCenter","KarmaLeaderboard","KarmaRewards","KarmaRules","AboutKarma","KarmaFAQ","FollowersList","FollowingList","createStoreImpl","createState","setState","nextState","is","previousState","getState","getInitialState","initialState","currentScreen","screenProps","currentStep","isOpen","fullScreen","bottomSheetStore","showBottomSheet","screenOrConfig","props","initialStep","enUS","esES","caES","frFR","deDE","itIT","ptPT","jaJP","koKR","zhCN","arSA","DICTS","FALLBACK","translate","locale","vars","accounts","accountOrder","accountsArray","loading","loadingSessionIds","buildAccountsArray","order","account","createQuickAccount","existingAccount","displayName","full","avatarUrl","avatar","useAccountStore","setAccounts","accountMap","seenSessionIds","newAccount","addAccount","newAccounts","newOrder","updateAccount","updated","removeAccount","_removed","rest","moveAccountToTop","filtered","setLoadingSession","newSet","setError","loadAccounts","existingAccounts","preserveOrder","existingMap","missingSessionIds","ordered","batchResults","orderToUse","seen","queryKeys","lists","detail","users","userIds","profile","devices","privacy","security","activity","recent","invalidateAccountQueries","invalidateQueries","invalidateUserQueries","invalidateSessionQueries","SessionSyncRequiredError","AuthenticationFailedError","ensureValidToken","tokenError","isAuthenticationError","withAuthErrorHandling","apiCall","syncSession","authenticatedApiCall","refreshAvatarInStore","avatarFileId","isWebBrowser","documentElement","isIdentityProvider","OxyContext","createContext","cachedUseFollowHook","OxyContextProvider","children","providedOxyServices","authWebUrl","authRedirectUri","oxyServicesRef","useShallow","tokenReady","initialized","setInitialized","setAuthState","storageRef","setStorage","mounted","storageInstance","currentLanguage","currentLanguageMetadata","languageName","currentLanguageName","nativeLanguageName","currentNativeLanguageName","setLanguage","languageKey","setCurrentLanguage","loadLanguageFromStorage","savedLanguageRaw","normalized","languageId","hydrateLanguage","useLanguageManagement","useQueryClient","logoutAll","performSignIn","deviceFingerprintObj","isOffline","fullUser","sessionResponse","localSessionId","localDeviceId","privacySettings","offlineSession","allDeviceSessions","existingSession","logoutError","sessionToLogout","filteredSessions","isInvalid","useAuthOperations","clearAllAccountData","useDeviceManagement","useFollowHook","useFollow","loggerUtil","loadUseFollowHook","restoreSessionsFromStorage","storedSessionIdsJson","storedSessionIds","storedActiveSessionId","validSessions","validationError","switchError","handleWebSSOSession","clientSession","existingIds","shouldTryWebSSO","onSessionFound","onSSOUnavailable","isCheckingRef","hasCheckedRef","fedCMSupported","checkSSO","useWebSSO","lastIdPCheckRef","handleVisibilityChange","visibilityState","cssText","cleaned","handleMessage","remove","checkIdPSession","activeSession","refreshSessionsWithUser","handleSessionRemoved","handleRemoteSignOut","remoteError","switchSessionForContext","showBottomSheetForContext","globalShowBottomSheet","openAvatarPicker","selectMode","multiSelect","disabledMimeTypes","afterSelect","onSelect","visError","updateAvatarVisibility","setQueryData","updateProfileWithAvatar","contextValue","isTokenReady","isStorageReady","handlePopupSession","removeSession","_jsx","Provider","useOxy","useContext","useAuth","oxySignIn","popupSession","popupError","existingKey","loginUrl","isReady","signOut","signOutAll","refresh","WebOxyProvider","providedQueryClient","queryClientRef","setQueryClient","QueryClientProvider","assets","uploadProgress","uploading","linking","deleting","useAssetStore","setAsset","setAssets","assetMap","removeAsset","assetId","setUploadProgress","progress","removeUploadProgress","addLink","link","links","updatedAsset","usageCount","removeLink","filteredLinks","setUploading","setLinking","setDeleting","setUploadError","upload","setLinkError","setDeleteError","clearErrors","getAssetsByApp","getAssetsByEntity","getAssetUsageCount","isAssetLinked","useAssets","useAsset","useUploadProgress","useAssetLoading","useAssetErrors","useAssetsByApp","useAssetsByEntity","useAssetUsageCount","useIsAssetLinked","oxyInstance","setOxyAssetInstance","uploaded","percentage","createdBy","unlink","getUrl","getAsset","deleteAsset","restore","getVariants","setOxyFileUrlInstance","useFileDownloadUrl","setUrl","cancelled","resolvedUrl","fallbackUrl","load","useUserProfile","useQuery","queryFn","useUserProfiles","useQueries","useCurrentUser","useUserById","useUserByUsername","useUsersBySessions","usePrivacySettings","targetUserId","useSessions","useSession","lastActivity","useDeviceSessions","useUserDevices","useSecurityInfo","useSecurityActivity","useRecentSecurityActivity","useUpdateProfile","useMutation","mutationFn","onMutate","cancelQueries","previousUser","getQueryData","onSuccess","useUploadAvatar","uploadResult","optimisticUser","useUpdateAccountSettings","onSettled","useUpdatePrivacySettings","previousPrivacySettings","currentUser","updatedUser","useUploadFile","useSwitchSession","useLogoutSession","previousSessions","updatedSessions","useLogoutAll","useUpdateDeviceName","useRemoveDevice","createProfileMutation","cancelQueryKeys","optimisticUpdate","successMessage","updateAuthStore","shouldInvalidateUserQueries","shouldInvalidateAccountQueries","customOnSuccess","variables","_variables","createGenericMutation","optimisticData","previous","useFileFiltering","files","initialViewMode","initialSortBy","initialSortOrder","viewMode","setViewMode","searchQuery","setSearchQuery","sortBy","setSortBy","sortOrder","setSortOrder","toggleSortOrder","filteredFiles","filteredByMode","filename","comparison","uploadDate","EMAIL_REGEX","USERNAME_REGEX","PASSWORD_REGEX","isValidEmail","isValidUsername","isValidPassword","isRequiredString","isRequiredNumber","isRequiredBoolean","isValidArray","isValidObject","isValidUUID","uuid","isValidURL","isValidDate","dateString","date","isValidFileSize","maxSize","isValidFileType","allowedTypes","extension","sanitizeString","sanitizeHTML","isValidObjectId","validateAndSanitizeUserInput","sanitized","isBrowser","hasLocalStorage","hasSessionStorage","hasNavigator","useAsync","asyncFn","deps","setData","useAsyncEffect","useDebounce","debouncedValue","setDebouncedValue","handler","useThrottle","throttledValue","setThrottledValue","lastRun","usePrevious","ref","useToggle","initialValue","setValue","toggle","setTrue","setFalse","useCounter","setCount","increment","decrement","useLocalStorage","storedValue","setStoredValue","valueToStore","useSessionStorage","useWindowSize","windowSize","setWindowSize","innerWidth","innerHeight","handleResize","useScrollPosition","scrollPosition","setScrollPosition","handleScroll","pageYOffset","useOnlineStatus","isOnline","setIsOnline","onLine","handleOnline","handleOffline","useMediaQuery","matches","setMatches","media","matchMedia","useKeyPress","targetKey","keyPressed","setKeyPressed","downHandler","upHandler","useClickOutside","contains","useFormValidation","initialValues","validationSchema","setValues","setErrors","touched","setTouched","valuesToValidate","newErrors","setTouchedField","isValid","validationErrors"],"mappings":"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CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,kEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,sEAINpD,IAAK,CACHhB,IAAK,EACLoE,OAAQ,CACN,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,iEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,kEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,mEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,oEAEF,CACE,mEACA,uED5lBR,CAAE,MAAOjkD,GACPyoD,OAAMniD,CACR,CAEAswD,EAAY,YAAa,CACvBpwD,KAAM,QACNm4C,MAAO,OACPtoC,EAAG,0EACHtK,EAAG,IACH7F,EAAG,IACH8B,EAAG,0EACH2wC,EAAG,IACH4c,KAAMA,EAAKN,OAGXzP,KAAM,mEACNqB,OAAQ,mEACRI,MAAO,CACL,CACEl7C,EAAG,mCACH7F,EAAG,qCAEL,CACE6F,EAAG,oCACH7F,EAAG,qCAIPy8C,MAAM,EACN9H,EAAG,CACD,mEACA,mEACA4N,iDEzMJ,IAAIte,EAAKvmC,KACLkzD,kCCDJ,IAAIvB,EAAO3xD,KACPw8C,EAAQv8C,KACRgmC,EAAS8W,KAEb,SAASmW,EAASngD,GAChB,KAAMnP,gBAAgBsvD,GACpB,OAAO,IAAIA,EAASngD,GACtBnP,KAAK+tD,KAAO5+C,EAAQ4+C,KACpB/tD,KAAKuvD,aAAepgD,EAAQogD,WAE5BvvD,KAAK63C,OAAS73C,KAAK+tD,KAAKjF,QACxB9oD,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","x_google_ignoreList":[0,1,2,5,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,75,76,77,78,79,80,81,82,83,84,85,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,125]}