@nlabs/reaktor 0.10.1 → 0.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/coverage/actions/index.html +21 -36
  2. package/coverage/actions/notifications.ts.html +223 -0
  3. package/coverage/actions/posts.ts.html +2356 -0
  4. package/coverage/adapters/arangoAdapter.ts.html +170 -20
  5. package/coverage/adapters/fileAdapter.ts.html +445 -0
  6. package/coverage/adapters/index.html +72 -42
  7. package/coverage/adapters/postAdapter.ts.html +436 -0
  8. package/coverage/adapters/reaktorAdapter.ts.html +201 -18
  9. package/coverage/adapters/tagAdapter.ts.html +274 -25
  10. package/coverage/adapters/userAdapter.ts.html +829 -0
  11. package/coverage/analyticsUtils.ts.html +286 -0
  12. package/coverage/config.ts.html +766 -0
  13. package/coverage/index.html +81 -51
  14. package/coverage/mocks/group.ts.html +5 -5
  15. package/coverage/mocks/image.ts.html +18 -12
  16. package/coverage/mocks/index.html +37 -7
  17. package/coverage/mocks/post.ts.html +8 -8
  18. package/coverage/mocks/tag.ts.html +2 -2
  19. package/coverage/mocks/user.ts.html +18 -15
  20. package/coverage/testUtils.ts.html +1309 -0
  21. package/coverage/translationQueue.ts.html +592 -0
  22. package/coverage/types/error.types.ts.html +148 -0
  23. package/coverage/types/index.html +2 -2
  24. package/coverage/utils/adapterUtils.ts.html +39 -27
  25. package/coverage/utils/analyticsUtils.ts.html +35 -41
  26. package/coverage/utils/authUtils.ts.html +328 -0
  27. package/coverage/utils/dbI18n.ts.html +280 -0
  28. package/coverage/utils/googleTranslate.ts.html +385 -0
  29. package/coverage/utils/index.html +29 -44
  30. package/coverage/utils/localeUtils.ts.html +193 -0
  31. package/coverage/utils/sessionUtils.ts.html +211 -0
  32. package/coverage/utils/testUtils.ts.html +1309 -0
  33. package/lex.config.mjs +34 -0
  34. package/lib/actions/apps.d.ts +25 -0
  35. package/lib/actions/apps.js +11 -11
  36. package/lib/actions/connections.d.ts +5 -0
  37. package/lib/actions/connections.js +6 -6
  38. package/lib/actions/content.d.ts +13 -0
  39. package/lib/actions/content.js +9 -9
  40. package/lib/actions/conversations.d.ts +16 -0
  41. package/lib/actions/conversations.js +17 -17
  42. package/lib/actions/dynamodb.d.ts +12 -0
  43. package/lib/actions/dynamodb.js +2 -2
  44. package/lib/actions/email.d.ts +8 -0
  45. package/lib/actions/email.js +2 -2
  46. package/lib/actions/files.d.ts +19 -0
  47. package/lib/actions/files.js +3 -3
  48. package/lib/actions/groups.d.ts +13 -0
  49. package/lib/actions/groups.js +15 -15
  50. package/lib/actions/images.d.ts +33 -0
  51. package/lib/actions/images.js +22 -22
  52. package/lib/actions/index.d.ts +27 -0
  53. package/lib/actions/index.js +2 -2
  54. package/lib/actions/ios.d.ts +7 -0
  55. package/lib/actions/ios.js +4 -4
  56. package/lib/actions/locations.d.ts +6 -0
  57. package/lib/actions/locations.js +3 -3
  58. package/lib/actions/messages.d.ts +13 -0
  59. package/lib/actions/messages.js +3 -3
  60. package/lib/actions/notifications.d.ts +9 -0
  61. package/lib/actions/notifications.js +2 -2
  62. package/lib/actions/payments.d.ts +12 -0
  63. package/lib/actions/payments.js +6 -6
  64. package/lib/actions/posts.d.ts +25 -0
  65. package/lib/actions/posts.js +30 -30
  66. package/lib/actions/profiles.d.ts +4 -0
  67. package/lib/actions/profiles.js +4 -4
  68. package/lib/actions/reactions.d.ts +32 -0
  69. package/lib/actions/reactions.js +16 -16
  70. package/lib/actions/s3.d.ts +11 -0
  71. package/lib/actions/s3.js +2 -2
  72. package/lib/actions/search.d.ts +3 -0
  73. package/lib/actions/search.js +3 -3
  74. package/lib/actions/sms.d.ts +2 -0
  75. package/lib/actions/sms.js +2 -2
  76. package/lib/actions/statistics.d.ts +4 -0
  77. package/lib/actions/statistics.js +4 -4
  78. package/lib/actions/subscriptions.d.ts +7 -0
  79. package/lib/actions/subscriptions.js +6 -6
  80. package/lib/actions/tags.d.ts +34 -0
  81. package/lib/actions/tags.js +6 -6
  82. package/lib/actions/users.d.ts +73 -0
  83. package/lib/actions/users.js +45 -42
  84. package/lib/actions/websockets.d.ts +20 -0
  85. package/lib/actions/websockets.js +8 -8
  86. package/lib/adapters/arangoAdapter.d.ts +8 -0
  87. package/lib/adapters/arangoAdapter.js +2 -2
  88. package/lib/adapters/contentAdapter.d.ts +8 -0
  89. package/lib/adapters/contentAdapter.js +2 -2
  90. package/lib/adapters/fileAdapter.d.ts +9 -0
  91. package/lib/adapters/fileAdapter.js +2 -2
  92. package/lib/adapters/imageAdapter.d.ts +8 -0
  93. package/lib/adapters/imageAdapter.js +2 -2
  94. package/lib/adapters/index.d.ts +9 -0
  95. package/lib/adapters/index.js +2 -0
  96. package/lib/adapters/messageAdapter.d.ts +8 -0
  97. package/lib/adapters/messageAdapter.js +2 -2
  98. package/lib/adapters/postAdapter.d.ts +8 -0
  99. package/lib/adapters/postAdapter.js +2 -2
  100. package/lib/adapters/reaktorAdapter.d.ts +16 -0
  101. package/lib/adapters/reaktorAdapter.js +2 -2
  102. package/lib/adapters/tagAdapter.d.ts +9 -0
  103. package/lib/adapters/tagAdapter.js +2 -2
  104. package/lib/adapters/userAdapter.d.ts +13 -0
  105. package/lib/adapters/userAdapter.js +2 -2
  106. package/lib/config.d.ts +57 -0
  107. package/lib/config.js +2 -2
  108. package/lib/handlers/graphqlHandler.d.ts +4 -0
  109. package/lib/handlers/graphqlHandler.js +2 -2
  110. package/lib/index.d.ts +19 -0
  111. package/lib/index.js +2 -2
  112. package/lib/lambdas/actions/websockets.d.ts +7 -0
  113. package/lib/lambdas/actions/websockets.js +6 -6
  114. package/lib/lambdas/authorizer.d.ts +20 -0
  115. package/lib/lambdas/authorizer.js +2 -2
  116. package/lib/lambdas/connection.d.ts +12 -0
  117. package/lib/lambdas/connection.js +2 -2
  118. package/lib/lambdas/utils/message.d.ts +1 -0
  119. package/lib/lambdas/utils/websocket.d.ts +7 -0
  120. package/lib/lambdas/utils/websocket.js +2 -2
  121. package/lib/mocks/conversation.d.ts +8 -0
  122. package/lib/mocks/file.d.ts +11 -0
  123. package/lib/mocks/group.d.ts +17 -0
  124. package/lib/mocks/group.js +2 -2
  125. package/lib/mocks/image.d.ts +3 -0
  126. package/lib/mocks/image.js +2 -2
  127. package/lib/mocks/post.d.ts +38 -0
  128. package/lib/mocks/post.js +2 -2
  129. package/lib/mocks/tag.d.ts +2 -0
  130. package/lib/mocks/tag.js +1 -1
  131. package/lib/mocks/user.d.ts +4 -0
  132. package/lib/mocks/user.js +2 -2
  133. package/lib/mutations/content.d.ts +2 -0
  134. package/lib/mutations/content.js +2 -0
  135. package/lib/mutations/index.d.ts +11 -0
  136. package/lib/mutations/index.js +2 -2
  137. package/lib/mutations/locations.d.ts +2 -0
  138. package/lib/mutations/locations.js +2 -2
  139. package/lib/mutations/messages.d.ts +2 -0
  140. package/lib/mutations/messages.js +2 -2
  141. package/lib/mutations/posts.d.ts +2 -0
  142. package/lib/mutations/posts.js +2 -2
  143. package/lib/mutations/profiles.d.ts +2 -0
  144. package/lib/mutations/profiles.js +2 -2
  145. package/lib/mutations/reactions.d.ts +2 -0
  146. package/lib/mutations/reactions.js +2 -2
  147. package/lib/mutations/statistics.d.ts +2 -0
  148. package/lib/mutations/statistics.js +2 -2
  149. package/lib/mutations/subscriptions.d.ts +2 -0
  150. package/lib/mutations/subscriptions.js +2 -2
  151. package/lib/mutations/tags.d.ts +2 -0
  152. package/lib/mutations/tags.js +2 -2
  153. package/lib/mutations/users.d.ts +1 -0
  154. package/lib/mutations/users.js +2 -2
  155. package/lib/objectTypes/app.d.ts +3 -0
  156. package/lib/objectTypes/app.js +2 -2
  157. package/lib/objectTypes/bankAccount.d.ts +1 -0
  158. package/lib/objectTypes/connection.d.ts +1 -0
  159. package/lib/objectTypes/connection.js +2 -2
  160. package/lib/objectTypes/content.d.ts +2 -0
  161. package/lib/objectTypes/content.js +2 -0
  162. package/lib/objectTypes/conversation.d.ts +2 -0
  163. package/lib/objectTypes/conversation.js +2 -2
  164. package/lib/objectTypes/creditCard.d.ts +1 -0
  165. package/lib/objectTypes/document.d.ts +1 -0
  166. package/lib/objectTypes/error.d.ts +1 -0
  167. package/lib/objectTypes/external.d.ts +1 -0
  168. package/lib/objectTypes/external.js +2 -2
  169. package/lib/objectTypes/file.d.ts +2 -0
  170. package/lib/objectTypes/file.js +2 -2
  171. package/lib/objectTypes/filter.d.ts +1 -0
  172. package/lib/objectTypes/group.d.ts +3 -0
  173. package/lib/objectTypes/group.js +2 -2
  174. package/lib/objectTypes/iapSubscription.d.ts +1 -0
  175. package/lib/objectTypes/image.d.ts +6 -0
  176. package/lib/objectTypes/image.js +2 -2
  177. package/lib/objectTypes/index.d.ts +26 -0
  178. package/lib/objectTypes/index.js +2 -2
  179. package/lib/objectTypes/location.d.ts +2 -0
  180. package/lib/objectTypes/location.js +2 -2
  181. package/lib/objectTypes/message.d.ts +2 -0
  182. package/lib/objectTypes/message.js +2 -2
  183. package/lib/objectTypes/passcode.d.ts +1 -0
  184. package/lib/objectTypes/passcode.js +2 -2
  185. package/lib/objectTypes/plan.d.ts +2 -0
  186. package/lib/objectTypes/plan.js +2 -2
  187. package/lib/objectTypes/post.d.ts +2 -0
  188. package/lib/objectTypes/post.js +2 -2
  189. package/lib/objectTypes/profile.d.ts +3 -0
  190. package/lib/objectTypes/profile.js +2 -2
  191. package/lib/objectTypes/reaction.d.ts +2 -0
  192. package/lib/objectTypes/reaction.js +2 -2
  193. package/lib/objectTypes/relation.d.ts +1 -0
  194. package/lib/objectTypes/relation.js +2 -2
  195. package/lib/objectTypes/search.d.ts +1 -0
  196. package/lib/objectTypes/search.js +2 -2
  197. package/lib/objectTypes/statistics.d.ts +1 -0
  198. package/lib/objectTypes/statistics.js +2 -2
  199. package/lib/objectTypes/subscription.d.ts +2 -0
  200. package/lib/objectTypes/subscription.js +2 -2
  201. package/lib/objectTypes/tag.d.ts +2 -0
  202. package/lib/objectTypes/tag.js +2 -2
  203. package/lib/objectTypes/user.d.ts +4 -0
  204. package/lib/objectTypes/user.js +2 -2
  205. package/lib/queries/content.d.ts +2 -0
  206. package/lib/queries/content.js +2 -0
  207. package/lib/queries/index.d.ts +10 -0
  208. package/lib/queries/index.js +2 -2
  209. package/lib/queries/locations.d.ts +2 -0
  210. package/lib/queries/locations.js +2 -2
  211. package/lib/queries/messages.d.ts +2 -0
  212. package/lib/queries/messages.js +2 -2
  213. package/lib/queries/posts.d.ts +2 -0
  214. package/lib/queries/posts.js +2 -2
  215. package/lib/queries/reactions.d.ts +2 -0
  216. package/lib/queries/reactions.js +2 -2
  217. package/lib/queries/statistics.d.ts +2 -0
  218. package/lib/queries/statistics.js +2 -2
  219. package/lib/queries/subscriptions.d.ts +2 -0
  220. package/lib/queries/subscriptions.js +2 -2
  221. package/lib/queries/tags.d.ts +2 -0
  222. package/lib/queries/tags.js +2 -2
  223. package/lib/queries/users.d.ts +1 -0
  224. package/lib/queries/users.js +2 -2
  225. package/lib/templates/email/layout.d.ts +2 -0
  226. package/lib/templates/email/passwordForgot.d.ts +2 -0
  227. package/lib/templates/email/passwordRecovery.d.ts +2 -0
  228. package/lib/templates/email/verifyEmail.d.ts +2 -0
  229. package/lib/templates/email/welcome.d.ts +2 -0
  230. package/lib/templates/sms/passwordForgot.d.ts +2 -0
  231. package/lib/templates/sms/passwordRecovery.d.ts +2 -0
  232. package/lib/templates/sms/verifyEmail.d.ts +2 -0
  233. package/lib/templates/sms/verifyPhone.d.ts +2 -0
  234. package/lib/templates/sms/welcome.d.ts +2 -0
  235. package/lib/types/apps.types.d.ts +50 -0
  236. package/lib/types/apps.types.js +1 -1
  237. package/lib/types/arangodb.types.d.ts +38 -0
  238. package/lib/types/auth.types.d.ts +15 -0
  239. package/lib/types/connections.types.d.ts +9 -0
  240. package/lib/types/content.types.d.ts +31 -0
  241. package/lib/types/conversations.types.d.ts +31 -0
  242. package/lib/types/email.types.d.ts +17 -0
  243. package/lib/types/error.types.d.ts +21 -0
  244. package/lib/types/files.types.d.ts +27 -0
  245. package/lib/types/google.types.d.ts +33 -0
  246. package/lib/types/groups.types.d.ts +22 -0
  247. package/lib/types/images.types.d.ts +56 -0
  248. package/lib/types/index.d.ts +26 -0
  249. package/lib/types/index.js +2 -2
  250. package/lib/types/locations.types.d.ts +22 -0
  251. package/lib/types/messages.types.d.ts +20 -0
  252. package/lib/types/notifications.types.d.ts +23 -0
  253. package/lib/types/payments.types.d.ts +113 -0
  254. package/lib/types/posts.types.d.ts +32 -0
  255. package/lib/types/profiles.types.d.ts +20 -0
  256. package/lib/types/statistics.types.d.ts +3 -0
  257. package/lib/types/tags.types.d.ts +19 -0
  258. package/lib/types/users.types.d.ts +110 -0
  259. package/lib/types/websockets.types.d.ts +22 -0
  260. package/lib/utils/adapterUtils.d.ts +5 -0
  261. package/lib/utils/analyticsUtils.d.ts +25 -0
  262. package/lib/utils/analyticsUtils.js +2 -2
  263. package/lib/utils/arangodbUtils.d.ts +70 -0
  264. package/lib/utils/arangodbUtils.js +3 -3
  265. package/lib/utils/authUtils.d.ts +23 -0
  266. package/lib/utils/authUtils.js +2 -2
  267. package/lib/utils/contextUtils.d.ts +3 -0
  268. package/lib/utils/contextUtils.js +1 -1
  269. package/lib/utils/dbI18n.d.ts +10 -0
  270. package/lib/utils/dbI18n.example.d.ts +20 -0
  271. package/lib/utils/dbI18n.example.js +3 -3
  272. package/lib/utils/dbI18n.js +2 -2
  273. package/lib/utils/googleTranslate.d.ts +6 -0
  274. package/lib/utils/googleTranslate.js +2 -2
  275. package/lib/utils/graphqlUtils.d.ts +10 -0
  276. package/lib/utils/graphqlUtils.js +2 -2
  277. package/lib/utils/index.d.ts +18 -0
  278. package/lib/utils/index.js +2 -2
  279. package/lib/utils/languageDetection.d.ts +8 -0
  280. package/lib/utils/languageDetection.js +1 -1
  281. package/lib/utils/localeUtils.d.ts +11 -0
  282. package/lib/utils/localeUtils.example.d.ts +5 -0
  283. package/lib/utils/localeUtils.example.js +2 -2
  284. package/lib/utils/localeUtils.js +1 -1
  285. package/lib/utils/middlewareUtils.d.ts +2 -0
  286. package/lib/utils/middlewareUtils.js +2 -2
  287. package/lib/utils/sessionUtils.d.ts +18 -0
  288. package/lib/utils/sessionUtils.js +2 -2
  289. package/lib/utils/stripeUtils.d.ts +7 -0
  290. package/lib/utils/stripeUtils.js +2 -2
  291. package/lib/utils/templateUtils.d.ts +3 -0
  292. package/lib/utils/testUtils.d.ts +95 -0
  293. package/lib/utils/testUtils.js +2 -2
  294. package/lib/utils/translationQueue.d.ts +29 -0
  295. package/lib/utils/translationQueue.example.d.ts +33 -0
  296. package/lib/utils/translationQueue.example.js +2 -2
  297. package/lib/utils/translationQueue.js +2 -2
  298. package/package.json +22 -21
  299. package/tsconfig.build.json +21 -0
  300. package/tsconfig.lint.json +33 -0
  301. package/tsconfig.test.json +31 -0
  302. package/dist/actions/apps.js +0 -242
  303. package/dist/actions/connections.js +0 -90
  304. package/dist/actions/conversations.js +0 -350
  305. package/dist/actions/dynamodb.js +0 -150
  306. package/dist/actions/email.js +0 -152
  307. package/dist/actions/files.js +0 -283
  308. package/dist/actions/groups.js +0 -292
  309. package/dist/actions/images.js +0 -735
  310. package/dist/actions/index.js +0 -66
  311. package/dist/actions/ios.js +0 -164
  312. package/dist/actions/locations.js +0 -122
  313. package/dist/actions/messages.js +0 -208
  314. package/dist/actions/notifications.js +0 -59
  315. package/dist/actions/payments.js +0 -497
  316. package/dist/actions/personas.js +0 -110
  317. package/dist/actions/posts.js +0 -595
  318. package/dist/actions/reactions.js +0 -322
  319. package/dist/actions/s3.js +0 -133
  320. package/dist/actions/search.js +0 -90
  321. package/dist/actions/sms.js +0 -108
  322. package/dist/actions/statistics.js +0 -62
  323. package/dist/actions/subscription.js +0 -220
  324. package/dist/actions/tags.js +0 -292
  325. package/dist/actions/users.js +0 -784
  326. package/dist/actions/websockets.js +0 -174
  327. package/dist/adapters/arangoAdapter.js +0 -46
  328. package/dist/adapters/fileAdapter.js +0 -76
  329. package/dist/adapters/imageAdapter.js +0 -40
  330. package/dist/adapters/messageAdapter.js +0 -49
  331. package/dist/adapters/postAdapter.js +0 -70
  332. package/dist/adapters/reaktorAdapter.js +0 -44
  333. package/dist/adapters/tagAdapter.js +0 -50
  334. package/dist/adapters/userAdapter.js +0 -115
  335. package/dist/config.js +0 -125
  336. package/dist/index.js +0 -66
  337. package/dist/lambdas/actions/websockets.js +0 -132
  338. package/dist/lambdas/authorizer.js +0 -67
  339. package/dist/lambdas/connection.js +0 -91
  340. package/dist/lambdas/utils/message.js +0 -42
  341. package/dist/lambdas/utils/websocket.js +0 -105
  342. package/dist/mocks/conversation.js +0 -35
  343. package/dist/mocks/file.js +0 -38
  344. package/dist/mocks/group.js +0 -47
  345. package/dist/mocks/image.js +0 -44
  346. package/dist/mocks/nlabs.png +0 -0
  347. package/dist/mocks/post.js +0 -55
  348. package/dist/mocks/tag.js +0 -37
  349. package/dist/mocks/user.js +0 -88
  350. package/dist/mutations/index.js +0 -26
  351. package/dist/mutations/locations.js +0 -44
  352. package/dist/mutations/messages.js +0 -86
  353. package/dist/mutations/personas.js +0 -100
  354. package/dist/mutations/posts.js +0 -53
  355. package/dist/mutations/reactions.js +0 -51
  356. package/dist/mutations/statistics.js +0 -39
  357. package/dist/mutations/subscriptions.js +0 -56
  358. package/dist/mutations/tags.js +0 -120
  359. package/dist/mutations/users.js +0 -116
  360. package/dist/objectTypes/app.js +0 -173
  361. package/dist/objectTypes/bankAccount.js +0 -76
  362. package/dist/objectTypes/connection.js +0 -48
  363. package/dist/objectTypes/conversation.js +0 -77
  364. package/dist/objectTypes/creditCard.js +0 -86
  365. package/dist/objectTypes/document.js +0 -46
  366. package/dist/objectTypes/error.js +0 -46
  367. package/dist/objectTypes/external.js +0 -74
  368. package/dist/objectTypes/file.js +0 -100
  369. package/dist/objectTypes/filter.js +0 -43
  370. package/dist/objectTypes/group.js +0 -123
  371. package/dist/objectTypes/iapSubscription.js +0 -40
  372. package/dist/objectTypes/image.js +0 -129
  373. package/dist/objectTypes/index.js +0 -68
  374. package/dist/objectTypes/location.js +0 -109
  375. package/dist/objectTypes/message.js +0 -96
  376. package/dist/objectTypes/passcode.js +0 -42
  377. package/dist/objectTypes/persona.js +0 -87
  378. package/dist/objectTypes/plan.js +0 -95
  379. package/dist/objectTypes/post.js +0 -125
  380. package/dist/objectTypes/reaction.js +0 -61
  381. package/dist/objectTypes/relation.js +0 -49
  382. package/dist/objectTypes/search.js +0 -72
  383. package/dist/objectTypes/statistics.js +0 -39
  384. package/dist/objectTypes/subscription.js +0 -117
  385. package/dist/objectTypes/tag.js +0 -65
  386. package/dist/objectTypes/user.js +0 -144
  387. package/dist/queries/index.js +0 -33
  388. package/dist/queries/locations.js +0 -45
  389. package/dist/queries/messages.js +0 -52
  390. package/dist/queries/posts.js +0 -154
  391. package/dist/queries/reactions.js +0 -56
  392. package/dist/queries/statistics.js +0 -39
  393. package/dist/queries/subscriptions.js +0 -44
  394. package/dist/queries/tags.js +0 -75
  395. package/dist/queries/users.js +0 -64
  396. package/dist/templates/email/layout.js +0 -302
  397. package/dist/templates/email/passwordForgot.js +0 -38
  398. package/dist/templates/email/passwordRecovery.js +0 -35
  399. package/dist/templates/email/verifyEmail.js +0 -38
  400. package/dist/templates/email/welcome.js +0 -38
  401. package/dist/templates/sms/passwordForgot.js +0 -24
  402. package/dist/templates/sms/passwordRecovery.js +0 -24
  403. package/dist/templates/sms/verifyEmail.js +0 -24
  404. package/dist/templates/sms/verifyPhone.js +0 -24
  405. package/dist/templates/sms/welcome.js +0 -24
  406. package/dist/types/apps.js +0 -32
  407. package/dist/types/arangodb.js +0 -16
  408. package/dist/types/auth.js +0 -16
  409. package/dist/types/connections.js +0 -16
  410. package/dist/types/conversations.js +0 -16
  411. package/dist/types/email.js +0 -16
  412. package/dist/types/error.js +0 -44
  413. package/dist/types/files.js +0 -16
  414. package/dist/types/google.js +0 -16
  415. package/dist/types/groups.js +0 -16
  416. package/dist/types/images.js +0 -16
  417. package/dist/types/index.js +0 -60
  418. package/dist/types/locations.js +0 -16
  419. package/dist/types/messages.js +0 -16
  420. package/dist/types/notifications.js +0 -16
  421. package/dist/types/payments.js +0 -16
  422. package/dist/types/personas.js +0 -16
  423. package/dist/types/posts.js +0 -16
  424. package/dist/types/statistics.js +0 -16
  425. package/dist/types/tags.js +0 -16
  426. package/dist/types/users.js +0 -16
  427. package/dist/types/websockets.js +0 -16
  428. package/dist/utils/adapterUtils.js +0 -45
  429. package/dist/utils/analyticsUtils.js +0 -72
  430. package/dist/utils/arangodbUtils.js +0 -165
  431. package/dist/utils/auth.js +0 -57
  432. package/dist/utils/index.js +0 -30
  433. package/dist/utils/session.js +0 -60
  434. package/jest.config.js +0 -17
  435. package/jest.setup.js +0 -36
  436. package/lex.config.cjs +0 -13
  437. package/lib/mutations/locations.integration.js +0 -2
  438. package/lib/mutations/messages.integration.js +0 -2
  439. package/lib/mutations/posts.integration.js +0 -2
  440. package/lib/mutations/profiles.integration.js +0 -2
  441. package/lib/mutations/reactions.integration.js +0 -2
  442. package/lib/mutations/statistics.integration.js +0 -2
  443. package/lib/mutations/subscriptions.integration.js +0 -2
  444. package/lib/mutations/tags.integration.js +0 -2
  445. package/lib/mutations/users.integration.js +0 -2
  446. package/lib/queries/locations.integration.js +0 -2
  447. package/lib/queries/messages.integration.js +0 -2
  448. package/lib/queries/posts.integration.js +0 -2
  449. package/lib/queries/reactions.integration.js +0 -2
  450. package/lib/queries/tags.integration.js +0 -2
  451. package/lib/queries/users.integration.js +0 -2
