@envive-ai/react-hooks 0.1.7 → 0.1.8

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 (368) hide show
  1. package/dist/{NewOrgConfig-CRyIfb_l.js → NewOrgConfig-BU6uJT74.js} +2 -2
  2. package/dist/{NewOrgConfig-C5YL4Y62.cjs → NewOrgConfig-DmidHiyj.cjs} +2 -2
  3. package/dist/{SystemSettingsContext-Cb9YHln8.cjs → SystemSettingsContext-BbobkM82.cjs} +2 -2
  4. package/dist/{SystemSettingsContext-D3mmGGcv.js → SystemSettingsContext-gtrccL_q.js} +2 -2
  5. package/dist/{TrackComponentVisibleEvent-C7c_rHFW.cjs → TrackComponentVisibleEvent-CqjMiZCS.cjs} +3 -3
  6. package/dist/{TrackComponentVisibleEvent-DXTEBjGM.js → TrackComponentVisibleEvent-D9kpqKM4.js} +3 -3
  7. package/dist/{amplitudeContext-CB_F-nJY.d.cts → amplitudeContext-B73xamNe.d.cts} +1 -1
  8. package/dist/{amplitudeContext-DFYBDc0h.d.ts → amplitudeContext-BhhYPJSL.d.ts} +1 -1
  9. package/dist/{amplitudeContext-sTEsPaVG.cjs → amplitudeContext-Dr1jHI13.cjs} +9 -9
  10. package/dist/{amplitudeContext-Cak6ijMq.js → amplitudeContext-YRS1QOO3.js} +9 -9
  11. package/dist/api-DYjHj_hR.cjs +239 -0
  12. package/dist/api-d5uWvb3-.js +166 -0
  13. package/dist/{app-D_upYeqF.js → app-B9r0MF9n.js} +6 -6
  14. package/dist/{app-KXTMPa4s.cjs → app-Bgr-mAvr.cjs} +7 -7
  15. package/dist/application/models/graphql/index.cjs +2 -2
  16. package/dist/application/models/graphql/index.d.ts +1 -1
  17. package/dist/application/models/graphql/index.js +2 -2
  18. package/dist/application/models/guards/api/index.cjs +3 -2
  19. package/dist/application/models/guards/api/index.d.ts +2 -2
  20. package/dist/application/models/guards/api/index.js +3 -2
  21. package/dist/application/models/guards/utils.cjs +3 -0
  22. package/dist/application/models/guards/utils.d.cts +2 -0
  23. package/dist/application/models/guards/utils.d.ts +2 -0
  24. package/dist/application/models/guards/utils.js +3 -0
  25. package/dist/application/models/index.cjs +10 -9
  26. package/dist/application/models/index.d.cts +8 -7
  27. package/dist/application/models/index.d.ts +11 -10
  28. package/dist/application/models/index.js +9 -8
  29. package/dist/application/models/utilityTypes/index.cjs +1 -1
  30. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  31. package/dist/application/models/utilityTypes/index.js +1 -1
  32. package/dist/application/models/variantInfo/index.cjs +1 -1
  33. package/dist/application/models/variantInfo/index.d.cts +1 -1
  34. package/dist/application/models/variantInfo/index.d.ts +1 -1
  35. package/dist/application/models/variantInfo/index.js +1 -1
  36. package/dist/application/utils/index.cjs +36 -35
  37. package/dist/application/utils/index.d.cts +11 -10
  38. package/dist/application/utils/index.d.ts +16 -15
  39. package/dist/application/utils/index.js +18 -17
  40. package/dist/{atomStore-DnPEioF4.js → atomStore-BuopbV9k.js} +1 -1
  41. package/dist/{atomStore-DEZyFCNz.cjs → atomStore-CZKe3itM.cjs} +1 -1
  42. package/dist/atoms/app/index.cjs +13 -12
  43. package/dist/atoms/app/index.d.cts +10 -9
  44. package/dist/atoms/app/index.d.ts +19 -18
  45. package/dist/atoms/app/index.js +13 -12
  46. package/dist/atoms/atomStore/index.cjs +2 -2
  47. package/dist/atoms/atomStore/index.js +2 -2
  48. package/dist/atoms/chat/index.cjs +19 -18
  49. package/dist/atoms/chat/index.d.cts +36 -35
  50. package/dist/atoms/chat/index.d.ts +39 -38
  51. package/dist/atoms/chat/index.js +19 -18
  52. package/dist/atoms/globalSearch/index.cjs +1 -1
  53. package/dist/atoms/globalSearch/index.d.cts +5 -5
  54. package/dist/atoms/globalSearch/index.d.ts +6 -6
  55. package/dist/atoms/globalSearch/index.js +1 -1
  56. package/dist/atoms/org/index.cjs +4 -4
  57. package/dist/atoms/org/index.d.cts +26 -25
  58. package/dist/atoms/org/index.d.ts +29 -28
  59. package/dist/atoms/org/index.js +4 -4
  60. package/dist/atoms/search/index.cjs +26 -24
  61. package/dist/atoms/search/index.d.cts +10 -9
  62. package/dist/atoms/search/index.d.ts +13 -12
  63. package/dist/atoms/search/index.js +26 -24
  64. package/dist/atoms/search/types.cjs +1 -1
  65. package/dist/atoms/search/types.d.cts +1 -1
  66. package/dist/atoms/search/types.d.ts +1 -1
  67. package/dist/atoms/search/types.js +1 -1
  68. package/dist/atoms/search/utils.cjs +3 -0
  69. package/dist/atoms/search/utils.d.cts +5 -0
  70. package/dist/atoms/search/utils.d.ts +5 -0
  71. package/dist/atoms/search/utils.js +3 -0
  72. package/dist/{cdnContext-BMjVfBft.cjs → cdnContext-CVgXkdV2.cjs} +2 -2
  73. package/dist/{cdnContext-DgsJ00Tb.js → cdnContext-DdE6VPIF.js} +2 -2
  74. package/dist/{chat-DPJGdUkz.js → chat-BNDYKsqF.js} +10 -10
  75. package/dist/{chat-zA-K4tR_.cjs → chat-BkjIKhc5.cjs} +1 -1
  76. package/dist/{chat-D1Eat8Ih.cjs → chat-Br5FhtRs.cjs} +11 -11
  77. package/dist/{chat-B4lkFIxz.js → chat-CgLypC3w.js} +1 -1
  78. package/dist/{chatElementDisplayLocation-C1tRM5OD.d.ts → chatElementDisplayLocation-BwiXrkN7.d.ts} +1 -1
  79. package/dist/{chatElementDisplayLocation-9SW40Dd3.d.cts → chatElementDisplayLocation-DWmfNX_u.d.cts} +1 -1
  80. package/dist/chatSearch-BiF2__V0.js +295 -0
  81. package/dist/chatSearch-BrzfJOto.cjs +418 -0
  82. package/dist/{chatState-BisPJd5g.cjs → chatState-BDsqKE-B.cjs} +3 -3
  83. package/dist/{chatState-BrmBYY8l.js → chatState-ie771Hwy.js} +3 -3
  84. package/dist/{commerce-api-DagLj3D_.js → commerce-api-Dz1jxPOJ.js} +9 -9
  85. package/dist/{commerce-api-CxDIfeME.cjs → commerce-api-KoiUki51.cjs} +9 -9
  86. package/dist/{components-g0G58Kat.cjs → components-Cby-Cma3.cjs} +1 -1
  87. package/dist/{components-B1edduHz.js → components-D1mg1-Br.js} +1 -1
  88. package/dist/config/locators/components/chat/index.cjs +1 -1
  89. package/dist/config/locators/components/chat/index.d.cts +1 -1
  90. package/dist/config/locators/components/chat/index.d.ts +1 -1
  91. package/dist/config/locators/components/chat/index.js +1 -1
  92. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  93. package/dist/config/locators/components/index.cjs +1 -1
  94. package/dist/config/locators/components/index.d.cts +1 -1
  95. package/dist/config/locators/components/index.d.ts +1 -1
  96. package/dist/config/locators/components/index.js +1 -1
  97. package/dist/config/locators/components/search/index.d.ts +1 -1
  98. package/dist/config/locators/index.cjs +2 -2
  99. package/dist/config/locators/index.d.cts +2 -2
  100. package/dist/config/locators/index.d.ts +2 -2
  101. package/dist/config/locators/index.js +2 -2
  102. package/dist/contexts/amplitudeContext/index.cjs +16 -15
  103. package/dist/contexts/amplitudeContext/index.d.cts +1 -1
  104. package/dist/contexts/amplitudeContext/index.d.ts +1 -1
  105. package/dist/contexts/amplitudeContext/index.js +16 -15
  106. package/dist/contexts/cdnContext/index.cjs +4 -4
  107. package/dist/contexts/cdnContext/index.js +4 -4
  108. package/dist/contexts/chatContext/index.cjs +40 -38
  109. package/dist/contexts/chatContext/index.d.cts +2 -2
  110. package/dist/contexts/chatContext/index.d.ts +2 -2
  111. package/dist/contexts/chatContext/index.js +36 -34
  112. package/dist/contexts/enviveConfigContext/index.cjs +4 -4
  113. package/dist/contexts/enviveConfigContext/index.d.cts +3 -3
  114. package/dist/contexts/enviveConfigContext/index.d.ts +3 -3
  115. package/dist/contexts/enviveConfigContext/index.js +4 -4
  116. package/dist/contexts/enviveCssContext/index.cjs +18 -17
  117. package/dist/contexts/enviveCssContext/index.js +18 -17
  118. package/dist/contexts/featureFlagContext/index.cjs +6 -6
  119. package/dist/contexts/featureFlagContext/index.d.cts +3 -3
  120. package/dist/contexts/featureFlagContext/index.d.ts +3 -3
  121. package/dist/contexts/featureFlagContext/index.js +6 -6
  122. package/dist/contexts/featureFlagServiceContext/index.cjs +3 -3
  123. package/dist/contexts/featureFlagServiceContext/index.d.cts +4 -4
  124. package/dist/contexts/featureFlagServiceContext/index.d.ts +4 -4
  125. package/dist/contexts/featureFlagServiceContext/index.js +3 -3
  126. package/dist/contexts/graphqlContext/index.cjs +12 -11
  127. package/dist/contexts/graphqlContext/index.d.cts +9 -8
  128. package/dist/contexts/graphqlContext/index.d.ts +12 -11
  129. package/dist/contexts/graphqlContext/index.js +12 -11
  130. package/dist/contexts/localStorageContext/index.cjs +2 -2
  131. package/dist/contexts/localStorageContext/index.js +2 -2
  132. package/dist/contexts/newOrgConfigContext/index.cjs +16 -15
  133. package/dist/contexts/newOrgConfigContext/index.d.cts +10 -9
  134. package/dist/contexts/newOrgConfigContext/index.d.ts +13 -12
  135. package/dist/contexts/newOrgConfigContext/index.js +16 -15
  136. package/dist/contexts/searchContext/index.cjs +20 -19
  137. package/dist/contexts/searchContext/index.d.cts +1 -1
  138. package/dist/contexts/searchContext/index.d.ts +2 -2
  139. package/dist/contexts/searchContext/index.js +20 -19
  140. package/dist/contexts/sessionStorageContext/index.cjs +2 -2
  141. package/dist/contexts/sessionStorageContext/index.js +2 -2
  142. package/dist/contexts/shopifyUrlContext/index.cjs +2 -2
  143. package/dist/contexts/shopifyUrlContext/index.d.cts +3 -3
  144. package/dist/contexts/shopifyUrlContext/index.d.ts +3 -3
  145. package/dist/contexts/shopifyUrlContext/index.js +2 -2
  146. package/dist/contexts/systemSettingsContext/index.cjs +4 -4
  147. package/dist/contexts/systemSettingsContext/index.d.cts +11 -10
  148. package/dist/contexts/systemSettingsContext/index.d.ts +12 -11
  149. package/dist/contexts/systemSettingsContext/index.js +4 -4
  150. package/dist/contexts/types.d.cts +3 -3
  151. package/dist/contexts/types.d.ts +3 -3
  152. package/dist/contexts/userIdentityContext/index.cjs +22 -21
  153. package/dist/contexts/userIdentityContext/index.d.cts +1 -1
  154. package/dist/contexts/userIdentityContext/index.d.ts +1 -1
  155. package/dist/contexts/userIdentityContext/index.js +22 -21
  156. package/dist/{domObserver-B6cRGTny.js → domObserver-B19-69gW.js} +1 -1
  157. package/dist/{domObserver-DQZwhPrc.cjs → domObserver-CwieVNgj.cjs} +1 -1
  158. package/dist/{enviveConfig-BJZ4zTJo.js → enviveConfig-BQB14yuH.js} +3 -3
  159. package/dist/{enviveConfig-DdBrcGSQ.cjs → enviveConfig-DAA9sozZ.cjs} +3 -3
  160. package/dist/{enviveConfigContext-jBCCWQH9.js → enviveConfigContext-BCpBKqsz.js} +3 -3
  161. package/dist/{enviveConfigContext-78orE_uH.cjs → enviveConfigContext-Btg5JUMG.cjs} +3 -3
  162. package/dist/{featureFlagServiceContext-ChL7DJ53.cjs → featureFlagServiceContext-Bcx5yh4S.cjs} +3 -3
  163. package/dist/{featureFlagServiceContext-D1PzHsEs.d.ts → featureFlagServiceContext-Cpw8omUr.d.ts} +2 -2
  164. package/dist/{featureFlagServiceContext-DQwlCTde.d.cts → featureFlagServiceContext-Cvn6fcdB.d.cts} +2 -2
  165. package/dist/{featureFlagServiceContext-DzFfmb1Z.js → featureFlagServiceContext-_tXX5iro.js} +3 -3
  166. package/dist/{featureGates-Blx10fwB.js → featureGates-2Zea2D2S.js} +1 -1
  167. package/dist/{featureGates-DcZNrUma.cjs → featureGates-BY2Zy7x_.cjs} +1 -1
  168. package/dist/{frontendConfig-wg41mBok.d.cts → frontendConfig-DnMZfvcA.d.cts} +3 -3
  169. package/dist/{frontendConfig-DrvrQSm8.d.ts → frontendConfig-Dqxbqo8G.d.ts} +3 -3
  170. package/dist/{globalSearch-Bnjlxtr5.cjs → globalSearch-C94-vEVh.cjs} +1 -1
  171. package/dist/{globalSearch-CRWUqnjq.js → globalSearch-Dlbnfasm.js} +1 -1
  172. package/dist/{graphql-W7GMIHUu.js → graphql-DRLWdYEk.js} +2 -2
  173. package/dist/{graphql-B9HhDXYt.cjs → graphql-xPDT7ZkK.cjs} +2 -2
  174. package/dist/{graphqlConfig-Bn-HLHsh.cjs → graphqlConfig-B4ddz1vH.cjs} +1 -1
  175. package/dist/{graphqlConfig-DtZm_YaH.js → graphqlConfig-BnjOdeX7.js} +1 -1
  176. package/dist/{graphqlContext-BJg7B--J.js → graphqlContext-B-9g2vOb.js} +5 -5
  177. package/dist/{graphqlContext-DI-_VRmb.cjs → graphqlContext-B7PEKDJs.cjs} +5 -5
  178. package/dist/hooks/AmplitudeOperations/index.cjs +18 -17
  179. package/dist/hooks/AmplitudeOperations/index.d.cts +1 -1
  180. package/dist/hooks/AmplitudeOperations/index.d.ts +1 -1
  181. package/dist/hooks/AmplitudeOperations/index.js +18 -17
  182. package/dist/hooks/AppDetails/index.cjs +16 -15
  183. package/dist/hooks/AppDetails/index.d.cts +9 -8
  184. package/dist/hooks/AppDetails/index.d.ts +12 -11
  185. package/dist/hooks/AppDetails/index.js +16 -15
  186. package/dist/hooks/CdnOperations/index.cjs +4 -4
  187. package/dist/hooks/CdnOperations/index.js +4 -4
  188. package/dist/hooks/ChatToggle/index.cjs +20 -19
  189. package/dist/hooks/ChatToggle/index.d.cts +1 -1
  190. package/dist/hooks/ChatToggle/index.d.ts +1 -1
  191. package/dist/hooks/ChatToggle/index.js +20 -19
  192. package/dist/hooks/ChatToggleAnalytics/index.cjs +20 -19
  193. package/dist/hooks/ChatToggleAnalytics/index.d.cts +1 -1
  194. package/dist/hooks/ChatToggleAnalytics/index.d.ts +1 -1
  195. package/dist/hooks/ChatToggleAnalytics/index.js +20 -19
  196. package/dist/hooks/CustomerSupportHandoff/index.cjs +1 -1
  197. package/dist/hooks/CustomerSupportHandoff/index.js +1 -1
  198. package/dist/hooks/Debounce/index.cjs +1 -1
  199. package/dist/hooks/Debounce/index.js +1 -1
  200. package/dist/hooks/ElementObserver/index.cjs +1 -1
  201. package/dist/hooks/ElementObserver/index.d.cts +1 -1
  202. package/dist/hooks/ElementObserver/index.d.ts +1 -1
  203. package/dist/hooks/ElementObserver/index.js +1 -1
  204. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  205. package/dist/hooks/GraphQLConfig/index.cjs +13 -12
  206. package/dist/hooks/GraphQLConfig/index.js +13 -12
  207. package/dist/hooks/IdentifyUser/index.cjs +23 -22
  208. package/dist/hooks/IdentifyUser/index.js +23 -22
  209. package/dist/hooks/ImageResolver/index.cjs +12 -11
  210. package/dist/hooks/ImageResolver/index.js +12 -11
  211. package/dist/hooks/Intersection/index.cjs +1 -1
  212. package/dist/hooks/Intersection/index.js +1 -1
  213. package/dist/hooks/LocalStorageOperations/index.cjs +2 -2
  214. package/dist/hooks/LocalStorageOperations/index.js +2 -2
  215. package/dist/hooks/MessageFilter/index.cjs +10 -9
  216. package/dist/hooks/MessageFilter/index.d.cts +9 -8
  217. package/dist/hooks/MessageFilter/index.d.ts +12 -11
  218. package/dist/hooks/MessageFilter/index.js +10 -9
  219. package/dist/hooks/NewOrgConfig/index.cjs +17 -16
  220. package/dist/hooks/NewOrgConfig/index.d.cts +10 -9
  221. package/dist/hooks/NewOrgConfig/index.d.ts +13 -12
  222. package/dist/hooks/NewOrgConfig/index.js +17 -16
  223. package/dist/hooks/Search/index.cjs +38 -36
  224. package/dist/hooks/Search/index.d.cts +13 -18
  225. package/dist/hooks/Search/index.d.ts +16 -21
  226. package/dist/hooks/Search/index.js +37 -35
  227. package/dist/hooks/SearchOperations/index.cjs +21 -20
  228. package/dist/hooks/SearchOperations/index.d.cts +1 -1
  229. package/dist/hooks/SearchOperations/index.d.ts +2 -2
  230. package/dist/hooks/SearchOperations/index.js +21 -20
  231. package/dist/hooks/SessionStorageOperations/index.cjs +2 -2
  232. package/dist/hooks/SessionStorageOperations/index.js +2 -2
  233. package/dist/hooks/ShopifyUrlOperations/index.cjs +2 -2
  234. package/dist/hooks/ShopifyUrlOperations/index.d.cts +5 -5
  235. package/dist/hooks/ShopifyUrlOperations/index.d.ts +5 -5
  236. package/dist/hooks/ShopifyUrlOperations/index.js +2 -2
  237. package/dist/hooks/SystemSettingsContext/index.cjs +5 -5
  238. package/dist/hooks/SystemSettingsContext/index.d.cts +11 -10
  239. package/dist/hooks/SystemSettingsContext/index.d.ts +14 -13
  240. package/dist/hooks/SystemSettingsContext/index.js +5 -5
  241. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +18 -17
  242. package/dist/hooks/TrackComponentVisibleEvent/index.d.cts +2 -2
  243. package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +2 -2
  244. package/dist/hooks/TrackComponentVisibleEvent/index.js +18 -17
  245. package/dist/hooks/UpdateAnalyticsProps/index.cjs +17 -16
  246. package/dist/hooks/UpdateAnalyticsProps/index.js +17 -16
  247. package/dist/hooks/utils.cjs +8 -0
  248. package/dist/hooks/utils.d.cts +13 -0
  249. package/dist/hooks/utils.d.ts +13 -0
  250. package/dist/hooks/utils.js +3 -0
  251. package/dist/{index-CyXULMyI.d.cts → index-B9HUPS_i.d.cts} +33 -33
  252. package/dist/{index-DuyZQOE1.d.ts → index-BN-3ctk_.d.ts} +2 -2
  253. package/dist/{index-Cz10TYQA.d.cts → index-BNiYL8h0.d.cts} +2 -2
  254. package/dist/{index-DO0s5KNA.d.cts → index-BW6pHibZ.d.cts} +1 -1
  255. package/dist/{index-fKJB9EFb.d.ts → index-BirtCYN3.d.ts} +5 -5
  256. package/dist/{index-DNUKSg6R.d.ts → index-BoYC9XLW.d.ts} +1 -1
  257. package/dist/{index-CKeS9dud.d.ts → index-C9zXP5bg.d.ts} +3 -3
  258. package/dist/index-CK_J3QMY.d.ts +676 -0
  259. package/dist/index-C_MIfxF0.d.cts +676 -0
  260. package/dist/{index-D8ThXrqI.d.ts → index-Da0UzyI9.d.ts} +1 -1
  261. package/dist/{index-BS7-_CW4.d.ts → index-Dr_c2DDq.d.ts} +1 -1
  262. package/dist/{index-D9VegTU-.d.ts → index-DsiilEj-.d.ts} +1 -1
  263. package/dist/{index-REhT-Pls.d.cts → index-MOOZ2oxZ.d.cts} +1 -1
  264. package/dist/{index-DBqgBV9N.d.ts → index-ghzD_356.d.ts} +1 -1
  265. package/dist/{index-D46Rd0io.d.cts → index-hdbCEjYy.d.cts} +1 -1
  266. package/dist/interceptors/index.cjs +2 -2
  267. package/dist/interceptors/index.d.cts +10 -9
  268. package/dist/interceptors/index.d.ts +13 -12
  269. package/dist/interceptors/index.js +2 -2
  270. package/dist/interceptors/types.cjs +1 -1
  271. package/dist/interceptors/types.d.cts +9 -8
  272. package/dist/interceptors/types.d.ts +12 -11
  273. package/dist/interceptors/types.js +1 -1
  274. package/dist/{localStorageContext-6OrGDFid.js → localStorageContext-DiTziaPa.js} +2 -2
  275. package/dist/{localStorageContext-Bld0OWmG.cjs → localStorageContext-S38L0OSP.cjs} +2 -2
  276. package/dist/{logger-D5MFf3nW.js → logger-CkhQayOW.js} +1 -1
  277. package/dist/{logger-CSL2jqI9.cjs → logger-DQ0WfCcD.cjs} +1 -1
  278. package/dist/{models-Dn8Emdzc.js → models-C48U9q70.js} +4 -3
  279. package/dist/{models-ZpQcRZQK.cjs → models-Ctn-pmug.cjs} +25 -24
  280. package/dist/{newOrgConfigAtom-DkSi45_Q.cjs → newOrgConfigAtom-D6R-7HCk.cjs} +1 -1
  281. package/dist/{newOrgConfigAtom--tewb_G0.js → newOrgConfigAtom-bn1lnljf.js} +1 -1
  282. package/dist/{newOrgConfigContext-B3aeblfE.cjs → newOrgConfigContext-D3WoaBVU.cjs} +5 -5
  283. package/dist/{newOrgConfigContext-B5mzHKTG.js → newOrgConfigContext-rWOYz0E8.js} +5 -5
  284. package/dist/{nodeSelector-XsUa5vNH.d.cts → nodeSelector-B3bPtEjX.d.cts} +1 -1
  285. package/dist/{nodeSelector-DybpVr-i.d.ts → nodeSelector-D5gjDWZ3.d.ts} +1 -1
  286. package/dist/{org-ClUxpHPZ.cjs → org-CIhjzxWr.cjs} +1 -1
  287. package/dist/{org-B2uRkPt3.js → org-CeWXnpwF.js} +1 -1
  288. package/dist/{orgAnalyticsConfig-DOceTdNp.js → orgAnalyticsConfig-BC4_sEmn.js} +1 -1
  289. package/dist/{orgAnalyticsConfig-CuWXijsr.cjs → orgAnalyticsConfig-DsGbyFhO.cjs} +1 -1
  290. package/dist/{search-DsQm_pAi.cjs → search--NZPZkK3.cjs} +5 -5
  291. package/dist/{search-BIomqYy6.d.ts → search-BLShhjvR.d.ts} +2 -2
  292. package/dist/{search-Bn4x-3TG.js → search-CxZl7iQF.js} +5 -5
  293. package/dist/{search-filter-types-B5xcaEit.d.ts → search-filter-types-DPgeG8FS.d.ts} +1 -1
  294. package/dist/{search-filter-types-Byd0lEUa.d.cts → search-filter-types-_mprCnBi.d.cts} +1 -1
  295. package/dist/{search-B_Hg-Es2.d.cts → search-y-ioX5Mz.d.cts} +1 -1
  296. package/dist/{searchContext-Cn-pCoDy.cjs → searchContext-C4Glr8Nv.cjs} +7 -7
  297. package/dist/{searchContext-fQDGSvUF.js → searchContext-VnjhV7Lk.js} +7 -7
  298. package/dist/{searchServiceAdapter-DrjFCiw8.cjs → searchServiceAdapter-DEv1tTn0.cjs} +1 -1
  299. package/dist/{searchServiceAdapter-BSPZOg1r.js → searchServiceAdapter-WyCU55NV.js} +1 -1
  300. package/dist/{sessionStorageContext-CXE7iHtP.cjs → sessionStorageContext-BJ05_j7l.cjs} +2 -2
  301. package/dist/{sessionStorageContext-C5MUl2zf.js → sessionStorageContext-Dp_bhXQP.js} +2 -2
  302. package/dist/{shopifyUrlContext-BSYWsoX9.js → shopifyUrlContext-CGqpJl1o.js} +2 -2
  303. package/dist/{shopifyUrlContext-7ppKx1jJ.cjs → shopifyUrlContext-Cob4L7Dt.cjs} +2 -2
  304. package/dist/{spiffyWidgets-DxGuuuCG.d.cts → spiffyWidgets-BuS00VaQ.d.cts} +1 -1
  305. package/dist/{spiffyWidgets-CdxRcXhW.d.ts → spiffyWidgets-GILaqHv6.d.ts} +1 -1
  306. package/dist/{systemSettingsContext-BdAe_3Ll.cjs → systemSettingsContext-BDKWrrco.cjs} +2 -2
  307. package/dist/{systemSettingsContext-Cjyo2o3N.js → systemSettingsContext-Dqng3YSZ.js} +2 -2
  308. package/dist/{test-types-ZuRAYwox.d.ts → test-types-EzMFw_U3.d.ts} +1 -1
  309. package/dist/{test-types-DQB1JqOf.d.cts → test-types-ThQiO_cc.d.cts} +1 -1
  310. package/dist/types/index.d.cts +2 -2
  311. package/dist/types/index.d.ts +2 -2
  312. package/dist/{types-DzwBmZHy.d.cts → types-BUeRbZUk.d.cts} +1 -1
  313. package/dist/{types-YvACLe2e.d.ts → types-CMuTSKrW.d.ts} +2 -2
  314. package/dist/{types-DIk0FLwd.js → types-CS0Hrzja.js} +1 -1
  315. package/dist/{types-DNLkuGWZ.cjs → types-CxObxLKs.cjs} +1 -1
  316. package/dist/{types-BCz-hOvv.d.ts → types-fsXBIQwO.d.ts} +1 -1
  317. package/dist/{types-Eip78dWv.d.cts → types-zuWLkBJ3.d.cts} +1 -1
  318. package/dist/types.d.cts +4 -4
  319. package/dist/types.d.ts +4 -4
  320. package/dist/{unsupportedProductExceptions-Dak4AD-t.cjs → unsupportedProductExceptions-CKiri_vO.cjs} +1 -1
  321. package/dist/{unsupportedProductExceptions--t7AQFou.js → unsupportedProductExceptions-ClxlJ6cU.js} +1 -1
  322. package/dist/{urlsParser-BV5yF8sa.cjs → urlsParser-D1nsJgQG.cjs} +1 -1
  323. package/dist/{urlsParser-DUgV_Qy9.js → urlsParser-DzEetiey.js} +1 -1
  324. package/dist/{useAmplitudeOperations-Cco_B3A5.cjs → useAmplitudeOperations-BSsyvkQ2.cjs} +2 -2
  325. package/dist/{useAmplitudeOperations-C6Osqkso.js → useAmplitudeOperations-BottjwT9.js} +2 -2
  326. package/dist/{useAppDetails-CGqtN6sJ.cjs → useAppDetails-BpiBxS_5.cjs} +4 -4
  327. package/dist/{useAppDetails-DwX2Rhed.js → useAppDetails-DDNIsM46.js} +4 -4
  328. package/dist/{useDebounce-BJqnCBcl.cjs → useDebounce-BaIp-A1W.cjs} +1 -1
  329. package/dist/{useDebounce-Ce31ph7m.js → useDebounce-CxPj9WmE.js} +1 -1
  330. package/dist/{useGraphQLConfig-ByOZb3oZ.js → useGraphQLConfig-DZ0ZannB.js} +2 -2
  331. package/dist/{useGraphQLConfig-DItL4BgM.cjs → useGraphQLConfig-Dw8dDh3T.cjs} +2 -2
  332. package/dist/{useIntersection-Czeo04jt.js → useIntersection-B4J9UhaG.js} +1 -1
  333. package/dist/{useIntersection-DnZNLcnu.cjs → useIntersection-DKWc5MY6.cjs} +1 -1
  334. package/dist/{useMessageInterceptor-C9p9No1n.cjs → useMessageInterceptor-CstX10ih.cjs} +1 -1
  335. package/dist/{useMessageInterceptor-tntd2rvB.js → useMessageInterceptor-D5oAekXn.js} +1 -1
  336. package/dist/{userIdentityContext-DBXoLrFu.d.cts → userIdentityContext-D2oFVFzo.d.cts} +1 -1
  337. package/dist/{userIdentityContext-C1HzZFb2.cjs → userIdentityContext-DPFkCSCu.cjs} +6 -6
  338. package/dist/{userIdentityContext-CDfosvOO.js → userIdentityContext-Z65zM-Ae.js} +5 -5
  339. package/dist/{userIdentityContext-W1OWF3cG.d.ts → userIdentityContext-wYRpgkaJ.d.ts} +1 -1
  340. package/dist/utils-2SWrJ12w.cjs +29 -0
  341. package/dist/utils-B1xLx9S8.d.ts +15 -0
  342. package/dist/utils-B3x_9JTY.d.cts +15 -0
  343. package/dist/utils-BZtSmwgh.d.cts +22 -0
  344. package/dist/{utils-C7S9YiFp.js → utils-Bcz5kAgP.js} +40 -2
  345. package/dist/utils-CEKzBcN2.js +27 -0
  346. package/dist/{utils-BA5HXmkL.cjs → utils-CMqFfqZx.cjs} +57 -1
  347. package/dist/{utils-CF13DfA1.js → utils-CVovRwlw.js} +4 -4
  348. package/dist/utils-CqBxIpEV.js +23 -0
  349. package/dist/utils-CsMbZmRw.cjs +33 -0
  350. package/dist/{utils-BTDw2aMx.cjs → utils-DzPSXtmD.cjs} +4 -4
  351. package/dist/utils-bxOCg2i9.d.ts +22 -0
  352. package/package.json +13 -1
  353. package/dist/api-DSFlctlc.cjs +0 -269
  354. package/dist/api-JTNjuOfc.js +0 -190
  355. package/dist/chatSearch-B5jMnCYX.js +0 -315
  356. package/dist/chatSearch-DWMiyWN0.cjs +0 -444
  357. package/dist/index-BCLaqnc2.d.cts +0 -689
  358. package/dist/index-Bs0QtkSu.d.ts +0 -689
  359. /package/dist/{AmplitudeOperations-CgIVPUlr.cjs → AmplitudeOperations-CNyxbBY6.cjs} +0 -0
  360. /package/dist/{AmplitudeOperations-YpyaR7Mp.js → AmplitudeOperations-Oa2efWtF.js} +0 -0
  361. /package/dist/{atomStore-C2OI76yN.js → atomStore-BS6qtYZF.js} +0 -0
  362. /package/dist/{atomStore-DWmT1six.cjs → atomStore-BjRyLFEx.cjs} +0 -0
  363. /package/dist/{types-DQoXDiso.js → types-DtTnp0o0.js} +0 -0
  364. /package/dist/{types-o3zWarRp.cjs → types-a8gm_IaQ.cjs} +0 -0
  365. /package/dist/{utilityTypes-CWJZb9BZ.js → utilityTypes-DynzxjK3.js} +0 -0
  366. /package/dist/{utilityTypes-YGiMSyV7.cjs → utilityTypes-xb8SjKSV.cjs} +0 -0
  367. /package/dist/{variantInfo-DRFLcGc7.cjs → variantInfo-B7IwRpCg.cjs} +0 -0
  368. /package/dist/{variantInfo-58JLeDJb.js → variantInfo-BtOYUGWa.js} +0 -0
