@envive-ai/react-hooks 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/NewOrgConfig-BU6uJT74.js +15 -0
- package/dist/NewOrgConfig-DmidHiyj.cjs +20 -0
- package/dist/SystemSettingsContext-BbobkM82.cjs +20 -0
- package/dist/SystemSettingsContext-gtrccL_q.js +13 -0
- package/dist/TrackComponentVisibleEvent-CqjMiZCS.cjs +59 -0
- package/dist/TrackComponentVisibleEvent-D9kpqKM4.js +52 -0
- package/dist/amplitudeContext-B73xamNe.d.cts +52 -0
- package/dist/amplitudeContext-BhhYPJSL.d.ts +52 -0
- package/dist/amplitudeContext-Dr1jHI13.cjs +309 -0
- package/dist/amplitudeContext-YRS1QOO3.js +287 -0
- package/dist/api-DYjHj_hR.cjs +239 -0
- package/dist/api-d5uWvb3-.js +166 -0
- package/dist/{app-CjsQ2_n-.js → app-B9r0MF9n.js} +7 -7
- package/dist/{app-CnKRZ9RW.cjs → app-Bgr-mAvr.cjs} +10 -10
- package/dist/application/models/graphql/index.cjs +2 -1
- package/dist/application/models/graphql/index.d.ts +1 -1
- package/dist/application/models/graphql/index.js +2 -1
- package/dist/application/models/guards/api/index.cjs +3 -1
- package/dist/application/models/guards/api/index.d.ts +2 -2
- package/dist/application/models/guards/api/index.js +3 -1
- package/dist/application/models/guards/utils.cjs +3 -0
- package/dist/application/models/guards/utils.d.cts +2 -0
- package/dist/application/models/guards/utils.d.ts +2 -0
- package/dist/application/models/guards/utils.js +3 -0
- package/dist/application/models/index.cjs +13 -10
- package/dist/application/models/index.d.cts +9 -4
- package/dist/application/models/index.d.ts +12 -7
- package/dist/application/models/index.js +11 -7
- package/dist/application/models/utilityTypes/index.cjs +1 -1
- package/dist/application/models/utilityTypes/index.d.ts +1 -1
- package/dist/application/models/utilityTypes/index.js +1 -1
- package/dist/application/models/variantInfo/index.cjs +1 -1
- package/dist/application/models/variantInfo/index.d.cts +1 -1
- package/dist/application/models/variantInfo/index.d.ts +1 -1
- package/dist/application/models/variantInfo/index.js +1 -1
- package/dist/application/utils/index.cjs +47 -40
- package/dist/application/utils/index.d.cts +13 -8
- package/dist/application/utils/index.d.ts +15 -10
- package/dist/application/utils/index.js +20 -13
- package/dist/{atomStore-D8pjE1vL.js → atomStore-BuopbV9k.js} +1 -1
- package/dist/{atomStore-B4jIaDPd.cjs → atomStore-CZKe3itM.cjs} +1 -1
- package/dist/atoms/app/index.cjs +14 -9
- package/dist/atoms/app/index.d.cts +16 -11
- package/dist/atoms/app/index.d.ts +19 -14
- package/dist/atoms/app/index.js +14 -9
- package/dist/atoms/atomStore/index.cjs +2 -2
- package/dist/atoms/atomStore/index.d.cts +1 -1
- package/dist/atoms/atomStore/index.js +2 -2
- package/dist/atoms/chat/index.cjs +35 -28
- package/dist/atoms/chat/index.d.cts +36 -31
- package/dist/atoms/chat/index.d.ts +39 -34
- package/dist/atoms/chat/index.js +21 -14
- package/dist/atoms/globalSearch/index.cjs +1 -1
- package/dist/atoms/globalSearch/index.d.cts +5 -5
- package/dist/atoms/globalSearch/index.d.ts +6 -6
- package/dist/atoms/globalSearch/index.js +1 -1
- package/dist/atoms/org/index.cjs +6 -14
- package/dist/atoms/org/index.d.cts +28 -32
- package/dist/atoms/org/index.d.ts +31 -35
- package/dist/atoms/org/index.js +5 -11
- package/dist/atoms/search/index.cjs +46 -34
- package/dist/atoms/search/index.d.cts +10 -4
- package/dist/atoms/search/index.d.ts +13 -7
- package/dist/atoms/search/index.js +28 -16
- package/dist/atoms/search/types.cjs +5 -0
- package/dist/atoms/search/types.d.cts +2 -0
- package/dist/atoms/search/types.d.ts +2 -0
- package/dist/atoms/search/types.js +3 -0
- package/dist/atoms/search/utils.cjs +3 -0
- package/dist/atoms/search/utils.d.cts +5 -0
- package/dist/atoms/search/utils.d.ts +5 -0
- package/dist/atoms/search/utils.js +3 -0
- package/dist/cdnContext-CVgXkdV2.cjs +53 -0
- package/dist/cdnContext-DdE6VPIF.js +38 -0
- package/dist/chat-BNDYKsqF.js +258 -0
- package/dist/{chat-BubCW1as.cjs → chat-BkjIKhc5.cjs} +1 -1
- package/dist/chat-Br5FhtRs.cjs +394 -0
- package/dist/{chat-CV6MXeID.js → chat-CgLypC3w.js} +1 -1
- package/dist/chatElementDisplayLocation-BwiXrkN7.d.ts +25 -0
- package/dist/chatElementDisplayLocation-DWmfNX_u.d.cts +25 -0
- package/dist/chatSearch-BiF2__V0.js +295 -0
- package/dist/chatSearch-BrzfJOto.cjs +418 -0
- package/dist/chatState-BDsqKE-B.cjs +120 -0
- package/dist/chatState-ie771Hwy.js +34 -0
- package/dist/commerce-api-Dz1jxPOJ.js +311 -0
- package/dist/commerce-api-KoiUki51.cjs +318 -0
- package/dist/{components-Cw9WjA6g.cjs → components-Cby-Cma3.cjs} +1 -1
- package/dist/{components-B4T3Uzth.js → components-D1mg1-Br.js} +1 -1
- package/dist/config/locators/components/chat/index.cjs +1 -1
- package/dist/config/locators/components/chat/index.d.cts +1 -1
- package/dist/config/locators/components/chat/index.d.ts +1 -1
- package/dist/config/locators/components/chat/index.js +1 -1
- package/dist/config/locators/components/chat/variants/index.d.cts +1 -1
- package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
- package/dist/config/locators/components/index.cjs +1 -1
- package/dist/config/locators/components/index.d.cts +1 -1
- package/dist/config/locators/components/index.d.ts +1 -1
- package/dist/config/locators/components/index.js +1 -1
- package/dist/config/locators/components/search/index.d.cts +1 -1
- package/dist/config/locators/index.cjs +42 -22
- package/dist/config/locators/index.d.cts +2 -2
- package/dist/config/locators/index.d.ts +3 -3
- package/dist/config/locators/index.js +25 -5
- package/dist/contexts/amplitudeContext/index.cjs +22 -0
- package/dist/contexts/amplitudeContext/index.d.cts +2 -0
- package/dist/contexts/amplitudeContext/index.d.ts +2 -0
- package/dist/contexts/amplitudeContext/index.js +20 -0
- package/dist/contexts/cdnContext/index.cjs +7 -0
- package/dist/contexts/cdnContext/index.d.cts +15 -0
- package/dist/contexts/cdnContext/index.d.ts +15 -0
- package/dist/contexts/cdnContext/index.js +6 -0
- package/dist/contexts/chatContext/index.cjs +331 -0
- package/dist/contexts/chatContext/index.d.cts +15 -0
- package/dist/contexts/chatContext/index.d.ts +15 -0
- package/dist/contexts/chatContext/index.js +324 -0
- package/dist/contexts/enviveConfigContext/index.cjs +7 -0
- package/dist/contexts/enviveConfigContext/index.d.cts +30 -0
- package/dist/contexts/enviveConfigContext/index.d.ts +30 -0
- package/dist/contexts/enviveConfigContext/index.js +6 -0
- package/dist/contexts/enviveCssContext/index.cjs +66 -0
- package/dist/contexts/enviveCssContext/index.d.cts +10 -0
- package/dist/contexts/enviveCssContext/index.d.ts +10 -0
- package/dist/contexts/enviveCssContext/index.js +63 -0
- package/dist/contexts/featureFlagContext/index.cjs +107 -0
- package/dist/contexts/featureFlagContext/index.d.cts +20 -0
- package/dist/contexts/featureFlagContext/index.d.ts +20 -0
- package/dist/contexts/featureFlagContext/index.js +103 -0
- package/dist/contexts/featureFlagServiceContext/index.cjs +6 -0
- package/dist/contexts/featureFlagServiceContext/index.d.cts +5 -0
- package/dist/contexts/featureFlagServiceContext/index.d.ts +5 -0
- package/dist/contexts/featureFlagServiceContext/index.js +5 -0
- package/dist/contexts/graphqlContext/index.cjs +16 -0
- package/dist/contexts/graphqlContext/index.d.cts +13 -0
- package/dist/contexts/graphqlContext/index.d.ts +13 -0
- package/dist/contexts/graphqlContext/index.js +15 -0
- package/dist/contexts/localStorageContext/index.cjs +6 -0
- package/dist/contexts/localStorageContext/index.d.cts +30 -0
- package/dist/contexts/localStorageContext/index.d.ts +30 -0
- package/dist/contexts/localStorageContext/index.js +4 -0
- package/dist/contexts/newOrgConfigContext/index.cjs +20 -0
- package/dist/contexts/newOrgConfigContext/index.d.cts +31 -0
- package/dist/contexts/newOrgConfigContext/index.d.ts +31 -0
- package/dist/contexts/newOrgConfigContext/index.js +19 -0
- package/dist/contexts/searchContext/index.cjs +24 -0
- package/dist/contexts/searchContext/index.d.cts +16 -0
- package/dist/contexts/searchContext/index.d.ts +16 -0
- package/dist/contexts/searchContext/index.js +23 -0
- package/dist/contexts/sessionStorageContext/index.cjs +5 -0
- package/dist/contexts/sessionStorageContext/index.d.cts +15 -0
- package/dist/contexts/sessionStorageContext/index.d.ts +15 -0
- package/dist/contexts/sessionStorageContext/index.js +4 -0
- package/dist/contexts/shopifyUrlContext/index.cjs +5 -0
- package/dist/contexts/shopifyUrlContext/index.d.cts +20 -0
- package/dist/contexts/shopifyUrlContext/index.d.ts +20 -0
- package/dist/contexts/shopifyUrlContext/index.js +4 -0
- package/dist/contexts/systemSettingsContext/index.cjs +8 -0
- package/dist/contexts/systemSettingsContext/index.d.cts +37 -0
- package/dist/contexts/systemSettingsContext/index.d.ts +37 -0
- package/dist/contexts/systemSettingsContext/index.js +6 -0
- package/dist/contexts/types.cjs +7 -0
- package/dist/contexts/types.d.cts +4 -0
- package/dist/contexts/types.d.ts +4 -0
- package/dist/contexts/types.js +3 -0
- package/dist/contexts/userIdentityContext/index.cjs +27 -0
- package/dist/contexts/userIdentityContext/index.d.cts +2 -0
- package/dist/contexts/userIdentityContext/index.d.ts +2 -0
- package/dist/contexts/userIdentityContext/index.js +26 -0
- package/dist/domObserver-B19-69gW.js +285 -0
- package/dist/domObserver-CwieVNgj.cjs +304 -0
- package/dist/enviveConfig-BQB14yuH.js +62 -0
- package/dist/enviveConfig-DAA9sozZ.cjs +130 -0
- package/dist/enviveConfigContext-BCpBKqsz.js +45 -0
- package/dist/enviveConfigContext-Btg5JUMG.cjs +60 -0
- package/dist/events/index.cjs +1 -1
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.js +1 -1
- package/dist/{events-BrLpaNxh.js → events-BHJJjPDN.js} +1 -1
- package/dist/{events-DwT6cEwI.cjs → events-B_fJZf9E.cjs} +1 -1
- package/dist/featureFlagServiceContext-Bcx5yh4S.cjs +56 -0
- package/dist/featureFlagServiceContext-Cpw8omUr.d.ts +23 -0
- package/dist/featureFlagServiceContext-Cvn6fcdB.d.cts +23 -0
- package/dist/featureFlagServiceContext-_tXX5iro.js +42 -0
- package/dist/featureGates-2Zea2D2S.js +27 -0
- package/dist/featureGates-BY2Zy7x_.cjs +33 -0
- package/dist/frontendConfig-DnMZfvcA.d.cts +857 -0
- package/dist/frontendConfig-Dqxbqo8G.d.ts +857 -0
- package/dist/{globalSearch-BFvEg53C.cjs → globalSearch-C94-vEVh.cjs} +1 -1
- package/dist/{globalSearch-B6THR7Jx.js → globalSearch-Dlbnfasm.js} +1 -1
- package/dist/graphql-DRLWdYEk.js +36 -0
- package/dist/graphql-xPDT7ZkK.cjs +53 -0
- package/dist/graphqlConfig-B4ddz1vH.cjs +39 -0
- package/dist/graphqlConfig-BnjOdeX7.js +14 -0
- package/dist/graphqlContext-B-9g2vOb.js +96 -0
- package/dist/graphqlContext-B7PEKDJs.cjs +111 -0
- package/dist/hooks/AmplitudeOperations/index.cjs +22 -0
- package/dist/hooks/AmplitudeOperations/index.d.cts +12 -0
- package/dist/hooks/AmplitudeOperations/index.d.ts +12 -0
- package/dist/hooks/AmplitudeOperations/index.js +22 -0
- package/dist/hooks/AppDetails/index.cjs +19 -0
- package/dist/hooks/AppDetails/index.d.cts +27 -0
- package/dist/hooks/AppDetails/index.d.ts +27 -0
- package/dist/hooks/AppDetails/index.js +19 -0
- package/dist/hooks/BlockBackButton/index.cjs +29 -0
- package/dist/hooks/BlockBackButton/index.d.cts +5 -0
- package/dist/hooks/BlockBackButton/index.d.ts +5 -0
- package/dist/hooks/BlockBackButton/index.js +27 -0
- package/dist/hooks/CdnOperations/index.cjs +24 -0
- package/dist/hooks/CdnOperations/index.d.cts +7 -0
- package/dist/hooks/CdnOperations/index.d.ts +7 -0
- package/dist/hooks/CdnOperations/index.js +22 -0
- package/dist/hooks/ChatToggle/index.cjs +64 -0
- package/dist/hooks/ChatToggle/index.d.cts +12 -0
- package/dist/hooks/ChatToggle/index.d.ts +12 -0
- package/dist/hooks/ChatToggle/index.js +62 -0
- package/dist/hooks/ChatToggleAnalytics/index.cjs +38 -0
- package/dist/hooks/ChatToggleAnalytics/index.d.cts +9 -0
- package/dist/hooks/ChatToggleAnalytics/index.d.ts +9 -0
- package/dist/hooks/ChatToggleAnalytics/index.js +36 -0
- package/dist/hooks/CustomerSupportHandoff/index.cjs +36 -0
- package/dist/hooks/CustomerSupportHandoff/index.d.cts +16 -0
- package/dist/hooks/CustomerSupportHandoff/index.d.ts +16 -0
- package/dist/hooks/CustomerSupportHandoff/index.js +34 -0
- package/dist/hooks/Debounce/index.cjs +3 -0
- package/dist/hooks/Debounce/index.d.cts +5 -0
- package/dist/hooks/Debounce/index.d.ts +5 -0
- package/dist/hooks/Debounce/index.js +3 -0
- package/dist/hooks/ElementObserver/index.cjs +179 -0
- package/dist/hooks/ElementObserver/index.d.cts +29 -0
- package/dist/hooks/ElementObserver/index.d.ts +29 -0
- package/dist/hooks/ElementObserver/index.js +177 -0
- package/dist/hooks/GrabAndScroll/index.cjs +99 -0
- package/dist/hooks/GrabAndScroll/index.d.cts +14 -0
- package/dist/hooks/GrabAndScroll/index.d.ts +14 -0
- package/dist/hooks/GrabAndScroll/index.js +97 -0
- package/dist/hooks/GraphQLConfig/index.cjs +17 -0
- package/dist/hooks/GraphQLConfig/index.d.cts +15 -0
- package/dist/hooks/GraphQLConfig/index.d.ts +15 -0
- package/dist/hooks/GraphQLConfig/index.js +16 -0
- package/dist/hooks/IdentifyUser/index.cjs +60 -0
- package/dist/hooks/IdentifyUser/index.d.cts +10 -0
- package/dist/hooks/IdentifyUser/index.d.ts +10 -0
- package/dist/hooks/IdentifyUser/index.js +58 -0
- package/dist/hooks/ImageResolver/index.cjs +55 -0
- package/dist/hooks/ImageResolver/index.d.cts +7 -0
- package/dist/hooks/ImageResolver/index.d.ts +7 -0
- package/dist/hooks/ImageResolver/index.js +53 -0
- package/dist/hooks/Intersection/index.cjs +3 -0
- package/dist/hooks/Intersection/index.d.cts +7 -0
- package/dist/hooks/Intersection/index.d.ts +7 -0
- package/dist/hooks/Intersection/index.js +3 -0
- package/dist/hooks/IsSmallScreen/index.cjs +22 -0
- package/dist/hooks/IsSmallScreen/index.d.cts +5 -0
- package/dist/hooks/IsSmallScreen/index.d.ts +5 -0
- package/dist/hooks/IsSmallScreen/index.js +20 -0
- package/dist/hooks/LocalStorageOperations/index.cjs +79 -0
- package/dist/hooks/LocalStorageOperations/index.d.cts +17 -0
- package/dist/hooks/LocalStorageOperations/index.d.ts +17 -0
- package/dist/hooks/LocalStorageOperations/index.js +74 -0
- package/dist/hooks/MessageFilter/index.cjs +54 -0
- package/dist/hooks/MessageFilter/index.d.cts +30 -0
- package/dist/hooks/MessageFilter/index.d.ts +30 -0
- package/dist/hooks/MessageFilter/index.js +54 -0
- package/dist/hooks/MessageScrollObserver/index.cjs +36 -0
- package/dist/hooks/MessageScrollObserver/index.d.cts +5 -0
- package/dist/hooks/MessageScrollObserver/index.d.ts +5 -0
- package/dist/hooks/MessageScrollObserver/index.js +34 -0
- package/dist/hooks/NewOrgConfig/index.cjs +20 -0
- package/dist/hooks/NewOrgConfig/index.d.cts +23 -0
- package/dist/hooks/NewOrgConfig/index.d.ts +23 -0
- package/dist/hooks/NewOrgConfig/index.js +20 -0
- package/dist/hooks/Search/index.cjs +326 -0
- package/dist/hooks/Search/index.d.cts +61 -0
- package/dist/hooks/Search/index.d.ts +61 -0
- package/dist/hooks/Search/index.js +323 -0
- package/dist/hooks/SearchOperations/index.cjs +102 -0
- package/dist/hooks/SearchOperations/index.d.cts +22 -0
- package/dist/hooks/SearchOperations/index.d.ts +22 -0
- package/dist/hooks/SearchOperations/index.js +99 -0
- package/dist/hooks/SessionStorageOperations/index.cjs +30 -0
- package/dist/hooks/SessionStorageOperations/index.d.cts +8 -0
- package/dist/hooks/SessionStorageOperations/index.d.ts +8 -0
- package/dist/hooks/SessionStorageOperations/index.js +28 -0
- package/dist/hooks/ShopifyUrlOperations/index.cjs +53 -0
- package/dist/hooks/ShopifyUrlOperations/index.d.cts +23 -0
- package/dist/hooks/ShopifyUrlOperations/index.d.ts +23 -0
- package/dist/hooks/ShopifyUrlOperations/index.js +49 -0
- package/dist/hooks/SnapCalculator/index.cjs +29 -0
- package/dist/hooks/SnapCalculator/index.d.cts +12 -0
- package/dist/hooks/SnapCalculator/index.d.ts +12 -0
- package/dist/hooks/SnapCalculator/index.js +27 -0
- package/dist/hooks/SystemSettingsContext/index.cjs +7 -0
- package/dist/hooks/SystemSettingsContext/index.d.cts +23 -0
- package/dist/hooks/SystemSettingsContext/index.d.ts +23 -0
- package/dist/hooks/SystemSettingsContext/index.js +7 -0
- package/dist/hooks/TrackComponentVisibleEvent/index.cjs +22 -0
- package/dist/hooks/TrackComponentVisibleEvent/index.d.cts +18 -0
- package/dist/hooks/TrackComponentVisibleEvent/index.d.ts +18 -0
- package/dist/hooks/TrackComponentVisibleEvent/index.js +22 -0
- package/dist/hooks/UpdateAnalyticsProps/index.cjs +62 -0
- package/dist/hooks/UpdateAnalyticsProps/index.d.cts +9 -0
- package/dist/hooks/UpdateAnalyticsProps/index.d.ts +9 -0
- package/dist/hooks/UpdateAnalyticsProps/index.js +59 -0
- package/dist/hooks/utils.cjs +8 -0
- package/dist/hooks/utils.d.cts +13 -0
- package/dist/hooks/utils.d.ts +13 -0
- package/dist/hooks/utils.js +3 -0
- package/dist/index-B9HUPS_i.d.cts +186 -0
- package/dist/{index-CcIG01PJ.d.ts → index-BN-3ctk_.d.ts} +2 -2
- package/dist/index-BNiYL8h0.d.cts +28 -0
- package/dist/{index-BDPWBU3h.d.cts → index-BW6pHibZ.d.cts} +1 -1
- package/dist/index-BirtCYN3.d.ts +186 -0
- package/dist/index-Bmub8e38.d.cts +1 -1
- package/dist/{index-Cqg6ltII.d.ts → index-BoYC9XLW.d.ts} +1 -1
- package/dist/index-C9zXP5bg.d.ts +28 -0
- package/dist/index-CESxqFso.d.cts +1 -1
- package/dist/index-CK_J3QMY.d.ts +676 -0
- package/dist/index-C_MIfxF0.d.cts +676 -0
- package/dist/index-CiWEYzXl.d.cts +1 -1
- package/dist/{index-C6KdON7d.d.ts → index-Da0UzyI9.d.ts} +1 -1
- package/dist/{index-ylUiJvnr.d.ts → index-Dr_c2DDq.d.ts} +1 -1
- package/dist/{index-PGF8BvxQ.d.ts → index-DsiilEj-.d.ts} +1 -1
- package/dist/{index-Byb45OPg.d.cts → index-MOOZ2oxZ.d.cts} +1 -1
- package/dist/{index-DOii3C6b.d.ts → index-ghzD_356.d.ts} +1 -1
- package/dist/{index-B0NW9KTj.d.cts → index-hdbCEjYy.d.cts} +1 -1
- package/dist/interceptors/index.cjs +2 -1
- package/dist/interceptors/index.d.cts +10 -10
- package/dist/interceptors/index.d.ts +13 -13
- package/dist/interceptors/index.js +2 -1
- package/dist/interceptors/types.cjs +1 -0
- package/dist/interceptors/types.d.cts +13 -0
- package/dist/interceptors/types.d.ts +13 -0
- package/dist/interceptors/types.js +3 -0
- package/dist/localStorageContext-DiTziaPa.js +95 -0
- package/dist/localStorageContext-S38L0OSP.cjs +115 -0
- package/dist/logger-CkhQayOW.js +20 -0
- package/dist/logger-DQ0WfCcD.cjs +26 -0
- package/dist/{models-BkXg5eIP.cjs → models-C48U9q70.js} +220 -458
- package/dist/models-Ctn-pmug.cjs +1537 -0
- package/dist/newOrgConfigAtom-D6R-7HCk.cjs +15 -0
- package/dist/newOrgConfigAtom-bn1lnljf.js +8 -0
- package/dist/newOrgConfigContext-D3WoaBVU.cjs +68 -0
- package/dist/newOrgConfigContext-rWOYz0E8.js +53 -0
- package/dist/{nodeSelector-Dm4S-10n.d.cts → nodeSelector-B3bPtEjX.d.cts} +1 -1
- package/dist/{nodeSelector-BxrS2S_k.d.ts → nodeSelector-D5gjDWZ3.d.ts} +1 -1
- package/dist/org-CIhjzxWr.cjs +43 -0
- package/dist/org-CeWXnpwF.js +12 -0
- package/dist/{orgAnalyticsConfig-ClrFy2qH.js → orgAnalyticsConfig-BC4_sEmn.js} +1 -1
- package/dist/{orgAnalyticsConfig-BJ2A1RZ-.cjs → orgAnalyticsConfig-DsGbyFhO.cjs} +1 -1
- package/dist/search--NZPZkK3.cjs +205 -0
- package/dist/search-BLShhjvR.d.ts +20 -0
- package/dist/search-CxZl7iQF.js +126 -0
- package/dist/{search-filter-types-fZf91Pdw.d.ts → search-filter-types-DPgeG8FS.d.ts} +1 -1
- package/dist/{search-filter-types-DosbseF3.d.cts → search-filter-types-_mprCnBi.d.cts} +1 -1
- package/dist/search-y-ioX5Mz.d.cts +20 -0
- package/dist/searchContext-C4Glr8Nv.cjs +145 -0
- package/dist/searchContext-VnjhV7Lk.js +129 -0
- package/dist/searchServiceAdapter-DEv1tTn0.cjs +34 -0
- package/dist/searchServiceAdapter-WyCU55NV.js +16 -0
- package/dist/sessionStorageContext-BJ05_j7l.cjs +66 -0
- package/dist/sessionStorageContext-Dp_bhXQP.js +52 -0
- package/dist/shopifyUrlContext-CGqpJl1o.js +61 -0
- package/dist/shopifyUrlContext-Cob4L7Dt.cjs +75 -0
- package/dist/spiffyWidgets-BuS00VaQ.d.cts +20 -0
- package/dist/spiffyWidgets-GILaqHv6.d.ts +20 -0
- package/dist/systemSettingsContext-BDKWrrco.cjs +60 -0
- package/dist/systemSettingsContext-Dqng3YSZ.js +39 -0
- package/dist/{test-types-C9b_OdfO.d.ts → test-types-EzMFw_U3.d.ts} +1 -1
- package/dist/{test-types-CgVJtwUr.d.cts → test-types-ThQiO_cc.d.cts} +1 -1
- package/dist/types/index.cjs +33 -5
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +30 -3
- package/dist/types-BUeRbZUk.d.cts +10 -0
- package/dist/types-BwNrLPSZ.cjs +106 -0
- package/dist/types-CMuTSKrW.d.ts +10 -0
- package/dist/types-CS0Hrzja.js +30 -0
- package/dist/types-CxObxLKs.cjs +48 -0
- package/dist/types-D3uOF0Oy.js +76 -0
- package/dist/types-fsXBIQwO.d.ts +51 -0
- package/dist/types-zuWLkBJ3.d.cts +51 -0
- package/dist/types.d.cts +15 -0
- package/dist/types.d.ts +15 -0
- package/dist/unsupportedProductExceptions-CKiri_vO.cjs +32 -0
- package/dist/unsupportedProductExceptions-ClxlJ6cU.js +20 -0
- package/dist/urlsParser-D1nsJgQG.cjs +78 -0
- package/dist/urlsParser-DzEetiey.js +42 -0
- package/dist/useAmplitudeOperations-BSsyvkQ2.cjs +41 -0
- package/dist/useAmplitudeOperations-BottjwT9.js +34 -0
- package/dist/useAppDetails-BpiBxS_5.cjs +38 -0
- package/dist/useAppDetails-DDNIsM46.js +30 -0
- package/dist/useDebounce-BaIp-A1W.cjs +26 -0
- package/dist/useDebounce-CxPj9WmE.js +19 -0
- package/dist/useGraphQLConfig-DZ0ZannB.js +63 -0
- package/dist/useGraphQLConfig-Dw8dDh3T.cjs +76 -0
- package/dist/useIntersection-B4J9UhaG.js +21 -0
- package/dist/useIntersection-DKWc5MY6.cjs +28 -0
- package/dist/{useMessageInterceptor-B87e3yu3.cjs → useMessageInterceptor-CstX10ih.cjs} +3 -3
- package/dist/{useMessageInterceptor-Bb7YRaWk.js → useMessageInterceptor-D5oAekXn.js} +2 -2
- package/dist/userIdentityContext-D2oFVFzo.d.cts +20 -0
- package/dist/userIdentityContext-DPFkCSCu.cjs +125 -0
- package/dist/userIdentityContext-Z65zM-Ae.js +109 -0
- package/dist/userIdentityContext-wYRpgkaJ.d.ts +20 -0
- package/dist/utilityTypes-DynzxjK3.js +1 -0
- package/dist/utilityTypes-xb8SjKSV.cjs +0 -0
- package/dist/utils-2SWrJ12w.cjs +29 -0
- package/dist/utils-B1xLx9S8.d.ts +15 -0
- package/dist/utils-B3x_9JTY.d.cts +15 -0
- package/dist/utils-BZtSmwgh.d.cts +22 -0
- package/dist/utils-Bcz5kAgP.js +92 -0
- package/dist/utils-CEKzBcN2.js +27 -0
- package/dist/utils-CMqFfqZx.cjs +130 -0
- package/dist/utils-CVovRwlw.js +606 -0
- package/dist/utils-CqBxIpEV.js +23 -0
- package/dist/utils-CsMbZmRw.cjs +33 -0
- package/dist/utils-DzPSXtmD.cjs +715 -0
- package/dist/utils-bxOCg2i9.d.ts +22 -0
- package/dist/variantInfo-B7IwRpCg.cjs +0 -0
- package/dist/variantInfo-BtOYUGWa.js +1 -0
- package/package.json +191 -7
- package/src/application/models/index.ts +0 -1
- package/src/application/utils/analyticsUtils.ts +1 -1
- package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +1 -1
- package/src/atoms/app/index.ts +1 -1
- package/src/atoms/chat/chatState.ts +1 -1
- package/src/atoms/chat/replies.ts +1 -1
- package/src/atoms/org/graphqlConfig.ts +1 -39
- package/src/atoms/org/index.ts +0 -1
- package/src/atoms/org/newOrgConfigAtom.ts +2 -6
- package/src/contexts/{amplitudeContext.tsx → amplitudeContext/amplitudeContext.tsx} +1 -2
- package/src/contexts/amplitudeContext/index.ts +1 -0
- package/src/contexts/{cdnContext.tsx → cdnContext/cdnContext.tsx} +1 -1
- package/src/contexts/cdnContext/index.ts +1 -0
- package/src/contexts/{chatContext.tsx → chatContext/chatContext.tsx} +3 -3
- package/src/contexts/chatContext/index.ts +1 -0
- package/src/contexts/{enviveConfigContext.tsx → enviveConfigContext/enviveConfigContext.tsx} +1 -1
- package/src/contexts/enviveConfigContext/index.ts +1 -0
- package/src/contexts/{enviveCssContext.tsx → enviveCssContext/enviveCssContext.tsx} +1 -1
- package/src/contexts/enviveCssContext/index.ts +1 -0
- package/src/contexts/{featureFlagContext.tsx → featureFlagContext/featureFlagContext.tsx} +1 -1
- package/src/contexts/featureFlagContext/index.ts +1 -0
- package/src/contexts/featureFlagServiceContext/index.ts +1 -0
- package/src/contexts/graphqlContext/index.ts +1 -0
- package/src/contexts/localStorageContext/index.ts +1 -0
- package/src/contexts/{localStorageContext.tsx → localStorageContext/localStorageContext.tsx} +2 -2
- package/src/contexts/newOrgConfigContext/index.ts +1 -0
- package/src/contexts/newOrgConfigContext/newOrgConfigContext.tsx +70 -0
- package/src/contexts/searchContext/index.ts +1 -0
- package/src/contexts/{searchContext.tsx → searchContext/searchContext.tsx} +5 -5
- package/src/contexts/sessionStorageContext/index.ts +1 -0
- package/src/contexts/{sessionStorageContext.tsx → sessionStorageContext/sessionStorageContext.tsx} +1 -1
- package/src/contexts/shopifyUrlContext/index.ts +1 -0
- package/src/contexts/systemSettingsContext/index.ts +1 -0
- package/src/contexts/userIdentityContext/index.ts +1 -0
- package/src/events/registerAnalyticsListeners.ts +2 -2
- package/src/favicon.ico +0 -0
- package/src/hooks/AmplitudeOperations/index.ts +1 -0
- package/src/hooks/{useAmplitudeOperations.ts → AmplitudeOperations/useAmplitudeOperations.ts} +1 -1
- package/src/hooks/AppDetails/index.ts +1 -0
- package/src/hooks/{useAppDetails.ts → AppDetails/useAppDetails.ts} +1 -3
- package/src/hooks/BlockBackButton/index.ts +1 -0
- package/src/hooks/CdnOperations/index.ts +1 -0
- package/src/hooks/{useCdnOperations.ts → CdnOperations/useCdnOperations.ts} +1 -1
- package/src/hooks/ChatToggle/index.ts +1 -0
- package/src/hooks/{useChatToggle.ts → ChatToggle/useChatToggle.ts} +1 -1
- package/src/hooks/ChatToggleAnalytics/index.ts +1 -0
- package/src/hooks/{useChatToggleAnalytics.ts → ChatToggleAnalytics/useChatToggleAnalytics.ts} +1 -1
- package/src/hooks/CustomerSupportHandoff/index.ts +1 -0
- package/src/hooks/Debounce/index.ts +1 -0
- package/src/hooks/ElementObserver/index.ts +1 -0
- package/src/hooks/GrabAndScroll/index.ts +1 -0
- package/src/hooks/GraphQLConfig/index.ts +1 -0
- package/src/hooks/{useGraphQLConfig.ts → GraphQLConfig/useGraphQLConfig.ts} +1 -1
- package/src/hooks/IdentifyUser/index.ts +1 -0
- package/src/hooks/{useIdentifyUser.ts → IdentifyUser/useIdentifyUser.ts} +1 -1
- package/src/hooks/ImageResolver/index.ts +1 -0
- package/src/hooks/Intersection/index.ts +1 -0
- package/src/hooks/IsSmallScreen/index.ts +1 -0
- package/src/hooks/LocalStorageOperations/index.ts +1 -0
- package/src/hooks/{useLocalStorageOperations.ts → LocalStorageOperations/useLocalStorageOperations.ts} +2 -2
- package/src/hooks/MessageFilter/index.ts +1 -0
- package/src/hooks/MessageScrollObserver/index.ts +1 -0
- package/src/hooks/NewOrgConfig/index.ts +1 -0
- package/src/hooks/{useNewOrgConfig.ts → NewOrgConfig/useNewOrgConfig.ts} +1 -1
- package/src/hooks/Search/index.ts +1 -0
- package/src/hooks/{useSearch.tsx → Search/useSearch.tsx} +5 -4
- package/src/hooks/SearchOperations/index.ts +1 -0
- package/src/hooks/SessionStorageOperations/index.ts +1 -0
- package/src/hooks/{useSessionStorageOperations.ts → SessionStorageOperations/useSessionStorageOperations.ts} +1 -1
- package/src/hooks/ShopifyUrlOperations/index.ts +1 -0
- package/src/hooks/{useShopifyUrlOperations.ts → ShopifyUrlOperations/useShopifyUrlOperations.ts} +1 -1
- package/src/hooks/SnapCalculator/index.ts +1 -0
- package/src/hooks/SystemSettingsContext/index.ts +1 -0
- package/src/hooks/SystemSettingsContext/useSystemSettingsContext.ts +14 -0
- package/src/hooks/TrackComponentVisibleEvent/index.ts +1 -0
- package/src/hooks/{useTrackComponentVisibleEvent.ts → TrackComponentVisibleEvent/useTrackComponentVisibleEvent.ts} +2 -2
- package/src/hooks/UpdateAnalyticsProps/index.ts +1 -0
- package/src/hooks/{useUpdateAnalyticsProps.ts → UpdateAnalyticsProps/useUpdateAnalyticsProps.ts} +1 -1
- package/dist/amplitudeContext-CHzas7Cf.d.cts +0 -52
- package/dist/amplitudeContext-D-7fmVh1.cjs +0 -356
- package/dist/amplitudeContext-hY3caPC6.js +0 -322
- package/dist/amplitudeContext-tJ4y-SzX.d.ts +0 -52
- package/dist/api-DjeZXxl_.js +0 -207
- package/dist/api-_JaUnIUj.cjs +0 -292
- package/dist/bandolier-DYEz4-8C.js +0 -1229
- package/dist/bandolier-o_-xrbOV.cjs +0 -1229
- package/dist/carpe-CsG5jCcl.cjs +0 -607
- package/dist/carpe-DONk00bZ.js +0 -605
- package/dist/cdnUtils-32v8bDX9.cjs +0 -16
- package/dist/cdnUtils-E4tLBt2g.js +0 -11
- package/dist/chat-CO7cRkaq.cjs +0 -506
- package/dist/chat-hcRc4RRd.js +0 -285
- package/dist/contexts/index.cjs +0 -57
- package/dist/contexts/index.d.cts +0 -10
- package/dist/contexts/index.d.ts +0 -10
- package/dist/contexts/index.js +0 -23
- package/dist/contexts-B4ihTBsV.cjs +0 -2980
- package/dist/contexts-DGlr7M1o.js +0 -2596
- package/dist/coterie-CKB93qfz.cjs +0 -239
- package/dist/coterie-DHcj2fRE.js +0 -239
- package/dist/custservice-types-Dy0kc9TW.cjs +0 -35
- package/dist/custservice-types-mnIunabv.js +0 -23
- package/dist/default-BnB4p0Se.cjs +0 -234
- package/dist/default-D6f5Dyt7.js +0 -199
- package/dist/default-ZKkE5zT4.cjs +0 -4
- package/dist/default-legGZJwI.js +0 -4
- package/dist/divIds-2dJlU3z8.cjs +0 -117
- package/dist/divIds-BUrN2vY-.js +0 -21
- package/dist/dreamlandBaby-BiRYYFav.js +0 -346
- package/dist/dreamlandBaby-zuvmfzfD.cjs +0 -346
- package/dist/embedded-BJLWIriJ.js +0 -23
- package/dist/embedded-Dl79TJLC.cjs +0 -131
- package/dist/entrypoints-Bs3pn6EV.js +0 -7
- package/dist/entrypoints-Dqi5pzWH.cjs +0 -19
- package/dist/enviveConfig-BccuzS2a.cjs +0 -240
- package/dist/enviveConfig-CzhTz8Aa.js +0 -152
- package/dist/fiveCbd-DwTTwC2j.cjs +0 -613
- package/dist/fiveCbd-Dz2NouOF.js +0 -613
- package/dist/forLoveAndLemons-DqSdyD6S.js +0 -665
- package/dist/forLoveAndLemons-Ud6mPrV3.cjs +0 -667
- package/dist/graphql-BNW60InJ.cjs +0 -128
- package/dist/graphql-CjB8wHzm.js +0 -74
- package/dist/graphqlConfig-CYt6tWII.js +0 -30
- package/dist/graphqlConfig-DicykC-o.cjs +0 -61
- package/dist/greenpan-B_EbPkSP.js +0 -397
- package/dist/greenpan-kPE4fJgd.cjs +0 -397
- package/dist/grooveLife-Ckuir319.js +0 -342
- package/dist/grooveLife-DKSEQp1F.cjs +0 -342
- package/dist/homegrownCannabis-BVPa2pqe.js +0 -410
- package/dist/homegrownCannabis-BwIAkxuA.cjs +0 -410
- package/dist/hooks/index.cjs +0 -63
- package/dist/hooks/index.d.cts +0 -314
- package/dist/hooks/index.d.ts +0 -314
- package/dist/hooks/index.js +0 -23
- package/dist/index-BMPtlgac.d.ts +0 -191
- package/dist/index-C7pGDl1A.d.ts +0 -1609
- package/dist/index-C9lgsCWp.d.cts +0 -203
- package/dist/index-Cc-wBCn6.d.ts +0 -203
- package/dist/index-DTu2X-YS.d.cts +0 -1609
- package/dist/index-OEifcBsm.d.cts +0 -191
- package/dist/jackArcher-B39OEIj6.cjs +0 -727
- package/dist/jackArcher-BwkWGybC.js +0 -727
- package/dist/jordanCraig-CxRH_jLi.js +0 -1786
- package/dist/jordanCraig-RwmWw-jM.cjs +0 -1786
- package/dist/kindredBravely-D78VwL20.cjs +0 -490
- package/dist/kindredBravely-DQDpAzdl.js +0 -490
- package/dist/kutFromTheKloth-TcXQkIti.js +0 -369
- package/dist/kutFromTheKloth-dXRrNti0.cjs +0 -369
- package/dist/larryAndSerges-Bh5XEXsZ.js +0 -262
- package/dist/larryAndSerges-COdBzOzu.cjs +0 -262
- package/dist/leapsAndRebounds-BbXnqkl5.cjs +0 -360
- package/dist/leapsAndRebounds-mjCaH1k-.js +0 -360
- package/dist/longevityrx-DdV3v26F.cjs +0 -320
- package/dist/longevityrx-DfPDfvAt.js +0 -320
- package/dist/lookOptic-DgXFGBPP.cjs +0 -282
- package/dist/lookOptic-FgVW1afF.js +0 -282
- package/dist/mantraBrand-C5gVm3rk.cjs +0 -750
- package/dist/mantraBrand-uV8HCDR8.js +0 -750
- package/dist/medterra-BtDpr1Hw.cjs +0 -583
- package/dist/medterra-DgzE7-mj.js +0 -583
- package/dist/modells-CJjsxOIR.js +0 -484
- package/dist/modells-Ck5KbRFj.cjs +0 -484
- package/dist/models-UZ6HszfZ.js +0 -1281
- package/dist/org-C2RrBVQR.cjs +0 -81
- package/dist/org-xMytX--e.js +0 -38
- package/dist/pressedFloral-Bteoboms.js +0 -661
- package/dist/pressedFloral-CexgV-xy.cjs +0 -661
- package/dist/search-BMOAmrmY.js +0 -459
- package/dist/search-Df0Ifneg.cjs +0 -672
- package/dist/skinPerfection-BGzq9lq-.cjs +0 -334
- package/dist/skinPerfection-BlvcEcUE.js +0 -334
- package/dist/snapSupplements-CbbGzAgO.cjs +0 -285
- package/dist/snapSupplements-kcsPAOm9.js +0 -285
- package/dist/socialProofClasses-Db8gzsfi.cjs +0 -40
- package/dist/socialProofClasses-kwDvwLOZ.js +0 -10
- package/dist/spanx-B4WFA_rI.js +0 -661
- package/dist/spanx-BWoE4F8b.cjs +0 -663
- package/dist/spanxStaging-BOrOjhXn.js +0 -845
- package/dist/spanxStaging-BfdfIug4.cjs +0 -848
- package/dist/suggestionBarV2-types-IMMOmCir.js +0 -10
- package/dist/suggestionBarV2-types-nnGNgFvR.cjs +0 -16
- package/dist/supergoop-22dd5_BS.js +0 -323
- package/dist/supergoop-B-a4cku2.cjs +0 -323
- package/dist/types--pr1GQQx.js +0 -154
- package/dist/types-BVSyY3Hk.cjs +0 -196
- package/dist/uniqueVintage-CJXiNNe7.js +0 -1211
- package/dist/uniqueVintage-D0jzJWlo.cjs +0 -1213
- package/dist/userIdentityContext-BPqvVIg0.d.cts +0 -20
- package/dist/userIdentityContext-wbCRmlzp.d.ts +0 -20
- package/dist/utils-C9ZSCx12.js +0 -888
- package/dist/utils-D5HO61hG.cjs +0 -1016
- package/dist/venaCbd-Bhhu_qUf.cjs +0 -365
- package/dist/venaCbd-CanovPS_.js +0 -365
- package/dist/westonJonBoucher-BC0x1ktI.cjs +0 -422
- package/dist/westonJonBoucher-BUu1_wP1.js +0 -422
- package/dist/wineEnthusiast-BlCryfil.cjs +0 -940
- package/dist/wineEnthusiast-Ck1x5iJq.js +0 -940
- package/dist/wolfMattress-D9Mjq-HP.js +0 -372
- package/dist/wolfMattress-JssghhC-.cjs +0 -372
- package/dist/wolfTactical-C6exYhL7.cjs +0 -349
- package/dist/wolfTactical-CnV3KQdI.js +0 -349
- package/src/application/models/supportedOrgs.ts +0 -161
- package/src/atoms/org/orgPageConfig.ts +0 -42
- package/src/contexts/index.ts +0 -16
- package/src/contexts/newOrgConfigContext.tsx +0 -104
- package/src/contexts/orgConfigContext.tsx +0 -106
- package/src/hooks/index.ts +0 -27
- package/src/hooks/useSystemSettingsContext.ts +0 -12
- package/src/merchants/bandolier/bandolier.ts +0 -1371
- package/src/merchants/carpe/carpe.ts +0 -653
- package/src/merchants/coterie/coterie.ts +0 -277
- package/src/merchants/default.ts +0 -196
- package/src/merchants/dreamlandBaby/dreamlandBaby.ts +0 -381
- package/src/merchants/fiveCbd/fiveCbd.ts +0 -691
- package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +0 -751
- package/src/merchants/greenpan/greenpan.ts +0 -434
- package/src/merchants/grooveLife/grooveLife.ts +0 -392
- package/src/merchants/homegrownCannabis/homegrownCannabis.ts +0 -474
- package/src/merchants/init-merchant.sh +0 -53
- package/src/merchants/jackArcher/jackArcher.ts +0 -989
- package/src/merchants/jordanCraig/jordanCraig.ts +0 -1927
- package/src/merchants/kindredBravely/kindredBravely.ts +0 -538
- package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +0 -421
- package/src/merchants/larryAndSerges/larryAndSerges.ts +0 -318
- package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +0 -424
- package/src/merchants/longevityrx/longevityrx.ts +0 -374
- package/src/merchants/lookOptic/lookOptic.ts +0 -323
- package/src/merchants/mantraBrand/mantraBrand.ts +0 -844
- package/src/merchants/medterra/medterra.ts +0 -673
- package/src/merchants/modells/modells.ts +0 -543
- package/src/merchants/pressedFloral/pressedFloral.ts +0 -728
- package/src/merchants/skinPerfection/skinPerfection.ts +0 -385
- package/src/merchants/snapSupplements/snapSupplements.ts +0 -328
- package/src/merchants/spanx/spanx.ts +0 -810
- package/src/merchants/spanx/spanxStaging.ts +0 -936
- package/src/merchants/supergoop/supergoop.ts +0 -375
- package/src/merchants/uniqueVintage/uniqueVintage.ts +0 -1314
- package/src/merchants/venaCbd/venaCbd.ts +0 -407
- package/src/merchants/westonJonBoucher/westonJonBoucher.ts +0 -473
- package/src/merchants/wineEnthusiast/wineEnthusiast.ts +0 -990
- package/src/merchants/wolfMattress/wolfMattress.ts +0 -411
- package/src/merchants/wolfTactical/wolfTactical.ts +0 -383
- /package/dist/{atomStore-KSoFS3Jj.cjs → AmplitudeOperations-CNyxbBY6.cjs} +0 -0
- /package/dist/{atomStore-CZnUUsrr.js → AmplitudeOperations-Oa2efWtF.js} +0 -0
- /package/dist/{locators-fBXS_pxP.js → atomStore-BS6qtYZF.js} +0 -0
- /package/dist/{locators-0YYZu9n4.cjs → atomStore-BjRyLFEx.cjs} +0 -0
- /package/dist/{utilityTypes-8sETsYPk.js → types-DtTnp0o0.js} +0 -0
- /package/dist/{utilityTypes-COShxVir.cjs → types-a8gm_IaQ.cjs} +0 -0
- /package/dist/{variantInfo-orXoPBCU.cjs → types.cjs} +0 -0
- /package/dist/{variantInfo-DbVxA1yE.js → types.js} +0 -0
- /package/src/contexts/{featureFlagServiceContext.tsx → featureFlagServiceContext/featureFlagServiceContext.tsx} +0 -0
- /package/src/contexts/{graphqlContext.tsx → graphqlContext/graphqlContext.tsx} +0 -0
- /package/src/contexts/{shopifyUrlContext.tsx → shopifyUrlContext/shopifyUrlContext.tsx} +0 -0
- /package/src/contexts/{systemSettingsContext.tsx → systemSettingsContext/systemSettingsContext.tsx} +0 -0
- /package/src/contexts/{userIdentityContext.tsx → userIdentityContext/userIdentityContext.tsx} +0 -0
- /package/src/hooks/{useBlockBackButton.ts → BlockBackButton/useBlockBackButton.ts} +0 -0
- /package/src/hooks/{useCustomerSupportHandoff.ts → CustomerSupportHandoff/useCustomerSupportHandoff.ts} +0 -0
- /package/src/hooks/{useDebounce.ts → Debounce/useDebounce.ts} +0 -0
- /package/src/hooks/{useElementObserver.ts → ElementObserver/useElementObserver.ts} +0 -0
- /package/src/hooks/{useGrabAndScroll.ts → GrabAndScroll/useGrabAndScroll.ts} +0 -0
- /package/src/hooks/{useImageResolver.ts → ImageResolver/useImageResolver.ts} +0 -0
- /package/src/hooks/{useIntersection.ts → Intersection/useIntersection.ts} +0 -0
- /package/src/hooks/{useIsSmallScreen.ts → IsSmallScreen/useIsSmallScreen.ts} +0 -0
- /package/src/hooks/{useMessageFilter.ts → MessageFilter/useMessageFilter.ts} +0 -0
- /package/src/hooks/{useMessageScrollObserver.ts → MessageScrollObserver/useMessageScrollObserver.ts} +0 -0
- /package/src/hooks/{useSearchOperations.ts → SearchOperations/useSearchOperations.ts} +0 -0
- /package/src/hooks/{useSnapCalculator.ts → SnapCalculator/useSnapCalculator.ts} +0 -0
package/dist/utils-D5HO61hG.cjs
DELETED
|
@@ -1,1016 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_models = require('./models-BkXg5eIP.cjs');
|
|
3
|
-
const require_api = require('./api-_JaUnIUj.cjs');
|
|
4
|
-
const require_amplitudeContext = require('./amplitudeContext-D-7fmVh1.cjs');
|
|
5
|
-
let __spiffy_ai_commerce_api_client = require("@spiffy-ai/commerce-api-client");
|
|
6
|
-
__spiffy_ai_commerce_api_client = require_chunk.__toESM(__spiffy_ai_commerce_api_client);
|
|
7
|
-
let react_dom = require("react-dom");
|
|
8
|
-
react_dom = require_chunk.__toESM(react_dom);
|
|
9
|
-
|
|
10
|
-
//#region src/application/utils/analyticsUtils.ts
|
|
11
|
-
const NORMALIZED_ADD_TO_CART_EVENT_NAMES = ["addtocart", "addedtocart"];
|
|
12
|
-
const CHECK_DATA_LAYER_INTERVAL_MS = 500;
|
|
13
|
-
const CHECK_DATA_LAYER_MAX_ATTEMPTS = 10;
|
|
14
|
-
/**
|
|
15
|
-
* Checks if a Google Analytics event is an add_to_cart event.
|
|
16
|
-
*
|
|
17
|
-
* @param event The event name to check.
|
|
18
|
-
*
|
|
19
|
-
* @returns True if the event is an add_to_cart event, false otherwise.
|
|
20
|
-
*/
|
|
21
|
-
const isAddToCartEvent = (event) => {
|
|
22
|
-
const normalizedEvent = event.replace(/[-_]/g, "").toLowerCase();
|
|
23
|
-
return NORMALIZED_ADD_TO_CART_EVENT_NAMES.some((name) => normalizedEvent.includes(name));
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Tracks an add_to_cart event in Amplitude.
|
|
27
|
-
*
|
|
28
|
-
* @param event The event to track.
|
|
29
|
-
*/
|
|
30
|
-
const handleAddToCartEvent = (event, track) => {
|
|
31
|
-
let eventProps;
|
|
32
|
-
if (require_models.isLegacyUAEcommerceEvent(event)) eventProps = {
|
|
33
|
-
items: event.ecommerce.add.products.map((product) => ({
|
|
34
|
-
item_name: product.name,
|
|
35
|
-
item_category: product.category,
|
|
36
|
-
price: product.price,
|
|
37
|
-
quantity: product.quantity
|
|
38
|
-
})),
|
|
39
|
-
currency: event.ecommerce.add.currencyCode,
|
|
40
|
-
event_format_version: "legacy_universal_analytics"
|
|
41
|
-
};
|
|
42
|
-
else if (require_models.isGA4EcommerceEvent(event)) eventProps = {
|
|
43
|
-
items: event.ecommerce.items.map((item) => ({
|
|
44
|
-
item_name: item.item_name,
|
|
45
|
-
item_category: item.item_category,
|
|
46
|
-
price: item.price,
|
|
47
|
-
quantity: item.quantity
|
|
48
|
-
})),
|
|
49
|
-
currency: event.ecommerce.currency,
|
|
50
|
-
event_format_version: "google_analytics_4"
|
|
51
|
-
};
|
|
52
|
-
else eventProps = {
|
|
53
|
-
event_properties: { ...event },
|
|
54
|
-
event_format_version: "unknown"
|
|
55
|
-
};
|
|
56
|
-
track(require_amplitudeContext.SpiffyMetricsEventName.AddToCartClicked, { eventProps });
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Wraps the window.dataLayer.push method to intercept add_to_cart events and send them to Amplitude.
|
|
60
|
-
* This function runs on an interval until the dataLayer is available.
|
|
61
|
-
*/
|
|
62
|
-
const initDataLayerWrapper = (track) => {
|
|
63
|
-
let attempts = 0;
|
|
64
|
-
const checkAndInitialize = () => {
|
|
65
|
-
if (!window.dataLayer || !window.dataLayer.push) {
|
|
66
|
-
attempts += 1;
|
|
67
|
-
if (attempts >= CHECK_DATA_LAYER_MAX_ATTEMPTS) {
|
|
68
|
-
require_api.logger_default.logDebug(`[spiffy-ai] dataLayer not available after ${CHECK_DATA_LAYER_MAX_ATTEMPTS} attempts`);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
setTimeout(checkAndInitialize, CHECK_DATA_LAYER_INTERVAL_MS);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
require_api.logger_default.logDebug("[spiffy-ai] dataLayer is available, wrapping push function...");
|
|
75
|
-
const originalPush = window.dataLayer.push;
|
|
76
|
-
window.dataLayer.push = (...args) => {
|
|
77
|
-
if (require_models.isBaseEcommerceEvent(args[0]) && isAddToCartEvent(args[0].event)) handleAddToCartEvent(args[0], track);
|
|
78
|
-
return originalPush.apply(window.dataLayer, args);
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
checkAndInitialize();
|
|
82
|
-
};
|
|
83
|
-
const initAmplitude = (track) => {
|
|
84
|
-
track(require_amplitudeContext.SpiffyMetricsEventName.BundleLoaded);
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
//#endregion
|
|
88
|
-
//#region src/application/utils/coreContextToApiContext.ts
|
|
89
|
-
const coreContextToApiContext = (context) => ({
|
|
90
|
-
chat_id: context.chatId,
|
|
91
|
-
org_id: context.orgId,
|
|
92
|
-
user_id: context.userId,
|
|
93
|
-
org_short_name: context.orgShortName,
|
|
94
|
-
source: context.source,
|
|
95
|
-
env: context.env
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
//#endregion
|
|
99
|
-
//#region src/application/utils/coreUserEventToApiUserEvent.ts
|
|
100
|
-
const coreUserEventToApiUserEvent = (data) => {
|
|
101
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.PdpVisit || data.category === __spiffy_ai_commerce_api_client.UserEventCategory.AddToCart) return {
|
|
102
|
-
event_id: data.eventId,
|
|
103
|
-
created_at: data.createdAt,
|
|
104
|
-
category: data.category,
|
|
105
|
-
attributes: {
|
|
106
|
-
product_id: data.attributes.productId,
|
|
107
|
-
parent_product_id: data.attributes.parentProductId,
|
|
108
|
-
url: data.attributes.url
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.PlpVisit) return {
|
|
112
|
-
event_id: data.eventId,
|
|
113
|
-
created_at: data.createdAt,
|
|
114
|
-
category: data.category,
|
|
115
|
-
attributes: {
|
|
116
|
-
category: __spiffy_ai_commerce_api_client.PLPAttributeCategory.Id,
|
|
117
|
-
attributes: { id: data.attributes.attributes.id }
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.QueryTyped) return {
|
|
121
|
-
event_id: data.eventId,
|
|
122
|
-
created_at: data.createdAt,
|
|
123
|
-
category: data.category,
|
|
124
|
-
attributes: { query: data.attributes.query }
|
|
125
|
-
};
|
|
126
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.Search) return {
|
|
127
|
-
event_id: data.eventId,
|
|
128
|
-
created_at: data.createdAt,
|
|
129
|
-
category: data.category,
|
|
130
|
-
attributes: {
|
|
131
|
-
search_term: data.attributes.searchTerm,
|
|
132
|
-
selected_filters: data.attributes.selectedFilters
|
|
133
|
-
}
|
|
134
|
-
};
|
|
135
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.SuggestionClicked) return {
|
|
136
|
-
event_id: data.eventId,
|
|
137
|
-
created_at: data.createdAt,
|
|
138
|
-
category: data.category,
|
|
139
|
-
attributes: { suggestion_id: data.attributes.suggestionId }
|
|
140
|
-
};
|
|
141
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.PageVisit) return {
|
|
142
|
-
event_id: data.eventId,
|
|
143
|
-
created_at: data.createdAt,
|
|
144
|
-
category: data.category,
|
|
145
|
-
attributes: {
|
|
146
|
-
url: data.attributes.url,
|
|
147
|
-
page_visit_category: data.attributes.pageVisitCategory
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.FormSubmitted) return {
|
|
151
|
-
event_id: data.eventId,
|
|
152
|
-
created_at: data.createdAt,
|
|
153
|
-
category: data.category,
|
|
154
|
-
attributes: {
|
|
155
|
-
filled_schema: { ...data.attributes.filledSchema },
|
|
156
|
-
form_response_id: data.attributes.formResponseId,
|
|
157
|
-
form_type: data.attributes.formType
|
|
158
|
-
}
|
|
159
|
-
};
|
|
160
|
-
return {
|
|
161
|
-
event_id: data.eventId,
|
|
162
|
-
created_at: data.createdAt,
|
|
163
|
-
category: data.category
|
|
164
|
-
};
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
//#endregion
|
|
168
|
-
//#region src/application/utils/divideArray.ts
|
|
169
|
-
const divideArray = (array, size) => {
|
|
170
|
-
const rows = [];
|
|
171
|
-
for (let i = 0; i < size; i += 1) rows.push(array.filter((_, index) => index % size === i));
|
|
172
|
-
return rows;
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
//#endregion
|
|
176
|
-
//#region src/application/utils/mutationHelper.ts
|
|
177
|
-
const compareTokens = (original, comparison) => {
|
|
178
|
-
const originalTokens = new Set(original.split(" "));
|
|
179
|
-
const comparisonTokens = new Set(comparison.split(" "));
|
|
180
|
-
return [...originalTokens].filter((token) => !comparisonTokens.has(token));
|
|
181
|
-
};
|
|
182
|
-
var MutationHelper = class {
|
|
183
|
-
static fireClassChange(record, node, fn) {
|
|
184
|
-
if (node && record.oldValue !== node?.classList.value) fn(node?.classList);
|
|
185
|
-
}
|
|
186
|
-
static fireClassAdded(record, node, classMap) {
|
|
187
|
-
if (node && record.oldValue) compareTokens(node?.classList.value, record.oldValue).forEach((className) => classMap.get(className)?.());
|
|
188
|
-
}
|
|
189
|
-
static fireClassRemoved(record, node, classMap) {
|
|
190
|
-
if (node && record.oldValue) compareTokens(record.oldValue, node?.classList.value).forEach((className) => classMap.get(className)?.());
|
|
191
|
-
}
|
|
192
|
-
static fireSubtreeChange(nodes, fn) {
|
|
193
|
-
nodes.length && fn?.(nodes);
|
|
194
|
-
}
|
|
195
|
-
static isClass(mutation) {
|
|
196
|
-
return mutation.type === "attributes" && mutation.attributeName === "class";
|
|
197
|
-
}
|
|
198
|
-
static isChildList(mutation) {
|
|
199
|
-
return mutation.type === "childList";
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
//#endregion
|
|
204
|
-
//#region src/application/utils/elementObserver.ts
|
|
205
|
-
/**
|
|
206
|
-
* The `ElementObserver` class monitors all changes related to the specific element it is responsible for.
|
|
207
|
-
* It is automatically instantiated by the `useElementObserver` hook, which manages all instances of this class.
|
|
208
|
-
*
|
|
209
|
-
* How it works:
|
|
210
|
-
*
|
|
211
|
-
* Each instance of `ElementObserver` holds several pieces of information related to the node it is monitoring,
|
|
212
|
-
* such as the node's selector and its `MutationObserver`. This class is responsible for translating raw node
|
|
213
|
-
* changes into a more user-friendly format. For example, when the node is added to the DOM, the `ElementObserver`
|
|
214
|
-
* is notified by the `DOMObserver`, which triggers the `onAdd` callback function on the respective `useElementObserver`
|
|
215
|
-
* instance.
|
|
216
|
-
*
|
|
217
|
-
* Instances of `ElementObserver` are fully managed by the `useElementObserver` hook, requiring no additional configuration.
|
|
218
|
-
* When the hook is destroyed, its corresponding `ElementObserver` instance is automatically removed.
|
|
219
|
-
*
|
|
220
|
-
*/
|
|
221
|
-
var ElementObserver = class {
|
|
222
|
-
constructor(selector) {
|
|
223
|
-
this.selector = selector;
|
|
224
|
-
this.mutation = null;
|
|
225
|
-
this.node = null;
|
|
226
|
-
this.eventListeners = /* @__PURE__ */ new Map();
|
|
227
|
-
this.classAdded = /* @__PURE__ */ new Map();
|
|
228
|
-
this.classRemoved = /* @__PURE__ */ new Map();
|
|
229
|
-
this.nodeDisplay = "block";
|
|
230
|
-
this.addFn = () => {};
|
|
231
|
-
this.removeFn = () => {};
|
|
232
|
-
this.changeFn = () => {};
|
|
233
|
-
this.classChangeFn = () => {};
|
|
234
|
-
this.addChildFn = void 0;
|
|
235
|
-
this.removeChildFn = void 0;
|
|
236
|
-
this.resetFn = () => {};
|
|
237
|
-
}
|
|
238
|
-
handleAttributes(mutationRecord) {
|
|
239
|
-
mutationRecord.filter(MutationHelper.isClass).forEach((mutation) => {
|
|
240
|
-
MutationHelper.fireClassChange(mutation, this.node, this.classChangeFn);
|
|
241
|
-
MutationHelper.fireClassAdded(mutation, this.node, this.classAdded);
|
|
242
|
-
MutationHelper.fireClassRemoved(mutation, this.node, this.classRemoved);
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
handleChildList(mutationRecord) {
|
|
246
|
-
if (!this.addChildFn && !this.removeChildFn) return;
|
|
247
|
-
mutationRecord.filter(MutationHelper.isChildList).forEach((mutation) => {
|
|
248
|
-
MutationHelper.fireSubtreeChange(mutation.addedNodes, this.addChildFn);
|
|
249
|
-
MutationHelper.fireSubtreeChange(mutation.removedNodes, this.removeChildFn);
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
addInitialListeners() {
|
|
253
|
-
this.eventListeners.forEach((v, k) => this.node?.addEventListener(k, v));
|
|
254
|
-
}
|
|
255
|
-
clearEventListeners() {
|
|
256
|
-
this.eventListeners.forEach((v, k) => this.node?.removeEventListener(k, v));
|
|
257
|
-
this.eventListeners.clear();
|
|
258
|
-
}
|
|
259
|
-
renew(newNode) {
|
|
260
|
-
if (newNode) {
|
|
261
|
-
this.destroy();
|
|
262
|
-
this.watch(newNode);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
getSelector() {
|
|
266
|
-
return this.selector;
|
|
267
|
-
}
|
|
268
|
-
getNode() {
|
|
269
|
-
return this.node;
|
|
270
|
-
}
|
|
271
|
-
synchronize() {
|
|
272
|
-
const parsedNode = this.getSelector().parse();
|
|
273
|
-
if (this.getNode() !== parsedNode) {
|
|
274
|
-
this.renew(parsedNode);
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (!this.getNode() && parsedNode) {
|
|
278
|
-
this.watch(parsedNode);
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
if (this.getNode() && !parsedNode) this.destroy();
|
|
282
|
-
}
|
|
283
|
-
init() {
|
|
284
|
-
const node = this.getSelector().parse();
|
|
285
|
-
if (node) this.watch(node);
|
|
286
|
-
}
|
|
287
|
-
watch(node) {
|
|
288
|
-
if (!this.mutation) {
|
|
289
|
-
this.mutation = new MutationObserver((mutationRecord) => {
|
|
290
|
-
this.handleAttributes(mutationRecord);
|
|
291
|
-
this.handleChildList(mutationRecord);
|
|
292
|
-
this.changeFn(this.node);
|
|
293
|
-
});
|
|
294
|
-
this.mutation.observe(node, {
|
|
295
|
-
childList: true,
|
|
296
|
-
subtree: true,
|
|
297
|
-
attributes: true,
|
|
298
|
-
attributeOldValue: true
|
|
299
|
-
});
|
|
300
|
-
this.node = node;
|
|
301
|
-
this.addFn(this.node);
|
|
302
|
-
this.addInitialListeners();
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
destroy() {
|
|
306
|
-
this.resetFn();
|
|
307
|
-
this.removeFn(this.node);
|
|
308
|
-
this.mutation?.disconnect();
|
|
309
|
-
this.clearEventListeners();
|
|
310
|
-
this.classAdded.clear();
|
|
311
|
-
this.classRemoved.clear();
|
|
312
|
-
this.mutation = null;
|
|
313
|
-
this.node = null;
|
|
314
|
-
}
|
|
315
|
-
render(fn) {
|
|
316
|
-
if (this.node) return (0, react_dom.createPortal)(fn(), this.node);
|
|
317
|
-
}
|
|
318
|
-
fire(event) {
|
|
319
|
-
if (this.node) this.node.dispatchEvent(new MouseEvent(event, {
|
|
320
|
-
bubbles: true,
|
|
321
|
-
cancelable: true,
|
|
322
|
-
view: window
|
|
323
|
-
}));
|
|
324
|
-
}
|
|
325
|
-
show() {
|
|
326
|
-
const display = this.node?.style.display;
|
|
327
|
-
if (this.node && display === "none") this.node.style.display = this.nodeDisplay || "block";
|
|
328
|
-
}
|
|
329
|
-
hide() {
|
|
330
|
-
const display = this.node?.style.display;
|
|
331
|
-
if (this.node && display !== "none") {
|
|
332
|
-
this.nodeDisplay = display || "block";
|
|
333
|
-
this.node.style.display = "none";
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
registerEvent(event, fn) {
|
|
337
|
-
if (this.node) {
|
|
338
|
-
const previousFn = this.eventListeners.get(event);
|
|
339
|
-
if (previousFn) this.node.removeEventListener(event, previousFn);
|
|
340
|
-
this.node.addEventListener(event, fn);
|
|
341
|
-
}
|
|
342
|
-
this.eventListeners.set(event, fn);
|
|
343
|
-
}
|
|
344
|
-
registerOnReset(fn) {
|
|
345
|
-
this.resetFn = fn;
|
|
346
|
-
}
|
|
347
|
-
registerOnChange(fn) {
|
|
348
|
-
this.changeFn = fn;
|
|
349
|
-
}
|
|
350
|
-
registerOnAdd(fn) {
|
|
351
|
-
this.addFn = fn;
|
|
352
|
-
}
|
|
353
|
-
registerOnRemove(fn) {
|
|
354
|
-
this.removeFn = fn;
|
|
355
|
-
}
|
|
356
|
-
registerOnclassChange(fn) {
|
|
357
|
-
this.classChangeFn = fn;
|
|
358
|
-
}
|
|
359
|
-
registerOnAddChild(fn) {
|
|
360
|
-
this.addChildFn = fn;
|
|
361
|
-
}
|
|
362
|
-
registerOnRemoveChild(fn) {
|
|
363
|
-
this.removeChildFn = fn;
|
|
364
|
-
}
|
|
365
|
-
registerOnClassAdded(className, fn) {
|
|
366
|
-
this.classAdded.set(className, fn);
|
|
367
|
-
}
|
|
368
|
-
registerOnClassRemoved(className, fn) {
|
|
369
|
-
this.classRemoved.set(className, fn);
|
|
370
|
-
}
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
//#endregion
|
|
374
|
-
//#region src/application/utils/domObserver.ts
|
|
375
|
-
/**
|
|
376
|
-
* This class manages a `MutationObserver` for the `document.body`. It monitors nodes that are
|
|
377
|
-
* added or removed from the DOM and notifies the observers for each observable element
|
|
378
|
-
* when they are ready to be watched.
|
|
379
|
-
*
|
|
380
|
-
* How that works:
|
|
381
|
-
*
|
|
382
|
-
* When the `observe` function is called, it attaches a `MutationObserver` to the `document.body` element.
|
|
383
|
-
* All changes to `document.body` are tracked by this observer. When changes are detected, the `MutationObserver`
|
|
384
|
-
* iterates through all added and removed nodes and checks if each node exists in the main map of observable elements.
|
|
385
|
-
*
|
|
386
|
-
* If a match is found, it notifies the corresponding `ElementObserver` instance to start monitoring changes for that element.
|
|
387
|
-
*
|
|
388
|
-
* The primary `MutationObserver` remains active until the `destroy` function is called. Calling `destroy` will disconnect all
|
|
389
|
-
* individual element observers and release any associated resources.
|
|
390
|
-
*
|
|
391
|
-
* There is no need to explicitly call the `observe` function. It is automatically invoked when a `useElementObserver` hook is instantiated.
|
|
392
|
-
*
|
|
393
|
-
*/
|
|
394
|
-
var DOMObserver = class {
|
|
395
|
-
static {
|
|
396
|
-
this.listeners = /* @__PURE__ */ new Map();
|
|
397
|
-
}
|
|
398
|
-
static notifyAdition(records, nodeMapping) {
|
|
399
|
-
records.forEach((record) => record.addedNodes.forEach((node) => {
|
|
400
|
-
nodeMapping.get(node)?.watch(node);
|
|
401
|
-
nodeMapping.delete(node);
|
|
402
|
-
}));
|
|
403
|
-
}
|
|
404
|
-
static notifyRemoval(records, nodeMapping) {
|
|
405
|
-
records.forEach((record) => record.removedNodes.forEach((node) => {
|
|
406
|
-
nodeMapping.get(node)?.destroy();
|
|
407
|
-
nodeMapping.delete(node);
|
|
408
|
-
}));
|
|
409
|
-
}
|
|
410
|
-
static notifyChildrenChanges(nodeMapping) {
|
|
411
|
-
Array.from(nodeMapping.values()).forEach((observer) => observer.synchronize());
|
|
412
|
-
}
|
|
413
|
-
static mapNodeInstancesToListeners() {
|
|
414
|
-
const nodeMapping = /* @__PURE__ */ new Map();
|
|
415
|
-
this.listeners.forEach((observer) => {
|
|
416
|
-
const node = observer.getNode() || observer.getSelector()?.parse();
|
|
417
|
-
if (node) nodeMapping.set(node, observer);
|
|
418
|
-
});
|
|
419
|
-
return nodeMapping;
|
|
420
|
-
}
|
|
421
|
-
static add(selector) {
|
|
422
|
-
const node = selector.getPattern();
|
|
423
|
-
let elementObserver = this.listeners.get(node);
|
|
424
|
-
if (elementObserver) return elementObserver;
|
|
425
|
-
elementObserver = new ElementObserver(selector);
|
|
426
|
-
this.listeners.set(node, elementObserver);
|
|
427
|
-
return elementObserver;
|
|
428
|
-
}
|
|
429
|
-
static remove(selector) {
|
|
430
|
-
const node = selector.getPattern();
|
|
431
|
-
this.listeners.get(node)?.destroy();
|
|
432
|
-
this.listeners.delete(node);
|
|
433
|
-
}
|
|
434
|
-
static observe() {
|
|
435
|
-
if (!this.documentObserver) {
|
|
436
|
-
this.documentObserver = new MutationObserver((mutations) => {
|
|
437
|
-
const nodeMapping = this.mapNodeInstancesToListeners();
|
|
438
|
-
this.notifyAdition(mutations, nodeMapping);
|
|
439
|
-
this.notifyRemoval(mutations, nodeMapping);
|
|
440
|
-
this.notifyChildrenChanges(nodeMapping);
|
|
441
|
-
});
|
|
442
|
-
this.documentObserver.observe(document.body, {
|
|
443
|
-
childList: true,
|
|
444
|
-
subtree: true
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
static destroy() {
|
|
449
|
-
this.documentObserver?.disconnect();
|
|
450
|
-
this.listeners.forEach((listener) => listener.destroy());
|
|
451
|
-
this.listeners.clear();
|
|
452
|
-
this.documentObserver = null;
|
|
453
|
-
}
|
|
454
|
-
};
|
|
455
|
-
|
|
456
|
-
//#endregion
|
|
457
|
-
//#region src/application/utils/imageFilter.ts
|
|
458
|
-
const getRecentProductImageUrls = (lastMessages, currentProductId) => {
|
|
459
|
-
const productMessages = lastMessages.filter((message) => message.type === require_models.MessageType.Product && message.metadata?.imageUrl).map((m) => m);
|
|
460
|
-
return [...productMessages.filter((m) => m.metadata?.id === currentProductId), ...productMessages.filter((m) => m.metadata?.id !== currentProductId)].map((m) => m.metadata.imageUrl);
|
|
461
|
-
};
|
|
462
|
-
|
|
463
|
-
//#endregion
|
|
464
|
-
//#region src/application/utils/merchantUtils.ts
|
|
465
|
-
const prepareMerchantPage = () => {
|
|
466
|
-
let metaViewport = document.querySelector("meta[name='viewport']");
|
|
467
|
-
if (metaViewport) {
|
|
468
|
-
const content = metaViewport.getAttribute("content");
|
|
469
|
-
if (!content?.includes("maximum-scale=1")) metaViewport.setAttribute("content", `${content}, maximum-scale=1`);
|
|
470
|
-
return;
|
|
471
|
-
}
|
|
472
|
-
metaViewport = document.createElement("meta");
|
|
473
|
-
metaViewport.setAttribute("name", "viewport");
|
|
474
|
-
metaViewport.setAttribute("content", "width=device-width, initial-scale=1, maximum-scale=1");
|
|
475
|
-
document.head.appendChild(metaViewport);
|
|
476
|
-
};
|
|
477
|
-
|
|
478
|
-
//#endregion
|
|
479
|
-
//#region src/application/utils/messageFromFormSubmittedEvent.ts
|
|
480
|
-
const messageFromFormSubmittedEvent = (event, formResponseAttributes) => {
|
|
481
|
-
if (event.category !== __spiffy_ai_commerce_api_client.UserEventCategory.FormSubmitted) return;
|
|
482
|
-
const formStringContents = Object.entries(formResponseAttributes.schema.properties).map(([key, value]) => `${value.title}: ${event.attributes.filledSchema[key]}`).join("\n");
|
|
483
|
-
return {
|
|
484
|
-
id: event.eventId,
|
|
485
|
-
role: require_models.MessageRole.User,
|
|
486
|
-
type: require_models.MessageType.QueryTyped,
|
|
487
|
-
createdAt: event.createdAt,
|
|
488
|
-
metadata: { content: formStringContents }
|
|
489
|
-
};
|
|
490
|
-
};
|
|
491
|
-
|
|
492
|
-
//#endregion
|
|
493
|
-
//#region src/application/utils/messageFromQueryEvent.ts
|
|
494
|
-
/**
|
|
495
|
-
* Transforms a query UserEvent object into a Message object for presentation.
|
|
496
|
-
*
|
|
497
|
-
* @param event The user event object received from the server
|
|
498
|
-
*
|
|
499
|
-
* @returns A Message if the event is a query event, otherwise undefined
|
|
500
|
-
*/
|
|
501
|
-
const messageFromQueryEvent = (event) => {
|
|
502
|
-
if (event.category === __spiffy_ai_commerce_api_client.UserEventCategory.QueryTyped) return {
|
|
503
|
-
id: event.eventId,
|
|
504
|
-
role: require_models.MessageRole.User,
|
|
505
|
-
type: require_models.MessageType.QueryTyped,
|
|
506
|
-
createdAt: event.createdAt,
|
|
507
|
-
metadata: { content: event.attributes.query }
|
|
508
|
-
};
|
|
509
|
-
if (event.category === __spiffy_ai_commerce_api_client.UserEventCategory.Search) return {
|
|
510
|
-
id: event.eventId,
|
|
511
|
-
role: require_models.MessageRole.User,
|
|
512
|
-
type: require_models.MessageType.Search,
|
|
513
|
-
createdAt: event.createdAt,
|
|
514
|
-
metadata: {
|
|
515
|
-
searchTerm: event.attributes.searchTerm || "",
|
|
516
|
-
selectedFilters: event.attributes.selectedFilters || []
|
|
517
|
-
}
|
|
518
|
-
};
|
|
519
|
-
};
|
|
520
|
-
|
|
521
|
-
//#endregion
|
|
522
|
-
//#region src/application/utils/messageFromResponse.ts
|
|
523
|
-
/**
|
|
524
|
-
* Transforms a server Response object into a Message object for presentation.
|
|
525
|
-
*
|
|
526
|
-
* @param response The response object received from the server containing model generated content
|
|
527
|
-
*
|
|
528
|
-
* @returns A Message if the response contains known attributes, undefined otherwise
|
|
529
|
-
*/
|
|
530
|
-
const messageFromResponse = (response) => {
|
|
531
|
-
if (response == null) return;
|
|
532
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Text) return {
|
|
533
|
-
id: response.id,
|
|
534
|
-
createdAt: response.createdAt,
|
|
535
|
-
type: require_models.MessageType.Text,
|
|
536
|
-
role: require_models.MessageRole.Assistant,
|
|
537
|
-
metadata: { content: response.attributes.content }
|
|
538
|
-
};
|
|
539
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Product) return {
|
|
540
|
-
id: response.id,
|
|
541
|
-
createdAt: response.createdAt,
|
|
542
|
-
role: require_models.MessageRole.Assistant,
|
|
543
|
-
type: require_models.MessageType.Product,
|
|
544
|
-
metadata: { ...response.attributes }
|
|
545
|
-
};
|
|
546
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Review) return {
|
|
547
|
-
id: response.id,
|
|
548
|
-
createdAt: response.createdAt,
|
|
549
|
-
type: require_models.MessageType.Review,
|
|
550
|
-
role: require_models.MessageRole.Assistant,
|
|
551
|
-
metadata: {
|
|
552
|
-
review: response.attributes.review,
|
|
553
|
-
reviewer: response.attributes.reviewer,
|
|
554
|
-
stars: response.attributes.stars,
|
|
555
|
-
title: response.attributes.title,
|
|
556
|
-
richInformation: response.attributes.richInformation
|
|
557
|
-
}
|
|
558
|
-
};
|
|
559
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Separator) return {
|
|
560
|
-
id: response.id,
|
|
561
|
-
createdAt: response.createdAt,
|
|
562
|
-
type: require_models.MessageType.Separator,
|
|
563
|
-
role: require_models.MessageRole.Assistant
|
|
564
|
-
};
|
|
565
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Page) return {
|
|
566
|
-
id: response.id,
|
|
567
|
-
createdAt: response.createdAt,
|
|
568
|
-
role: require_models.MessageRole.Assistant,
|
|
569
|
-
type: require_models.MessageType.Page,
|
|
570
|
-
metadata: { ...response.attributes }
|
|
571
|
-
};
|
|
572
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.ProductSearch) return {
|
|
573
|
-
id: response.id,
|
|
574
|
-
createdAt: response.createdAt,
|
|
575
|
-
role: require_models.MessageRole.Assistant,
|
|
576
|
-
type: require_models.MessageType.ProductSearch,
|
|
577
|
-
metadata: { ...response.attributes }
|
|
578
|
-
};
|
|
579
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.ProductSearchFilter) return {
|
|
580
|
-
id: response.id,
|
|
581
|
-
createdAt: response.createdAt,
|
|
582
|
-
role: require_models.MessageRole.Assistant,
|
|
583
|
-
type: require_models.MessageType.ProductSearchFilter,
|
|
584
|
-
metadata: { ...response.attributes }
|
|
585
|
-
};
|
|
586
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Form) return {
|
|
587
|
-
id: response.id,
|
|
588
|
-
createdAt: response.createdAt,
|
|
589
|
-
role: require_models.MessageRole.Assistant,
|
|
590
|
-
type: require_models.MessageType.Form,
|
|
591
|
-
metadata: {
|
|
592
|
-
formType: response.attributes.formCategory?.formType,
|
|
593
|
-
fields: Object.entries(response.attributes.schema.properties).map(([key, value]) => ({
|
|
594
|
-
key,
|
|
595
|
-
title: value.title,
|
|
596
|
-
type: value.type,
|
|
597
|
-
format: value.format,
|
|
598
|
-
required: response.attributes.schema.required.includes(key)
|
|
599
|
-
}))
|
|
600
|
-
}
|
|
601
|
-
};
|
|
602
|
-
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Order) return {
|
|
603
|
-
id: response.id,
|
|
604
|
-
createdAt: response.createdAt,
|
|
605
|
-
role: require_models.MessageRole.Assistant,
|
|
606
|
-
type: require_models.MessageType.Order,
|
|
607
|
-
metadata: { ...response.attributes }
|
|
608
|
-
};
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
//#endregion
|
|
612
|
-
//#region src/application/utils/messageFromSuggestionEvent.ts
|
|
613
|
-
/**
|
|
614
|
-
* Transforms a UserEvent object into a Message object for presentation.
|
|
615
|
-
*
|
|
616
|
-
* @param event The UserEvent object received from the server
|
|
617
|
-
* @param suggestions A list of generated suggestions to match the event to
|
|
618
|
-
*
|
|
619
|
-
* @returns A Message if the event is a suggestion click event, undefined otherwise
|
|
620
|
-
*/
|
|
621
|
-
const messageFromSuggestionEvent = (event, suggestions) => {
|
|
622
|
-
if (event.category === __spiffy_ai_commerce_api_client.UserEventCategory.SuggestionClicked) {
|
|
623
|
-
const { suggestionId } = event.attributes;
|
|
624
|
-
return {
|
|
625
|
-
id: event.eventId,
|
|
626
|
-
role: require_models.MessageRole.User,
|
|
627
|
-
type: require_models.MessageType.SuggestionClicked,
|
|
628
|
-
createdAt: event.createdAt,
|
|
629
|
-
metadata: {
|
|
630
|
-
suggestionId,
|
|
631
|
-
suggestionContent: suggestions.find((s) => s.id === suggestionId)?.content ?? ""
|
|
632
|
-
}
|
|
633
|
-
};
|
|
634
|
-
}
|
|
635
|
-
};
|
|
636
|
-
|
|
637
|
-
//#endregion
|
|
638
|
-
//#region src/application/utils/nextMessageRequestToApiRequest.ts
|
|
639
|
-
const messageRequestToCommerceMessageRequest = (data) => ({
|
|
640
|
-
context: {
|
|
641
|
-
chat_id: data.context.chatId,
|
|
642
|
-
org_id: data.context.orgId,
|
|
643
|
-
org_short_name: data.context.orgShortName,
|
|
644
|
-
user_id: data.context.userId,
|
|
645
|
-
source: data.context.source,
|
|
646
|
-
env: data.context.env
|
|
647
|
-
},
|
|
648
|
-
id: data.id,
|
|
649
|
-
feature_flags: data.featureFlags,
|
|
650
|
-
user_events: data.userEvents?.map((userEvent) => coreUserEventToApiUserEvent(userEvent)),
|
|
651
|
-
generation_params: {
|
|
652
|
-
model: data.generationParams?.model,
|
|
653
|
-
max_tokens: data.generationParams?.maxTokens,
|
|
654
|
-
stop: data.generationParams?.stop,
|
|
655
|
-
stream: data.generationParams?.stream,
|
|
656
|
-
temperature: data.generationParams?.temperature,
|
|
657
|
-
top_p: data.generationParams?.topP,
|
|
658
|
-
num_suggestions: data.generationParams?.numSuggestions,
|
|
659
|
-
response_system_prompt: data.generationParams?.responseSystemPrompt,
|
|
660
|
-
suggestion_system_prompt: data.generationParams?.suggestionSystemPrompt,
|
|
661
|
-
response_caching: data.generationParams?.responseCaching
|
|
662
|
-
}
|
|
663
|
-
});
|
|
664
|
-
|
|
665
|
-
//#endregion
|
|
666
|
-
//#region src/application/utils/nodeSelector.ts
|
|
667
|
-
var NodeSelector = class {
|
|
668
|
-
constructor(pattern) {
|
|
669
|
-
this.pattern = pattern;
|
|
670
|
-
this.root = document;
|
|
671
|
-
}
|
|
672
|
-
getPattern() {
|
|
673
|
-
return this.pattern;
|
|
674
|
-
}
|
|
675
|
-
setRoot(root) {
|
|
676
|
-
this.root = root;
|
|
677
|
-
}
|
|
678
|
-
getRoot() {
|
|
679
|
-
return this.root;
|
|
680
|
-
}
|
|
681
|
-
};
|
|
682
|
-
var QuerySelector = class extends NodeSelector {
|
|
683
|
-
parse() {
|
|
684
|
-
return this.getRoot().querySelector(this.getPattern());
|
|
685
|
-
}
|
|
686
|
-
};
|
|
687
|
-
var IDSelector = class extends NodeSelector {
|
|
688
|
-
parse() {
|
|
689
|
-
return this.getRoot().getElementById(this.getPattern());
|
|
690
|
-
}
|
|
691
|
-
};
|
|
692
|
-
var XpathSelector = class extends NodeSelector {
|
|
693
|
-
parse() {
|
|
694
|
-
return this.getRoot()?.evaluate(this.getPattern(), this.getRoot(), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)?.singleNodeValue;
|
|
695
|
-
}
|
|
696
|
-
};
|
|
697
|
-
var ChainSelector = class extends NodeSelector {
|
|
698
|
-
parse() {
|
|
699
|
-
let selectorIndex = 0;
|
|
700
|
-
const selectors = this.getPattern().split("@");
|
|
701
|
-
const lastIndex = selectors.length - 1;
|
|
702
|
-
const parseChain = (pattern, prevNode) => {
|
|
703
|
-
const selector = SelectorFactory.parse(pattern);
|
|
704
|
-
if (prevNode) selector.setRoot(prevNode);
|
|
705
|
-
const currentNode = selector.parse();
|
|
706
|
-
if (selectorIndex === lastIndex) return currentNode;
|
|
707
|
-
let node = currentNode || document;
|
|
708
|
-
if (currentNode?.shadowRoot) node = currentNode.shadowRoot;
|
|
709
|
-
if (currentNode?.contentWindow) node = currentNode.contentWindow?.document;
|
|
710
|
-
return parseChain(selectors[++selectorIndex].trim(), node);
|
|
711
|
-
};
|
|
712
|
-
return parseChain(selectors[selectorIndex].trim());
|
|
713
|
-
}
|
|
714
|
-
};
|
|
715
|
-
var Empty = class extends NodeSelector {
|
|
716
|
-
constructor() {
|
|
717
|
-
super("");
|
|
718
|
-
}
|
|
719
|
-
parse() {
|
|
720
|
-
return null;
|
|
721
|
-
}
|
|
722
|
-
};
|
|
723
|
-
var SelectorFactory = class {
|
|
724
|
-
static parse(composedSelector) {
|
|
725
|
-
if (!composedSelector) return new Empty();
|
|
726
|
-
const split = composedSelector.split("|");
|
|
727
|
-
const type = split[0];
|
|
728
|
-
const selector = split[1];
|
|
729
|
-
switch (type) {
|
|
730
|
-
case "id": return this.id(selector);
|
|
731
|
-
case "query": return this.query(selector);
|
|
732
|
-
case "xpath": return this.xpath(selector);
|
|
733
|
-
default: return new Empty();
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
static check(selector) {
|
|
737
|
-
return selector ?? new Empty();
|
|
738
|
-
}
|
|
739
|
-
static chain(pattern) {
|
|
740
|
-
return pattern ? new ChainSelector(pattern) : new Empty();
|
|
741
|
-
}
|
|
742
|
-
static id(pattern) {
|
|
743
|
-
return pattern ? new IDSelector(pattern) : new Empty();
|
|
744
|
-
}
|
|
745
|
-
static query(pattern) {
|
|
746
|
-
return pattern ? new QuerySelector(pattern) : new Empty();
|
|
747
|
-
}
|
|
748
|
-
static xpath(pattern) {
|
|
749
|
-
return pattern ? new XpathSelector(pattern) : new Empty();
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
|
|
753
|
-
//#endregion
|
|
754
|
-
//#region src/application/utils/overrides.ts
|
|
755
|
-
function isPlainObject(x) {
|
|
756
|
-
return !!x && typeof x === "object" && !Array.isArray(x) && !(x instanceof Date) && !(x instanceof RegExp);
|
|
757
|
-
}
|
|
758
|
-
function isReplace(x) {
|
|
759
|
-
return !!x && typeof x === "object" && "$replace" in x;
|
|
760
|
-
}
|
|
761
|
-
function isDelete(x) {
|
|
762
|
-
return !!x && typeof x === "object" && x.$delete === true;
|
|
763
|
-
}
|
|
764
|
-
function isPrimitiveValue(x) {
|
|
765
|
-
const t = typeof x;
|
|
766
|
-
return x === null || t === "string" || t === "number" || t === "boolean" || t === "bigint" || t === "symbol" || t === "undefined";
|
|
767
|
-
}
|
|
768
|
-
function isArrayOfPrimitives(arr) {
|
|
769
|
-
if (arr.length === 0) return false;
|
|
770
|
-
for (let i = 0; i < arr.length; i += 1) {
|
|
771
|
-
const v = arr[i];
|
|
772
|
-
if (v !== void 0 && !isPrimitiveValue(v)) return false;
|
|
773
|
-
}
|
|
774
|
-
return true;
|
|
775
|
-
}
|
|
776
|
-
function mergeAny(baseAny, patchAny, opts) {
|
|
777
|
-
if (isReplace(patchAny)) return patchAny.$replace;
|
|
778
|
-
if (isDelete(patchAny)) return void 0;
|
|
779
|
-
if (Array.isArray(baseAny)) {
|
|
780
|
-
if (Array.isArray(patchAny)) {
|
|
781
|
-
const baseArr = baseAny;
|
|
782
|
-
const patchArr = patchAny;
|
|
783
|
-
if (opts.arrayStrategy === "replace" || isArrayOfPrimitives(baseArr) || isArrayOfPrimitives(patchArr)) return patchAny;
|
|
784
|
-
const out = baseArr.slice();
|
|
785
|
-
const max = Math.max(out.length, patchArr.length);
|
|
786
|
-
for (let i = 0; i < max; i += 1) {
|
|
787
|
-
const pVal = patchArr[i];
|
|
788
|
-
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
789
|
-
}
|
|
790
|
-
return out;
|
|
791
|
-
}
|
|
792
|
-
return baseAny;
|
|
793
|
-
}
|
|
794
|
-
if (isPlainObject(baseAny) && isPlainObject(patchAny)) {
|
|
795
|
-
const baseObj = baseAny;
|
|
796
|
-
const patchObj = patchAny;
|
|
797
|
-
const out = { ...baseObj };
|
|
798
|
-
for (const key of Object.keys(patchObj)) {
|
|
799
|
-
const pVal = patchObj[key];
|
|
800
|
-
if (pVal === void 0) {} else if (opts.nullDeletes && pVal === null) delete out[key];
|
|
801
|
-
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
802
|
-
else if (isDelete(pVal)) delete out[key];
|
|
803
|
-
else out[key] = mergeAny(baseObj?.[key], pVal, opts);
|
|
804
|
-
}
|
|
805
|
-
return out;
|
|
806
|
-
}
|
|
807
|
-
return patchAny ?? baseAny;
|
|
808
|
-
}
|
|
809
|
-
function applyOverrides(base, patch, opts = {}) {
|
|
810
|
-
const { arrayStrategy = "mergeByIndex", nullDeletes = false } = opts;
|
|
811
|
-
if (isReplace(patch)) return patch.$replace;
|
|
812
|
-
if (isDelete(patch)) return void 0;
|
|
813
|
-
if (Array.isArray(base)) {
|
|
814
|
-
if (isReplace(patch)) return patch.$replace;
|
|
815
|
-
if (Array.isArray(patch)) {
|
|
816
|
-
if (arrayStrategy === "replace") return patch;
|
|
817
|
-
const out = base.slice();
|
|
818
|
-
const max = Math.max(out.length, patch.length);
|
|
819
|
-
for (let i = 0; i < max; i += 1) {
|
|
820
|
-
const pVal = patch[i];
|
|
821
|
-
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
822
|
-
}
|
|
823
|
-
return out;
|
|
824
|
-
}
|
|
825
|
-
return base;
|
|
826
|
-
}
|
|
827
|
-
if (isPlainObject(base) && isPlainObject(patch)) {
|
|
828
|
-
const out = { ...base };
|
|
829
|
-
const patchObj = patch;
|
|
830
|
-
for (const key of Object.keys(patchObj)) {
|
|
831
|
-
const pVal = patchObj[key];
|
|
832
|
-
if (pVal === void 0) {} else if (nullDeletes && pVal === null) delete out[key];
|
|
833
|
-
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
834
|
-
else if (isDelete(pVal)) delete out[key];
|
|
835
|
-
else {
|
|
836
|
-
const bVal = base[key];
|
|
837
|
-
out[key] = mergeAny(bVal, pVal, opts);
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
return out;
|
|
841
|
-
}
|
|
842
|
-
return patch ?? base;
|
|
843
|
-
}
|
|
844
|
-
|
|
845
|
-
//#endregion
|
|
846
|
-
//#region src/application/utils/stringUtils.ts
|
|
847
|
-
var StringUtils = class StringUtils {
|
|
848
|
-
static isNullOrEmpty(value) {
|
|
849
|
-
const valueTrimmed = value?.trim();
|
|
850
|
-
return value === void 0 || valueTrimmed === "";
|
|
851
|
-
}
|
|
852
|
-
static trimToNull(value) {
|
|
853
|
-
const valueTrimmed = value?.trim();
|
|
854
|
-
return StringUtils.isNullOrEmpty(valueTrimmed) ? void 0 : valueTrimmed;
|
|
855
|
-
}
|
|
856
|
-
static capitalize(type) {
|
|
857
|
-
if (type === void 0) return "";
|
|
858
|
-
return type.charAt(0).toUpperCase() + type.substring(1);
|
|
859
|
-
}
|
|
860
|
-
/**
|
|
861
|
-
* Finds the first pattern in an array that matches a given URL.
|
|
862
|
-
* Patterns can include a single wildcard '*' which matches any sequence of characters.
|
|
863
|
-
*
|
|
864
|
-
* @param patterns
|
|
865
|
-
* @param urlToTest
|
|
866
|
-
* @returns
|
|
867
|
-
*/
|
|
868
|
-
static findMatchingPattern(patterns, urlToTest) {
|
|
869
|
-
if (!urlToTest) return;
|
|
870
|
-
for (const pattern of patterns) if (urlToTest.pathname !== "/") {
|
|
871
|
-
const regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
872
|
-
if ((/* @__PURE__ */ new RegExp(`^${regexPattern}$`)).test(urlToTest.pathname)) return pattern;
|
|
873
|
-
} else if (pattern.startsWith(urlToTest.hostname)) return pattern;
|
|
874
|
-
}
|
|
875
|
-
};
|
|
876
|
-
|
|
877
|
-
//#endregion
|
|
878
|
-
//#region src/application/utils/supportedEventRequestToApiRequest.ts
|
|
879
|
-
const coreSupportedEventRequestToApiRequest = (coreSupportedEventRequest) => ({
|
|
880
|
-
id: coreSupportedEventRequest.id,
|
|
881
|
-
user_event: coreUserEventToApiUserEvent(coreSupportedEventRequest.userEvent),
|
|
882
|
-
context: coreContextToApiContext(coreSupportedEventRequest.context)
|
|
883
|
-
});
|
|
884
|
-
|
|
885
|
-
//#endregion
|
|
886
|
-
//#region src/application/utils/validation.ts
|
|
887
|
-
const validateEmail = (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
|
|
888
|
-
|
|
889
|
-
//#endregion
|
|
890
|
-
Object.defineProperty(exports, 'DOMObserver', {
|
|
891
|
-
enumerable: true,
|
|
892
|
-
get: function () {
|
|
893
|
-
return DOMObserver;
|
|
894
|
-
}
|
|
895
|
-
});
|
|
896
|
-
Object.defineProperty(exports, 'ElementObserver', {
|
|
897
|
-
enumerable: true,
|
|
898
|
-
get: function () {
|
|
899
|
-
return ElementObserver;
|
|
900
|
-
}
|
|
901
|
-
});
|
|
902
|
-
Object.defineProperty(exports, 'MutationHelper', {
|
|
903
|
-
enumerable: true,
|
|
904
|
-
get: function () {
|
|
905
|
-
return MutationHelper;
|
|
906
|
-
}
|
|
907
|
-
});
|
|
908
|
-
Object.defineProperty(exports, 'NodeSelector', {
|
|
909
|
-
enumerable: true,
|
|
910
|
-
get: function () {
|
|
911
|
-
return NodeSelector;
|
|
912
|
-
}
|
|
913
|
-
});
|
|
914
|
-
Object.defineProperty(exports, 'SelectorFactory', {
|
|
915
|
-
enumerable: true,
|
|
916
|
-
get: function () {
|
|
917
|
-
return SelectorFactory;
|
|
918
|
-
}
|
|
919
|
-
});
|
|
920
|
-
Object.defineProperty(exports, 'StringUtils', {
|
|
921
|
-
enumerable: true,
|
|
922
|
-
get: function () {
|
|
923
|
-
return StringUtils;
|
|
924
|
-
}
|
|
925
|
-
});
|
|
926
|
-
Object.defineProperty(exports, 'applyOverrides', {
|
|
927
|
-
enumerable: true,
|
|
928
|
-
get: function () {
|
|
929
|
-
return applyOverrides;
|
|
930
|
-
}
|
|
931
|
-
});
|
|
932
|
-
Object.defineProperty(exports, 'coreContextToApiContext', {
|
|
933
|
-
enumerable: true,
|
|
934
|
-
get: function () {
|
|
935
|
-
return coreContextToApiContext;
|
|
936
|
-
}
|
|
937
|
-
});
|
|
938
|
-
Object.defineProperty(exports, 'coreSupportedEventRequestToApiRequest', {
|
|
939
|
-
enumerable: true,
|
|
940
|
-
get: function () {
|
|
941
|
-
return coreSupportedEventRequestToApiRequest;
|
|
942
|
-
}
|
|
943
|
-
});
|
|
944
|
-
Object.defineProperty(exports, 'coreUserEventToApiUserEvent', {
|
|
945
|
-
enumerable: true,
|
|
946
|
-
get: function () {
|
|
947
|
-
return coreUserEventToApiUserEvent;
|
|
948
|
-
}
|
|
949
|
-
});
|
|
950
|
-
Object.defineProperty(exports, 'divideArray', {
|
|
951
|
-
enumerable: true,
|
|
952
|
-
get: function () {
|
|
953
|
-
return divideArray;
|
|
954
|
-
}
|
|
955
|
-
});
|
|
956
|
-
Object.defineProperty(exports, 'getRecentProductImageUrls', {
|
|
957
|
-
enumerable: true,
|
|
958
|
-
get: function () {
|
|
959
|
-
return getRecentProductImageUrls;
|
|
960
|
-
}
|
|
961
|
-
});
|
|
962
|
-
Object.defineProperty(exports, 'initAmplitude', {
|
|
963
|
-
enumerable: true,
|
|
964
|
-
get: function () {
|
|
965
|
-
return initAmplitude;
|
|
966
|
-
}
|
|
967
|
-
});
|
|
968
|
-
Object.defineProperty(exports, 'initDataLayerWrapper', {
|
|
969
|
-
enumerable: true,
|
|
970
|
-
get: function () {
|
|
971
|
-
return initDataLayerWrapper;
|
|
972
|
-
}
|
|
973
|
-
});
|
|
974
|
-
Object.defineProperty(exports, 'messageFromFormSubmittedEvent', {
|
|
975
|
-
enumerable: true,
|
|
976
|
-
get: function () {
|
|
977
|
-
return messageFromFormSubmittedEvent;
|
|
978
|
-
}
|
|
979
|
-
});
|
|
980
|
-
Object.defineProperty(exports, 'messageFromQueryEvent', {
|
|
981
|
-
enumerable: true,
|
|
982
|
-
get: function () {
|
|
983
|
-
return messageFromQueryEvent;
|
|
984
|
-
}
|
|
985
|
-
});
|
|
986
|
-
Object.defineProperty(exports, 'messageFromResponse', {
|
|
987
|
-
enumerable: true,
|
|
988
|
-
get: function () {
|
|
989
|
-
return messageFromResponse;
|
|
990
|
-
}
|
|
991
|
-
});
|
|
992
|
-
Object.defineProperty(exports, 'messageFromSuggestionEvent', {
|
|
993
|
-
enumerable: true,
|
|
994
|
-
get: function () {
|
|
995
|
-
return messageFromSuggestionEvent;
|
|
996
|
-
}
|
|
997
|
-
});
|
|
998
|
-
Object.defineProperty(exports, 'messageRequestToCommerceMessageRequest', {
|
|
999
|
-
enumerable: true,
|
|
1000
|
-
get: function () {
|
|
1001
|
-
return messageRequestToCommerceMessageRequest;
|
|
1002
|
-
}
|
|
1003
|
-
});
|
|
1004
|
-
Object.defineProperty(exports, 'prepareMerchantPage', {
|
|
1005
|
-
enumerable: true,
|
|
1006
|
-
get: function () {
|
|
1007
|
-
return prepareMerchantPage;
|
|
1008
|
-
}
|
|
1009
|
-
});
|
|
1010
|
-
Object.defineProperty(exports, 'validateEmail', {
|
|
1011
|
-
enumerable: true,
|
|
1012
|
-
get: function () {
|
|
1013
|
-
return validateEmail;
|
|
1014
|
-
}
|
|
1015
|
-
});
|
|
1016
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtRDVITzYxaEcuY2pzIiwibmFtZXMiOlsiZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iLCJpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQiLCJpc0dBNEVjb21tZXJjZUV2ZW50IiwiU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSIsImlzQmFzZUVjb21tZXJjZUV2ZW50IiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJQTFBBdHRyaWJ1dGVDYXRlZ29yeSIsIk1lc3NhZ2VUeXBlIiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJNZXNzYWdlUm9sZSIsIk1lc3NhZ2VUeXBlIiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJNZXNzYWdlUm9sZSIsIk1lc3NhZ2VUeXBlIiwiUmVzcG9uc2VDYXRlZ29yeSIsIk1lc3NhZ2VUeXBlIiwiTWVzc2FnZVJvbGUiLCJVc2VyRXZlbnRDYXRlZ29yeSIsIk1lc3NhZ2VSb2xlIiwiTWVzc2FnZVR5cGUiLCJub2RlOiBOb2RlIHwgbnVsbCB8IHVuZGVmaW5lZCIsIm91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvYW5hbHl0aWNzVXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvY29yZUNvbnRleHRUb0FwaUNvbnRleHQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2RpdmlkZUFycmF5LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL211dGF0aW9uSGVscGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2VsZW1lbnRPYnNlcnZlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9kb21PYnNlcnZlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9pbWFnZUZpbHRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXJjaGFudFV0aWxzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tRm9ybVN1Ym1pdHRlZEV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tUXVlcnlFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9tZXNzYWdlRnJvbVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL25leHRNZXNzYWdlUmVxdWVzdFRvQXBpUmVxdWVzdC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9ub2RlU2VsZWN0b3IudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3N0cmluZ1V0aWxzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3N1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy92YWxpZGF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2dnZXIgZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlclwiO1xuaW1wb3J0IHtcbiAgaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50LFxuICBpc0dBNEVjb21tZXJjZUV2ZW50LFxuICBpc0Jhc2VFY29tbWVyY2VFdmVudCxcbiAgQmFzZUVjb21tZXJjZUV2ZW50LFxufSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSB9IGZyb20gXCJzcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dFwiO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGRhdGFMYXllcjogYW55W107XG4gIH1cbn1cblxuY29uc3QgTk9STUFMSVpFRF9BRERfVE9fQ0FSVF9FVkVOVF9OQU1FUyA9IFtcImFkZHRvY2FydFwiLCBcImFkZGVkdG9jYXJ0XCJdO1xuY29uc3QgQ0hFQ0tfREFUQV9MQVlFUl9JTlRFUlZBTF9NUyA9IDUwMDtcbmNvbnN0IENIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTID0gMTA7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgR29vZ2xlIEFuYWx5dGljcyBldmVudCBpcyBhbiBhZGRfdG9fY2FydCBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IG5hbWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYW4gYWRkX3RvX2NhcnQgZXZlbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuY29uc3QgaXNBZGRUb0NhcnRFdmVudCA9IChldmVudDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFdmVudCA9IGV2ZW50LnJlcGxhY2UoL1stX10vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIE5PUk1BTElaRURfQUREX1RPX0NBUlRfRVZFTlRfTkFNRVMuc29tZSgobmFtZSkgPT5cbiAgICBub3JtYWxpemVkRXZlbnQuaW5jbHVkZXMobmFtZSlcbiAgKTtcbn07XG5cbi8qKlxuICogVHJhY2tzIGFuIGFkZF90b19jYXJ0IGV2ZW50IGluIEFtcGxpdHVkZS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyYWNrLlxuICovXG5jb25zdCBoYW5kbGVBZGRUb0NhcnRFdmVudCA9IChcbiAgZXZlbnQ6IEJhc2VFY29tbWVyY2VFdmVudCxcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIGxldCBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAoaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50KGV2ZW50KSkge1xuICAgIGV2ZW50UHJvcHMgPSB7XG4gICAgICBpdGVtczogZXZlbnQuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+ICh7XG4gICAgICAgIGl0ZW1fbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICBpdGVtX2NhdGVnb3J5OiBwcm9kdWN0LmNhdGVnb3J5LFxuICAgICAgICBwcmljZTogcHJvZHVjdC5wcmljZSxcbiAgICAgICAgcXVhbnRpdHk6IHByb2R1Y3QucXVhbnRpdHksXG4gICAgICB9KSksXG4gICAgICBjdXJyZW5jeTogZXZlbnQuZWNvbW1lcmNlLmFkZC5jdXJyZW5jeUNvZGUsXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJsZWdhY3lfdW5pdmVyc2FsX2FuYWx5dGljc1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNHQTRFY29tbWVyY2VFdmVudChldmVudCkpIHtcbiAgICBldmVudFByb3BzID0ge1xuICAgICAgaXRlbXM6IGV2ZW50LmVjb21tZXJjZS5pdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGl0ZW1fbmFtZTogaXRlbS5pdGVtX25hbWUsXG4gICAgICAgIGl0ZW1fY2F0ZWdvcnk6IGl0ZW0uaXRlbV9jYXRlZ29yeSxcbiAgICAgICAgcHJpY2U6IGl0ZW0ucHJpY2UsXG4gICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgfSkpLFxuICAgICAgY3VycmVuY3k6IGV2ZW50LmVjb21tZXJjZS5jdXJyZW5jeSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcImdvb2dsZV9hbmFseXRpY3NfNFwiLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZXZlbnRQcm9wcyA9IHtcbiAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IHsgLi4uZXZlbnQgfSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcInVua25vd25cIixcbiAgICB9O1xuICB9XG5cbiAgdHJhY2soU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5BZGRUb0NhcnRDbGlja2VkLCB7XG4gICAgZXZlbnRQcm9wcyxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFdyYXBzIHRoZSB3aW5kb3cuZGF0YUxheWVyLnB1c2ggbWV0aG9kIHRvIGludGVyY2VwdCBhZGRfdG9fY2FydCBldmVudHMgYW5kIHNlbmQgdGhlbSB0byBBbXBsaXR1ZGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgb24gYW4gaW50ZXJ2YWwgdW50aWwgdGhlIGRhdGFMYXllciBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0RGF0YUxheWVyV3JhcHBlciA9IChcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIGxldCBhdHRlbXB0cyA9IDA7XG5cbiAgLy8gY3VycmVudGx5LCBvdXIgYnVuZGxlIGlzIGFsd2F5cyBsb2FkZWQgYWZ0ZXIgR1RNIGhhcyBpbml0aWFsaXplZCBHQS9kYXRhTGF5ZXJcbiAgLy8gd2UnbGwgbmVlZCB0aGlzIGNoZWNrIGhlcmUgaWYvd2hlbiB3ZSBsb2FkIHNwaWZmeSBiZWZvcmUvb3V0c2lkZSBvZiBHVE1cbiAgY29uc3QgY2hlY2tBbmRJbml0aWFsaXplID0gKCkgPT4ge1xuICAgIGlmICghd2luZG93LmRhdGFMYXllciB8fCAhKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55KS5wdXNoKSB7XG4gICAgICBhdHRlbXB0cyArPSAxO1xuXG4gICAgICBpZiAoYXR0ZW1wdHMgPj0gQ0hFQ0tfREFUQV9MQVlFUl9NQVhfQVRURU1QVFMpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICAgIGBbc3BpZmZ5LWFpXSBkYXRhTGF5ZXIgbm90IGF2YWlsYWJsZSBhZnRlciAke0NIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTfSBhdHRlbXB0c2BcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGNoZWNrQW5kSW5pdGlhbGl6ZSwgQ0hFQ0tfREFUQV9MQVlFUl9JTlRFUlZBTF9NUyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgXCJbc3BpZmZ5LWFpXSBkYXRhTGF5ZXIgaXMgYXZhaWxhYmxlLCB3cmFwcGluZyBwdXNoIGZ1bmN0aW9uLi4uXCJcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsUHVzaCA9IHdpbmRvdy5kYXRhTGF5ZXIucHVzaDtcbiAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2ggPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzQmFzZUVjb21tZXJjZUV2ZW50KGFyZ3NbMF0pICYmXG4gICAgICAgIGlzQWRkVG9DYXJ0RXZlbnQoKGFyZ3NbMF0gYXMgYW55KS5ldmVudClcbiAgICAgICkge1xuICAgICAgICBoYW5kbGVBZGRUb0NhcnRFdmVudChhcmdzWzBdIGFzIEJhc2VFY29tbWVyY2VFdmVudCwgdHJhY2spO1xuICAgICAgfVxuXG4gICAgICAvLyBJTVBPUlRBTlQ6IGNhbGwgdGhlIG9yaWdpbmFsIHB1c2ggbWV0aG9kIHNvIHRoYXQgdGhlIGV2ZW50IGlzIHN0aWxsIGxvZ2dlZCB0byBHQVxuICAgICAgcmV0dXJuIG9yaWdpbmFsUHVzaC5hcHBseSh3aW5kb3cuZGF0YUxheWVyLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG4gIGNoZWNrQW5kSW5pdGlhbGl6ZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRBbXBsaXR1ZGUgPSAoXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICAvLyBUaGlzIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZSBuZWVkZWQgYW55bW9yZSBpZiBBbXBsaXR1ZGUgaXMgaW5pdGlhbGl6ZWQgdmlhIGNvbnRleHQuXG4gIC8vIEZvciBub3csIHdlJ2xsIGtlZXAgaXQgYW5kIHBhc3MgdGhlIHRyYWNrIGZ1bmN0aW9uLlxuICAvLyBJZiBpdCdzIHRydWx5IHJlZHVuZGFudCwgaXQgY2FuIGJlIHJlbW92ZWQgbGF0ZXIuXG4gIHRyYWNrKFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuQnVuZGxlTG9hZGVkKTsgLy8gRXhhbXBsZSB1c2FnZSwgYWRqdXN0IGFzIG5lZWRlZFxufTtcbiIsImltcG9ydCB7IENvbnRleHQgYXMgQXBpQ29udGV4dCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBDb250ZXh0IGFzIENvcmVDb250ZXh0IH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGNvcmVDb250ZXh0VG9BcGlDb250ZXh0ID0gKGNvbnRleHQ6IENvcmVDb250ZXh0KTogQXBpQ29udGV4dCA9PiAoe1xuICBjaGF0X2lkOiBjb250ZXh0LmNoYXRJZCxcbiAgb3JnX2lkOiBjb250ZXh0Lm9yZ0lkLFxuICB1c2VyX2lkOiBjb250ZXh0LnVzZXJJZCxcbiAgb3JnX3Nob3J0X25hbWU6IGNvbnRleHQub3JnU2hvcnROYW1lLFxuICBzb3VyY2U6IGNvbnRleHQuc291cmNlLFxuICBlbnY6IGNvbnRleHQuZW52LFxufSk7XG4iLCJpbXBvcnQge1xuICBVc2VyRXZlbnQgYXMgQXBpVXNlckV2ZW50LFxuICBQTFBBdHRyaWJ1dGVDYXRlZ29yeSxcbiAgUExQSWRBdHRyaWJ1dGVzLFxuICBVc2VyRXZlbnRDYXRlZ29yeSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFVzZXJFdmVudCBhcyBDb3JlVXNlckV2ZW50IH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IGNvbnN0IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCA9IChkYXRhOiBDb3JlVXNlckV2ZW50KTogQXBpVXNlckV2ZW50ID0+IHtcbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBkcFZpc2l0IHx8XG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuQWRkVG9DYXJ0XG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcHJvZHVjdF9pZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RJZCxcbiAgICAgICAgcGFyZW50X3Byb2R1Y3RfaWQ6IGRhdGEuYXR0cmlidXRlcy5wYXJlbnRQcm9kdWN0SWQsXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY2F0ZWdvcnk6IFBMUEF0dHJpYnV0ZUNhdGVnb3J5LklkLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgLy8gd2UncmUgb25seSBoYW5kbGluZyBpZCBhdHRyaWJ1dGVzIGZvciBub3dcbiAgICAgICAgICBpZDogKGRhdGEuYXR0cmlidXRlcy5hdHRyaWJ1dGVzIGFzIFBMUElkQXR0cmlidXRlcykuaWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgcXVlcnk6IGRhdGEuYXR0cmlidXRlcy5xdWVyeSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaF90ZXJtOiBkYXRhLmF0dHJpYnV0ZXMuc2VhcmNoVGVybSxcbiAgICAgICAgc2VsZWN0ZWRfZmlsdGVyczogZGF0YS5hdHRyaWJ1dGVzLnNlbGVjdGVkRmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc3VnZ2VzdGlvbl9pZDogZGF0YS5hdHRyaWJ1dGVzLnN1Z2dlc3Rpb25JZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QYWdlVmlzaXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgICAgcGFnZV92aXNpdF9jYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLnBhZ2VWaXNpdENhdGVnb3J5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGRhdGEuY3JlYXRlZEF0LFxuICAgICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZpbGxlZF9zY2hlbWE6IHsgLi4uZGF0YS5hdHRyaWJ1dGVzLmZpbGxlZFNjaGVtYSB9LFxuICAgICAgICBmb3JtX3Jlc3BvbnNlX2lkOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQsXG4gICAgICAgIGZvcm1fdHlwZTogZGF0YS5hdHRyaWJ1dGVzLmZvcm1UeXBlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBhcHBfbG9hZGVkIGV2ZW50LCB3aGVuIHdlIHN0YXJ0IHRvIHVzZSBhcHBfdW5sb2FkZWQgd2UgbmVlZCB0byBoYW5kbGUgaXQgaGVyZVxuICByZXR1cm4ge1xuICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgY2F0ZWdvcnk6IGRhdGEuY2F0ZWdvcnksXG4gIH07XG59O1xuIiwiZXhwb3J0IGNvbnN0IGRpdmlkZUFycmF5ID0gPFQ+KGFycmF5OiBUW10sIHNpemU6IG51bWJlcikgPT4ge1xuICBjb25zdCByb3dzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAxKSB7XG4gICAgcm93cy5wdXNoKGFycmF5LmZpbHRlcigoXzogVCwgaW5kZXg6IG51bWJlcikgPT4gaW5kZXggJSBzaXplID09PSBpKSk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59O1xuIiwiY29uc3QgY29tcGFyZVRva2VucyA9IChvcmlnaW5hbDogc3RyaW5nLCBjb21wYXJpc29uOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxUb2tlbnMgPSBuZXcgU2V0KG9yaWdpbmFsLnNwbGl0KCcgJykpO1xuICBjb25zdCBjb21wYXJpc29uVG9rZW5zID0gbmV3IFNldChjb21wYXJpc29uLnNwbGl0KCcgJykpO1xuICByZXR1cm4gWy4uLm9yaWdpbmFsVG9rZW5zXS5maWx0ZXIoKHRva2VuKSA9PiAhY29tcGFyaXNvblRva2Vucy5oYXModG9rZW4pKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbkhlbHBlciB7XG4gIHN0YXRpYyBmaXJlQ2xhc3NDaGFuZ2UoXG4gICAgcmVjb3JkOiBNdXRhdGlvblJlY29yZCxcbiAgICBub2RlOiBIVE1MRWxlbWVudCB8IG51bGwsXG4gICAgZm46IChjbGFzc2VzOiBET01Ub2tlbkxpc3QpID0+IHZvaWQsXG4gICkge1xuICAgIGlmIChub2RlICYmIHJlY29yZC5vbGRWYWx1ZSAhPT0gbm9kZT8uY2xhc3NMaXN0LnZhbHVlKSB7XG4gICAgICBmbihub2RlPy5jbGFzc0xpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBmaXJlQ2xhc3NBZGRlZChcbiAgICByZWNvcmQ6IE11dGF0aW9uUmVjb3JkLFxuICAgIG5vZGU6IEhUTUxFbGVtZW50IHwgbnVsbCxcbiAgICBjbGFzc01hcDogTWFwPHN0cmluZywgKCkgPT4gdm9pZD4sXG4gICkge1xuICAgIGlmIChub2RlICYmIHJlY29yZC5vbGRWYWx1ZSkge1xuICAgICAgY29uc3QgdG9rZW5zID0gY29tcGFyZVRva2Vucyhub2RlPy5jbGFzc0xpc3QudmFsdWUsIHJlY29yZC5vbGRWYWx1ZSk7XG4gICAgICB0b2tlbnMuZm9yRWFjaCgoY2xhc3NOYW1lKSA9PiBjbGFzc01hcC5nZXQoY2xhc3NOYW1lKT8uKCkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBmaXJlQ2xhc3NSZW1vdmVkKFxuICAgIHJlY29yZDogTXV0YXRpb25SZWNvcmQsXG4gICAgbm9kZTogSFRNTEVsZW1lbnQgfCBudWxsLFxuICAgIGNsYXNzTWFwOiBNYXA8c3RyaW5nLCAoKSA9PiB2b2lkPixcbiAgKSB7XG4gICAgaWYgKG5vZGUgJiYgcmVjb3JkLm9sZFZhbHVlKSB7XG4gICAgICBjb25zdCB0b2tlbnMgPSBjb21wYXJlVG9rZW5zKHJlY29yZC5vbGRWYWx1ZSwgbm9kZT8uY2xhc3NMaXN0LnZhbHVlKTtcbiAgICAgIHRva2Vucy5mb3JFYWNoKChjbGFzc05hbWUpID0+IGNsYXNzTWFwLmdldChjbGFzc05hbWUpPy4oKSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZpcmVTdWJ0cmVlQ2hhbmdlKG5vZGVzOiBOb2RlTGlzdCwgZm4/OiAobm9kZXM6IE5vZGVMaXN0KSA9PiB2b2lkKSB7XG4gICAgbm9kZXMubGVuZ3RoICYmIGZuPy4obm9kZXMpO1xuICB9XG5cbiAgc3RhdGljIGlzQ2xhc3MobXV0YXRpb246IE11dGF0aW9uUmVjb3JkKSB7XG4gICAgcmV0dXJuIG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnY2xhc3MnO1xuICB9XG5cbiAgc3RhdGljIGlzQ2hpbGRMaXN0KG11dGF0aW9uOiBNdXRhdGlvblJlY29yZCkge1xuICAgIHJldHVybiBtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JztcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVhY3RFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IE1vdXNlRXZlbnRUeXBlcyB9IGZyb20gJy4vbW91c2VFdmVudFR5cGVzJztcbmltcG9ydCB7IE11dGF0aW9uSGVscGVyIH0gZnJvbSAnLi9tdXRhdGlvbkhlbHBlcic7XG5pbXBvcnQgeyBOb2RlU2VsZWN0b3IgfSBmcm9tICcuL25vZGVTZWxlY3Rvcic7XG5cbi8qKlxuICogVGhlIGBFbGVtZW50T2JzZXJ2ZXJgIGNsYXNzIG1vbml0b3JzIGFsbCBjaGFuZ2VzIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmljIGVsZW1lbnQgaXQgaXMgcmVzcG9uc2libGUgZm9yLlxuICogSXQgaXMgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZWQgYnkgdGhlIGB1c2VFbGVtZW50T2JzZXJ2ZXJgIGhvb2ssIHdoaWNoIG1hbmFnZXMgYWxsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLlxuICpcbiAqIEhvdyBpdCB3b3JrczpcbiAqXG4gKiBFYWNoIGluc3RhbmNlIG9mIGBFbGVtZW50T2JzZXJ2ZXJgIGhvbGRzIHNldmVyYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIG5vZGUgaXQgaXMgbW9uaXRvcmluZyxcbiAqIHN1Y2ggYXMgdGhlIG5vZGUncyBzZWxlY3RvciBhbmQgaXRzIGBNdXRhdGlvbk9ic2VydmVyYC4gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdHJhbnNsYXRpbmcgcmF3IG5vZGVcbiAqIGNoYW5nZXMgaW50byBhIG1vcmUgdXNlci1mcmllbmRseSBmb3JtYXQuIEZvciBleGFtcGxlLCB3aGVuIHRoZSBub2RlIGlzIGFkZGVkIHRvIHRoZSBET00sIHRoZSBgRWxlbWVudE9ic2VydmVyYFxuICogaXMgbm90aWZpZWQgYnkgdGhlIGBET01PYnNlcnZlcmAsIHdoaWNoIHRyaWdnZXJzIHRoZSBgb25BZGRgIGNhbGxiYWNrIGZ1bmN0aW9uIG9uIHRoZSByZXNwZWN0aXZlIGB1c2VFbGVtZW50T2JzZXJ2ZXJgXG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBJbnN0YW5jZXMgb2YgYEVsZW1lbnRPYnNlcnZlcmAgYXJlIGZ1bGx5IG1hbmFnZWQgYnkgdGhlIGB1c2VFbGVtZW50T2JzZXJ2ZXJgIGhvb2ssIHJlcXVpcmluZyBubyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24uXG4gKiBXaGVuIHRoZSBob29rIGlzIGRlc3Ryb3llZCwgaXRzIGNvcnJlc3BvbmRpbmcgYEVsZW1lbnRPYnNlcnZlcmAgaW5zdGFuY2UgaXMgYXV0b21hdGljYWxseSByZW1vdmVkLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIEVsZW1lbnRPYnNlcnZlciB7XG4gIHByaXZhdGUgbXV0YXRpb246IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsO1xuXG4gIHByaXZhdGUgbm9kZTogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIHByaXZhdGUgc2VsZWN0b3I6IE5vZGVTZWxlY3RvcjtcblxuICBwcml2YXRlIGV2ZW50TGlzdGVuZXJzOiBNYXA8a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCwgRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdD47XG5cbiAgcHJpdmF0ZSBjbGFzc0FkZGVkOiBNYXA8c3RyaW5nLCAoKSA9PiB2b2lkPjtcblxuICBwcml2YXRlIGNsYXNzUmVtb3ZlZDogTWFwPHN0cmluZywgKCkgPT4gdm9pZD47XG5cbiAgcHJpdmF0ZSBub2RlRGlzcGxheTogc3RyaW5nO1xuXG4gIHByaXZhdGUgYWRkRm46IChlbDogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgcmVtb3ZlRm46IChlbDogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgY2hhbmdlRm46IChlbDogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgY2xhc3NDaGFuZ2VGbjogKGNsYXNzZXM/OiBET01Ub2tlbkxpc3QpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBhZGRDaGlsZEZuPzogKCkgPT4gdm9pZDtcblxuICBwcml2YXRlIHJlbW92ZUNoaWxkRm4/OiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgcmVzZXRGbjogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihzZWxlY3RvcjogTm9kZVNlbGVjdG9yKSB7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMubXV0YXRpb24gPSBudWxsO1xuICAgIHRoaXMubm9kZSA9IG51bGw7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmNsYXNzQWRkZWQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5jbGFzc1JlbW92ZWQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5ub2RlRGlzcGxheSA9ICdibG9jayc7XG4gICAgdGhpcy5hZGRGbiA9ICgpID0+IHt9O1xuICAgIHRoaXMucmVtb3ZlRm4gPSAoKSA9PiB7fTtcbiAgICB0aGlzLmNoYW5nZUZuID0gKCkgPT4ge307XG4gICAgdGhpcy5jbGFzc0NoYW5nZUZuID0gKCkgPT4ge307XG4gICAgdGhpcy5hZGRDaGlsZEZuID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVtb3ZlQ2hpbGRGbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlc2V0Rm4gPSAoKSA9PiB7fTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXR0cmlidXRlcyhtdXRhdGlvblJlY29yZDogTXV0YXRpb25SZWNvcmRbXSkge1xuICAgIG11dGF0aW9uUmVjb3JkLmZpbHRlcihNdXRhdGlvbkhlbHBlci5pc0NsYXNzKS5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xuICAgICAgTXV0YXRpb25IZWxwZXIuZmlyZUNsYXNzQ2hhbmdlKG11dGF0aW9uLCB0aGlzLm5vZGUsIHRoaXMuY2xhc3NDaGFuZ2VGbik7XG4gICAgICBNdXRhdGlvbkhlbHBlci5maXJlQ2xhc3NBZGRlZChtdXRhdGlvbiwgdGhpcy5ub2RlLCB0aGlzLmNsYXNzQWRkZWQpO1xuICAgICAgTXV0YXRpb25IZWxwZXIuZmlyZUNsYXNzUmVtb3ZlZChtdXRhdGlvbiwgdGhpcy5ub2RlLCB0aGlzLmNsYXNzUmVtb3ZlZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoaWxkTGlzdChtdXRhdGlvblJlY29yZDogTXV0YXRpb25SZWNvcmRbXSkge1xuICAgIGlmICghdGhpcy5hZGRDaGlsZEZuICYmICF0aGlzLnJlbW92ZUNoaWxkRm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtdXRhdGlvblJlY29yZC5maWx0ZXIoTXV0YXRpb25IZWxwZXIuaXNDaGlsZExpc3QpLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XG4gICAgICBNdXRhdGlvbkhlbHBlci5maXJlU3VidHJlZUNoYW5nZShtdXRhdGlvbi5hZGRlZE5vZGVzLCB0aGlzLmFkZENoaWxkRm4pO1xuICAgICAgTXV0YXRpb25IZWxwZXIuZmlyZVN1YnRyZWVDaGFuZ2UobXV0YXRpb24ucmVtb3ZlZE5vZGVzLCB0aGlzLnJlbW92ZUNoaWxkRm4pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJbml0aWFsTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgodiwgaykgPT4gdGhpcy5ub2RlPy5hZGRFdmVudExpc3RlbmVyKGssIHYpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHYsIGspID0+IHRoaXMubm9kZT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihrLCB2KSk7XG4gICAgdGhpcy5ldmVudExpc3RlbmVycy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5ldyhuZXdOb2RlOiBOb2RlIHwgbnVsbCkge1xuICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2F0Y2gobmV3Tm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VsZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0b3I7XG4gIH1cblxuICBnZXROb2RlKCkge1xuICAgIHJldHVybiB0aGlzLm5vZGU7XG4gIH1cblxuICBzeW5jaHJvbml6ZSgpIHtcbiAgICBjb25zdCBwYXJzZWROb2RlID0gdGhpcy5nZXRTZWxlY3RvcigpLnBhcnNlKCk7XG5cbiAgICBpZiAodGhpcy5nZXROb2RlKCkgIT09IHBhcnNlZE5vZGUpIHtcbiAgICAgIHRoaXMucmVuZXcocGFyc2VkTm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmdldE5vZGUoKSAmJiBwYXJzZWROb2RlKSB7XG4gICAgICB0aGlzLndhdGNoKHBhcnNlZE5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdldE5vZGUoKSAmJiAhcGFyc2VkTm9kZSkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgaW5pdCgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXRTZWxlY3RvcigpLnBhcnNlKCk7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMud2F0Y2gobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgd2F0Y2gobm9kZTogTm9kZSkge1xuICAgIGlmICghdGhpcy5tdXRhdGlvbikge1xuICAgICAgdGhpcy5tdXRhdGlvbiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvblJlY29yZCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUF0dHJpYnV0ZXMobXV0YXRpb25SZWNvcmQpO1xuICAgICAgICB0aGlzLmhhbmRsZUNoaWxkTGlzdChtdXRhdGlvblJlY29yZCk7XG4gICAgICAgIHRoaXMuY2hhbmdlRm4odGhpcy5ub2RlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tdXRhdGlvbi5vYnNlcnZlKG5vZGUsIHtcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICBhdHRyaWJ1dGVPbGRWYWx1ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ub2RlID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuYWRkRm4odGhpcy5ub2RlKTtcbiAgICAgIHRoaXMuYWRkSW5pdGlhbExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZXNldEZuKCk7XG4gICAgdGhpcy5yZW1vdmVGbih0aGlzLm5vZGUpO1xuICAgIHRoaXMubXV0YXRpb24/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmNsZWFyRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmNsYXNzQWRkZWQuY2xlYXIoKTtcbiAgICB0aGlzLmNsYXNzUmVtb3ZlZC5jbGVhcigpO1xuICAgIHRoaXMubXV0YXRpb24gPSBudWxsO1xuICAgIHRoaXMubm9kZSA9IG51bGw7XG4gIH1cblxuICByZW5kZXIoZm46ICgpID0+IFJlYWN0RWxlbWVudCkge1xuICAgIGlmICh0aGlzLm5vZGUpIHtcbiAgICAgIHJldHVybiBjcmVhdGVQb3J0YWwoZm4oKSwgdGhpcy5ub2RlKTtcbiAgICB9XG4gIH1cblxuICBmaXJlKGV2ZW50OiBNb3VzZUV2ZW50VHlwZXMpIHtcbiAgICBpZiAodGhpcy5ub2RlKSB7XG4gICAgICB0aGlzLm5vZGUuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IE1vdXNlRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgdmlldzogd2luZG93LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICBjb25zdCBkaXNwbGF5ID0gdGhpcy5ub2RlPy5zdHlsZS5kaXNwbGF5O1xuICAgIGlmICh0aGlzLm5vZGUgJiYgZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICB0aGlzLm5vZGUuc3R5bGUuZGlzcGxheSA9IHRoaXMubm9kZURpc3BsYXkgfHwgJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICBoaWRlKCkge1xuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLm5vZGU/LnN0eWxlLmRpc3BsYXk7XG4gICAgaWYgKHRoaXMubm9kZSAmJiBkaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgIHRoaXMubm9kZURpc3BsYXkgPSBkaXNwbGF5IHx8ICdibG9jayc7XG4gICAgICB0aGlzLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICByZWdpc3RlckV2ZW50KGV2ZW50OiBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwLCBmbjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCkge1xuICAgIGlmICh0aGlzLm5vZGUpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzRm4gPSB0aGlzLmV2ZW50TGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICBpZiAocHJldmlvdXNGbikge1xuICAgICAgICB0aGlzLm5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgcHJldmlvdXNGbik7XG4gICAgICB9XG4gICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZm4pO1xuICAgIH1cbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnNldChldmVudCwgZm4pO1xuICB9XG5cbiAgcmVnaXN0ZXJPblJlc2V0KGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5yZXNldEZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4gdm9pZCkge1xuICAgIHRoaXMuY2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25BZGQoZm46IChlbDogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hZGRGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblJlbW92ZShmbjogKGVsOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHZvaWQpIHtcbiAgICB0aGlzLnJlbW92ZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uY2xhc3NDaGFuZ2UoZm46IChjbGFzc2VzPzogRE9NVG9rZW5MaXN0KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5jbGFzc0NoYW5nZUZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uQWRkQ2hpbGQoZm46IChjbGFzc2VzPzogRE9NVG9rZW5MaXN0KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5hZGRDaGlsZEZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uUmVtb3ZlQ2hpbGQoZm46IChjbGFzc2VzPzogRE9NVG9rZW5MaXN0KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5yZW1vdmVDaGlsZEZuID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uQ2xhc3NBZGRlZChjbGFzc05hbWU6IHN0cmluZywgZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLmNsYXNzQWRkZWQuc2V0KGNsYXNzTmFtZSwgZm4pO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNsYXNzUmVtb3ZlZChjbGFzc05hbWU6IHN0cmluZywgZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLmNsYXNzUmVtb3ZlZC5zZXQoY2xhc3NOYW1lLCBmbik7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVsZW1lbnRPYnNlcnZlciB9IGZyb20gJy4vZWxlbWVudE9ic2VydmVyJztcbmltcG9ydCB7IE5vZGVTZWxlY3RvciB9IGZyb20gJy4vbm9kZVNlbGVjdG9yJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIG1hbmFnZXMgYSBgTXV0YXRpb25PYnNlcnZlcmAgZm9yIHRoZSBgZG9jdW1lbnQuYm9keWAuIEl0IG1vbml0b3JzIG5vZGVzIHRoYXQgYXJlXG4gKiBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIERPTSBhbmQgbm90aWZpZXMgdGhlIG9ic2VydmVycyBmb3IgZWFjaCBvYnNlcnZhYmxlIGVsZW1lbnRcbiAqIHdoZW4gdGhleSBhcmUgcmVhZHkgdG8gYmUgd2F0Y2hlZC5cbiAqXG4gKiBIb3cgdGhhdCB3b3JrczpcbiAqXG4gKiBXaGVuIHRoZSBgb2JzZXJ2ZWAgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCBhdHRhY2hlcyBhIGBNdXRhdGlvbk9ic2VydmVyYCB0byB0aGUgYGRvY3VtZW50LmJvZHlgIGVsZW1lbnQuXG4gKiBBbGwgY2hhbmdlcyB0byBgZG9jdW1lbnQuYm9keWAgYXJlIHRyYWNrZWQgYnkgdGhpcyBvYnNlcnZlci4gV2hlbiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCwgdGhlIGBNdXRhdGlvbk9ic2VydmVyYFxuICogaXRlcmF0ZXMgdGhyb3VnaCBhbGwgYWRkZWQgYW5kIHJlbW92ZWQgbm9kZXMgYW5kIGNoZWNrcyBpZiBlYWNoIG5vZGUgZXhpc3RzIGluIHRoZSBtYWluIG1hcCBvZiBvYnNlcnZhYmxlIGVsZW1lbnRzLlxuICpcbiAqIElmIGEgbWF0Y2ggaXMgZm91bmQsIGl0IG5vdGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGBFbGVtZW50T2JzZXJ2ZXJgIGluc3RhbmNlIHRvIHN0YXJ0IG1vbml0b3JpbmcgY2hhbmdlcyBmb3IgdGhhdCBlbGVtZW50LlxuICpcbiAqIFRoZSBwcmltYXJ5IGBNdXRhdGlvbk9ic2VydmVyYCByZW1haW5zIGFjdGl2ZSB1bnRpbCB0aGUgYGRlc3Ryb3lgIGZ1bmN0aW9uIGlzIGNhbGxlZC4gQ2FsbGluZyBgZGVzdHJveWAgd2lsbCBkaXNjb25uZWN0IGFsbFxuICogaW5kaXZpZHVhbCBlbGVtZW50IG9ic2VydmVycyBhbmQgcmVsZWFzZSBhbnkgYXNzb2NpYXRlZCByZXNvdXJjZXMuXG4gKlxuICogVGhlcmUgaXMgbm8gbmVlZCB0byBleHBsaWNpdGx5IGNhbGwgdGhlIGBvYnNlcnZlYCBmdW5jdGlvbi4gSXQgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIHdoZW4gYSBgdXNlRWxlbWVudE9ic2VydmVyYCBob29rIGlzIGluc3RhbnRpYXRlZC5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBET01PYnNlcnZlciB7XG4gIHByaXZhdGUgc3RhdGljIGRvY3VtZW50T2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXIgfCBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBsaXN0ZW5lcnM6IE1hcDxzdHJpbmcsIEVsZW1lbnRPYnNlcnZlcj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbm90aWZ5QWRpdGlvbihyZWNvcmRzOiBNdXRhdGlvblJlY29yZFtdLCBub2RlTWFwcGluZzogTWFwPE5vZGUsIEVsZW1lbnRPYnNlcnZlcj4pIHtcbiAgICByZWNvcmRzLmZvckVhY2goKHJlY29yZCkgPT5cbiAgICAgIHJlY29yZC5hZGRlZE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgbm9kZU1hcHBpbmcuZ2V0KG5vZGUpPy53YXRjaChub2RlKTtcbiAgICAgICAgbm9kZU1hcHBpbmcuZGVsZXRlKG5vZGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vdGlmeVJlbW92YWwocmVjb3JkczogTXV0YXRpb25SZWNvcmRbXSwgbm9kZU1hcHBpbmc6IE1hcDxOb2RlLCBFbGVtZW50T2JzZXJ2ZXI+KSB7XG4gICAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+XG4gICAgICByZWNvcmQucmVtb3ZlZE5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgICAgbm9kZU1hcHBpbmcuZ2V0KG5vZGUpPy5kZXN0cm95KCk7XG4gICAgICAgIG5vZGVNYXBwaW5nLmRlbGV0ZShub2RlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBub3RpZnlDaGlsZHJlbkNoYW5nZXMobm9kZU1hcHBpbmc6IE1hcDxOb2RlLCBFbGVtZW50T2JzZXJ2ZXI+KSB7XG4gICAgQXJyYXkuZnJvbShub2RlTWFwcGluZy52YWx1ZXMoKSkuZm9yRWFjaCgob2JzZXJ2ZXIpID0+IG9ic2VydmVyLnN5bmNocm9uaXplKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWFwTm9kZUluc3RhbmNlc1RvTGlzdGVuZXJzKCk6IE1hcDxOb2RlLCBFbGVtZW50T2JzZXJ2ZXI+IHtcbiAgICBjb25zdCBub2RlTWFwcGluZyA9IG5ldyBNYXA8Tm9kZSwgRWxlbWVudE9ic2VydmVyPigpO1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gb2JzZXJ2ZXIuZ2V0Tm9kZSgpIHx8IG9ic2VydmVyLmdldFNlbGVjdG9yKCk/LnBhcnNlKCk7XG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBub2RlTWFwcGluZy5zZXQobm9kZSwgb2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBub2RlTWFwcGluZztcbiAgfVxuXG4gIHN0YXRpYyBhZGQoc2VsZWN0b3I6IE5vZGVTZWxlY3Rvcik6IEVsZW1lbnRPYnNlcnZlciB7XG4gICAgY29uc3Qgbm9kZSA9IHNlbGVjdG9yLmdldFBhdHRlcm4oKTtcbiAgICBsZXQgZWxlbWVudE9ic2VydmVyID0gdGhpcy5saXN0ZW5lcnMuZ2V0KG5vZGUpO1xuICAgIGlmIChlbGVtZW50T2JzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiBlbGVtZW50T2JzZXJ2ZXI7XG4gICAgfVxuXG4gICAgZWxlbWVudE9ic2VydmVyID0gbmV3IEVsZW1lbnRPYnNlcnZlcihzZWxlY3Rvcik7XG4gICAgdGhpcy5saXN0ZW5lcnMuc2V0KG5vZGUsIGVsZW1lbnRPYnNlcnZlcik7XG4gICAgcmV0dXJuIGVsZW1lbnRPYnNlcnZlcjtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmUoc2VsZWN0b3I6IE5vZGVTZWxlY3Rvcikge1xuICAgIGNvbnN0IG5vZGUgPSBzZWxlY3Rvci5nZXRQYXR0ZXJuKCk7XG4gICAgdGhpcy5saXN0ZW5lcnMuZ2V0KG5vZGUpPy5kZXN0cm95KCk7XG4gICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKG5vZGUpO1xuICB9XG5cbiAgc3RhdGljIG9ic2VydmUoKSB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuZG9jdW1lbnRPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZU1hcHBpbmcgPSB0aGlzLm1hcE5vZGVJbnN0YW5jZXNUb0xpc3RlbmVycygpO1xuICAgICAgICB0aGlzLm5vdGlmeUFkaXRpb24obXV0YXRpb25zLCBub2RlTWFwcGluZyk7XG4gICAgICAgIHRoaXMubm90aWZ5UmVtb3ZhbChtdXRhdGlvbnMsIG5vZGVNYXBwaW5nKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGlsZHJlbkNoYW5nZXMobm9kZU1hcHBpbmcpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRvY3VtZW50T2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRvY3VtZW50T2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIuZGVzdHJveSgpKTtcbiAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xuICAgIHRoaXMuZG9jdW1lbnRPYnNlcnZlciA9IG51bGw7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VUeXBlLCBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbmV4cG9ydCBjb25zdCBnZXRSZWNlbnRQcm9kdWN0SW1hZ2VVcmxzID0gKGxhc3RNZXNzYWdlczogTWVzc2FnZVtdLCBjdXJyZW50UHJvZHVjdElkOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgcHJvZHVjdE1lc3NhZ2VzID0gbGFzdE1lc3NhZ2VzXG4gICAgLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS50eXBlID09PSBNZXNzYWdlVHlwZS5Qcm9kdWN0ICYmIG1lc3NhZ2UubWV0YWRhdGE/LmltYWdlVXJsKVxuICAgIC5tYXAoKG0pID0+IG0gYXMgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YSk7XG4gIC8vIHB1dCBhZGRlZCBwcm9kdWN0IGltYWdlIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3RcbiAgcmV0dXJuIFtcbiAgICAuLi5wcm9kdWN0TWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLm1ldGFkYXRhPy5pZCA9PT0gY3VycmVudFByb2R1Y3RJZCksXG4gICAgLi4ucHJvZHVjdE1lc3NhZ2VzLmZpbHRlcigobSkgPT4gbS5tZXRhZGF0YT8uaWQgIT09IGN1cnJlbnRQcm9kdWN0SWQpLFxuICBdLm1hcCgobSkgPT4gbS5tZXRhZGF0YSEuaW1hZ2VVcmwhKTtcbn07XG4iLCJleHBvcnQgY29uc3QgcHJlcGFyZU1lcmNoYW50UGFnZSA9ICgpID0+IHtcbiAgbGV0IG1ldGFWaWV3cG9ydCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J3ZpZXdwb3J0J11cIik7XG4gIGlmIChtZXRhVmlld3BvcnQpIHtcbiAgICBjb25zdCBjb250ZW50ID0gbWV0YVZpZXdwb3J0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcbiAgICBjb25zdCBoYXNNYXhpbXVtU2NhbGUgPSBjb250ZW50Py5pbmNsdWRlcyhcIm1heGltdW0tc2NhbGU9MVwiKVxuICAgIGlmICghaGFzTWF4aW11bVNjYWxlKSB7XG4gICAgICBtZXRhVmlld3BvcnQuc2V0QXR0cmlidXRlKFwiY29udGVudFwiLCBgJHtjb250ZW50fSwgbWF4aW11bS1zY2FsZT0xYClcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBtZXRhVmlld3BvcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibWV0YVwiKTtcbiAgbWV0YVZpZXdwb3J0LnNldEF0dHJpYnV0ZShcIm5hbWVcIiwgXCJ2aWV3cG9ydFwiKVxuICBtZXRhVmlld3BvcnQuc2V0QXR0cmlidXRlKFwiY29udGVudFwiLCBcIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLCBtYXhpbXVtLXNjYWxlPTFcIilcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChtZXRhVmlld3BvcnQpO1xufVxuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgRm9ybVJlc3BvbnNlQXR0cmlidXRlcyxcbiAgTWVzc2FnZSxcbiAgTWVzc2FnZVJvbGUsXG4gIE1lc3NhZ2VUeXBlLFxuICBVc2VyRXZlbnQsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG5leHBvcnQgY29uc3QgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQgPSAoXG4gIGV2ZW50OiBVc2VyRXZlbnQsXG4gIGZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IEZvcm1SZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXSxcbik6IE1lc3NhZ2UgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZXZlbnQuY2F0ZWdvcnkgIT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZm9ybVN0cmluZ0NvbnRlbnRzID0gT2JqZWN0LmVudHJpZXMoZm9ybVJlc3BvbnNlQXR0cmlidXRlcy5zY2hlbWEucHJvcGVydGllcylcbiAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke3ZhbHVlLnRpdGxlfTogJHtldmVudC5hdHRyaWJ1dGVzLmZpbGxlZFNjaGVtYVtrZXldfWApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHJldHVybiB7XG4gICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgcm9sZTogTWVzc2FnZVJvbGUuVXNlcixcbiAgICB0eXBlOiBNZXNzYWdlVHlwZS5RdWVyeVR5cGVkLFxuICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBjb250ZW50OiBmb3JtU3RyaW5nQ29udGVudHMsXG4gICAgfSxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBVc2VyRXZlbnRDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlUm9sZSwgTWVzc2FnZVR5cGUsIFVzZXJFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBxdWVyeSBVc2VyRXZlbnQgb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgdXNlciBldmVudCBvYmplY3QgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gKlxuICogQHJldHVybnMgQSBNZXNzYWdlIGlmIHRoZSBldmVudCBpcyBhIHF1ZXJ5IGV2ZW50LCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbVF1ZXJ5RXZlbnQgPSAoZXZlbnQ6IFVzZXJFdmVudCk6IE1lc3NhZ2UgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUXVlcnlUeXBlZCxcbiAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgY29udGVudDogZXZlbnQuYXR0cmlidXRlcy5xdWVyeSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBldmVudC5ldmVudElkLFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuVXNlcixcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlNlYXJjaCxcbiAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgc2VhcmNoVGVybTogZXZlbnQuYXR0cmlidXRlcy5zZWFyY2hUZXJtIHx8ICcnLFxuICAgICAgICBzZWxlY3RlZEZpbHRlcnM6IGV2ZW50LmF0dHJpYnV0ZXMuc2VsZWN0ZWRGaWx0ZXJzIHx8IFtdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyBSZXNwb25zZUNhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgUmVzcG9uc2UgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgc2VydmVyIFJlc3BvbnNlIG9iamVjdCBpbnRvIGEgTWVzc2FnZSBvYmplY3QgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9iamVjdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgY29udGFpbmluZyBtb2RlbCBnZW5lcmF0ZWQgY29udGVudFxuICpcbiAqIEByZXR1cm5zIEEgTWVzc2FnZSBpZiB0aGUgcmVzcG9uc2UgY29udGFpbnMga25vd24gYXR0cmlidXRlcywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZUZyb21SZXNwb25zZSA9IChyZXNwb25zZT86IFJlc3BvbnNlKTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyZXNwb25zZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5UZXh0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuVGV4dCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIGNvbnRlbnQ6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuY29udGVudCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUmV2aWV3KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUmV2aWV3LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcmV2aWV3OiByZXNwb25zZS5hdHRyaWJ1dGVzLnJldmlldyxcbiAgICAgICAgcmV2aWV3ZXI6IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmV2aWV3ZXIsXG4gICAgICAgIHN0YXJzOiByZXNwb25zZS5hdHRyaWJ1dGVzLnN0YXJzLFxuICAgICAgICB0aXRsZTogcmVzcG9uc2UuYXR0cmlidXRlcy50aXRsZSxcbiAgICAgICAgcmljaEluZm9ybWF0aW9uOiByZXNwb25zZS5hdHRyaWJ1dGVzLnJpY2hJbmZvcm1hdGlvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5TZXBhcmF0b3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5TZXBhcmF0b3IsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5QYWdlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUGFnZSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlByb2R1Y3RTZWFyY2gsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICAuLi5yZXNwb25zZS5hdHRyaWJ1dGVzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3RTZWFyY2hGaWx0ZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0U2VhcmNoRmlsdGVyLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Gb3JtKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuRm9ybSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIGZvcm1UeXBlOiByZXNwb25zZS5hdHRyaWJ1dGVzLmZvcm1DYXRlZ29yeT8uZm9ybVR5cGUsXG4gICAgICAgIGZpZWxkczogT2JqZWN0LmVudHJpZXMocmVzcG9uc2UuYXR0cmlidXRlcy5zY2hlbWEucHJvcGVydGllcykubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZSxcbiAgICAgICAgICB0eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgIGZvcm1hdDogdmFsdWUuZm9ybWF0LFxuICAgICAgICAgIHJlcXVpcmVkOiByZXNwb25zZS5hdHRyaWJ1dGVzLnNjaGVtYS5yZXF1aXJlZC5pbmNsdWRlcyhrZXkpLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuT3JkZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5PcmRlcixcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IFVzZXJFdmVudENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgU3VnZ2VzdGlvbiwgVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIFVzZXJFdmVudCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSBVc2VyRXZlbnQgb2JqZWN0IHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICogQHBhcmFtIHN1Z2dlc3Rpb25zIEEgbGlzdCBvZiBnZW5lcmF0ZWQgc3VnZ2VzdGlvbnMgdG8gbWF0Y2ggdGhlIGV2ZW50IHRvXG4gKlxuICogQHJldHVybnMgQSBNZXNzYWdlIGlmIHRoZSBldmVudCBpcyBhIHN1Z2dlc3Rpb24gY2xpY2sgZXZlbnQsIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tU3VnZ2VzdGlvbkV2ZW50ID0gKFxuICBldmVudDogVXNlckV2ZW50LFxuICBzdWdnZXN0aW9uczogU3VnZ2VzdGlvbltdLFxuKTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQpIHtcbiAgICBjb25zdCB7IHN1Z2dlc3Rpb25JZCB9ID0gZXZlbnQuYXR0cmlidXRlcztcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5TdWdnZXN0aW9uQ2xpY2tlZCxcbiAgICAgIGNyZWF0ZWRBdDogZXZlbnQuY3JlYXRlZEF0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgc3VnZ2VzdGlvbklkLFxuICAgICAgICBzdWdnZXN0aW9uQ29udGVudDogc3VnZ2VzdGlvbnMuZmluZCgocykgPT4gcy5pZCA9PT0gc3VnZ2VzdGlvbklkKT8uY29udGVudCA/PyAnJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuIiwiaW1wb3J0IHsgTmV4dE1lc3NhZ2VSZXF1ZXN0IGFzIEFwaU5leHRNZXNzYWdlUmVxdWVzdCB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBOZXh0TWVzc2FnZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50IH0gZnJvbSAnLi9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQnO1xuXG5leHBvcnQgY29uc3QgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgPSAoXG4gIGRhdGE6IE5leHRNZXNzYWdlUmVxdWVzdCxcbik6IEFwaU5leHRNZXNzYWdlUmVxdWVzdCA9PiAoe1xuICBjb250ZXh0OiB7XG4gICAgY2hhdF9pZDogZGF0YS5jb250ZXh0LmNoYXRJZCxcbiAgICBvcmdfaWQ6IGRhdGEuY29udGV4dC5vcmdJZCxcbiAgICBvcmdfc2hvcnRfbmFtZTogZGF0YS5jb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgICB1c2VyX2lkOiBkYXRhLmNvbnRleHQudXNlcklkLFxuICAgIHNvdXJjZTogZGF0YS5jb250ZXh0LnNvdXJjZSxcbiAgICBlbnY6IGRhdGEuY29udGV4dC5lbnYsXG4gIH0sXG4gIGlkOiBkYXRhLmlkLFxuICBmZWF0dXJlX2ZsYWdzOiBkYXRhLmZlYXR1cmVGbGFncyxcbiAgdXNlcl9ldmVudHM6IGRhdGEudXNlckV2ZW50cz8ubWFwKCh1c2VyRXZlbnQpID0+IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCh1c2VyRXZlbnQpKSxcbiAgZ2VuZXJhdGlvbl9wYXJhbXM6IHtcbiAgICBtb2RlbDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5tb2RlbCxcbiAgICBtYXhfdG9rZW5zOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/Lm1heFRva2VucyxcbiAgICBzdG9wOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0b3AsXG4gICAgc3RyZWFtOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0cmVhbSxcbiAgICB0ZW1wZXJhdHVyZTogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BfcDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50b3BQLFxuICAgIG51bV9zdWdnZXN0aW9uczogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5udW1TdWdnZXN0aW9ucyxcbiAgICByZXNwb25zZV9zeXN0ZW1fcHJvbXB0OiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnJlc3BvbnNlU3lzdGVtUHJvbXB0LFxuICAgIHN1Z2dlc3Rpb25fc3lzdGVtX3Byb21wdDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5zdWdnZXN0aW9uU3lzdGVtUHJvbXB0LFxuICAgIHJlc3BvbnNlX2NhY2hpbmc6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8ucmVzcG9uc2VDYWNoaW5nLFxuICB9LFxufSk7XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgTm9kZVNlbGVjdG9yIHtcbiAgcHJpdmF0ZSBwYXR0ZXJuOiBzdHJpbmc7XG4gIHByaXZhdGUgcm9vdDogRG9jdW1lbnQ7XG5cbiAgY29uc3RydWN0b3IocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudDtcbiAgfVxuXG4gIGdldFBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0dGVybjtcbiAgfVxuXG4gIHNldFJvb3Qocm9vdDogRG9jdW1lbnQpIHtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICB9XG5cbiAgZ2V0Um9vdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgYWJzdHJhY3QgcGFyc2UoKTogTm9kZSB8IG51bGw7XG59XG5cbmNsYXNzIFF1ZXJ5U2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRQYXR0ZXJuKCkpO1xuICB9XG59XG5cbmNsYXNzIElEU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UGF0dGVybigpKSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIFhwYXRoU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpPy5ldmFsdWF0ZShcbiAgICAgIHRoaXMuZ2V0UGF0dGVybigpLFxuICAgICAgdGhpcy5nZXRSb290KCksXG4gICAgICBudWxsLFxuICAgICAgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsXG4gICAgICBudWxsLFxuICAgICk/LnNpbmdsZU5vZGVWYWx1ZSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIENoYWluU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdG9ySW5kZXggPSAwO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IHRoaXMuZ2V0UGF0dGVybigpLnNwbGl0KCdAJyk7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gc2VsZWN0b3JzLmxlbmd0aCAtIDE7XG5cbiAgICBjb25zdCBwYXJzZUNoYWluID0gKHBhdHRlcm46IHN0cmluZywgcHJldk5vZGU/OiBOb2RlIHwgbnVsbCk6IE5vZGUgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JGYWN0b3J5LnBhcnNlKHBhdHRlcm4pO1xuXG4gICAgICBpZiAocHJldk5vZGUpIHtcbiAgICAgICAgc2VsZWN0b3Iuc2V0Um9vdChwcmV2Tm9kZSBhcyBEb2N1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gc2VsZWN0b3IucGFyc2UoKTtcbiAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgfCB1bmRlZmluZWQgPSBjdXJyZW50Tm9kZSB8fCBkb2N1bWVudDtcbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpPy5zaGFkb3dSb290KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnNoYWRvd1Jvb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpPy5jb250ZW50V2luZG93KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbKytzZWxlY3RvckluZGV4XS50cmltKCksIG5vZGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF0udHJpbSgpKTtcbiAgfVxufVxuXG5jbGFzcyBFbXB0eSBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCcnKTtcbiAgfVxuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRmFjdG9yeSB7XG4gIHN0YXRpYyBwYXJzZShjb21wb3NlZFNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjb21wb3NlZFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbmV3IEVtcHR5KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXQgPSBjb21wb3NlZFNlbGVjdG9yLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgdHlwZSA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gc3BsaXRbMV07XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQoc2VsZWN0b3IpO1xuICAgICAgY2FzZSAncXVlcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgICBjYXNlICd4cGF0aCc6XG4gICAgICAgIHJldHVybiB0aGlzLnhwYXRoKHNlbGVjdG9yKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgRW1wdHkoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2soc2VsZWN0b3I/OiBOb2RlU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgPz8gbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgY2hhaW4ocGF0dGVybj86IHN0cmluZykge1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IENoYWluU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxuXG4gIHN0YXRpYyBpZChwYXR0ZXJuPzogc3RyaW5nKTogTm9kZVNlbGVjdG9yIHtcbiAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBJRFNlbGVjdG9yKHBhdHRlcm4pIDogbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgcXVlcnkocGF0dGVybj86IHN0cmluZyk6IE5vZGVTZWxlY3RvciB7XG4gICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUXVlcnlTZWxlY3RvcihwYXR0ZXJuKSA6IG5ldyBFbXB0eSgpO1xuICB9XG5cbiAgc3RhdGljIHhwYXRoKHBhdHRlcm4/OiBzdHJpbmcpOiBOb2RlU2VsZWN0b3Ige1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFhwYXRoU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxufVxuIiwiZXhwb3J0IHR5cGUgUmVwbGFjZU9wPFQ+ID0geyAkcmVwbGFjZTogVCB9O1xuZXhwb3J0IHR5cGUgRGVsZXRlT3AgPSB7ICRkZWxldGU6IHRydWUgfTtcblxuLy8gVHJlYXQgdGhlc2UgYXMgYXRvbWljIHZhbHVlcyAobm90IHJlY3Vyc2VkIGludG8pXG50eXBlIEJ1aWx0aW4gPSBEYXRlIHwgUmVnRXhwIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pO1xuXG50eXBlIFByaW1pdGl2ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBzeW1ib2wgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIE92ZXJyaWRlPFQ+IGlzIGEgRGVlcFBhcnRpYWwtbGlrZSB0eXBlIHdpdGggc3BlY2lhbCBvcGVyYXRvcnM6XG4gKiAtIHsgJHJlcGxhY2U6IFQgfSB0byByZXBsYWNlIGFuIGVudGlyZSBzdWJ0cmVlL2FycmF5XG4gKiAtIHsgJGRlbGV0ZTogdHJ1ZSB9IHRvIGRlbGV0ZSBhbiBvYmplY3Qga2V5XG4gKlxuICogQXJyYXlzIGJlaGF2aW9yOlxuICogLSBBcnJheXMgb2Ygb2JqZWN0czogbWVyZ2UtYnktaW5kZXggYnkgZGVmYXVsdCAodW5sZXNzIGBhcnJheVN0cmF0ZWd5OiAncmVwbGFjZSdgIG9yIGAkcmVwbGFjZWAgaXMgdXNlZClcbiAqIC0gQXJyYXlzIG9mIHByaW1pdGl2ZXMgKHN0cmluZy9udW1iZXIvYm9vbGVhbi8uLi4pOiByZXBsYWNlZCBieSBkZWZhdWx0IHdoZW4gYSBwYXRjaCBhcnJheSBpcyBwcm92aWRlZFxuICovXG5leHBvcnQgdHlwZSBPdmVycmlkZTxUPiA9XG4gIC8vIGF0b21pY1xuICBUIGV4dGVuZHMgUHJpbWl0aXZlIHwgQnVpbHRpblxuICAgID8gVCB8IFJlcGxhY2VPcDxUPiB8IERlbGV0ZU9wXG4gICAgOiAvLyBhcnJheXNcbiAgICAgIFQgZXh0ZW5kcyAoaW5mZXIgVSlbXVxuICAgICAgPyBBcnJheTxPdmVycmlkZTxVPiB8IHVuZGVmaW5lZD4gfCBSZXBsYWNlT3A8VD5cbiAgICAgIDogLy8gbWFwcy9zZXRzIOKAkyBrZWVwIHNpbXBsZTogb25seSBhbGxvdyBmdWxsIHJlcGxhY2VcbiAgICAgICAgVCBleHRlbmRzIE1hcDx1bmtub3duLCB1bmtub3duPiB8IFNldDx1bmtub3duPlxuICAgICAgICA/IFJlcGxhY2VPcDxUPlxuICAgICAgICA6IC8vIG9iamVjdHNcbiAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0XG4gICAgICAgICAgPyB7IFtLIGluIGtleW9mIFRdPzogT3ZlcnJpZGU8VFtLXT4gfCBEZWxldGVPcCB8IG51bGwgfSB8IFJlcGxhY2VPcDxUPlxuICAgICAgICAgIDogVDtcblxuZXhwb3J0IHR5cGUgTWVyZ2VPcHRpb25zID0ge1xuICAvKipcbiAgICogSG93IHRvIHRyZWF0IGFycmF5cyB3aGVuIHBhdGNoIHByb3ZpZGVzIGFuIGFycmF5IChub3QgJHJlcGxhY2UpOlxuICAgKiAtICdyZXBsYWNlJzogYWx3YXlzIHVzZSBwYXRjaCBhcnJheSBhcyB3aG9sZSB2YWx1ZVxuICAgKiAtICdtZXJnZUJ5SW5kZXgnOiBtZXJnZSBlYWNoIGluZGV4IHJlY3Vyc2l2ZWx5IChkZWZhdWx0IGZvciBhcnJheXMgb2Ygb2JqZWN0cylcbiAgICogTm90ZTogQXJyYXlzIG9mIHByaW1pdGl2ZXMgYXJlIHJlcGxhY2VkIGJ5IGRlZmF1bHQgcmVnYXJkbGVzcyBvZiB0aGlzIG9wdGlvbi5cbiAgICovXG4gIGFycmF5U3RyYXRlZ3k/OiAncmVwbGFjZScgfCAnbWVyZ2VCeUluZGV4JztcbiAgLyoqXG4gICAqIElmIHRydWUsIGEgYG51bGxgIHBhdGNoIHZhbHVlIGRlbGV0ZXMgdGhlIGtleSBmcm9tIGFuIG9iamVjdCAoUkZDIDczOTYtaXNoKVxuICAgKi9cbiAgbnVsbERlbGV0ZXM/OiBib29sZWFuO1xufTtcblxuLy8gUHJldmVudHMgVCBmcm9tIGJlaW5nIGluZmVycmVkIGZyb20gdGhlICdwYXRjaCcgcGFyYW1ldGVyOyBpdCBtdXN0IGJlIGluZmVycmVkIGZyb20gJ2Jhc2UnLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE0ODI5I2lzc3VlY29tbWVudC01MDQwNDI1NDZcbnR5cGUgTm9JbmZlcjxUPiA9IFtUXVtUIGV4dGVuZHMgdW5rbm93biA/IDAgOiBuZXZlcl07XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QoeDogdW5rbm93bik6IHggaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICEheCAmJlxuICAgIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KHgpICYmXG4gICAgISh4IGluc3RhbmNlb2YgRGF0ZSkgJiZcbiAgICAhKHggaW5zdGFuY2VvZiBSZWdFeHApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVwbGFjZSh4OiB1bmtub3duKTogeCBpcyBSZXBsYWNlT3A8dW5rbm93bj4ge1xuICByZXR1cm4gISF4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JyAmJiAnJHJlcGxhY2UnIGluICh4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbn1cbmZ1bmN0aW9uIGlzRGVsZXRlKHg6IHVua25vd24pOiB4IGlzIERlbGV0ZU9wIHtcbiAgcmV0dXJuICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgKHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLiRkZWxldGUgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlVmFsdWUoeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCB0ID0gdHlwZW9mIHg7XG4gIHJldHVybiAoXG4gICAgeCA9PT0gbnVsbCB8fFxuICAgIHQgPT09ICdzdHJpbmcnIHx8XG4gICAgdCA9PT0gJ251bWJlcicgfHxcbiAgICB0ID09PSAnYm9vbGVhbicgfHxcbiAgICB0ID09PSAnYmlnaW50JyB8fFxuICAgIHQgPT09ICdzeW1ib2wnIHx8XG4gICAgdCA9PT0gJ3VuZGVmaW5lZCdcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheU9mUHJpbWl0aXZlcyhhcnI6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICBpZiAoYXJyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOyAvLyBhbWJpZ3VvdXMsIGRlZmF1bHQgdG8gbWVyZ2UtYnktaW5kZXggb24gZW1wdHlcbiAgLy8gSWYgZXZlcnkgZGVmaW5lZCBlbGVtZW50IGlzIHByaW1pdGl2ZSwgdHJlYXQgYXMgcHJpbWl0aXZlc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHYgPSBhcnJbaV07XG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiAhaXNQcmltaXRpdmVWYWx1ZSh2KSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtZXJnZUFueShiYXNlQW55OiB1bmtub3duLCBwYXRjaEFueTogdW5rbm93biwgb3B0czogTWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIGlmIChpc1JlcGxhY2UocGF0Y2hBbnkpKSByZXR1cm4gcGF0Y2hBbnkuJHJlcGxhY2UgYXMgdW5rbm93bjtcbiAgaWYgKGlzRGVsZXRlKHBhdGNoQW55KSkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gY2FsbGVyIGRlbGV0ZXMgdGhlIGtleVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VBbnkpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0Y2hBbnkpKSB7XG4gICAgICBjb25zdCBiYXNlQXJyID0gYmFzZUFueSBhcyB1bmtub3duW107XG4gICAgICBjb25zdCBwYXRjaEFyciA9IHBhdGNoQW55IGFzIHVua25vd25bXTtcbiAgICAgIGNvbnN0IHNob3VsZFJlcGxhY2UgPVxuICAgICAgICBvcHRzLmFycmF5U3RyYXRlZ3kgPT09ICdyZXBsYWNlJyB8fFxuICAgICAgICBpc0FycmF5T2ZQcmltaXRpdmVzKGJhc2VBcnIpIHx8XG4gICAgICAgIGlzQXJyYXlPZlByaW1pdGl2ZXMocGF0Y2hBcnIpO1xuICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHJldHVybiBwYXRjaEFueSBhcyB1bmtub3duO1xuICAgICAgY29uc3Qgb3V0ID0gYmFzZUFyci5zbGljZSgpO1xuICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgob3V0Lmxlbmd0aCwgcGF0Y2hBcnIubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4OyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcFZhbCA9IHBhdGNoQXJyW2ldO1xuICAgICAgICBpZiAocFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3V0W2ldID0gbWVyZ2VBbnkob3V0W2ldLCBwVmFsLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dCBhcyB1bmtub3duO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZUFueSBhcyB1bmtub3duO1xuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoYmFzZUFueSkgJiYgaXNQbGFpbk9iamVjdChwYXRjaEFueSkpIHtcbiAgICBjb25zdCBiYXNlT2JqID0gYmFzZUFueSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBwYXRjaE9iaiA9IHBhdGNoQW55IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLmJhc2VPYmogfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaE9iaikpIHtcbiAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaE9ialtrZXldO1xuICAgICAgaWYgKHBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBsZWF2ZSBhcy1pc1xuICAgICAgfSBlbHNlIGlmIChvcHRzLm51bGxEZWxldGVzICYmIHBWYWwgPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIGlmIChpc1JlcGxhY2UocFZhbCkpIHtcbiAgICAgICAgb3V0W2tleV0gPSBwVmFsLiRyZXBsYWNlO1xuICAgICAgfSBlbHNlIGlmIChpc0RlbGV0ZShwVmFsKSkge1xuICAgICAgICBkZWxldGUgb3V0W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQW55KGJhc2VPYmo/LltrZXldLCBwVmFsLCBvcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyB1bmtub3duO1xuICB9XG5cbiAgcmV0dXJuIChwYXRjaEFueSBhcyB1bmtub3duKSA/PyBiYXNlQW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlPdmVycmlkZXM8VD4oXG4gIGJhc2U6IFQsXG4gIHBhdGNoOiBPdmVycmlkZTxOb0luZmVyPFQ+PixcbiAgb3B0czogTWVyZ2VPcHRpb25zID0ge30sXG4pOiBUIHtcbiAgY29uc3QgeyBhcnJheVN0cmF0ZWd5ID0gJ21lcmdlQnlJbmRleCcsIG51bGxEZWxldGVzID0gZmFsc2UgfSA9IG9wdHM7XG5cbiAgLy8gSGFuZGxlIHdob2xlLW5vZGUgY29udHJvbCBvcGVyYXRvcnMgb24gcGF0Y2ggaXRzZWxmXG4gIGlmIChpc1JlcGxhY2UocGF0Y2gpKSByZXR1cm4gcGF0Y2guJHJlcGxhY2UgYXMgVDtcbiAgaWYgKGlzRGVsZXRlKHBhdGNoKSkgcmV0dXJuIHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQ7XG5cbiAgLy8gQXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2UpKSB7XG4gICAgaWYgKGlzUmVwbGFjZShwYXRjaCkpIHJldHVybiBwYXRjaC4kcmVwbGFjZSBhcyBUO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgICAgaWYgKGFycmF5U3RyYXRlZ3kgPT09ICdyZXBsYWNlJykgcmV0dXJuIHBhdGNoIGFzIHVua25vd24gYXMgVDtcbiAgICAgIC8vIG1lcmdlIGJ5IGluZGV4XG4gICAgICBjb25zdCBvdXQgPSAoYmFzZSBhcyB1bmtub3duW10pLnNsaWNlKCk7XG4gICAgICBjb25zdCBtYXggPSBNYXRoLm1heChvdXQubGVuZ3RoLCBwYXRjaC5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXg7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBwVmFsID0gKHBhdGNoIGFzIHVua25vd25bXSlbaV07XG4gICAgICAgIGlmIChwVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvdXRbaV0gPSBtZXJnZUFueShvdXRbaV0sIHBWYWwsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgLy8gaW52YWxpZCBwYXRjaCB0eXBlIGZvciBhbiBhcnJheSDihpIgaWdub3JlIGFuZCByZXR1cm4gYmFzZVxuICAgIHJldHVybiBiYXNlIGFzIFQ7XG4gIH1cblxuICAvLyBQbGFpbiBvYmplY3RzXG4gIGlmIChpc1BsYWluT2JqZWN0KGJhc2UpICYmIGlzUGxhaW5PYmplY3QocGF0Y2gpKSB7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uKGJhc2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgY29uc3QgcGF0Y2hPYmogPSBwYXRjaCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXRjaE9iaikpIHtcbiAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaE9ialtrZXldO1xuICAgICAgaWYgKHBWYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBsZWF2ZSBleGlzdGluZyB2YWx1ZVxuICAgICAgfSBlbHNlIGlmIChudWxsRGVsZXRlcyAmJiBwVmFsID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBvdXRba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZXBsYWNlKHBWYWwpKSB7XG4gICAgICAgIG91dFtrZXldID0gcFZhbC4kcmVwbGFjZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEZWxldGUocFZhbCkpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgYlZhbCA9IChiYXNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuICAgICAgICBvdXRba2V5XSA9IG1lcmdlQW55KGJWYWwsIHBWYWwsIG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0IGFzIHVua25vd24gYXMgVDtcbiAgfVxuXG4gIC8vIEZvciBwcmltaXRpdmVzIG9yIHdoZW4gcGF0Y2ggaXMgcHJpbWl0aXZlLCBwYXRjaCB3aW5zIGlmIGRlZmluZWRcbiAgcmV0dXJuICgocGF0Y2ggYXMgdW5rbm93bikgPz8gYmFzZSkgYXMgVDtcbn1cbiIsIlxuY2xhc3MgU3RyaW5nVXRpbHMge1xuICBzdGF0aWMgaXNOdWxsT3JFbXB0eSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVUcmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZVRyaW1tZWQgPT09ICcnO1xuICB9XG5cbiAgc3RhdGljIHRyaW1Ub051bGwodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWVUcmltbWVkID0gdmFsdWU/LnRyaW0oKTtcbiAgICByZXR1cm4gU3RyaW5nVXRpbHMuaXNOdWxsT3JFbXB0eSh2YWx1ZVRyaW1tZWQpID8gdW5kZWZpbmVkIDogdmFsdWVUcmltbWVkO1xuICB9XG5cbiAgc3RhdGljIGNhcGl0YWxpemUodHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHR5cGUuc3Vic3RyaW5nKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBmaXJzdCBwYXR0ZXJuIGluIGFuIGFycmF5IHRoYXQgbWF0Y2hlcyBhIGdpdmVuIFVSTC5cbiAgICogUGF0dGVybnMgY2FuIGluY2x1ZGUgYSBzaW5nbGUgd2lsZGNhcmQgJyonIHdoaWNoIG1hdGNoZXMgYW55IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gdXJsVG9UZXN0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZmluZE1hdGNoaW5nUGF0dGVybihwYXR0ZXJuczogc3RyaW5nW10sIHVybFRvVGVzdDogTG9jYXRpb24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdXJsVG9UZXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgLy8gVGVzdCBvbmx5IGlmIGEgcGF0aG5hbWUgaXMgcHJlc2VudC5cbiAgICAgIGlmICh1cmxUb1Rlc3QucGF0aG5hbWUgIT09ICcvJykge1xuICAgICAgICAvLyBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGNoYXJhY3RlcnMgbGlrZSAnLicsICcrJywgJz8nLCAnKCcsIGV0Yy4sIGluIHRoZSBwYXR0ZXJuIGFyZSB0cmVhdGVkIGxpdGVyYWxseS5cbiAgICAgICAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHRoZSB3aWxkY2FyZCAnKicgd2l0aCBpdHMgcmVnZXggZXF1aXZhbGVudCAnLionIChtYXRjaGVzIGFueSBjaGFyYWN0ZXIgemVybyBvciBtb3JlIHRpbWVzKVxuICAgICAgICBjb25zdCByZWdleFBhdHRlcm4gPSBlc2NhcGVkUGF0dGVybi5yZXBsYWNlKC9cXCovZywgJy4qJyk7XG5cbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHtyZWdleFBhdHRlcm59JGApO1xuICAgICAgICBpZiAocmVnZXgudGVzdCh1cmxUb1Rlc3QucGF0aG5hbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgodXJsVG9UZXN0Lmhvc3RuYW1lKSkge1xuICAgICAgICByZXR1cm4gcGF0dGVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RyaW5nVXRpbHMgfTtcbiIsImltcG9ydCB7IFN1cHBvcnRlZEV2ZW50UmVxdWVzdCBhcyBBcGlTdXBwb3J0ZWRFdmVudFJlcXVlc3QgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0IGFzIENvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbHMvYXBpL3N1cHBvcnRlZEV2ZW50UmVxdWVzdCc7XG5pbXBvcnQgeyBjb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQgfSBmcm9tICcuL2NvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCc7XG5pbXBvcnQgeyBjb3JlQ29udGV4dFRvQXBpQ29udGV4dCB9IGZyb20gJy4vY29yZUNvbnRleHRUb0FwaUNvbnRleHQnO1xuXG5leHBvcnQgY29uc3QgY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdCA9IChcbiAgY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdDogQ29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdCxcbik6IEFwaVN1cHBvcnRlZEV2ZW50UmVxdWVzdCA9PiAoe1xuICBpZDogY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC5pZCxcbiAgdXNlcl9ldmVudDogY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50KGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3QudXNlckV2ZW50KSxcbiAgY29udGV4dDogY29yZUNvbnRleHRUb0FwaUNvbnRleHQoY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC5jb250ZXh0KSxcbn0pO1xuIiwiLy8gVGhpcyBlbWFpbCB2YWxpZGF0ZXMgdGhhdCB0aGVyZSBhcmUgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGBAYCBzeW1ib2wsXG4vLyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIGBAYCBzeW1ib2wgYW5kIHRoZSBgLmAgc3ltYm9sLFxuLy8gYW5kIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGAuYCBzeW1ib2xcbi8vIEl0IGRvZXMgTk9UIHZhbGlkYXRlIGFsbCBwb3NzaWJsZSBlbWFpbCBmb3JtYXRzLCBidXQgaXQgaXMgYSBkZWNlbnQgcGxhY2UgdG8gc3RhcnQuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVFbWFpbCA9ICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHZhbHVlKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQWVBLE1BQU0scUNBQXFDLENBQUMsYUFBYSxjQUFjO0FBQ3ZFLE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sZ0NBQWdDOzs7Ozs7OztBQVN0QyxNQUFNLG9CQUFvQixVQUEyQjtDQUNuRCxNQUFNLGtCQUFrQixNQUFNLFFBQVEsU0FBUyxHQUFHLENBQUMsYUFBYTtBQUNoRSxRQUFPLG1DQUFtQyxNQUFNLFNBQzlDLGdCQUFnQixTQUFTLEtBQUssQ0FDL0I7Ozs7Ozs7QUFRSCxNQUFNLHdCQUNKLE9BQ0EsVUFJRztDQUNILElBQUlBO0FBRUosS0FBSUMsd0NBQXlCLE1BQU0sQ0FDakMsY0FBYTtFQUNYLE9BQU8sTUFBTSxVQUFVLElBQUksU0FBUyxLQUFLLGFBQWE7R0FDcEQsV0FBVyxRQUFRO0dBQ25CLGVBQWUsUUFBUTtHQUN2QixPQUFPLFFBQVE7R0FDZixVQUFVLFFBQVE7R0FDbkIsRUFBRTtFQUNILFVBQVUsTUFBTSxVQUFVLElBQUk7RUFDOUIsc0JBQXNCO0VBQ3ZCO1VBQ1FDLG1DQUFvQixNQUFNLENBQ25DLGNBQWE7RUFDWCxPQUFPLE1BQU0sVUFBVSxNQUFNLEtBQUssVUFBVTtHQUMxQyxXQUFXLEtBQUs7R0FDaEIsZUFBZSxLQUFLO0dBQ3BCLE9BQU8sS0FBSztHQUNaLFVBQVUsS0FBSztHQUNoQixFQUFFO0VBQ0gsVUFBVSxNQUFNLFVBQVU7RUFDMUIsc0JB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
|