@@ -1,84 +1,87 @@
1
- import{createHash as v,createPassword as P,parseArangoId as M,parseChar as Q,parseEmail as H,parseNum as J,parsePassword as L,parsePhone as Y,parseUsername as S}from"@nlabs/utils";import{aql as U}from"arangojs";import{DateTime as X}from"luxon";import z from"stripe";import{parseUser as D}from"../adapters/userAdapter";import{Config as K}from"../config";import{sendEmail as Z}from"./email";import{sendSms as ee}from"./sms";import{ErrorTypes as d}from"../types/error.types";import{logError as I,logException as q}from"../utils/analyticsUtils";import{getDocId as j,getLimit as se,selectReactionCountByType as re,useDb as g}from"../utils/arangodbUtils";import{detectLanguage as te}from"../utils/languageDetection";import{getSession as _,setSession as ne}from"../utils/sessionUtils";const E="users",oe="2025-05-28.basil";var ae=(t=>(t[t.DEACTIVATED=0]="DEACTIVATED",t[t.ACTIVE=1]="ACTIVE",t[t.PREMIUM=2]="PREMIUM",t[t.CONTENT_ADMIN=3]="CONTENT_ADMIN",t[t.ADMIN=4]="ADMIN",t))(ae||{});const B=(e,o,s,i=15)=>{const n=X.local(),t=n.plus({minutes:i}),u=Math.floor(n.toSeconds()),r=Math.floor(t.toSeconds()),a=ne({exp:r,iat:u,userAccess:s,userId:e,username:o});return{expires:t.toMillis(),issued:n.toMillis(),token:a,userId:e,username:o}},$=(e=[])=>e.reduce((o,s)=>s.includes("Count")?re("users","u",s,o):o,{objects:[],queries:[]}),b=(e={})=>{const{from:o=0,to:s=30}=e,i=se(o,s);return{...e,limit:i}},Ue=async(e,o)=>{const s="addUser",{databaseName:i,languageContext:n}=e,{email:t,password:u,phone:r,username:a,userId:c,_key:l,_id:p,...m}=D(o),T=L(u);if(!!!T||!(!!a||!!r||!!t))return q({action:s,category:E,params:{username:a},value:d.INVALID_ARGUMENTS},e);const A=v(`${a||r||t}${T}`,null),N=P(T,A),h=[];a&&h.push(`u.username == "${a}"`),t&&h.push(`u.email == "${t}"`),r&&h.push(`u.phone == ${r}`);const w=`FOR u IN users
2
- FILTER ${h.join(" || ")}
1
+ import{parseNum as Y}from"@nlabs/utils/parsers/numbers";import{createHash as L,createPassword as b,parseArangoId as x,parseChar as j,parseEmail as _,parsePassword as M,parsePhone as Q,parseUsername as w}from"@nlabs/utils/parsers/strings";import{aql as U}from"arangojs";import{DateTime as X}from"luxon";import z from"stripe";import{parseUser as D}from"../adapters/userAdapter.js";import{Config as K}from"../config.js";import{ErrorTypes as T}from"../types/error.types.js";import{logError as g,logException as q}from"../utils/analyticsUtils.js";import{getDocId as Z,getLimit as ee,selectReactionCountByType as se,useDb as f}from"../utils/arangodbUtils.js";import{detectLanguage as re}from"../utils/languageDetection.js";import{getSession as B,setSession as te}from"../utils/sessionUtils.js";import{sendEmail as oe}from"./email.js";import{sendSms as ne}from"./sms.js";const E="users",ae="2025-07-30.basil";var ie=(n=>(n[n.DEACTIVATED=0]="DEACTIVATED",n[n.ACTIVE=1]="ACTIVE",n[n.PREMIUM=2]="PREMIUM",n[n.CONTENT_ADMIN=3]="CONTENT_ADMIN",n[n.ADMIN=4]="ADMIN",n))(ie||{});const F=(e,o="",s=0,a=15)=>{const t=X.local(),n=t.plus({minutes:a}),c=Math.floor(t.toSeconds()),r=Math.floor(n.toSeconds()),l=te({exp:r,iat:c,userAccess:s,userId:e,username:o});return{expires:n.toMillis(),issued:t.toMillis(),token:l,userId:e,username:o}},C=(e=[])=>e.reduce((o,s)=>s.includes("Count")?se("users","u",s,o):o,{objects:[],queries:[]}),v=(e={})=>{const{from:o=0,to:s=30}=e,a=ee(o,s);return{...e,limit:a}},Ue=async(e,o)=>{const s="addUser",{databaseName:a,languageContext:t}=e,{confirm:n,...c}=o,{email:r,password:l,phone:u,username:i,userId:p,_key:m,_id:d,...y}=D(c);if(!!!l||!(!!i||!!u||!!r))return q({action:s,category:E,params:{username:i},value:T.INVALID_ARGUMENTS},e),null;const h=L(`${i||u||r}${l}`,""),O=b(l,h),$=[];i&&$.push(`u.username == "${i}"`),r&&$.push(`u.email == "${r}"`),u&&$.push(`u.phone == ${u}`);const P=`FOR u IN users
2
+ FILTER ${$.join(" || ")}
3
3
  LIMIT 1
4
- RETURN u`;try{if((await g(i).query(w).then(W=>W.all())).length)return q({action:s,category:E,params:{email:t,phone:r,username:a},value:d.EXISTING_ITEM},e)}catch(C){return I({action:s,category:E,params:{email:t,phone:r,username:a},value:d.DATABASE_ERROR},C,e)}const x=r?.replace(/\D/g,"").substring(0,3),O=te({...n,phoneCountryCode:x,userPreference:m.locale||"en"}),F=Math.floor(1e5+Math.random()*9e5),k=Math.floor(1e5+Math.random()*9e5),G={...m,_key:v(a,null),added:Date.now(),email:t,locale:O,modified:Date.now(),password:N,phone:r,salt:A,userAccess:1,username:a,verifiedEmail:!1,verifiedEmailCode:F,verifiedPhone:!1,verifiedSmsCode:k},V=U`INSERT ${G} IN users RETURN NEW`;return await g(i).query(V).then(C=>C.next()).catch(C=>I({action:s,category:E,params:{username:a},value:d.DATABASE_ERROR},C,e))},Ne=async(e,o)=>{const s="updateUser",{databaseName:i}=e,n=D(o),{_key:t,_id:u,tags:r=[],...a}=n,{id:c}=n,l=U`LET u = DOCUMENT(${c})
5
- UPDATE u WITH ${a} IN users
6
- RETURN NEW`;try{const p=g(i),m=await p.query(l).then(y=>y.next()),T=p.collection("isTagged");return await Promise.all(r.map(({id:y,name:f})=>{const R=U`FOR it IN isTagged
7
- FILTER it._from == ${y} && it._to == ${c} && it.name == ${f}
4
+ RETURN u`;try{if((await f(a).query(P).then(J=>J.all())).length)throw q({action:s,category:E,params:{email:r,phone:u,username:i},value:T.EXISTING_ITEM},e)}catch(S){throw g({action:s,category:E,params:{email:r,phone:u,username:i},value:T.DATABASE_ERROR},S,e)}const N=u?.replace(/\D/g,"").substring(0,3),k=re({...t,phoneCountryCode:N||"",userPreference:y.locale||"en"}),G=Math.floor(1e5+Math.random()*9e5),V=Math.floor(1e5+Math.random()*9e5),W={...y,_key:L(i),added:Date.now(),email:r,locale:k,modified:Date.now(),password:O,phone:u,salt:h,userAccess:1,username:i,verifiedEmail:!1,verifiedEmailCode:G,verifiedPhone:!1,verifiedSmsCode:V},H=U`INSERT ${W} IN users RETURN NEW`;return await f(a).query(H).then(S=>S.next()).catch(S=>{throw g({action:s,category:E,params:{username:i},value:T.DATABASE_ERROR},S,e)})},he=async(e,o)=>{const s="updateUser",{databaseName:a}=e,t=D(o),{_key:n,_id:c,tags:r=[],...l}=t,{id:u}=t,i=U`LET u = DOCUMENT(${u})
5
+ UPDATE u WITH ${l} IN users
6
+ RETURN NEW`;try{const p=f(a),m=await p.query(i).then(y=>y.next()),d=p.collection("isTagged");return await Promise.all(r.map(({id:y,name:I})=>{const R=U`FOR it IN isTagged
7
+ FILTER it._from == ${y} && it._to == ${u} && it.name == ${I}
8
8
  LIMIT 1
9
- RETURN it`;return p.query(R).then(A=>A.next()).then(A=>{if(A)return A;const N={_from:y,_key:v(`isTagged-${y}-${c}`),_to:c,added:Date.now(),name:f};return T.save(N,{returnNew:!0}).then(()=>N)})})),m}catch(p){return I({action:s,category:E,params:{user:o},value:d.DATABASE_ERROR},p,e)}},he=async(e,{email:o,phone:s,username:i})=>{const n="forgotPassword",{databaseName:t}=e,u=U`FOR u IN users
10
- FILTER u.email == ${o} || u.phone == ${s} || u.username == ${i}
9
+ RETURN it`;return p.query(R).then(A=>A.next()).then(A=>{if(A)return A;const h={_from:y,_key:L(`isTagged-${y}-${u}`),_to:u,added:Date.now(),name:I};return d.save(h,{returnNew:!0}).then(()=>h)})})),m}catch(p){throw g({action:s,category:E,params:{user:o},value:T.DATABASE_ERROR},p,e)}},Ne=async(e,{email:o,phone:s,username:a})=>{const t="forgotPassword",{databaseName:n}=e,c=U`FOR u IN users
10
+ FILTER u.email == ${o} || u.phone == ${s} || u.username == ${a}
11
11
  LIMIT 1
12
- RETURN u`;try{return await g(t).query(u).then(async r=>{const a=r.next();if(a){const{email:c,phone:l,verifiedEmail:p,verifiedPhone:m}=a,T=1e3*60*15,y=Math.floor(1e5+Math.random()*9e5),f=j("users",a);let R;if(c&&p&&(Z({context:e,text:`Your code is ${y}`}),R={verifiedEmailCode:y,verifiedEmailExpires:T}),l&&m&&(ee({context:e,text:`Your code is ${y}`}),R={verifiedSmsCode:y,verifiedPhoneExpires:T}),R.verifiedEmailCode||R.verifiedSmsCode){const A=U`UPDATE ${f} WITH ${R} IN users`;return await g(t).query(A),!0}return!1}return!1})}catch(r){return I({action:n,category:E,params:{email:o,phone:s,username:i},value:d.DATABASE_ERROR},r,e),!1}},Oe=async(e,{code:o,password:s,type:i,username:n})=>{const t="resetPassword",{databaseName:u}=e,r=L(s),a=U`FOR u IN users
13
- FILTER u.username == ${n}
12
+ RETURN u`;try{return await f(n).query(c).then(async r=>{const l=r.next();if(l){const{email:u,phone:i,verifiedEmail:p,verifiedPhone:m}=l,d=1e3*60*15,y=Math.floor(1e5+Math.random()*9e5),I=Z("users",l);let R;if(u&&p&&(oe({context:e,text:`Your code is ${y}`}),R={verifiedEmailCode:y,verifiedEmailExpires:d}),i&&m&&(ne({context:e,text:`Your code is ${y}`}),R={verifiedPhoneExpires:d,verifiedSmsCode:y}),R.verifiedEmailCode||R.verifiedSmsCode){const A=U`UPDATE ${I} WITH ${R} IN users`;return await f(n).query(A),!0}return!1}return!1})}catch(r){return g({action:t,category:E,params:{email:o,phone:s,username:a},value:T.DATABASE_ERROR},r,e),!1}},Oe=async(e,{code:o,password:s,type:a,username:t})=>{const n="resetPassword",{databaseName:c}=e,r=M(s),l=U`FOR u IN users
13
+ FILTER u.username == ${t}
14
14
  LIMIT 1
15
- RETURN u`;try{return await g(u).query(a).then(async c=>{const l=c.next();if(l){const{_id:p,salt:m,verifiedEmailCode:T,verifiedEmailExpires:y,verifiedSmsCode:f,verifiedPhoneExpires:R}=l,A=Date.now();let N;switch(i){case"email":o===T&&y>A&&(N={password:P(r,m)});break;case"phone":o===f&&R>A&&(N={password:P(r,m)});break;default:return!1}if(N){const h=U`UPDATE ${p} WITH ${N} IN users`;return await g(u).query(h),!0}}return!1})}catch(c){return I({action:t,category:E,params:{username:n},value:d.DATABASE_ERROR},c,e),!1}},$e=async(e,{code:o,type:s})=>{const i="confirmCode",{databaseName:n,session:{userId:t}}=e,u=j("users",{userId:t}),r=U`LET u = DOCUMENT(${u}) RETURN u`;try{return await g(n).query(r).then(a=>a.next()).then(({verifiedEmailCode:a,verifiedSmsCode:c})=>{switch(s){case"email":return o===a;case"phone":return o===c;default:return!1}})}catch(a){return I({action:i,category:E,params:{code:o,type:s},value:d.DATABASE_ERROR},a,e),!1}},Ce=(e,o)=>{const s="deleteUser",{databaseName:i}=e,{id:n}=D(o),t=U`LET u = DOCUMENT(${n})
15
+ RETURN u`;try{return await f(c).query(l).then(async u=>{const i=u.next();if(i){const{_id:p,salt:m,verifiedEmailCode:d,verifiedEmailExpires:y=0,verifiedSmsCode:I,verifiedPhoneExpires:R=0}=i,A=Date.now();let h;switch(a){case"email":o===d&&y>A&&(h={password:b(r,m)});break;case"phone":o===I&&R>A&&(h={password:b(r,m)});break;default:return!1}if(h){const O=U`UPDATE ${p} WITH ${h} IN users`;return await f(c).query(O),!0}}return!1})}catch(u){return g({action:n,category:E,params:{username:t},value:T.DATABASE_ERROR},u,e),!1}},$e=async(e,{code:o,type:s,value:a})=>{const t="confirmCode",{databaseName:n}=e,c=s==="sms",r=c?Q(a):_(a),u=`FOR u IN users
16
+ ${c?`FILTER u.phone == "${r}" && u.verifiedSmsCode == ${o}`:`FILTER u.email == "${r}" && u.verifiedEmailCode == ${o}`}
17
+ LIMIT 1
18
+ RETURN u`;try{return await f(n).query(u).then(i=>i.next()).then(i=>{if(i){const p=c?{verifiedPhone:!0,verifiedSmsCode:0}:{verifiedEmail:!0,verifiedEmailCode:0},m=U`UPDATE ${i._key} WITH ${p} IN users`;return f(n).query(m).then(()=>!0).catch(d=>(g({action:t,category:E,params:{code:o,type:s,value:r},value:T.DATABASE_ERROR},d,e),!1))}return!1})}catch(i){return g({action:t,category:E,params:{code:o,type:s,value:r},value:T.DATABASE_ERROR},i,e),!1}},Ce=(e,o)=>{const s="deleteUser",{databaseName:a}=e,{id:t}=D(o),n=U`LET u = DOCUMENT(${t})
16
19
  REMOVE u IN users
17
- RETURN OLD`,u=new z(K.get("stripe.token"),{apiVersion:oe,typescript:!0});return g(i).query(t).then(r=>r.next()).then(r=>u.customers.del(r?.stripeCustomerId).then(()=>u.accounts.del(r?.stripeAccountId)).then(()=>r)).catch(r=>I({action:s,category:E,params:{id:n},value:d.DATABASE_ERROR},r,e))},Se=(e,o)=>{const s="delete",{databaseName:i}=e,{id:n}=D(o),u=U`UPDATE ${n} WITH ${{userAccess:0}} IN users LIMIT 1 RETURN NEW`;return g(i).query(u).then(r=>r.next()).catch(r=>I({action:s,category:E,params:{id:n},value:d.DATABASE_ERROR},r,e))},qe=e=>{const{first:o,last:s,name:i="",username:n=""}=e,t=[o,s].join(" ").trim();return i||(t!==""?t:n||"Unknown")},De=e=>{const o="getSessionUser",{databaseName:s,fields:i,session:{userId:n,username:t}}=e,{objects:u,queries:r}=$(i),c=`LET u = DOCUMENT("${M(`users/${n}`)}")
20
+ RETURN OLD`,c=new z(K.get("stripe.token"),{apiVersion:ae,typescript:!0});return f(a).query(n).then(r=>r.next()).then(r=>c.customers.del(r?.stripeCustomerId).then(()=>c.accounts.del(r?.stripeAccountId)).then(()=>r)).catch(r=>g({action:s,category:E,params:{id:t},value:T.DATABASE_ERROR},r,e))},Se=(e,o)=>{const s="delete",{databaseName:a}=e,{id:t}=D(o),c=U`UPDATE ${t} WITH ${{userAccess:0}} IN users LIMIT 1 RETURN NEW`;return f(a).query(c).then(r=>r.next()).catch(r=>{throw g({action:s,category:E,params:{id:t},value:T.DATABASE_ERROR},r,e)})},we=e=>{const{first:o,last:s,name:a="",username:t=""}=e,n=[o,s].join(" ").trim();return a||(n!==""?n:t||"Unknown")},qe=e=>{const o="getSessionUser",{databaseName:s,fields:a,session:{userId:t,username:n}={}}=e,{objects:c,queries:r}=C(a),u=`LET u = DOCUMENT("${x(`users/${t}`)}")
18
21
  ${r.join(`
19
22
  `)}
20
- RETURN MERGE(u, {${u.join(", ")}})`;return g(s).query(c).then(l=>l.next()).catch(l=>(I({action:o,category:E,params:{userId:n,username:t},value:d.DATABASE_ERROR},l,e),null))},be=(e,o)=>{const s="getUser",{email:i,id:n,phone:t,userId:u,username:r}=D(o),{databaseName:a,fields:c}=e,{objects:l,queries:p}=$(c);let m;return n?m=`LET u = DOCUMENT("${n}")
23
+ RETURN MERGE(u, {${c.join(", ")}})`;return f(s).query(u).then(i=>i.next()).catch(i=>{throw g({action:o,category:E,params:{userId:t,username:n},value:T.DATABASE_ERROR},i,e)})},De=(e,o)=>{const s="getUser",{email:a,id:t,phone:n,userId:c,username:r}=D(o),{databaseName:l,fields:u}=e,{objects:i,queries:p}=C(u);let m="";return t?m=`LET u = DOCUMENT("${t}")
21
24
  ${p.join(`
22
25
  `)}
23
26
  FILTER u.userAccess > 0
24
- RETURN MERGE(u, {${l.join(", ")}})`:r?m=`FOR u IN users
27
+ RETURN MERGE(u, {${i.join(", ")}})`:r?m=`FOR u IN users
25
28
  FILTER u.username == "${r}"
26
29
  ${p.join(`
27
30
  `)}
28
- RETURN MERGE(u, {${l.join(", ")}})`:i?m=`FOR u IN users
29
- FILTER u.email == "${i}"
31
+ RETURN MERGE(u, {${i.join(", ")}})`:a?m=`FOR u IN users
32
+ FILTER u.email == "${a}"
30
33
  ${p.join(`
31
34
  `)}
32
- RETURN MERGE(u, {${l.join(", ")}})`:t&&(m=`FOR u IN users
33
- FILTER u.phone == "${t}"
35
+ RETURN MERGE(u, {${i.join(", ")}})`:n&&(m=`FOR u IN users
36
+ FILTER u.phone == "${n}"
34
37
  ${p.join(`
35
38
  `)}
36
- RETURN MERGE(u, {${l.join(", ")}})`),g(a).query(m).then(T=>T.next()).then(T=>T).catch(T=>I({action:s,category:E,params:{id:n,userId:u,username:r},value:d.DATABASE_ERROR},T,e))},we=(e,o)=>{const s="getUserList",{databaseName:i,fields:n}=e,{limit:t,username:u}=b(o),{objects:r,queries:a}=$(n),c=["u.userAccess > 0"];u&&c.push(`CONTAINS(u.username, "${S(u)}")`);const l=`FOR u IN users
37
- FILTER ${c.join(" && ")}
38
- ${a.join(`
39
+ RETURN MERGE(u, {${i.join(", ")}})`),f(l).query(m).then(d=>d.next()).then(d=>d).catch(d=>g({action:s,category:E,params:{id:t,userId:c,username:r},value:T.DATABASE_ERROR},d,e))},ve=(e,o)=>{const s="getUserList",{databaseName:a,fields:t}=e,{limit:n,username:c}=v(o),{objects:r,queries:l}=C(t),u=["u.userAccess > 0"];c&&u.push(`CONTAINS(u.username, "${w(c)}")`);const i=`FOR u IN users
40
+ FILTER ${u.join(" && ")}
41
+ ${l.join(`
39
42
  `)}
40
- ${t.aql}
43
+ ${n.aql}
41
44
  SORT u.username
42
- RETURN MERGE(u, {${r.join(", ")}})`;return g(i).query(l).then(p=>p.all()).catch(p=>(I({action:s,category:E,value:d.DATABASE_ERROR},p,e),[]))},Pe=(e,{reactions:o=[],username:s},i)=>{const n="getUsersByReactions",{databaseName:t,fields:u,session:{userId:r}}=e,a=o.map(R=>Q(R,32).toLowerCase()),{limit:c}=b(i),{objects:l,queries:p}=$(u),m=`users/${r}`,T=S(s),y=["u.userAccess > 0",`POSITION(${JSON.stringify(a)}, LOWER(r.name))`];s&&y.push(`CONTAINS(u.username, "${T}")`);const f=`FOR u, r IN OUTBOUND "${m}" hasReaction
45
+ RETURN MERGE(u, {${r.join(", ")}})`;return f(a).query(i).then(p=>p.all()).catch(p=>(g({action:s,category:E,value:T.DATABASE_ERROR},p,e),[]))},be=(e,{reactions:o=[],username:s},a)=>{const t="getUsersByReactions",{databaseName:n,fields:c,session:{userId:r}={}}=e,l=o.map(R=>j(R,32).toLowerCase()),{limit:u}=v(a),{objects:i,queries:p}=C(c),m=`users/${r}`,d=w(s),y=["u.userAccess > 0",`POSITION(${JSON.stringify(l)}, LOWER(r.name))`];s&&y.push(`CONTAINS(u.username, "${d}")`);const I=`FOR u, r IN OUTBOUND "${m}" hasReaction
43
46
  OPTIONS {vertexCollections: "users"}
44
47
  ${p.join(`
45
48
  `)}
46
49
  FILTER ${y.join(" && ")}
47
- ${c.aql}
48
- RETURN MERGE(u, {${l.join(", ")}})`;return g(t).query(f).then(R=>R.all()).catch(R=>(I({action:n,category:E,value:d.DATABASE_ERROR},R,e),[]))},xe=(e,{tags:o,username:s},i)=>{const n="getUsersByTags",{databaseName:t,fields:u,session:{userId:r}}=e,a=o?.reduce((f,R)=>(R&&f.push(Q(R,32).toLowerCase()),f),[]),{limit:c}=b(i),{objects:l,queries:p}=$(u),m=S(s),T=[`u._key != "${r}"`,"u.userAccess > 0"];s&&T.push(`CONTAINS(u.username, "${m}")`);const y=`FOR t IN tags
49
- FILTER POSITION(${JSON.stringify(a)}, LOWER(t.name))
50
+ ${u.aql}
51
+ RETURN MERGE(u, {${i.join(", ")}})`;return f(n).query(I).then(R=>R.all()).catch(R=>(g({action:t,category:E,value:T.DATABASE_ERROR},R,e),[]))},Pe=(e,{tags:o,username:s},a)=>{const t="getUsersByTags",{databaseName:n,fields:c,session:{userId:r}={}}=e,l=o?.reduce((I,R)=>(R&&I.push(j(R,32).toLowerCase()),I),[]),{limit:u}=v(a),{objects:i,queries:p}=C(c),m=w(s),d=[`u._key != "${r}"`,"u.userAccess > 0"];s&&d.push(`CONTAINS(u.username, "${m}")`);const y=`FOR t IN tags
52
+ FILTER POSITION(${JSON.stringify(l)}, LOWER(t.name))
50
53
  FOR u, it IN OUTBOUND t isTagged
51
54
  OPTIONS {bfs: true, uniqueVertices: "global", vertexCollections: "users"}
52
55
  ${p.join(`
53
56
  `)}
54
- FILTER ${T.join(" && ")}
55
- ${c.aql}
56
- RETURN DISTINCT MERGE(u, {${l.join(", ")}})`;return g(t).query(y).then(f=>f.all()).catch(f=>(I({action:n,category:E,value:d.DATABASE_ERROR},f,e),[]))},ve=(e,{username:o},s)=>{const i="getUsersByLatest",{databaseName:n,fields:t,session:{userId:u}}=e,{limit:r}=b(s),a=["u._id != session._id","u.userAccess > 0"],{objects:c,queries:l}=$(t);o&&a.push(`CONTAINS(u.username, "${S(o)}")`);const p=`FOR u IN users
57
- LET session = DOCUMENT("users/${u}")
58
- FILTER ${a.join(" && ")}
59
- ${l.join(`
57
+ FILTER ${d.join(" && ")}
58
+ ${u.aql}
59
+ RETURN DISTINCT MERGE(u, {${i.join(", ")}})`;return f(n).query(y).then(I=>I.all()).catch(I=>(g({action:t,category:E,value:T.DATABASE_ERROR},I,e),[]))},Le=(e,{username:o},s)=>{const a="getUsersByLatest",{databaseName:t,fields:n,session:{userId:c}={}}=e,{limit:r}=v(s),l=["u._id != session._id","u.userAccess > 0"],{objects:u,queries:i}=C(n);o&&l.push(`CONTAINS(u.username, "${w(o)}")`);const p=`FOR u IN users
60
+ LET session = DOCUMENT("users/${c}")
61
+ FILTER ${l.join(" && ")}
62
+ ${i.join(`
60
63
  `)}
61
64
  LET distance = DISTANCE(u.latitude || 0, u.longitude || 0, session.latitude || 0, session.longitude || 0)
62
65
  ${r.aql}
63
66
  SORT distance ASC, u.added DESC
64
- RETURN MERGE(u, {${c.join(", ")}})`;return g(n).query(p).then(m=>m.all()).catch(m=>(I({action:i,category:E,value:d.DATABASE_ERROR},m,e),[]))},Le=(e,{userId:o},s)=>{const i="getUsersByConnection",{databaseName:n,fields:t}=e,{limit:u,username:r}=b(s),{objects:a,queries:c}=$(t),l=M(`users/${o}`),p=["u.userAccess > 0"];r&&p.push(`CONTAINS(u.username, "${S(r)}")`);const m=`FOR cu IN users
65
- LET session = DOCUMENT("${l}")
67
+ RETURN MERGE(u, {${u.join(", ")}})`;return f(t).query(p).then(m=>m.all()).catch(m=>(g({action:a,category:E,value:T.DATABASE_ERROR},m,e),[]))},xe=(e,{userId:o},s)=>{const a="getUsersByConnection",{databaseName:t,fields:n}=e,{limit:c,username:r}=v(s),{objects:l,queries:u}=C(n),i=x(`users/${o}`),p=["u.userAccess > 0"];r&&p.push(`CONTAINS(u.username, "${w(r)}")`);const m=`FOR cu IN users
68
+ LET session = DOCUMENT("${i}")
66
69
  FOR u, connection IN OUTBOUND cu hasConnection
67
70
  OPTIONS {bfs: true, uniqueVertices: "global", vertexCollections: "users"}
68
- ${c.join(`
71
+ ${u.join(`
69
72
  `)}
70
73
  FILTER ${p.join(" && ")}
71
- ${u.aql}
72
- RETURN DISTINCT MERGE(u, {${a.join(", ")}})`;return g(n).query(m).then(T=>T.all()).catch(T=>(I({action:i,category:E,value:d.DATABASE_ERROR},T,e),[]))},je=({expires:e,token:o})=>{try{const{userId:s,username:i,userAccess:n}=_(o);return B(s,i,n,e)}catch(s){throw s}},Me=async(e,o)=>{const s="signIn",{databaseName:i}=e,{email:n,expires:t,password:u,phone:r,username:a}=o,c=H(n),l=S(a),p=L(u),m=Y(r),T=J(t)||15;if(!l&&!c&&!m||!p)return q({action:s,category:E,params:{username:a},value:d.INVALID_ARGUMENTS},e),null;const y=[];c&&y.push(`u.email == "${c}"`),m&&y.push(`u.phone == ${m}`),l&&y.push(`u.username == "${l}"`);const f=`FOR u IN users
74
+ ${c.aql}
75
+ RETURN DISTINCT MERGE(u, {${l.join(", ")}})`;return f(t).query(m).then(d=>d.all()).catch(d=>(g({action:a,category:E,value:T.DATABASE_ERROR},d,e),[]))},je=({expires:e,token:o})=>{try{const{userId:s,username:a,userAccess:t}=B(o);return F(s,a,t,e)}catch(s){throw s}},_e=async(e,o)=>{const s="signIn",{databaseName:a}=e,{email:t,expires:n,password:c,phone:r,username:l}=o,u=_(t),i=w(l),p=M(c),m=Q(r),d=Y(n)||15;if(!i&&!u&&!m||!p)throw q({action:s,category:E,params:{username:l},value:T.INVALID_ARGUMENTS},e);const y=[];u&&y.push(`u.email == "${u}"`),m&&y.push(`u.phone == ${m}`),i&&y.push(`u.username == "${i}"`);const I=`FOR u IN users
73
76
  FILTER ${y.join(" || ")}
74
77
  LIMIT 1
75
- RETURN u`;let R;try{R=await g(i).query(f).then(O=>O.next())}catch(O){return I({action:s,category:E,params:{username:l},value:d.DATABASE_ERROR},O,e),null}if(!R)return q({action:s,category:E,params:{username:a},value:d.INVALID_AUTHENTICATION},e),null;const{_key:A,password:N,salt:h,userAccess:w}=R,x=P(p,h);if(N!==x)return q({action:s,category:E,params:{userAccess:w,userId:A,username:a},value:d.INVALID_AUTHENTICATION},e),null;try{return B(A,a,w,T)}catch(O){return I({action:s,category:E,params:{userId:A,username:a},value:d.DATABASE_ERROR},O,e),null}},Qe=async e=>{const o="signOut",{databaseName:s,session:{userId:i,username:n}}=e,t=`users/${i}`,u={lastOnline:Date.now(),sessionId:null},r=U`LET u = DOCUMENT(${t})
76
- UPDATE u WITH ${u} IN users
78
+ RETURN u`;let R;try{R=await f(a).query(I).then(N=>N.next())}catch(N){throw g({action:s,category:E,params:{username:i},value:T.DATABASE_ERROR},N,e)}if(!R)throw q({action:s,category:E,params:{username:l},value:T.INVALID_AUTHENTICATION},e);const{_key:A,password:h,salt:O,userAccess:$}=R,P=b(p,O);if(h!==P)throw q({action:s,category:E,params:{userAccess:$,userId:A,username:l},value:T.INVALID_AUTHENTICATION},e);try{return F(A||"",l||"",$,d)}catch(N){throw g({action:s,category:E,params:{userId:A,username:l},value:T.DATABASE_ERROR},N,e)}},Me=async e=>{const o="signOut",{databaseName:s,session:{userId:a,username:t}={}}=e,n=`users/${a}`,c={lastOnline:Date.now(),sessionId:null},r=U`LET u = DOCUMENT(${n})
79
+ UPDATE u WITH ${c} IN users
77
80
  LIMIT 1
78
- RETURN NEW`;try{await g(s).query(r).then(a=>a.next())}catch(a){await I({action:o,category:E,params:{userId:i,username:n},value:d.DATABASE_ERROR},a,e)}return!0},_e=e=>{const o="getActiveUserCount",{databaseName:s}=e,i=U`LET docs = (
81
+ RETURN NEW`;try{await f(s).query(r).then(l=>l.next())}catch(l){return g({action:o,category:E,params:{userId:a,username:t},value:T.DATABASE_ERROR},l,e),!1}return!0},Qe=e=>{const o="getActiveUserCount",{databaseName:s}=e,a=U`LET docs = (
79
82
  FOR u IN users
80
83
  FILTER u.active == true
81
84
  RETURN u
82
85
  )
83
- RETURN LENGTH(docs)`;return g(s).query(i).then(n=>n.next()).catch(n=>I({action:o,category:E,value:d.DATABASE_ERROR},n,e))},Be=(e,o)=>{const s="getUserByToken",{databaseName:i}=e,{userId:n}=_(o),t=j("users",{userId:n}),u=U`LET u = DOCUMENT("${t}") RETURN u`;return g(i).query(u).then(r=>r.next()).catch(r=>I({action:s,category:E,params:{userId:n},value:d.DATABASE_ERROR},r,e))};export{ae as UserAccess,Ue as addUser,$e as confirmCode,B as createToken,Se as deactivateUser,Ce as deleteUser,he as forgotPassword,_e as getActiveUserCount,qe as getDisplayName,De as getSessionUser,be as getUser,Be as getUserByToken,$ as getUserOptional,we as getUsers,Le as getUsersByConnection,ve as getUsersByLatest,Pe as getUsersByReactions,xe as getUsersByTags,b as parseUserOptions,je as refreshSession,Oe as resetPassword,Me as signIn,Qe as signOut,Ne as updateUser};
84
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLFxuICBjcmVhdGVQYXNzd29yZCxcbiAgcGFyc2VBcmFuZ29JZCxcbiAgcGFyc2VDaGFyLFxuICBwYXJzZUVtYWlsLFxuICBwYXJzZU51bSxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7cGFyc2VVc2VyfSBmcm9tICcuLi9hZGFwdGVycy91c2VyQWRhcHRlcic7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7c2VuZEVtYWlsfSBmcm9tICcuL2VtYWlsJztcbmltcG9ydCB7c2VuZFNtc30gZnJvbSAnLi9zbXMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBTZXNzaW9uRXJyb3J9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXREb2NJZCwgZ2V0TGltaXQsIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUsIHVzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzJztcbmltcG9ydCB7ZGV0ZWN0TGFuZ3VhZ2V9IGZyb20gJy4uL3V0aWxzL2xhbmd1YWdlRGV0ZWN0aW9uJztcbmltcG9ydCB7Z2V0U2Vzc2lvbiwgU2Vzc2lvblRva2VuLCBzZXRTZXNzaW9ufSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcyc7XG5pbXBvcnQgdHlwZSB7VXNlcklucHV0LCBVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICd1c2Vycyc7XG5jb25zdCBTVFJJUEVfQVBJX1ZFUlNJT04gPSAnMjAyNS0wNS0yOC5iYXNpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFVzZXJBY2Nlc3Mge1xuICBERUFDVElWQVRFRCA9IDAsXG4gIEFDVElWRSA9IDEsXG4gIFBSRU1JVU0gPSAyLFxuICBDT05URU5UX0FETUlOID0gMyxcbiAgQURNSU4gPSA0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHVzZXJBY2Nlc3M6IG51bWJlcixcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQ6IG51bWJlciA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlc3Npb25FeHBpcmVzLnRvU2Vjb25kcygpKTtcbiAgY29uc3QgdG9rZW4gPSBzZXRTZXNzaW9uKHtcbiAgICBleHAsXG4gICAgaWF0LFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIHRva2VuLFxuICAgIHVzZXJJZCxcbiAgICB1c2VybmFtZVxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNlbGVjdEFjY3VtdWxhdG9yIHtcbiAgb2JqZWN0czogc3RyaW5nW107XG4gIHF1ZXJpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VXNlck9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSk6IFNlbGVjdEFjY3VtdWxhdG9yID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IFNlbGVjdEFjY3VtdWxhdG9yLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCd1c2VycycsICd1JywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RzO1xuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVVzZXJPcHRpb25zID0gKG9wdGlvbnM6IFVzZXJPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBsaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcklucHV0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnYWRkVXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGxhbmd1YWdlQ29udGV4dH0gPSBjb250ZXh0O1xuICBjb25zdCB7ZW1haWwsIHBhc3N3b3JkLCBwaG9uZSwgdXNlcm5hbWUsIHVzZXJJZCwgX2tleSwgX2lkLCAuLi5pbnNlcnRVc2VyfSA9IHBhcnNlVXNlcih1c2VyKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhZm9ybWF0UGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISF1c2VybmFtZSB8fCAhIXBob25lIHx8ICEhZW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgaGFzaElkID0gdXNlcm5hbWUgfHwgcGhvbmUgfHwgZW1haWw7XG4gIGNvbnN0IHNhbHQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYCR7aGFzaElkfSR7Zm9ybWF0UGFzc3dvcmR9YCwgbnVsbCk7XG4gIGNvbnN0IGVuY3J5cHRlZFBhc3N3b3JkID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnVzZXJuYW1lID09IFwiJHt1c2VybmFtZX1cImApO1xuICB9XG5cbiAgaWYoZW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2VtYWlsfVwiYCk7XG4gIH1cblxuICBpZihwaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke3Bob25lfWApO1xuICB9XG5cbiAgY29uc3QgY2hlY2tRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgfHwgJyl9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIGNvbnN0IGV4aXN0aW5nVXNlcnMgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcblxuICAgIGlmKGV4aXN0aW5nVXNlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuRVhJU1RJTkdfSVRFTVxuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBob25lQ291bnRyeUNvZGUgPSBwaG9uZT8ucmVwbGFjZSgvXFxEL2csICcnKS5zdWJzdHJpbmcoMCwgMyk7XG4gIGNvbnN0IGxvY2FsZSA9IGRldGVjdExhbmd1YWdlKHtcbiAgICAuLi5sYW5ndWFnZUNvbnRleHQsXG4gICAgcGhvbmVDb3VudHJ5Q29kZSxcbiAgICB1c2VyUHJlZmVyZW5jZTogaW5zZXJ0VXNlci5sb2NhbGUgfHwgJ2VuJ1xuICB9KTtcbiAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlciA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgY29uc3QgdmVyaWZpZWRTbXNDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcm5hbWUsIG51bGwpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsLFxuICAgIGxvY2FsZSxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmUsXG4gICAgc2FsdCxcbiAgICB1c2VyQWNjZXNzOiAxLFxuICAgIHVzZXJuYW1lLFxuICAgIHZlcmlmaWVkRW1haWw6IGZhbHNlLFxuICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgIHZlcmlmaWVkUGhvbmU6IGZhbHNlLFxuICAgIHZlcmlmaWVkU21zQ29kZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHVzZXJzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGluc2VydFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7X2tleSwgX2lkLCB0YWdzID0gW10sIC4uLnVwZGF0ZX0gPSB1cGRhdGVkVXNlcjtcbiAgY29uc3Qge2lkfSA9IHVwZGF0ZWRVc2VyO1xuXG4gIGNvbnN0IHVzZXJRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBVUERBVEUgdSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBORVdgO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBjb25zdCB0YWdDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YWdzLm1hcCgoe2lkOiB0YWdEb2NJZCwgbmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgICAgRklMVEVSIGl0Ll9mcm9tID09ICR7dGFnRG9jSWR9ICYmIGl0Ll90byA9PSAke2lkfSAmJiBpdC5uYW1lID09ICR7bmFtZX1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gaXRgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKCh0YWdFZGdlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coe3RhZ0VkZ2V9KTtcbiAgICAgICAgICBpZighIXRhZ0VkZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWdFZGdlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVkZ2UgPSB7XG4gICAgICAgICAgICBfZnJvbTogdGFnRG9jSWQsXG4gICAgICAgICAgICBfa2V5OiBjcmVhdGVIYXNoKGBpc1RhZ2dlZC0ke3RhZ0RvY0lkfS0ke2lkfWApLFxuICAgICAgICAgICAgX3RvOiBpZCxcbiAgICAgICAgICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gdGFnQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGVkZ2UpO1xuICAgICAgICB9KTtcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gdXBkYXRlZFVzZXI7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdmb3Jnb3RQYXNzd29yZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gJHtlbWFpbH0gfHwgdS5waG9uZSA9PSAke3Bob25lfSB8fCB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdmVyaWZpZWRFbWFpbCwgdmVyaWZpZWRQaG9uZX0gPSB1c2VyIGFzIFVzZXJUeXBlO1xuICAgICAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gMTAwMCAqIDYwICogMTU7IC8vIDE1IG1pbnV0ZXNcbiAgICAgICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHVzZXIpO1xuICAgICAgICAgIGxldCB1cGRhdGU7XG5cbiAgICAgICAgICBpZihlbWFpbCAmJiB2ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB0ZXh0OiBgWW91ciBjb2RlIGlzICR7Y29kZX1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHt2ZXJpZmllZEVtYWlsQ29kZTogY29kZSwgdmVyaWZpZWRFbWFpbEV4cGlyZXM6IGNvZGVFeHBpcmVzfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihwaG9uZSAmJiB2ZXJpZmllZFBob25lKSB7XG4gICAgICAgICAgICBzZW5kU21zKHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgdGV4dDogYFlvdXIgY29kZSBpcyAke2NvZGV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRTbXNDb2RlOiBjb2RlLCB2ZXJpZmllZFBob25lRXhwaXJlczogY29kZUV4cGlyZXN9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKHVwZGF0ZS52ZXJpZmllZEVtYWlsQ29kZSB8fCB1cGRhdGUudmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlckRvY0lkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICAgIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHBhc3N3b3JkLFxuICAgIHR5cGUsXG4gICAgdXNlcm5hbWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcixcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIHR5cGU6ICdwaG9uZScgfCAnZW1haWwnLFxuICAgIHVzZXJuYW1lOiBzdHJpbmdcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdyZXNldFBhc3N3b3JkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRQYXNzd29yZDogc3RyaW5nID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgX2lkOiB1c2VyRG9jSWQsXG4gICAgICAgICAgICBzYWx0LFxuICAgICAgICAgICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgICAgICAgICB2ZXJpZmllZEVtYWlsRXhwaXJlcyxcbiAgICAgICAgICAgIHZlcmlmaWVkU21zQ29kZSxcbiAgICAgICAgICAgIHZlcmlmaWVkUGhvbmVFeHBpcmVzXG4gICAgICAgICAgfSA9IHVzZXIgYXMgVXNlclR5cGU7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgaWYoY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwaG9uZSc6XG4gICAgICAgICAgICAgIGlmKGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZSAmJiB2ZXJpZmllZFBob25lRXhwaXJlcyA+IG5vdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih1cGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyRG9jSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzYDtcblxuICAgICAgICAgICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh1cGRhdGVRdWVyeSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29kZSxcbiAgICB0eXBlXG4gIH06IHtcbiAgICBjb2RlOiBudW1iZXIsXG4gICAgdHlwZTogJ3Bob25lJyB8ICdlbWFpbCdcbiAgfVxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjb25maXJtQ29kZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoJ3VzZXJzJywge3VzZXJJZDogc2Vzc2lvbklkfSk7XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7dXNlckRvY0lkfSkgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLnRoZW4oKHt2ZXJpZmllZEVtYWlsQ29kZSwgdmVyaWZpZWRTbXNDb2RlfTogVXNlclR5cGUpID0+IHtcbiAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGU7XG4gICAgICAgICAgY2FzZSAncGhvbmUnOlxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7Y29kZSwgdHlwZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7aWR9KVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb246IFNUUklQRV9BUElfVkVSU0lPTiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvcixjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVhY3RpdmF0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtpZH0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHVwZGF0ZWQ6IFVzZXJUeXBlID0ge1xuICAgIHVzZXJBY2Nlc3M6IDBcbiAgfTtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke2lkfSBXSVRIICR7dXBkYXRlZH0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2lkfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpc3BsYXlOYW1lID0gKHVzZXI6IFVzZXJUeXBlKTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ZpcnN0LCBsYXN0LCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWUgPSAoW2ZpcnN0LCBsYXN0XSkuam9pbignICcpLnRyaW0oKTtcblxuICBpZihuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0gZWxzZSBpZihmdWxsbmFtZSAhPT0gJycpIHtcbiAgICByZXR1cm4gZnVsbG5hbWU7XG4gIH0gZWxzZSBpZih1c2VybmFtZSkge1xuICAgIHJldHVybiB1c2VybmFtZTtcbiAgfVxuXG4gIHJldHVybiAnVW5rbm93bic7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2Vzc2lvblVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFNlc3Npb25Vc2VyJztcbiAgY29uc29sZS5sb2coJ2dldFNlc3Npb25Vc2VyJywge2FjdGlvbiwgY29udGV4dH0pO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3Nlc3Npb25JZH1gKTtcblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYExFVCB1ID0gRE9DVU1FTlQoXCIke2Zvcm1hdFNlc3Npb25JZH1cIilcbiAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIGFzIHVua25vd24gYXMgVXNlclR5cGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgcGFyYW1zOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXInO1xuICBjb25zdCB7ZW1haWwsIGlkLCBwaG9uZSwgdXNlcklkLCB1c2VybmFtZX0gPSBwYXJzZVVzZXIodXNlcik7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgbGV0IGFxbFF1ZXJ5OiBzdHJpbmc7XG5cbiAgaWYoaWQpIHtcbiAgICBhcWxRdWVyeSA9IGBMRVQgdSA9IERPQ1VNRU5UKFwiJHtpZH1cIilcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSIHUudXNlckFjY2VzcyA+IDBcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgYXFsUXVlcnkgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSBcIiR7dXNlcm5hbWV9XCJcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gIH0gZWxzZSBpZihlbWFpbCkge1xuICAgIGFxbFF1ZXJ5ID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gXCIke2VtYWlsfVwiXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICB9IGVsc2UgaWYocGhvbmUpIHtcbiAgICBhcWxRdWVyeSA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnBob25lID09IFwiJHtwaG9uZX1cIlxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfVxuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWQsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gWyd1LnVzZXJBY2Nlc3MgPiAwJ107XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHUudXNlcm5hbWVcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiB7cmVhY3Rpb25zPzogc3RyaW5nW10sIHVzZXJuYW1lPzogc3RyaW5nfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25zOiBzdHJpbmdbXSA9ICByZWFjdGlvbnMubWFwKChyZWFjdGlvbk5hbWU6IHN0cmluZykgPT4gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LnVzZXJBY2Nlc3MgPiAwJyxcbiAgICBgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRSZWFjdGlvbnMpfSwgTE9XRVIoci5uYW1lKSlgXG4gIF07XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7Zm9ybWF0VXNlcm5hbWV9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1LCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3RhZ3MsIHVzZXJuYW1lfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gIHRhZ3M/LnJlZHVjZSgobGlzdDogc3RyaW5nW10sIHRhZ05hbWU6IHN0cmluZykgPT4ge1xuICAgIGlmKHRhZ05hbWUpIHtcbiAgICAgIGxpc3QucHVzaChwYXJzZUNoYXIodGFnTmFtZSwgMzIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbXG4gICAgYHUuX2tleSAhPSBcIiR7c2Vzc2lvbklkfVwiYCxcbiAgICAndS51c2VyQWNjZXNzID4gMCdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIHQgSU4gdGFnc1xuICAgIEZJTFRFUiBQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFRhZ3MpfSwgTE9XRVIodC5uYW1lKSlcbiAgICBGT1IgdSwgaXQgSU4gT1VUQk9VTkQgdCBpc1RhZ2dlZFxuICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwge3VzZXJuYW1lfSwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZmlsdGVyID0gW1xuICAgICd1Ll9pZCAhPSBzZXNzaW9uLl9pZCcsXG4gICAgJ3UudXNlckFjY2VzcyA+IDAnXG4gIF07XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyLnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoXCJ1c2Vycy8ke3VzZXJJZH1cIilcbiAgICBGSUxURVIgJHtmaWx0ZXIuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRSh1LmxhdGl0dWRlIHx8IDAsIHUubG9uZ2l0dWRlIHx8IDAsIHNlc3Npb24ubGF0aXR1ZGUgfHwgMCwgc2Vzc2lvbi5sb25naXR1ZGUgfHwgMClcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5Q29ubmVjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3VzZXJJZH06IFVzZXJUeXBlLFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlcnNCeUNvbm5lY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGB1c2Vycy8ke3VzZXJJZH1gKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW1xuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke3BhcnNlVXNlcm5hbWUodXNlcm5hbWUpfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgY3UgSU4gdXNlcnNcbiAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKFwiJHtmb3JtYXRVc2VySWR9XCIpXG4gICAgRk9SIHUsIGNvbm5lY3Rpb24gSU4gT1VUQk9VTkQgY3UgaGFzQ29ubmVjdGlvblxuICAgIE9QVElPTlMge2JmczogdHJ1ZSwgdW5pcXVlVmVydGljZXM6IFwiZ2xvYmFsXCIsIHZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hTZXNzaW9uID0gKHtleHBpcmVzLCB0b2tlbn0pOiBTZXNzaW9uVG9rZW4gfCBTZXNzaW9uRXJyb3IgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHt1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICAgIHJldHVybiBjcmVhdGVUb2tlbih1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzLCBleHBpcmVzKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0aGUgZXJyb3IgZnJvbSBnZXRTZXNzaW9uXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduSW4gPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8U2Vzc2lvblRva2VuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzaWduSW4nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtlbWFpbCwgZXhwaXJlcywgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZX0gPSBhcmdzO1xuICBjb25zdCBmb3JtYXRFbWFpbDogc3RyaW5nID0gcGFyc2VFbWFpbChlbWFpbCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBmb3JtYXRQaG9uZTogc3RyaW5nID0gcGFyc2VQaG9uZShwaG9uZSk7XG4gIGNvbnN0IGZvcm1hdEV4cGlyZXM6IG51bWJlciA9IHBhcnNlTnVtKGV4cGlyZXMpIHx8IDE1O1xuXG4gIGlmKCghZm9ybWF0VXNlcm5hbWUgJiYgIWZvcm1hdEVtYWlsICYmICFmb3JtYXRQaG9uZSkgfHwgIWZvcm1hdFBhc3N3b3JkKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BUkdVTUVOVFNcbiAgICB9LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYoZm9ybWF0RW1haWwpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUuZW1haWwgPT0gXCIke2Zvcm1hdEVtYWlsfVwiYCk7XG4gIH1cblxuICBpZihmb3JtYXRQaG9uZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS5waG9uZSA9PSAke2Zvcm1hdFBob25lfWApO1xuICB9XG5cbiAgaWYoZm9ybWF0VXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUudXNlcm5hbWUgPT0gXCIke2Zvcm1hdFVzZXJuYW1lfVwiYCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIGxldCBjaGVja1VzZXI6IFVzZXJUeXBlO1xuXG4gIHRyeSB7XG4gICAgY2hlY2tVc2VyID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShjaGVja1F1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZTogZm9ybWF0VXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHtfa2V5OiB1c2VySWQsIHBhc3N3b3JkOiB2YWxpZFBhc3N3b3JkLCBzYWx0LCB1c2VyQWNjZXNzfSA9IGNoZWNrVXNlcjtcbiAgY29uc3QgYXV0aFBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG5cbiAgaWYodmFsaWRQYXNzd29yZCAhPT0gYXV0aFBhc3N3b3JkKSB7XG4gICAgbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7dXNlckFjY2VzcywgdXNlcklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coe2Zvcm1hdEV4cGlyZXMsIHVzZXJBY2Nlc3MsIHVzZXJJZCwgdXNlcm5hbWV9KTtcbiAgICBjb25zdCB0b2tlbiA9IGNyZWF0ZVRva2VuKHVzZXJJZCwgdXNlcm5hbWUsIHVzZXJBY2Nlc3MsIGZvcm1hdEV4cGlyZXMpO1xuICAgIGNvbnNvbGUubG9nKHt0b2tlbn0pO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25PdXQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfX0gPSBjb250ZXh0O1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShzZXNzaW9uUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBhd2FpdCBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVVzZXJDb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEFjdGl2ZVVzZXJDb3VudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY291bnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJCeVRva2VuID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyQnlUb2tlbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJJZH0gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgY29uc3QgdXNlckRvY0lkID0gZ2V0RG9jSWQoJ3VzZXJzJywge3VzZXJJZH0pO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVChcIiR7dXNlckRvY0lkfVwiKSBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUNFLGNBQUFBLEVBQ0Esa0JBQUFDLEVBQ0EsaUJBQUFDLEVBQ0EsYUFBQUMsRUFDQSxjQUFBQyxFQUNBLFlBQUFDLEVBQ0EsaUJBQUFDLEVBQ0EsY0FBQUMsRUFDQSxpQkFBQUMsTUFDSyxlQUNQLE9BQVEsT0FBQUMsTUFBVSxXQUVsQixPQUFRLFlBQUFDLE1BQWUsUUFDdkIsT0FBT0MsTUFBWSxTQUVuQixPQUFRLGFBQUFDLE1BQWdCLDBCQUN4QixPQUFRLFVBQUFDLE1BQWEsWUFDckIsT0FBUSxhQUFBQyxNQUFnQixVQUN4QixPQUFRLFdBQUFDLE9BQWMsUUFDdEIsT0FBUSxjQUFBQyxNQUErQix1QkFDdkMs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ekUsRUFBUyxRQUFTLENBQUMsT0FBQVcsQ0FBTSxDQUFDLEVBQ3RDeUQsRUFBcUI5RSxzQkFBd0JtRixDQUFTLGNBRTVELE9BQU90RSxFQUFNOEIsQ0FBWSxFQUFFLE1BQU1tQyxDQUFRLEVBQ3RDLEtBQU10QixHQUFXQSxFQUFPLEtBQUssQ0FBQyxFQUM5QixNQUFPQyxHQUFpQmpELEVBQVMsQ0FDaEMsT0FBQWtDLEVBQ0EsU0FBVXpCLEVBQ1YsT0FBUSxDQUFDLE9BQUFJLENBQU0sRUFDZixNQUFPZCxFQUFXLGNBQ3BCLEVBQUdrRCxFQUFPakIsQ0FBTyxDQUFDLENBQ3RCIiwKICAibmFtZXMiOiBbImNyZWF0ZUhhc2giLCAiY3JlYXRlUGFzc3dvcmQiLCAicGFyc2VBcmFuZ29JZCIsICJwYXJzZUNoYXIiLCAicGFyc2VFbWFpbCIsICJwYXJzZU51bSIsICJwYXJzZVBhc3N3b3JkIiwgInBhcnNlUGhvbmUiLCAicGFyc2VVc2VybmFtZSIsICJhcWwiLCAiRGF0ZVRpbWUiLCAiU3RyaXBlIiwgInBhcnNlVXNlciIsICJDb25maWciLCAic2VuZEVtYWlsIiwgInNlbmRTbXMiLCAiRXJyb3JUeXBlcyIsICJsb2dFcnJvciIsICJsb2dFeGNlcHRpb24iLCAiZ2V0RG9jSWQiLCAiZ2V0TGltaXQiLCAic2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZSIsICJ1c2VEYiIsICJkZXRlY3RMYW5ndWFnZSIsICJnZXRTZXNzaW9uIiwgInNldFNlc3Npb24iLCAiZXZlbnRDYXRlZ29yeSIsICJTVFJJUEVfQVBJX1ZFUlNJT04iLCAiVXNlckFjY2VzcyIsICJjcmVhdGVUb2tlbiIsICJ1c2VySWQiLCAidXNlcm5hbWUiLCAidXNlckFjY2VzcyIsICJleHBpcmVzSW5NaW51dGVzIiwgIm5vdyIsICJzZXNzaW9uRXhwaXJlcyIsICJpYXQiLCAiZXhwIiwgInRva2VuIiwgImdldFVzZXJPcHRpb25hbCIsICJmaWVsZHMiLCAic2VsZWN0cyIsICJmaWVsZCIsICJwYXJzZVVzZXJPcHRpb25zIiwgIm9wdGlvbnMiLCAiZnJvbSIsICJ0byIsICJsaW1pdCIsICJhZGRVc2VyIiwgImNvbnRleHQiLCAidXNlciIsICJhY3Rpb24iLCAiZGF0YWJhc2VOYW1lIiwgImxhbmd1YWdlQ29udGV4dCIsICJlbWFpbCIsICJwYXNzd29yZCIsICJwaG9uZSIsICJfa2V5IiwgIl9pZCIsICJpbnNlcnRVc2VyIiwgImZvcm1hdFBhc3N3b3JkIiwgInNhbHQiLCAiZW5jcnlwdGVkUGFzc3dvcmQiLCAiZmlsdGVycyIsICJjaGVja1F1ZXJ5IiwgImN1cnNvciIsICJlcnJvciIsICJwaG9uZUNvdW50cnlDb2RlIiwgImxvY2FsZSIsICJ2ZXJpZmllZEVtYWlsQ29kZSIsICJ2ZXJpZmllZFNtc0NvZGUiLCAiaW5zZXJ0IiwgImluc2VydFF1ZXJ5IiwgInVwZGF0ZVVzZXIiLCAidXBkYXRlZFVzZXIiLCAidGFncyIsICJ1cGRhdGUiLCAiaWQiLCAidXNlclF1ZXJ5IiwgImRhdGFiYXNlIiwgInRhZ0NvbGxlY3Rpb24iLCAidGFnRG9jSWQiLCAibmFtZSIsICJ0YWdRdWVyeSIsICJ0YWdFZGdlIiwgImVkZ2UiLCAiZm9yZ290UGFzc3dvcmQiLCAiYXFsUXVlcnkiLCAidmVyaWZpZWRFbWFpbCIsICJ2ZXJpZmllZFBob25lIiwgImNvZGVFeHBpcmVzIiwgImNvZGUiLCAidXNlckRvY0lkIiwgInVwZGF0ZVF1ZXJ5IiwgInJlc2V0UGFzc3dvcmQiLCAidHlwZSIsICJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsICJ2ZXJpZmllZFBob25lRXhwaXJlcyIsICJjb25maXJtQ29kZSIsICJzZXNzaW9uSWQiLCAiZGVsZXRlVXNlciIsICJzdHJpcGVDbGllbnQiLCAiZGVsZXRlZFVzZXIiLCAiZGVhY3RpdmF0ZVVzZXIiLCAiZ2V0RGlzcGxheU5hbWUiLCAiZmlyc3QiLCAibGFzdCIsICJmdWxsbmFtZSIsICJnZXRTZXNzaW9uVXNlciIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiZ2V0VXNlciIsICJnZXRVc2VycyIsICJmaWx0ZXJCeSIsICJnZXRVc2Vyc0J5UmVhY3Rpb25zIiwgInJlYWN0aW9ucyIsICJmb3JtYXRSZWFjdGlvbnMiLCAicmVhY3Rpb25OYW1lIiwgImZvcm1hdFNlc3Npb25JZCIsICJmb3JtYXRVc2VybmFtZSIsICJnZXRVc2Vyc0J5VGFncyIsICJmb3JtYXRUYWdzIiwgImxpc3QiLCAidGFnTmFtZSIsICJnZXRVc2Vyc0J5TGF0ZXN0IiwgImZpbHRlciIsICJnZXRVc2Vyc0J5Q29ubmVjdGlvbiIsICJmb3JtYXRVc2VySWQiLCAicmVmcmVzaFNlc3Npb24iLCAiZXhwaXJlcyIsICJzaWduSW4iLCAiYXJncyIsICJmb3JtYXRFbWFpbCIsICJmb3JtYXRQaG9uZSIsICJmb3JtYXRFeHBpcmVzIiwgImNoZWNrVXNlciIsICJ2YWxpZFBhc3N3b3JkIiwgImF1dGhQYXNzd29yZCIsICJzaWduT3V0IiwgInNlc3Npb25RdWVyeSIsICJnZXRBY3RpdmVVc2VyQ291bnQiLCAiY291bnRRdWVyeSIsICJnZXRVc2VyQnlUb2tlbiJdCn0K
86
+ RETURN LENGTH(docs)`;return f(s).query(a).then(t=>t.next()).catch(t=>{throw g({action:o,category:E,value:T.DATABASE_ERROR},t,e)})},Be=(e,o)=>{const s="getUserByToken",{databaseName:a}=e,{userId:t}=B(o),n=x(`users/${t}`),c=U`LET u = DOCUMENT("${n}") RETURN u`;return f(a).query(c).then(r=>r.next()).catch(r=>{throw g({action:s,category:E,params:{userId:t},value:T.DATABASE_ERROR},r,e)})};export{ie as UserAccess,Ue as addUser,$e as confirmCode,F as createToken,Se as deactivateUser,Ce as deleteUser,Ne as forgotPassword,Qe as getActiveUserCount,we as getDisplayName,qe as getSessionUser,De as getUser,Be as getUserByToken,C as getUserOptional,ve as getUsers,xe as getUsersByConnection,Le as getUsersByLatest,be as getUsersByReactions,Pe as getUsersByTags,v as parseUserOptions,je as refreshSession,Oe as resetPassword,_e as signIn,Me as signOut,he as updateUser};
87
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3BhcnNlTnVtfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9udW1iZXJzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUhhc2gsXG4gIGNyZWF0ZVBhc3N3b3JkLFxuICBwYXJzZUFyYW5nb0lkLFxuICBwYXJzZUNoYXIsXG4gIHBhcnNlRW1haWwsXG4gIHBhcnNlUGFzc3dvcmQsXG4gIHBhcnNlUGhvbmUsXG4gIHBhcnNlVXNlcm5hbWVcbn0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtEYXRlVGltZX0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IFN0cmlwZSBmcm9tICdzdHJpcGUnO1xuXG5pbXBvcnQge3BhcnNlVXNlcn0gZnJvbSAnLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXMsIHR5cGUgU2Vzc2lvbkVycm9yfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7Z2V0RG9jSWQsIGdldExpbWl0LCBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlLCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscy5qcyc7XG5pbXBvcnQge2RldGVjdExhbmd1YWdlfSBmcm9tICcuLi91dGlscy9sYW5ndWFnZURldGVjdGlvbi5qcyc7XG5pbXBvcnQge2dldFNlc3Npb24sIHNldFNlc3Npb24sIHR5cGUgU2Vzc2lvblRva2VufSBmcm9tICcuLi91dGlscy9zZXNzaW9uVXRpbHMuanMnO1xuaW1wb3J0IHtzZW5kRW1haWx9IGZyb20gJy4vZW1haWwuanMnO1xuaW1wb3J0IHtzZW5kU21zfSBmcm9tICcuL3Ntcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHR5cGUge0FwaUNvbnRleHR9IGZyb20gJy4uL3R5cGVzL2F1dGgudHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1VzZXJJbnB1dCwgVXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICd1c2Vycyc7XG5jb25zdCBTVFJJUEVfQVBJX1ZFUlNJT04gPSAnMjAyNS0wNy0zMC5iYXNpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFVzZXJBY2Nlc3Mge1xuICBERUFDVElWQVRFRCA9IDAsXG4gIEFDVElWRSA9IDEsXG4gIFBSRU1JVU0gPSAyLFxuICBDT05URU5UX0FETUlOID0gMyxcbiAgQURNSU4gPSA0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgdXNlckFjY2VzczogbnVtYmVyID0gMCxcbiAgZXhwaXJlc0luTWludXRlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc0luTWludXRlc30pO1xuICBjb25zdCBpYXQ6IG51bWJlciA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlc3Npb25FeHBpcmVzLnRvU2Vjb25kcygpKTtcbiAgY29uc3QgdG9rZW4gPSBzZXRTZXNzaW9uKHtcbiAgICBleHAsXG4gICAgaWF0LFxuICAgIHVzZXJBY2Nlc3MsXG4gICAgdXNlcklkLFxuICAgIHVzZXJuYW1lXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXhwaXJlczogc2Vzc2lvbkV4cGlyZXMudG9NaWxsaXMoKSxcbiAgICBpc3N1ZWQ6IG5vdy50b01pbGxpcygpLFxuICAgIHRva2VuLFxuICAgIHVzZXJJZCxcbiAgICB1c2VybmFtZVxuICB9O1xufTtcblxuaW50ZXJmYWNlIFNlbGVjdEFjY3VtdWxhdG9yIHtcbiAgb2JqZWN0czogc3RyaW5nW107XG4gIHF1ZXJpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0VXNlck9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10gPSBbXSk6IFNlbGVjdEFjY3VtdWxhdG9yID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IFNlbGVjdEFjY3VtdWxhdG9yLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgaWYoZmllbGQuaW5jbHVkZXMoJ0NvdW50JykpIHtcbiAgICAgIHJldHVybiBzZWxlY3RSZWFjdGlvbkNvdW50QnlUeXBlKCd1c2VycycsICd1JywgZmllbGQsIHNlbGVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RzO1xuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVVzZXJPcHRpb25zID0gKG9wdGlvbnM6IFVzZXJPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpbWl0ID0gZ2V0TGltaXQoZnJvbSwgdG8pO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBsaW1pdFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcklucHV0KTogUHJvbWlzZTxVc2VyVHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZFVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBsYW5ndWFnZUNvbnRleHR9ID0gY29udGV4dDtcbiAgY29uc3Qge2NvbmZpcm06IF9jb25maXJtLCAuLi5uZXdVc2VyfSA9IHVzZXI7XG4gIGNvbnN0IHtlbWFpbCwgcGFzc3dvcmQsIHBob25lLCB1c2VybmFtZSwgdXNlcklkLCBfa2V5LCBfaWQsIC4uLmluc2VydFVzZXJ9ID0gcGFyc2VVc2VyKG5ld1VzZXIpO1xuICBjb25zdCBoYXNQYXNzd29yZCA9ICEhcGFzc3dvcmQ7XG4gIGNvbnN0IGhhc1VzZXJuYW1lID0gISF1c2VybmFtZSB8fCAhIXBob25lIHx8ICEhZW1haWw7XG5cbiAgaWYoIWhhc1Bhc3N3b3JkIHx8ICFoYXNVc2VybmFtZSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGhhc2hJZCA9IHVzZXJuYW1lIHx8IHBob25lIHx8IGVtYWlsO1xuICBjb25zdCBzYWx0OiBzdHJpbmcgPSBjcmVhdGVIYXNoKGAke2hhc2hJZH0ke3Bhc3N3b3JkfWAsICcnKTtcbiAgY29uc3QgZW5jcnlwdGVkUGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG4gIGNvbnN0IGZpbHRlcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJzLnB1c2goYHUudXNlcm5hbWUgPT0gXCIke3VzZXJuYW1lfVwiYCk7XG4gIH1cblxuICBpZihlbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5lbWFpbCA9PSBcIiR7ZW1haWx9XCJgKTtcbiAgfVxuXG4gIGlmKHBob25lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7cGhvbmV9YCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmdVc2VycyA9IGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY2hlY2tRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuXG4gICAgaWYoZXhpc3RpbmdVc2Vycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHBob25lLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkVYSVNUSU5HX0lURU1cbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHBob25lQ291bnRyeUNvZGUgPSBwaG9uZT8ucmVwbGFjZSgvXFxEL2csICcnKS5zdWJzdHJpbmcoMCwgMyk7XG4gIGNvbnN0IGxvY2FsZSA9IGRldGVjdExhbmd1YWdlKHtcbiAgICAuLi5sYW5ndWFnZUNvbnRleHQsXG4gICAgcGhvbmVDb3VudHJ5Q29kZTogcGhvbmVDb3VudHJ5Q29kZSB8fCAnJyxcbiAgICB1c2VyUHJlZmVyZW5jZTogaW5zZXJ0VXNlci5sb2NhbGUgfHwgJ2VuJ1xuICB9KTtcbiAgY29uc3QgdmVyaWZpZWRFbWFpbENvZGU6IG51bWJlciA9IE1hdGguZmxvb3IoMTAwMDAwICsgKE1hdGgucmFuZG9tKCkgKiA5MDAwMDApKTtcbiAgY29uc3QgdmVyaWZpZWRTbXNDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgY29uc3QgaW5zZXJ0OiBVc2VyVHlwZSA9IHtcbiAgICAuLi5pbnNlcnRVc2VyLFxuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcm5hbWUpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsLFxuICAgIGxvY2FsZSxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmUsXG4gICAgc2FsdCxcbiAgICB1c2VyQWNjZXNzOiAxLFxuICAgIHVzZXJuYW1lLFxuICAgIHZlcmlmaWVkRW1haWw6IGZhbHNlLFxuICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgIHZlcmlmaWVkUGhvbmU6IGZhbHNlLFxuICAgIHZlcmlmaWVkU21zQ29kZVxuICB9O1xuXG4gIGNvbnN0IGluc2VydFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHVzZXJzIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGluc2VydFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VyOiBVc2VyVHlwZSk6IFByb21pc2U8VXNlclR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7X2tleSwgX2lkLCB0YWdzID0gW10sIC4uLnVwZGF0ZX0gPSB1cGRhdGVkVXNlcjtcbiAgY29uc3Qge2lkfSA9IHVwZGF0ZWRVc2VyO1xuXG4gIGNvbnN0IHVzZXJRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke2lkfSlcbiAgICBVUERBVEUgdSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBORVdgO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgICBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbiAgICBjb25zdCB0YWdDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oJ2lzVGFnZ2VkJyk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0YWdzLm1hcCgoe2lkOiB0YWdEb2NJZCwgbmFtZX0pID0+IHtcbiAgICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgICAgRklMVEVSIGl0Ll9mcm9tID09ICR7dGFnRG9jSWR9ICYmIGl0Ll90byA9PSAke2lkfSAmJiBpdC5uYW1lID09ICR7bmFtZX1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gaXRgO1xuXG4gICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkodGFnUXVlcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKCh0YWdFZGdlKSA9PiB7XG4gICAgICAgICAgaWYoISF0YWdFZGdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGFnRWRnZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlZGdlID0ge1xuICAgICAgICAgICAgX2Zyb206IHRhZ0RvY0lkLFxuICAgICAgICAgICAgX2tleTogY3JlYXRlSGFzaChgaXNUYWdnZWQtJHt0YWdEb2NJZH0tJHtpZH1gKSxcbiAgICAgICAgICAgIF90bzogaWQsXG4gICAgICAgICAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHRhZ0NvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBlZGdlKTtcbiAgICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZWRVc2VyO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VyfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZm9yZ290UGFzc3dvcmQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwge2VtYWlsLCBwaG9uZSwgdXNlcm5hbWV9KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdmb3Jnb3RQYXNzd29yZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gJHtlbWFpbH0gfHwgdS5waG9uZSA9PSAke3Bob25lfSB8fCB1LnVzZXJuYW1lID09ICR7dXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oYXN5bmMgKGN1cnNvcikgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gY3Vyc29yLm5leHQoKTtcblxuICAgICAgICBpZih1c2VyKSB7XG4gICAgICAgICAgY29uc3Qge2VtYWlsLCBwaG9uZSwgdmVyaWZpZWRFbWFpbCwgdmVyaWZpZWRQaG9uZX0gPSB1c2VyIGFzIFVzZXJUeXBlO1xuICAgICAgICAgIGNvbnN0IGNvZGVFeHBpcmVzID0gMTAwMCAqIDYwICogMTU7IC8vIDE1IG1pbnV0ZXNcbiAgICAgICAgICBjb25zdCBjb2RlID0gTWF0aC5mbG9vcigxMDAwMDAgKyAoTWF0aC5yYW5kb20oKSAqIDkwMDAwMCkpO1xuICAgICAgICAgIGNvbnN0IHVzZXJEb2NJZCA9IGdldERvY0lkKCd1c2VycycsIHVzZXIpO1xuICAgICAgICAgIGxldCB1cGRhdGU7XG5cbiAgICAgICAgICBpZihlbWFpbCAmJiB2ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgICAgICBzZW5kRW1haWwoe1xuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICB0ZXh0OiBgWW91ciBjb2RlIGlzICR7Y29kZX1gXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZSA9IHt2ZXJpZmllZEVtYWlsQ29kZTogY29kZSwgdmVyaWZpZWRFbWFpbEV4cGlyZXM6IGNvZGVFeHBpcmVzfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihwaG9uZSAmJiB2ZXJpZmllZFBob25lKSB7XG4gICAgICAgICAgICBzZW5kU21zKHtcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgdGV4dDogYFlvdXIgY29kZSBpcyAke2NvZGV9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB1cGRhdGUgPSB7dmVyaWZpZWRQaG9uZUV4cGlyZXM6IGNvZGVFeHBpcmVzLCB2ZXJpZmllZFNtc0NvZGU6IGNvZGV9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKHVwZGF0ZS52ZXJpZmllZEVtYWlsQ29kZSB8fCB1cGRhdGUudmVyaWZpZWRTbXNDb2RlKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVRdWVyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlckRvY0lkfSBXSVRIICR7dXBkYXRlfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICAgIGF3YWl0IHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkodXBkYXRlUXVlcnkpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7ZW1haWwsIHBob25lLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb2RlLFxuICAgIHBhc3N3b3JkLFxuICAgIHR5cGUsXG4gICAgdXNlcm5hbWVcbiAgfToge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIHR5cGU6ICdwaG9uZScgfCAnZW1haWwnO1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gIH1cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAncmVzZXRQYXNzd29yZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSAke3VzZXJuYW1lfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKGFzeW5jIChjdXJzb3IpID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IGN1cnNvci5uZXh0KCk7XG5cbiAgICAgICAgaWYodXNlcikge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIF9pZDogdXNlckRvY0lkLFxuICAgICAgICAgICAgc2FsdCxcbiAgICAgICAgICAgIHZlcmlmaWVkRW1haWxDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPSAwLFxuICAgICAgICAgICAgdmVyaWZpZWRTbXNDb2RlLFxuICAgICAgICAgICAgdmVyaWZpZWRQaG9uZUV4cGlyZXMgPSAwXG4gICAgICAgICAgfSA9IHVzZXIgYXMgVXNlclR5cGU7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBsZXQgdXBkYXRlO1xuXG4gICAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICAgICAgaWYoY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGUgJiYgdmVyaWZpZWRFbWFpbEV4cGlyZXMgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHtwYXNzd29yZH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwaG9uZSc6XG4gICAgICAgICAgICAgIGlmKGNvZGUgPT09IHZlcmlmaWVkU21zQ29kZSAmJiB2ZXJpZmllZFBob25lRXhwaXJlcyA+IG5vdykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3N3b3JkOiBzdHJpbmcgPSBjcmVhdGVQYXNzd29yZChmb3JtYXRQYXNzd29yZCwgc2FsdCk7XG4gICAgICAgICAgICAgICAgdXBkYXRlID0ge3Bhc3N3b3JkfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZih1cGRhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VyRG9jSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzYDtcblxuICAgICAgICAgICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeSh1cGRhdGVRdWVyeSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29kZSxcbiAgICB0eXBlLFxuICAgIHZhbHVlXG4gIH06IHtcbiAgICBjb2RlOiBudW1iZXI7XG4gICAgdHlwZTogJ3NtcycgfCAnZW1haWwnO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH1cbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnY29uZmlybUNvZGUnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGlzU21zID0gdHlwZSA9PT0gJ3Ntcyc7XG4gIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gaXNTbXMgPyBwYXJzZVBob25lKHZhbHVlKSA6IHBhcnNlRW1haWwodmFsdWUpO1xuICBjb25zdCBmaWx0ZXJCeVR5cGUgPSBpc1Ntc1xuICAgID8gYEZJTFRFUiB1LnBob25lID09IFwiJHtmb3JtYXR0ZWRWYWx1ZX1cIiAmJiB1LnZlcmlmaWVkU21zQ29kZSA9PSAke2NvZGV9YFxuICAgIDogYEZJTFRFUiB1LmVtYWlsID09IFwiJHtmb3JtYXR0ZWRWYWx1ZX1cIiAmJiB1LnZlcmlmaWVkRW1haWxDb2RlID09ICR7Y29kZX1gO1xuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgJHtmaWx0ZXJCeVR5cGV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC50aGVuKCh1c2VyKSA9PiB7XG4gICAgICAgIGlmKHVzZXIpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVXNlciA9IGlzU21zXG4gICAgICAgICAgICA/IHt2ZXJpZmllZFBob25lOiB0cnVlLCB2ZXJpZmllZFNtc0NvZGU6IDB9XG4gICAgICAgICAgICA6IHt2ZXJpZmllZEVtYWlsOiB0cnVlLCB2ZXJpZmllZEVtYWlsQ29kZTogMH07XG4gICAgICAgICAgY29uc3QgYXFsUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3VzZXIuX2tleX0gV0lUSCAke3VwZGF0ZWRVc2VyfSBJTiB1c2Vyc2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICAgIHBhcmFtczoge2NvZGUsIHR5cGUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZX0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge2NvZGUsIHR5cGUsIHZhbHVlOiBmb3JtYXR0ZWRWYWx1ZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGVVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBMRVQgdSA9IERPQ1VNRU5UKCR7aWR9KVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb246IFNUUklQRV9BUElfVkVSU0lPTiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGRlbGV0ZWRVc2VyKSA9PiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzLmRlbChkZWxldGVkVXNlcj8uc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwoZGVsZXRlZFVzZXI/LnN0cmlwZUFjY291bnRJZCkpXG4gICAgICAudGhlbigoKSA9PiBkZWxldGVkVXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWR9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXI6IFVzZXJUeXBlKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZGVsZXRlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCB7aWR9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB1cGRhdGVkOiBVc2VyVHlwZSA9IHtcbiAgICB1c2VyQWNjZXNzOiAwXG4gIH07XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtpZH0gV0lUSCAke3VwZGF0ZWR9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHtpZH0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSAodXNlcjogVXNlclR5cGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB7Zmlyc3QsIGxhc3QsIG5hbWUgPSAnJywgdXNlcm5hbWUgPSAnJ30gPSB1c2VyO1xuICBjb25zdCBmdWxsbmFtZSA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7c2Vzc2lvbklkfWApO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgTEVUIHUgPSBET0NVTUVOVChcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiKVxuICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlclR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2VyJztcbiAgY29uc3Qge2VtYWlsLCBpZCwgcGhvbmUsIHVzZXJJZCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyKHVzZXIpO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGxldCBhcWxRdWVyeTogc3RyaW5nID0gJyc7XG5cbiAgaWYoaWQpIHtcbiAgICBhcWxRdWVyeSA9IGBMRVQgdSA9IERPQ1VNRU5UKFwiJHtpZH1cIilcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSIHUudXNlckFjY2VzcyA+IDBcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgYXFsUXVlcnkgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS51c2VybmFtZSA9PSBcIiR7dXNlcm5hbWV9XCJcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gIH0gZWxzZSBpZihlbWFpbCkge1xuICAgIGFxbFF1ZXJ5ID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSIHUuZW1haWwgPT0gXCIke2VtYWlsfVwiXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICB9IGVsc2UgaWYocGhvbmUpIHtcbiAgICBhcWxRdWVyeSA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnBob25lID09IFwiJHtwaG9uZX1cIlxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgfVxuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXIpID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgcGFyYW1zOiB7aWQsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckxpc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB1c2VybmFtZX0gPSBwYXJzZVVzZXJPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gWyd1LnVzZXJBY2Nlc3MgPiAwJ107XG5cbiAgaWYodXNlcm5hbWUpIHtcbiAgICBmaWx0ZXJCeS5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1IElOIHVzZXJzXG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHUudXNlcm5hbWVcbiAgICBSRVRVUk4gTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBVc2VyVHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBVc2VyVHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiB7cmVhY3Rpb25zPzogc3RyaW5nW107IHVzZXJuYW1lPzogc3RyaW5nfSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZ1tdID0gcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lOiBzdHJpbmcpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZTogc3RyaW5nID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS51c2VyQWNjZXNzID4gMCcsXG4gICAgYFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0UmVhY3Rpb25zKX0sIExPV0VSKHIubmFtZSkpYFxuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uXG4gICAgT1BUSU9OUyB7dmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt0YWdzLCB1c2VybmFtZX0sXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRVc2Vyc0J5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfSA9IHt9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gdGFncz8ucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgdGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYodGFnTmFtZSkge1xuICAgICAgbGlzdC5wdXNoKHBhcnNlQ2hhcih0YWdOYW1lLCAzMikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZTogc3RyaW5nID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICBgdS5fa2V5ICE9IFwiJHtzZXNzaW9uSWR9XCJgLFxuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0VGFncyl9LCBMT1dFUih0Lm5hbWUpKVxuICAgIEZPUiB1LCBpdCBJTiBPVVRCT1VORCB0IGlzVGFnZ2VkXG4gICAgT1BUSU9OUyB7YmZzOiB0cnVlLCB1bmlxdWVWZXJ0aWNlczogXCJnbG9iYWxcIiwgdmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB7dXNlcm5hbWV9LCBvcHRpb25zPzogVXNlck9wdGlvbnMpOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlMYXRlc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWR9ID0ge319ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZpbHRlciA9IFtcbiAgICAndS5faWQgIT0gc2Vzc2lvbi5faWQnLFxuICAgICd1LnVzZXJBY2Nlc3MgPiAwJ1xuICBdO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlci5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKFwidXNlcnMvJHt1c2VySWR9XCIpXG4gICAgRklMVEVSICR7ZmlsdGVyLmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UodS5sYXRpdHVkZSB8fCAwLCB1LmxvbmdpdHVkZSB8fCAwLCBzZXNzaW9uLmxhdGl0dWRlIHx8IDAsIHNlc3Npb24ubG9uZ2l0dWRlIHx8IDApXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSBBU0MsIHUuYWRkZWQgREVTQ1xuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFVzZXJUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFVzZXJUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeUNvbm5lY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt1c2VySWR9OiBVc2VyVHlwZSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFVzZXJzQnlDb25uZWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChgdXNlcnMvJHt1c2VySWR9YCk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFtcbiAgICAndS51c2VyQWNjZXNzID4gMCdcbiAgXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIGN1IElOIHVzZXJzXG4gICAgTEVUIHNlc3Npb24gPSBET0NVTUVOVChcIiR7Zm9ybWF0VXNlcklkfVwiKVxuICAgIEZPUiB1LCBjb25uZWN0aW9uIElOIE9VVEJPVU5EIGN1IGhhc0Nvbm5lY3Rpb25cbiAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgVXNlclR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgVXNlclR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoU2Vzc2lvbiA9ICh7ZXhwaXJlcywgdG9rZW59KTogU2Vzc2lvblRva2VuIHwgU2Vzc2lvbkVycm9yID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7dXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgICByZXR1cm4gY3JlYXRlVG9rZW4odXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdGhlIGVycm9yIGZyb20gZ2V0U2Vzc2lvblxuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3MpOiBQcm9taXNlPFNlc3Npb25Ub2tlbiB8IG51bGw+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3NpZ25Jbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge2VtYWlsLCBleHBpcmVzLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IGFyZ3M7XG4gIGNvbnN0IGZvcm1hdEVtYWlsOiBzdHJpbmcgPSBwYXJzZUVtYWlsKGVtYWlsKTtcbiAgY29uc3QgZm9ybWF0VXNlcm5hbWU6IHN0cmluZyA9IHBhcnNlVXNlcm5hbWUodXNlcm5hbWUpO1xuICBjb25zdCBmb3JtYXRQYXNzd29yZDogc3RyaW5nID0gcGFyc2VQYXNzd29yZChwYXNzd29yZCk7XG4gIGNvbnN0IGZvcm1hdFBob25lOiBzdHJpbmcgPSBwYXJzZVBob25lKHBob25lKTtcbiAgY29uc3QgZm9ybWF0RXhwaXJlczogbnVtYmVyID0gcGFyc2VOdW0oZXhwaXJlcykgfHwgMTU7XG5cbiAgaWYoKCFmb3JtYXRVc2VybmFtZSAmJiAhZm9ybWF0RW1haWwgJiYgIWZvcm1hdFBob25lKSB8fCAhZm9ybWF0UGFzc3dvcmQpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbXTtcblxuICBpZihmb3JtYXRFbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5lbWFpbCA9PSBcIiR7Zm9ybWF0RW1haWx9XCJgKTtcbiAgfVxuXG4gIGlmKGZvcm1hdFBob25lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7Zm9ybWF0UGhvbmV9YCk7XG4gIH1cblxuICBpZihmb3JtYXRVc2VybmFtZSkge1xuICAgIGZpbHRlcnMucHVzaChgdS51c2VybmFtZSA9PSBcIiR7Zm9ybWF0VXNlcm5hbWV9XCJgKTtcbiAgfVxuXG4gIGNvbnN0IGNoZWNrUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignIHx8ICcpfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgbGV0IGNoZWNrVXNlcjogVXNlclR5cGU7XG5cbiAgdHJ5IHtcbiAgICBjaGVja1VzZXIgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGNoZWNrUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJuYW1lOiBmb3JtYXRVc2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgfVxuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICB0aHJvdyBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FVVEhFTlRJQ0FUSU9OXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCB7X2tleTogdXNlcklkLCBwYXNzd29yZDogdmFsaWRQYXNzd29yZCwgc2FsdCwgdXNlckFjY2Vzc30gPSBjaGVja1VzZXIgYXMgVXNlclR5cGU7XG4gIGNvbnN0IGF1dGhQYXNzd29yZDogc3RyaW5nID0gY3JlYXRlUGFzc3dvcmQoZm9ybWF0UGFzc3dvcmQsIHNhbHQpO1xuXG4gIGNvbnNvbGUubG9nKHtcbiAgICBjcmVhdGVQYXNzd29yZCxcbiAgICBhdXRoUGFzc3dvcmQsXG4gICAgdmFsaWRQYXNzd29yZCxcbiAgICBmb3JtYXRQYXNzd29yZCxcbiAgICBzYWx0XG4gIH0pO1xuXG4gIGlmKHZhbGlkUGFzc3dvcmQgIT09IGF1dGhQYXNzd29yZCkge1xuICAgIHRocm93IGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJBY2Nlc3MsIHVzZXJJZCwgdXNlcm5hbWV9LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlbiA9IGNyZWF0ZVRva2VuKHVzZXJJZCB8fCAnJywgdXNlcm5hbWUgfHwgJycsIHVzZXJBY2Nlc3MsIGZvcm1hdEV4cGlyZXMpO1xuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBwYXJhbXM6IHt1c2VySWQsIHVzZXJuYW1lfSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbk91dCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdzaWduT3V0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0gPSB7fX0gPSBjb250ZXh0O1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShzZXNzaW9uUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHBhcmFtczoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0sXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVVzZXJDb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEFjdGl2ZVVzZXJDb3VudCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoY291bnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRocm93IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyQnlUb2tlbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxVc2VyVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0VXNlckJ5VG9rZW4nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHt1c2VySWR9ID0gZ2V0U2Vzc2lvbih0b2tlbik7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IHBhcnNlQXJhbmdvSWQoYHVzZXJzLyR7dXNlcklkfWApO1xuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVChcIiR7dXNlckRvY0lkfVwiKSBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBwYXJhbXM6IHt1c2VySWR9LFxuICAgICAgICB2YWx1ZTogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuICAgIH0pO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFRLFlBQUFBLE1BQWUsK0JBQ3ZCLE9BQ0UsY0FBQUMsRUFDQSxrQkFBQUMsRUFDQSxpQkFBQUMsRUFDQSxhQUFBQyxFQUNBLGNBQUFDLEVBQ0EsaUJBQUFDLEVBQ0EsY0FBQUMsRUFDQSxpQkFBQUMsTUFDSywrQkFDUCxPQUFRLE9BQUFDLE1BQVUsV0FDbEIsT0FBUSxZQUFBQyxNQUFlLFFBQ3ZCLE9BQU9DLE1BQVksU0FFbkIsT0FBUSxhQUFBQyxNQUFnQiw2QkFDeEIsT0FBUSxVQUFBQyxNQUFhLGVBQ3JCLE9BQVEsY0FBQUMsTUFBb0MsMEJBQzVDLE9BQVEs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SWQiLCAicGFyc2VDaGFyIiwgInBhcnNlRW1haWwiLCAicGFyc2VQYXNzd29yZCIsICJwYXJzZVBob25lIiwgInBhcnNlVXNlcm5hbWUiLCAiYXFsIiwgIkRhdGVUaW1lIiwgIlN0cmlwZSIsICJwYXJzZVVzZXIiLCAiQ29uZmlnIiwgIkVycm9yVHlwZXMiLCAibG9nRXJyb3IiLCAibG9nRXhjZXB0aW9uIiwgImdldERvY0lkIiwgImdldExpbWl0IiwgInNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUiLCAidXNlRGIiLCAiZGV0ZWN0TGFuZ3VhZ2UiLCAiZ2V0U2Vzc2lvbiIsICJzZXRTZXNzaW9uIiwgInNlbmRFbWFpbCIsICJzZW5kU21zIiwgImV2ZW50Q2F0ZWdvcnkiLCAiU1RSSVBFX0FQSV9WRVJTSU9OIiwgIlVzZXJBY2Nlc3MiLCAiY3JlYXRlVG9rZW4iLCAidXNlcklkIiwgInVzZXJuYW1lIiwgInVzZXJBY2Nlc3MiLCAiZXhwaXJlc0luTWludXRlcyIsICJub3ciLCAic2Vzc2lvbkV4cGlyZXMiLCAiaWF0IiwgImV4cCIsICJ0b2tlbiIsICJnZXRVc2VyT3B0aW9uYWwiLCAiZmllbGRzIiwgInNlbGVjdHMiLCAiZmllbGQiLCAicGFyc2VVc2VyT3B0aW9ucyIsICJvcHRpb25zIiwgImZyb20iLCAidG8iLCAibGltaXQiLCAiYWRkVXNlciIsICJjb250ZXh0IiwgInVzZXIiLCAiYWN0aW9uIiwgImRhdGFiYXNlTmFtZSIsICJsYW5ndWFnZUNvbnRleHQiLCAiX2NvbmZpcm0iLCAibmV3VXNlciIsICJlbWFpbCIsICJwYXNzd29yZCIsICJwaG9uZSIsICJfa2V5IiwgIl9pZCIsICJpbnNlcnRVc2VyIiwgInNhbHQiLCAiZW5jcnlwdGVkUGFzc3dvcmQiLCAiZmlsdGVycyIsICJjaGVja1F1ZXJ5IiwgImN1cnNvciIsICJlcnJvciIsICJwaG9uZUNvdW50cnlDb2RlIiwgImxvY2FsZSIsICJ2ZXJpZmllZEVtYWlsQ29kZSIsICJ2ZXJpZmllZFNtc0NvZGUiLCAiaW5zZXJ0IiwgImluc2VydFF1ZXJ5IiwgInVwZGF0ZVVzZXIiLCAidXBkYXRlZFVzZXIiLCAidGFncyIsICJ1cGRhdGUiLCAiaWQiLCAidXNlclF1ZXJ5IiwgImRhdGFiYXNlIiwgInRhZ0NvbGxlY3Rpb24iLCAidGFnRG9jSWQiLCAibmFtZSIsICJ0YWdRdWVyeSIsICJ0YWdFZGdlIiwgImVkZ2UiLCAiZm9yZ290UGFzc3dvcmQiLCAiYXFsUXVlcnkiLCAidmVyaWZpZWRFbWFpbCIsICJ2ZXJpZmllZFBob25lIiwgImNvZGVFeHBpcmVzIiwgImNvZGUiLCAidXNlckRvY0lkIiwgInVwZGF0ZVF1ZXJ5IiwgInJlc2V0UGFzc3dvcmQiLCAidHlwZSIsICJmb3JtYXRQYXNzd29yZCIsICJ2ZXJpZmllZEVtYWlsRXhwaXJlcyIsICJ2ZXJpZmllZFBob25lRXhwaXJlcyIsICJjb25maXJtQ29kZSIsICJ2YWx1ZSIsICJpc1NtcyIsICJmb3JtYXR0ZWRWYWx1ZSIsICJkZWxldGVVc2VyIiwgInN0cmlwZUNsaWVudCIsICJkZWxldGVkVXNlciIsICJkZWFjdGl2YXRlVXNlciIsICJnZXREaXNwbGF5TmFtZSIsICJmaXJzdCIsICJsYXN0IiwgImZ1bGxuYW1lIiwgImdldFNlc3Npb25Vc2VyIiwgInNlc3Npb25JZCIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiZ2V0VXNlciIsICJnZXRVc2VycyIsICJmaWx0ZXJCeSIsICJnZXRVc2Vyc0J5UmVhY3Rpb25zIiwgInJlYWN0aW9ucyIsICJmb3JtYXRSZWFjdGlvbnMiLCAicmVhY3Rpb25OYW1lIiwgImZvcm1hdFNlc3Npb25JZCIsICJmb3JtYXRVc2VybmFtZSIsICJnZXRVc2Vyc0J5VGFncyIsICJmb3JtYXRUYWdzIiwgImxpc3QiLCAidGFnTmFtZSIsICJnZXRVc2Vyc0J5TGF0ZXN0IiwgImZpbHRlciIsICJnZXRVc2Vyc0J5Q29ubmVjdGlvbiIsICJmb3JtYXRVc2VySWQiLCAicmVmcmVzaFNlc3Npb24iLCAiZXhwaXJlcyIsICJzaWduSW4iLCAiYXJncyIsICJmb3JtYXRFbWFpbCIsICJmb3JtYXRQaG9uZSIsICJmb3JtYXRFeHBpcmVzIiwgImNoZWNrVXNlciIsICJ2YWxpZFBhc3N3b3JkIiwgImF1dGhQYXNzd29yZCIsICJzaWduT3V0IiwgInNlc3Npb25RdWVyeSIsICJnZXRBY3RpdmVVc2VyQ291bnQiLCAiY291bnRRdWVyeSIsICJnZXRVc2VyQnlUb2tlbiJdCn0K
@@ -0,0 +1,20 @@
1
+ import { ApiContext } from '../types/auth.types.js';
2
+ import type { WebsocketConnection } from '../types/websockets.types.js';
3
+ export declare const addSocket: (socketId: string, token: string) => Promise<WebsocketConnection>;
4
+ export declare const getSocketByUser: (userId: string) => Promise<WebsocketConnection>;
5
+ export declare const getSocketById: (socketId: string) => Promise<any>;
6
+ export declare const getConnectionByConvo: (context: ApiContext, convoId: string) => Promise<any>;
7
+ export declare const removeSocket: (socketId: string) => Promise<WebsocketConnection>;
8
+ export interface WebSocketClientContext {
9
+ readonly requestContext?: {
10
+ readonly apiId: string;
11
+ readonly domainName: string;
12
+ readonly stage: string;
13
+ };
14
+ }
15
+ export declare class WebsocketClient {
16
+ client: any;
17
+ constructor(config?: any);
18
+ setupClient({ requestContext }: WebSocketClientContext): Promise<void>;
19
+ send(connection: any, payload: any): Promise<boolean>;
20
+ }