@@ -1,315 +0,0 @@
1
- import { MessageRole, MessageType } from "./models-Dn8Emdzc.js";
2
- import { messagesAtom, replyEventCategoryAtom, userHasRepliedAtom, userQueryAtom } from "./chatState-BrmBYY8l.js";
3
- import { queueUserEventAtom } from "./chat-DPJGdUkz.js";
4
- import { newOrgConfigAtom } from "./newOrgConfigAtom--tewb_G0.js";
5
- import { ProductSorting } from "./types-DIk0FLwd.js";
6
- import { UserEventCategory } from "@spiffy-ai/commerce-api-client";
7
- import { atom } from "jotai";
8
- import { v4 } from "uuid";
9
-
10
- //#region src/atoms/search/utils.ts
11
- const formatFilterDisplayName = (displayName) => {
12
- const sizes = [
13
- "xxxs",
14
- "xxs",
15
- "xs",
16
- "s",
17
- "m",
18
- "l",
19
- "xl",
20
- "xxl",
21
- "xxxl",
22
- "xxxxl"
23
- ];
24
- return displayName.toLowerCase().split(" ").map((word) => {
25
- if (sizes.includes(word)) return word.toUpperCase();
26
- return word.charAt(0).toUpperCase() + word.slice(1);
27
- }).join(" ").replace(/Iphone/g, "iPhone");
28
- };
29
-
30
- //#endregion
31
- //#region src/atoms/search/productFilters.ts
32
- const getPriceBucket = (price, bucketSize) => {
33
- return Math.floor(price / bucketSize) * bucketSize;
34
- };
35
- const isStringArray = (value) => {
36
- if (!Array.isArray(value)) return false;
37
- return value.every((item) => typeof item === "string");
38
- };
39
- const sortFilter = (filterConfig) => {
40
- if (filterConfig.type === "price") return (a, b) => Number(a.filterItemId) - Number(b.filterItemId);
41
- if (filterConfig.type === "dynamic") {
42
- if (filterConfig.sorting.type === "alphabetic") return (a, b) => a.displayName.localeCompare(b.displayName);
43
- if (filterConfig.sorting.type === "productCount") return (a, b) => a.productCount === b.productCount ? a.displayName.localeCompare(b.displayName) : b.productCount - a.productCount;
44
- if (filterConfig.sorting.type === "custom") {
45
- const sortedKeys = filterConfig.sorting.map;
46
- return (a, b) => {
47
- if (sortedKeys[a.displayName] && sortedKeys[b.displayName]) return sortedKeys[a.displayName] - sortedKeys[b.displayName];
48
- if (sortedKeys[a.displayName]) return -1;
49
- if (sortedKeys[b.displayName]) return 1;
50
- return b.productCount - a.productCount;
51
- };
52
- }
53
- }
54
- throw new Error("Invaalid search filter configuration");
55
- };
56
- var ProductFilters = class {
57
- static getFiltersForProducts(products, filterConfigs, selectedFilterOptions) {
58
- if (!products || products.length === 0) return [];
59
- return [...filterConfigs.map((filterConfig) => products.reduce((acc, product) => {
60
- if (filterConfig.type === "price") {
61
- const priceBucket = getPriceBucket(product.salePrice ?? product.originalPrice ?? 0, filterConfig.bucketSize);
62
- const current = acc.map[priceBucket] ?? {
63
- filterItemId: priceBucket,
64
- displayName: `$${priceBucket}-$${priceBucket + filterConfig.bucketSize}`,
65
- productCount: 0
66
- };
67
- acc.map[priceBucket] = {
68
- ...current,
69
- productCount: current.productCount + 1
70
- };
71
- return acc;
72
- }
73
- const attributeValues = (product.filters && product.filters?.[filterConfig.attribute]) ?? [];
74
- if (isStringArray(attributeValues)) attributeValues.forEach((val) => {
75
- const normalizedVal = val.toLowerCase();
76
- const current = acc.map[normalizedVal] ?? {
77
- filterItemId: normalizedVal,
78
- displayName: formatFilterDisplayName(val),
79
- productCount: 0
80
- };
81
- acc.map[normalizedVal] = {
82
- ...current,
83
- productCount: current.productCount + 1
84
- };
85
- });
86
- return acc;
87
- }, {
88
- filterConfig,
89
- map: {}
90
- })).map(({ filterConfig, map }) => ({
91
- filterId: filterConfig.filterId,
92
- displayName: filterConfig.displayName,
93
- items: Object.values(map).map((filter) => ({
94
- filterItemId: filter.filterItemId,
95
- displayName: filter.displayName,
96
- productCount: filter.productCount,
97
- isSelected: selectedFilterOptions.some((option) => option.id === `${filterConfig.filterId}:${filter.filterItemId}`) ?? false
98
- })).sort(sortFilter(filterConfig))
99
- }))];
100
- }
101
- static filterProducts(products, filterConfigs, selectedFilterOptions, additiveDynamicFilters = false) {
102
- const selectedFilters = filterConfigs.map((filterConfig) => ({
103
- filterConfig,
104
- hasSelectedOptions: selectedFilterOptions.some((option) => option.filterId === filterConfig.filterId)
105
- })).filter(({ hasSelectedOptions }) => hasSelectedOptions);
106
- return selectedFilterOptions.length === 0 ? products : products.filter((product) => selectedFilters.reduce((acc, selectedFilter) => {
107
- if (!acc) return acc;
108
- if (selectedFilter.filterConfig.type === "price") {
109
- const priceBucket = getPriceBucket(product.salePrice ?? product.originalPrice ?? 0, selectedFilter.filterConfig.bucketSize);
110
- if (!selectedFilterOptions.some((option) => option.id === `price:${priceBucket}`)) return false;
111
- }
112
- if (selectedFilter.filterConfig.type === "dynamic") {
113
- const { filterId, attribute } = selectedFilter.filterConfig;
114
- const attributeValues = product.filters?.[attribute];
115
- if (!isStringArray(attributeValues)) return false;
116
- if (selectedFilter.filterConfig.attribute === "dynamic" && !additiveDynamicFilters) {
117
- if (!selectedFilterOptions.filter((option) => option.filterId === filterId).map((option) => option.filterItemId.toLowerCase()).every((selectedValue) => attributeValues.some((val) => val.toLowerCase() === selectedValue))) return false;
118
- } else if (!attributeValues.some((val) => selectedFilterOptions.some((option) => option.id === `${filterId}:${val.toLowerCase()}`))) return false;
119
- }
120
- return true;
121
- }, true));
122
- }
123
- };
124
-
125
- //#endregion
126
- //#region src/atoms/search/productSorter.ts
127
- var ProductSorter = class {
128
- static sort(products, sorting) {
129
- switch (sorting) {
130
- case ProductSorting.PRICE_ASC: return [...products].sort((p1, p2) => (p1.salePrice ?? p1.originalPrice ?? 0) - (p2.salePrice ?? p2.originalPrice ?? 0));
131
- case ProductSorting.PRICE_DESC: return [...products].sort((p1, p2) => (p2.salePrice ?? p2.originalPrice ?? 0) - (p1.salePrice ?? p1.originalPrice ?? 0));
132
- default: return products;
133
- }
134
- }
135
- };
136
-
137
- //#endregion
138
- //#region src/atoms/search/chatSearch.ts
139
- const chatSearchStateAtom = atom("entrypoint");
140
- const chatSearchHasProductsAtom = atom(false);
141
- const chatSearchProductSortingAtom = atom(ProductSorting.FEATURED);
142
- const filterProductList = (message) => message.type === MessageType.Product && message.metadata.isForGrid === true;
143
- const filterFilterList = (message) => message.type === MessageType.ProductSearchFilter;
144
- const chatSearchIsLoadingAtom = atom(false);
145
- const buildChatSearchTurn = (messages) => {
146
- const queryMessage = messages.find((message) => message.type === MessageType.ProductSearch);
147
- if (!queryMessage) return null;
148
- const { generatedQuery, productCount } = queryMessage.metadata ?? {};
149
- const productList = messages.filter(filterProductList).map((message) => message.metadata);
150
- const filterList = messages.filter(filterFilterList).map((message) => message.metadata.filterName);
151
- return [queryMessage.id, {
152
- id: queryMessage.id,
153
- generatedQuery,
154
- productCount: productCount || productList.length,
155
- productList,
156
- filterList,
157
- messages
158
- }];
159
- };
160
- const chatSearchFilterConfigAtom = atom((get) => {
161
- return get(newOrgConfigAtom)?.frontendConfig?.uiConfigs?.searchConfig?.searchFilterConfig || [];
162
- });
163
- const searchMapAtom = atom((get) => {
164
- const messages = get(messagesAtom);
165
- return Object.fromEntries(messages.map(buildChatSearchTurn).filter((v) => v !== null));
166
- });
167
- const internalChatSearchParamsAtom = atom({
168
- id: null,
169
- query: null
170
- });
171
- const selectedFilterOptionsAtom = atom([]);
172
- const additiveDynamicFiltersAtom = atom((get) => {
173
- return get(newOrgConfigAtom)?.frontendConfig?.uiConfigs?.searchConfig?.additiveDynamicFilters ?? false;
174
- });
175
- const createChatSearchFilterOption = (filterId, filterItemId, displayName) => ({
176
- id: `${filterId}:${filterItemId}`,
177
- displayName,
178
- filterId,
179
- filterItemId
180
- });
181
- const handleSearchAtom = atom(null, (get, set, message) => {
182
- if (message.type !== MessageType.Search) return;
183
- const querySearch = message.metadata.searchTerm;
184
- set(replyEventCategoryAtom, UserEventCategory.Search);
185
- set(userQueryAtom, querySearch);
186
- set(messagesAtom, [...get(messagesAtom), [message]]);
187
- set(userHasRepliedAtom, true);
188
- set(queueUserEventAtom, {
189
- eventId: message.id,
190
- category: UserEventCategory.Search,
191
- createdAt: message.createdAt,
192
- attributes: {
193
- searchTerm: message.metadata.searchTerm,
194
- selectedFilters: message.metadata.selectedFilters
195
- }
196
- });
197
- });
198
- const chatSearchParamsAtom = atom((get) => get(internalChatSearchParamsAtom), (_, set, value) => {
199
- set(internalChatSearchParamsAtom, value);
200
- });
201
- const chatSearchQueryAtom = atom((get) => get(chatSearchParamsAtom)?.query ?? null, (get, set, value) => {
202
- const searchParams = get(chatSearchParamsAtom);
203
- set(chatSearchParamsAtom, {
204
- id: searchParams.id,
205
- query: value
206
- });
207
- });
208
- const chatSearchIdAtom = atom((get) => get(chatSearchParamsAtom)?.id ?? null, (get, set, value) => {
209
- const searchParams = get(chatSearchParamsAtom);
210
- set(chatSearchParamsAtom, {
211
- id: value,
212
- query: searchParams.query
213
- });
214
- });
215
- const ChatSearchTurnAtom = atom((get) => {
216
- const searchFilterConfig = get(chatSearchFilterConfigAtom);
217
- const searchMap = get(searchMapAtom);
218
- const chatSearchId = get(chatSearchIdAtom);
219
- if (!chatSearchId) return null;
220
- const ChatSearchTurn = searchMap[chatSearchId];
221
- if (!ChatSearchTurn) return null;
222
- const productSorting = get(chatSearchProductSortingAtom);
223
- const selectedFilterOptions = get(selectedFilterOptionsAtom);
224
- const additiveDynamicFilters = get(additiveDynamicFiltersAtom);
225
- const filteredProducts = ProductFilters.filterProducts(ChatSearchTurn.productList, searchFilterConfig, selectedFilterOptions, additiveDynamicFilters);
226
- const filteredAndSortedProducts = ProductSorter.sort(filteredProducts, productSorting);
227
- return {
228
- ...searchMap[chatSearchId],
229
- productList: filteredAndSortedProducts,
230
- productCount: filteredAndSortedProducts.length
231
- };
232
- });
233
- const chatSearchProducts = atom((get) => {
234
- return get(ChatSearchTurnAtom)?.productList ?? [];
235
- });
236
- const chatSearchFiltersAtom = atom((get) => {
237
- const searchFilterConfig = get(chatSearchFilterConfigAtom);
238
- const searchMap = get(searchMapAtom);
239
- const chatSearchId = get(chatSearchIdAtom);
240
- if (chatSearchId && searchMap[chatSearchId]) {
241
- const products = searchMap[chatSearchId].productList;
242
- const selectedFilterOptions = get(selectedFilterOptionsAtom);
243
- return ProductFilters.getFiltersForProducts(products, searchFilterConfig, selectedFilterOptions);
244
- }
245
- return [];
246
- });
247
- const setSearchParams = (query) => {
248
- const url = new URL(window.location.href);
249
- url.searchParams.set("es", "true");
250
- url.searchParams.set("esq", query);
251
- window.history.pushState({}, "", url);
252
- };
253
- const getSearchParamsAtom = atom(() => {
254
- const params = new URLSearchParams(window.location.search);
255
- return {
256
- es: params.get("es"),
257
- esq: params.get("esq")
258
- };
259
- });
260
- const initiateChatSearchAtom = atom(null, (_, set, query) => {
261
- set(chatSearchIsLoadingAtom, true);
262
- const url = new URL(window.location.href);
263
- url.searchParams.set("es", "true");
264
- url.searchParams.set("esq", query);
265
- window.history.pushState({}, "", url);
266
- window.dispatchEvent(new PopStateEvent("popstate", { state: {} }));
267
- set(chatSearchParamsAtom, {
268
- id: null,
269
- query
270
- });
271
- set(handleSearchAtom, {
272
- id: v4(),
273
- role: MessageRole.User,
274
- type: MessageType.Search,
275
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
276
- metadata: {
277
- searchTerm: query,
278
- selectedFilters: []
279
- }
280
- });
281
- });
282
- const handleSearchResultsAtom = atom(null, (get, set, message) => {
283
- if (!message || message.type !== MessageType.ProductSearch) return;
284
- const { productCount, generatedQuery } = message.metadata;
285
- if (productCount !== 0) {
286
- set(selectedFilterOptionsAtom, []);
287
- set(chatSearchStateAtom, "product-page");
288
- const currentSearchParams = get(chatSearchParamsAtom);
289
- const url = new URL(window.location.href);
290
- url.searchParams.set("es", "true");
291
- url.searchParams.set("esq", generatedQuery);
292
- url.searchParams.set("esi", message.id);
293
- window.history.pushState({}, "", url);
294
- if (currentSearchParams.id === null) window.history.replaceState(null, "", url);
295
- else window.history.pushState(null, "", url);
296
- set(chatSearchParamsAtom, {
297
- id: message.id,
298
- query: generatedQuery
299
- });
300
- }
301
- });
302
- const setChatSearchParamsAtom = atom(null, (_, set, query) => {
303
- const url = new URL(window.location.href);
304
- url.searchParams.set("es", "true");
305
- url.searchParams.set("esq", query);
306
- window.history.pushState({}, "", url);
307
- set(chatSearchParamsAtom, {
308
- id: null,
309
- query
310
- });
311
- });
312
-
313
- //#endregion
314
- export { ChatSearchTurnAtom, ProductFilters, ProductSorter, additiveDynamicFiltersAtom, chatSearchFiltersAtom, chatSearchHasProductsAtom, chatSearchIdAtom, chatSearchIsLoadingAtom, chatSearchParamsAtom, chatSearchProductSortingAtom, chatSearchProducts, chatSearchQueryAtom, chatSearchStateAtom, createChatSearchFilterOption, formatFilterDisplayName, getSearchParamsAtom, handleSearchResultsAtom, initiateChatSearchAtom, selectedFilterOptionsAtom, setChatSearchParamsAtom, setSearchParams };
315
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdFNlYXJjaC1CNWpNbkNZWC5qcyIsIm5hbWVzIjpbInV1aWQiXSwic291cmNlcyI6WyIuLi9zcmMvYXRvbXMvc2VhcmNoL3V0aWxzLnRzIiwiLi4vc3JjL2F0b21zL3NlYXJjaC9wcm9kdWN0RmlsdGVycy50cyIsIi4uL3NyYy9hdG9tcy9zZWFyY2gvcHJvZHVjdFNvcnRlci50cyIsIi4uL3NyYy9hdG9tcy9zZWFyY2gvY2hhdFNlYXJjaC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBzaXplcyA9IFsneHh4cycsICd4eHMnLCAneHMnLCAncycsICdtJywgJ2wnLCAneGwnLCAneHhsJywgJ3h4eGwnLCAneHh4eGwnXTtcblxuICBjb25zdCBwcm9jZXNzZWRXb3JkcyA9IGRpc3BsYXlOYW1lXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAoKHdvcmQpID0+IHtcbiAgICAgIGlmIChzaXplcy5pbmNsdWRlcyh3b3JkKSkge1xuICAgICAgICByZXR1cm4gd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpO1xuICAgIH0pO1xuXG4gIGNvbnN0IHRpdGxlQ2FzZWROYW1lID0gcHJvY2Vzc2VkV29yZHMuam9pbignICcpO1xuXG4gIC8vIEZpbmFsIHJlcGxhY2VtZW50cyBmb3Igc3BlY2lhbCBjYXNlc1xuICByZXR1cm4gdGl0bGVDYXNlZE5hbWUucmVwbGFjZSgvSXBob25lL2csICdpUGhvbmUnKTtcbn07XG4iLCJpbXBvcnQgeyBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5pbXBvcnQgeyBGaWx0ZXJBdHRyaWJ1dGUgfSBmcm9tICdzcmMvY29udGV4dHMvdHlwZXMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRGaWx0ZXJPcHRpb24gfSBmcm9tICdzcmMvYXRvbXMvc2VhcmNoL3NlYXJjaEFQSSc7XG5pbXBvcnQgeyBDaGF0U2VhcmNoRmlsdGVyLCBDaGF0U2VhcmNoRmlsdGVySXRlbSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgZ2V0UHJpY2VCdWNrZXQgPSAocHJpY2U6IG51bWJlciwgYnVja2V0U2l6ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGJ1Y2tldCA9IE1hdGguZmxvb3IocHJpY2UgLyBidWNrZXRTaXplKTtcbiAgcmV0dXJuIGJ1Y2tldCAqIGJ1Y2tldFNpemU7XG59O1xuXG5jb25zdCBpc1N0cmluZ0FycmF5ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nW10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn07XG5cbnR5cGUgRmlsdGVyU29ydEZ1bmN0aW9uID0gKGE6IENoYXRTZWFyY2hGaWx0ZXJJdGVtLCBiOiBDaGF0U2VhcmNoRmlsdGVySXRlbSkgPT4gbnVtYmVyO1xuXG5jb25zdCBzb3J0RmlsdGVyID0gKGZpbHRlckNvbmZpZzogRmlsdGVyQXR0cmlidXRlKTogRmlsdGVyU29ydEZ1bmN0aW9uID0+IHtcbiAgaWYgKGZpbHRlckNvbmZpZy50eXBlID09PSAncHJpY2UnKSB7XG4gICAgcmV0dXJuIChhLCBiKSA9PiBOdW1iZXIoYS5maWx0ZXJJdGVtSWQpIC0gTnVtYmVyKGIuZmlsdGVySXRlbUlkKTtcbiAgfVxuICBpZiAoZmlsdGVyQ29uZmlnLnR5cGUgPT09ICdkeW5hbWljJykge1xuICAgIGlmIChmaWx0ZXJDb25maWcuc29ydGluZy50eXBlID09PSAnYWxwaGFiZXRpYycpIHtcbiAgICAgIHJldHVybiAoYSwgYikgPT4gYS5kaXNwbGF5TmFtZS5sb2NhbGVDb21wYXJlKGIuZGlzcGxheU5hbWUpO1xuICAgIH1cbiAgICAvLyBTb3J0IGJ5IHRoZSBudW1iZXIgb2YgcHJvZHVjdHMsIGlmIHRoZXkgbWF0Y2gsIHNvcnQgYnkgYWxwaGFiZXRpY2FsXG4gICAgaWYgKGZpbHRlckNvbmZpZy5zb3J0aW5nLnR5cGUgPT09ICdwcm9kdWN0Q291bnQnKSB7XG4gICAgICByZXR1cm4gKGEsIGIpID0+XG4gICAgICAgIGEucHJvZHVjdENvdW50ID09PSBiLnByb2R1Y3RDb3VudFxuICAgICAgICAgID8gYS5kaXNwbGF5TmFtZS5sb2NhbGVDb21wYXJlKGIuZGlzcGxheU5hbWUpXG4gICAgICAgICAgOiBiLnByb2R1Y3RDb3VudCAtIGEucHJvZHVjdENvdW50O1xuICAgIH1cbiAgICBpZiAoZmlsdGVyQ29uZmlnLnNvcnRpbmcudHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGNvbnN0IHNvcnRlZEtleXMgPSBmaWx0ZXJDb25maWcuc29ydGluZy5tYXA7XG4gICAgICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKHNvcnRlZEtleXNbYS5kaXNwbGF5TmFtZV0gJiYgc29ydGVkS2V5c1tiLmRpc3BsYXlOYW1lXSkge1xuICAgICAgICAgIC8vIElmIGJvdGggYXJlIGluIHRoZSBzb3J0ZWRLZXlzLCBzb3J0IGJ5IHRoZSBpbmRleFxuICAgICAgICAgIHJldHVybiBzb3J0ZWRLZXlzW2EuZGlzcGxheU5hbWVdIC0gc29ydGVkS2V5c1tiLmRpc3BsYXlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBvbmx5ICdhJyBpcyBpbiB0aGUgc29ydGVkS2V5cywgcHV0IGl0IGJlZm9yZSB0aGUgb3RoZXJcbiAgICAgICAgaWYgKHNvcnRlZEtleXNbYS5kaXNwbGF5TmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgb25seSAnYicgaXMgaW4gdGhlIHNvcnRlZEtleXMsIHB1dCBpdCBiZWZvcmUgdGhlIG90aGVyXG4gICAgICAgIGlmIChzb3J0ZWRLZXlzW2IuZGlzcGxheU5hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbmVpdGhlciBhcmUgaW4gdGhlIHNvcnRlZEtleXMsIHNvcnQgYnkgcHJvZHVjdENvdW50XG4gICAgICAgIHJldHVybiBiLnByb2R1Y3RDb3VudCAtIGEucHJvZHVjdENvdW50O1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhYWxpZCBzZWFyY2ggZmlsdGVyIGNvbmZpZ3VyYXRpb24nKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBQcm9kdWN0RmlsdGVycyB7XG4gIHN0YXRpYyBnZXRGaWx0ZXJzRm9yUHJvZHVjdHMoXG4gICAgcHJvZHVjdHM6IFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXVtdLFxuICAgIGZpbHRlckNvbmZpZ3M6IEZpbHRlckF0dHJpYnV0ZVtdLFxuICAgIHNlbGVjdGVkRmlsdGVyT3B0aW9uczogU2VsZWN0ZWRGaWx0ZXJPcHRpb25bXSxcbiAgKTogQ2hhdFNlYXJjaEZpbHRlcltdIHtcbiAgICBpZiAoIXByb2R1Y3RzIHx8IHByb2R1Y3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcnMgPSBmaWx0ZXJDb25maWdzLm1hcCgoZmlsdGVyQ29uZmlnKSA9PlxuICAgICAgcHJvZHVjdHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgLy8gUHJpY2UgaGFzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBmaWx0ZXJzXG4gICAgICAgICAgaWYgKGZpbHRlckNvbmZpZy50eXBlID09PSAncHJpY2UnKSB7XG4gICAgICAgICAgICBjb25zdCBwcmljZUJ1Y2tldCA9IGdldFByaWNlQnVja2V0KFxuICAgICAgICAgICAgICBwcm9kdWN0LnNhbGVQcmljZSA/PyBwcm9kdWN0Lm9yaWdpbmFsUHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgZmlsdGVyQ29uZmlnLmJ1Y2tldFNpemUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGFjYy5tYXBbcHJpY2VCdWNrZXRdID8/IHtcbiAgICAgICAgICAgICAgZmlsdGVySXRlbUlkOiBwcmljZUJ1Y2tldCxcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAkJHtwcmljZUJ1Y2tldH0tJCR7cHJpY2VCdWNrZXQgKyBmaWx0ZXJDb25maWcuYnVja2V0U2l6ZX1gLFxuICAgICAgICAgICAgICBwcm9kdWN0Q291bnQ6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWNjLm1hcFtwcmljZUJ1Y2tldF0gPSB7IC4uLmN1cnJlbnQsIHByb2R1Y3RDb3VudDogY3VycmVudC5wcm9kdWN0Q291bnQgKyAxIH07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBcImF0dHJpYnV0ZVwiIGlzIGFuIGFycmF5IG9mIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlcyA9XG4gICAgICAgICAgICAocHJvZHVjdC5maWx0ZXJzICYmIHByb2R1Y3QuZmlsdGVycz8uW2ZpbHRlckNvbmZpZy5hdHRyaWJ1dGVdKSA/PyBbXTtcbiAgICAgICAgICBpZiAoaXNTdHJpbmdBcnJheShhdHRyaWJ1dGVWYWx1ZXMpKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGFjYy5tYXBbbm9ybWFsaXplZFZhbF0gPz8ge1xuICAgICAgICAgICAgICAgIGZpbHRlckl0ZW1JZDogbm9ybWFsaXplZFZhbCxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUodmFsKSwgLy8gS2VlcCBvcmlnaW5hbCBjYXNlIGZvciBkaXNwbGF5XG4gICAgICAgICAgICAgICAgcHJvZHVjdENvdW50OiAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhY2MubWFwW25vcm1hbGl6ZWRWYWxdID0geyAuLi5jdXJyZW50LCBwcm9kdWN0Q291bnQ6IGN1cnJlbnQucHJvZHVjdENvdW50ICsgMSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZpbHRlckNvbmZpZyxcbiAgICAgICAgICBtYXA6IHt9IGFzIFJlY29yZDxzdHJpbmcsIENoYXRTZWFyY2hGaWx0ZXJJdGVtPixcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkRmlsdGVyczogQ2hhdFNlYXJjaEZpbHRlcltdID0gZmlsdGVycy5tYXAoKHsgZmlsdGVyQ29uZmlnLCBtYXAgfSkgPT4gKHtcbiAgICAgIGZpbHRlcklkOiBmaWx0ZXJDb25maWcuZmlsdGVySWQsXG4gICAgICBkaXNwbGF5TmFtZTogZmlsdGVyQ29uZmlnLmRpc3BsYXlOYW1lLFxuICAgICAgaXRlbXM6IE9iamVjdC52YWx1ZXMobWFwKVxuICAgICAgICAubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAgICAgZmlsdGVySXRlbUlkOiBmaWx0ZXIuZmlsdGVySXRlbUlkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBmaWx0ZXIuZGlzcGxheU5hbWUsXG4gICAgICAgICAgcHJvZHVjdENvdW50OiBmaWx0ZXIucHJvZHVjdENvdW50LFxuICAgICAgICAgIGlzU2VsZWN0ZWQ6XG4gICAgICAgICAgICBzZWxlY3RlZEZpbHRlck9wdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLmlkID09PSBgJHtmaWx0ZXJDb25maWcuZmlsdGVySWR9OiR7ZmlsdGVyLmZpbHRlckl0ZW1JZH1gLFxuICAgICAgICAgICAgKSA/PyBmYWxzZSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5zb3J0KHNvcnRGaWx0ZXIoZmlsdGVyQ29uZmlnKSksXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIFsuLi50cmFuc2Zvcm1lZEZpbHRlcnNdO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlclByb2R1Y3RzKFxuICAgIHByb2R1Y3RzOiBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ11bXSxcbiAgICBmaWx0ZXJDb25maWdzOiBGaWx0ZXJBdHRyaWJ1dGVbXSxcbiAgICBzZWxlY3RlZEZpbHRlck9wdGlvbnM6IFNlbGVjdGVkRmlsdGVyT3B0aW9uW10sXG4gICAgYWRkaXRpdmVEeW5hbWljRmlsdGVycyA9IGZhbHNlLCAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGJlaGF2aW9yIHdoZXJlIHN0YWNraW5nIGZpbHRlcnMgaGFzIE9SIGxvZ2ljLlxuICApIHtcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlcnMgPSBmaWx0ZXJDb25maWdzXG4gICAgICAubWFwKChmaWx0ZXJDb25maWcpID0+ICh7XG4gICAgICAgIGZpbHRlckNvbmZpZyxcbiAgICAgICAgaGFzU2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZEZpbHRlck9wdGlvbnMuc29tZShcbiAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uZmlsdGVySWQgPT09IGZpbHRlckNvbmZpZy5maWx0ZXJJZCxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcigoeyBoYXNTZWxlY3RlZE9wdGlvbnMgfSkgPT4gaGFzU2VsZWN0ZWRPcHRpb25zKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLmxlbmd0aCA9PT0gMFxuICAgICAgPyBwcm9kdWN0c1xuICAgICAgOiBwcm9kdWN0cy5maWx0ZXIoKHByb2R1Y3QpID0+XG4gICAgICAgICAgc2VsZWN0ZWRGaWx0ZXJzLnJlZHVjZSgoYWNjLCBzZWxlY3RlZEZpbHRlcikgPT4ge1xuICAgICAgICAgICAgLy8gRmluZGluZyBvbmUgZmFsc2UgcmVtb3ZlcyB0aGUgcHJvZHVjdFxuICAgICAgICAgICAgaWYgKCFhY2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByaWNlIGlzIHNwZWNpYWxcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5maWx0ZXJDb25maWcudHlwZSA9PT0gJ3ByaWNlJykge1xuICAgICAgICAgICAgICBjb25zdCBwcmljZUJ1Y2tldCA9IGdldFByaWNlQnVja2V0KFxuICAgICAgICAgICAgICAgIHByb2R1Y3Quc2FsZVByaWNlID8/IHByb2R1Y3Qub3JpZ2luYWxQcmljZSA/PyAwLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsdGVyLmZpbHRlckNvbmZpZy5idWNrZXRTaXplLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzUHJpY2VGaWx0ZXIgPSBzZWxlY3RlZEZpbHRlck9wdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09IGBwcmljZToke3ByaWNlQnVja2V0fWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICghbWF0Y2hlc1ByaWNlRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5maWx0ZXJDb25maWcudHlwZSA9PT0gJ2R5bmFtaWMnKSB7XG4gICAgICAgICAgICAgIC8vIGR5bmFtaWMgaXMgbWlzbGVhZGluZyBoZXJlLiBJdHMgbm90IGp1c3QgZHluYW1pYyBmaWx0ZXJzLCBidXQgc3RhdGljIGZpbHRlcnMgYmVjYXVzZSB0aGUgY29uZmlnIGNvdW50cyBzdGF0aWMgZmlsdGVycyBhcyB0eXBlOiBkeW5hbWljLlxuICAgICAgICAgICAgICBjb25zdCB7IGZpbHRlcklkLCBhdHRyaWJ1dGUgfSA9IHNlbGVjdGVkRmlsdGVyLmZpbHRlckNvbmZpZztcbiAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlVmFsdWVzID0gcHJvZHVjdC5maWx0ZXJzPy5bYXR0cmlidXRlXTtcblxuICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nQXJyYXkoYXR0cmlidXRlVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGlzRHluYW1pY0ZpbHRlciA9IHNlbGVjdGVkRmlsdGVyLmZpbHRlckNvbmZpZy5hdHRyaWJ1dGUgPT09ICdkeW5hbWljJzsgLy8gVHJ1ZSBkeW5hbWljIGZpbHRlcnMgKHRoZSBvbmVzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHNlYXJjaCBpbnB1dClcbiAgICAgICAgICAgICAgY29uc3QgaXNTdWJ0cmFjdGl2ZUxvZ2ljID0gaXNEeW5hbWljRmlsdGVyICYmICFhZGRpdGl2ZUR5bmFtaWNGaWx0ZXJzO1xuXG4gICAgICAgICAgICAgIGlmIChpc1N1YnRyYWN0aXZlTG9naWMpIHtcbiAgICAgICAgICAgICAgICAvLyBBTkQgbG9naWMgZm9yIHN1YnRyYWN0aXZlIGR5bmFtaWMgZmlsdGVycyBhbmQgYmV0d2VlbiBzdGF0aWMgZmlsdGVyIGNhdGVnb3JpZXNcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnNGb3JUaGlzRmlsdGVyID0gc2VsZWN0ZWRGaWx0ZXJPcHRpb25zXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5maWx0ZXJJZCA9PT0gZmlsdGVySWQpXG4gICAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi5maWx0ZXJJdGVtSWQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoYXNBbGxTZWxlY3RlZFZhbHVlcyA9IHNlbGVjdGVkT3B0aW9uc0ZvclRoaXNGaWx0ZXIuZXZlcnkoKHNlbGVjdGVkVmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMuc29tZSgodmFsKSA9PiB2YWwudG9Mb3dlckNhc2UoKSA9PT0gc2VsZWN0ZWRWYWx1ZSksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghaGFzQWxsU2VsZWN0ZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT1IgbG9naWMgZm9yIHN0YXRpYyBmaWx0ZXJzIGluIHRoZSBzaWRlYmFyIHdpdGhpbiBhIGNhdGVnb3J5LlxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGVWYWx1ZXMuc29tZSgodmFsKSA9PlxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gYCR7ZmlsdGVySWR9OiR7dmFsLnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sIHRydWUpLFxuICAgICAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5pbXBvcnQgeyBQcm9kdWN0U29ydGluZyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUHJvZHVjdFNvcnRlciB7XG4gIHN0YXRpYyBzb3J0KHByb2R1Y3RzOiBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ11bXSwgc29ydGluZzogUHJvZHVjdFNvcnRpbmcpIHtcbiAgICBzd2l0Y2ggKHNvcnRpbmcpIHtcbiAgICAgIGNhc2UgUHJvZHVjdFNvcnRpbmcuUFJJQ0VfQVNDOlxuICAgICAgICByZXR1cm4gWy4uLnByb2R1Y3RzXS5zb3J0KFxuICAgICAgICAgIChwMSwgcDIpID0+XG4gICAgICAgICAgICAocDEuc2FsZVByaWNlID8/IHAxLm9yaWdpbmFsUHJpY2UgPz8gMCkgLSAocDIuc2FsZVByaWNlID8/IHAyLm9yaWdpbmFsUHJpY2UgPz8gMCksXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgUHJvZHVjdFNvcnRpbmcuUFJJQ0VfREVTQzpcbiAgICAgICAgcmV0dXJuIFsuLi5wcm9kdWN0c10uc29ydChcbiAgICAgICAgICAocDEsIHAyKSA9PlxuICAgICAgICAgICAgKHAyLnNhbGVQcmljZSA/PyBwMi5vcmlnaW5hbFByaWNlID8/IDApIC0gKHAxLnNhbGVQcmljZSA/PyBwMS5vcmlnaW5hbFByaWNlID8/IDApLFxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcHJvZHVjdHM7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBVc2VyRXZlbnRDYXRlZ29yeSB9IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnRcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgYXRvbSB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHtcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVJvbGUsXG4gIE1lc3NhZ2VUeXBlLFxuICBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzLFxufSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHtcbiAgbWVzc2FnZXNBdG9tLFxuICByZXBseUV2ZW50Q2F0ZWdvcnlBdG9tLFxuICB1c2VySGFzUmVwbGllZEF0b20sXG4gIHVzZXJRdWVyeUF0b20sXG59IGZyb20gXCJzcmMvYXRvbXMvY2hhdFwiO1xuaW1wb3J0IHsgcXVldWVVc2VyRXZlbnRBdG9tIH0gZnJvbSBcIi4uL2NoYXQvbWVzc2FnZVF1ZXVlXCI7XG5pbXBvcnQgeyBuZXdPcmdDb25maWdBdG9tIH0gZnJvbSBcIi4uL29yZ1wiO1xuaW1wb3J0IHsgUHJvZHVjdEZpbHRlcnMgfSBmcm9tIFwiLi9wcm9kdWN0RmlsdGVyc1wiO1xuaW1wb3J0IHsgUHJvZHVjdFNvcnRlciB9IGZyb20gXCIuL3Byb2R1Y3RTb3J0ZXJcIjtcbmltcG9ydCB7IENoYXRTZWFyY2hTdGF0ZVR5cGUsIFByb2R1Y3RTb3J0aW5nIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gTk9URTpcbi8vIFRoaXMgaXMgYSBsZWdhY3kgdmVyc2lvbiBvZiBzZWFyY2ggdGhhdCBuZWVkcyB0byBiZSBkZWNvdXBsZWQgYW5kIHJlbW92ZWQuXG4vLyB0aGUgbmV3IHNlYXJjaC50cyBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGlzIGxpa2VseSB3aGF0IHlvdSdyZSBsb29raW5nIGZvci5cblxuZXhwb3J0IGNvbnN0IGNoYXRTZWFyY2hTdGF0ZUF0b20gPSBhdG9tPENoYXRTZWFyY2hTdGF0ZVR5cGU+KFwiZW50cnlwb2ludFwiKTtcbmV4cG9ydCBjb25zdCBjaGF0U2VhcmNoSGFzUHJvZHVjdHNBdG9tID0gYXRvbTxib29sZWFuPihmYWxzZSk7XG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaFByb2R1Y3RTb3J0aW5nQXRvbSA9IGF0b208UHJvZHVjdFNvcnRpbmc+KFxuICBQcm9kdWN0U29ydGluZy5GRUFUVVJFRFxuKTtcblxuY29uc3QgZmlsdGVyUHJvZHVjdExpc3QgPSAobWVzc2FnZTogTWVzc2FnZSkgPT5cbiAgbWVzc2FnZS50eXBlID09PSBNZXNzYWdlVHlwZS5Qcm9kdWN0ICYmIG1lc3NhZ2UubWV0YWRhdGEuaXNGb3JHcmlkID09PSB0cnVlO1xuY29uc3QgZmlsdGVyRmlsdGVyTGlzdCA9IChtZXNzYWdlOiBNZXNzYWdlKSA9PlxuICBtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLlByb2R1Y3RTZWFyY2hGaWx0ZXI7XG5cbmV4cG9ydCB0eXBlIENoYXRTZWFyY2hUdXJuID0ge1xuICBpZDogc3RyaW5nO1xuICBnZW5lcmF0ZWRRdWVyeT86IHN0cmluZztcbiAgcHJvZHVjdENvdW50OiBudW1iZXI7XG4gIHByb2R1Y3RMaXN0OiBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzW1wiYXR0cmlidXRlc1wiXVtdO1xuICBmaWx0ZXJMaXN0OiBzdHJpbmdbXTtcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGF0U2VhcmNoSXNMb2FkaW5nQXRvbSA9IGF0b20oZmFsc2UpO1xuXG5jb25zdCBidWlsZENoYXRTZWFyY2hUdXJuID0gKFxuICBtZXNzYWdlczogTWVzc2FnZVtdXG4pOiBbc3RyaW5nLCBDaGF0U2VhcmNoVHVybl0gfCBudWxsID0+IHtcbiAgY29uc3QgcXVlcnlNZXNzYWdlID0gbWVzc2FnZXMuZmluZChcbiAgICAobWVzc2FnZSkgPT4gbWVzc2FnZS50eXBlID09PSBNZXNzYWdlVHlwZS5Qcm9kdWN0U2VhcmNoXG4gICk7XG4gIGlmICghcXVlcnlNZXNzYWdlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBnZW5lcmF0ZWRRdWVyeSwgcHJvZHVjdENvdW50IH0gPSBxdWVyeU1lc3NhZ2UubWV0YWRhdGEgPz8ge307XG4gIGNvbnN0IHByb2R1Y3RMaXN0ID0gbWVzc2FnZXNcbiAgICAuZmlsdGVyKGZpbHRlclByb2R1Y3RMaXN0KVxuICAgIC5tYXAoKG1lc3NhZ2UpID0+IChtZXNzYWdlIGFzIGFueSkubWV0YWRhdGEpO1xuICBjb25zdCBmaWx0ZXJMaXN0ID0gbWVzc2FnZXNcbiAgICAuZmlsdGVyKGZpbHRlckZpbHRlckxpc3QpXG4gICAgLm1hcCgobWVzc2FnZSkgPT4gbWVzc2FnZS5tZXRhZGF0YS5maWx0ZXJOYW1lKTtcbiAgcmV0dXJuIFtcbiAgICBxdWVyeU1lc3NhZ2UuaWQsXG4gICAge1xuICAgICAgaWQ6IHF1ZXJ5TWVzc2FnZS5pZCxcbiAgICAgIGdlbmVyYXRlZFF1ZXJ5LFxuICAgICAgcHJvZHVjdENvdW50OiBwcm9kdWN0Q291bnQgfHwgcHJvZHVjdExpc3QubGVuZ3RoLFxuICAgICAgcHJvZHVjdExpc3QsXG4gICAgICBmaWx0ZXJMaXN0LFxuICAgICAgbWVzc2FnZXMsXG4gICAgfSxcbiAgXTtcbn07XG5cbmNvbnN0IGNoYXRTZWFyY2hGaWx0ZXJDb25maWdBdG9tID0gYXRvbSgoZ2V0KSA9PiB7XG4gIGNvbnN0IG5ld09yZ0NvbmZpZyA9IGdldChuZXdPcmdDb25maWdBdG9tKTtcbiAgcmV0dXJuIChcbiAgICBuZXdPcmdDb25maWc/LmZyb250ZW5kQ29uZmlnPy51aUNvbmZpZ3M/LnNlYXJjaENvbmZpZz8uc2VhcmNoRmlsdGVyQ29uZmlnIHx8XG4gICAgW11cbiAgKTtcbn0pO1xuXG5jb25zdCBzZWFyY2hNYXBBdG9tID0gYXRvbSgoZ2V0KSA9PiB7XG4gIGNvbnN0IG1lc3NhZ2VzID0gZ2V0KG1lc3NhZ2VzQXRvbSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgbWVzc2FnZXMubWFwKGJ1aWxkQ2hhdFNlYXJjaFR1cm4pLmZpbHRlcigodikgPT4gdiAhPT0gbnVsbClcbiAgKTtcbn0pO1xuXG5jb25zdCBpbnRlcm5hbENoYXRTZWFyY2hQYXJhbXNBdG9tID0gYXRvbTx7XG4gIGlkOiBzdHJpbmcgfCBudWxsO1xuICBxdWVyeTogc3RyaW5nIHwgbnVsbDtcbn0+KHtcbiAgaWQ6IG51bGwsXG4gIHF1ZXJ5OiBudWxsLFxufSk7XG5cbi8vIFNlbGVjdGVkIGZpbHRlciBvcHRpb25zIHdpdGggY29tcG91bmQgb2JqZWN0cyBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5IGFuZCBkaXNwbGF5XG5leHBvcnQgdHlwZSBTZWxlY3RlZENoYXRTZWFyY2hGaWx0ZXJPcHRpb24gPSB7XG4gIGlkOiBzdHJpbmc7IC8vIFwiZmlsdGVySWQ6ZmlsdGVySXRlbUlkXCIgLSBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgY29tcGFyaXNvbnNcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgZmlsdGVySWQ6IHN0cmluZzsgLy8gRmlsdGVyIGNhdGVnb3J5XG4gIGZpbHRlckl0ZW1JZDogc3RyaW5nOyAvLyBGaWx0ZXIgdmFsdWVcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RlZEZpbHRlck9wdGlvbnNBdG9tID0gYXRvbTxTZWxlY3RlZENoYXRTZWFyY2hGaWx0ZXJPcHRpb25bXT4oXG4gIFtdXG4pO1xuXG5leHBvcnQgY29uc3QgYWRkaXRpdmVEeW5hbWljRmlsdGVyc0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgY29uc3QgbmV3T3JnQ29uZmlnID0gZ2V0KG5ld09yZ0NvbmZpZ0F0b20pO1xuICByZXR1cm4gKFxuICAgIG5ld09yZ0NvbmZpZz8uZnJvbnRlbmRDb25maWc/LnVpQ29uZmlncz8uc2VhcmNoQ29uZmlnXG4gICAgICA/LmFkZGl0aXZlRHluYW1pY0ZpbHRlcnMgPz8gZmFsc2VcbiAgKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2hhdFNlYXJjaEZpbHRlck9wdGlvbiA9IChcbiAgZmlsdGVySWQ6IHN0cmluZyxcbiAgZmlsdGVySXRlbUlkOiBzdHJpbmcsXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmdcbik6IFNlbGVjdGVkQ2hhdFNlYXJjaEZpbHRlck9wdGlvbiA9PiAoe1xuICBpZDogYCR7ZmlsdGVySWR9OiR7ZmlsdGVySXRlbUlkfWAsXG4gIGRpc3BsYXlOYW1lLFxuICBmaWx0ZXJJZCxcbiAgZmlsdGVySXRlbUlkLFxufSk7XG5cbmNvbnN0IGhhbmRsZVNlYXJjaEF0b20gPSBhdG9tKG51bGwsIChnZXQsIHNldCwgbWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuICBpZiAobWVzc2FnZS50eXBlICE9PSBNZXNzYWdlVHlwZS5TZWFyY2gpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBxdWVyeVNlYXJjaCA9IG1lc3NhZ2UubWV0YWRhdGEuc2VhcmNoVGVybTtcblxuICBzZXQocmVwbHlFdmVudENhdGVnb3J5QXRvbSwgVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoKTtcbiAgc2V0KHVzZXJRdWVyeUF0b20sIHF1ZXJ5U2VhcmNoKTtcbiAgc2V0KG1lc3NhZ2VzQXRvbSwgWy4uLmdldChtZXNzYWdlc0F0b20pLCBbbWVzc2FnZV1dKTtcbiAgc2V0KHVzZXJIYXNSZXBsaWVkQXRvbSwgdHJ1ZSk7XG5cbiAgc2V0KHF1ZXVlVXNlckV2ZW50QXRvbSwge1xuICAgIGV2ZW50SWQ6IG1lc3NhZ2UuaWQsXG4gICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaCxcbiAgICBjcmVhdGVkQXQ6IG1lc3NhZ2UuY3JlYXRlZEF0LFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIHNlYXJjaFRlcm06IG1lc3NhZ2UubWV0YWRhdGEuc2VhcmNoVGVybSxcbiAgICAgIHNlbGVjdGVkRmlsdGVyczogbWVzc2FnZS5tZXRhZGF0YS5zZWxlY3RlZEZpbHRlcnMsXG4gICAgfSxcbiAgfSk7XG59KTtcblxuLy8gVGhpcyBpbnRlcm5hbCBhdG9tIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHNlYXJjaCBwYXJhbXNcbmV4cG9ydCBjb25zdCBjaGF0U2VhcmNoUGFyYW1zQXRvbSA9IGF0b20oXG4gIChnZXQpID0+IGdldChpbnRlcm5hbENoYXRTZWFyY2hQYXJhbXNBdG9tKSxcbiAgKF8sIHNldCwgdmFsdWU6IHsgaWQ6IHN0cmluZyB8IG51bGw7IHF1ZXJ5OiBzdHJpbmcgfCBudWxsIH0pID0+IHtcbiAgICBzZXQoaW50ZXJuYWxDaGF0U2VhcmNoUGFyYW1zQXRvbSwgdmFsdWUpO1xuICB9XG4pO1xuXG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaFF1ZXJ5QXRvbSA9IGF0b20oXG4gIChnZXQpID0+IGdldChjaGF0U2VhcmNoUGFyYW1zQXRvbSk/LnF1ZXJ5ID8/IG51bGwsXG4gIChnZXQsIHNldCwgdmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBnZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20pO1xuICAgIHNldChjaGF0U2VhcmNoUGFyYW1zQXRvbSwgeyBpZDogc2VhcmNoUGFyYW1zLmlkLCBxdWVyeTogdmFsdWUgfSk7XG4gIH1cbik7XG5cbmV4cG9ydCBjb25zdCBjaGF0U2VhcmNoSWRBdG9tID0gYXRvbShcbiAgKGdldCkgPT4gZ2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tKT8uaWQgPz8gbnVsbCxcbiAgKGdldCwgc2V0LCB2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IGdldChjaGF0U2VhcmNoUGFyYW1zQXRvbSk7XG4gICAgc2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tLCB7IGlkOiB2YWx1ZSwgcXVlcnk6IHNlYXJjaFBhcmFtcy5xdWVyeSB9KTtcbiAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IENoYXRTZWFyY2hUdXJuQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICBjb25zdCBzZWFyY2hGaWx0ZXJDb25maWcgPSBnZXQoY2hhdFNlYXJjaEZpbHRlckNvbmZpZ0F0b20pO1xuICBjb25zdCBzZWFyY2hNYXAgPSBnZXQoc2VhcmNoTWFwQXRvbSk7XG4gIGNvbnN0IGNoYXRTZWFyY2hJZCA9IGdldChjaGF0U2VhcmNoSWRBdG9tKTtcbiAgaWYgKCFjaGF0U2VhcmNoSWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBDaGF0U2VhcmNoVHVybiA9IHNlYXJjaE1hcFtjaGF0U2VhcmNoSWRdO1xuICBpZiAoIUNoYXRTZWFyY2hUdXJuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcHJvZHVjdFNvcnRpbmcgPSBnZXQoY2hhdFNlYXJjaFByb2R1Y3RTb3J0aW5nQXRvbSk7XG4gIGNvbnN0IHNlbGVjdGVkRmlsdGVyT3B0aW9ucyA9IGdldChzZWxlY3RlZEZpbHRlck9wdGlvbnNBdG9tKTtcbiAgY29uc3QgYWRkaXRpdmVEeW5hbWljRmlsdGVycyA9IGdldChhZGRpdGl2ZUR5bmFtaWNGaWx0ZXJzQXRvbSk7XG4gIGNvbnN0IGZpbHRlcmVkUHJvZHVjdHMgPSBQcm9kdWN0RmlsdGVycy5maWx0ZXJQcm9kdWN0cyhcbiAgICBDaGF0U2VhcmNoVHVybi5wcm9kdWN0TGlzdCxcbiAgICBzZWFyY2hGaWx0ZXJDb25maWcsXG4gICAgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLFxuICAgIGFkZGl0aXZlRHluYW1pY0ZpbHRlcnNcbiAgKTtcblxuICBjb25zdCBmaWx0ZXJlZEFuZFNvcnRlZFByb2R1Y3RzID0gUHJvZHVjdFNvcnRlci5zb3J0KFxuICAgIGZpbHRlcmVkUHJvZHVjdHMsXG4gICAgcHJvZHVjdFNvcnRpbmdcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNlYXJjaE1hcFtjaGF0U2VhcmNoSWRdLFxuICAgIHByb2R1Y3RMaXN0OiBmaWx0ZXJlZEFuZFNvcnRlZFByb2R1Y3RzLFxuICAgIHByb2R1Y3RDb3VudDogZmlsdGVyZWRBbmRTb3J0ZWRQcm9kdWN0cy5sZW5ndGgsXG4gIH07XG59KTtcblxuLy8gVE9ETzogV29yayBvbiBkZXByZWNhdGluZyB0aGlzIGF0b20gaW4gZmF2b3Igb2YgdXNpbmcgQ2hhdFNlYXJjaFR1cm5BdG9tIGRpcmVjdGx5XG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaFByb2R1Y3RzID0gYXRvbSgoZ2V0KSA9PiB7XG4gIGNvbnN0IENoYXRTZWFyY2hUdXJuID0gZ2V0KENoYXRTZWFyY2hUdXJuQXRvbSk7XG4gIHJldHVybiBDaGF0U2VhcmNoVHVybj8ucHJvZHVjdExpc3QgPz8gW107XG59KTtcblxuZXhwb3J0IGNvbnN0IGNoYXRTZWFyY2hGaWx0ZXJzQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICBjb25zdCBzZWFyY2hGaWx0ZXJDb25maWcgPSBnZXQoY2hhdFNlYXJjaEZpbHRlckNvbmZpZ0F0b20pO1xuICBjb25zdCBzZWFyY2hNYXAgPSBnZXQoc2VhcmNoTWFwQXRvbSk7XG4gIGNvbnN0IGNoYXRTZWFyY2hJZCA9IGdldChjaGF0U2VhcmNoSWRBdG9tKTtcblxuICBpZiAoY2hhdFNlYXJjaElkICYmIHNlYXJjaE1hcFtjaGF0U2VhcmNoSWRdKSB7XG4gICAgY29uc3QgcHJvZHVjdHMgPSBzZWFyY2hNYXBbY2hhdFNlYXJjaElkXS5wcm9kdWN0TGlzdDtcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlck9wdGlvbnMgPSBnZXQoc2VsZWN0ZWRGaWx0ZXJPcHRpb25zQXRvbSk7XG4gICAgcmV0dXJuIFByb2R1Y3RGaWx0ZXJzLmdldEZpbHRlcnNGb3JQcm9kdWN0cyhcbiAgICAgIHByb2R1Y3RzLFxuICAgICAgc2VhcmNoRmlsdGVyQ29uZmlnLFxuICAgICAgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zXG4gICAgKTtcbiAgfVxuICByZXR1cm4gW107XG59KTtcblxuLy8gRm9yIHNlYXJjaCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBxdWVyeSBwYXJhbXM6XG4vLyBlczogdHJ1ZSAtIHRoaXMgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIGluIGEgc2VhcmNoIHN0YXRlXG4vLyBlc3E6IHF1ZXJ5IC0gdGhpcyBpcyB0aGUgY3VycmVudCBzZWFyY2ggcXVlcnlcbi8vIGVzaTogc2VhcmNoIGlkIC0gdGhpcyBpcyB0aGUgdW5pcXVlIGlkIGZvciB0aGUgc2VhcmNoIHJlc3VsdHMgdGhhdCB3ZSBhcmUgZGlzcGxheWluZy4gSXQgaXMgcHVsbGVkIGZyb20gdGhlIG1lc3NhZ2UgaWQgZnJvbSB0aGUgdHVybiB0aGF0IGluY2x1ZGVzIHRoZSBzZWFyY2ggcmVzdWx0c1xuXG5leHBvcnQgY29uc3Qgc2V0U2VhcmNoUGFyYW1zID0gKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNcIiwgXCJ0cnVlXCIpO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzcVwiLCBxdWVyeSk7XG4gIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7fSwgXCJcIiwgdXJsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZWFyY2hQYXJhbXNBdG9tID0gYXRvbSgoKSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gIHJldHVybiB7XG4gICAgZXM6IHBhcmFtcy5nZXQoXCJlc1wiKSxcbiAgICBlc3E6IHBhcmFtcy5nZXQoXCJlc3FcIiksXG4gIH07XG59KTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYXRlQ2hhdFNlYXJjaEF0b20gPSBhdG9tKG51bGwsIChfLCBzZXQsIHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgc2V0KGNoYXRTZWFyY2hJc0xvYWRpbmdBdG9tLCB0cnVlKTtcbiAgLy8gVXBkYXRlIFVSTCBhbmQgbWFudWFsbHkgdHJpZ2dlciBzdGF0ZSBjaGFuZ2UgKHNpbmNlIHB1c2hTdGF0ZSBkb2Vzbid0IHRyaWdnZXIgcG9wc3RhdGUpXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzXCIsIFwidHJ1ZVwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJlc3FcIiwgcXVlcnkpO1xuICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIFwiXCIsIHVybCk7XG5cbiAgLy8gTWFudWFsbHkgdHJpZ2dlciBwYWdlIHZhcmlhbnQgcmUtZXZhbHVhdGlvbiBieSBkaXNwYXRjaGluZyBhIHBvcHN0YXRlIGV2ZW50XG4gIC8vIFRoaXMgZW5zdXJlcyB0aGUgcGFnZSB2YXJpYW50IHN5c3RlbSBkZXRlY3RzIHRoZSBVUkwgY2hhbmdlIGFuZCBtb3VudHMgc2VhcmNoIHJlc3VsdHNcbiAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IFBvcFN0YXRlRXZlbnQoXCJwb3BzdGF0ZVwiLCB7IHN0YXRlOiB7fSB9KSk7XG5cbiAgc2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tLCB7IGlkOiBudWxsLCBxdWVyeSB9KTtcbiAgc2V0KGhhbmRsZVNlYXJjaEF0b20sIHtcbiAgICBpZDogdXVpZCgpLFxuICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoLFxuICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBzZWFyY2hUZXJtOiBxdWVyeSxcbiAgICAgIC8vIEVuYWJsaW5nIHRoaXMgd2lsbCBlbmFibGUgdGhlIG5ldyBiYWNrZW5kIHNlYXJjaFxuICAgICAgc2VsZWN0ZWRGaWx0ZXJzOiBbXSxcbiAgICB9LFxuICB9KTtcbn0pO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlU2VhcmNoUmVzdWx0c0F0b20gPSBhdG9tKFxuICBudWxsLFxuICAoZ2V0LCBzZXQsIG1lc3NhZ2U6IE1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoIW1lc3NhZ2UgfHwgbWVzc2FnZS50eXBlICE9PSBNZXNzYWdlVHlwZS5Qcm9kdWN0U2VhcmNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBwcm9kdWN0Q291bnQsIGdlbmVyYXRlZFF1ZXJ5IH0gPSBtZXNzYWdlLm1ldGFkYXRhO1xuICAgIGlmIChwcm9kdWN0Q291bnQgIT09IDApIHtcbiAgICAgIC8vIENsZWFyIHRoZSBmaWx0ZXIgb3B0aW9ucyB3aGVuIHdlIGdldCBuZXcgcHJvZHVjdHNcbiAgICAgIHNldChzZWxlY3RlZEZpbHRlck9wdGlvbnNBdG9tLCBbXSk7XG4gICAgICAvLyBUT0RPOiBTaG91bGQgd2Ugc3RpbGwgZG8gYW55IG9mIHRoZXNlIHRoaW5ncz9cbiAgICAgIHNldChjaGF0U2VhcmNoU3RhdGVBdG9tLCBcInByb2R1Y3QtcGFnZVwiKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTZWFyY2hQYXJhbXMgPSBnZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20pO1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzXCIsIFwidHJ1ZVwiKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNxXCIsIGdlbmVyYXRlZFF1ZXJ5KTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNpXCIsIG1lc3NhZ2UuaWQpO1xuICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHt9LCBcIlwiLCB1cmwpO1xuICAgICAgaWYgKGN1cnJlbnRTZWFyY2hQYXJhbXMuaWQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhlIGlkIGlzIG51bGwsIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgc3RhdGVcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIFwiXCIsIHVybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgcXVlcnkgaXMgZGlmZmVyZW50LCB3ZSBuZWVkIHRvIHB1c2ggYSBuZXcgc3RhdGVcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIFwiXCIsIHVybCk7XG4gICAgICB9XG4gICAgICBzZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20sIHsgaWQ6IG1lc3NhZ2UuaWQsIHF1ZXJ5OiBnZW5lcmF0ZWRRdWVyeSB9KTtcbiAgICB9XG4gIH1cbik7XG5cbmV4cG9ydCBjb25zdCBzZXRDaGF0U2VhcmNoUGFyYW1zQXRvbSA9IGF0b20obnVsbCwgKF8sIHNldCwgcXVlcnk6IHN0cmluZykgPT4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJlc1wiLCBcInRydWVcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNxXCIsIHF1ZXJ5KTtcbiAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHt9LCBcIlwiLCB1cmwpO1xuICBzZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20sIHsgaWQ6IG51bGwsIHF1ZXJ5IH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxNQUFhLDJCQUEyQixnQkFBd0I7Q0FDOUQsTUFBTSxRQUFRO0VBQUM7RUFBUTtFQUFPO0VBQU07RUFBSztFQUFLO0VBQUs7RUFBTTtFQUFPO0VBQVE7RUFBUTtBQWVoRixRQWJ1QixZQUNwQixhQUFhLENBQ2IsTUFBTSxJQUFJLENBQ1YsS0FBSyxTQUFTO0FBQ2IsTUFBSSxNQUFNLFNBQVMsS0FBSyxDQUN0QixRQUFPLEtBQUssYUFBYTtBQUUzQixTQUFPLEtBQUssT0FBTyxFQUFFLENBQUMsYUFBYSxHQUFHLEtBQUssTUFBTSxFQUFFO0dBQ25ELENBRWtDLEtBQUssSUFBSSxDQUd6QixRQUFRLFdBQVcsU0FBUzs7Ozs7QUNWcEQsTUFBTSxrQkFBa0IsT0FBZSxlQUF1QjtBQUU1RCxRQURlLEtBQUssTUFBTSxRQUFRLFdBQVcsR0FDN0I7O0FBR2xCLE1BQU0saUJBQWlCLFVBQXNDO0FBQzNELEtBQUksQ0FBQyxNQUFNLFFBQVEsTUFBTSxDQUN2QixRQUFPO0FBRVQsUUFBTyxNQUFNLE9BQU8sU0FBUyxPQUFPLFNBQVMsU0FBUzs7QUFLeEQsTUFBTSxjQUFjLGlCQUFzRDtBQUN4RSxLQUFJLGFBQWEsU0FBUyxRQUN4QixTQUFRLEdBQUcsTUFBTSxPQUFPLEVBQUUsYUFBYSxHQUFHLE9BQU8sRUFBRSxhQUFhO0FBRWxFLEtBQUks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