@envive-ai/react-hooks 0.2.6-alpha-5 → 0.2.6-alpha-7
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/{AmplitudeOperations-CNFlPr53.cjs → AmplitudeOperations-DbUiR0N_.cjs} +3 -3
- package/dist/{AmplitudeOperations-cmAprPCA.js → AmplitudeOperations-DjqOM3uE.js} +2 -2
- package/dist/{NewOrgConfig-Bicbf8I7.js → NewOrgConfig-C_1T1iOt.js} +2 -2
- package/dist/{NewOrgConfig-6dFyYjJG.cjs → NewOrgConfig-D2Kvqa1z.cjs} +2 -2
- package/dist/{TrackComponentVisibleEvent-BebTjNtS.js → TrackComponentVisibleEvent-BxOhr9Da.js} +4 -4
- package/dist/{TrackComponentVisibleEvent-COwxsJRE.cjs → TrackComponentVisibleEvent-CDbecFPM.cjs} +5 -5
- package/dist/amplitudeContext-BWmXliMI.cjs +243 -0
- package/dist/amplitudeContext-BjMlg5RV.js +227 -0
- package/dist/amplitudeTrackEventAtom-D66l5oFp.js +8 -0
- package/dist/amplitudeTrackEventAtom-f22P2U0u.cjs +15 -0
- package/dist/app-Bs2KxG_8.js +515 -0
- package/dist/app-DSnDDqcW.cjs +570 -0
- package/dist/application/models/graphql/index.d.ts +1 -1
- package/dist/application/models/guards/api/index.d.ts +2 -2
- package/dist/application/models/guards/utils.d.ts +1 -1
- package/dist/application/models/index.cjs +2 -2
- package/dist/application/models/index.d.ts +4 -4
- package/dist/application/models/index.js +2 -2
- package/dist/application/utils/index.cjs +5 -14
- package/dist/application/utils/index.d.cts +7 -8
- package/dist/application/utils/index.d.ts +8 -9
- package/dist/application/utils/index.js +5 -14
- package/dist/{atomStore-CZKe3itM.cjs → atomStore-BQVO5haU.cjs} +1 -1
- package/dist/{atomStore-BuopbV9k.js → atomStore-CfzCqWB9.js} +1 -1
- package/dist/atoms/app/index.cjs +17 -19
- package/dist/atoms/app/index.d.cts +7 -7
- package/dist/atoms/app/index.d.ts +7 -7
- package/dist/atoms/app/index.js +12 -14
- package/dist/atoms/atomStore/index.cjs +1 -1
- package/dist/atoms/atomStore/index.d.ts +1 -1
- package/dist/atoms/atomStore/index.js +1 -1
- package/dist/atoms/chat/index.cjs +15 -17
- package/dist/atoms/chat/index.d.cts +33 -34
- package/dist/atoms/chat/index.d.ts +34 -35
- package/dist/atoms/chat/index.js +15 -17
- package/dist/atoms/globalSearch/index.cjs +1 -1
- package/dist/atoms/globalSearch/index.d.cts +6 -6
- package/dist/atoms/globalSearch/index.d.ts +6 -6
- package/dist/atoms/globalSearch/index.js +1 -1
- package/dist/atoms/org/index.cjs +2 -2
- package/dist/atoms/org/index.d.cts +17 -17
- package/dist/atoms/org/index.d.ts +17 -17
- package/dist/atoms/org/index.js +2 -2
- package/dist/atoms/search/index.cjs +6 -6
- package/dist/atoms/search/index.d.cts +15 -15
- package/dist/atoms/search/index.d.ts +14 -14
- package/dist/atoms/search/index.js +6 -6
- package/dist/atoms/search/utils.cjs +1 -1
- package/dist/atoms/search/utils.d.cts +1 -1
- package/dist/atoms/search/utils.d.ts +1 -1
- package/dist/atoms/search/utils.js +1 -1
- package/dist/{cdnContext-CuZwc-PI.js → cdnContext-CJ2BNLAD.js} +2 -2
- package/dist/{cdnContext-ClAEcKhO.cjs → cdnContext-lkC-AE6A.cjs} +2 -2
- package/dist/chat-C5afTKUY.js +226 -0
- package/dist/{chat-BJL3nXR7.cjs → chat-CCjM6fS_.cjs} +6 -7
- package/dist/{chat-DCGriB7h.cjs → chat-CJ9D8n7g.cjs} +1 -1
- package/dist/{chat-ClvJ9xEj.js → chat-EJbfGWRr.js} +1 -1
- package/dist/chatState-BbI93m6r.js +33 -0
- package/dist/chatState-DlJpHAsW.cjs +119 -0
- package/dist/{common-DQPvV_S_.cjs → common-CuwWqIJ1.cjs} +1 -1
- package/dist/{common-c_4eX0qn.js → common-Df2bwzd2.js} +1 -1
- package/dist/{components-DKwVHIjq.cjs → components-BCfFLf9X.cjs} +1 -1
- package/dist/{components-CDpaMUjK.js → components-QGCWJ26c.js} +1 -1
- package/dist/config/index.cjs +4 -4
- package/dist/config/index.d.cts +4 -4
- package/dist/config/index.d.ts +4 -4
- package/dist/config/index.js +4 -4
- 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/common/index.cjs +1 -1
- package/dist/config/locators/components/common/index.d.cts +1 -1
- package/dist/config/locators/components/common/index.d.ts +1 -1
- package/dist/config/locators/components/common/index.js +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/index.cjs +4 -4
- package/dist/config/locators/index.d.cts +4 -4
- package/dist/config/locators/index.d.ts +4 -4
- package/dist/config/locators/index.js +4 -4
- package/dist/contexts/amplitudeContext/index.cjs +18 -17
- package/dist/contexts/amplitudeContext/index.d.cts +11 -2
- package/dist/contexts/amplitudeContext/index.d.ts +11 -2
- package/dist/contexts/amplitudeContext/index.js +17 -15
- package/dist/contexts/cdnContext/index.cjs +3 -3
- package/dist/contexts/cdnContext/index.d.cts +1 -1
- package/dist/contexts/cdnContext/index.js +3 -3
- package/dist/contexts/enviveConfigContext/index.cjs +3 -3
- package/dist/contexts/enviveConfigContext/index.d.cts +1 -1
- package/dist/contexts/enviveConfigContext/index.js +3 -3
- package/dist/contexts/enviveCssContext/index.cjs +10 -10
- package/dist/contexts/enviveCssContext/index.js +10 -10
- package/dist/contexts/featureFlagContext/index.cjs +4 -4
- package/dist/contexts/featureFlagContext/index.js +4 -4
- package/dist/contexts/featureFlagServiceContext/index.cjs +3 -3
- package/dist/contexts/featureFlagServiceContext/index.d.cts +1 -1
- package/dist/contexts/featureFlagServiceContext/index.d.ts +1 -1
- package/dist/contexts/featureFlagServiceContext/index.js +3 -3
- package/dist/contexts/graphqlContext/index.cjs +4 -4
- package/dist/contexts/graphqlContext/index.js +4 -4
- package/dist/contexts/localStorageContext/index.cjs +2 -2
- package/dist/contexts/localStorageContext/index.d.cts +1 -1
- package/dist/contexts/localStorageContext/index.js +2 -2
- package/dist/contexts/newOrgConfigContext/index.cjs +9 -9
- package/dist/contexts/newOrgConfigContext/index.js +9 -9
- package/dist/contexts/searchContext/index.cjs +18 -19
- package/dist/contexts/searchContext/index.js +18 -19
- package/dist/contexts/sessionStorageContext/index.cjs +1 -1
- package/dist/contexts/sessionStorageContext/index.js +1 -1
- package/dist/contexts/shopifyUrlContext/index.cjs +2 -2
- package/dist/contexts/shopifyUrlContext/index.d.cts +1 -1
- package/dist/contexts/shopifyUrlContext/index.js +2 -2
- package/dist/contexts/systemSettingsContext/index.cjs +3 -3
- package/dist/contexts/systemSettingsContext/index.d.cts +2 -2
- package/dist/contexts/systemSettingsContext/index.js +3 -3
- package/dist/contexts/userIdentityContext/index.cjs +14 -16
- package/dist/contexts/userIdentityContext/index.js +12 -14
- package/dist/{dist-CIM4YRqp.js → dist-C38adNK1.js} +1 -1
- package/dist/{dist-BZX_Mgfn.cjs → dist-VxRI6eQv.cjs} +1 -1
- package/dist/{domObserver-CwieVNgj.cjs → domObserver-C2oQO8vi.cjs} +1 -1
- package/dist/{domObserver-B19-69gW.js → domObserver-DNeeSh1F.js} +1 -1
- package/dist/{enviveConfig-CBnoutoK.js → enviveConfig-Ciq4ASoV.js} +2 -2
- package/dist/{enviveConfig-BwIaVAAm.cjs → enviveConfig-Dp80h9yu.cjs} +2 -2
- package/dist/{enviveConfigContext-B4nejwV9.js → enviveConfigContext-CCjJUmwp.js} +2 -2
- package/dist/{enviveConfigContext-DgewMgYS.cjs → enviveConfigContext-DoYP8KSw.cjs} +2 -2
- package/dist/events/index.cjs +1 -1
- package/dist/events/index.js +1 -1
- package/dist/{events-BHBRLPWS.js → events-CXiS1aTc.js} +1 -1
- package/dist/{events-C8LA-0Tp.cjs → events-DBin1Z7o.cjs} +1 -1
- package/dist/exceptions/index.cjs +1 -1
- package/dist/exceptions/index.d.ts +1 -1
- package/dist/exceptions/index.js +1 -1
- package/dist/{exceptions-BBXmiU8P.cjs → exceptions-BjDgLzGi.cjs} +1 -1
- package/dist/{exceptions--fSXOzkB.js → exceptions-CUGY31Ua.js} +1 -1
- package/dist/{featureFlagServiceContext-B7je7VZV.d.cts → featureFlagServiceContext-ClnlCJV5.d.cts} +1 -1
- package/dist/{featureFlagServiceContext-CZj3qPX7.js → featureFlagServiceContext-Cvp7NlpC.js} +2 -2
- package/dist/{featureFlagServiceContext-DiYIv0jI.d.ts → featureFlagServiceContext-CyPGEe2d.d.ts} +1 -1
- package/dist/{featureFlagServiceContext-BkamHViU.cjs → featureFlagServiceContext-DHtkQAtq.cjs} +2 -2
- package/dist/{globalSearch-C94-vEVh.cjs → globalSearch-Cpc8egsM.cjs} +1 -1
- package/dist/{globalSearch-Dlbnfasm.js → globalSearch-nmrfGLOn.js} +1 -1
- package/dist/{graphqlContext-Capum8x6.js → graphqlContext-0cg9fEUw.js} +3 -3
- package/dist/{graphqlContext-C3HXFiHx.cjs → graphqlContext-ChXlE8Ul.cjs} +3 -3
- package/dist/hooks/AmplitudeOperations/index.cjs +17 -15
- package/dist/hooks/AmplitudeOperations/index.d.cts +1 -1
- package/dist/hooks/AmplitudeOperations/index.js +17 -15
- package/dist/hooks/AppDetails/index.cjs +15 -17
- package/dist/hooks/AppDetails/index.js +15 -17
- package/dist/hooks/BlockBackButton/index.d.cts +1 -1
- package/dist/hooks/CdnOperations/index.cjs +3 -3
- package/dist/hooks/CdnOperations/index.d.cts +1 -1
- package/dist/hooks/CdnOperations/index.d.ts +1 -1
- package/dist/hooks/CdnOperations/index.js +3 -3
- package/dist/hooks/ChatToggle/index.cjs +21 -19
- package/dist/hooks/ChatToggle/index.d.cts +1 -1
- package/dist/hooks/ChatToggle/index.js +20 -18
- package/dist/hooks/ChatToggleAnalytics/index.cjs +19 -17
- package/dist/hooks/ChatToggleAnalytics/index.d.cts +1 -1
- package/dist/hooks/ChatToggleAnalytics/index.js +19 -17
- package/dist/hooks/Debounce/index.d.cts +1 -1
- package/dist/hooks/ElementObserver/index.cjs +1 -1
- package/dist/hooks/ElementObserver/index.d.cts +1 -1
- package/dist/hooks/ElementObserver/index.d.ts +1 -1
- package/dist/hooks/ElementObserver/index.js +1 -1
- package/dist/hooks/GraphQLConfig/index.cjs +5 -5
- package/dist/hooks/GraphQLConfig/index.d.cts +1 -1
- package/dist/hooks/GraphQLConfig/index.js +5 -5
- package/dist/hooks/IdentifyUser/index.cjs +14 -16
- package/dist/hooks/IdentifyUser/index.d.cts +1 -1
- package/dist/hooks/IdentifyUser/index.js +13 -15
- package/dist/hooks/ImageResolver/index.cjs +2 -2
- package/dist/hooks/ImageResolver/index.d.cts +1 -1
- package/dist/hooks/ImageResolver/index.js +2 -2
- package/dist/hooks/Intersection/index.cjs +1 -1
- package/dist/hooks/Intersection/index.js +1 -1
- package/dist/hooks/IsSmallScreen/index.d.cts +1 -1
- package/dist/hooks/LocalStorageOperations/index.cjs +2 -2
- package/dist/hooks/LocalStorageOperations/index.d.cts +1 -1
- package/dist/hooks/LocalStorageOperations/index.js +2 -2
- package/dist/hooks/MessageFilter/index.cjs +1 -1
- package/dist/hooks/MessageFilter/index.d.cts +1 -1
- package/dist/hooks/MessageFilter/index.js +1 -1
- package/dist/hooks/MessageScrollObserver/index.d.cts +1 -1
- package/dist/hooks/NewOrgConfig/index.cjs +10 -10
- package/dist/hooks/NewOrgConfig/index.d.cts +2 -2
- package/dist/hooks/NewOrgConfig/index.d.ts +2 -2
- package/dist/hooks/NewOrgConfig/index.js +10 -10
- package/dist/hooks/Search/index.cjs +25 -23
- package/dist/hooks/Search/index.js +25 -23
- package/dist/hooks/SearchOperations/index.cjs +19 -20
- package/dist/hooks/SearchOperations/index.js +19 -20
- package/dist/hooks/SessionStorageOperations/index.cjs +1 -1
- package/dist/hooks/SessionStorageOperations/index.js +1 -1
- package/dist/hooks/ShopifyUrlOperations/index.cjs +2 -2
- package/dist/hooks/ShopifyUrlOperations/index.d.cts +2 -2
- package/dist/hooks/ShopifyUrlOperations/index.d.ts +2 -2
- package/dist/hooks/ShopifyUrlOperations/index.js +2 -2
- package/dist/hooks/SystemSettingsContext/index.cjs +3 -3
- package/dist/hooks/SystemSettingsContext/index.d.cts +4 -4
- package/dist/hooks/SystemSettingsContext/index.d.ts +4 -4
- package/dist/hooks/SystemSettingsContext/index.js +3 -3
- package/dist/hooks/TrackComponentVisibleEvent/index.cjs +18 -16
- package/dist/hooks/TrackComponentVisibleEvent/index.js +18 -16
- package/dist/hooks/UpdateAnalyticsProps/index.cjs +20 -18
- package/dist/hooks/UpdateAnalyticsProps/index.js +17 -15
- package/dist/hooks/utils.cjs +1 -1
- package/dist/hooks/utils.d.cts +1 -1
- package/dist/hooks/utils.js +1 -1
- package/dist/{index-CAhGZxMI.d.ts → index-5li6ZMDu.d.ts} +1 -1
- package/dist/{index-ca7Qn8o0.d.cts → index-BbqT4BQv.d.cts} +1 -1
- package/dist/{index-w64il54a.d.cts → index-CAJq_8bO.d.cts} +1 -1
- package/dist/index-CMZcE7pk.d.cts +1 -1
- package/dist/{index-BQpWG3Jm.d.cts → index-ChiZg0yw.d.cts} +1 -1
- package/dist/{index-DNccxbJi.d.ts → index-CsmO1rDH.d.ts} +1 -1
- package/dist/{index-Dgu085Lu.d.ts → index-CuihhoIF.d.ts} +2 -2
- package/dist/{index-BR1G8yyg.d.ts → index-DtzPIcQp.d.ts} +1 -1
- package/dist/{index-ZQMda2Iu.d.ts → index-bEjLKG_Q.d.ts} +1 -1
- package/dist/{index-DiIHuPq2.d.ts → index-jFQefHda.d.ts} +1 -1
- package/dist/{index-BO-ZLYtR.d.ts → index-mv7KvWDq.d.ts} +1 -1
- package/dist/{index-ClVBVK15.d.cts → index-npqPeJ1g.d.cts} +1 -1
- package/dist/interceptors/index.cjs +1 -1
- package/dist/interceptors/index.d.cts +1 -1
- package/dist/interceptors/index.d.ts +1 -1
- package/dist/interceptors/index.js +1 -1
- package/dist/{localStorageContext-p_4U0RPI.js → localStorageContext-BFwvuEcf.js} +2 -2
- package/dist/{localStorageContext-CPrkpt8i.cjs → localStorageContext-CWc5xJ6U.cjs} +2 -2
- package/dist/{locators-BMQGmGLq.js → locators-C2fWd-74.js} +1 -1
- package/dist/{locators-DxYdak1F.cjs → locators-Cx3q6Z_h.cjs} +1 -1
- package/dist/{models-L2w8FYCa.js → models-Cw0QcbQv.js} +2 -2
- package/dist/{models-OyYkll03.cjs → models-Dl0_Ujgj.cjs} +2 -2
- package/dist/{newOrgConfigAtom-Dsk0fJNR.js → newOrgConfigAtom-BuQE_zPK.js} +1 -1
- package/dist/{newOrgConfigAtom-hs5A1pbZ.cjs → newOrgConfigAtom-rrYHmp1b.cjs} +1 -1
- package/dist/{newOrgConfigContext-BuqDUkPz.js → newOrgConfigContext-D-gU5ppl.js} +5 -5
- package/dist/{newOrgConfigContext-N4CQzvlH.cjs → newOrgConfigContext-d3RHl430.cjs} +5 -5
- package/dist/{nodeSelector-0gJ8Xayf.d.ts → nodeSelector-BAKg1h_y.d.ts} +1 -1
- package/dist/{nodeSelector-Cj-Xl1LP.d.cts → nodeSelector-BYEAyrsj.d.cts} +1 -1
- package/dist/org-15F128Ah.js +32 -0
- package/dist/org-CIFgIcO4.cjs +111 -0
- package/dist/{search-C_N_oRVZ.js → search--80x6CfL.js} +5 -5
- package/dist/{search-8bPfo07V.cjs → search-Ch6LKNh4.cjs} +5 -5
- package/dist/{searchContext-DdJbpDsU.cjs → searchContext-B0qEUoKb.cjs} +6 -6
- package/dist/{searchContext-BohH5i8s.js → searchContext-BkPoTq1o.js} +6 -6
- package/dist/{searchServiceAdapter-BSPZOg1r.js → searchServiceAdapter-B0h7psvh.js} +1 -1
- package/dist/{searchServiceAdapter-DrjFCiw8.cjs → searchServiceAdapter-BclWy4fE.cjs} +1 -1
- package/dist/{sessionStorageContext-CH37Dkb-.cjs → sessionStorageContext-BuWrJQwc.cjs} +1 -1
- package/dist/{sessionStorageContext-CqrutoVq.js → sessionStorageContext-DvFHbk81.js} +1 -1
- package/dist/{shopifyUrlContext-Ba6MQdNV.cjs → shopifyUrlContext-Bw1kAZ2P.cjs} +2 -2
- package/dist/{shopifyUrlContext-BI3fVtA5.js → shopifyUrlContext-DnJiUmMA.js} +2 -2
- package/dist/src/application/commerce-api.js +408 -0
- package/dist/src/application/logging/logger.js +16 -0
- package/dist/src/application/models/graphql/index.js +3 -0
- package/dist/src/application/models/graphql/queries/getMerchantColorsQuery.js +13 -0
- package/dist/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.js +13 -0
- package/dist/src/application/models/graphql/queries/getMerchantOrgIdQuery.js +10 -0
- package/dist/src/application/models/guards/api/index.js +12 -0
- package/dist/src/application/models/guards/api/isApiFormResponse.js +59 -0
- package/dist/src/application/models/guards/api/isApiFormSubmittedResponseAttributes.js +22 -0
- package/dist/src/application/models/guards/api/isApiOrderResponseAttributes.js +91 -0
- package/dist/src/application/models/guards/api/isApiOrgConfigResults.js +188 -0
- package/dist/src/application/models/guards/api/isApiOrganizationConfig.js +115 -0
- package/dist/src/application/models/guards/api/isApiPDPEventAttributes.js +16 -0
- package/dist/src/application/models/guards/api/isApiPLPEventAttributes.js +26 -0
- package/dist/src/application/models/guards/api/isApiPageResponseAttributes.js +15 -0
- package/dist/src/application/models/guards/api/isApiProductResponseAttributes.js +65 -0
- package/dist/src/application/models/guards/api/isApiProductSearchAttributes.js +15 -0
- package/dist/src/application/models/guards/api/isApiProductSearchFilterAttributes.js +10 -0
- package/dist/src/application/models/guards/api/isApiQueryTypedEventAttributes.js +4 -0
- package/dist/src/application/models/guards/api/isApiResponse.js +33 -0
- package/dist/src/application/models/guards/api/isApiReviewResponseAttributes.js +22 -0
- package/dist/src/application/models/guards/api/isApiReviewRichInformation.js +23 -0
- package/dist/src/application/models/guards/api/isApiSearchEventAttributes.js +20 -0
- package/dist/src/application/models/guards/api/isApiSuggestion.js +24 -0
- package/dist/src/application/models/guards/api/isApiSuggestionClickedEventAttributes.js +4 -0
- package/dist/src/application/models/guards/api/isApiTextResponseAttributes.js +4 -0
- package/dist/src/application/models/guards/api/isApiUserEvent.js +18 -0
- package/dist/src/application/models/guards/graphQL/isGraphQLColorsConfig.js +41 -0
- package/dist/src/application/models/guards/isBaseEcommerceEvent.js +14 -0
- package/dist/src/application/models/guards/isGA4EcommerceEvent.js +14 -0
- package/dist/src/application/models/guards/isLegacyUAEcommerceEvent.js +14 -0
- package/dist/src/application/models/guards/isMobilePLPChatPlacementParameter.js +4 -0
- package/dist/src/application/models/guards/isSpanxTakeAQuizCtaParameter.js +1 -0
- package/dist/src/application/models/guards/isVariantInfo.js +28 -0
- package/dist/src/application/models/guards/utils.js +34 -0
- package/dist/src/application/models/index.js +34 -0
- package/dist/src/application/models/utils/snakeToCamelTransformer.js +71 -0
- package/dist/src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.js +65 -0
- package/dist/src/application/models/validators/validateGraphQLColorsConfig.js +9 -0
- package/dist/src/application/models/validators/validateGraphQLFrontendConfig.js +420 -0
- package/dist/src/application/models/validators/validateGraphQLOrgId.js +6 -0
- package/dist/src/application/models/validators/validateMobilePLPChatPlacementParameter.js +9 -0
- package/dist/src/application/models/validators/validateOrgConfigResults.js +44 -0
- package/dist/src/application/models/validators/validateOrganizationConfig.js +34 -0
- package/dist/src/application/models/validators/validateResponse.js +173 -0
- package/dist/src/application/models/validators/validateSuggestion.js +13 -0
- package/dist/src/application/models/validators/validateUserEvent.js +91 -0
- package/dist/src/application/utils/analyticsUtils.js +95 -0
- package/dist/src/application/utils/coreContextToApiContext.js +8 -0
- package/dist/src/application/utils/coreUserEventToApiUserEvent.js +90 -0
- package/dist/src/application/utils/divideArray.js +7 -0
- package/dist/src/application/utils/domObserver.js +85 -0
- package/dist/src/application/utils/elementObserver.js +186 -0
- package/dist/src/application/utils/imageFilter.js +11 -0
- package/dist/src/application/utils/index.js +21 -0
- package/dist/src/application/utils/merchantUtils.js +15 -0
- package/dist/src/application/utils/messageFromFormSubmittedEvent.js +19 -0
- package/dist/src/application/utils/messageFromQueryEvent.js +35 -0
- package/dist/src/application/utils/messageFromResponse.js +123 -0
- package/dist/src/application/utils/messageFromSuggestionEvent.js +27 -0
- package/dist/src/application/utils/mouseEventTypes.js +1 -0
- package/dist/src/application/utils/mutationHelper.js +33 -0
- package/dist/src/application/utils/nextMessageRequestToApiRequest.js +29 -0
- package/dist/src/application/utils/nodeSelector.js +101 -0
- package/dist/src/application/utils/overrides.js +144 -0
- package/dist/src/application/utils/stringUtils.js +47 -0
- package/dist/src/application/utils/supportedEventRequestToApiRequest.js +7 -0
- package/dist/src/application/utils/urlsParser.js +33 -0
- package/dist/src/application/utils/validation.js +5 -0
- package/dist/src/atoms/amplitude/amplitudeTrackEventAtom.js +4 -0
- package/dist/src/atoms/app/index.js +23 -0
- package/dist/src/atoms/app/variant.js +102 -0
- package/dist/src/atoms/atomStore/atomStore.js +28 -0
- package/dist/src/atoms/atomStore/index.js +1 -0
- package/dist/src/atoms/chat/chatState.js +32 -0
- package/dist/src/atoms/chat/form.js +16 -0
- package/dist/src/atoms/chat/index.js +23 -0
- package/dist/src/atoms/chat/lastMessage.js +10 -0
- package/dist/src/atoms/chat/messageQueue.js +68 -0
- package/dist/src/atoms/chat/performanceMetrics.js +70 -0
- package/dist/src/atoms/chat/renderedWidgetRefs.js +24 -0
- package/dist/src/atoms/chat/replies.js +42 -0
- package/dist/src/atoms/chat/suggestions.js +29 -0
- package/dist/src/atoms/envive/enviveConfig.js +67 -0
- package/dist/src/atoms/globalSearch/globalSearch.js +8 -0
- package/dist/src/atoms/globalSearch/index.js +1 -0
- package/dist/src/atoms/org/customerService.js +6 -0
- package/dist/src/atoms/org/graphqlConfig.js +8 -0
- package/dist/src/atoms/org/index.js +4 -0
- package/dist/src/atoms/org/newOrgConfigAtom.js +2 -0
- package/dist/src/atoms/org/orgAnalyticsConfig.js +8 -0
- package/dist/src/atoms/search/index.js +1 -0
- package/dist/src/atoms/search/productFilters.js +163 -0
- package/dist/src/atoms/search/productRetrievalAPI.js +50 -0
- package/dist/src/atoms/search/productRetrievalAdapter.js +14 -0
- package/dist/src/atoms/search/productSorter.js +13 -0
- package/dist/src/atoms/search/searchAPI.js +140 -0
- package/dist/src/atoms/search/searchServiceAdapter.js +14 -0
- package/dist/src/atoms/search/utils.js +15 -0
- package/dist/src/config/index.js +1 -0
- package/dist/src/config/locators/components/chat/entrypoints.js +10 -0
- package/dist/src/config/locators/components/chat/index.js +21 -0
- package/dist/src/config/locators/components/chat/preview.js +11 -0
- package/dist/src/config/locators/components/chat/variants/index.js +12 -0
- package/dist/src/config/locators/components/common/buttons.js +6 -0
- package/dist/src/config/locators/components/common/cards.js +17 -0
- package/dist/src/config/locators/components/common/index.js +4 -0
- package/dist/src/config/locators/components/common/links.js +1 -0
- package/dist/src/config/locators/components/common/tables.js +1 -0
- package/dist/src/config/locators/components/floating-button.js +2 -0
- package/dist/src/config/locators/components/index.js +3 -0
- package/dist/src/config/locators/components/report-issue.js +13 -0
- package/dist/src/config/locators/components/search/index.js +5 -0
- package/dist/src/config/locators/components/shadow-dom.js +1 -0
- package/dist/src/config/locators/embedded.js +20 -0
- package/dist/src/config/locators/index.js +4 -0
- package/dist/src/contexts/amplitudeContext/amplitudeContext.js +271 -0
- package/dist/src/contexts/amplitudeContext/index.js +1 -0
- package/dist/src/contexts/cdnContext/cdnContext.js +28 -0
- package/dist/src/contexts/cdnContext/index.js +1 -0
- package/dist/src/contexts/enviveConfigContext/enviveConfigContext.js +37 -0
- package/dist/src/contexts/enviveConfigContext/index.js +1 -0
- package/dist/src/contexts/enviveCssContext/enviveCssContext.js +31 -0
- package/dist/src/contexts/enviveCssContext/index.js +1 -0
- package/dist/src/contexts/featureFlagContext/featureFlagContext.js +109 -0
- package/dist/src/contexts/featureFlagContext/index.js +1 -0
- package/dist/src/contexts/featureFlagServiceContext/featureFlagServiceContext.js +47 -0
- package/dist/src/contexts/featureFlagServiceContext/index.js +1 -0
- package/dist/src/contexts/graphqlContext/graphqlContext.js +87 -0
- package/dist/src/contexts/graphqlContext/index.js +1 -0
- package/dist/src/contexts/localStorageContext/index.js +1 -0
- package/dist/src/contexts/localStorageContext/localStorageContext.js +95 -0
- package/dist/src/contexts/newOrgConfigContext/index.js +1 -0
- package/dist/src/contexts/newOrgConfigContext/newOrgConfigContext.js +33 -0
- package/dist/src/contexts/searchContext/index.js +1 -0
- package/dist/src/contexts/searchContext/searchContext.js +131 -0
- package/dist/src/contexts/sessionStorageContext/index.js +1 -0
- package/dist/src/contexts/sessionStorageContext/sessionStorageContext.js +43 -0
- package/dist/src/contexts/shopifyUrlContext/index.js +1 -0
- package/dist/src/contexts/shopifyUrlContext/shopifyUrlContext.js +62 -0
- package/dist/src/contexts/systemSettingsContext/index.js +1 -0
- package/dist/src/contexts/systemSettingsContext/systemSettingsContext.js +29 -0
- package/dist/src/contexts/userIdentityContext/index.js +1 -0
- package/dist/src/contexts/userIdentityContext/userIdentityContext.js +118 -0
- package/dist/src/events/index.js +51 -0
- package/dist/src/events/registerAnalyticsListeners.js +32 -0
- package/dist/src/exceptions/index.js +2 -0
- package/dist/src/exceptions/sessionExceptions.js +6 -0
- package/dist/src/exceptions/unsupportedProductExceptions.js +6 -0
- package/dist/src/hooks/AmplitudeOperations/index.js +1 -0
- package/dist/src/hooks/AmplitudeOperations/useAmplitudeOperations.js +24 -0
- package/dist/src/hooks/AppDetails/index.js +1 -0
- package/dist/src/hooks/AppDetails/useAppDetails.js +26 -0
- package/dist/src/hooks/BlockBackButton/index.js +1 -0
- package/dist/src/hooks/BlockBackButton/useBlockBackButton.js +23 -0
- package/dist/src/hooks/CdnOperations/index.js +1 -0
- package/dist/src/hooks/CdnOperations/useCdnOperations.js +13 -0
- package/dist/src/hooks/ChatToggle/index.js +1 -0
- package/dist/src/hooks/ChatToggle/useChatToggle.js +50 -0
- package/dist/src/hooks/ChatToggleAnalytics/index.js +1 -0
- package/dist/src/hooks/ChatToggleAnalytics/useChatToggleAnalytics.js +11 -0
- package/dist/src/hooks/CustomerSupportHandoff/index.js +1 -0
- package/dist/src/hooks/CustomerSupportHandoff/useCustomerSupportHandoff.js +32 -0
- package/dist/src/hooks/Debounce/index.js +1 -0
- package/dist/src/hooks/Debounce/useDebounce.js +13 -0
- package/dist/src/hooks/ElementObserver/index.js +1 -0
- package/dist/src/hooks/ElementObserver/useElementObserver.js +208 -0
- package/dist/src/hooks/GrabAndScroll/index.js +1 -0
- package/dist/src/hooks/GrabAndScroll/useGrabAndScroll.js +105 -0
- package/dist/src/hooks/GraphQLConfig/index.js +1 -0
- package/dist/src/hooks/GraphQLConfig/useGraphQLConfig.js +54 -0
- package/dist/src/hooks/IdentifyUser/index.js +1 -0
- package/dist/src/hooks/IdentifyUser/useIdentifyUser.js +28 -0
- package/dist/src/hooks/ImageResolver/index.js +1 -0
- package/dist/src/hooks/ImageResolver/useImageResolver.js +45 -0
- package/dist/src/hooks/Intersection/index.js +1 -0
- package/dist/src/hooks/Intersection/useIntersection.js +20 -0
- package/dist/src/hooks/IsSmallScreen/index.js +1 -0
- package/dist/src/hooks/IsSmallScreen/useIsSmallScreen.js +16 -0
- package/dist/src/hooks/LocalStorageOperations/index.js +1 -0
- package/dist/src/hooks/LocalStorageOperations/useLocalStorageOperations.js +64 -0
- package/dist/src/hooks/MessageFilter/index.js +1 -0
- package/dist/src/hooks/MessageFilter/useMessageFilter.js +37 -0
- package/dist/src/hooks/MessageScrollObserver/index.js +1 -0
- package/dist/src/hooks/MessageScrollObserver/useMessageScrollObserver.js +35 -0
- package/dist/src/hooks/NewOrgConfig/index.js +1 -0
- package/dist/src/hooks/NewOrgConfig/useNewOrgConfig.js +5 -0
- package/dist/src/hooks/Search/index.js +1 -0
- package/dist/src/hooks/Search/useRecommendedProducts.js +35 -0
- package/dist/src/hooks/Search/useSearch.js +224 -0
- package/dist/src/hooks/Search/useSearchInput.js +192 -0
- package/dist/src/hooks/SearchOperations/index.js +1 -0
- package/dist/src/hooks/SearchOperations/useSearchOperations.js +78 -0
- package/dist/src/hooks/SessionStorageOperations/index.js +1 -0
- package/dist/src/hooks/SessionStorageOperations/useSessionStorageOperations.js +20 -0
- package/dist/src/hooks/ShopifyUrlOperations/index.js +1 -0
- package/dist/src/hooks/ShopifyUrlOperations/useShopifyUrlOperations.js +34 -0
- package/dist/src/hooks/SnapCalculator/index.js +1 -0
- package/dist/src/hooks/SnapCalculator/useSnapCalculator.js +22 -0
- package/dist/src/hooks/SystemSettingsContext/index.js +1 -0
- package/dist/src/hooks/SystemSettingsContext/useSystemSettingsContext.js +9 -0
- package/dist/src/hooks/TrackComponentVisibleEvent/index.js +1 -0
- package/dist/src/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.js +45 -0
- package/dist/src/hooks/UpdateAnalyticsProps/index.js +1 -0
- package/dist/src/hooks/UpdateAnalyticsProps/useUpdateAnalyticsProps.js +43 -0
- package/dist/src/hooks/utils.js +116 -0
- package/dist/src/interceptors/index.js +1 -0
- package/dist/src/interceptors/useMessageInterceptor.js +24 -0
- package/dist/src/types/ApiResponse.js +1 -0
- package/dist/src/types/FilterAttribute.js +3 -0
- package/dist/src/types/Message.js +24 -0
- package/dist/src/types/Suggestion.js +3 -0
- package/dist/src/types/index.js +4 -0
- package/dist/src/util/colorVar.js +3 -0
- package/dist/src/util/configVersion.js +4 -0
- package/dist/src/util/domInsertion.js +16 -0
- package/dist/{systemSettingsContext-CYce8iqH.cjs → systemSettingsContext-068vQuP2.cjs} +2 -2
- package/dist/{systemSettingsContext-D9BZ9EwQ.js → systemSettingsContext-DPdDfVhj.js} +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/{urlsParser-C-Vzs--G.cjs → urlsParser-bb8ciRFg.cjs} +1 -1
- package/dist/{urlsParser-G7Ocwg0M.js → urlsParser-v_1DKvyf.js} +1 -1
- package/dist/{useAppDetails-CSpw8teP.js → useAppDetails-BPXln8UE.js} +4 -4
- package/dist/{useAppDetails-DNG_-DI9.cjs → useAppDetails-eP2hBuid.cjs} +7 -7
- package/dist/{useGraphQLConfig-D1REGfFB.js → useGraphQLConfig-Btszi6cG.js} +2 -2
- package/dist/{useGraphQLConfig-CKtaLlQ-.cjs → useGraphQLConfig-v9veUbvJ.cjs} +2 -2
- package/dist/{useIntersection-BQMfiS4x.cjs → useIntersection-BcBCa890.cjs} +1 -1
- package/dist/{useIntersection-D-ol9eH8.js → useIntersection-BkMkuJcZ.js} +1 -1
- package/dist/{utils-sosM0bEk.d.ts → utils-BitIIghf.d.ts} +1 -1
- package/dist/{utils-hYTjy7hJ.cjs → utils-CJk5iwQI.cjs} +1 -1
- package/dist/utils-CWzuvlOR.js +607 -0
- package/dist/{utils-BBICrPjW.cjs → utils-CqVRbvfN.cjs} +1 -1
- package/dist/{utils-w4-xONRA.js → utils-DQhbbAnt.js} +1 -1
- package/dist/{utils-D_kATUj6.js → utils-D_nGHczN.js} +1 -1
- package/dist/utils-SjlIHajO.cjs +716 -0
- package/package.json +1 -1
- package/src/application/commerce-api.ts +2 -0
- package/src/application/utils/analyticsUtils.ts +31 -16
- package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +1 -1
- package/src/atoms/chat/chatState.ts +12 -7
- package/src/atoms/chat/replies.ts +42 -40
- package/src/contexts/amplitudeContext/amplitudeContext.tsx +116 -130
- package/dist/amplitudeContext-CMTvCsJC.d.ts +0 -52
- package/dist/amplitudeContext-ZkerrMUa.d.cts +0 -52
- package/dist/amplitudeTrackEventAtom-D9vs8dpE.cjs +0 -15
- package/dist/amplitudeTrackEventAtom-iEIu11Om.js +0 -8
- package/dist/chat-ChCtIEwh.js +0 -227
- package/dist/chatState-BYB77nbx.cjs +0 -120
- package/dist/chatState-CzH7APPP.js +0 -34
- package/dist/org-C2kLSSe9.cjs +0 -111
- package/dist/org-CIczyLRP.js +0 -32
- package/dist/utils-DGpMn2pp.js +0 -1364
- package/dist/utils-DqxtxrFe.cjs +0 -1546
- /package/dist/{featureFlagServiceContext-DgoR6euC.js → featureFlagServiceContext-CISyb90N.js} +0 -0
- /package/dist/{featureFlagServiceContext-b-rYgf0u.cjs → featureFlagServiceContext-Csgo-MUv.cjs} +0 -0
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
+
const require_dist = require('./dist-VxRI6eQv.cjs');
|
|
3
|
+
const require_types = require('./types-B8HZYWV3.cjs');
|
|
4
|
+
const require_models = require('./models-Dl0_Ujgj.cjs');
|
|
5
|
+
const require_logger = require('./logger-BqHq67zN.cjs');
|
|
6
|
+
let __spiffy_ai_commerce_api_client = require("@spiffy-ai/commerce-api-client");
|
|
7
|
+
__spiffy_ai_commerce_api_client = require_chunk.__toESM(__spiffy_ai_commerce_api_client);
|
|
8
|
+
|
|
9
|
+
//#region src/application/utils/analyticsUtils.ts
|
|
10
|
+
const NORMALIZED_ADD_TO_CART_EVENT_NAMES = ["addtocart", "addedtocart"];
|
|
11
|
+
const CHECK_DATA_LAYER_INTERVAL_MS = 500;
|
|
12
|
+
const CHECK_DATA_LAYER_MAX_ATTEMPTS = 10;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if a Google Analytics event is an add_to_cart event.
|
|
15
|
+
*
|
|
16
|
+
* @param event The event name to check.
|
|
17
|
+
*
|
|
18
|
+
* @returns True if the event is an add_to_cart event, false otherwise.
|
|
19
|
+
*/
|
|
20
|
+
const isAddToCartEvent = (event) => {
|
|
21
|
+
const normalizedEvent = event.replace(/[-_]/g, "").toLowerCase();
|
|
22
|
+
return NORMALIZED_ADD_TO_CART_EVENT_NAMES.some((name) => normalizedEvent.includes(name));
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Tracks an add_to_cart event in Amplitude.
|
|
26
|
+
*
|
|
27
|
+
* @param event The event to track.
|
|
28
|
+
*/
|
|
29
|
+
const handleAddToCartEvent = (event, track) => {
|
|
30
|
+
let eventProps;
|
|
31
|
+
if (require_models.isLegacyUAEcommerceEvent(event)) eventProps = {
|
|
32
|
+
items: event.ecommerce.add.products.map((product) => ({
|
|
33
|
+
item_name: product.name,
|
|
34
|
+
item_category: product.category,
|
|
35
|
+
price: product.price,
|
|
36
|
+
quantity: product.quantity
|
|
37
|
+
})),
|
|
38
|
+
currency: event.ecommerce.add.currencyCode,
|
|
39
|
+
event_format_version: "legacy_universal_analytics"
|
|
40
|
+
};
|
|
41
|
+
else if (require_models.isGA4EcommerceEvent(event)) eventProps = {
|
|
42
|
+
items: event.ecommerce.items.map((item) => ({
|
|
43
|
+
item_name: item.item_name,
|
|
44
|
+
item_category: item.item_category,
|
|
45
|
+
price: item.price,
|
|
46
|
+
quantity: item.quantity
|
|
47
|
+
})),
|
|
48
|
+
currency: event.ecommerce.currency,
|
|
49
|
+
event_format_version: "google_analytics_4"
|
|
50
|
+
};
|
|
51
|
+
else eventProps = {
|
|
52
|
+
event_properties: { ...event },
|
|
53
|
+
event_format_version: "unknown"
|
|
54
|
+
};
|
|
55
|
+
track(require_dist.SpiffyMetricsEventName.AddToCartClicked, { eventProps });
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Wraps the window.dataLayer.push method to intercept add_to_cart events and send them to Amplitude.
|
|
59
|
+
* This function runs on an interval until the dataLayer is available.
|
|
60
|
+
*/
|
|
61
|
+
const initDataLayerWrapper = (track) => {
|
|
62
|
+
let attempts = 0;
|
|
63
|
+
const checkAndInitialize = () => {
|
|
64
|
+
if (!window.dataLayer || !window.dataLayer.push) {
|
|
65
|
+
attempts += 1;
|
|
66
|
+
if (attempts >= CHECK_DATA_LAYER_MAX_ATTEMPTS) {
|
|
67
|
+
require_logger.logger_default.logDebug(`[spiffy-ai] dataLayer not available after ${CHECK_DATA_LAYER_MAX_ATTEMPTS} attempts`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
setTimeout(checkAndInitialize, CHECK_DATA_LAYER_INTERVAL_MS);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
require_logger.logger_default.logDebug("[spiffy-ai] dataLayer is available, wrapping push function...");
|
|
74
|
+
const originalPush = window.dataLayer.push;
|
|
75
|
+
window.dataLayer.push = (...args) => {
|
|
76
|
+
if (require_models.isBaseEcommerceEvent(args[0]) && isAddToCartEvent(args[0].event)) handleAddToCartEvent(args[0], track);
|
|
77
|
+
return originalPush.apply(window.dataLayer, args);
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
checkAndInitialize();
|
|
81
|
+
};
|
|
82
|
+
const initAmplitude = (track) => {
|
|
83
|
+
track(require_dist.SpiffyMetricsEventName.BundleLoaded);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/application/utils/coreContextToApiContext.ts
|
|
88
|
+
const coreContextToApiContext = (context) => ({
|
|
89
|
+
chat_id: context.chatId,
|
|
90
|
+
org_id: context.orgId,
|
|
91
|
+
user_id: context.userId,
|
|
92
|
+
org_short_name: context.orgShortName,
|
|
93
|
+
source: context.source,
|
|
94
|
+
env: context.env
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/application/utils/coreUserEventToApiUserEvent.ts
|
|
99
|
+
const coreUserEventToApiUserEvent = (data) => {
|
|
100
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.PdpVisit || data.category === __spiffy_ai_commerce_api_client.UserEventCategory.AddToCart) return {
|
|
101
|
+
event_id: data.eventId,
|
|
102
|
+
created_at: data.createdAt,
|
|
103
|
+
category: data.category,
|
|
104
|
+
attributes: {
|
|
105
|
+
product_id: data.attributes.productId,
|
|
106
|
+
parent_product_id: data.attributes.parentProductId,
|
|
107
|
+
url: data.attributes.url
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.PlpVisit) return {
|
|
111
|
+
event_id: data.eventId,
|
|
112
|
+
created_at: data.createdAt,
|
|
113
|
+
category: data.category,
|
|
114
|
+
attributes: {
|
|
115
|
+
category: __spiffy_ai_commerce_api_client.PLPAttributeCategory.Id,
|
|
116
|
+
attributes: { id: data.attributes.attributes.id }
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.QueryTyped) return {
|
|
120
|
+
event_id: data.eventId,
|
|
121
|
+
created_at: data.createdAt,
|
|
122
|
+
category: data.category,
|
|
123
|
+
attributes: { query: data.attributes.query }
|
|
124
|
+
};
|
|
125
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.Search) return {
|
|
126
|
+
event_id: data.eventId,
|
|
127
|
+
created_at: data.createdAt,
|
|
128
|
+
category: data.category,
|
|
129
|
+
attributes: {
|
|
130
|
+
search_term: data.attributes.searchTerm,
|
|
131
|
+
selected_filters: data.attributes.selectedFilters
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.SuggestionClicked) return {
|
|
135
|
+
event_id: data.eventId,
|
|
136
|
+
created_at: data.createdAt,
|
|
137
|
+
category: data.category,
|
|
138
|
+
attributes: { suggestion_id: data.attributes.suggestionId }
|
|
139
|
+
};
|
|
140
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.PageVisit) return {
|
|
141
|
+
event_id: data.eventId,
|
|
142
|
+
created_at: data.createdAt,
|
|
143
|
+
category: data.category,
|
|
144
|
+
attributes: {
|
|
145
|
+
url: data.attributes.url,
|
|
146
|
+
page_visit_category: data.attributes.pageVisitCategory
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
if (data.category === __spiffy_ai_commerce_api_client.UserEventCategory.FormSubmitted) return {
|
|
150
|
+
event_id: data.eventId,
|
|
151
|
+
created_at: data.createdAt,
|
|
152
|
+
category: data.category,
|
|
153
|
+
attributes: {
|
|
154
|
+
filled_schema: { ...data.attributes.filledSchema },
|
|
155
|
+
form_response_id: data.attributes.formResponseId,
|
|
156
|
+
form_type: data.attributes.formType
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
event_id: data.eventId,
|
|
161
|
+
created_at: data.createdAt,
|
|
162
|
+
category: data.category
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
//#endregion
|
|
167
|
+
//#region src/application/utils/divideArray.ts
|
|
168
|
+
const divideArray = (array, size) => {
|
|
169
|
+
const rows = [];
|
|
170
|
+
for (let i = 0; i < size; i += 1) rows.push(array.filter((_, index) => index % size === i));
|
|
171
|
+
return rows;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
//#endregion
|
|
175
|
+
//#region src/application/utils/imageFilter.ts
|
|
176
|
+
const getRecentProductImageUrls = (lastMessages, currentProductId) => {
|
|
177
|
+
const productMessages = lastMessages.filter((message) => message.type === require_dist.MessageType.Product && message.metadata?.imageUrl).map((m) => m);
|
|
178
|
+
return [...productMessages.filter((m) => m.metadata?.id === currentProductId), ...productMessages.filter((m) => m.metadata?.id !== currentProductId)].map((m) => m.metadata.imageUrl);
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/application/utils/merchantUtils.ts
|
|
183
|
+
const prepareMerchantPage = () => {
|
|
184
|
+
let metaViewport = document.querySelector("meta[name='viewport']");
|
|
185
|
+
if (metaViewport) {
|
|
186
|
+
const content = metaViewport.getAttribute("content");
|
|
187
|
+
if (!content?.includes("maximum-scale=1")) metaViewport.setAttribute("content", `${content}, maximum-scale=1`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
metaViewport = document.createElement("meta");
|
|
191
|
+
metaViewport.setAttribute("name", "viewport");
|
|
192
|
+
metaViewport.setAttribute("content", "width=device-width, initial-scale=1, maximum-scale=1");
|
|
193
|
+
document.head.appendChild(metaViewport);
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/application/utils/messageFromFormSubmittedEvent.ts
|
|
198
|
+
const messageFromFormSubmittedEvent = (event, formResponseAttributes) => {
|
|
199
|
+
if (event.category !== __spiffy_ai_commerce_api_client.UserEventCategory.FormSubmitted) return;
|
|
200
|
+
const formStringContents = Object.entries(formResponseAttributes.schema.properties).map(([key, value]) => `${value.title}: ${event.attributes.filledSchema[key]}`).join("\n");
|
|
201
|
+
return {
|
|
202
|
+
id: event.eventId,
|
|
203
|
+
role: require_dist.MessageRole.User,
|
|
204
|
+
type: require_dist.MessageType.QueryTyped,
|
|
205
|
+
createdAt: event.createdAt,
|
|
206
|
+
metadata: { content: formStringContents }
|
|
207
|
+
};
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/application/utils/messageFromQueryEvent.ts
|
|
212
|
+
/**
|
|
213
|
+
* Transforms a query UserEvent object into a Message object for presentation.
|
|
214
|
+
*
|
|
215
|
+
* @param event The user event object received from the server
|
|
216
|
+
*
|
|
217
|
+
* @returns A Message if the event is a query event, otherwise undefined
|
|
218
|
+
*/
|
|
219
|
+
const messageFromQueryEvent = (event) => {
|
|
220
|
+
if (event.category === __spiffy_ai_commerce_api_client.UserEventCategory.QueryTyped) return {
|
|
221
|
+
id: event.eventId,
|
|
222
|
+
role: require_dist.MessageRole.User,
|
|
223
|
+
type: require_dist.MessageType.QueryTyped,
|
|
224
|
+
createdAt: event.createdAt,
|
|
225
|
+
metadata: { content: event.attributes.query }
|
|
226
|
+
};
|
|
227
|
+
if (event.category === __spiffy_ai_commerce_api_client.UserEventCategory.Search) return {
|
|
228
|
+
id: event.eventId,
|
|
229
|
+
role: require_dist.MessageRole.User,
|
|
230
|
+
type: require_dist.MessageType.Search,
|
|
231
|
+
createdAt: event.createdAt,
|
|
232
|
+
metadata: {
|
|
233
|
+
searchTerm: event.attributes.searchTerm || "",
|
|
234
|
+
selectedFilters: event.attributes.selectedFilters || []
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
//#endregion
|
|
240
|
+
//#region src/application/utils/messageFromResponse.ts
|
|
241
|
+
/**
|
|
242
|
+
* Transforms a server Response object into a Message object for presentation.
|
|
243
|
+
*
|
|
244
|
+
* @param response The response object received from the server containing model generated content
|
|
245
|
+
*
|
|
246
|
+
* @returns A Message if the response contains known attributes, undefined otherwise
|
|
247
|
+
*/
|
|
248
|
+
const messageFromResponse = (response) => {
|
|
249
|
+
if (response == null) return;
|
|
250
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Text) return {
|
|
251
|
+
id: response.id,
|
|
252
|
+
createdAt: response.createdAt,
|
|
253
|
+
type: require_types.MessageType.Text,
|
|
254
|
+
role: require_types.MessageRole.Assistant,
|
|
255
|
+
metadata: { content: response.attributes.content }
|
|
256
|
+
};
|
|
257
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Product) return {
|
|
258
|
+
id: response.id,
|
|
259
|
+
createdAt: response.createdAt,
|
|
260
|
+
role: require_types.MessageRole.Assistant,
|
|
261
|
+
type: require_types.MessageType.Product,
|
|
262
|
+
metadata: { ...response.attributes }
|
|
263
|
+
};
|
|
264
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Review) return {
|
|
265
|
+
id: response.id,
|
|
266
|
+
createdAt: response.createdAt,
|
|
267
|
+
type: require_types.MessageType.Review,
|
|
268
|
+
role: require_types.MessageRole.Assistant,
|
|
269
|
+
metadata: {
|
|
270
|
+
review: response.attributes.review,
|
|
271
|
+
reviewer: response.attributes.reviewer,
|
|
272
|
+
stars: response.attributes.stars,
|
|
273
|
+
title: response.attributes.title,
|
|
274
|
+
richInformation: response.attributes.richInformation
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Separator) return {
|
|
278
|
+
id: response.id,
|
|
279
|
+
createdAt: response.createdAt,
|
|
280
|
+
type: require_types.MessageType.Separator,
|
|
281
|
+
role: require_types.MessageRole.Assistant
|
|
282
|
+
};
|
|
283
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Page) return {
|
|
284
|
+
id: response.id,
|
|
285
|
+
createdAt: response.createdAt,
|
|
286
|
+
role: require_types.MessageRole.Assistant,
|
|
287
|
+
type: require_types.MessageType.Page,
|
|
288
|
+
metadata: { ...response.attributes }
|
|
289
|
+
};
|
|
290
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.ProductSearch) return {
|
|
291
|
+
id: response.id,
|
|
292
|
+
createdAt: response.createdAt,
|
|
293
|
+
role: require_types.MessageRole.Assistant,
|
|
294
|
+
type: require_types.MessageType.ProductSearch,
|
|
295
|
+
metadata: { ...response.attributes }
|
|
296
|
+
};
|
|
297
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.ProductSearchFilter) return {
|
|
298
|
+
id: response.id,
|
|
299
|
+
createdAt: response.createdAt,
|
|
300
|
+
role: require_types.MessageRole.Assistant,
|
|
301
|
+
type: require_types.MessageType.ProductSearchFilter,
|
|
302
|
+
metadata: { ...response.attributes }
|
|
303
|
+
};
|
|
304
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Form) return {
|
|
305
|
+
id: response.id,
|
|
306
|
+
createdAt: response.createdAt,
|
|
307
|
+
role: require_types.MessageRole.Assistant,
|
|
308
|
+
type: require_types.MessageType.Form,
|
|
309
|
+
metadata: {
|
|
310
|
+
formType: response.attributes.formCategory?.formType,
|
|
311
|
+
fields: Object.entries(response.attributes.schema.properties).map(([key, value]) => ({
|
|
312
|
+
key,
|
|
313
|
+
title: value.title,
|
|
314
|
+
type: value.type,
|
|
315
|
+
format: value.format,
|
|
316
|
+
required: response.attributes.schema.required.includes(key)
|
|
317
|
+
}))
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
if (response.category === __spiffy_ai_commerce_api_client.ResponseCategory.Order) return {
|
|
321
|
+
id: response.id,
|
|
322
|
+
createdAt: response.createdAt,
|
|
323
|
+
role: require_types.MessageRole.Assistant,
|
|
324
|
+
type: require_types.MessageType.Order,
|
|
325
|
+
metadata: { ...response.attributes }
|
|
326
|
+
};
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
//#endregion
|
|
330
|
+
//#region src/application/utils/messageFromSuggestionEvent.ts
|
|
331
|
+
/**
|
|
332
|
+
* Transforms a UserEvent object into a Message object for presentation.
|
|
333
|
+
*
|
|
334
|
+
* @param event The UserEvent object received from the server
|
|
335
|
+
* @param suggestions A list of generated suggestions to match the event to
|
|
336
|
+
*
|
|
337
|
+
* @returns A Message if the event is a suggestion click event, undefined otherwise
|
|
338
|
+
*/
|
|
339
|
+
const messageFromSuggestionEvent = (event, suggestions) => {
|
|
340
|
+
if (event.category === __spiffy_ai_commerce_api_client.UserEventCategory.SuggestionClicked) {
|
|
341
|
+
const { suggestionId } = event.attributes;
|
|
342
|
+
return {
|
|
343
|
+
id: event.eventId,
|
|
344
|
+
role: require_types.MessageRole.User,
|
|
345
|
+
type: require_types.MessageType.SuggestionClicked,
|
|
346
|
+
createdAt: event.createdAt,
|
|
347
|
+
metadata: {
|
|
348
|
+
suggestionId,
|
|
349
|
+
suggestionContent: suggestions.find((s) => s.id === suggestionId)?.content ?? ""
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
//#endregion
|
|
356
|
+
//#region src/application/utils/nextMessageRequestToApiRequest.ts
|
|
357
|
+
const messageRequestToCommerceMessageRequest = (data) => ({
|
|
358
|
+
context: {
|
|
359
|
+
chat_id: data.context.chatId,
|
|
360
|
+
org_id: data.context.orgId,
|
|
361
|
+
org_short_name: data.context.orgShortName,
|
|
362
|
+
user_id: data.context.userId,
|
|
363
|
+
source: data.context.source,
|
|
364
|
+
env: data.context.env
|
|
365
|
+
},
|
|
366
|
+
id: data.id,
|
|
367
|
+
feature_flags: data.featureFlags,
|
|
368
|
+
user_events: data.userEvents?.map((userEvent) => coreUserEventToApiUserEvent(userEvent)),
|
|
369
|
+
generation_params: {
|
|
370
|
+
model: data.generationParams?.model,
|
|
371
|
+
max_tokens: data.generationParams?.maxTokens,
|
|
372
|
+
stop: data.generationParams?.stop,
|
|
373
|
+
stream: data.generationParams?.stream,
|
|
374
|
+
temperature: data.generationParams?.temperature,
|
|
375
|
+
top_p: data.generationParams?.topP,
|
|
376
|
+
num_suggestions: data.generationParams?.numSuggestions,
|
|
377
|
+
response_system_prompt: data.generationParams?.responseSystemPrompt,
|
|
378
|
+
suggestion_system_prompt: data.generationParams?.suggestionSystemPrompt,
|
|
379
|
+
response_caching: data.generationParams?.responseCaching
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
//#endregion
|
|
384
|
+
//#region src/application/utils/nodeSelector.ts
|
|
385
|
+
var NodeSelector = class {
|
|
386
|
+
constructor(pattern) {
|
|
387
|
+
this.pattern = pattern;
|
|
388
|
+
this.root = document;
|
|
389
|
+
}
|
|
390
|
+
getPattern() {
|
|
391
|
+
return this.pattern;
|
|
392
|
+
}
|
|
393
|
+
setRoot(root) {
|
|
394
|
+
this.root = root;
|
|
395
|
+
}
|
|
396
|
+
getRoot() {
|
|
397
|
+
return this.root;
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
var QuerySelector = class extends NodeSelector {
|
|
401
|
+
parse() {
|
|
402
|
+
return this.getRoot().querySelector(this.getPattern());
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
var IDSelector = class extends NodeSelector {
|
|
406
|
+
parse() {
|
|
407
|
+
return this.getRoot().getElementById(this.getPattern());
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
var XpathSelector = class extends NodeSelector {
|
|
411
|
+
parse() {
|
|
412
|
+
return this.getRoot()?.evaluate(this.getPattern(), this.getRoot(), null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)?.singleNodeValue;
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
var ChainSelector = class extends NodeSelector {
|
|
416
|
+
parse() {
|
|
417
|
+
let selectorIndex = 0;
|
|
418
|
+
const selectors = this.getPattern().split("@");
|
|
419
|
+
const lastIndex = selectors.length - 1;
|
|
420
|
+
const parseChain = (pattern, prevNode) => {
|
|
421
|
+
const selector = SelectorFactory.parse(pattern);
|
|
422
|
+
if (prevNode) selector.setRoot(prevNode);
|
|
423
|
+
const currentNode = selector.parse();
|
|
424
|
+
if (selectorIndex === lastIndex) return currentNode;
|
|
425
|
+
let node = currentNode || document;
|
|
426
|
+
if (currentNode?.shadowRoot) node = currentNode.shadowRoot;
|
|
427
|
+
if (currentNode?.contentWindow) node = currentNode.contentWindow?.document;
|
|
428
|
+
return parseChain(selectors[++selectorIndex].trim(), node);
|
|
429
|
+
};
|
|
430
|
+
return parseChain(selectors[selectorIndex].trim());
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
var Empty = class extends NodeSelector {
|
|
434
|
+
constructor() {
|
|
435
|
+
super("");
|
|
436
|
+
}
|
|
437
|
+
parse() {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
var SelectorFactory = class {
|
|
442
|
+
static parse(composedSelector) {
|
|
443
|
+
if (!composedSelector) return new Empty();
|
|
444
|
+
const split = composedSelector.split("|");
|
|
445
|
+
const type = split[0];
|
|
446
|
+
const selector = split[1];
|
|
447
|
+
switch (type) {
|
|
448
|
+
case "id": return this.id(selector);
|
|
449
|
+
case "query": return this.query(selector);
|
|
450
|
+
case "xpath": return this.xpath(selector);
|
|
451
|
+
default: return new Empty();
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
static check(selector) {
|
|
455
|
+
return selector ?? new Empty();
|
|
456
|
+
}
|
|
457
|
+
static chain(pattern) {
|
|
458
|
+
return pattern ? new ChainSelector(pattern) : new Empty();
|
|
459
|
+
}
|
|
460
|
+
static id(pattern) {
|
|
461
|
+
return pattern ? new IDSelector(pattern) : new Empty();
|
|
462
|
+
}
|
|
463
|
+
static query(pattern) {
|
|
464
|
+
return pattern ? new QuerySelector(pattern) : new Empty();
|
|
465
|
+
}
|
|
466
|
+
static xpath(pattern) {
|
|
467
|
+
return pattern ? new XpathSelector(pattern) : new Empty();
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
//#endregion
|
|
472
|
+
//#region src/application/utils/overrides.ts
|
|
473
|
+
function isPlainObject(x) {
|
|
474
|
+
return !!x && typeof x === "object" && !Array.isArray(x) && !(x instanceof Date) && !(x instanceof RegExp);
|
|
475
|
+
}
|
|
476
|
+
function isReplace(x) {
|
|
477
|
+
return !!x && typeof x === "object" && "$replace" in x;
|
|
478
|
+
}
|
|
479
|
+
function isDelete(x) {
|
|
480
|
+
return !!x && typeof x === "object" && x.$delete === true;
|
|
481
|
+
}
|
|
482
|
+
function isPrimitiveValue(x) {
|
|
483
|
+
const t = typeof x;
|
|
484
|
+
return x === null || t === "string" || t === "number" || t === "boolean" || t === "bigint" || t === "symbol" || t === "undefined";
|
|
485
|
+
}
|
|
486
|
+
function isArrayOfPrimitives(arr) {
|
|
487
|
+
if (arr.length === 0) return false;
|
|
488
|
+
for (let i = 0; i < arr.length; i += 1) {
|
|
489
|
+
const v = arr[i];
|
|
490
|
+
if (v !== void 0 && !isPrimitiveValue(v)) return false;
|
|
491
|
+
}
|
|
492
|
+
return true;
|
|
493
|
+
}
|
|
494
|
+
function mergeAny(baseAny, patchAny, opts) {
|
|
495
|
+
if (isReplace(patchAny)) return patchAny.$replace;
|
|
496
|
+
if (isDelete(patchAny)) return void 0;
|
|
497
|
+
if (Array.isArray(baseAny)) {
|
|
498
|
+
if (Array.isArray(patchAny)) {
|
|
499
|
+
const baseArr = baseAny;
|
|
500
|
+
const patchArr = patchAny;
|
|
501
|
+
if (opts.arrayStrategy === "replace" || isArrayOfPrimitives(baseArr) || isArrayOfPrimitives(patchArr)) return patchAny;
|
|
502
|
+
const out = baseArr.slice();
|
|
503
|
+
const max = Math.max(out.length, patchArr.length);
|
|
504
|
+
for (let i = 0; i < max; i += 1) {
|
|
505
|
+
const pVal = patchArr[i];
|
|
506
|
+
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
507
|
+
}
|
|
508
|
+
return out;
|
|
509
|
+
}
|
|
510
|
+
return baseAny;
|
|
511
|
+
}
|
|
512
|
+
if (isPlainObject(baseAny) && isPlainObject(patchAny)) {
|
|
513
|
+
const baseObj = baseAny;
|
|
514
|
+
const patchObj = patchAny;
|
|
515
|
+
const out = { ...baseObj };
|
|
516
|
+
for (const key of Object.keys(patchObj)) {
|
|
517
|
+
const pVal = patchObj[key];
|
|
518
|
+
if (pVal === void 0) {} else if (opts.nullDeletes && pVal === null) delete out[key];
|
|
519
|
+
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
520
|
+
else if (isDelete(pVal)) delete out[key];
|
|
521
|
+
else out[key] = mergeAny(baseObj?.[key], pVal, opts);
|
|
522
|
+
}
|
|
523
|
+
return out;
|
|
524
|
+
}
|
|
525
|
+
return patchAny ?? baseAny;
|
|
526
|
+
}
|
|
527
|
+
function applyOverrides(base, patch, opts = {}) {
|
|
528
|
+
const { arrayStrategy = "mergeByIndex", nullDeletes = false } = opts;
|
|
529
|
+
if (isReplace(patch)) return patch.$replace;
|
|
530
|
+
if (isDelete(patch)) return void 0;
|
|
531
|
+
if (Array.isArray(base)) {
|
|
532
|
+
if (isReplace(patch)) return patch.$replace;
|
|
533
|
+
if (Array.isArray(patch)) {
|
|
534
|
+
if (arrayStrategy === "replace") return patch;
|
|
535
|
+
const out = base.slice();
|
|
536
|
+
const max = Math.max(out.length, patch.length);
|
|
537
|
+
for (let i = 0; i < max; i += 1) {
|
|
538
|
+
const pVal = patch[i];
|
|
539
|
+
if (pVal !== void 0) out[i] = mergeAny(out[i], pVal, opts);
|
|
540
|
+
}
|
|
541
|
+
return out;
|
|
542
|
+
}
|
|
543
|
+
return base;
|
|
544
|
+
}
|
|
545
|
+
if (isPlainObject(base) && isPlainObject(patch)) {
|
|
546
|
+
const out = { ...base };
|
|
547
|
+
const patchObj = patch;
|
|
548
|
+
for (const key of Object.keys(patchObj)) {
|
|
549
|
+
const pVal = patchObj[key];
|
|
550
|
+
if (pVal === void 0) {} else if (nullDeletes && pVal === null) delete out[key];
|
|
551
|
+
else if (isReplace(pVal)) out[key] = pVal.$replace;
|
|
552
|
+
else if (isDelete(pVal)) delete out[key];
|
|
553
|
+
else {
|
|
554
|
+
const bVal = base[key];
|
|
555
|
+
out[key] = mergeAny(bVal, pVal, opts);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return out;
|
|
559
|
+
}
|
|
560
|
+
return patch ?? base;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
//#endregion
|
|
564
|
+
//#region src/application/utils/stringUtils.ts
|
|
565
|
+
var StringUtils = class StringUtils {
|
|
566
|
+
static isNullOrEmpty(value) {
|
|
567
|
+
const valueTrimmed = value?.trim();
|
|
568
|
+
return value === void 0 || valueTrimmed === "";
|
|
569
|
+
}
|
|
570
|
+
static trimToNull(value) {
|
|
571
|
+
const valueTrimmed = value?.trim();
|
|
572
|
+
return StringUtils.isNullOrEmpty(valueTrimmed) ? void 0 : valueTrimmed;
|
|
573
|
+
}
|
|
574
|
+
static capitalize(type) {
|
|
575
|
+
if (type === void 0) return "";
|
|
576
|
+
return type.charAt(0).toUpperCase() + type.substring(1);
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Finds the first pattern in an array that matches a given URL.
|
|
580
|
+
* Patterns can include a single wildcard '*' which matches any sequence of characters.
|
|
581
|
+
*
|
|
582
|
+
* @param patterns
|
|
583
|
+
* @param urlToTest
|
|
584
|
+
* @returns
|
|
585
|
+
*/
|
|
586
|
+
static findMatchingPattern(patterns, urlToTest) {
|
|
587
|
+
if (!urlToTest) return;
|
|
588
|
+
for (const pattern of patterns) if (urlToTest.pathname !== "/") {
|
|
589
|
+
const regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
590
|
+
if ((/* @__PURE__ */ new RegExp(`^${regexPattern}$`)).test(urlToTest.pathname)) return pattern;
|
|
591
|
+
} else if (pattern.startsWith(urlToTest.hostname)) return pattern;
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
//#endregion
|
|
596
|
+
//#region src/application/utils/supportedEventRequestToApiRequest.ts
|
|
597
|
+
const coreSupportedEventRequestToApiRequest = (coreSupportedEventRequest) => ({
|
|
598
|
+
id: coreSupportedEventRequest.id,
|
|
599
|
+
user_event: coreUserEventToApiUserEvent(coreSupportedEventRequest.userEvent),
|
|
600
|
+
context: coreContextToApiContext(coreSupportedEventRequest.context)
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
//#endregion
|
|
604
|
+
//#region src/application/utils/validation.ts
|
|
605
|
+
const validateEmail = (value) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
|
|
606
|
+
|
|
607
|
+
//#endregion
|
|
608
|
+
Object.defineProperty(exports, 'NodeSelector', {
|
|
609
|
+
enumerable: true,
|
|
610
|
+
get: function () {
|
|
611
|
+
return NodeSelector;
|
|
612
|
+
}
|
|
613
|
+
});
|
|
614
|
+
Object.defineProperty(exports, 'SelectorFactory', {
|
|
615
|
+
enumerable: true,
|
|
616
|
+
get: function () {
|
|
617
|
+
return SelectorFactory;
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
Object.defineProperty(exports, 'StringUtils', {
|
|
621
|
+
enumerable: true,
|
|
622
|
+
get: function () {
|
|
623
|
+
return StringUtils;
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
Object.defineProperty(exports, 'applyOverrides', {
|
|
627
|
+
enumerable: true,
|
|
628
|
+
get: function () {
|
|
629
|
+
return applyOverrides;
|
|
630
|
+
}
|
|
631
|
+
});
|
|
632
|
+
Object.defineProperty(exports, 'coreContextToApiContext', {
|
|
633
|
+
enumerable: true,
|
|
634
|
+
get: function () {
|
|
635
|
+
return coreContextToApiContext;
|
|
636
|
+
}
|
|
637
|
+
});
|
|
638
|
+
Object.defineProperty(exports, 'coreSupportedEventRequestToApiRequest', {
|
|
639
|
+
enumerable: true,
|
|
640
|
+
get: function () {
|
|
641
|
+
return coreSupportedEventRequestToApiRequest;
|
|
642
|
+
}
|
|
643
|
+
});
|
|
644
|
+
Object.defineProperty(exports, 'coreUserEventToApiUserEvent', {
|
|
645
|
+
enumerable: true,
|
|
646
|
+
get: function () {
|
|
647
|
+
return coreUserEventToApiUserEvent;
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
Object.defineProperty(exports, 'divideArray', {
|
|
651
|
+
enumerable: true,
|
|
652
|
+
get: function () {
|
|
653
|
+
return divideArray;
|
|
654
|
+
}
|
|
655
|
+
});
|
|
656
|
+
Object.defineProperty(exports, 'getRecentProductImageUrls', {
|
|
657
|
+
enumerable: true,
|
|
658
|
+
get: function () {
|
|
659
|
+
return getRecentProductImageUrls;
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
Object.defineProperty(exports, 'initAmplitude', {
|
|
663
|
+
enumerable: true,
|
|
664
|
+
get: function () {
|
|
665
|
+
return initAmplitude;
|
|
666
|
+
}
|
|
667
|
+
});
|
|
668
|
+
Object.defineProperty(exports, 'initDataLayerWrapper', {
|
|
669
|
+
enumerable: true,
|
|
670
|
+
get: function () {
|
|
671
|
+
return initDataLayerWrapper;
|
|
672
|
+
}
|
|
673
|
+
});
|
|
674
|
+
Object.defineProperty(exports, 'messageFromFormSubmittedEvent', {
|
|
675
|
+
enumerable: true,
|
|
676
|
+
get: function () {
|
|
677
|
+
return messageFromFormSubmittedEvent;
|
|
678
|
+
}
|
|
679
|
+
});
|
|
680
|
+
Object.defineProperty(exports, 'messageFromQueryEvent', {
|
|
681
|
+
enumerable: true,
|
|
682
|
+
get: function () {
|
|
683
|
+
return messageFromQueryEvent;
|
|
684
|
+
}
|
|
685
|
+
});
|
|
686
|
+
Object.defineProperty(exports, 'messageFromResponse', {
|
|
687
|
+
enumerable: true,
|
|
688
|
+
get: function () {
|
|
689
|
+
return messageFromResponse;
|
|
690
|
+
}
|
|
691
|
+
});
|
|
692
|
+
Object.defineProperty(exports, 'messageFromSuggestionEvent', {
|
|
693
|
+
enumerable: true,
|
|
694
|
+
get: function () {
|
|
695
|
+
return messageFromSuggestionEvent;
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
Object.defineProperty(exports, 'messageRequestToCommerceMessageRequest', {
|
|
699
|
+
enumerable: true,
|
|
700
|
+
get: function () {
|
|
701
|
+
return messageRequestToCommerceMessageRequest;
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
Object.defineProperty(exports, 'prepareMerchantPage', {
|
|
705
|
+
enumerable: true,
|
|
706
|
+
get: function () {
|
|
707
|
+
return prepareMerchantPage;
|
|
708
|
+
}
|
|
709
|
+
});
|
|
710
|
+
Object.defineProperty(exports, 'validateEmail', {
|
|
711
|
+
enumerable: true,
|
|
712
|
+
get: function () {
|
|
713
|
+
return validateEmail;
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtU2psSUhhak8uY2pzIiwibmFtZXMiOlsiZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iLCJpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQiLCJpc0dBNEVjb21tZXJjZUV2ZW50IiwiU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSIsImlzQmFzZUVjb21tZXJjZUV2ZW50IiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJQTFBBdHRyaWJ1dGVDYXRlZ29yeSIsIk1lc3NhZ2VUeXBlIiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJNZXNzYWdlUm9sZSIsIk1lc3NhZ2VUeXBlIiwiVXNlckV2ZW50Q2F0ZWdvcnkiLCJNZXNzYWdlUm9sZSIsIk1lc3NhZ2VUeXBlIiwiUmVzcG9uc2VDYXRlZ29yeSIsIk1lc3NhZ2VUeXBlIiwiTWVzc2FnZVJvbGUiLCJVc2VyRXZlbnRDYXRlZ29yeSIsIk1lc3NhZ2VSb2xlIiwiTWVzc2FnZVR5cGUiLCJub2RlOiBOb2RlIHwgbnVsbCB8IHVuZGVmaW5lZCIsIm91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvYW5hbHl0aWNzVXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvY29yZUNvbnRleHRUb0FwaUNvbnRleHQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2RpdmlkZUFycmF5LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL2ltYWdlRmlsdGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lcmNoYW50VXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21RdWVyeUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL21lc3NhZ2VGcm9tUmVzcG9uc2UudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvbmV4dE1lc3NhZ2VSZXF1ZXN0VG9BcGlSZXF1ZXN0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL25vZGVTZWxlY3Rvci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi91dGlscy9vdmVycmlkZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvc3RyaW5nVXRpbHMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vdXRpbHMvc3VwcG9ydGVkRXZlbnRSZXF1ZXN0VG9BcGlSZXF1ZXN0LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3ZhbGlkYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZ2dlciBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyXCI7XG5pbXBvcnQge1xuICBpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQsXG4gIGlzR0E0RWNvbW1lcmNlRXZlbnQsXG4gIGlzQmFzZUVjb21tZXJjZUV2ZW50LFxufSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgQmFzZUVjb21tZXJjZUV2ZW50LCBTcGlmZnlNZXRyaWNzRXZlbnROYW1lIH0gZnJvbSBcIkBlbnZpdmUtYWkvdHlwZXNcIjtcblxuY29uc3QgTk9STUFMSVpFRF9BRERfVE9fQ0FSVF9FVkVOVF9OQU1FUyA9IFtcImFkZHRvY2FydFwiLCBcImFkZGVkdG9jYXJ0XCJdO1xuY29uc3QgQ0hFQ0tfREFUQV9MQVlFUl9JTlRFUlZBTF9NUyA9IDUwMDtcbmNvbnN0IENIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTID0gMTA7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgR29vZ2xlIEFuYWx5dGljcyBldmVudCBpcyBhbiBhZGRfdG9fY2FydCBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IG5hbWUgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYW4gYWRkX3RvX2NhcnQgZXZlbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuY29uc3QgaXNBZGRUb0NhcnRFdmVudCA9IChldmVudDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFdmVudCA9IGV2ZW50LnJlcGxhY2UoL1stX10vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIE5PUk1BTElaRURfQUREX1RPX0NBUlRfRVZFTlRfTkFNRVMuc29tZSgobmFtZSkgPT5cbiAgICBub3JtYWxpemVkRXZlbnQuaW5jbHVkZXMobmFtZSlcbiAgKTtcbn07XG5cbi8qKlxuICogVHJhY2tzIGFuIGFkZF90b19jYXJ0IGV2ZW50IGluIEFtcGxpdHVkZS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHRyYWNrLlxuICovXG5jb25zdCBoYW5kbGVBZGRUb0NhcnRFdmVudCA9IChcbiAgZXZlbnQ6IEJhc2VFY29tbWVyY2VFdmVudCxcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIGxldCBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBpZiAoaXNMZWdhY3lVQUVjb21tZXJjZUV2ZW50KGV2ZW50KSkge1xuICAgIGV2ZW50UHJvcHMgPSB7XG4gICAgICBpdGVtczogZXZlbnQuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5tYXAoKHByb2R1Y3QpID0+ICh7XG4gICAgICAgIGl0ZW1fbmFtZTogcHJvZHVjdC5uYW1lLFxuICAgICAgICBpdGVtX2NhdGVnb3J5OiBwcm9kdWN0LmNhdGVnb3J5LFxuICAgICAgICBwcmljZTogcHJvZHVjdC5wcmljZSxcbiAgICAgICAgcXVhbnRpdHk6IHByb2R1Y3QucXVhbnRpdHksXG4gICAgICB9KSksXG4gICAgICBjdXJyZW5jeTogZXZlbnQuZWNvbW1lcmNlLmFkZC5jdXJyZW5jeUNvZGUsXG4gICAgICBldmVudF9mb3JtYXRfdmVyc2lvbjogXCJsZWdhY3lfdW5pdmVyc2FsX2FuYWx5dGljc1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNHQTRFY29tbWVyY2VFdmVudChldmVudCkpIHtcbiAgICBldmVudFByb3BzID0ge1xuICAgICAgaXRlbXM6IGV2ZW50LmVjb21tZXJjZS5pdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgIGl0ZW1fbmFtZTogaXRlbS5pdGVtX25hbWUsXG4gICAgICAgIGl0ZW1fY2F0ZWdvcnk6IGl0ZW0uaXRlbV9jYXRlZ29yeSxcbiAgICAgICAgcHJpY2U6IGl0ZW0ucHJpY2UsXG4gICAgICAgIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5LFxuICAgICAgfSkpLFxuICAgICAgY3VycmVuY3k6IGV2ZW50LmVjb21tZXJjZS5jdXJyZW5jeSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcImdvb2dsZV9hbmFseXRpY3NfNFwiLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZXZlbnRQcm9wcyA9IHtcbiAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IHsgLi4uZXZlbnQgfSxcbiAgICAgIGV2ZW50X2Zvcm1hdF92ZXJzaW9uOiBcInVua25vd25cIixcbiAgICB9O1xuICB9XG5cbiAgdHJhY2soU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5BZGRUb0NhcnRDbGlja2VkLCB7XG4gICAgZXZlbnRQcm9wcyxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFdyYXBzIHRoZSB3aW5kb3cuZGF0YUxheWVyLnB1c2ggbWV0aG9kIHRvIGludGVyY2VwdCBhZGRfdG9fY2FydCBldmVudHMgYW5kIHNlbmQgdGhlbSB0byBBbXBsaXR1ZGUuXG4gKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgb24gYW4gaW50ZXJ2YWwgdW50aWwgdGhlIGRhdGFMYXllciBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0RGF0YUxheWVyV3JhcHBlciA9IChcbiAgdHJhY2s6IChcbiAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUsXG4gICAgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkgPT4gdm9pZFxuKSA9PiB7XG4gIGxldCBhdHRlbXB0cyA9IDA7XG5cbiAgLy8gY3VycmVudGx5LCBvdXIgYnVuZGxlIGlzIGFsd2F5cyBsb2FkZWQgYWZ0ZXIgR1RNIGhhcyBpbml0aWFsaXplZCBHQS9kYXRhTGF5ZXJcbiAgLy8gd2UnbGwgbmVlZCB0aGlzIGNoZWNrIGhlcmUgaWYvd2hlbiB3ZSBsb2FkIHNwaWZmeSBiZWZvcmUvb3V0c2lkZSBvZiBHVE1cbiAgY29uc3QgY2hlY2tBbmRJbml0aWFsaXplID0gKCkgPT4ge1xuICAgIGlmICghd2luZG93LmRhdGFMYXllciB8fCAhKHdpbmRvdy5kYXRhTGF5ZXIgYXMgYW55KS5wdXNoKSB7XG4gICAgICBhdHRlbXB0cyArPSAxO1xuXG4gICAgICBpZiAoYXR0ZW1wdHMgPj0gQ0hFQ0tfREFUQV9MQVlFUl9NQVhfQVRURU1QVFMpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICAgIGBbc3BpZmZ5LWFpXSBkYXRhTGF5ZXIgbm90IGF2YWlsYWJsZSBhZnRlciAke0NIRUNLX0RBVEFfTEFZRVJfTUFYX0FUVEVNUFRTfSBhdHRlbXB0c2BcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KGNoZWNrQW5kSW5pdGlhbGl6ZSwgQ0hFQ0tfREFUQV9MQVlFUl9JTlRFUlZBTF9NUyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgXCJbc3BpZmZ5LWFpXSBkYXRhTGF5ZXIgaXMgYXZhaWxhYmxlLCB3cmFwcGluZyBwdXNoIGZ1bmN0aW9uLi4uXCJcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsUHVzaCA9IHdpbmRvdy5kYXRhTGF5ZXIucHVzaDtcbiAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2ggPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzQmFzZUVjb21tZXJjZUV2ZW50KGFyZ3NbMF0pICYmXG4gICAgICAgIGlzQWRkVG9DYXJ0RXZlbnQoKGFyZ3NbMF0gYXMgYW55KS5ldmVudClcbiAgICAgICkge1xuICAgICAgICBoYW5kbGVBZGRUb0NhcnRFdmVudChhcmdzWzBdIGFzIEJhc2VFY29tbWVyY2VFdmVudCwgdHJhY2spO1xuICAgICAgfVxuXG4gICAgICAvLyBJTVBPUlRBTlQ6IGNhbGwgdGhlIG9yaWdpbmFsIHB1c2ggbWV0aG9kIHNvIHRoYXQgdGhlIGV2ZW50IGlzIHN0aWxsIGxvZ2dlZCB0byBHQVxuICAgICAgcmV0dXJuIG9yaWdpbmFsUHVzaC5hcHBseSh3aW5kb3cuZGF0YUxheWVyLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG4gIGNoZWNrQW5kSW5pdGlhbGl6ZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluaXRBbXBsaXR1ZGUgPSAoXG4gIHRyYWNrOiAoXG4gICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLFxuICAgIGV2ZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApID0+IHZvaWRcbikgPT4ge1xuICAvLyBUaGlzIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZSBuZWVkZWQgYW55bW9yZSBpZiBBbXBsaXR1ZGUgaXMgaW5pdGlhbGl6ZWQgdmlhIGNvbnRleHQuXG4gIC8vIEZvciBub3csIHdlJ2xsIGtlZXAgaXQgYW5kIHBhc3MgdGhlIHRyYWNrIGZ1bmN0aW9uLlxuICAvLyBJZiBpdCdzIHRydWx5IHJlZHVuZGFudCwgaXQgY2FuIGJlIHJlbW92ZWQgbGF0ZXIuXG4gIHRyYWNrKFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuQnVuZGxlTG9hZGVkKTsgLy8gRXhhbXBsZSB1c2FnZSwgYWRqdXN0IGFzIG5lZWRlZFxufTtcbiIsImltcG9ydCB7IENhbWVsQ2FzZWRQcm9wZXJ0aWVzRGVlcCB9IGZyb20gJ0BlbnZpdmUtYWkvdHlwZXMnO1xuaW1wb3J0IHsgQ29udGV4dCBhcyBBcGlDb250ZXh0IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuaW50ZXJmYWNlIENvcmVDb250ZXh0IGV4dGVuZHMgQ2FtZWxDYXNlZFByb3BlcnRpZXNEZWVwPEFwaUNvbnRleHQ+IHt9XG5cbmV4cG9ydCBjb25zdCBjb3JlQ29udGV4dFRvQXBpQ29udGV4dCA9IChjb250ZXh0OiBDb3JlQ29udGV4dCk6IEFwaUNvbnRleHQgPT4gKHtcbiAgY2hhdF9pZDogY29udGV4dC5jaGF0SWQsXG4gIG9yZ19pZDogY29udGV4dC5vcmdJZCxcbiAgdXNlcl9pZDogY29udGV4dC51c2VySWQsXG4gIG9yZ19zaG9ydF9uYW1lOiBjb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgc291cmNlOiBjb250ZXh0LnNvdXJjZSxcbiAgZW52OiBjb250ZXh0LmVudixcbn0pO1xuIiwiaW1wb3J0IHsgVXNlckV2ZW50IH0gZnJvbSAnQGVudml2ZS1haS90eXBlcyc7XG5pbXBvcnQge1xuICBVc2VyRXZlbnQgYXMgQXBpVXNlckV2ZW50LFxuICBQTFBBdHRyaWJ1dGVDYXRlZ29yeSxcbiAgUExQSWRBdHRyaWJ1dGVzLFxuICBVc2VyRXZlbnRDYXRlZ29yeSxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCA9IChkYXRhOiBVc2VyRXZlbnQpOiBBcGlVc2VyRXZlbnQgPT4ge1xuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUGRwVmlzaXQgfHxcbiAgICBkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5BZGRUb0NhcnRcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBwcm9kdWN0X2lkOiBkYXRhLmF0dHJpYnV0ZXMucHJvZHVjdElkLFxuICAgICAgICBwYXJlbnRfcHJvZHVjdF9pZDogZGF0YS5hdHRyaWJ1dGVzLnBhcmVudFByb2R1Y3RJZCxcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBscFZpc2l0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBjYXRlZ29yeTogUExQQXR0cmlidXRlQ2F0ZWdvcnkuSWQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAvLyB3ZSdyZSBvbmx5IGhhbmRsaW5nIGlkIGF0dHJpYnV0ZXMgZm9yIG5vd1xuICAgICAgICAgIGlkOiAoZGF0YS5hdHRyaWJ1dGVzLmF0dHJpYnV0ZXMgYXMgUExQSWRBdHRyaWJ1dGVzKS5pZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5RdWVyeVR5cGVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBxdWVyeTogZGF0YS5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlNlYXJjaCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc2VhcmNoX3Rlcm06IGRhdGEuYXR0cmlidXRlcy5zZWFyY2hUZXJtLFxuICAgICAgICBzZWxlY3RlZF9maWx0ZXJzOiBkYXRhLmF0dHJpYnV0ZXMuc2VsZWN0ZWRGaWx0ZXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlN1Z2dlc3Rpb25DbGlja2VkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X2lkOiBkYXRhLmV2ZW50SWQsXG4gICAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBzdWdnZXN0aW9uX2lkOiBkYXRhLmF0dHJpYnV0ZXMuc3VnZ2VzdGlvbklkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlBhZ2VWaXNpdCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgICBwYWdlX3Zpc2l0X2NhdGVnb3J5OiBkYXRhLmF0dHJpYnV0ZXMucGFnZVZpc2l0Q2F0ZWdvcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudF9pZDogZGF0YS5ldmVudElkLFxuICAgICAgY3JlYXRlZF9hdDogZGF0YS5jcmVhdGVkQXQsXG4gICAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsbGVkX3NjaGVtYTogeyAuLi5kYXRhLmF0dHJpYnV0ZXMuZmlsbGVkU2NoZW1hIH0sXG4gICAgICAgIGZvcm1fcmVzcG9uc2VfaWQ6IGRhdGEuYXR0cmlidXRlcy5mb3JtUmVzcG9uc2VJZCxcbiAgICAgICAgZm9ybV90eXBlOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybVR5cGUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGFwcF9sb2FkZWQgZXZlbnQsIHdoZW4gd2Ugc3RhcnQgdG8gdXNlIGFwcF91bmxvYWRlZCB3ZSBuZWVkIHRvIGhhbmRsZSBpdCBoZXJlXG4gIHJldHVybiB7XG4gICAgZXZlbnRfaWQ6IGRhdGEuZXZlbnRJZCxcbiAgICBjcmVhdGVkX2F0OiBkYXRhLmNyZWF0ZWRBdCxcbiAgICBjYXRlZ29yeTogZGF0YS5jYXRlZ29yeSxcbiAgfTtcbn07XG4iLCJleHBvcnQgY29uc3QgZGl2aWRlQXJyYXkgPSA8VD4oYXJyYXk6IFRbXSwgc2l6ZTogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IHJvd3MgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDEpIHtcbiAgICByb3dzLnB1c2goYXJyYXkuZmlsdGVyKChfOiBULCBpbmRleDogbnVtYmVyKSA9PiBpbmRleCAlIHNpemUgPT09IGkpKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn07XG4iLCJpbXBvcnQgeyBNZXNzYWdlLCBNZXNzYWdlVHlwZSwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YSB9IGZyb20gJ0BlbnZpdmUtYWkvdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgZ2V0UmVjZW50UHJvZHVjdEltYWdlVXJscyA9IChcbiAgbGFzdE1lc3NhZ2VzOiBNZXNzYWdlW10sXG4gIGN1cnJlbnRQcm9kdWN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBwcm9kdWN0TWVzc2FnZXMgPSBsYXN0TWVzc2FnZXNcbiAgICAuZmlsdGVyKChtZXNzYWdlKSA9PiBtZXNzYWdlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLlByb2R1Y3QgJiYgbWVzc2FnZS5tZXRhZGF0YT8uaW1hZ2VVcmwpXG4gICAgLm1hcCgobSkgPT4gbSBhcyBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhKTtcbiAgLy8gcHV0IGFkZGVkIHByb2R1Y3QgaW1hZ2UgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdFxuICByZXR1cm4gW1xuICAgIC4uLnByb2R1Y3RNZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0ubWV0YWRhdGE/LmlkID09PSBjdXJyZW50UHJvZHVjdElkKSxcbiAgICAuLi5wcm9kdWN0TWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLm1ldGFkYXRhPy5pZCAhPT0gY3VycmVudFByb2R1Y3RJZCksXG4gIF0ubWFwKChtKSA9PiBtLm1ldGFkYXRhIS5pbWFnZVVybCEpO1xufTtcbiIsImV4cG9ydCBjb25zdCBwcmVwYXJlTWVyY2hhbnRQYWdlID0gKCkgPT4ge1xuICBsZXQgbWV0YVZpZXdwb3J0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0ndmlld3BvcnQnXVwiKTtcbiAgaWYgKG1ldGFWaWV3cG9ydCkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBtZXRhVmlld3BvcnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKVxuICAgIGNvbnN0IGhhc01heGltdW1TY2FsZSA9IGNvbnRlbnQ/LmluY2x1ZGVzKFwibWF4aW11bS1zY2FsZT0xXCIpXG4gICAgaWYgKCFoYXNNYXhpbXVtU2NhbGUpIHtcbiAgICAgIG1ldGFWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIsIGAke2NvbnRlbnR9LCBtYXhpbXVtLXNjYWxlPTFgKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIG1ldGFWaWV3cG9ydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJtZXRhXCIpO1xuICBtZXRhVmlld3BvcnQuc2V0QXR0cmlidXRlKFwibmFtZVwiLCBcInZpZXdwb3J0XCIpXG4gIG1ldGFWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIsIFwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEsIG1heGltdW0tc2NhbGU9MVwiKVxuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG1ldGFWaWV3cG9ydCk7XG59XG4iLCJpbXBvcnQgeyBVc2VyRXZlbnRDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQge1xuICBGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBNZXNzYWdlLFxuICBNZXNzYWdlUm9sZSxcbiAgTWVzc2FnZVR5cGUsXG4gIFVzZXJFdmVudCxcbn0gZnJvbSAnQGVudml2ZS1haS90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudCA9IChcbiAgZXZlbnQ6IFVzZXJFdmVudCxcbiAgZm9ybVJlc3BvbnNlQXR0cmlidXRlczogRm9ybVJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddLFxuKTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSAhPT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBmb3JtU3RyaW5nQ29udGVudHMgPSBPYmplY3QuZW50cmllcyhmb3JtUmVzcG9uc2VBdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7dmFsdWUudGl0bGV9OiAke2V2ZW50LmF0dHJpYnV0ZXMuZmlsbGVkU2NoZW1hW2tleV19YClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlF1ZXJ5VHlwZWQsXG4gICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIGNvbnRlbnQ6IGZvcm1TdHJpbmdDb250ZW50cyxcbiAgICB9LFxuICB9O1xufTtcbiIsImltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgVXNlckV2ZW50IH0gZnJvbSAnQGVudml2ZS1haS90eXBlcyc7XG5pbXBvcnQgeyBVc2VyRXZlbnRDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIHF1ZXJ5IFVzZXJFdmVudCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV2ZW50IFRoZSB1c2VyIGV2ZW50IG9iamVjdCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgcXVlcnkgZXZlbnQsIG90aGVyd2lzZSB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VGcm9tUXVlcnlFdmVudCA9IChldmVudDogVXNlckV2ZW50KTogTWVzc2FnZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZXZlbnQuZXZlbnRJZCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLlVzZXIsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5RdWVyeVR5cGVkLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBjb250ZW50OiBldmVudC5hdHRyaWJ1dGVzLnF1ZXJ5LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoLFxuICAgICAgY3JlYXRlZEF0OiBldmVudC5jcmVhdGVkQXQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBzZWFyY2hUZXJtOiBldmVudC5hdHRyaWJ1dGVzLnNlYXJjaFRlcm0gfHwgJycsXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyczogZXZlbnQuYXR0cmlidXRlcy5zZWxlY3RlZEZpbHRlcnMgfHwgW10sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VUeXBlLCBNZXNzYWdlUm9sZSwgQXBpUmVzcG9uc2UgfSBmcm9tIFwic3JjL3R5cGVzXCI7XG5pbXBvcnQgeyBSZXNwb25zZUNhdGVnb3J5IH0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBzZXJ2ZXIgUmVzcG9uc2Ugb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0IHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBjb250YWluaW5nIG1vZGVsIGdlbmVyYXRlZCBjb250ZW50XG4gKlxuICogQHJldHVybnMgQSBNZXNzYWdlIGlmIHRoZSByZXNwb25zZSBjb250YWlucyBrbm93biBhdHRyaWJ1dGVzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCBtZXNzYWdlRnJvbVJlc3BvbnNlID0gKFxuICByZXNwb25zZT86IEFwaVJlc3BvbnNlXG4pOiBNZXNzYWdlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlRleHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgY29udGVudDogcmVzcG9uc2UuYXR0cmlidXRlcy5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlByb2R1Y3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0LFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXcsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICByZXZpZXc6IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmV2aWV3LFxuICAgICAgICByZXZpZXdlcjogcmVzcG9uc2UuYXR0cmlidXRlcy5yZXZpZXdlcixcbiAgICAgICAgc3RhcnM6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuc3RhcnMsXG4gICAgICAgIHRpdGxlOiByZXNwb25zZS5hdHRyaWJ1dGVzLnRpdGxlLFxuICAgICAgICByaWNoSW5mb3JtYXRpb246IHJlc3BvbnNlLmF0dHJpYnV0ZXMucmljaEluZm9ybWF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlNlcGFyYXRvcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlNlcGFyYXRvcixcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlBhZ2UpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5QYWdlLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgLi4ucmVzcG9uc2UuYXR0cmlidXRlcyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXNwb25zZS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogcmVzcG9uc2UuY3JlYXRlZEF0LFxuICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaEZpbHRlcikge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogcmVzcG9uc2UuaWQsXG4gICAgICBjcmVhdGVkQXQ6IHJlc3BvbnNlLmNyZWF0ZWRBdCxcbiAgICAgIHJvbGU6IE1lc3NhZ2VSb2xlLkFzc2lzdGFudCxcbiAgICAgIHR5cGU6IE1lc3NhZ2VUeXBlLlByb2R1Y3RTZWFyY2hGaWx0ZXIsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICAuLi5yZXNwb25zZS5hdHRyaWJ1dGVzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgZm9ybVR5cGU6IHJlc3BvbnNlLmF0dHJpYnV0ZXMuZm9ybUNhdGVnb3J5Py5mb3JtVHlwZSxcbiAgICAgICAgZmllbGRzOiBPYmplY3QuZW50cmllcyhyZXNwb25zZS5hdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzKS5tYXAoXG4gICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHRpdGxlOiB2YWx1ZS50aXRsZSxcbiAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICBmb3JtYXQ6IHZhbHVlLmZvcm1hdCxcbiAgICAgICAgICAgIHJlcXVpcmVkOiByZXNwb25zZS5hdHRyaWJ1dGVzLnNjaGVtYS5yZXF1aXJlZC5pbmNsdWRlcyhrZXkpLFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVzcG9uc2UuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuT3JkZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHJlc3BvbnNlLmlkLFxuICAgICAgY3JlYXRlZEF0OiByZXNwb25zZS5jcmVhdGVkQXQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Bc3Npc3RhbnQsXG4gICAgICB0eXBlOiBNZXNzYWdlVHlwZS5PcmRlcixcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLnJlc3BvbnNlLmF0dHJpYnV0ZXMsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IE1lc3NhZ2UsIE1lc3NhZ2VSb2xlLCBNZXNzYWdlVHlwZSwgU3VnZ2VzdGlvbiB9IGZyb20gXCJzcmMvdHlwZXNcIjtcbmltcG9ydCB7IFVzZXJFdmVudCB9IGZyb20gXCJAZW52aXZlLWFpL3R5cGVzXCI7XG5pbXBvcnQgeyBVc2VyRXZlbnRDYXRlZ29yeSB9IGZyb20gXCJAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnRcIjtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgVXNlckV2ZW50IG9iamVjdCBpbnRvIGEgTWVzc2FnZSBvYmplY3QgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIFVzZXJFdmVudCBvYmplY3QgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gKiBAcGFyYW0gc3VnZ2VzdGlvbnMgQSBsaXN0IG9mIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBtYXRjaCB0aGUgZXZlbnQgdG9cbiAqXG4gKiBAcmV0dXJucyBBIE1lc3NhZ2UgaWYgdGhlIGV2ZW50IGlzIGEgc3VnZ2VzdGlvbiBjbGljayBldmVudCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZUZyb21TdWdnZXN0aW9uRXZlbnQgPSAoXG4gIGV2ZW50OiBVc2VyRXZlbnQsXG4gIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW11cbik6IE1lc3NhZ2UgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlN1Z2dlc3Rpb25DbGlja2VkKSB7XG4gICAgY29uc3QgeyBzdWdnZXN0aW9uSWQgfSA9IGV2ZW50LmF0dHJpYnV0ZXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICByb2xlOiBNZXNzYWdlUm9sZS5Vc2VyLFxuICAgICAgdHlwZTogTWVzc2FnZVR5cGUuU3VnZ2VzdGlvbkNsaWNrZWQsXG4gICAgICBjcmVhdGVkQXQ6IGV2ZW50LmNyZWF0ZWRBdCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHN1Z2dlc3Rpb25JZCxcbiAgICAgICAgc3VnZ2VzdGlvbkNvbnRlbnQ6XG4gICAgICAgICAgc3VnZ2VzdGlvbnMuZmluZCgocykgPT4gcy5pZCA9PT0gc3VnZ2VzdGlvbklkKT8uY29udGVudCA/PyBcIlwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG4iLCJpbXBvcnQgeyBOZXh0TWVzc2FnZVJlcXVlc3QgYXMgQXBpTmV4dE1lc3NhZ2VSZXF1ZXN0IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCB9IGZyb20gJy4vY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50JztcbmltcG9ydCB7IE5leHRNZXNzYWdlUmVxdWVzdCB9IGZyb20gJ0BlbnZpdmUtYWkvdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QgPSAoXG4gIGRhdGE6IE5leHRNZXNzYWdlUmVxdWVzdCxcbik6IEFwaU5leHRNZXNzYWdlUmVxdWVzdCA9PiAoe1xuICBjb250ZXh0OiB7XG4gICAgY2hhdF9pZDogZGF0YS5jb250ZXh0LmNoYXRJZCxcbiAgICBvcmdfaWQ6IGRhdGEuY29udGV4dC5vcmdJZCxcbiAgICBvcmdfc2hvcnRfbmFtZTogZGF0YS5jb250ZXh0Lm9yZ1Nob3J0TmFtZSxcbiAgICB1c2VyX2lkOiBkYXRhLmNvbnRleHQudXNlcklkLFxuICAgIHNvdXJjZTogZGF0YS5jb250ZXh0LnNvdXJjZSxcbiAgICBlbnY6IGRhdGEuY29udGV4dC5lbnYsXG4gIH0sXG4gIGlkOiBkYXRhLmlkLFxuICBmZWF0dXJlX2ZsYWdzOiBkYXRhLmZlYXR1cmVGbGFncyxcbiAgdXNlcl9ldmVudHM6IGRhdGEudXNlckV2ZW50cz8ubWFwKCh1c2VyRXZlbnQpID0+IGNvcmVVc2VyRXZlbnRUb0FwaVVzZXJFdmVudCh1c2VyRXZlbnQpKSxcbiAgZ2VuZXJhdGlvbl9wYXJhbXM6IHtcbiAgICBtb2RlbDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5tb2RlbCxcbiAgICBtYXhfdG9rZW5zOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/Lm1heFRva2VucyxcbiAgICBzdG9wOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0b3AsXG4gICAgc3RyZWFtOiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnN0cmVhbSxcbiAgICB0ZW1wZXJhdHVyZTogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50ZW1wZXJhdHVyZSxcbiAgICB0b3BfcDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy50b3BQLFxuICAgIG51bV9zdWdnZXN0aW9uczogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5udW1TdWdnZXN0aW9ucyxcbiAgICByZXNwb25zZV9zeXN0ZW1fcHJvbXB0OiBkYXRhLmdlbmVyYXRpb25QYXJhbXM/LnJlc3BvbnNlU3lzdGVtUHJvbXB0LFxuICAgIHN1Z2dlc3Rpb25fc3lzdGVtX3Byb21wdDogZGF0YS5nZW5lcmF0aW9uUGFyYW1zPy5zdWdnZXN0aW9uU3lzdGVtUHJvbXB0LFxuICAgIHJlc3BvbnNlX2NhY2hpbmc6IGRhdGEuZ2VuZXJhdGlvblBhcmFtcz8ucmVzcG9uc2VDYWNoaW5nLFxuICB9LFxufSk7XG4iLCJleHBvcnQgYWJzdHJhY3QgY2xhc3MgTm9kZVNlbGVjdG9yIHtcbiAgcHJpdmF0ZSBwYXR0ZXJuOiBzdHJpbmc7XG4gIHByaXZhdGUgcm9vdDogRG9jdW1lbnQ7XG5cbiAgY29uc3RydWN0b3IocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudDtcbiAgfVxuXG4gIGdldFBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0dGVybjtcbiAgfVxuXG4gIHNldFJvb3Qocm9vdDogRG9jdW1lbnQpIHtcbiAgICB0aGlzLnJvb3QgPSByb290O1xuICB9XG5cbiAgZ2V0Um9vdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgYWJzdHJhY3QgcGFyc2UoKTogTm9kZSB8IG51bGw7XG59XG5cbmNsYXNzIFF1ZXJ5U2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLnF1ZXJ5U2VsZWN0b3IodGhpcy5nZXRQYXR0ZXJuKCkpO1xuICB9XG59XG5cbmNsYXNzIElEU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpLmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UGF0dGVybigpKSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIFhwYXRoU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Um9vdCgpPy5ldmFsdWF0ZShcbiAgICAgIHRoaXMuZ2V0UGF0dGVybigpLFxuICAgICAgdGhpcy5nZXRSb290KCksXG4gICAgICBudWxsLFxuICAgICAgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsXG4gICAgICBudWxsLFxuICAgICk/LnNpbmdsZU5vZGVWYWx1ZSBhcyBOb2RlO1xuICB9XG59XG5cbmNsYXNzIENoYWluU2VsZWN0b3IgZXh0ZW5kcyBOb2RlU2VsZWN0b3Ige1xuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgbGV0IHNlbGVjdG9ySW5kZXggPSAwO1xuICAgIGNvbnN0IHNlbGVjdG9ycyA9IHRoaXMuZ2V0UGF0dGVybigpLnNwbGl0KCdAJyk7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gc2VsZWN0b3JzLmxlbmd0aCAtIDE7XG5cbiAgICBjb25zdCBwYXJzZUNoYWluID0gKHBhdHRlcm46IHN0cmluZywgcHJldk5vZGU/OiBOb2RlIHwgbnVsbCk6IE5vZGUgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gU2VsZWN0b3JGYWN0b3J5LnBhcnNlKHBhdHRlcm4pO1xuXG4gICAgICBpZiAocHJldk5vZGUpIHtcbiAgICAgICAgc2VsZWN0b3Iuc2V0Um9vdChwcmV2Tm9kZSBhcyBEb2N1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gc2VsZWN0b3IucGFyc2UoKTtcbiAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgfCB1bmRlZmluZWQgPSBjdXJyZW50Tm9kZSB8fCBkb2N1bWVudDtcbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpPy5zaGFkb3dSb290KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLnNoYWRvd1Jvb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpPy5jb250ZW50V2luZG93KSB7XG4gICAgICAgIG5vZGUgPSAoY3VycmVudE5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpLmNvbnRlbnRXaW5kb3c/LmRvY3VtZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbKytzZWxlY3RvckluZGV4XS50cmltKCksIG5vZGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gcGFyc2VDaGFpbihzZWxlY3RvcnNbc2VsZWN0b3JJbmRleF0udHJpbSgpKTtcbiAgfVxufVxuXG5jbGFzcyBFbXB0eSBleHRlbmRzIE5vZGVTZWxlY3RvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCcnKTtcbiAgfVxuICBwYXJzZSgpOiBOb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yRmFjdG9yeSB7XG4gIHN0YXRpYyBwYXJzZShjb21wb3NlZFNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjb21wb3NlZFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gbmV3IEVtcHR5KCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXQgPSBjb21wb3NlZFNlbGVjdG9yLnNwbGl0KCd8Jyk7XG4gICAgY29uc3QgdHlwZSA9IHNwbGl0WzBdO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gc3BsaXRbMV07XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQoc2VsZWN0b3IpO1xuICAgICAgY2FzZSAncXVlcnknOlxuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgICBjYXNlICd4cGF0aCc6XG4gICAgICAgIHJldHVybiB0aGlzLnhwYXRoKHNlbGVjdG9yKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgRW1wdHkoKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2soc2VsZWN0b3I/OiBOb2RlU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gc2VsZWN0b3IgPz8gbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgY2hhaW4ocGF0dGVybj86IHN0cmluZykge1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IENoYWluU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxuXG4gIHN0YXRpYyBpZChwYXR0ZXJuPzogc3RyaW5nKTogTm9kZVNlbGVjdG9yIHtcbiAgICByZXR1cm4gcGF0dGVybiA/IG5ldyBJRFNlbGVjdG9yKHBhdHRlcm4pIDogbmV3IEVtcHR5KCk7XG4gIH1cblxuICBzdGF0aWMgcXVlcnkocGF0dGVybj86IHN0cmluZyk6IE5vZGVTZWxlY3RvciB7XG4gICAgcmV0dXJuIHBhdHRlcm4gPyBuZXcgUXVlcnlTZWxlY3RvcihwYXR0ZXJuKSA6IG5ldyBFbXB0eSgpO1xuICB9XG5cbiAgc3RhdGljIHhwYXRoKHBhdHRlcm4/OiBzdHJpbmcpOiBOb2RlU2VsZWN0b3Ige1xuICAgIHJldHVybiBwYXR0ZXJuID8gbmV3IFhwYXRoU2VsZWN0b3IocGF0dGVybikgOiBuZXcgRW1wdHkoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGVsZXRlT3AsIE1lcmdlT3B0aW9ucywgTm9JbmZlciwgT3ZlcnJpZGUsIFJlcGxhY2VPcCB9IGZyb20gJ0BlbnZpdmUtYWkvdHlwZXMnO1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHg6IHVua25vd24pOiB4IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIChcbiAgICAhIXggJiZcbiAgICB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheSh4KSAmJlxuICAgICEoeCBpbnN0YW5jZW9mIERhdGUpICYmXG4gICAgISh4IGluc3RhbmNlb2YgUmVnRXhwKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1JlcGxhY2UoeDogdW5rbm93bik6IHggaXMgUmVwbGFjZU9wPHVua25vd24+IHtcbiAgcmV0dXJuICEheCAmJiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgJyRyZXBsYWNlJyBpbiAoeCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG59XG5mdW5jdGlvbiBpc0RlbGV0ZSh4OiB1bmtub3duKTogeCBpcyBEZWxldGVPcCB7XG4gIHJldHVybiAhIXggJiYgdHlwZW9mIHggPT09ICdvYmplY3QnICYmICh4IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS4kZGVsZXRlID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZVZhbHVlKHg6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgdCA9IHR5cGVvZiB4O1xuICByZXR1cm4gKFxuICAgIHggPT09IG51bGwgfHxcbiAgICB0ID09PSAnc3RyaW5nJyB8fFxuICAgIHQgPT09ICdudW1iZXInIHx8XG4gICAgdCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgdCA9PT0gJ2JpZ2ludCcgfHxcbiAgICB0ID09PSAnc3ltYm9sJyB8fFxuICAgIHQgPT09ICd1bmRlZmluZWQnXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlPZlByaW1pdGl2ZXMoYXJyOiB1bmtub3duW10pOiBib29sZWFuIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTsgLy8gYW1iaWd1b3VzLCBkZWZhdWx0IHRvIG1lcmdlLWJ5LWluZGV4IG9uIGVtcHR5XG4gIC8vIElmIGV2ZXJ5IGRlZmluZWQgZWxlbWVudCBpcyBwcmltaXRpdmUsIHRyZWF0IGFzIHByaW1pdGl2ZXNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCB2ID0gYXJyW2ldO1xuICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgIWlzUHJpbWl0aXZlVmFsdWUodikpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VBbnkoYmFzZUFueTogdW5rbm93biwgcGF0Y2hBbnk6IHVua25vd24sIG9wdHM6IE1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICBpZiAoaXNSZXBsYWNlKHBhdGNoQW55KSkgcmV0dXJuIHBhdGNoQW55LiRyZXBsYWNlIGFzIHVua25vd247XG4gIGlmIChpc0RlbGV0ZShwYXRjaEFueSkpIHJldHVybiB1bmRlZmluZWQ7IC8vIGNhbGxlciBkZWxldGVzIHRoZSBrZXlcblxuICBpZiAoQXJyYXkuaXNBcnJheShiYXNlQW55KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGNoQW55KSkge1xuICAgICAgY29uc3QgYmFzZUFyciA9IGJhc2VBbnkgYXMgdW5rbm93bltdO1xuICAgICAgY29uc3QgcGF0Y2hBcnIgPSBwYXRjaEFueSBhcyB1bmtub3duW107XG4gICAgICBjb25zdCBzaG91bGRSZXBsYWNlID1cbiAgICAgICAgb3B0cy5hcnJheVN0cmF0ZWd5ID09PSAncmVwbGFjZScgfHxcbiAgICAgICAgaXNBcnJheU9mUHJpbWl0aXZlcyhiYXNlQXJyKSB8fFxuICAgICAgICBpc0FycmF5T2ZQcmltaXRpdmVzKHBhdGNoQXJyKTtcbiAgICAgIGlmIChzaG91bGRSZXBsYWNlKSByZXR1cm4gcGF0Y2hBbnkgYXMgdW5rbm93bjtcbiAgICAgIGNvbnN0IG91dCA9IGJhc2VBcnIuc2xpY2UoKTtcbiAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KG91dC5sZW5ndGgsIHBhdGNoQXJyLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IHBWYWwgPSBwYXRjaEFycltpXTtcbiAgICAgICAgaWYgKHBWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG91dFtpXSA9IG1lcmdlQW55KG91dFtpXSwgcFZhbCwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQgYXMgdW5rbm93bjtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VBbnkgYXMgdW5rbm93bjtcbiAgfVxuXG4gIGlmIChpc1BsYWluT2JqZWN0KGJhc2VBbnkpICYmIGlzUGxhaW5PYmplY3QocGF0Y2hBbnkpKSB7XG4gICAgY29uc3QgYmFzZU9iaiA9IGJhc2VBbnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgcGF0Y2hPYmogPSBwYXRjaEFueSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyAuLi5iYXNlT2JqIH07XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGF0Y2hPYmopKSB7XG4gICAgICBjb25zdCBwVmFsID0gcGF0Y2hPYmpba2V5XTtcbiAgICAgIGlmIChwVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gbGVhdmUgYXMtaXNcbiAgICAgIH0gZWxzZSBpZiAob3B0cy5udWxsRGVsZXRlcyAmJiBwVmFsID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBvdXRba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZXBsYWNlKHBWYWwpKSB7XG4gICAgICAgIG91dFtrZXldID0gcFZhbC4kcmVwbGFjZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNEZWxldGUocFZhbCkpIHtcbiAgICAgICAgZGVsZXRlIG91dFtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUFueShiYXNlT2JqPy5ba2V5XSwgcFZhbCwgb3B0cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQgYXMgdW5rbm93bjtcbiAgfVxuXG4gIHJldHVybiAocGF0Y2hBbnkgYXMgdW5rbm93bikgPz8gYmFzZUFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3ZlcnJpZGVzPFQ+KFxuICBiYXNlOiBULFxuICBwYXRjaDogT3ZlcnJpZGU8Tm9JbmZlcjxUPj4sXG4gIG9wdHM6IE1lcmdlT3B0aW9ucyA9IHt9LFxuKTogVCB7XG4gIGNvbnN0IHsgYXJyYXlTdHJhdGVneSA9ICdtZXJnZUJ5SW5kZXgnLCBudWxsRGVsZXRlcyA9IGZhbHNlIH0gPSBvcHRzO1xuXG4gIC8vIEhhbmRsZSB3aG9sZS1ub2RlIGNvbnRyb2wgb3BlcmF0b3JzIG9uIHBhdGNoIGl0c2VsZlxuICBpZiAoaXNSZXBsYWNlKHBhdGNoKSkgcmV0dXJuIHBhdGNoLiRyZXBsYWNlIGFzIFQ7XG4gIGlmIChpc0RlbGV0ZShwYXRjaCkpIHJldHVybiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUO1xuXG4gIC8vIEFycmF5c1xuICBpZiAoQXJyYXkuaXNBcnJheShiYXNlKSkge1xuICAgIGlmIChpc1JlcGxhY2UocGF0Y2gpKSByZXR1cm4gcGF0Y2guJHJlcGxhY2UgYXMgVDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRjaCkpIHtcbiAgICAgIGlmIChhcnJheVN0cmF0ZWd5ID09PSAncmVwbGFjZScpIHJldHVybiBwYXRjaCBhcyB1bmtub3duIGFzIFQ7XG4gICAgICAvLyBtZXJnZSBieSBpbmRleFxuICAgICAgY29uc3Qgb3V0ID0gKGJhc2UgYXMgdW5rbm93bltdKS5zbGljZSgpO1xuICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgob3V0Lmxlbmd0aCwgcGF0Y2gubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4OyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgcFZhbCA9IChwYXRjaCBhcyB1bmtub3duW10pW2ldO1xuICAgICAgICBpZiAocFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb3V0W2ldID0gbWVyZ2VBbnkob3V0W2ldLCBwVmFsLCBvcHRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG91dCBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIC8vIGludmFsaWQgcGF0Y2ggdHlwZSBmb3IgYW4gYXJyYXkg4oaSIGlnbm9yZSBhbmQgcmV0dXJuIGJhc2VcbiAgICByZXR1cm4gYmFzZSBhcyBUO1xuICB9XG5cbiAgLy8gUGxhaW4gb2JqZWN0c1xuICBpZiAoaXNQbGFpbk9iamVjdChiYXNlKSAmJiBpc1BsYWluT2JqZWN0KHBhdGNoKSkge1xuICAgIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLihiYXNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGNvbnN0IHBhdGNoT2JqID0gcGF0Y2ggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGF0Y2hPYmopKSB7XG4gICAgICBjb25zdCBwVmFsID0gcGF0Y2hPYmpba2V5XTtcbiAgICAgIGlmIChwVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gbGVhdmUgZXhpc3RpbmcgdmFsdWVcbiAgICAgIH0gZWxzZSBpZiAobnVsbERlbGV0ZXMgJiYgcFZhbCA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgb3V0W2tleV07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVwbGFjZShwVmFsKSkge1xuICAgICAgICBvdXRba2V5XSA9IHBWYWwuJHJlcGxhY2U7XG4gICAgICB9IGVsc2UgaWYgKGlzRGVsZXRlKHBWYWwpKSB7XG4gICAgICAgIGRlbGV0ZSBvdXRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJWYWwgPSAoYmFzZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgb3V0W2tleV0gPSBtZXJnZUFueShiVmFsLCBwVmFsLCBvcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dCBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICAvLyBGb3IgcHJpbWl0aXZlcyBvciB3aGVuIHBhdGNoIGlzIHByaW1pdGl2ZSwgcGF0Y2ggd2lucyBpZiBkZWZpbmVkXG4gIHJldHVybiAoKHBhdGNoIGFzIHVua25vd24pID8/IGJhc2UpIGFzIFQ7XG59XG4iLCJcbmNsYXNzIFN0cmluZ1V0aWxzIHtcbiAgc3RhdGljIGlzTnVsbE9yRW1wdHkodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlVHJpbW1lZCA9IHZhbHVlPy50cmltKCk7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWVUcmltbWVkID09PSAnJztcbiAgfVxuXG4gIHN0YXRpYyB0cmltVG9OdWxsKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZhbHVlVHJpbW1lZCA9IHZhbHVlPy50cmltKCk7XG4gICAgcmV0dXJuIFN0cmluZ1V0aWxzLmlzTnVsbE9yRW1wdHkodmFsdWVUcmltbWVkKSA/IHVuZGVmaW5lZCA6IHZhbHVlVHJpbW1lZDtcbiAgfVxuXG4gIHN0YXRpYyBjYXBpdGFsaXplKHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHR5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnN1YnN0cmluZygxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgZmlyc3QgcGF0dGVybiBpbiBhbiBhcnJheSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBVUkwuXG4gICAqIFBhdHRlcm5zIGNhbiBpbmNsdWRlIGEgc2luZ2xlIHdpbGRjYXJkICcqJyB3aGljaCBtYXRjaGVzIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0dGVybnNcbiAgICogQHBhcmFtIHVybFRvVGVzdFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZpbmRNYXRjaGluZ1BhdHRlcm4ocGF0dGVybnM6IHN0cmluZ1tdLCB1cmxUb1Rlc3Q6IExvY2F0aW9uKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXVybFRvVGVzdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIC8vIFRlc3Qgb25seSBpZiBhIHBhdGhuYW1lIGlzIHByZXNlbnQuXG4gICAgICBpZiAodXJsVG9UZXN0LnBhdGhuYW1lICE9PSAnLycpIHtcbiAgICAgICAgLy8gRXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVycyBpbiB0aGUgcGF0dGVyblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBjaGFyYWN0ZXJzIGxpa2UgJy4nLCAnKycsICc/JywgJygnLCBldGMuLCBpbiB0aGUgcGF0dGVybiBhcmUgdHJlYXRlZCBsaXRlcmFsbHkuXG4gICAgICAgIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB0aGUgd2lsZGNhcmQgJyonIHdpdGggaXRzIHJlZ2V4IGVxdWl2YWxlbnQgJy4qJyAobWF0Y2hlcyBhbnkgY2hhcmFjdGVyIHplcm8gb3IgbW9yZSB0aW1lcylcbiAgICAgICAgY29uc3QgcmVnZXhQYXR0ZXJuID0gZXNjYXBlZFBhdHRlcm4ucmVwbGFjZSgvXFwqL2csICcuKicpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7cmVnZXhQYXR0ZXJufSRgKTtcbiAgICAgICAgaWYgKHJlZ2V4LnRlc3QodXJsVG9UZXN0LnBhdGhuYW1lKSkge1xuICAgICAgICAgIHJldHVybiBwYXR0ZXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAocGF0dGVybi5zdGFydHNXaXRoKHVybFRvVGVzdC5ob3N0bmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHBhdHRlcm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFN0cmluZ1V0aWxzIH07XG4iLCJpbXBvcnQgeyBTdXBwb3J0ZWRFdmVudFJlcXVlc3QgYXMgQXBpU3VwcG9ydGVkRXZlbnRSZXF1ZXN0IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50UmVxdWVzdCB9IGZyb20gJ0BlbnZpdmUtYWkvdHlwZXMnO1xuaW1wb3J0IHsgY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50IH0gZnJvbSAnLi9jb3JlVXNlckV2ZW50VG9BcGlVc2VyRXZlbnQnO1xuaW1wb3J0IHsgY29yZUNvbnRleHRUb0FwaUNvbnRleHQgfSBmcm9tICcuL2NvcmVDb250ZXh0VG9BcGlDb250ZXh0JztcblxudHlwZSBDb3JlU3VwcG9ydGVkRXZlbnRSZXF1ZXN0ID0gU3VwcG9ydGVkRXZlbnRSZXF1ZXN0O1xuXG5leHBvcnQgY29uc3QgY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdCA9IChcbiAgY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdDogQ29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdCxcbik6IEFwaVN1cHBvcnRlZEV2ZW50UmVxdWVzdCA9PiAoe1xuICBpZDogY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC5pZCxcbiAgdXNlcl9ldmVudDogY29yZVVzZXJFdmVudFRvQXBpVXNlckV2ZW50KGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3QudXNlckV2ZW50KSxcbiAgY29udGV4dDogY29yZUNvbnRleHRUb0FwaUNvbnRleHQoY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdC5jb250ZXh0KSxcbn0pO1xuIiwiLy8gVGhpcyBlbWFpbCB2YWxpZGF0ZXMgdGhhdCB0aGVyZSBhcmUgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGBAYCBzeW1ib2wsXG4vLyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIGBAYCBzeW1ib2wgYW5kIHRoZSBgLmAgc3ltYm9sLFxuLy8gYW5kIG9uZSBvciBtb3JlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGAuYCBzeW1ib2xcbi8vIEl0IGRvZXMgTk9UIHZhbGlkYXRlIGFsbCBwb3NzaWJsZSBlbWFpbCBmb3JtYXRzLCBidXQgaXQgaXMgYSBkZWNlbnQgcGxhY2UgdG8gc3RhcnQuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVFbWFpbCA9ICh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiA9PiAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHZhbHVlKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBUUEsTUFBTSxxQ0FBcUMsQ0FBQyxhQUFhLGNBQWM7QUFDdkUsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSxnQ0FBZ0M7Ozs7Ozs7O0FBU3RDLE1BQU0sb0JBQW9CLFVBQTJCO0NBQ25ELE1BQU0sa0JBQWtCLE1BQU0sUUFBUSxTQUFTLEdBQUcsQ0FBQyxhQUFhO0FBQ2hFLFFBQU8sbUNBQW1DLE1BQU0sU0FDOUMsZ0JBQWdCLFNBQVMsS0FBSyxDQUMvQjs7Ozs7OztBQVFILE1BQU0sd0JBQ0osT0FDQSxVQUlHO0NBQ0gsSUFBSUE7QUFFSixLQUFJQyx3Q0FBeUIsTUFBTSxDQUNqQyxjQUFhO0VBQ1gsT0FBTyxNQUFNLFVBQVUsSUFBSSxTQUFTLEtBQUssYUFBYTtHQUNwRCxXQUFXLFFBQVE7R0FDbkIsZUFBZSxRQUFRO0dBQ3ZCLE9BQU8sUUFBUTtHQUNmLFVBQVUsUUFBUTtHQUNuQixFQUFFO0VBQ0gsVUFBVSxNQUFNLFVBQVUsSUFBSTtFQUM5QixzQkFBc0I7RUFDdkI7VUFDUUMsbUNBQW9CLE1BQU0sQ0FDbkMsY0FBYTtFQUNYLE9BQU8sTUFBTSxVQUFVLE1BQU0sS0FBSyxVQUFVO0dBQzFDLFdBQVcsS0FBSztHQUNoQixlQUFlLEtBQUs7R0FDcEIsT0FBTyxLQUFLO0dBQ1osVUFBVSxLQUFLO0dBQ2hCLEVBQUU7RUFDSCxVQUFVLE1BQU0sVUFBVTtFQUMxQixzQkFBc0I7RUFDdkI7S0FFRCxjQUFhO0VBQ1gsa0JBQWtCLEVBQUUsR0FBRyxPQUFPO0VBQzlCLHNCQUFzQjtFQUN2QjtBQUdILE9BQU1DLG9DQUF1QixrQkFBa0IsRUFDN0MsWUFDRCxDQUFDOzs7Ozs7QUFPSixNQUFhLHdCQUNYLFVBSUc7Q0FDSCxJQUFJLFdBQVc7Q0FJZixNQUFNLDJCQUEyQjtBQUMvQixNQUFJLENBQUMsT0FBTyxhQUFhLENBQUUsT0FBTyxVQUFrQixNQUFNO0FBQ3hELGVBQVk7QUFFWixPQUFJLFlBQVksK0JBQStCO0FBQzdDLGtDQUFPLFNBQ0wsNkNBQTZDLDhCQUE4QixXQUM1RTtBQUNEOztBQUdGLGNBQVcsb0JBQW9CLDZCQUE2QjtBQUM1RDs7QUFHRixnQ0FBTyxTQUNMLGdFQUNEO0VBQ0QsTUFBTSxlQUFlLE9BQU8sVUFBVTtBQUN0QyxTQUFPLFVBQVUsUUFBUSxHQUFHLFNBQW9CO0FBQzlDLE9BQ0VDLG9DQUFxQixLQUFLLEdBQUcsSUFDN0IsaUJBQWtCLEtBQUssR0FBVyxNQUFNLENBRXhDLHNCQUFxQixLQUFLLElBQTBCLE1BQU07QUFJNUQsVUFBTyxhQUFhLE1BQU0sT0FBTyxXQUFXLEtBQUs7OztBQUlyRCxxQkFBb0I7O0FBR3RCLE1BQWEsaUJBQ1gsVUFJRztBQUlILE9BQU1ELG9DQUF1QixhQUFhOzs7OztBQy9INUMsTUFBYSwyQkFBMkIsYUFBc0M7Q0FDNUUsU0FBUyxRQUFRO0NBQ2pCLFFBQVEsUUFBUTtDQUNoQixTQUFTLFFBQVE7Q0FDakIsZ0JBQWdCLFFBQVE7Q0FDeEIsUUFBUSxRQUFRO0NBQ2hCLEtBQUssUUFBUTtDQUNkOzs7O0FDSkQsTUFBYSwrQkFBK0IsU0FBa0M7QUFDNUUsS0FDRSxLQUFLLGFBQWFFLGtEQUFrQixZQUNwQyxLQUFLLGFBQWFBLGtEQUFrQixVQUVwQyxRQUFPO0VBQ0wsVUFBVSxLQUFLO0VBQ2YsWUFBWSxLQUFLO0VBQ2pCLFVBQVUsS0FBSztFQUNmLFlBQVk7R0FDVixZQUFZLEtBQUssV0FBVztHQUM1QixtQkFBbUIsS0FBSyxXQUFXO0dBQ25DLEtBQUssS0FBSyxXQUFXO0dBQ3RCO0VBQ0Y7QUFHSCxLQUFJLEtBQUssYUFBYUEsa0RBQWtCLFNBQ3RDLFFBQU87RUFDTCxVQUFVLEtBQUs7RUFDZixZQUFZLEtBQUs7RUFDakIsVUFBVSxLQUFLO0VBQ2YsWUFBWTtHQUNWLFVBQVVDLHFEQUFxQjtHQUMvQixZQUFZLEVBRVYsSUFBSyxLQUFLLFdBQVcsV0FBK0IsSUFDckQ7R0FDRjtFQUNGO0FBR0gsS0FBSSxLQUFLLGFBQWFELGtEQUFrQixXQUN0QyxRQUFPO0VBQ0wsVUFBVSxLQUFLO0VBQ2YsWUFBWSxLQUFLO0VBQ2pCLFVBQVUsS0FBSztFQUNmLFlBQVksRUFDVixPQUFPLEtBQUssV0FBVyxPQUN4QjtFQUNGO0FBR0gsS0FBSSxLQUFLLGFBQWFBLGtEQUFrQixPQUN0QyxRQUFPO0VBQ0wsVUFBVSxLQUFLO0VBQ2YsWUFBWSxLQUFLO0VBQ2pCLFVBQVUsS0FBSztFQUNmLFlBQVk7R0FDVixhQUFhLEtBQUssV0FBVztHQUM3QixrQkFBa0IsS0FBSyxXQUFXO0dBQ25DO0VBQ0Y7QUFHSCxLQUFJLEtBQUssYUFBYUEsa0RBQWtCLGtCQUN0QyxRQUFPO0VBQ0wsVUFBVSxLQUFLO0VBQ2YsWUFBWSxLQUFLO0VBQ2pCLFVBQVUsS0FBSztFQUNmLFlBQVksRUFDVixlQUFlLEtBQUssV0FBVyxjQUNoQztFQUNGO0FBR0gsS0FBSSxLQUFLLGFBQWFBLGtEQUFrQixVQUN0QyxRQUFPO0VBQ0wsVUFBVSxLQUFLO0VBQ2YsWUFBWSxLQUFLO0VBQ2pCLFVBQVUsS0FBSztFQUNmLFlBQVk7R0FDVixLQUFLLEtBQUssV0FBVztHQUNyQixxQkFBcUIsS0FBSyxXQUFXO0dBQ3RDO0VBQ0Y7QUFHSCxLQUFJLEtBQUssYUFBYUEsa0RBQWtCLGNBQ3RDLFFBQU87RUFDTCxVQUFVLEtBQUs7RUFDZixZQUFZLEtBQUs7RUFDakIsVUFBVSxLQUFLO0VBQ2YsWUFBWTtHQUNWLGVBQWUsRUFBRSxHQUFHLEtBQUssV0FBVyxjQUFjO0dBQ2xELGtCQUFrQixLQUFLLFdBQVc7R0FDbEMsV0FBVyxLQUFLLFdBQVc7R0FDNUI7RUFDRjtBQUlILFFBQU87RUFDTCxVQUFVLEtBQUs7RUFDZixZQUFZLEtBQUs7RUFDakIsVUFBVSxLQUFLO0VBQ2hCOzs7OztBQ3hHSCxNQUFhLGVBQWtCLE9BQVksU0FBaUI7Q0FDMUQsTUFBTSxPQUFPLEVBQUU7QUFDZixNQUFLLElBQUksSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLEVBQzdCLE1BQUssS0FBSyxNQUFNLFFBQVEsR0FBTSxVQUFrQixRQUFRLFNBQVMsRUFBRSxDQUFDO0FBRXRFLFFBQU87Ozs7O0FDSFQsTUFBYSw2QkFDWCxjQUNBLHFCQUNHO0NBQ0gsTUFBTSxrQkFBa0IsYUFDckIsUUFBUSxZQUFZLFFBQVEsU0FBU0UseUJBQVksV0FBVyxRQUFRLFVBQVUsU0FBUyxDQUN2RixLQUFLLE1BQU0sRUFBNEI7QUFFMUMsUUFBTyxDQUNMLEdBQUcsZ0JBQWdCLFFBQVEsTUFBTSxFQUFFLFVBQVUsT0FBTyxpQkFBaUIsRUFDckUsR0FBRyxnQkFBZ0IsUUFBUSxNQUFNLEVBQUUsVUFBVSxPQUFPLGlCQUFpQixDQUN0RSxDQUFDLEtBQUssTUFBTSxFQUFFLFNBQVUsU0FBVTs7Ozs7QUNickMsTUFBYSw0QkFBNEI7Q0FDdkMsSUFBSSxlQUFlLFNBQVMsY0FBYyx3QkFBd0I7QUFDbEUsS0FBSSxjQUFjO0VBQ2hCLE1BQU0sVUFBVSxhQUFhLGFBQWEsVUFBVTtBQUVwRCxNQUFJLENBRG9CLFNBQVMsU0FBUyxrQkFBa0IsQ0FFMUQsY0FBYSxhQUFhLFdBQVcsR0FBRyxRQUFRLG1CQUFtQjtBQUVyRTs7QUFHRixnQkFBZSxTQUFTLGNBQWMsT0FBTztBQUM3QyxjQUFhLGFBQWEsUUFBUSxXQUFXO0FBQzdDLGNBQWEsYUFBYSxXQUFXLHVEQUF1RDtBQUM1RixVQUFTLEtBQUssWUFBWSxhQUFhOzs7OztBQ0x6QyxNQUFhLGlDQUNYLE9BQ0EsMkJBQ3dCO0FBQ3hCLEtBQUksTUFBTSxhQUFhQyxrREFBa0IsY0FDdkM7Q0FHRixNQUFNLHFCQUFxQixPQUFPLFFBQVEsdUJBQXVCLE9BQU8sV0FBVyxDQUNoRixLQUFLLENBQUMsS0FBSyxXQUFXLEdBQUcsTUFBTSxNQUFNLElBQUksTUFBTSxXQUFXLGFBQWEsT0FBTyxDQUM5RSxLQUFLLEtBQUs7QUFFYixRQUFPO0VBQ0wsSUFBSSxNQUFNO0VBQ1YsTUFBTUMseUJBQVk7RUFDbEIsTUFBTUMseUJBQVk7RUFDbEIsV0FBVyxNQUFNO0VBQ2pCLFVBQVUsRUFDUixTQUFTLG9CQUNWO0VBQ0Y7Ozs7Ozs7Ozs7OztBQ25CSCxNQUFhLHlCQUF5QixVQUEwQztBQUM5RSxLQUFJLE1BQU0sYUFBYUMsa0RBQWtCLFdBQ3ZDLFFBQU87RUFDTCxJQUFJLE1BQU07RUFDVixNQUFNQyx5QkFBWTtFQUNsQixNQUFNQyx5QkFBWTtFQUNsQixXQUFXLE1BQU07RUFDakIsVUFBVSxFQUNSLFNBQVMsTUFBTSxXQUFXLE9BQzNCO0VBQ0Y7QUFHSCxLQUFJLE1BQU0sYUFBYUYsa0RBQWtCLE9BQ3ZDLFFBQU87RUFDTCxJQUFJLE1BQU07RUFDVixNQUFNQyx5QkFBWTtFQUNsQixNQUFNQyx5QkFBWTtFQUNsQixXQUFXLE1BQU07RUFDakIsVUFBVTtHQUNSLFlBQVksTUFBTSxXQUFXLGNBQWM7R0FDM0MsaUJBQWlCLE1BQU0sV0FBVyxtQkFBbUIsRUFBRTtHQUN4RDtFQUNGOzs7Ozs7Ozs7Ozs7QUN2QkwsTUFBYSx1QkFDWCxhQUN3QjtBQUN4QixLQUFJLFlBQVksS0FDZDtBQUdGLEtBQUksU0FBUyxhQUFhQyxpREFBaUIsS0FDekMsUUFBTztFQUNMLElBQUksU0FBUztFQUNiLFdBQVcsU0FBUztFQUNwQixNQUFNQywwQkFBWTtFQUNsQixNQUFNQywwQkFBWTtFQUNsQixVQUFVLEVBQ1IsU0FBUyxTQUFTLFdBQVcsU0FDOUI7RUFDRjtBQUdILEtBQUksU0FBUyxhQUFhRixpREFBaUIsUUFDekMsUUFBTztFQUNMLElBQUksU0FBUztFQUNiLFdBQVcsU0FBUztFQUNwQixNQUFNRSwwQkFBWTtFQUNsQixNQUFNRCwwQkFBWTtFQUNsQixVQUFVLEVBQ1IsR0FBRyxTQUFTLFlBQ2I7RUFDRjtBQUdILEtBQUksU0FBUyxhQUFhRCxpREFBaUIsT0FDekMsUUFBTztFQUNMLElBQUksU0FBUztFQUNiLFdBQVcsU0FBUztFQUNwQixNQUFNQywwQkFBWTtFQUNsQixNQUFNQywwQkFBWTtFQUNsQixVQUFVO0dBQ1IsUUFBUSxTQUFTLFdBQVc7R0FDNUIsVUFBVSxTQUFTLFdBQVc7R0FDOUIsT0FBTyxTQUFTLFdBQVc7R0FDM0IsT0FBTyxTQUFTLFdBQVc7R0FDM0IsaUJBQWlCLFNBQVMsV0FBVztHQUN0QztFQUNGO0FBR0gsS0FBSSxTQUFTLGFBQWFGLGlEQUFpQixVQUN6QyxRQUFPO0VBQ0wsSUFBSSxTQUFTO0VBQ2IsV0FBVyxTQUFTO0VBQ3BCLE1BQU1DLDBCQUFZO0VBQ2xCLE1BQU1DLDBCQUFZO0VBQ25CO0FBR0gsS0FBSSxTQUFTLGFBQWFGLGlEQUFpQixLQUN6QyxRQUFPO0VBQ0wsSUFBSSxTQUFTO0VBQ2IsV0FBVyxTQUFTO0VBQ3BCLE1BQU1FLDBCQUFZO0VBQ2xCLE1BQU1ELDBCQUFZO0VBQ2xCLFVBQVUsRUFDUixHQUFHLFNBQVMsWUFDYjtFQUNGO0FBR0gsS0FBSSxTQUFTLGFBQWFELGlEQUFpQixjQUN6QyxRQUFPO0VBQ0wsSUFBSSxTQUFTO0VBQ2IsV0FBVyxTQUFTO0VBQ3BCLE1BQU1FLDBCQUFZO0VBQ2xCLE1BQU1ELDBCQUFZO0VBQ2xCLFVBQVUsRUFDUixHQUFHLFNBQVMsWUFDYjtFQUNGO0FBR0gsS0FBSSxTQUFTLGFBQWFELGlEQUFpQixvQkFDekMsUUFBTztFQUNMLElBQUksU0FBUztFQUNiLFdBQVcsU0FBUztFQUNwQixNQUFNRSwwQkFBWTtFQUNsQixNQUFNRCwwQkFBWTtFQUNsQixVQUFVLEVBQ1IsR0FBRyxTQUFTLFlBQ2I7RUFDRjtBQUdILEtBQUksU0FBUyxhQUFhRCxpREFBaUIsS0FDekMsUUFBTztFQUNMLElBQUksU0FBUztFQUNiLFdBQVcsU0FBUztFQUNwQixNQUFNRSwwQkFBWTtFQUNsQixNQUFNRCwwQkFBWTtFQUNsQixVQUFVO0dBQ1IsVUFBVSxTQUFTLFdBQVcsY0FBYztHQUM1QyxRQUFRLE9BQU8sUUFBUSxTQUFTLFdBQVcsT0FBTyxXQUFXLENBQUMsS0FDM0QsQ0FBQyxLQUFLLFlBQVk7SUFDakI7SUFDQSxPQUFPLE1BQU07SUFDYixNQUFNLE1BQU07SUFDWixRQUFRLE1BQU07SUFDZCxVQUFVLFNBQVMsV0FBVyxPQUFPLFNBQVMsU0FBUyxJQUFJO0lBQzVELEVBQ0Y7R0FDRjtFQUNGO0FBR0gsS0FBSSxTQUFTLGFBQWFELGlEQUFpQixNQUN6QyxRQUFPO0VBQ0wsSUFBSSxTQUFTO0VBQ2IsV0FBVyxTQUFTO0VBQ3BCLE1BQU1FLDBCQUFZO0VBQ2xCLE1BQU1ELDBCQUFZO0VBQ2xCLFVBQVUsRUFDUixHQUFHLFNBQVMsWUFDYjtFQUNGOzs7Ozs7Ozs7Ozs7O0FDeEhMLE1BQWEsOEJBQ1gsT0FDQSxnQkFDd0I7QUFDeEIsS0FBSSxNQUFNLGFBQWFFLGtEQUFrQixtQkFBbUI7RUFDMUQsTUFBTSxFQUFFLGlCQUFpQixNQUFNO0FBRS9CLFNBQU87R0FDTCxJQUFJLE1BQU07R0FDVixNQUFNQywwQkFBWTtHQUNsQixNQUFNQywwQkFBWTtHQUNsQixXQUFXLE1BQU07R0FDakIsVUFBVTtJQUNSO0lBQ0EsbUJBQ0UsWUFBWSxNQUFNLE1BQU0sRUFBRSxPQUFPLGFBQWEsRUFBRSxXQUFXO0lBQzlEO0dBQ0Y7Ozs7OztBQ3pCTCxNQUFhLDBDQUNYLFVBQzJCO0NBQzNCLFNBQVM7RUFDUCxTQUFTLEtBQUssUUFBUTtFQUN0QixRQUFRLEtBQUssUUFBUTtFQUNyQixnQkFBZ0IsS0FBSyxRQUFRO0VBQzdCLFNBQVMsS0FBSyxRQUFRO0VBQ3RCLFFBQVEsS0FBSyxRQUFRO0VBQ3JCLEtBQUssS0FBSyxRQUFRO0VBQ25CO0NBQ0QsSUFBSSxLQUFLO0NBQ1QsZUFBZSxLQUFLO0NBQ3BCLGFBQWEsS0FBSyxZQUFZLEtBQUssY0FBYyw0QkFBNEIsVUFBVSxDQUFDO0NBQ3hGLG1CQUFtQjtFQUNqQixPQUFPLEtBQUssa0JBQWtCO0VBQzlCLFlBQVksS0FBSyxrQkFBa0I7RUFDbkMsTUFBTSxLQUFLLGtCQUFrQjtFQUM3QixRQUFRLEtBQUssa0JBQWtCO0VBQy9CLGFBQWEsS0FBSyxrQkFBa0I7RUFDcEMsT0FBTyxLQUFLLGtCQUFrQjtFQUM5QixpQkFBaUIsS0FBSyxrQkFBa0I7RUFDeEMsd0JBQXdCLEtBQUssa0JBQWtCO0VBQy9DLDBCQUEwQixLQUFLLGtCQUFrQjtFQUNqRCxrQkFBa0IsS0FBSyxrQkFBa0I7RUFDMUM7Q0FDRjs7OztBQzlCRCxJQUFzQixlQUF0QixNQUFtQztDQUlqQyxZQUFZLFNBQWlCO0FBQzNCLE9BQUssVUFBVTtBQUNmLE9BQUssT0FBTzs7Q0FHZCxhQUFhO0FBQ1gsU0FBTyxLQUFLOztDQUdkLFFBQVEsTUFBZ0I7QUFDdEIsT0FBSyxPQUFPOztDQUdkLFVBQVU7QUFDUixTQUFPLEtBQUs7OztBQU1oQixJQUFNLGdCQUFOLGNBQTRCLGFBQWE7Q0FDdkMsUUFBcUI7QUFDbkIsU0FBTyxLQUFLLFNBQVMsQ0FBQyxjQUFjLEtBQUssWUFBWSxDQUFDOzs7QUFJMUQsSUFBTSxhQUFOLGNBQXlCLGFBQWE7Q0FDcEMsUUFBcUI7QUFDbkIsU0FBTyxLQUFLLFNBQVMsQ0FBQyxlQUFlLEtBQUssWUFBWSxDQUFDOzs7QUFJM0QsSUFBTSxnQkFBTixjQUE0QixhQUFhO0NBQ3ZDLFFBQXFCO0FBQ25CLFNBQU8sS0FBSyxTQUFTLEVBQUUsU0FDckIsS0FBSyxZQUFZLEVBQ2pCLEtBQUssU0FBUyxFQUNkLE1BQ0EsWUFBWSx5QkFDWixLQUNELEVBQUU7OztBQUlQLElBQU0sZ0JBQU4sY0FBNEIsYUFBYTtDQUN2QyxRQUFxQjtFQUNuQixJQUFJLGdCQUFnQjtFQUNwQixNQUFNLFlBQVksS0FBSyxZQUFZLENBQUMsTUFBTSxJQUFJO0VBQzlDLE1BQU0sWUFBWSxVQUFVLFNBQVM7RUFFckMsTUFBTSxjQUFjLFNBQWlCLGFBQXdDO0dBQzNFLE1BQU0sV0FBVyxnQkFBZ0IsTUFBTSxRQUFRO0FBRS9DLE9BQUksU0FDRixVQUFTLFFBQVEsU0FBcUI7R0FHeEMsTUFBTSxjQUFjLFNBQVMsT0FBTztBQUNwQyxPQUFJLGtCQUFrQixVQUNwQixRQUFPO0dBR1QsSUFBSUMsT0FBZ0MsZUFBZTtBQUNuRCxPQUFLLGFBQTZCLFdBQ2hDLFFBQVEsWUFBNEI7QUFHdEMsT0FBSyxhQUFtQyxjQUN0QyxRQUFRLFlBQWtDLGVBQWU7QUFHM0QsVUFBTyxXQUFXLFVBQVUsRUFBRSxlQUFlLE1BQU0sRUFBRSxLQUFLOztBQUc1RCxTQUFPLFdBQVcsVUFBVSxlQUFlLE1BQU0sQ0FBQzs7O0FBSXRELElBQU0sUUFBTixjQUFvQixhQUFhO0NBQy9CLGNBQWM7QUFDWixRQUFNLEdBQUc7O0NBRVgsUUFBcUI7QUFDbkIsU0FBTzs7O0FBSVgsSUFBYSxrQkFBYixNQUE2QjtDQUMzQixPQUFPLE1BQU0sa0JBQTJCO0FBQ3RDLE1BQUksQ0FBQyxpQkFDSCxRQUFPLElBQUksT0FBTztFQUdwQixNQUFNLFFBQVEsaUJBQWlCLE1BQU0sSUFBSTtFQUN6QyxNQUFNLE9BQU8sTUFBTTtFQUNuQixNQUFNLFdBQVcsTUFBTTtBQUV2QixVQUFRLE1BQVI7R0FDRSxLQUFLLEtBQ0gsUUFBTyxLQUFLLEdBQUcsU0FBUztHQUMxQixLQUFLLFFBQ0gsUUFBTyxLQUFLLE1BQU0sU0FBUztHQUM3QixLQUFLLFFBQ0gsUUFBTyxLQUFLLE1BQU0sU0FBUztHQUM3QixRQUNFLFFBQU8sSUFBSSxPQUFPOzs7Q0FJeEIsT0FBTyxNQUFNLFVBQXlCO0FBQ3BDLFNBQU8sWUFBWSxJQUFJLE9BQU87O0NBR2hDLE9BQU8sTUFBTSxTQUFrQjtBQUM3QixTQUFPLFVBQVUsSUFBSSxjQUFjLFFBQVEsR0FBRyxJQUFJLE9BQU87O0NBRzNELE9BQU8sR0FBRyxTQUFnQztBQUN4QyxTQUFPLFVBQVUsSUFBSSxXQUFXLFFBQVEsR0FBRyxJQUFJLE9BQU87O0NBR3hELE9BQU8sTUFBTSxTQUFnQztBQUMzQyxTQUFPLFVBQVUsSUFBSSxjQUFjLFFBQVEsR0FBRyxJQUFJLE9BQU87O0NBRzNELE9BQU8sTUFBTSxTQUFnQztBQUMzQyxTQUFPLFVBQVUsSUFBSSxjQUFjLFFBQVEsR0FBRyxJQUFJLE9BQU87Ozs7OztBQ2hJN0QsU0FBUyxjQUFjLEdBQTBDO0FBQy9ELFFBQ0UsQ0FBQyxDQUFDLEtBQ0YsT0FBTyxNQUFNLFlBQ2IsQ0FBQyxNQUFNLFFBQVEsRUFBRSxJQUNqQixFQUFFLGFBQWEsU0FDZixFQUFFLGFBQWE7O0FBSW5CLFNBQVMsVUFBVSxHQUFxQztBQUN0RCxRQUFPLENBQUMsQ0FBQyxLQUFLLE9BQU8sTUFBTSxZQUFZLGNBQWU7O0FBRXhELFNBQVMsU0FBUyxHQUEyQjtBQUMzQyxRQUFPLENBQUMsQ0FBQyxLQUFLLE9BQU8sTUFBTSxZQUFhLEVBQThCLFlBQVk7O0FBR3BGLFNBQVMsaUJBQWlCLEdBQXFCO0NBQzdDLE1BQU0sSUFBSSxPQUFPO0FBQ2pCLFFBQ0UsTUFBTSxRQUNOLE1BQU0sWUFDTixNQUFNLFlBQ04sTUFBTSxhQUNOLE1BQU0sWUFDTixNQUFNLFlBQ04sTUFBTTs7QUFJVixTQUFTLG9CQUFvQixLQUF5QjtBQUNwRCxLQUFJLElBQUksV0FBVyxFQUFHLFFBQU87QUFFN0IsTUFBSyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLLEdBQUc7RUFDdEMsTUFBTSxJQUFJLElBQUk7QUFDZCxNQUFJLE1BQU0sVUFBYSxDQUFDLGlCQUFpQixFQUFFLENBQUUsUUFBTzs7QUFFdEQsUUFBTzs7QUFHVCxTQUFTLFNBQVMsU0FBa0IsVUFBbUIsTUFBNkI7QUFDbEYsS0FBSSxVQUFVLFNBQVMsQ0FBRSxRQUFPLFNBQVM7QUFDekMsS0FBSSxTQUFTLFNBQVMsQ0FBRSxRQUFPO0FBRS9CLEtBQUksTUFBTSxRQUFRLFFBQVEsRUFBRTtBQUMxQixNQUFJLE1BQU0sUUFBUSxTQUFTLEVBQUU7R0FDM0IsTUFBTSxVQUFVO0dBQ2hCLE1BQU0sV0FBVztBQUtqQixPQUhFLEtBQUssa0JBQWtCLGFBQ3ZCLG9CQUFvQixRQUFRLElBQzVCLG9CQUFvQixTQUFTLENBQ1osUUFBTztHQUMxQixNQUFNLE1BQU0sUUFBUSxPQUFPO0dBQzNCLE1BQU0sTUFBTSxLQUFLLElBQUksSUFBSSxRQUFRLFNBQVMsT0FBTztBQUNqRCxRQUFLLElBQUksSUFBSSxHQUFHLElBQUksS0FBSyxLQUFLLEdBQUc7SUFDL0IsTUFBTSxPQUFPLFNBQVM7QUFDdEIsUUFBSSxTQUFTLE9BQ1gsS0FBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLE1BQU0sS0FBSzs7QUFHekMsVUFBTzs7QUFFVCxTQUFPOztBQUdULEtBQUksY0FBYyxRQUFRLElBQUksY0FBYyxTQUFTLEVBQUU7RUFDckQsTUFBTSxVQUFVO0VBQ2hCLE1BQU0sV0FBVztFQUNqQixNQUFNQyxNQUErQixFQUFFLEdBQUcsU0FBUztBQUNuRCxPQUFLLE1BQU0sT0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFO0dBQ3ZDLE1BQU0sT0FBTyxTQUFTO0FBQ3RCLE9BQUksU0FBUyxRQUFXLFlBRWIsS0FBSyxlQUFlLFNBQVMsS0FDdEMsUUFBTyxJQUFJO1lBQ0YsVUFBVSxLQUFLLENBQ3hCLEtBQUksT0FBTyxLQUFLO1lBQ1AsU0FBUyxLQUFLLENBQ3ZCLFFBQU8sSUFBSTtPQUVYLEtBQUksT0FBTyxTQUFTLFVBQVUsTUFBTSxNQUFNLEtBQUs7O0FBR25ELFNBQU87O0FBR1QsUUFBUSxZQUF3Qjs7QUFHbEMsU0FBZ0IsZUFDZCxNQUNBLE9BQ0EsT0FBcUIsRUFBRSxFQUNwQjtDQUNILE1BQU0sRUFBRSxnQkFBZ0IsZ0JBQWdCLGNBQWMsVUFBVTtBQUdoRSxLQUFJLFVBQVUsTUFBTSxDQUFFLFFBQU8sTUFBTTtBQUNuQyxLQUFJLFNBQVMsTUFBTSxDQUFFLFFBQU87QUFHNUIsS0FBSSxNQUFNLFFBQVEsS0FBSyxFQUFFO0FBQ3ZCLE1BQUksVUFBVSxNQUFNLENBQUUsUUFBTyxNQUFNO0FBQ25DLE1BQUksTUFBTSxRQUFRLE1BQU0sRUFBRTtBQUN4QixPQUFJLGtCQUFrQixVQUFXLFFBQU87R0FFeEMsTUFBTSxNQUFPLEtBQW1CLE9BQU87R0FDdkMsTUFBTSxNQUFNLEtBQUssSUFBSSxJQUFJLFFBQVEsTUFBTSxPQUFPO0FBQzlDLFFBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUssR0FBRztJQUMvQixNQUFNLE9BQVEsTUFBb0I7QUFDbEMsUUFBSSxTQUFTLE9BQ1gsS0FBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLE1BQU0sS0FBSzs7QUFHekMsVUFBTzs7QUFHVCxTQUFPOztBQUlULEtBQUksY0FBYyxLQUFLLElBQUksY0FBYyxNQUFNLEVBQUU7RUFDL0MsTUFBTUEsTUFBK0IsRUFBRSxHQUFJLE1BQWtDO0VBQzdFLE1BQU0sV0FBVztBQUNqQixPQUFLLE1BQU0sT0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFO0dBQ3ZDLE1BQU0sT0FBTyxTQUFTO0FBQ3RCLE9BQUksU0FBUyxRQUFXLFlBRWIsZUFBZSxTQUFTLEtBQ2pDLFFBQU8sSUFBSTtZQUNGLFVBQVUsS0FBSyxDQUN4QixLQUFJLE9BQU8sS0FBSztZQUNQLFNBQVMsS0FBSyxDQUN2QixRQUFPLElBQUk7UUFDTjtJQUNMLE1BQU0sT0FBUSxLQUFpQztBQUMvQyxRQUFJLE9BQU8sU0FBUyxNQUFNLE1BQU0sS0FBSzs7O0FBR3pDLFNBQU87O0FBSVQsUUFBUyxTQUFxQjs7Ozs7QUNqSmhDLElBQU0sY0FBTixNQUFNLFlBQVk7Q0FDaEIsT0FBTyxjQUFjLE9BQW9DO0VBQ3ZELE1BQU0sZUFBZSxPQUFPLE1BQU07QUFDbEMsU0FBTyxVQUFVLFVBQWEsaUJBQWlCOztDQUdqRCxPQUFPLFdBQVcsT0FBK0M7RUFDL0QsTUFBTSxlQUFlLE9BQU8sTUFBTTtBQUNsQyxTQUFPLFlBQVksY0FBYyxhQUFhLEdBQUcsU0FBWTs7Q0FHL0QsT0FBTyxXQUFXLE1BQTBCO0FBQzFDLE1BQUksU0FBUyxPQUNYLFFBQU87QUFFVCxTQUFPLEtBQUssT0FBTyxFQUFFLENBQUMsYUFBYSxHQUFHLEtBQUssVUFBVSxFQUFFOzs7Ozs7Ozs7O0NBV3pELE9BQU8sb0JBQW9CLFVBQW9CLFdBQXlDO0FBQ3RGLE1BQUksQ0FBQyxVQUNIO0FBR0YsT0FBSyxNQUFNLFdBQVcsU0FFcEIsS0FBSSxVQUFVLGFBQWEsS0FBSztHQU05QixNQUFNLGVBSGlCLFFBQVEsUUFBUSxzQkFBc0IsT0FBTyxDQUdoQyxRQUFRLE9BQU8sS0FBSztBQUd4RCx3QkFEYyxJQUFJLE9BQU8sSUFBSSxhQUFhLEdBQUcsRUFDbkMsS0FBSyxVQUFVLFNBQVMsQ0FDaEMsUUFBTzthQUdBLFFBQVEsV0FBVyxVQUFVLFNBQVMsQ0FDL0MsUUFBTzs7Ozs7O0FDekNmLE1BQWEseUNBQ1gsK0JBQzhCO0NBQzlCLElBQUksMEJBQTBCO0NBQzlCLFlBQVksNEJBQTRCLDBCQUEwQixVQUFVO0NBQzVFLFNBQVMsd0JBQXdCLDBCQUEwQixRQUFRO0NBQ3BFOzs7O0FDVEQsTUFBYSxpQkFBaUIsVUFBMkIsNkJBQTZCLEtBQUssTUFBTSJ9
|