@envive-ai/react-hooks 0.1.4 → 0.1.6

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 (488) hide show
  1. package/dist/amplitudeContext-CHzas7Cf.d.cts +52 -0
  2. package/dist/amplitudeContext-D-7fmVh1.cjs +356 -0
  3. package/dist/amplitudeContext-hY3caPC6.js +322 -0
  4. package/dist/amplitudeContext-tJ4y-SzX.d.ts +52 -0
  5. package/dist/api-DjeZXxl_.js +207 -0
  6. package/dist/api-_JaUnIUj.cjs +292 -0
  7. package/dist/app-CjsQ2_n-.js +132 -0
  8. package/dist/app-CnKRZ9RW.cjs +178 -0
  9. package/dist/application/models/graphql/index.cjs +3 -12
  10. package/dist/application/models/graphql/index.d.cts +1 -1
  11. package/dist/application/models/graphql/index.d.ts +1 -1
  12. package/dist/application/models/graphql/index.js +1 -10
  13. package/dist/application/models/guards/api/index.cjs +1 -2
  14. package/dist/application/models/guards/api/index.d.cts +2 -2
  15. package/dist/application/models/guards/api/index.d.ts +2 -2
  16. package/dist/application/models/guards/api/index.js +1 -2
  17. package/dist/application/models/index.cjs +48 -54
  18. package/dist/application/models/index.d.cts +7 -9
  19. package/dist/application/models/index.d.ts +7 -9
  20. package/dist/application/models/index.js +7 -11
  21. package/dist/application/models/utilityTypes/index.cjs +1 -1
  22. package/dist/application/models/utilityTypes/index.d.cts +1 -1
  23. package/dist/application/models/utilityTypes/index.d.ts +1 -1
  24. package/dist/application/models/utilityTypes/index.js +1 -1
  25. package/dist/application/models/variantInfo/index.cjs +1 -1
  26. package/dist/application/models/variantInfo/index.d.cts +1 -1
  27. package/dist/application/models/variantInfo/index.d.ts +1 -1
  28. package/dist/application/models/variantInfo/index.js +1 -1
  29. package/dist/application/utils/index.cjs +40 -37
  30. package/dist/application/utils/index.d.cts +18 -14
  31. package/dist/application/utils/index.d.ts +17 -13
  32. package/dist/application/utils/index.js +13 -10
  33. package/dist/{atomStore-JwGb7pcy.cjs → atomStore-B4jIaDPd.cjs} +1 -1
  34. package/dist/{atomStore-B1cgmbP0.js → atomStore-D8pjE1vL.js} +1 -1
  35. package/dist/atoms/app/index.cjs +14 -16
  36. package/dist/atoms/app/index.d.cts +20 -19
  37. package/dist/atoms/app/index.d.ts +20 -19
  38. package/dist/atoms/app/index.js +10 -11
  39. package/dist/atoms/atomStore/index.cjs +2 -1
  40. package/dist/atoms/atomStore/index.d.cts +1 -1
  41. package/dist/atoms/atomStore/index.js +2 -1
  42. package/dist/atoms/chat/index.cjs +44 -40
  43. package/dist/atoms/chat/index.d.cts +35 -36
  44. package/dist/atoms/chat/index.d.ts +35 -36
  45. package/dist/atoms/chat/index.js +14 -10
  46. package/dist/atoms/globalSearch/index.cjs +1 -1
  47. package/dist/atoms/globalSearch/index.d.cts +5 -5
  48. package/dist/atoms/globalSearch/index.d.ts +5 -5
  49. package/dist/atoms/globalSearch/index.js +1 -1
  50. package/dist/atoms/org/index.cjs +26 -37
  51. package/dist/atoms/org/index.d.cts +37 -47
  52. package/dist/atoms/org/index.d.ts +37 -47
  53. package/dist/atoms/org/index.js +11 -11
  54. package/dist/atoms/search/index.cjs +47 -41
  55. package/dist/atoms/search/index.d.cts +7 -9
  56. package/dist/atoms/search/index.d.ts +7 -9
  57. package/dist/atoms/search/index.js +16 -10
  58. package/dist/bandolier-DYEz4-8C.js +1229 -0
  59. package/dist/bandolier-o_-xrbOV.cjs +1229 -0
  60. package/dist/carpe-CsG5jCcl.cjs +607 -0
  61. package/dist/carpe-DONk00bZ.js +605 -0
  62. package/dist/cdnUtils-32v8bDX9.cjs +16 -0
  63. package/dist/cdnUtils-E4tLBt2g.js +11 -0
  64. package/dist/{chat-BgONoYU7.cjs → chat-BubCW1as.cjs} +1 -1
  65. package/dist/chat-CO7cRkaq.cjs +506 -0
  66. package/dist/{chat-CLJ4NWcN.js → chat-CV6MXeID.js} +1 -1
  67. package/dist/chat-hcRc4RRd.js +285 -0
  68. package/dist/{components-CV1fhAkj.js → components-B4T3Uzth.js} +1 -1
  69. package/dist/{components-BKZbet67.cjs → components-Cw9WjA6g.cjs} +1 -1
  70. package/dist/config/locators/components/chat/index.cjs +1 -1
  71. package/dist/config/locators/components/chat/index.d.cts +1 -1
  72. package/dist/config/locators/components/chat/index.d.ts +1 -1
  73. package/dist/config/locators/components/chat/index.js +1 -1
  74. package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
  75. package/dist/config/locators/components/index.cjs +1 -1
  76. package/dist/config/locators/components/index.d.cts +1 -1
  77. package/dist/config/locators/components/index.d.ts +1 -1
  78. package/dist/config/locators/components/index.js +1 -1
  79. package/dist/config/locators/index.cjs +4 -4
  80. package/dist/config/locators/index.d.cts +2 -2
  81. package/dist/config/locators/index.d.ts +3 -3
  82. package/dist/config/locators/index.js +4 -4
  83. package/dist/contexts/index.cjs +45 -14
  84. package/dist/contexts/index.d.cts +10 -78
  85. package/dist/contexts/index.d.ts +10 -78
  86. package/dist/contexts/index.js +22 -11
  87. package/dist/contexts-B4ihTBsV.cjs +2980 -0
  88. package/dist/contexts-DGlr7M1o.js +2596 -0
  89. package/dist/coterie-CKB93qfz.cjs +239 -0
  90. package/dist/{coterie-yQ-_JXSw.cjs → coterie-DHcj2fRE.js} +64 -65
  91. package/dist/{custservice-types-C83itZmy.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
  92. package/dist/{custservice-types-DPQ-4TI6.js → custservice-types-mnIunabv.js} +1 -1
  93. package/dist/default-BnB4p0Se.cjs +234 -0
  94. package/dist/default-D6f5Dyt7.js +199 -0
  95. package/dist/default-ZKkE5zT4.cjs +4 -0
  96. package/dist/default-legGZJwI.js +4 -0
  97. package/dist/{divIds-DEL_-qU0.cjs → divIds-2dJlU3z8.cjs} +1 -15
  98. package/dist/{divIds-CWkntTsx.js → divIds-BUrN2vY-.js} +2 -4
  99. package/dist/dreamlandBaby-BiRYYFav.js +346 -0
  100. package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
  101. package/dist/{embedded-C5uJqmuD.js → embedded-BJLWIriJ.js} +1 -1
  102. package/dist/{embedded--2L0F4b5.cjs → embedded-Dl79TJLC.cjs} +1 -1
  103. package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
  104. package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
  105. package/dist/enviveConfig-BccuzS2a.cjs +240 -0
  106. package/dist/enviveConfig-CzhTz8Aa.js +152 -0
  107. package/dist/events/index.cjs +1 -1
  108. package/dist/events/index.d.cts +1 -1
  109. package/dist/events/index.js +1 -1
  110. package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
  111. package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
  112. package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
  113. package/dist/fiveCbd-Dz2NouOF.js +613 -0
  114. package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
  115. package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
  116. package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
  117. package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
  118. package/dist/graphql-BNW60InJ.cjs +128 -0
  119. package/dist/graphql-CjB8wHzm.js +74 -0
  120. package/dist/graphqlConfig-CYt6tWII.js +30 -0
  121. package/dist/graphqlConfig-DicykC-o.cjs +61 -0
  122. package/dist/greenpan-B_EbPkSP.js +397 -0
  123. package/dist/greenpan-kPE4fJgd.cjs +397 -0
  124. package/dist/grooveLife-Ckuir319.js +342 -0
  125. package/dist/grooveLife-DKSEQp1F.cjs +342 -0
  126. package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
  127. package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
  128. package/dist/hooks/index.cjs +40 -16
  129. package/dist/hooks/index.d.cts +122 -95
  130. package/dist/hooks/index.d.ts +122 -95
  131. package/dist/hooks/index.js +22 -11
  132. package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
  133. package/dist/{index-jBATkcc_.d.cts → index-BDPWBU3h.d.cts} +1 -1
  134. package/dist/index-BMPtlgac.d.ts +191 -0
  135. package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
  136. package/dist/{index-C62lPpy4.d.cts → index-Byb45OPg.d.cts} +1 -1
  137. package/dist/{index-DPx8s5YH.d.ts → index-C6KdON7d.d.ts} +1 -1
  138. package/dist/index-C7pGDl1A.d.ts +1609 -0
  139. package/dist/{index-CYtsPztZ.d.cts → index-C9lgsCWp.d.cts} +32 -32
  140. package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
  141. package/dist/{index-C_C0tLeD.d.ts → index-Cc-wBCn6.d.ts} +32 -32
  142. package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
  143. package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
  144. package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
  145. package/dist/{index-CExtydIH.d.ts → index-DOii3C6b.d.ts} +1 -1
  146. package/dist/index-DTu2X-YS.d.cts +1609 -0
  147. package/dist/index-OEifcBsm.d.cts +191 -0
  148. package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
  149. package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
  150. package/dist/interceptors/index.cjs +2 -12
  151. package/dist/interceptors/index.d.cts +8 -13
  152. package/dist/interceptors/index.d.ts +8 -13
  153. package/dist/interceptors/index.js +2 -11
  154. package/dist/jackArcher-B39OEIj6.cjs +727 -0
  155. package/dist/{jackArcher-CXf_IAmC.js → jackArcher-BwkWGybC.js} +24 -25
  156. package/dist/jordanCraig-CxRH_jLi.js +1786 -0
  157. package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
  158. package/dist/kindredBravely-D78VwL20.cjs +490 -0
  159. package/dist/kindredBravely-DQDpAzdl.js +490 -0
  160. package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
  161. package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
  162. package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
  163. package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
  164. package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
  165. package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
  166. package/dist/longevityrx-DdV3v26F.cjs +320 -0
  167. package/dist/longevityrx-DfPDfvAt.js +320 -0
  168. package/dist/lookOptic-DgXFGBPP.cjs +282 -0
  169. package/dist/{lookOptic-BGhU4910.js → lookOptic-FgVW1afF.js} +19 -20
  170. package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
  171. package/dist/{mantraBrand-DrqG9uqO.js → mantraBrand-uV8HCDR8.js} +22 -23
  172. package/dist/medterra-BtDpr1Hw.cjs +583 -0
  173. package/dist/medterra-DgzE7-mj.js +583 -0
  174. package/dist/modells-CJjsxOIR.js +484 -0
  175. package/dist/modells-Ck5KbRFj.cjs +484 -0
  176. package/dist/models-BkXg5eIP.cjs +1534 -0
  177. package/dist/models-UZ6HszfZ.js +1281 -0
  178. package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
  179. package/dist/{nodeSelector-B3bPtEjX.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
  180. package/dist/org-C2RrBVQR.cjs +81 -0
  181. package/dist/org-xMytX--e.js +38 -0
  182. package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
  183. package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
  184. package/dist/pressedFloral-Bteoboms.js +661 -0
  185. package/dist/pressedFloral-CexgV-xy.cjs +661 -0
  186. package/dist/search-BMOAmrmY.js +459 -0
  187. package/dist/search-Df0Ifneg.cjs +672 -0
  188. package/dist/{search-filter-types-BNTLVXqQ.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
  189. package/dist/{search-filter-types-DkmH1TxJ.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
  190. package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
  191. package/dist/skinPerfection-BlvcEcUE.js +334 -0
  192. package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
  193. package/dist/snapSupplements-kcsPAOm9.js +285 -0
  194. package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
  195. package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
  196. package/dist/spanx-B4WFA_rI.js +661 -0
  197. package/dist/spanx-BWoE4F8b.cjs +663 -0
  198. package/dist/spanxStaging-BOrOjhXn.js +845 -0
  199. package/dist/spanxStaging-BfdfIug4.cjs +848 -0
  200. package/dist/{suggestionBarV2-types-CwOXzIKq.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
  201. package/dist/{suggestionBarV2-types-Dc4-zJlV.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
  202. package/dist/supergoop-22dd5_BS.js +323 -0
  203. package/dist/supergoop-B-a4cku2.cjs +323 -0
  204. package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
  205. package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
  206. package/dist/types/index.cjs +2 -2
  207. package/dist/types/index.d.cts +2 -2
  208. package/dist/types/index.d.ts +2 -2
  209. package/dist/types/index.js +2 -2
  210. package/dist/types--pr1GQQx.js +154 -0
  211. package/dist/types-BVSyY3Hk.cjs +196 -0
  212. package/dist/{uniqueVintage-Cui74mlJ.js → uniqueVintage-CJXiNNe7.js} +19 -20
  213. package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
  214. package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
  215. package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
  216. package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
  217. package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
  218. package/dist/utils-C9ZSCx12.js +888 -0
  219. package/dist/utils-D5HO61hG.cjs +1016 -0
  220. package/dist/variantInfo-DbVxA1yE.js +1 -0
  221. package/dist/variantInfo-orXoPBCU.cjs +0 -0
  222. package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
  223. package/dist/venaCbd-CanovPS_.js +365 -0
  224. package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
  225. package/dist/{westonJonBoucher-C95EuCl-.js → westonJonBoucher-BUu1_wP1.js} +19 -20
  226. package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
  227. package/dist/{wineEnthusiast-DeTFY8Gm.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
  228. package/dist/wolfMattress-D9Mjq-HP.js +372 -0
  229. package/dist/wolfMattress-JssghhC-.cjs +372 -0
  230. package/dist/wolfTactical-C6exYhL7.cjs +349 -0
  231. package/dist/wolfTactical-CnV3KQdI.js +349 -0
  232. package/package.json +101 -19
  233. package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
  234. package/src/application/models/colorsConfig.ts +18 -18
  235. package/src/application/models/frontendConfig.ts +3 -3
  236. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
  237. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
  238. package/src/application/models/index.ts +0 -2
  239. package/src/application/models/localStorageEventListener.ts +2 -2
  240. package/src/application/models/supportedOrgs.ts +1 -1
  241. package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
  242. package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
  243. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
  244. package/src/application/utils/analyticsUtils.ts +53 -22
  245. package/src/application/utils/cdnUtils.ts +11 -0
  246. package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
  247. package/src/atoms/app/index.ts +7 -17
  248. package/src/atoms/app/variant.ts +13 -4
  249. package/src/atoms/chat/chatState.ts +28 -18
  250. package/src/atoms/chat/messageQueue.ts +36 -5
  251. package/src/atoms/chat/replies.ts +45 -37
  252. package/src/atoms/envive/enviveConfig.ts +10 -6
  253. package/src/atoms/org/graphqlConfig.ts +21 -4
  254. package/src/atoms/org/index.ts +7 -7
  255. package/src/atoms/org/newOrgConfigAtom.ts +8 -0
  256. package/src/atoms/org/orgPageConfig.ts +6 -5
  257. package/src/atoms/search/chatSearch.ts +11 -5
  258. package/src/atoms/search/searchAPI.ts +68 -48
  259. package/src/atoms/search/searchServiceAdapter.ts +25 -0
  260. package/src/contexts/amplitudeContext.tsx +466 -0
  261. package/src/contexts/cdnContext.tsx +48 -0
  262. package/src/contexts/chatContext.tsx +15 -12
  263. package/src/contexts/enviveConfigContext.tsx +22 -17
  264. package/src/contexts/enviveCssContext.tsx +34 -5
  265. package/src/contexts/featureFlagContext.tsx +193 -0
  266. package/src/contexts/featureFlagServiceContext.tsx +87 -0
  267. package/src/contexts/graphqlContext.tsx +165 -0
  268. package/src/contexts/index.ts +13 -3
  269. package/src/contexts/localStorageContext.tsx +159 -0
  270. package/src/contexts/newOrgConfigContext.tsx +104 -0
  271. package/src/contexts/orgConfigContext.tsx +92 -92
  272. package/src/contexts/searchContext.tsx +187 -0
  273. package/src/contexts/sessionStorageContext.tsx +80 -0
  274. package/src/contexts/shopifyUrlContext.tsx +97 -0
  275. package/src/contexts/types.ts +12 -8
  276. package/src/contexts/userIdentityContext.tsx +197 -0
  277. package/src/events/registerAnalyticsListeners.ts +32 -38
  278. package/src/hooks/index.ts +10 -6
  279. package/src/hooks/useAmplitudeOperations.ts +35 -0
  280. package/src/hooks/useAppDetails.ts +49 -0
  281. package/src/hooks/useCdnOperations.ts +16 -0
  282. package/src/hooks/useChatToggle.ts +5 -4
  283. package/src/hooks/useChatToggleAnalytics.ts +15 -0
  284. package/src/hooks/useGraphQLConfig.ts +63 -0
  285. package/src/hooks/useIdentifyUser.ts +33 -0
  286. package/src/hooks/useImageResolver.ts +18 -10
  287. package/src/hooks/useLocalStorageOperations.ts +92 -0
  288. package/src/hooks/useNewOrgConfig.ts +7 -0
  289. package/src/hooks/useSearch.tsx +21 -18
  290. package/src/hooks/useSearchOperations.ts +97 -0
  291. package/src/hooks/useSessionStorageOperations.ts +28 -0
  292. package/src/hooks/useShopifyUrlOperations.ts +45 -0
  293. package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
  294. package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
  295. package/src/interceptors/index.ts +0 -1
  296. package/src/interceptors/useMessageInterceptor.ts +5 -8
  297. package/src/merchants/bandolier/bandolier.ts +10 -28
  298. package/src/merchants/carpe/carpe.ts +5 -8
  299. package/src/merchants/coterie/coterie.ts +3 -6
  300. package/src/merchants/default.ts +73 -70
  301. package/src/merchants/domInsertion.ts +30 -0
  302. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
  303. package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
  304. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
  305. package/src/merchants/greenpan/greenpan.ts +6 -12
  306. package/src/merchants/gridInsertion.ts +19 -0
  307. package/src/merchants/grooveLife/grooveLife.ts +13 -7
  308. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
  309. package/src/merchants/jackArcher/jackArcher.ts +26 -11
  310. package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
  311. package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
  312. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
  313. package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
  314. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
  315. package/src/merchants/longevityrx/longevityrx.ts +14 -8
  316. package/src/merchants/lookOptic/lookOptic.ts +6 -6
  317. package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
  318. package/src/merchants/medterra/medterra.ts +14 -11
  319. package/src/merchants/modells/modells.ts +6 -9
  320. package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
  321. package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
  322. package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
  323. package/src/merchants/spanx/spanx.ts +6 -6
  324. package/src/merchants/spanx/spanxStaging.ts +6 -12
  325. package/src/merchants/supergoop/supergoop.ts +11 -12
  326. package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
  327. package/src/merchants/venaCbd/venaCbd.ts +6 -9
  328. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
  329. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
  330. package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
  331. package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
  332. package/src/types/config-versions.ts +6 -0
  333. package/src/types.ts +0 -53
  334. package/dist/adapters/amplitude/index.cjs +0 -14
  335. package/dist/adapters/amplitude/index.d.cts +0 -6
  336. package/dist/adapters/amplitude/index.d.ts +0 -6
  337. package/dist/adapters/amplitude/index.js +0 -12
  338. package/dist/api-B2euFL-5.cjs +0 -269
  339. package/dist/api-XRr_lAG6.js +0 -190
  340. package/dist/application/config/index.cjs +0 -43
  341. package/dist/application/config/index.d.cts +0 -15
  342. package/dist/application/config/index.d.ts +0 -15
  343. package/dist/application/config/index.js +0 -41
  344. package/dist/application/service/customerService/index.cjs +0 -4
  345. package/dist/application/service/customerService/index.d.cts +0 -3
  346. package/dist/application/service/customerService/index.d.ts +0 -3
  347. package/dist/application/service/customerService/index.js +0 -4
  348. package/dist/application/service/index.cjs +0 -41
  349. package/dist/application/service/index.d.cts +0 -399
  350. package/dist/application/service/index.d.ts +0 -399
  351. package/dist/application/service/index.js +0 -12
  352. package/dist/bandolier-B76-OE75.cjs +0 -1230
  353. package/dist/bandolier-DRn_x1g1.js +0 -1230
  354. package/dist/carpe-kHi4RLB5.cjs +0 -608
  355. package/dist/carpe-qrSU99gq.js +0 -606
  356. package/dist/contexts-CQDwe3rK.cjs +0 -14333
  357. package/dist/contexts-e2sM-B9g.js +0 -12919
  358. package/dist/coterie-mMirPcHP.js +0 -240
  359. package/dist/customerService-BG1uNZZ1.cjs +0 -36
  360. package/dist/customerService-BHQRnLhC.js +0 -23
  361. package/dist/default-8Jfv8ehQ.cjs +0 -199
  362. package/dist/default-C8PQf-38.js +0 -176
  363. package/dist/default-LukSiCz1.js +0 -4
  364. package/dist/default-rJSJ887P.cjs +0 -4
  365. package/dist/dreamlandBaby-DHltv12Z.cjs +0 -347
  366. package/dist/dreamlandBaby-cG0HM9bt.js +0 -347
  367. package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
  368. package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
  369. package/dist/fiveCbd-Cvnwh03g.cjs +0 -614
  370. package/dist/fiveCbd-DhYMlsf9.js +0 -614
  371. package/dist/forLoveAndLemons-C8DuUexW.js +0 -666
  372. package/dist/forLoveAndLemons-DR6a1zjJ.cjs +0 -668
  373. package/dist/greenpan-B4Pu65kV.js +0 -398
  374. package/dist/greenpan-BL5p6j7f.cjs +0 -398
  375. package/dist/grooveLife-DjKWHoN3.cjs +0 -343
  376. package/dist/grooveLife-JK0TyaPz.js +0 -343
  377. package/dist/homegrownCannabis-DxqSDkmS.js +0 -411
  378. package/dist/homegrownCannabis-ZnfCqW-m.cjs +0 -411
  379. package/dist/index-BfuO9b0Q.d.ts +0 -749
  380. package/dist/index-CNsGWfS6.d.cts +0 -749
  381. package/dist/index-DFL1dIT_.d.ts +0 -7
  382. package/dist/index-MFbPQ8Ji.d.ts +0 -95
  383. package/dist/index-VSFakgAI.d.cts +0 -95
  384. package/dist/index-zZjcds15.d.cts +0 -7
  385. package/dist/jackArcher-mGkojXek.cjs +0 -728
  386. package/dist/jordanCraig-BvCvPRoR.js +0 -1787
  387. package/dist/jordanCraig-Dv8pVCiS.cjs +0 -1787
  388. package/dist/kindredBravely-UQP7wiNu.cjs +0 -491
  389. package/dist/kindredBravely-X8F_LNph.js +0 -491
  390. package/dist/kutFromTheKloth-BhYKk3CN.cjs +0 -370
  391. package/dist/kutFromTheKloth-D1xsTSJr.js +0 -370
  392. package/dist/larryAndSerges-1411NuZa.cjs +0 -262
  393. package/dist/larryAndSerges-DVIRLItu.js +0 -262
  394. package/dist/leapsAndRebounds-BJ8mwr33.js +0 -361
  395. package/dist/leapsAndRebounds-UcP9EJVO.cjs +0 -361
  396. package/dist/logger-Dln20ans.cjs +0 -26
  397. package/dist/logger-pdEEY8T2.js +0 -20
  398. package/dist/longevityrx-BFSv9GF5.cjs +0 -321
  399. package/dist/longevityrx-Cp6wleWr.js +0 -321
  400. package/dist/lookOptic-KieSqskd.cjs +0 -283
  401. package/dist/mantraBrand-CHQw-0nw.cjs +0 -751
  402. package/dist/medterra-CLG6Co1C.cjs +0 -584
  403. package/dist/medterra-D8ZX9NZC.js +0 -584
  404. package/dist/modells-BzyPwN2m.cjs +0 -485
  405. package/dist/modells-CAfqOCW4.js +0 -485
  406. package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
  407. package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
  408. package/dist/pressedFloral-DULBuQwR.cjs +0 -662
  409. package/dist/pressedFloral-Dp-7Fk3S.js +0 -662
  410. package/dist/skinPerfection-BxuYCeJX.js +0 -335
  411. package/dist/skinPerfection-Cd3XZ6By.cjs +0 -335
  412. package/dist/snapSupplements-Bf6htPM0.js +0 -286
  413. package/dist/snapSupplements-ZFnXyMuZ.cjs +0 -286
  414. package/dist/spanx-CwDPQaGj.js +0 -662
  415. package/dist/spanx-Cyd4qDlK.cjs +0 -664
  416. package/dist/spanxStaging-D43nyAGy.js +0 -846
  417. package/dist/spanxStaging-ijbYnHzr.cjs +0 -849
  418. package/dist/supergoop-BnbFG7hm.cjs +0 -338
  419. package/dist/supergoop-CY043wIg.js +0 -336
  420. package/dist/types-BF_CJeck.js +0 -177
  421. package/dist/types-CD4LFta-.d.cts +0 -33
  422. package/dist/types-CNH4sfF-.cjs +0 -231
  423. package/dist/types-DBdI0j89.d.ts +0 -33
  424. package/dist/uniqueVintage-R2Jcu1y1.cjs +0 -1214
  425. package/dist/variant-CKVRF2-W.d.ts +0 -13
  426. package/dist/variant-raYuOP4L.d.cts +0 -13
  427. package/dist/venaCbd-o5_vOp4e.js +0 -366
  428. package/dist/venaCbd-r-IxEVc1.cjs +0 -366
  429. package/dist/westonJonBoucher-DjGEW3ZB.cjs +0 -423
  430. package/dist/wineEnthusiast-DvfcV5B3.cjs +0 -941
  431. package/dist/wolfMattress-6xPfOJt3.js +0 -373
  432. package/dist/wolfMattress-BjGnGKjP.cjs +0 -373
  433. package/dist/wolfTactical-Bi3WZu0m.cjs +0 -350
  434. package/dist/wolfTactical-C_F9-oPX.js +0 -350
  435. package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
  436. package/src/adapters/amplitude/index.ts +0 -2
  437. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
  438. package/src/adapters/spiffy/commerce/graphql.ts +0 -219
  439. package/src/application/config/generalStaticConfig.ts +0 -40
  440. package/src/application/config/index.ts +0 -1
  441. package/src/application/models/domMutationContinuation.ts +0 -7
  442. package/src/application/models/domObservationStrategy.ts +0 -9
  443. package/src/application/service/cachingService.ts +0 -84
  444. package/src/application/service/cdnService.ts +0 -20
  445. package/src/application/service/customerService/index.ts +0 -8
  446. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
  447. package/src/application/service/domMutationObserver.ts +0 -320
  448. package/src/application/service/domMutations/GridInsertionService.ts +0 -123
  449. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
  450. package/src/application/service/domMutations/domInsertionService.ts +0 -90
  451. package/src/application/service/domMutations/domMutationListener.ts +0 -15
  452. package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
  453. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
  454. package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
  455. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
  456. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
  457. package/src/application/service/featureFlagService.ts +0 -130
  458. package/src/application/service/index.ts +0 -31
  459. package/src/application/service/kustomerIntegrationService.ts +0 -111
  460. package/src/application/service/localStorageService.ts +0 -77
  461. package/src/application/service/pageVariantService.ts +0 -866
  462. package/src/application/service/searchService.ts +0 -147
  463. package/src/application/service/sessionStorageService.ts +0 -27
  464. package/src/application/service/shopifyUrlService.ts +0 -63
  465. package/src/application/service/userIdentityService.ts +0 -114
  466. package/src/application/service/windowChatToggleService.ts +0 -80
  467. package/src/application/service/windowDataLayerService.ts +0 -181
  468. package/src/application/service/windowFrontendConfigService.ts +0 -129
  469. package/src/atoms/org/merchantCss.ts +0 -158
  470. package/src/atoms/org/org.ts +0 -291
  471. package/src/atoms/org/orgUIConfig.ts +0 -142
  472. package/src/enabled-features.ts +0 -83
  473. package/src/hooks/useDynamicVariants.ts +0 -210
  474. package/src/hooks/useFileUpload.ts +0 -63
  475. package/src/hooks/useHideElements.ts +0 -82
  476. package/src/hooks/useHorizontalScrollAnimation.ts +0 -115
  477. package/src/hooks/useReducedMotionWithOverride.ts +0 -15
  478. package/src/hooks/useSnapControl.ts +0 -155
  479. package/src/interceptors/useFormEscalation.ts +0 -57
  480. /package/dist/{variantInfo-CzhR5W6h.js → atomStore-CZnUUsrr.js} +0 -0
  481. /package/dist/{variantInfo-CNRTY0gH.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
  482. /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
  483. /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
  484. /package/dist/{locators-Dc5ZT0aF.js → utilityTypes-8sETsYPk.js} +0 -0
  485. /package/dist/{locators-lQMJj830.cjs → utilityTypes-COShxVir.cjs} +0 -0
  486. /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
  487. /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
  488. /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
@@ -0,0 +1,672 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const require_models = require('./models-BkXg5eIP.cjs');
3
+ const require_chat = require('./chat-CO7cRkaq.cjs');
4
+ const require_org = require('./org-C2RrBVQR.cjs');
5
+ let jotai = require("jotai");
6
+ jotai = require_chunk.__toESM(jotai);
7
+ let __spiffy_ai_commerce_api_client = require("@spiffy-ai/commerce-api-client");
8
+ __spiffy_ai_commerce_api_client = require_chunk.__toESM(__spiffy_ai_commerce_api_client);
9
+ let uuid = require("uuid");
10
+ uuid = require_chunk.__toESM(uuid);
11
+
12
+ //#region src/atoms/search/utils.ts
13
+ const formatFilterDisplayName = (displayName) => {
14
+ const sizes = [
15
+ "xxxs",
16
+ "xxs",
17
+ "xs",
18
+ "s",
19
+ "m",
20
+ "l",
21
+ "xl",
22
+ "xxl",
23
+ "xxxl",
24
+ "xxxxl"
25
+ ];
26
+ return displayName.toLowerCase().split(" ").map((word) => {
27
+ if (sizes.includes(word)) return word.toUpperCase();
28
+ return word.charAt(0).toUpperCase() + word.slice(1);
29
+ }).join(" ").replace(/Iphone/g, "iPhone");
30
+ };
31
+
32
+ //#endregion
33
+ //#region src/atoms/search/productFilters.ts
34
+ const getPriceBucket = (price, bucketSize) => {
35
+ return Math.floor(price / bucketSize) * bucketSize;
36
+ };
37
+ const isStringArray = (value) => {
38
+ if (!Array.isArray(value)) return false;
39
+ return value.every((item) => typeof item === "string");
40
+ };
41
+ const sortFilter = (filterConfig) => {
42
+ if (filterConfig.type === "price") return (a, b) => Number(a.filterItemId) - Number(b.filterItemId);
43
+ if (filterConfig.type === "dynamic") {
44
+ if (filterConfig.sorting.type === "alphabetic") return (a, b) => a.displayName.localeCompare(b.displayName);
45
+ if (filterConfig.sorting.type === "productCount") return (a, b) => a.productCount === b.productCount ? a.displayName.localeCompare(b.displayName) : b.productCount - a.productCount;
46
+ if (filterConfig.sorting.type === "custom") {
47
+ const sortedKeys = filterConfig.sorting.map;
48
+ return (a, b) => {
49
+ if (sortedKeys[a.displayName] && sortedKeys[b.displayName]) return sortedKeys[a.displayName] - sortedKeys[b.displayName];
50
+ if (sortedKeys[a.displayName]) return -1;
51
+ if (sortedKeys[b.displayName]) return 1;
52
+ return b.productCount - a.productCount;
53
+ };
54
+ }
55
+ }
56
+ throw new Error("Invaalid search filter configuration");
57
+ };
58
+ var ProductFilters = class {
59
+ static getFiltersForProducts(products, filterConfigs, selectedFilterOptions) {
60
+ if (!products || products.length === 0) return [];
61
+ return [...filterConfigs.map((filterConfig) => products.reduce((acc, product) => {
62
+ if (filterConfig.type === "price") {
63
+ const priceBucket = getPriceBucket(product.salePrice ?? product.originalPrice ?? 0, filterConfig.bucketSize);
64
+ const current = acc.map[priceBucket] ?? {
65
+ filterItemId: priceBucket,
66
+ displayName: `$${priceBucket}-$${priceBucket + filterConfig.bucketSize}`,
67
+ productCount: 0
68
+ };
69
+ acc.map[priceBucket] = {
70
+ ...current,
71
+ productCount: current.productCount + 1
72
+ };
73
+ return acc;
74
+ }
75
+ const attributeValues = (product.filters && product.filters?.[filterConfig.attribute]) ?? [];
76
+ if (isStringArray(attributeValues)) attributeValues.forEach((val) => {
77
+ const normalizedVal = val.toLowerCase();
78
+ const current = acc.map[normalizedVal] ?? {
79
+ filterItemId: normalizedVal,
80
+ displayName: formatFilterDisplayName(val),
81
+ productCount: 0
82
+ };
83
+ acc.map[normalizedVal] = {
84
+ ...current,
85
+ productCount: current.productCount + 1
86
+ };
87
+ });
88
+ return acc;
89
+ }, {
90
+ filterConfig,
91
+ map: {}
92
+ })).map(({ filterConfig, map }) => ({
93
+ filterId: filterConfig.filterId,
94
+ displayName: filterConfig.displayName,
95
+ items: Object.values(map).map((filter) => ({
96
+ filterItemId: filter.filterItemId,
97
+ displayName: filter.displayName,
98
+ productCount: filter.productCount,
99
+ isSelected: selectedFilterOptions.some((option) => option.id === `${filterConfig.filterId}:${filter.filterItemId}`) ?? false
100
+ })).sort(sortFilter(filterConfig))
101
+ }))];
102
+ }
103
+ static filterProducts(products, filterConfigs, selectedFilterOptions, additiveDynamicFilters = false) {
104
+ const selectedFilters = filterConfigs.map((filterConfig) => ({
105
+ filterConfig,
106
+ hasSelectedOptions: selectedFilterOptions.some((option) => option.filterId === filterConfig.filterId)
107
+ })).filter(({ hasSelectedOptions }) => hasSelectedOptions);
108
+ return selectedFilterOptions.length === 0 ? products : products.filter((product) => selectedFilters.reduce((acc, selectedFilter) => {
109
+ if (!acc) return acc;
110
+ if (selectedFilter.filterConfig.type === "price") {
111
+ const priceBucket = getPriceBucket(product.salePrice ?? product.originalPrice ?? 0, selectedFilter.filterConfig.bucketSize);
112
+ if (!selectedFilterOptions.some((option) => option.id === `price:${priceBucket}`)) return false;
113
+ }
114
+ if (selectedFilter.filterConfig.type === "dynamic") {
115
+ const { filterId, attribute } = selectedFilter.filterConfig;
116
+ const attributeValues = product.filters?.[attribute];
117
+ if (!isStringArray(attributeValues)) return false;
118
+ if (selectedFilter.filterConfig.attribute === "dynamic" && !additiveDynamicFilters) {
119
+ if (!selectedFilterOptions.filter((option) => option.filterId === filterId).map((option) => option.filterItemId.toLowerCase()).every((selectedValue) => attributeValues.some((val) => val.toLowerCase() === selectedValue))) return false;
120
+ } else if (!attributeValues.some((val) => selectedFilterOptions.some((option) => option.id === `${filterId}:${val.toLowerCase()}`))) return false;
121
+ }
122
+ return true;
123
+ }, true));
124
+ }
125
+ };
126
+
127
+ //#endregion
128
+ //#region src/atoms/search/types.ts
129
+ let ProductSorting = /* @__PURE__ */ function(ProductSorting$1) {
130
+ ProductSorting$1["FEATURED"] = "featured";
131
+ ProductSorting$1["PRICE_ASC"] = "price_asc";
132
+ ProductSorting$1["PRICE_DESC"] = "price_desc";
133
+ return ProductSorting$1;
134
+ }({});
135
+ const ProductSortingNames = {
136
+ [ProductSorting.FEATURED]: "Featured",
137
+ [ProductSorting.PRICE_ASC]: "Price Low to High",
138
+ [ProductSorting.PRICE_DESC]: "Price High to Low"
139
+ };
140
+
141
+ //#endregion
142
+ //#region src/atoms/search/productSorter.ts
143
+ var ProductSorter = class {
144
+ static sort(products, sorting) {
145
+ switch (sorting) {
146
+ case ProductSorting.PRICE_ASC: return [...products].sort((p1, p2) => (p1.salePrice ?? p1.originalPrice ?? 0) - (p2.salePrice ?? p2.originalPrice ?? 0));
147
+ case ProductSorting.PRICE_DESC: return [...products].sort((p1, p2) => (p2.salePrice ?? p2.originalPrice ?? 0) - (p1.salePrice ?? p1.originalPrice ?? 0));
148
+ default: return products;
149
+ }
150
+ }
151
+ };
152
+
153
+ //#endregion
154
+ //#region src/atoms/search/chatSearch.ts
155
+ const chatSearchStateAtom = (0, jotai.atom)("entrypoint");
156
+ const chatSearchHasProductsAtom = (0, jotai.atom)(false);
157
+ const chatSearchProductSortingAtom = (0, jotai.atom)(ProductSorting.FEATURED);
158
+ const filterProductList = (message) => message.type === require_models.MessageType.Product && message.metadata.isForGrid === true;
159
+ const filterFilterList = (message) => message.type === require_models.MessageType.ProductSearchFilter;
160
+ const chatSearchIsLoadingAtom = (0, jotai.atom)(false);
161
+ const buildChatSearchTurn = (messages) => {
162
+ const queryMessage = messages.find((message) => message.type === require_models.MessageType.ProductSearch);
163
+ if (!queryMessage) return null;
164
+ const { generatedQuery, productCount } = queryMessage.metadata ?? {};
165
+ const productList = messages.filter(filterProductList).map((message) => message.metadata);
166
+ const filterList = messages.filter(filterFilterList).map((message) => message.metadata.filterName);
167
+ return [queryMessage.id, {
168
+ id: queryMessage.id,
169
+ generatedQuery,
170
+ productCount: productCount || productList.length,
171
+ productList,
172
+ filterList,
173
+ messages
174
+ }];
175
+ };
176
+ const chatSearchFilterConfigAtom = (0, jotai.atom)((get) => {
177
+ return get(require_org.newOrgConfigAtom)?.frontendConfig?.uiConfigs?.searchConfig?.searchFilterConfig || [];
178
+ });
179
+ const searchMapAtom = (0, jotai.atom)((get) => {
180
+ const messages = get(require_chat.messagesAtom);
181
+ return Object.fromEntries(messages.map(buildChatSearchTurn).filter((v) => v !== null));
182
+ });
183
+ const internalChatSearchParamsAtom = (0, jotai.atom)({
184
+ id: null,
185
+ query: null
186
+ });
187
+ const selectedFilterOptionsAtom = (0, jotai.atom)([]);
188
+ const additiveDynamicFiltersAtom = (0, jotai.atom)((get) => {
189
+ return get(require_org.newOrgConfigAtom)?.frontendConfig?.uiConfigs?.searchConfig?.additiveDynamicFilters ?? false;
190
+ });
191
+ const createChatSearchFilterOption = (filterId, filterItemId, displayName) => ({
192
+ id: `${filterId}:${filterItemId}`,
193
+ displayName,
194
+ filterId,
195
+ filterItemId
196
+ });
197
+ const handleSearchAtom = (0, jotai.atom)(null, (get, set, message) => {
198
+ if (message.type !== require_models.MessageType.Search) return;
199
+ const querySearch = message.metadata.searchTerm;
200
+ set(require_chat.replyEventCategoryAtom, __spiffy_ai_commerce_api_client.UserEventCategory.Search);
201
+ set(require_chat.userQueryAtom, querySearch);
202
+ set(require_chat.messagesAtom, [...get(require_chat.messagesAtom), [message]]);
203
+ set(require_chat.userHasRepliedAtom, true);
204
+ set(require_chat.queueUserEventAtom, {
205
+ eventId: message.id,
206
+ category: __spiffy_ai_commerce_api_client.UserEventCategory.Search,
207
+ createdAt: message.createdAt,
208
+ attributes: {
209
+ searchTerm: message.metadata.searchTerm,
210
+ selectedFilters: message.metadata.selectedFilters
211
+ }
212
+ });
213
+ });
214
+ const chatSearchParamsAtom = (0, jotai.atom)((get) => get(internalChatSearchParamsAtom), (_, set, value) => {
215
+ set(internalChatSearchParamsAtom, value);
216
+ });
217
+ const chatSearchQueryAtom = (0, jotai.atom)((get) => get(chatSearchParamsAtom)?.query ?? null, (get, set, value) => {
218
+ const searchParams = get(chatSearchParamsAtom);
219
+ set(chatSearchParamsAtom, {
220
+ id: searchParams.id,
221
+ query: value
222
+ });
223
+ });
224
+ const chatSearchIdAtom = (0, jotai.atom)((get) => get(chatSearchParamsAtom)?.id ?? null, (get, set, value) => {
225
+ const searchParams = get(chatSearchParamsAtom);
226
+ set(chatSearchParamsAtom, {
227
+ id: value,
228
+ query: searchParams.query
229
+ });
230
+ });
231
+ const ChatSearchTurnAtom = (0, jotai.atom)((get) => {
232
+ const searchFilterConfig = get(chatSearchFilterConfigAtom);
233
+ const searchMap = get(searchMapAtom);
234
+ const chatSearchId = get(chatSearchIdAtom);
235
+ if (!chatSearchId) return null;
236
+ const ChatSearchTurn = searchMap[chatSearchId];
237
+ if (!ChatSearchTurn) return null;
238
+ const productSorting = get(chatSearchProductSortingAtom);
239
+ const selectedFilterOptions = get(selectedFilterOptionsAtom);
240
+ const additiveDynamicFilters = get(additiveDynamicFiltersAtom);
241
+ const filteredProducts = ProductFilters.filterProducts(ChatSearchTurn.productList, searchFilterConfig, selectedFilterOptions, additiveDynamicFilters);
242
+ const filteredAndSortedProducts = ProductSorter.sort(filteredProducts, productSorting);
243
+ return {
244
+ ...searchMap[chatSearchId],
245
+ productList: filteredAndSortedProducts,
246
+ productCount: filteredAndSortedProducts.length
247
+ };
248
+ });
249
+ const chatSearchProducts = (0, jotai.atom)((get) => {
250
+ return get(ChatSearchTurnAtom)?.productList ?? [];
251
+ });
252
+ const chatSearchFiltersAtom = (0, jotai.atom)((get) => {
253
+ const searchFilterConfig = get(chatSearchFilterConfigAtom);
254
+ const searchMap = get(searchMapAtom);
255
+ const chatSearchId = get(chatSearchIdAtom);
256
+ if (chatSearchId && searchMap[chatSearchId]) {
257
+ const products = searchMap[chatSearchId].productList;
258
+ const selectedFilterOptions = get(selectedFilterOptionsAtom);
259
+ return ProductFilters.getFiltersForProducts(products, searchFilterConfig, selectedFilterOptions);
260
+ }
261
+ return [];
262
+ });
263
+ const setSearchParams = (query) => {
264
+ const url = new URL(window.location.href);
265
+ url.searchParams.set("es", "true");
266
+ url.searchParams.set("esq", query);
267
+ window.history.pushState({}, "", url);
268
+ };
269
+ const getSearchParamsAtom = (0, jotai.atom)(() => {
270
+ const params = new URLSearchParams(window.location.search);
271
+ return {
272
+ es: params.get("es"),
273
+ esq: params.get("esq")
274
+ };
275
+ });
276
+ const initiateChatSearchAtom = (0, jotai.atom)(null, (_, set, query) => {
277
+ set(chatSearchIsLoadingAtom, true);
278
+ const url = new URL(window.location.href);
279
+ url.searchParams.set("es", "true");
280
+ url.searchParams.set("esq", query);
281
+ window.history.pushState({}, "", url);
282
+ window.dispatchEvent(new PopStateEvent("popstate", { state: {} }));
283
+ set(chatSearchParamsAtom, {
284
+ id: null,
285
+ query
286
+ });
287
+ set(handleSearchAtom, {
288
+ id: (0, uuid.v4)(),
289
+ role: require_models.MessageRole.User,
290
+ type: require_models.MessageType.Search,
291
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
292
+ metadata: {
293
+ searchTerm: query,
294
+ selectedFilters: []
295
+ }
296
+ });
297
+ });
298
+ const handleSearchResultsAtom = (0, jotai.atom)(null, (get, set, message) => {
299
+ if (!message || message.type !== require_models.MessageType.ProductSearch) return;
300
+ const { productCount, generatedQuery } = message.metadata;
301
+ if (productCount !== 0) {
302
+ set(selectedFilterOptionsAtom, []);
303
+ set(chatSearchStateAtom, "product-page");
304
+ const currentSearchParams = get(chatSearchParamsAtom);
305
+ const url = new URL(window.location.href);
306
+ url.searchParams.set("es", "true");
307
+ url.searchParams.set("esq", generatedQuery);
308
+ url.searchParams.set("esi", message.id);
309
+ window.history.pushState({}, "", url);
310
+ if (currentSearchParams.id === null) window.history.replaceState(null, "", url);
311
+ else window.history.pushState(null, "", url);
312
+ set(chatSearchParamsAtom, {
313
+ id: message.id,
314
+ query: generatedQuery
315
+ });
316
+ }
317
+ });
318
+ const setChatSearchParamsAtom = (0, jotai.atom)(null, (_, set, query) => {
319
+ const url = new URL(window.location.href);
320
+ url.searchParams.set("es", "true");
321
+ url.searchParams.set("esq", query);
322
+ window.history.pushState({}, "", url);
323
+ set(chatSearchParamsAtom, {
324
+ id: null,
325
+ query
326
+ });
327
+ });
328
+
329
+ //#endregion
330
+ //#region src/atoms/search/searchServiceAdapter.ts
331
+ let searchServiceFunction = null;
332
+ const setSearchServiceFunction = (fn) => {
333
+ searchServiceFunction = fn;
334
+ };
335
+ const getSearchServiceFunction = () => {
336
+ if (!searchServiceFunction) throw new Error("Search service function not initialized. Make sure SearchProvider is mounted.");
337
+ return searchServiceFunction;
338
+ };
339
+ const clearSearchServiceFunction = () => {
340
+ searchServiceFunction = null;
341
+ };
342
+
343
+ //#endregion
344
+ //#region src/atoms/search/searchAPI.ts
345
+ const searchAtom = (0, jotai.atom)({
346
+ data: null,
347
+ loading: false,
348
+ error: null,
349
+ lastQuery: null
350
+ });
351
+ const searchProductSortingAtom = (0, jotai.atom)(ProductSorting.FEATURED);
352
+ const searchSelectedFiltersAtom = (0, jotai.atom)([]);
353
+ const createFilterOption = (filterId, filterItemId, displayName) => ({
354
+ id: `${filterId}:${filterItemId}`,
355
+ displayName,
356
+ filterId,
357
+ filterItemId
358
+ });
359
+ const internalSearchParamsAtom = (0, jotai.atom)({
360
+ id: null,
361
+ query: null
362
+ });
363
+ const searchParamsAtom = (0, jotai.atom)((get) => get(internalSearchParamsAtom), (_, set, value) => {
364
+ set(internalSearchParamsAtom, value);
365
+ });
366
+ const internalSearchSystemStateAtom = (0, jotai.atom)(false);
367
+ const searchSystemAtom = (0, jotai.atom)((get) => get(internalSearchSystemStateAtom), (get, set, value) => {
368
+ if (value === get(internalSearchSystemStateAtom)) return;
369
+ const stateChangeHandler = () => {
370
+ const params = new URLSearchParams(window.location.search);
371
+ if (params.get("es") === "true") {
372
+ const id = params.get("esi");
373
+ const query = params.get("esq");
374
+ set(searchParamsAtom, {
375
+ id,
376
+ query
377
+ });
378
+ } else set(searchParamsAtom, {
379
+ id: null,
380
+ query: null
381
+ });
382
+ };
383
+ if (value) {
384
+ set(internalSearchSystemStateAtom, true);
385
+ window.addEventListener("popstate", stateChangeHandler);
386
+ stateChangeHandler();
387
+ } else {
388
+ set(internalSearchSystemStateAtom, false);
389
+ window.removeEventListener("popstate", stateChangeHandler);
390
+ }
391
+ });
392
+ const filteredSearchProductsAtom = (0, jotai.atom)((get) => {
393
+ const searchData = get(searchAtom).data;
394
+ const sorting = get(searchProductSortingAtom);
395
+ const selectedFilters = get(searchSelectedFiltersAtom);
396
+ const newOrgConfig = get(require_org.newOrgConfigAtom);
397
+ if (!searchData?.products || !newOrgConfig?.frontendConfig?.uiConfigs?.searchConfig) return [];
398
+ const filteredProducts = ProductFilters.filterProducts(searchData.products, newOrgConfig.frontendConfig.uiConfigs.searchConfig.searchFilterConfig, selectedFilters, newOrgConfig.frontendConfig.uiConfigs.searchConfig.additiveDynamicFilters);
399
+ return ProductSorter.sort(filteredProducts, sorting);
400
+ });
401
+ const searchFiltersAtom = (0, jotai.atom)((get) => {
402
+ const searchData = get(searchAtom).data;
403
+ const selectedFilters = get(searchSelectedFiltersAtom);
404
+ const newOrgConfig = get(require_org.newOrgConfigAtom);
405
+ if (!searchData?.products || !newOrgConfig?.frontendConfig?.uiConfigs?.searchConfig) return [];
406
+ return ProductFilters.getFiltersForProducts(searchData.products, newOrgConfig.frontendConfig.uiConfigs.searchConfig.searchFilterConfig, selectedFilters);
407
+ });
408
+ const addSearchFilterAtom = (0, jotai.atom)(null, (get, set, filter) => {
409
+ const current = get(searchSelectedFiltersAtom);
410
+ if (!current.some((f) => f.id === filter.id)) set(searchSelectedFiltersAtom, [...current, filter]);
411
+ });
412
+ const removeSearchFilterAtom = (0, jotai.atom)(null, (get, set, filterId) => {
413
+ const current = get(searchSelectedFiltersAtom);
414
+ set(searchSelectedFiltersAtom, current.filter((f) => f.id !== filterId));
415
+ });
416
+ const clearSearchFiltersAtom = (0, jotai.atom)(null, (_, set) => {
417
+ set(searchSelectedFiltersAtom, []);
418
+ });
419
+ const performSearchAtom = (0, jotai.atom)(null, async (get, set, params, allowRedirect = false) => {
420
+ const currentState = get(searchAtom);
421
+ const redirectSearchResultsUrl = get(require_org.newOrgConfigAtom)?.frontendConfig?.uiConfigs?.searchConfig?.redirectSearchResultsUrl;
422
+ if (allowRedirect && redirectSearchResultsUrl) {
423
+ const redirectUrl = new URL(redirectSearchResultsUrl);
424
+ redirectUrl.searchParams.set("es", "true");
425
+ redirectUrl.searchParams.set("esq", params.query);
426
+ window.location.href = redirectUrl.toString();
427
+ } else {
428
+ const url = new URL(window.location.href);
429
+ url.searchParams.set("es", "true");
430
+ url.searchParams.set("esq", params.query);
431
+ window.history.pushState({}, "", url);
432
+ window.dispatchEvent(new PopStateEvent("popstate", { state: {} }));
433
+ }
434
+ window.dispatchEvent(new PopStateEvent("popstate", { state: {} }));
435
+ if (currentState.loading) return;
436
+ set(searchAtom, {
437
+ data: null,
438
+ loading: true,
439
+ error: null,
440
+ lastQuery: params.query
441
+ });
442
+ try {
443
+ const result = await getSearchServiceFunction()(params);
444
+ set(searchAtom, {
445
+ data: result,
446
+ loading: false,
447
+ error: null,
448
+ lastQuery: params.query
449
+ });
450
+ } catch (error) {
451
+ const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
452
+ set(searchAtom, {
453
+ data: null,
454
+ loading: false,
455
+ error: errorMessage,
456
+ lastQuery: params.query
457
+ });
458
+ }
459
+ });
460
+
461
+ //#endregion
462
+ Object.defineProperty(exports, 'ChatSearchTurnAtom', {
463
+ enumerable: true,
464
+ get: function () {
465
+ return ChatSearchTurnAtom;
466
+ }
467
+ });
468
+ Object.defineProperty(exports, 'ProductSorting', {
469
+ enumerable: true,
470
+ get: function () {
471
+ return ProductSorting;
472
+ }
473
+ });
474
+ Object.defineProperty(exports, 'addSearchFilterAtom', {
475
+ enumerable: true,
476
+ get: function () {
477
+ return addSearchFilterAtom;
478
+ }
479
+ });
480
+ Object.defineProperty(exports, 'additiveDynamicFiltersAtom', {
481
+ enumerable: true,
482
+ get: function () {
483
+ return additiveDynamicFiltersAtom;
484
+ }
485
+ });
486
+ Object.defineProperty(exports, 'chatSearchFiltersAtom', {
487
+ enumerable: true,
488
+ get: function () {
489
+ return chatSearchFiltersAtom;
490
+ }
491
+ });
492
+ Object.defineProperty(exports, 'chatSearchHasProductsAtom', {
493
+ enumerable: true,
494
+ get: function () {
495
+ return chatSearchHasProductsAtom;
496
+ }
497
+ });
498
+ Object.defineProperty(exports, 'chatSearchIdAtom', {
499
+ enumerable: true,
500
+ get: function () {
501
+ return chatSearchIdAtom;
502
+ }
503
+ });
504
+ Object.defineProperty(exports, 'chatSearchIsLoadingAtom', {
505
+ enumerable: true,
506
+ get: function () {
507
+ return chatSearchIsLoadingAtom;
508
+ }
509
+ });
510
+ Object.defineProperty(exports, 'chatSearchParamsAtom', {
511
+ enumerable: true,
512
+ get: function () {
513
+ return chatSearchParamsAtom;
514
+ }
515
+ });
516
+ Object.defineProperty(exports, 'chatSearchProductSortingAtom', {
517
+ enumerable: true,
518
+ get: function () {
519
+ return chatSearchProductSortingAtom;
520
+ }
521
+ });
522
+ Object.defineProperty(exports, 'chatSearchProducts', {
523
+ enumerable: true,
524
+ get: function () {
525
+ return chatSearchProducts;
526
+ }
527
+ });
528
+ Object.defineProperty(exports, 'chatSearchQueryAtom', {
529
+ enumerable: true,
530
+ get: function () {
531
+ return chatSearchQueryAtom;
532
+ }
533
+ });
534
+ Object.defineProperty(exports, 'chatSearchStateAtom', {
535
+ enumerable: true,
536
+ get: function () {
537
+ return chatSearchStateAtom;
538
+ }
539
+ });
540
+ Object.defineProperty(exports, 'clearSearchFiltersAtom', {
541
+ enumerable: true,
542
+ get: function () {
543
+ return clearSearchFiltersAtom;
544
+ }
545
+ });
546
+ Object.defineProperty(exports, 'clearSearchServiceFunction', {
547
+ enumerable: true,
548
+ get: function () {
549
+ return clearSearchServiceFunction;
550
+ }
551
+ });
552
+ Object.defineProperty(exports, 'createChatSearchFilterOption', {
553
+ enumerable: true,
554
+ get: function () {
555
+ return createChatSearchFilterOption;
556
+ }
557
+ });
558
+ Object.defineProperty(exports, 'createFilterOption', {
559
+ enumerable: true,
560
+ get: function () {
561
+ return createFilterOption;
562
+ }
563
+ });
564
+ Object.defineProperty(exports, 'filteredSearchProductsAtom', {
565
+ enumerable: true,
566
+ get: function () {
567
+ return filteredSearchProductsAtom;
568
+ }
569
+ });
570
+ Object.defineProperty(exports, 'formatFilterDisplayName', {
571
+ enumerable: true,
572
+ get: function () {
573
+ return formatFilterDisplayName;
574
+ }
575
+ });
576
+ Object.defineProperty(exports, 'getSearchParamsAtom', {
577
+ enumerable: true,
578
+ get: function () {
579
+ return getSearchParamsAtom;
580
+ }
581
+ });
582
+ Object.defineProperty(exports, 'handleSearchResultsAtom', {
583
+ enumerable: true,
584
+ get: function () {
585
+ return handleSearchResultsAtom;
586
+ }
587
+ });
588
+ Object.defineProperty(exports, 'initiateChatSearchAtom', {
589
+ enumerable: true,
590
+ get: function () {
591
+ return initiateChatSearchAtom;
592
+ }
593
+ });
594
+ Object.defineProperty(exports, 'internalSearchSystemStateAtom', {
595
+ enumerable: true,
596
+ get: function () {
597
+ return internalSearchSystemStateAtom;
598
+ }
599
+ });
600
+ Object.defineProperty(exports, 'performSearchAtom', {
601
+ enumerable: true,
602
+ get: function () {
603
+ return performSearchAtom;
604
+ }
605
+ });
606
+ Object.defineProperty(exports, 'removeSearchFilterAtom', {
607
+ enumerable: true,
608
+ get: function () {
609
+ return removeSearchFilterAtom;
610
+ }
611
+ });
612
+ Object.defineProperty(exports, 'searchAtom', {
613
+ enumerable: true,
614
+ get: function () {
615
+ return searchAtom;
616
+ }
617
+ });
618
+ Object.defineProperty(exports, 'searchFiltersAtom', {
619
+ enumerable: true,
620
+ get: function () {
621
+ return searchFiltersAtom;
622
+ }
623
+ });
624
+ Object.defineProperty(exports, 'searchParamsAtom', {
625
+ enumerable: true,
626
+ get: function () {
627
+ return searchParamsAtom;
628
+ }
629
+ });
630
+ Object.defineProperty(exports, 'searchProductSortingAtom', {
631
+ enumerable: true,
632
+ get: function () {
633
+ return searchProductSortingAtom;
634
+ }
635
+ });
636
+ Object.defineProperty(exports, 'searchSelectedFiltersAtom', {
637
+ enumerable: true,
638
+ get: function () {
639
+ return searchSelectedFiltersAtom;
640
+ }
641
+ });
642
+ Object.defineProperty(exports, 'searchSystemAtom', {
643
+ enumerable: true,
644
+ get: function () {
645
+ return searchSystemAtom;
646
+ }
647
+ });
648
+ Object.defineProperty(exports, 'selectedFilterOptionsAtom', {
649
+ enumerable: true,
650
+ get: function () {
651
+ return selectedFilterOptionsAtom;
652
+ }
653
+ });
654
+ Object.defineProperty(exports, 'setChatSearchParamsAtom', {
655
+ enumerable: true,
656
+ get: function () {
657
+ return setChatSearchParamsAtom;
658
+ }
659
+ });
660
+ Object.defineProperty(exports, 'setSearchParams', {
661
+ enumerable: true,
662
+ get: function () {
663
+ return setSearchParams;
664
+ }
665
+ });
666
+ Object.defineProperty(exports, 'setSearchServiceFunction', {
667
+ enumerable: true,
668
+ get: function () {
669
+ return setSearchServiceFunction;
670
+ }
671
+ });
672
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLURmMElmbmVnLmNqcyIsIm5hbWVzIjpbIk1lc3NhZ2VUeXBlIiwibmV3T3JnQ29uZmlnQXRvbSIsIm1lc3NhZ2VzQXRvbSIsInJlcGx5RXZlbnRDYXRlZ29yeUF0b20iLCJVc2VyRXZlbnRDYXRlZ29yeSIsInVzZXJRdWVyeUF0b20iLCJ1c2VySGFzUmVwbGllZEF0b20iLCJxdWV1ZVVzZXJFdmVudEF0b20iLCJNZXNzYWdlUm9sZSIsInNlYXJjaFNlcnZpY2VGdW5jdGlvbjpcbiAgfCAoKHBhcmFtczogU2VhcmNoUGFyYW1zKSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD4pXG4gIHwgbnVsbCIsIm5ld09yZ0NvbmZpZ0F0b20iLCJlcnJvcjogdW5rbm93biJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hdG9tcy9zZWFyY2gvdXRpbHMudHMiLCIuLi9zcmMvYXRvbXMvc2VhcmNoL3Byb2R1Y3RGaWx0ZXJzLnRzIiwiLi4vc3JjL2F0b21zL3NlYXJjaC90eXBlcy50cyIsIi4uL3NyYy9hdG9tcy9zZWFyY2gvcHJvZHVjdFNvcnRlci50cyIsIi4uL3NyYy9hdG9tcy9zZWFyY2gvY2hhdFNlYXJjaC50cyIsIi4uL3NyYy9hdG9tcy9zZWFyY2gvc2VhcmNoU2VydmljZUFkYXB0ZXIudHMiLCIuLi9zcmMvYXRvbXMvc2VhcmNoL3NlYXJjaEFQSS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBzaXplcyA9IFsneHh4cycsICd4eHMnLCAneHMnLCAncycsICdtJywgJ2wnLCAneGwnLCAneHhsJywgJ3h4eGwnLCAneHh4eGwnXTtcblxuICBjb25zdCBwcm9jZXNzZWRXb3JkcyA9IGRpc3BsYXlOYW1lXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAoKHdvcmQpID0+IHtcbiAgICAgIGlmIChzaXplcy5pbmNsdWRlcyh3b3JkKSkge1xuICAgICAgICByZXR1cm4gd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpO1xuICAgIH0pO1xuXG4gIGNvbnN0IHRpdGxlQ2FzZWROYW1lID0gcHJvY2Vzc2VkV29yZHMuam9pbignICcpO1xuXG4gIC8vIEZpbmFsIHJlcGxhY2VtZW50cyBmb3Igc3BlY2lhbCBjYXNlc1xuICByZXR1cm4gdGl0bGVDYXNlZE5hbWUucmVwbGFjZSgvSXBob25lL2csICdpUGhvbmUnKTtcbn07XG4iLCJpbXBvcnQgeyBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5pbXBvcnQgeyBGaWx0ZXJBdHRyaWJ1dGUgfSBmcm9tICdzcmMvY29udGV4dHMvdHlwZXMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRGaWx0ZXJPcHRpb24gfSBmcm9tICdzcmMvYXRvbXMvc2VhcmNoL3NlYXJjaEFQSSc7XG5pbXBvcnQgeyBDaGF0U2VhcmNoRmlsdGVyLCBDaGF0U2VhcmNoRmlsdGVySXRlbSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgZ2V0UHJpY2VCdWNrZXQgPSAocHJpY2U6IG51bWJlciwgYnVja2V0U2l6ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGJ1Y2tldCA9IE1hdGguZmxvb3IocHJpY2UgLyBidWNrZXRTaXplKTtcbiAgcmV0dXJuIGJ1Y2tldCAqIGJ1Y2tldFNpemU7XG59O1xuXG5jb25zdCBpc1N0cmluZ0FycmF5ID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nW10gPT4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn07XG5cbnR5cGUgRmlsdGVyU29ydEZ1bmN0aW9uID0gKGE6IENoYXRTZWFyY2hGaWx0ZXJJdGVtLCBiOiBDaGF0U2VhcmNoRmlsdGVySXRlbSkgPT4gbnVtYmVyO1xuXG5jb25zdCBzb3J0RmlsdGVyID0gKGZpbHRlckNvbmZpZzogRmlsdGVyQXR0cmlidXRlKTogRmlsdGVyU29ydEZ1bmN0aW9uID0+IHtcbiAgaWYgKGZpbHRlckNvbmZpZy50eXBlID09PSAncHJpY2UnKSB7XG4gICAgcmV0dXJuIChhLCBiKSA9PiBOdW1iZXIoYS5maWx0ZXJJdGVtSWQpIC0gTnVtYmVyKGIuZmlsdGVySXRlbUlkKTtcbiAgfVxuICBpZiAoZmlsdGVyQ29uZmlnLnR5cGUgPT09ICdkeW5hbWljJykge1xuICAgIGlmIChmaWx0ZXJDb25maWcuc29ydGluZy50eXBlID09PSAnYWxwaGFiZXRpYycpIHtcbiAgICAgIHJldHVybiAoYSwgYikgPT4gYS5kaXNwbGF5TmFtZS5sb2NhbGVDb21wYXJlKGIuZGlzcGxheU5hbWUpO1xuICAgIH1cbiAgICAvLyBTb3J0IGJ5IHRoZSBudW1iZXIgb2YgcHJvZHVjdHMsIGlmIHRoZXkgbWF0Y2gsIHNvcnQgYnkgYWxwaGFiZXRpY2FsXG4gICAgaWYgKGZpbHRlckNvbmZpZy5zb3J0aW5nLnR5cGUgPT09ICdwcm9kdWN0Q291bnQnKSB7XG4gICAgICByZXR1cm4gKGEsIGIpID0+XG4gICAgICAgIGEucHJvZHVjdENvdW50ID09PSBiLnByb2R1Y3RDb3VudFxuICAgICAgICAgID8gYS5kaXNwbGF5TmFtZS5sb2NhbGVDb21wYXJlKGIuZGlzcGxheU5hbWUpXG4gICAgICAgICAgOiBiLnByb2R1Y3RDb3VudCAtIGEucHJvZHVjdENvdW50O1xuICAgIH1cbiAgICBpZiAoZmlsdGVyQ29uZmlnLnNvcnRpbmcudHlwZSA9PT0gJ2N1c3RvbScpIHtcbiAgICAgIGNvbnN0IHNvcnRlZEtleXMgPSBmaWx0ZXJDb25maWcuc29ydGluZy5tYXA7XG4gICAgICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKHNvcnRlZEtleXNbYS5kaXNwbGF5TmFtZV0gJiYgc29ydGVkS2V5c1tiLmRpc3BsYXlOYW1lXSkge1xuICAgICAgICAgIC8vIElmIGJvdGggYXJlIGluIHRoZSBzb3J0ZWRLZXlzLCBzb3J0IGJ5IHRoZSBpbmRleFxuICAgICAgICAgIHJldHVybiBzb3J0ZWRLZXlzW2EuZGlzcGxheU5hbWVdIC0gc29ydGVkS2V5c1tiLmRpc3BsYXlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBvbmx5ICdhJyBpcyBpbiB0aGUgc29ydGVkS2V5cywgcHV0IGl0IGJlZm9yZSB0aGUgb3RoZXJcbiAgICAgICAgaWYgKHNvcnRlZEtleXNbYS5kaXNwbGF5TmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgb25seSAnYicgaXMgaW4gdGhlIHNvcnRlZEtleXMsIHB1dCBpdCBiZWZvcmUgdGhlIG90aGVyXG4gICAgICAgIGlmIChzb3J0ZWRLZXlzW2IuZGlzcGxheU5hbWVdKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbmVpdGhlciBhcmUgaW4gdGhlIHNvcnRlZEtleXMsIHNvcnQgYnkgcHJvZHVjdENvdW50XG4gICAgICAgIHJldHVybiBiLnByb2R1Y3RDb3VudCAtIGEucHJvZHVjdENvdW50O1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhYWxpZCBzZWFyY2ggZmlsdGVyIGNvbmZpZ3VyYXRpb24nKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBQcm9kdWN0RmlsdGVycyB7XG4gIHN0YXRpYyBnZXRGaWx0ZXJzRm9yUHJvZHVjdHMoXG4gICAgcHJvZHVjdHM6IFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXVtdLFxuICAgIGZpbHRlckNvbmZpZ3M6IEZpbHRlckF0dHJpYnV0ZVtdLFxuICAgIHNlbGVjdGVkRmlsdGVyT3B0aW9uczogU2VsZWN0ZWRGaWx0ZXJPcHRpb25bXSxcbiAgKTogQ2hhdFNlYXJjaEZpbHRlcltdIHtcbiAgICBpZiAoIXByb2R1Y3RzIHx8IHByb2R1Y3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcnMgPSBmaWx0ZXJDb25maWdzLm1hcCgoZmlsdGVyQ29uZmlnKSA9PlxuICAgICAgcHJvZHVjdHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgLy8gUHJpY2UgaGFzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBmaWx0ZXJzXG4gICAgICAgICAgaWYgKGZpbHRlckNvbmZpZy50eXBlID09PSAncHJpY2UnKSB7XG4gICAgICAgICAgICBjb25zdCBwcmljZUJ1Y2tldCA9IGdldFByaWNlQnVja2V0KFxuICAgICAgICAgICAgICBwcm9kdWN0LnNhbGVQcmljZSA/PyBwcm9kdWN0Lm9yaWdpbmFsUHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgZmlsdGVyQ29uZmlnLmJ1Y2tldFNpemUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGFjYy5tYXBbcHJpY2VCdWNrZXRdID8/IHtcbiAgICAgICAgICAgICAgZmlsdGVySXRlbUlkOiBwcmljZUJ1Y2tldCxcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAkJHtwcmljZUJ1Y2tldH0tJCR7cHJpY2VCdWNrZXQgKyBmaWx0ZXJDb25maWcuYnVja2V0U2l6ZX1gLFxuICAgICAgICAgICAgICBwcm9kdWN0Q291bnQ6IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWNjLm1hcFtwcmljZUJ1Y2tldF0gPSB7IC4uLmN1cnJlbnQsIHByb2R1Y3RDb3VudDogY3VycmVudC5wcm9kdWN0Q291bnQgKyAxIH07XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBcImF0dHJpYnV0ZVwiIGlzIGFuIGFycmF5IG9mIHZhbHVlc1xuICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlcyA9XG4gICAgICAgICAgICAocHJvZHVjdC5maWx0ZXJzICYmIHByb2R1Y3QuZmlsdGVycz8uW2ZpbHRlckNvbmZpZy5hdHRyaWJ1dGVdKSA/PyBbXTtcbiAgICAgICAgICBpZiAoaXNTdHJpbmdBcnJheShhdHRyaWJ1dGVWYWx1ZXMpKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGFjYy5tYXBbbm9ybWFsaXplZFZhbF0gPz8ge1xuICAgICAgICAgICAgICAgIGZpbHRlckl0ZW1JZDogbm9ybWFsaXplZFZhbCxcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUodmFsKSwgLy8gS2VlcCBvcmlnaW5hbCBjYXNlIGZvciBkaXNwbGF5XG4gICAgICAgICAgICAgICAgcHJvZHVjdENvdW50OiAwLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhY2MubWFwW25vcm1hbGl6ZWRWYWxdID0geyAuLi5jdXJyZW50LCBwcm9kdWN0Q291bnQ6IGN1cnJlbnQucHJvZHVjdENvdW50ICsgMSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZpbHRlckNvbmZpZyxcbiAgICAgICAgICBtYXA6IHt9IGFzIFJlY29yZDxzdHJpbmcsIENoYXRTZWFyY2hGaWx0ZXJJdGVtPixcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkRmlsdGVyczogQ2hhdFNlYXJjaEZpbHRlcltdID0gZmlsdGVycy5tYXAoKHsgZmlsdGVyQ29uZmlnLCBtYXAgfSkgPT4gKHtcbiAgICAgIGZpbHRlcklkOiBmaWx0ZXJDb25maWcuZmlsdGVySWQsXG4gICAgICBkaXNwbGF5TmFtZTogZmlsdGVyQ29uZmlnLmRpc3BsYXlOYW1lLFxuICAgICAgaXRlbXM6IE9iamVjdC52YWx1ZXMobWFwKVxuICAgICAgICAubWFwKChmaWx0ZXIpID0+ICh7XG4gICAgICAgICAgZmlsdGVySXRlbUlkOiBmaWx0ZXIuZmlsdGVySXRlbUlkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBmaWx0ZXIuZGlzcGxheU5hbWUsXG4gICAgICAgICAgcHJvZHVjdENvdW50OiBmaWx0ZXIucHJvZHVjdENvdW50LFxuICAgICAgICAgIGlzU2VsZWN0ZWQ6XG4gICAgICAgICAgICBzZWxlY3RlZEZpbHRlck9wdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLmlkID09PSBgJHtmaWx0ZXJDb25maWcuZmlsdGVySWR9OiR7ZmlsdGVyLmZpbHRlckl0ZW1JZH1gLFxuICAgICAgICAgICAgKSA/PyBmYWxzZSxcbiAgICAgICAgfSkpXG4gICAgICAgIC5zb3J0KHNvcnRGaWx0ZXIoZmlsdGVyQ29uZmlnKSksXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIFsuLi50cmFuc2Zvcm1lZEZpbHRlcnNdO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlclByb2R1Y3RzKFxuICAgIHByb2R1Y3RzOiBQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ11bXSxcbiAgICBmaWx0ZXJDb25maWdzOiBGaWx0ZXJBdHRyaWJ1dGVbXSxcbiAgICBzZWxlY3RlZEZpbHRlck9wdGlvbnM6IFNlbGVjdGVkRmlsdGVyT3B0aW9uW10sXG4gICAgYWRkaXRpdmVEeW5hbWljRmlsdGVycyA9IGZhbHNlLCAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGJlaGF2aW9yIHdoZXJlIHN0YWNraW5nIGZpbHRlcnMgaGFzIE9SIGxvZ2ljLlxuICApIHtcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlcnMgPSBmaWx0ZXJDb25maWdzXG4gICAgICAubWFwKChmaWx0ZXJDb25maWcpID0+ICh7XG4gICAgICAgIGZpbHRlckNvbmZpZyxcbiAgICAgICAgaGFzU2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZEZpbHRlck9wdGlvbnMuc29tZShcbiAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uZmlsdGVySWQgPT09IGZpbHRlckNvbmZpZy5maWx0ZXJJZCxcbiAgICAgICAgKSxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcigoeyBoYXNTZWxlY3RlZE9wdGlvbnMgfSkgPT4gaGFzU2VsZWN0ZWRPcHRpb25zKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLmxlbmd0aCA9PT0gMFxuICAgICAgPyBwcm9kdWN0c1xuICAgICAgOiBwcm9kdWN0cy5maWx0ZXIoKHByb2R1Y3QpID0+XG4gICAgICAgICAgc2VsZWN0ZWRGaWx0ZXJzLnJlZHVjZSgoYWNjLCBzZWxlY3RlZEZpbHRlcikgPT4ge1xuICAgICAgICAgICAgLy8gRmluZGluZyBvbmUgZmFsc2UgcmVtb3ZlcyB0aGUgcHJvZHVjdFxuICAgICAgICAgICAgaWYgKCFhY2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByaWNlIGlzIHNwZWNpYWxcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5maWx0ZXJDb25maWcudHlwZSA9PT0gJ3ByaWNlJykge1xuICAgICAgICAgICAgICBjb25zdCBwcmljZUJ1Y2tldCA9IGdldFByaWNlQnVja2V0KFxuICAgICAgICAgICAgICAgIHByb2R1Y3Quc2FsZVByaWNlID8/IHByb2R1Y3Qub3JpZ2luYWxQcmljZSA/PyAwLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRmlsdGVyLmZpbHRlckNvbmZpZy5idWNrZXRTaXplLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzUHJpY2VGaWx0ZXIgPSBzZWxlY3RlZEZpbHRlck9wdGlvbnMuc29tZShcbiAgICAgICAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09IGBwcmljZToke3ByaWNlQnVja2V0fWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmICghbWF0Y2hlc1ByaWNlRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5maWx0ZXJDb25maWcudHlwZSA9PT0gJ2R5bmFtaWMnKSB7XG4gICAgICAgICAgICAgIC8vIGR5bmFtaWMgaXMgbWlzbGVhZGluZyBoZXJlLiBJdHMgbm90IGp1c3QgZHluYW1pYyBmaWx0ZXJzLCBidXQgc3RhdGljIGZpbHRlcnMgYmVjYXVzZSB0aGUgY29uZmlnIGNvdW50cyBzdGF0aWMgZmlsdGVycyBhcyB0eXBlOiBkeW5hbWljLlxuICAgICAgICAgICAgICBjb25zdCB7IGZpbHRlcklkLCBhdHRyaWJ1dGUgfSA9IHNlbGVjdGVkRmlsdGVyLmZpbHRlckNvbmZpZztcbiAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlVmFsdWVzID0gcHJvZHVjdC5maWx0ZXJzPy5bYXR0cmlidXRlXTtcblxuICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nQXJyYXkoYXR0cmlidXRlVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGlzRHluYW1pY0ZpbHRlciA9IHNlbGVjdGVkRmlsdGVyLmZpbHRlckNvbmZpZy5hdHRyaWJ1dGUgPT09ICdkeW5hbWljJzsgLy8gVHJ1ZSBkeW5hbWljIGZpbHRlcnMgKHRoZSBvbmVzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHNlYXJjaCBpbnB1dClcbiAgICAgICAgICAgICAgY29uc3QgaXNTdWJ0cmFjdGl2ZUxvZ2ljID0gaXNEeW5hbWljRmlsdGVyICYmICFhZGRpdGl2ZUR5bmFtaWNGaWx0ZXJzO1xuXG4gICAgICAgICAgICAgIGlmIChpc1N1YnRyYWN0aXZlTG9naWMpIHtcbiAgICAgICAgICAgICAgICAvLyBBTkQgbG9naWMgZm9yIHN1YnRyYWN0aXZlIGR5bmFtaWMgZmlsdGVycyBhbmQgYmV0d2VlbiBzdGF0aWMgZmlsdGVyIGNhdGVnb3JpZXNcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbnNGb3JUaGlzRmlsdGVyID0gc2VsZWN0ZWRGaWx0ZXJPcHRpb25zXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5maWx0ZXJJZCA9PT0gZmlsdGVySWQpXG4gICAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi5maWx0ZXJJdGVtSWQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBoYXNBbGxTZWxlY3RlZFZhbHVlcyA9IHNlbGVjdGVkT3B0aW9uc0ZvclRoaXNGaWx0ZXIuZXZlcnkoKHNlbGVjdGVkVmFsdWUpID0+XG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMuc29tZSgodmFsKSA9PiB2YWwudG9Mb3dlckNhc2UoKSA9PT0gc2VsZWN0ZWRWYWx1ZSksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmICghaGFzQWxsU2VsZWN0ZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT1IgbG9naWMgZm9yIHN0YXRpYyBmaWx0ZXJzIGluIHRoZSBzaWRlYmFyIHdpdGhpbiBhIGNhdGVnb3J5LlxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGVWYWx1ZXMuc29tZSgodmFsKSA9PlxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gYCR7ZmlsdGVySWR9OiR7dmFsLnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sIHRydWUpLFxuICAgICAgICApO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBQcm9kdWN0U29ydGluZyB7XG4gIEZFQVRVUkVEID0gJ2ZlYXR1cmVkJyxcbiAgUFJJQ0VfQVNDID0gJ3ByaWNlX2FzYycsXG4gIFBSSUNFX0RFU0MgPSAncHJpY2VfZGVzYycsXG59XG5cbmV4cG9ydCBjb25zdCBQcm9kdWN0U29ydGluZ05hbWVzID0ge1xuICBbUHJvZHVjdFNvcnRpbmcuRkVBVFVSRURdOiAnRmVhdHVyZWQnLFxuICBbUHJvZHVjdFNvcnRpbmcuUFJJQ0VfQVNDXTogJ1ByaWNlIExvdyB0byBIaWdoJyxcbiAgW1Byb2R1Y3RTb3J0aW5nLlBSSUNFX0RFU0NdOiAnUHJpY2UgSGlnaCB0byBMb3cnLFxufTtcblxuZXhwb3J0IHR5cGUgQ2hhdFNlYXJjaFN0YXRlVHlwZSA9ICdlbnRyeXBvaW50JyB8ICdpbml0aWFsaXppbmctc2VhcmNoJyB8ICdwcm9kdWN0LXBhZ2UnO1xuXG5leHBvcnQgdHlwZSBDaGF0U2VhcmNoRmlsdGVyID0ge1xuICBmaWx0ZXJJZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBpdGVtczogQ2hhdFNlYXJjaEZpbHRlckl0ZW1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIENoYXRTZWFyY2hGaWx0ZXJJdGVtID0ge1xuICBmaWx0ZXJJdGVtSWQ6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgcHJvZHVjdENvdW50OiBudW1iZXI7XG4gIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRTZWFyY2hTb3J0UHJvcHMge1xuICBvcHRpb25zOiBQcm9kdWN0U29ydGluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXRTZWFyY2hTb3J0TW9kYWxQcm9wcyBleHRlbmRzIENoYXRTZWFyY2hTb3J0UHJvcHMge1xuICBvcGVuOiBib29sZWFuO1xuICBoYW5kbGVQb3B1cFN0YXRlOiAoc3RhdGU6IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydE9wdGlvbiB7XG4gIHZhbHVlOiBQcm9kdWN0U29ydGluZztcbiAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgb25TZWxlY3Q6IChvcHRpb246IFByb2R1Y3RTb3J0aW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZW51bSBDaGF0U2VhcmNoU29ydE92ZXJyaWRlcyB7XG4gIERFU0tUT1BfRklMVEVSX0NPTlRBSU5FUiA9ICdzcGlmZnktY2hhdC1zZWFyY2gtZmlsdGVyLWNvbnRhaW5lcicsXG4gIERFU0tUT1BfRklMVEVSX1NFTEVDVF9DT01QT05FTlQgPSAnc3BpZmZ5LWNoYXQtc2VhcmNoLWZpbHRlci1zZWxlY3QtY29tcG9uZW50JyxcbiAgREVTS1RPUF9GSUxURVJfU0VMRUNUX0lDT04gPSAnc3BpZmZ5LWNoYXQtc2VhcmNoLWZpbHRlci1zZWxlY3QtaWNvbicsXG4gIE1PQklMRV9GSUxURVJfQlVUVE9OID0gJ3NwaWZmeS1jaGF0LXNlYXJjaC1maWx0ZXItYnV0dG9uJyxcbiAgTU9CSUxFX0ZJTFRFUl9NT0RBTF9DT05UQUlORVIgPSAnc3BpZmZ5LWNoYXQtc2VhcmNoLWZpbHRlci1tb2RhbC1jb250YWluZXInLFxuICBNT0JJTEVfRklMVEVSX01PREFMX0hFQURFUiA9ICdzcGlmZnktY2hhdC1zZWFyY2gtZmlsdGVyLW1vZGFsLWhlYWRlcicsXG4gIE1PQklMRV9GSUxURVJfTU9EQUxfU0VMRUNUSU9OID0gJ3NwaWZmeS1jaGF0LXNlYXJjaC1maWx0ZXItbW9kYWwtc2VsZWN0aW9uJyxcbiAgTU9CSUxFX0ZJTFRFUl9NT0RBTF9PUFRJT04gPSAnc3BpZmZ5LWNoYXQtc2VhcmNoLWZpbHRlci1tb2RhbC1vcHRpb24nLFxuICBNT0JJTEVfRklMVEVSX01PREFMX09QVElPTl9QSUxMID0gJ3NwaWZmeS1jaGF0LXNlYXJjaC1maWx0ZXItbW9kYWwtb3B0aW9uLXBpbGwnLFxuICBNT0JJTEVfRklMVEVSX01PREFMX09QVElPTl9ERVNDUklQVElPTiA9ICdzcGlmZnktY2hhdC1zZWFyY2gtZmlsdGVyLW1vZGFsLW9wdGlvbi1kZXNjJyxcbiAgTU9CSUxFX0ZJTFRFUl9NT0RBTF9BUFBMWV9CVVRUT04gPSAnc3BpZmZ5LWNoYXQtc2VhcmNoLWZpbHRlci1tb2RhbC1hcHBseS1idXR0b24nLFxufVxuIiwiaW1wb3J0IHsgUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgUHJvZHVjdFNvcnRpbmcgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFByb2R1Y3RTb3J0ZXIge1xuICBzdGF0aWMgc29ydChwcm9kdWN0czogUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddW10sIHNvcnRpbmc6IFByb2R1Y3RTb3J0aW5nKSB7XG4gICAgc3dpdGNoIChzb3J0aW5nKSB7XG4gICAgICBjYXNlIFByb2R1Y3RTb3J0aW5nLlBSSUNFX0FTQzpcbiAgICAgICAgcmV0dXJuIFsuLi5wcm9kdWN0c10uc29ydChcbiAgICAgICAgICAocDEsIHAyKSA9PlxuICAgICAgICAgICAgKHAxLnNhbGVQcmljZSA/PyBwMS5vcmlnaW5hbFByaWNlID8/IDApIC0gKHAyLnNhbGVQcmljZSA/PyBwMi5vcmlnaW5hbFByaWNlID8/IDApLFxuICAgICAgICApO1xuXG4gICAgICBjYXNlIFByb2R1Y3RTb3J0aW5nLlBSSUNFX0RFU0M6XG4gICAgICAgIHJldHVybiBbLi4ucHJvZHVjdHNdLnNvcnQoXG4gICAgICAgICAgKHAxLCBwMikgPT5cbiAgICAgICAgICAgIChwMi5zYWxlUHJpY2UgPz8gcDIub3JpZ2luYWxQcmljZSA/PyAwKSAtIChwMS5zYWxlUHJpY2UgPz8gcDEub3JpZ2luYWxQcmljZSA/PyAwKSxcbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHByb2R1Y3RzO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tIFwiQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50XCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IGF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7XG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VSb2xlLFxuICBNZXNzYWdlVHlwZSxcbiAgUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyxcbn0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHNcIjtcbmltcG9ydCB7XG4gIG1lc3NhZ2VzQXRvbSxcbiAgcmVwbHlFdmVudENhdGVnb3J5QXRvbSxcbiAgdXNlckhhc1JlcGxpZWRBdG9tLFxuICB1c2VyUXVlcnlBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL2NoYXRcIjtcbmltcG9ydCB7IHF1ZXVlVXNlckV2ZW50QXRvbSB9IGZyb20gXCIuLi9jaGF0L21lc3NhZ2VRdWV1ZVwiO1xuaW1wb3J0IHsgbmV3T3JnQ29uZmlnQXRvbSB9IGZyb20gXCIuLi9vcmdcIjtcbmltcG9ydCB7IFByb2R1Y3RGaWx0ZXJzIH0gZnJvbSBcIi4vcHJvZHVjdEZpbHRlcnNcIjtcbmltcG9ydCB7IFByb2R1Y3RTb3J0ZXIgfSBmcm9tIFwiLi9wcm9kdWN0U29ydGVyXCI7XG5pbXBvcnQgeyBDaGF0U2VhcmNoU3RhdGVUeXBlLCBQcm9kdWN0U29ydGluZyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIE5PVEU6XG4vLyBUaGlzIGlzIGEgbGVnYWN5IHZlcnNpb24gb2Ygc2VhcmNoIHRoYXQgbmVlZHMgdG8gYmUgZGVjb3VwbGVkIGFuZCByZW1vdmVkLlxuLy8gdGhlIG5ldyBzZWFyY2gudHMgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBpcyBsaWtlbHkgd2hhdCB5b3UncmUgbG9va2luZyBmb3IuXG5cbmV4cG9ydCBjb25zdCBjaGF0U2VhcmNoU3RhdGVBdG9tID0gYXRvbTxDaGF0U2VhcmNoU3RhdGVUeXBlPihcImVudHJ5cG9pbnRcIik7XG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaEhhc1Byb2R1Y3RzQXRvbSA9IGF0b208Ym9vbGVhbj4oZmFsc2UpO1xuZXhwb3J0IGNvbnN0IGNoYXRTZWFyY2hQcm9kdWN0U29ydGluZ0F0b20gPSBhdG9tPFByb2R1Y3RTb3J0aW5nPihcbiAgUHJvZHVjdFNvcnRpbmcuRkVBVFVSRURcbik7XG5cbmNvbnN0IGZpbHRlclByb2R1Y3RMaXN0ID0gKG1lc3NhZ2U6IE1lc3NhZ2UpID0+XG4gIG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuUHJvZHVjdCAmJiBtZXNzYWdlLm1ldGFkYXRhLmlzRm9yR3JpZCA9PT0gdHJ1ZTtcbmNvbnN0IGZpbHRlckZpbHRlckxpc3QgPSAobWVzc2FnZTogTWVzc2FnZSkgPT5cbiAgbWVzc2FnZS50eXBlID09PSBNZXNzYWdlVHlwZS5Qcm9kdWN0U2VhcmNoRmlsdGVyO1xuXG5leHBvcnQgdHlwZSBDaGF0U2VhcmNoVHVybiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgZ2VuZXJhdGVkUXVlcnk/OiBzdHJpbmc7XG4gIHByb2R1Y3RDb3VudDogbnVtYmVyO1xuICBwcm9kdWN0TGlzdDogUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlc1tcImF0dHJpYnV0ZXNcIl1bXTtcbiAgZmlsdGVyTGlzdDogc3RyaW5nW107XG4gIG1lc3NhZ2VzOiBNZXNzYWdlW107XG59O1xuXG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaElzTG9hZGluZ0F0b20gPSBhdG9tKGZhbHNlKTtcblxuY29uc3QgYnVpbGRDaGF0U2VhcmNoVHVybiA9IChcbiAgbWVzc2FnZXM6IE1lc3NhZ2VbXVxuKTogW3N0cmluZywgQ2hhdFNlYXJjaFR1cm5dIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHF1ZXJ5TWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoXG4gICAgKG1lc3NhZ2UpID0+IG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaFxuICApO1xuICBpZiAoIXF1ZXJ5TWVzc2FnZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHsgZ2VuZXJhdGVkUXVlcnksIHByb2R1Y3RDb3VudCB9ID0gcXVlcnlNZXNzYWdlLm1ldGFkYXRhID8/IHt9O1xuICBjb25zdCBwcm9kdWN0TGlzdCA9IG1lc3NhZ2VzXG4gICAgLmZpbHRlcihmaWx0ZXJQcm9kdWN0TGlzdClcbiAgICAubWFwKChtZXNzYWdlKSA9PiAobWVzc2FnZSBhcyBhbnkpLm1ldGFkYXRhKTtcbiAgY29uc3QgZmlsdGVyTGlzdCA9IG1lc3NhZ2VzXG4gICAgLmZpbHRlcihmaWx0ZXJGaWx0ZXJMaXN0KVxuICAgIC5tYXAoKG1lc3NhZ2UpID0+IG1lc3NhZ2UubWV0YWRhdGEuZmlsdGVyTmFtZSk7XG4gIHJldHVybiBbXG4gICAgcXVlcnlNZXNzYWdlLmlkLFxuICAgIHtcbiAgICAgIGlkOiBxdWVyeU1lc3NhZ2UuaWQsXG4gICAgICBnZW5lcmF0ZWRRdWVyeSxcbiAgICAgIHByb2R1Y3RDb3VudDogcHJvZHVjdENvdW50IHx8IHByb2R1Y3RMaXN0Lmxlbmd0aCxcbiAgICAgIHByb2R1Y3RMaXN0LFxuICAgICAgZmlsdGVyTGlzdCxcbiAgICAgIG1lc3NhZ2VzLFxuICAgIH0sXG4gIF07XG59O1xuXG5jb25zdCBjaGF0U2VhcmNoRmlsdGVyQ29uZmlnQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICBjb25zdCBuZXdPcmdDb25maWcgPSBnZXQobmV3T3JnQ29uZmlnQXRvbSk7XG4gIHJldHVybiAoXG4gICAgbmV3T3JnQ29uZmlnPy5mcm9udGVuZENvbmZpZz8udWlDb25maWdzPy5zZWFyY2hDb25maWc/LnNlYXJjaEZpbHRlckNvbmZpZyB8fFxuICAgIFtdXG4gICk7XG59KTtcblxuY29uc3Qgc2VhcmNoTWFwQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICBjb25zdCBtZXNzYWdlcyA9IGdldChtZXNzYWdlc0F0b20pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIG1lc3NhZ2VzLm1hcChidWlsZENoYXRTZWFyY2hUdXJuKS5maWx0ZXIoKHYpID0+IHYgIT09IG51bGwpXG4gICk7XG59KTtcblxuY29uc3QgaW50ZXJuYWxDaGF0U2VhcmNoUGFyYW1zQXRvbSA9IGF0b208e1xuICBpZDogc3RyaW5nIHwgbnVsbDtcbiAgcXVlcnk6IHN0cmluZyB8IG51bGw7XG59Pih7XG4gIGlkOiBudWxsLFxuICBxdWVyeTogbnVsbCxcbn0pO1xuXG4vLyBTZWxlY3RlZCBmaWx0ZXIgb3B0aW9ucyB3aXRoIGNvbXBvdW5kIG9iamVjdHMgZm9yIGJldHRlciB0eXBlIHNhZmV0eSBhbmQgZGlzcGxheVxuZXhwb3J0IHR5cGUgU2VsZWN0ZWRDaGF0U2VhcmNoRmlsdGVyT3B0aW9uID0ge1xuICBpZDogc3RyaW5nOyAvLyBcImZpbHRlcklkOmZpbHRlckl0ZW1JZFwiIC0gbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZm9yIGNvbXBhcmlzb25zXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGZpbHRlcklkOiBzdHJpbmc7IC8vIEZpbHRlciBjYXRlZ29yeVxuICBmaWx0ZXJJdGVtSWQ6IHN0cmluZzsgLy8gRmlsdGVyIHZhbHVlXG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zQXRvbSA9IGF0b208U2VsZWN0ZWRDaGF0U2VhcmNoRmlsdGVyT3B0aW9uW10+KFxuICBbXVxuKTtcblxuZXhwb3J0IGNvbnN0IGFkZGl0aXZlRHluYW1pY0ZpbHRlcnNBdG9tID0gYXRvbSgoZ2V0KSA9PiB7XG4gIGNvbnN0IG5ld09yZ0NvbmZpZyA9IGdldChuZXdPcmdDb25maWdBdG9tKTtcbiAgcmV0dXJuIChcbiAgICBuZXdPcmdDb25maWc/LmZyb250ZW5kQ29uZmlnPy51aUNvbmZpZ3M/LnNlYXJjaENvbmZpZ1xuICAgICAgPy5hZGRpdGl2ZUR5bmFtaWNGaWx0ZXJzID8/IGZhbHNlXG4gICk7XG59KTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNoYXRTZWFyY2hGaWx0ZXJPcHRpb24gPSAoXG4gIGZpbHRlcklkOiBzdHJpbmcsXG4gIGZpbHRlckl0ZW1JZDogc3RyaW5nLFxuICBkaXNwbGF5TmFtZTogc3RyaW5nXG4pOiBTZWxlY3RlZENoYXRTZWFyY2hGaWx0ZXJPcHRpb24gPT4gKHtcbiAgaWQ6IGAke2ZpbHRlcklkfToke2ZpbHRlckl0ZW1JZH1gLFxuICBkaXNwbGF5TmFtZSxcbiAgZmlsdGVySWQsXG4gIGZpbHRlckl0ZW1JZCxcbn0pO1xuXG5jb25zdCBoYW5kbGVTZWFyY2hBdG9tID0gYXRvbShudWxsLCAoZ2V0LCBzZXQsIG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcbiAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gTWVzc2FnZVR5cGUuU2VhcmNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcXVlcnlTZWFyY2ggPSBtZXNzYWdlLm1ldGFkYXRhLnNlYXJjaFRlcm07XG5cbiAgc2V0KHJlcGx5RXZlbnRDYXRlZ29yeUF0b20sIFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaCk7XG4gIHNldCh1c2VyUXVlcnlBdG9tLCBxdWVyeVNlYXJjaCk7XG4gIHNldChtZXNzYWdlc0F0b20sIFsuLi5nZXQobWVzc2FnZXNBdG9tKSwgW21lc3NhZ2VdXSk7XG4gIHNldCh1c2VySGFzUmVwbGllZEF0b20sIHRydWUpO1xuXG4gIHNldChxdWV1ZVVzZXJFdmVudEF0b20sIHtcbiAgICBldmVudElkOiBtZXNzYWdlLmlkLFxuICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gsXG4gICAgY3JlYXRlZEF0OiBtZXNzYWdlLmNyZWF0ZWRBdCxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBzZWFyY2hUZXJtOiBtZXNzYWdlLm1ldGFkYXRhLnNlYXJjaFRlcm0sXG4gICAgICBzZWxlY3RlZEZpbHRlcnM6IG1lc3NhZ2UubWV0YWRhdGEuc2VsZWN0ZWRGaWx0ZXJzLFxuICAgIH0sXG4gIH0pO1xufSk7XG5cbi8vIFRoaXMgaW50ZXJuYWwgYXRvbSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBzZWFyY2ggcGFyYW1zXG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaFBhcmFtc0F0b20gPSBhdG9tKFxuICAoZ2V0KSA9PiBnZXQoaW50ZXJuYWxDaGF0U2VhcmNoUGFyYW1zQXRvbSksXG4gIChfLCBzZXQsIHZhbHVlOiB7IGlkOiBzdHJpbmcgfCBudWxsOyBxdWVyeTogc3RyaW5nIHwgbnVsbCB9KSA9PiB7XG4gICAgc2V0KGludGVybmFsQ2hhdFNlYXJjaFBhcmFtc0F0b20sIHZhbHVlKTtcbiAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IGNoYXRTZWFyY2hRdWVyeUF0b20gPSBhdG9tKFxuICAoZ2V0KSA9PiBnZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20pPy5xdWVyeSA/PyBudWxsLFxuICAoZ2V0LCBzZXQsIHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gZ2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tKTtcbiAgICBzZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20sIHsgaWQ6IHNlYXJjaFBhcmFtcy5pZCwgcXVlcnk6IHZhbHVlIH0pO1xuICB9XG4pO1xuXG5leHBvcnQgY29uc3QgY2hhdFNlYXJjaElkQXRvbSA9IGF0b20oXG4gIChnZXQpID0+IGdldChjaGF0U2VhcmNoUGFyYW1zQXRvbSk/LmlkID8/IG51bGwsXG4gIChnZXQsIHNldCwgdmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBnZXQoY2hhdFNlYXJjaFBhcmFtc0F0b20pO1xuICAgIHNldChjaGF0U2VhcmNoUGFyYW1zQXRvbSwgeyBpZDogdmFsdWUsIHF1ZXJ5OiBzZWFyY2hQYXJhbXMucXVlcnkgfSk7XG4gIH1cbik7XG5cbmV4cG9ydCBjb25zdCBDaGF0U2VhcmNoVHVybkF0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgY29uc3Qgc2VhcmNoRmlsdGVyQ29uZmlnID0gZ2V0KGNoYXRTZWFyY2hGaWx0ZXJDb25maWdBdG9tKTtcbiAgY29uc3Qgc2VhcmNoTWFwID0gZ2V0KHNlYXJjaE1hcEF0b20pO1xuICBjb25zdCBjaGF0U2VhcmNoSWQgPSBnZXQoY2hhdFNlYXJjaElkQXRvbSk7XG4gIGlmICghY2hhdFNlYXJjaElkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgQ2hhdFNlYXJjaFR1cm4gPSBzZWFyY2hNYXBbY2hhdFNlYXJjaElkXTtcbiAgaWYgKCFDaGF0U2VhcmNoVHVybikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHByb2R1Y3RTb3J0aW5nID0gZ2V0KGNoYXRTZWFyY2hQcm9kdWN0U29ydGluZ0F0b20pO1xuICBjb25zdCBzZWxlY3RlZEZpbHRlck9wdGlvbnMgPSBnZXQoc2VsZWN0ZWRGaWx0ZXJPcHRpb25zQXRvbSk7XG4gIGNvbnN0IGFkZGl0aXZlRHluYW1pY0ZpbHRlcnMgPSBnZXQoYWRkaXRpdmVEeW5hbWljRmlsdGVyc0F0b20pO1xuICBjb25zdCBmaWx0ZXJlZFByb2R1Y3RzID0gUHJvZHVjdEZpbHRlcnMuZmlsdGVyUHJvZHVjdHMoXG4gICAgQ2hhdFNlYXJjaFR1cm4ucHJvZHVjdExpc3QsXG4gICAgc2VhcmNoRmlsdGVyQ29uZmlnLFxuICAgIHNlbGVjdGVkRmlsdGVyT3B0aW9ucyxcbiAgICBhZGRpdGl2ZUR5bmFtaWNGaWx0ZXJzXG4gICk7XG5cbiAgY29uc3QgZmlsdGVyZWRBbmRTb3J0ZWRQcm9kdWN0cyA9IFByb2R1Y3RTb3J0ZXIuc29ydChcbiAgICBmaWx0ZXJlZFByb2R1Y3RzLFxuICAgIHByb2R1Y3RTb3J0aW5nXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zZWFyY2hNYXBbY2hhdFNlYXJjaElkXSxcbiAgICBwcm9kdWN0TGlzdDogZmlsdGVyZWRBbmRTb3J0ZWRQcm9kdWN0cyxcbiAgICBwcm9kdWN0Q291bnQ6IGZpbHRlcmVkQW5kU29ydGVkUHJvZHVjdHMubGVuZ3RoLFxuICB9O1xufSk7XG5cbi8vIFRPRE86IFdvcmsgb24gZGVwcmVjYXRpbmcgdGhpcyBhdG9tIGluIGZhdm9yIG9mIHVzaW5nIENoYXRTZWFyY2hUdXJuQXRvbSBkaXJlY3RseVxuZXhwb3J0IGNvbnN0IGNoYXRTZWFyY2hQcm9kdWN0cyA9IGF0b20oKGdldCkgPT4ge1xuICBjb25zdCBDaGF0U2VhcmNoVHVybiA9IGdldChDaGF0U2VhcmNoVHVybkF0b20pO1xuICByZXR1cm4gQ2hhdFNlYXJjaFR1cm4/LnByb2R1Y3RMaXN0ID8/IFtdO1xufSk7XG5cbmV4cG9ydCBjb25zdCBjaGF0U2VhcmNoRmlsdGVyc0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgY29uc3Qgc2VhcmNoRmlsdGVyQ29uZmlnID0gZ2V0KGNoYXRTZWFyY2hGaWx0ZXJDb25maWdBdG9tKTtcbiAgY29uc3Qgc2VhcmNoTWFwID0gZ2V0KHNlYXJjaE1hcEF0b20pO1xuICBjb25zdCBjaGF0U2VhcmNoSWQgPSBnZXQoY2hhdFNlYXJjaElkQXRvbSk7XG5cbiAgaWYgKGNoYXRTZWFyY2hJZCAmJiBzZWFyY2hNYXBbY2hhdFNlYXJjaElkXSkge1xuICAgIGNvbnN0IHByb2R1Y3RzID0gc2VhcmNoTWFwW2NoYXRTZWFyY2hJZF0ucHJvZHVjdExpc3Q7XG4gICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zID0gZ2V0KHNlbGVjdGVkRmlsdGVyT3B0aW9uc0F0b20pO1xuICAgIHJldHVybiBQcm9kdWN0RmlsdGVycy5nZXRGaWx0ZXJzRm9yUHJvZHVjdHMoXG4gICAgICBwcm9kdWN0cyxcbiAgICAgIHNlYXJjaEZpbHRlckNvbmZpZyxcbiAgICAgIHNlbGVjdGVkRmlsdGVyT3B0aW9uc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIFtdO1xufSk7XG5cbi8vIEZvciBzZWFyY2ggd2UgdXNlIHRoZSBmb2xsb3dpbmcgcXVlcnkgcGFyYW1zOlxuLy8gZXM6IHRydWUgLSB0aGlzIGluZGljYXRlcyB0aGF0IHdlIGFyZSBpbiBhIHNlYXJjaCBzdGF0ZVxuLy8gZXNxOiBxdWVyeSAtIHRoaXMgaXMgdGhlIGN1cnJlbnQgc2VhcmNoIHF1ZXJ5XG4vLyBlc2k6IHNlYXJjaCBpZCAtIHRoaXMgaXMgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHNlYXJjaCByZXN1bHRzIHRoYXQgd2UgYXJlIGRpc3BsYXlpbmcuIEl0IGlzIHB1bGxlZCBmcm9tIHRoZSBtZXNzYWdlIGlkIGZyb20gdGhlIHR1cm4gdGhhdCBpbmNsdWRlcyB0aGUgc2VhcmNoIHJlc3VsdHNcblxuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IChxdWVyeTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzXCIsIFwidHJ1ZVwiKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJlc3FcIiwgcXVlcnkpO1xuICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIFwiXCIsIHVybCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2VhcmNoUGFyYW1zQXRvbSA9IGF0b20oKCkgPT4ge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICByZXR1cm4ge1xuICAgIGVzOiBwYXJhbXMuZ2V0KFwiZXNcIiksXG4gICAgZXNxOiBwYXJhbXMuZ2V0KFwiZXNxXCIpLFxuICB9O1xufSk7XG5cbmV4cG9ydCBjb25zdCBpbml0aWF0ZUNoYXRTZWFyY2hBdG9tID0gYXRvbShudWxsLCAoXywgc2V0LCBxdWVyeTogc3RyaW5nKSA9PiB7XG4gIHNldChjaGF0U2VhcmNoSXNMb2FkaW5nQXRvbSwgdHJ1ZSk7XG4gIC8vIFVwZGF0ZSBVUkwgYW5kIG1hbnVhbGx5IHRyaWdnZXIgc3RhdGUgY2hhbmdlIChzaW5jZSBwdXNoU3RhdGUgZG9lc24ndCB0cmlnZ2VyIHBvcHN0YXRlKVxuICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJlc1wiLCBcInRydWVcIik7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNxXCIsIHF1ZXJ5KTtcbiAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHt9LCBcIlwiLCB1cmwpO1xuXG4gIC8vIE1hbnVhbGx5IHRyaWdnZXIgcGFnZSB2YXJpYW50IHJlLWV2YWx1YXRpb24gYnkgZGlzcGF0Y2hpbmcgYSBwb3BzdGF0ZSBldmVudFxuICAvLyBUaGlzIGVuc3VyZXMgdGhlIHBhZ2UgdmFyaWFudCBzeXN0ZW0gZGV0ZWN0cyB0aGUgVVJMIGNoYW5nZSBhbmQgbW91bnRzIHNlYXJjaCByZXN1bHRzXG4gIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBQb3BTdGF0ZUV2ZW50KFwicG9wc3RhdGVcIiwgeyBzdGF0ZToge30gfSkpO1xuXG4gIHNldChjaGF0U2VhcmNoUGFyYW1zQXRvbSwgeyBpZDogbnVsbCwgcXVlcnkgfSk7XG4gIHNldChoYW5kbGVTZWFyY2hBdG9tLCB7XG4gICAgaWQ6IHV1aWQoKSxcbiAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlNlYXJjaCxcbiAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICBtZXRhZGF0YToge1xuICAgICAgc2VhcmNoVGVybTogcXVlcnksXG4gICAgICAvLyBFbmFibGluZyB0aGlzIHdpbGwgZW5hYmxlIHRoZSBuZXcgYmFja2VuZCBzZWFyY2hcbiAgICAgIHNlbGVjdGVkRmlsdGVyczogW10sXG4gICAgfSxcbiAgfSk7XG59KTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZVNlYXJjaFJlc3VsdHNBdG9tID0gYXRvbShcbiAgbnVsbCxcbiAgKGdldCwgc2V0LCBtZXNzYWdlOiBNZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKCFtZXNzYWdlIHx8IG1lc3NhZ2UudHlwZSAhPT0gTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcHJvZHVjdENvdW50LCBnZW5lcmF0ZWRRdWVyeSB9ID0gbWVzc2FnZS5tZXRhZGF0YTtcbiAgICBpZiAocHJvZHVjdENvdW50ICE9PSAwKSB7XG4gICAgICAvLyBDbGVhciB0aGUgZmlsdGVyIG9wdGlvbnMgd2hlbiB3ZSBnZXQgbmV3IHByb2R1Y3RzXG4gICAgICBzZXQoc2VsZWN0ZWRGaWx0ZXJPcHRpb25zQXRvbSwgW10pO1xuICAgICAgLy8gVE9ETzogU2hvdWxkIHdlIHN0aWxsIGRvIGFueSBvZiB0aGVzZSB0aGluZ3M/XG4gICAgICBzZXQoY2hhdFNlYXJjaFN0YXRlQXRvbSwgXCJwcm9kdWN0LXBhZ2VcIik7XG4gICAgICBjb25zdCBjdXJyZW50U2VhcmNoUGFyYW1zID0gZ2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tKTtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJlc1wiLCBcInRydWVcIik7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzcVwiLCBnZW5lcmF0ZWRRdWVyeSk7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzaVwiLCBtZXNzYWdlLmlkKTtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7fSwgXCJcIiwgdXJsKTtcbiAgICAgIGlmIChjdXJyZW50U2VhcmNoUGFyYW1zLmlkID09PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHRoZSBpZCBpcyBudWxsLCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIHN0YXRlXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBcIlwiLCB1cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGRpZmZlcmVudCwgd2UgbmVlZCB0byBwdXNoIGEgbmV3IHN0YXRlXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBcIlwiLCB1cmwpO1xuICAgICAgfVxuICAgICAgc2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tLCB7IGlkOiBtZXNzYWdlLmlkLCBxdWVyeTogZ2VuZXJhdGVkUXVlcnkgfSk7XG4gICAgfVxuICB9XG4pO1xuXG5leHBvcnQgY29uc3Qgc2V0Q2hhdFNlYXJjaFBhcmFtc0F0b20gPSBhdG9tKG51bGwsIChfLCBzZXQsIHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNcIiwgXCJ0cnVlXCIpO1xuICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzcVwiLCBxdWVyeSk7XG4gIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7fSwgXCJcIiwgdXJsKTtcbiAgc2V0KGNoYXRTZWFyY2hQYXJhbXNBdG9tLCB7IGlkOiBudWxsLCBxdWVyeSB9KTtcbn0pO1xuIiwiaW1wb3J0IHsgU2VhcmNoUmVzdWx0LCBTZWFyY2hQYXJhbXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvc2VhcmNoXCI7XG5cbi8vIFRoaXMgd2lsbCBiZSBzZXQgYnkgdGhlIFNlYXJjaFByb3ZpZGVyIHdoZW4gaXQgaW5pdGlhbGl6ZXNcbmxldCBzZWFyY2hTZXJ2aWNlRnVuY3Rpb246XG4gIHwgKChwYXJhbXM6IFNlYXJjaFBhcmFtcykgPT4gUHJvbWlzZTxTZWFyY2hSZXN1bHQ+KVxuICB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0U2VhcmNoU2VydmljZUZ1bmN0aW9uID0gKFxuICBmbjogKHBhcmFtczogU2VhcmNoUGFyYW1zKSA9PiBQcm9taXNlPFNlYXJjaFJlc3VsdD5cbikgPT4ge1xuICBzZWFyY2hTZXJ2aWNlRnVuY3Rpb24gPSBmbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZWFyY2hTZXJ2aWNlRnVuY3Rpb24gPSAoKSA9PiB7XG4gIGlmICghc2VhcmNoU2VydmljZUZ1bmN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJTZWFyY2ggc2VydmljZSBmdW5jdGlvbiBub3QgaW5pdGlhbGl6ZWQuIE1ha2Ugc3VyZSBTZWFyY2hQcm92aWRlciBpcyBtb3VudGVkLlwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc2VhcmNoU2VydmljZUZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyU2VhcmNoU2VydmljZUZ1bmN0aW9uID0gKCkgPT4ge1xuICBzZWFyY2hTZXJ2aWNlRnVuY3Rpb24gPSBudWxsO1xufTtcbiIsImltcG9ydCB7IGF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IFNlYXJjaFJlc3VsdCwgU2VhcmNoUGFyYW1zIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL3NlYXJjaFwiO1xuaW1wb3J0IHsgUHJvZHVjdFNvcnRpbmcgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUHJvZHVjdEZpbHRlcnMgfSBmcm9tIFwiLi9wcm9kdWN0RmlsdGVyc1wiO1xuaW1wb3J0IHsgUHJvZHVjdFNvcnRlciB9IGZyb20gXCIuL3Byb2R1Y3RTb3J0ZXJcIjtcbmltcG9ydCB7IG5ld09yZ0NvbmZpZ0F0b20gfSBmcm9tIFwiLi4vb3JnXCI7XG5pbXBvcnQgeyBnZXRTZWFyY2hTZXJ2aWNlRnVuY3Rpb24gfSBmcm9tIFwiLi9zZWFyY2hTZXJ2aWNlQWRhcHRlclwiO1xuXG5leHBvcnQgdHlwZSBTZWxlY3RlZEZpbHRlck9wdGlvbiA9IHtcbiAgaWQ6IHN0cmluZzsgLy8gXCJmaWx0ZXJJZDpmaWx0ZXJJdGVtSWRcIiAtIG1haW50YWlucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBjb21wYXJpc29uc1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBmaWx0ZXJJZDogc3RyaW5nOyAvLyBGaWx0ZXIgY2F0ZWdvcnlcbiAgZmlsdGVySXRlbUlkOiBzdHJpbmc7IC8vIEZpbHRlciB2YWx1ZVxufTtcblxuaW50ZXJmYWNlIFNlYXJjaFN0YXRlIHtcbiAgZGF0YTogU2VhcmNoUmVzdWx0IHwgbnVsbDtcbiAgbG9hZGluZzogYm9vbGVhbjtcbiAgZXJyb3I6IHN0cmluZyB8IG51bGw7XG4gIGxhc3RRdWVyeTogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaEF0b20gPSBhdG9tPFNlYXJjaFN0YXRlPih7XG4gIGRhdGE6IG51bGwsXG4gIGxvYWRpbmc6IGZhbHNlLFxuICBlcnJvcjogbnVsbCxcbiAgbGFzdFF1ZXJ5OiBudWxsLFxufSk7XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hQcm9kdWN0U29ydGluZ0F0b20gPSBhdG9tPFByb2R1Y3RTb3J0aW5nPihcbiAgUHJvZHVjdFNvcnRpbmcuRkVBVFVSRURcbik7XG5leHBvcnQgY29uc3Qgc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSA9IGF0b208U2VsZWN0ZWRGaWx0ZXJPcHRpb25bXT4oW10pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmlsdGVyT3B0aW9uID0gKFxuICBmaWx0ZXJJZDogc3RyaW5nLFxuICBmaWx0ZXJJdGVtSWQ6IHN0cmluZyxcbiAgZGlzcGxheU5hbWU6IHN0cmluZ1xuKTogU2VsZWN0ZWRGaWx0ZXJPcHRpb24gPT4gKHtcbiAgaWQ6IGAke2ZpbHRlcklkfToke2ZpbHRlckl0ZW1JZH1gLFxuICBkaXNwbGF5TmFtZSxcbiAgZmlsdGVySWQsXG4gIGZpbHRlckl0ZW1JZCxcbn0pO1xuXG5jb25zdCBpbnRlcm5hbFNlYXJjaFBhcmFtc0F0b20gPSBhdG9tPHtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG4gIHF1ZXJ5OiBzdHJpbmcgfCBudWxsO1xufT4oe1xuICBpZDogbnVsbCxcbiAgcXVlcnk6IG51bGwsXG59KTtcblxuZXhwb3J0IGNvbnN0IHNlYXJjaFBhcmFtc0F0b20gPSBhdG9tKFxuICAoZ2V0KSA9PiBnZXQoaW50ZXJuYWxTZWFyY2hQYXJhbXNBdG9tKSxcbiAgKF8sIHNldCwgdmFsdWU6IHsgaWQ6IHN0cmluZyB8IG51bGw7IHF1ZXJ5OiBzdHJpbmcgfCBudWxsIH0pID0+IHtcbiAgICBzZXQoaW50ZXJuYWxTZWFyY2hQYXJhbXNBdG9tLCB2YWx1ZSk7XG4gIH1cbik7XG5leHBvcnQgY29uc3QgaW50ZXJuYWxTZWFyY2hTeXN0ZW1TdGF0ZUF0b20gPSBhdG9tPGJvb2xlYW4+KGZhbHNlKTtcblxuZXhwb3J0IGNvbnN0IHNlYXJjaFN5c3RlbUF0b20gPSBhdG9tKFxuICAoZ2V0KSA9PiBnZXQoaW50ZXJuYWxTZWFyY2hTeXN0ZW1TdGF0ZUF0b20pLFxuICAoZ2V0LCBzZXQsIHZhbHVlOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBnZXQoaW50ZXJuYWxTZWFyY2hTeXN0ZW1TdGF0ZUF0b20pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlQ2hhbmdlSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICBpZiAocGFyYW1zLmdldChcImVzXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBjb25zdCBpZCA9IHBhcmFtcy5nZXQoXCJlc2lcIik7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLmdldChcImVzcVwiKTtcbiAgICAgICAgc2V0KHNlYXJjaFBhcmFtc0F0b20sIHsgaWQsIHF1ZXJ5IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0KHNlYXJjaFBhcmFtc0F0b20sIHsgaWQ6IG51bGwsIHF1ZXJ5OiBudWxsIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzZXQoaW50ZXJuYWxTZWFyY2hTeXN0ZW1TdGF0ZUF0b20sIHRydWUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBzdGF0ZUNoYW5nZUhhbmRsZXIpO1xuICAgICAgLy8gQWxzbyB0cmlnZ2VyIHRoZSBoYXNoIGNoYW5nZSBoYW5kbGVyIHRvIHNldCB0aGUgaW5pdGlhbCBzdGF0ZVxuICAgICAgc3RhdGVDaGFuZ2VIYW5kbGVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldChpbnRlcm5hbFNlYXJjaFN5c3RlbVN0YXRlQXRvbSwgZmFsc2UpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBzdGF0ZUNoYW5nZUhhbmRsZXIpO1xuICAgIH1cbiAgfVxuKTtcblxuZXhwb3J0IGNvbnN0IGZpbHRlcmVkU2VhcmNoUHJvZHVjdHNBdG9tID0gYXRvbSgoZ2V0KSA9PiB7XG4gIGNvbnN0IHNlYXJjaERhdGEgPSBnZXQoc2VhcmNoQXRvbSkuZGF0YTtcbiAgY29uc3Qgc29ydGluZyA9IGdldChzZWFyY2hQcm9kdWN0U29ydGluZ0F0b20pO1xuICBjb25zdCBzZWxlY3RlZEZpbHRlcnMgPSBnZXQoc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSk7XG4gIGNvbnN0IG5ld09yZ0NvbmZpZyA9IGdldChuZXdPcmdDb25maWdBdG9tKTtcblxuICBpZiAoXG4gICAgIXNlYXJjaERhdGE/LnByb2R1Y3RzIHx8XG4gICAgIW5ld09yZ0NvbmZpZz8uZnJvbnRlbmRDb25maWc/LnVpQ29uZmlncz8uc2VhcmNoQ29uZmlnXG4gIClcbiAgICByZXR1cm4gW107XG5cbiAgY29uc3QgZmlsdGVyZWRQcm9kdWN0cyA9IFByb2R1Y3RGaWx0ZXJzLmZpbHRlclByb2R1Y3RzKFxuICAgIHNlYXJjaERhdGEucHJvZHVjdHMsXG4gICAgbmV3T3JnQ29uZmlnLmZyb250ZW5kQ29uZmlnLnVpQ29uZmlncy5zZWFyY2hDb25maWcuc2VhcmNoRmlsdGVyQ29uZmlnLFxuICAgIHNlbGVjdGVkRmlsdGVycyxcbiAgICBuZXdPcmdDb25maWcuZnJvbnRlbmRDb25maWcudWlDb25maWdzLnNlYXJjaENvbmZpZy5hZGRpdGl2ZUR5bmFtaWNGaWx0ZXJzXG4gICk7XG5cbiAgcmV0dXJuIFByb2R1Y3RTb3J0ZXIuc29ydChmaWx0ZXJlZFByb2R1Y3RzLCBzb3J0aW5nKTtcbn0pO1xuXG5leHBvcnQgY29uc3Qgc2VhcmNoRmlsdGVyc0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgY29uc3Qgc2VhcmNoRGF0YSA9IGdldChzZWFyY2hBdG9tKS5kYXRhO1xuICBjb25zdCBzZWxlY3RlZEZpbHRlcnMgPSBnZXQoc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSk7XG4gIGNvbnN0IG5ld09yZ0NvbmZpZyA9IGdldChuZXdPcmdDb25maWdBdG9tKTtcblxuICBpZiAoXG4gICAgIXNlYXJjaERhdGE/LnByb2R1Y3RzIHx8XG4gICAgIW5ld09yZ0NvbmZpZz8uZnJvbnRlbmRDb25maWc/LnVpQ29uZmlncz8uc2VhcmNoQ29uZmlnXG4gIClcbiAgICByZXR1cm4gW107XG5cbiAgcmV0dXJuIFByb2R1Y3RGaWx0ZXJzLmdldEZpbHRlcnNGb3JQcm9kdWN0cyhcbiAgICBzZWFyY2hEYXRhLnByb2R1Y3RzLFxuICAgIG5ld09yZ0NvbmZpZy5mcm9udGVuZENvbmZpZy51aUNvbmZpZ3Muc2VhcmNoQ29uZmlnLnNlYXJjaEZpbHRlckNvbmZpZyxcbiAgICBzZWxlY3RlZEZpbHRlcnNcbiAgKTtcbn0pO1xuXG5leHBvcnQgY29uc3QgYWRkU2VhcmNoRmlsdGVyQXRvbSA9IGF0b20oXG4gIG51bGwsXG4gIChnZXQsIHNldCwgZmlsdGVyOiBTZWxlY3RlZEZpbHRlck9wdGlvbikgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBnZXQoc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSk7XG4gICAgaWYgKCFjdXJyZW50LnNvbWUoKGYpID0+IGYuaWQgPT09IGZpbHRlci5pZCkpIHtcbiAgICAgIHNldChzZWFyY2hTZWxlY3RlZEZpbHRlcnNBdG9tLCBbLi4uY3VycmVudCwgZmlsdGVyXSk7XG4gICAgfVxuICB9XG4pO1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VhcmNoRmlsdGVyQXRvbSA9IGF0b20oXG4gIG51bGwsXG4gIChnZXQsIHNldCwgZmlsdGVySWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBnZXQoc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSk7XG4gICAgc2V0KFxuICAgICAgc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSxcbiAgICAgIGN1cnJlbnQuZmlsdGVyKChmKSA9PiBmLmlkICE9PSBmaWx0ZXJJZClcbiAgICApO1xuICB9XG4pO1xuXG5leHBvcnQgY29uc3QgY2xlYXJTZWFyY2hGaWx0ZXJzQXRvbSA9IGF0b20obnVsbCwgKF8sIHNldCkgPT4ge1xuICBzZXQoc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSwgW10pO1xufSk7XG5cbmV4cG9ydCBjb25zdCBwZXJmb3JtU2VhcmNoQXRvbSA9IGF0b20oXG4gIG51bGwsXG4gIGFzeW5jIChnZXQsIHNldCwgcGFyYW1zOiBTZWFyY2hQYXJhbXMsIGFsbG93UmVkaXJlY3QgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGdldChzZWFyY2hBdG9tKTtcbiAgICBjb25zdCBuZXdPcmdDb25maWcgPSBnZXQobmV3T3JnQ29uZmlnQXRvbSk7XG4gICAgY29uc3QgcmVkaXJlY3RTZWFyY2hSZXN1bHRzVXJsID1cbiAgICAgIG5ld09yZ0NvbmZpZz8uZnJvbnRlbmRDb25maWc/LnVpQ29uZmlncz8uc2VhcmNoQ29uZmlnXG4gICAgICAgID8ucmVkaXJlY3RTZWFyY2hSZXN1bHRzVXJsO1xuXG4gICAgaWYgKGFsbG93UmVkaXJlY3QgJiYgcmVkaXJlY3RTZWFyY2hSZXN1bHRzVXJsKSB7XG4gICAgICBjb25zdCByZWRpcmVjdFVybCA9IG5ldyBVUkwocmVkaXJlY3RTZWFyY2hSZXN1bHRzVXJsKTtcbiAgICAgIHJlZGlyZWN0VXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJlc1wiLCBcInRydWVcIik7XG4gICAgICByZWRpcmVjdFVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNxXCIsIHBhcmFtcy5xdWVyeSk7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHJlZGlyZWN0VXJsLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSBVUkwgYW5kIG1hbnVhbGx5IHRyaWdnZXIgc3RhdGUgY2hhbmdlIChzaW5jZSBwdXNoU3RhdGUgZG9lc24ndCB0cmlnZ2VyIHBvcHN0YXRlKVxuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImVzXCIsIFwidHJ1ZVwiKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZXNxXCIsIHBhcmFtcy5xdWVyeSk7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoe30sIFwiXCIsIHVybCk7XG5cbiAgICAgIC8vIE1hbnVhbGx5IHRyaWdnZXIgcGFnZSB2YXJpYW50IHJlLWV2YWx1YXRpb24gYnkgZGlzcGF0Y2hpbmcgYSBwb3BzdGF0ZSBldmVudFxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBwYWdlIHZhcmlhbnQgc3lzdGVtIGRldGVjdHMgdGhlIFVSTCBjaGFuZ2UgYW5kIG1vdW50cyBzZWFyY2ggcmVzdWx0c1xuICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IFBvcFN0YXRlRXZlbnQoXCJwb3BzdGF0ZVwiLCB7IHN0YXRlOiB7fSB9KSk7XG4gICAgfVxuXG4gICAgLy8gTWFudWFsbHkgdHJpZ2dlciBwYWdlIHZhcmlhbnQgcmUtZXZhbHVhdGlvbiBieSBkaXNwYXRjaGluZyBhIHBvcHN0YXRlIGV2ZW50XG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZSBwYWdlIHZhcmlhbnQgc3lzdGVtIGRldGVjdHMgdGhlIFVSTCBjaGFuZ2UgYW5kIG1vdW50cyBzZWFyY2ggcmVzdWx0c1xuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBQb3BTdGF0ZUV2ZW50KFwicG9wc3RhdGVcIiwgeyBzdGF0ZToge30gfSkpO1xuICAgIGlmIChjdXJyZW50U3RhdGUubG9hZGluZykge1xuICAgICAgcmV0dXJuOyAvLyBQcmV2ZW50IGNvbmN1cnJlbnQgc2VhcmNoZXNcbiAgICB9XG5cbiAgICBzZXQoc2VhcmNoQXRvbSwge1xuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGxhc3RRdWVyeTogcGFyYW1zLnF1ZXJ5LFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZWFyY2hTZXJ2aWNlRnVuY3Rpb24gPSBnZXRTZWFyY2hTZXJ2aWNlRnVuY3Rpb24oKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlYXJjaFNlcnZpY2VGdW5jdGlvbihwYXJhbXMpO1xuICAgICAgc2V0KHNlYXJjaEF0b20sIHtcbiAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgIGxhc3RRdWVyeTogcGFyYW1zLnF1ZXJ5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkXCI7XG4gICAgICBzZXQoc2VhcmNoQXRvbSwge1xuICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgbGFzdFF1ZXJ5OiBwYXJhbXMucXVlcnksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbik7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLE1BQWEsMkJBQTJCLGdCQUF3QjtDQUM5RCxNQUFNLFFBQVE7RUFBQztFQUFRO0VBQU87RUFBTTtFQUFLO0VBQUs7RUFBSztFQUFNO0VBQU87RUFBUTtFQUFRO0FBZWhGLFFBYnVCLFlBQ3BCLGFBQWEsQ0FDYixNQUFNLElBQUksQ0FDVixLQUFLLFNBQVM7QUFDYixNQUFJLE1BQU0sU0FBUyxLQUFLLENBQ3RCLFFBQU8sS0FBSyxhQUFhO0FBRTNCLFNBQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQyxhQUFhLEdBQUcsS0FBSyxNQUFNLEVBQUU7R0FDbkQsQ0FFa0MsS0FBSyxJQUFJLENBR3pCLFFBQVEsV0FBVyxTQUFTOzs7OztBQ1ZwRCxNQUFNLGtCQUFrQixPQUFlLGVBQXVCO0FBRTVELFFBRGUsS0FBSyxNQUFNLFFBQVEsV0FBVyxHQUM3Qjs7QUFHbEIsTUFBTSxpQkFBaUIsVUFBc0M7QUFDM0QsS0FBSSxDQUFDLE1BQU0sUUFBUSxNQUFNLENBQ3ZCLFFBQU87QUFFVCxRQUFPLE1BQU0sT0FBTyxTQUFTLE9BQU8sU0FBUyxTQUFTOztBQUt4RCxNQUFNLGNBQWMsaUJBQXNEO0FBQ3hFLEtBQUksYUFBYSxTQUFTLFFBQ3hCLFNBQVEsR0FBRyxNQUFNLE9BQU8sRUFBRSxhQUFhLEdBQUcsT0FBTyxFQUFFLGFBQWE7QUFFbEUsS0FBSSxhQUFhLFNBQVMsV0FBVztBQUNuQyxNQUFJLGFBQWEsUUFBUSxTQUFTLGFBQ2hDLFNBQVEsR0FBRyxNQUFNLEVBQUUsWUFBWSxj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