{"version":3,"file":"index.mjs","sources":["../../../../../../../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../../../../../../../../clearscore-group/libs/constants/session-action-types/src/index.ts","../../../../../../../../clearscore-group/libs/redux/action-bridge-middleware/src/action-bridge-middleware.js","../../../../../../../../../node_modules/redux-observable/lib/esm/operators.js","../../../../../../../../../node_modules/redux-observable/lib/esm/ActionsObservable.js","../../../../../../../../../node_modules/redux-observable/lib/esm/StateObservable.js","../../../../../../../../../node_modules/redux-observable/lib/esm/combineEpics.js","../../../../../../../../clearscore-group/libs/config/i18n/src/index.ts","../../../../../../../../clearscore-group/libs/helpers/create-action/src/index.js","../../../../../../../../clearscore-group/libs/helpers/create-request-payload/src/index.js","../../../../../../../../clearscore-group/libs/helpers/resolve-props/src/index.js","../../../../../../../../clearscore-group/libs/helpers/can-use-dom/src/index.ts","../../../../../../../../clearscore-group/libs/helpers/envs/src/index.js","../../../../../../../../clearscore-group/libs/redux/market/src/utils.js","../../../../../../../../clearscore-group/libs/redux/market/src/types.js","../../../../../../../../clearscore-group/libs/constants/request-statuses/src/index.ts","../../../../../../../../../node_modules/cookie/index.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/cookies.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/constants.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/cookies-publisher.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/cookies-session.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/cookies-alerts.js","../../../../../../../../clearscore-group/libs/helpers/uid/src/index.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/anonymous-id.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/index.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/cs-person.js","../../../../../../../../clearscore-group/libs/helpers/cookies/src/visited-site.js","../../../../../../../../clearscore-group/libs/redux/market/src/lib/helpers.js","../../../../../../../../clearscore-group/libs/redux/market/src/reducers/domain.js","../../../../../../../../clearscore-group/libs/redux/market/src/reducers/index.js","../../../../../../../../clearscore-group/libs/helpers/resolve-request/src/index.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getFetchStatus.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getPredicate.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getMarkets.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getActiveMarket.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getLocales.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/legacy/legacyMap.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/legacy/legacy.getLangCode.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getActiveLocale.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getConfig.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getResolution.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/legacy.getLanguage.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/getSDUIConfig.js","../../../../../../../../clearscore-group/libs/redux/market/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/market/src/index.js","../../../../../../../../clearscore-group/libs/redux/market/src/actions.js","../../../../../../../../clearscore-group/libs/redux/store/src/index.ts","../../../../../../../../../node_modules/redux-observable/lib/esm/createEpicMiddleware.js","../../../../../../../../clearscore-group/libs/redux/store/src/assets/development.ts","../../../../../../../../../node_modules/i18next-icu/dist/es/utils.js","../../../../../../../../../node_modules/i18next-icu/dist/es/index.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/createClass.js","../../../../../../../../../node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../../../../../../../../clearscore-group/libs/helpers/monitoring/src/index.ts","../../../../../../../../clearscore-group/libs/helpers/i18n/src/index.ts","../../../../../../../../clearscore-group/libs/redux/cs-provider/src/detectors/sessionCookie.ts","../../../../../../../../clearscore-group/libs/redux/cs-provider/src/detectors/marketPath.ts","../../../../../../../../clearscore-group/libs/redux/cs-provider/src/lib/i18n.ts","../../../../../../../../clearscore-group/libs/redux/cs-provider/src/index.jsx","../../../../../../../libs/ui/rainbow/font/src/index.ts","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/router.getRegistrationProspectId.js","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/router.getRegistrationStep.js","../../../../../../../../clearscore-group/libs/helpers/query-string/src/index.ts","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/router.getQueryParams.js","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/router.getErrorName.js","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/getCurrentPath.js","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/getMarketInPathName.js","../../../../../../../../clearscore-group/libs/redux/router/src/selectors/getLocationState.js","../../../../../../../../clearscore-group/libs/redux/router/src/index.js","../../../../../../../../clearscore-group/libs/redux/identity/src/lib/market-config.js","../../../../../../../../clearscore-group/libs/redux/identity/src/identity.types.js","../../../../../../../../clearscore-group/libs/redux/identity/src/index.js","../../../../../../../../clearscore-group/libs/redux/identity/src/identity.actions.js","../../../../../../../../clearscore-group/libs/helpers/initialise-tracking-cookies/src/helpers.ts","../../../../../../../../clearscore-group/libs/helpers/initialise-tracking-cookies/src/index.ts","../../../../../../../../clearscore-group/libs/ui/shared/vertical-takeover/src/lib/constants.ts","../../../../../../../../clearscore-group/libs/helpers/cache/src/index.js","../../../../../../../../clearscore-group/libs/helpers/create-global-context/src/index.ts","../../../../../../../../clearscore-group/libs/helpers/injectors/src/css.js","../../../../../../../../clearscore-group/libs/normalize/title-case/src/index.js","../../../../../../../libs/ui/rainbow/tokens/dist/index.mjs","../../../../../../../libs/ui/rainbow/components/loader/src/constants.ts","../../../../../../../libs/ui/rainbow/components/loader/src/loader.tsx","../../../../../../../../clearscore-group/libs/core/flux/lazy-load/src/polyfill/import-module.js","../../../../../../../../clearscore-group/libs/core/flux/lazy-load/src/legacy-browser-lazy-component/index.tsx","../../../../../../../../clearscore-group/libs/helpers/injectors/src/js.js","../../../../../../../../clearscore-group/libs/core/flux/lazy-load/src/index.jsx","../../../../../../../../clearscore-group/libs/redux/routes/src/types.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/routes.domain.js","../../../../../../../../clearscore-group/libs/helpers/state-normalise/src/index.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/lib/filterRoutesByStatus.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/routes.byId.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/routes.byCategory.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/routes.byTemplate.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/routes.byStage.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/index.js","../../../../../../../../clearscore-group/libs/redux/routes/src/reducer/routes.segmentation.js","../../../../../../../../clearscore-group/libs/constants/profile-action-types/src/index.ts","../../../../../../../../clearscore-group/libs/redux/profile/src/actions/index.js","../../../../../../../../clearscore-group/libs/redux/profile/src/reducers/profile.domain.js","../../../../../../../../clearscore-group/libs/redux/profile/src/reducers/index.js","../../../../../../../../clearscore-group/libs/normalize/address/src/index.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getSimple.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getPredicate.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getStatus.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getTerms.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getMarketing.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getFinancial.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getCoachingProducts.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getProducts.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getAdditionalQuestionData.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getRemortgageData.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getReportAddresses.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getDocumentsMeta.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getSaveModified.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.isTwoFactorAuthEnabled.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getSelfieRequired.js","../../../../../../../../clearscore-group/libs/redux/profile/src/selectors/profile.getUserSettings.js","../../../../../../../../clearscore-group/libs/redux/profile/src/index.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/routeSelector.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/routesSelector.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/routesStagesSelector.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/getRouteByIDVStatus.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/getCurrentPath.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/areRoutesLoaded.js","../../../../../../../../../node_modules/ua-parser-js/src/ua-parser.js","../../../../../../../../../node_modules/current-device/es/index.js","../../../../../../../../clearscore-group/libs/helpers/device/src/index.js","../../../../../../../../../node_modules/tslib/tslib.es6.mjs","../../../../../../../../../node_modules/@fingerprintjs/fingerprintjs/dist/fp.esm.js","../../../../../../../../clearscore-group/libs/helpers/device-fingerprinting/src/fingerprint.js","../../../../../../../../clearscore-group/libs/helpers/segment/src/index.js","../../../../../../../../clearscore-group/libs/redux/session/src/session.actions.js","../../../../../../../../clearscore-group/libs/constants/profile-statuses/src/index.ts","../../../../../../../../clearscore-group/libs/constants/role-statuses/src/index.ts","../../../../../../../../clearscore-group/libs/redux/session/src/reducers/session.domain.js","../../../../../../../../clearscore-group/libs/redux/session/src/reducers/index.js","../../../../../../../../clearscore-group/libs/redux/session/src/selectors/session.getAccountId.js","../../../../../../../../clearscore-group/libs/redux/session/src/selectors/session.getAuthRole.js","../../../../../../../../clearscore-group/libs/redux/session/src/selectors/session.getPredicate.js","../../../../../../../../clearscore-group/libs/redux/session/src/selectors/session.getError.js","../../../../../../../../clearscore-group/libs/redux/session/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/session/src/index.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/getUserRoleRoutes.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/getCurrentRouteMarket.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/getSegmentation.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/getTakeoverRoutes.js","../../../../../../../../clearscore-group/libs/redux/routes/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/routes/src/index.js","../../../../../../../../clearscore-group/libs/redux/routes/src/actions.js","../../../../../../../../clearscore-group/libs/ui/shared/vertical-takeover/src/components/vertical-takeover-lazy-renderer.tsx","../../../../../../../../clearscore-group/libs/ui/shared/vertical-takeover/src/vertical-takeover.provider.tsx","../../../../../../../../../node_modules/@sentry/utils/esm/is.js","../../../../../../../../../node_modules/@sentry/utils/esm/worldwide.js","../../../../../../../../../node_modules/@sentry/utils/esm/debug-build.js","../../../../../../../../../node_modules/@sentry/utils/esm/logger.js","../../../../../../../../../node_modules/@sentry/utils/esm/object.js","../../../../../../../../../node_modules/@sentry/utils/esm/misc.js","../../../../../../../../../node_modules/@sentry/utils/esm/syncpromise.js","../../../../../../../../../node_modules/@sentry/utils/esm/time.js","../../../../../../../../../node_modules/@sentry/core/esm/debug-build.js","../../../../../../../../../node_modules/@sentry/core/esm/constants.js","../../../../../../../../../node_modules/@sentry/core/esm/eventProcessors.js","../../../../../../../../../node_modules/@sentry/core/esm/session.js","../../../../../../../../../node_modules/@sentry/core/esm/utils/spanUtils.js","../../../../../../../../../node_modules/@sentry/core/esm/exports.js","../../../../../../../../../node_modules/@sentry/core/esm/utils/getRootSpan.js","../../../../../../../../../node_modules/@sentry/core/esm/tracing/dynamicSamplingContext.js","../../../../../../../../../node_modules/@sentry/core/esm/utils/applyScopeDataToEvent.js","../../../../../../../../../node_modules/@sentry/core/esm/scope.js","../../../../../../../../../node_modules/@sentry/core/esm/version.js","../../../../../../../../../node_modules/@sentry/core/esm/hub.js","../../../../../../../../../node_modules/@sentry/core/esm/utils/hasTracingEnabled.js","../../../../../../../../../node_modules/@sentry/core/esm/tracing/trace.js","../../../../../../../../../node_modules/react-is/cjs/react-is.production.min.js","../../../../../../../../../node_modules/react-is/index.js","../../../../../../../../../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../../../../../../../../../node_modules/@sentry/react/esm/constants.js","../../../../../../../../../node_modules/@sentry/react/esm/profiler.js","../../../../../../../../clearscore-group/libs/helpers/query-client/src/index.ts","../../../../../../../../clearscore-group/libs/ui/slate/utility/font-provider/src/lib/font-provider.ts","../../../../../../../../../node_modules/@slate/foundations/dist/ts/media-queries.ts","../../../../../../../../clearscore-group/libs/ui/slate/utility/theme-provider/src/lib/constants.ts","../../../../../../../../clearscore-group/libs/ui/slate/utility/theme-provider/src/lib/style-helpers.ts","../../../../../../../../clearscore-group/libs/ui/slate/utility/theme-provider/src/slate-theme-provider.tsx","../../../../../../../../clearscore-group/libs/hooks/use-previous/src/index.js","../../../../../../../../clearscore-group/libs/helpers/session/src/index.js","../../../../../../../../../node_modules/jwt-decode/build/jwt-decode.esm.js","../../../../../../../../clearscore-group/libs/hooks/use-tracking/src/lib/helpers.js","../../../../../../../../clearscore-group/libs/hooks/use-tracking/src/lib/hooks/use-default-segment-props.js","../../../../../../../../clearscore-group/libs/helpers/market/src/index.ts","../../../../../../../../clearscore-group/libs/hooks/use-tracking/src/lib/tracking-event-receiver.js","../../../../../../../../clearscore-group/libs/hooks/use-tracking/src/use-tracking.js","../../../../../../../../clearscore-group/libs/hooks/use-tracking/src/use-page-tracking/index.js","../../../../../../../../clearscore-group/libs/hooks/use-webapp-tracking/src/index.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/dashboard.types.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/dashboard.actions.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/dashboard.constants.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/reducers/dashboard.domain.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/reducers/index.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getCoachingSummary.js","../../../../../../../../clearscore-group/libs/constants/score-bands/src/index.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getScores.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getReportMeta.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getUserStatus.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getPredicate.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getDebt.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/selectors/dashboard.getRawData.js","../../../../../../../../clearscore-group/libs/redux/dashboard/src/index.js","../../../../../../../../clearscore-group/libs/redux/connect/src/index.js","../../../../../../../libs/core/webapp/app-shell/src/lib/constants.js","../../../../../../../libs/core/webapp/app-shell/src/lib/hooks/use-scroll-to-top.js","../../../../../../../libs/core/webapp/app-shell/src/core-router/core-routes/auth-route.jsx","../../../../../../../libs/core/webapp/app-shell/src/lib/match-path.ts","../../../../../../../libs/core/webapp/app-shell/src/core-router/core-routes/prospect-route.jsx","../../../../../../../libs/core/webapp/app-shell/src/core-router/core-routes/nomatch-route.jsx","../../../../../../../libs/core/webapp/app-shell/src/core-router/core-routes/unauth-route.jsx","../../../../../../../../../node_modules/strict-uri-encode/index.js","../../../../../../../../../node_modules/decode-uri-component/index.js","../../../../../../../../../node_modules/split-on-first/index.js","../../../../../../../../../node_modules/filter-obj/index.js","../../../../../../../../../node_modules/query-string/index.js","../../../../../../../../../node_modules/fast-deep-equal/index.js","../../../../../../../libs/core/webapp/app-shell/src/lib/feature-query-params.ts","../../../../../../../libs/core/webapp/app-shell/src/core-router/core-router-component.jsx","../../../../../../../libs/core/webapp/app-shell/src/lib/hooks/use-tracking/index.js","../../../../../../../libs/core/webapp/app-shell/src/core-router/core-router-container.js","../../../../../../../libs/core/webapp/app-shell/src/lib/a11y-outline.js","../../../../../../../libs/core/webapp/app-shell/src/core-app.jsx","../../../../../../../libs/ui/rainbow/icons/clearscore-logo-wordmark/clearscore-logo-wordmark.svg","../../../../../../../../clearscore-group/libs/redux/alerts/src/alerts.types.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/actions/index.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/reducers/alerts.domain.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/reducers/index.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/selectors/alerts.getAlert.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/index.js","../../../../../../../../clearscore-group/libs/redux/alerts/src/constants.js","../../../../../../../../clearscore-group/libs/hooks/use-timeout/src/index.js","../../../../../../../../clearscore-group/libs/helpers/portal/src/portal.ts","../../../../../../../../clearscore-group/libs/hooks/use-media/src/index.js","../../../../../../../../clearscore-group/libs/helpers/is-internal-url/src/index.js","../../../../../../../libs/ui/rainbow/components/text/src/components/text-link/constants.ts","../../../../../../../libs/ui/rainbow/components/text/src/components/text-link/text-link.tsx","../../../../../../../libs/ui/rainbow/components/text/src/components/text-strong/text-strong.tsx","../../../../../../../libs/ui/rainbow/components/text/src/constants.ts","../../../../../../../libs/ui/rainbow/components/text/src/text.tsx","../../../../../../../libs/ui/rainbow/icons/status-success/status-success.svg","../../../../../../../libs/ui/rainbow/icons/status-info/status-info.svg","../../../../../../../libs/ui/rainbow/icons/status-warning/status-warning.svg","../../../../../../../libs/ui/rainbow/icons/status-error/status-error.svg","../../../../../../../libs/ui/rainbow/icons/cross/cross.svg","../../../../../../../libs/ui/rainbow/components/clickable-icon/src/clickable-icon.tsx","../../../../../../../libs/ui/rainbow/components/button/src/constants.ts","../../../../../../../libs/ui/rainbow/components/button/src/button.tsx","../../../../../../../libs/ui/rainbow/components/notification/src/constants.ts","../../../../../../../libs/ui/rainbow/components/notification/src/notification.tsx","../../../../../../../libs/ui/rainbow/components/notification/src/components/notification.controller.tsx","../../../../../../../../clearscore-group/libs/ui/shared/alert/src/alert.container.jsx","../../../../../../../../clearscore-group/libs/ui/shared/alert/src/lib/hooks/use-tracking/index.js","../../../../../../../libs/core/webapp/template-global/src/full-width-container.jsx","../../../../../../../libs/core/webapp/template-global/src/index.jsx","../../../../../../../../../node_modules/ramda.clone/clone.js","../../../../../../../../../node_modules/ramda.clone/index.js","../../../../../../../../../node_modules/lodash.isequal/index.js","../../../../../../../../clearscore-group/libs/redux/create-requests/src/types.js","../../../../../../../../clearscore-group/libs/redux/create-requests/src/request-reducer.js","../../../../../../../../clearscore-group/libs/redux/create-requests/src/reducers.js","../../../../../../../../clearscore-group/libs/redux/create-requests/src/index.js","../../../../../../../../clearscore-group/libs/redux/notifications/src/actions.js","../../../../../../../../../node_modules/date-fns/esm/_lib/requiredArgs/index.js","../../../../../../../../../node_modules/date-fns/esm/toDate/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/roundingMethods/index.js","../../../../../../../../../node_modules/date-fns/esm/differenceInHours/index.js","../../../../../../../../../node_modules/date-fns/esm/differenceInMilliseconds/index.js","../../../../../../../../../node_modules/date-fns/esm/constants/index.js","../../../../../../../../../node_modules/date-fns/esm/isValid/index.js","../../../../../../../../../node_modules/date-fns/esm/isDate/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/en-US/_lib/formatDistance/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/en-US/_lib/formatLong/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/en-US/_lib/formatRelative/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/en-US/_lib/localize/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/en-US/_lib/match/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js","../../../../../../../../../node_modules/date-fns/esm/locale/en-US/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/toInteger/index.js","../../../../../../../../../node_modules/date-fns/esm/subMilliseconds/index.js","../../../../../../../../../node_modules/date-fns/esm/addMilliseconds/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/startOfUTCISOWeek/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/getUTCISOWeekYear/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/getUTCISOWeek/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/startOfUTCISOWeekYear/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/startOfUTCWeek/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/getUTCWeekYear/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/getUTCWeek/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/startOfUTCWeekYear/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/addLeadingZeros/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/format/lightFormatters/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/format/formatters/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/getUTCDayOfYear/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/format/longFormatters/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/protectedTokens/index.js","../../../../../../../../../node_modules/date-fns/esm/format/index.js","../../../../../../../../../node_modules/date-fns/esm/_lib/getTimezoneOffsetInMilliseconds/index.js","../../../../../../../../clearscore-group/libs/redux/notifications/src/selectors.js","../../../../../../../../clearscore-group/libs/redux/notifications/src/index.js","../../../../../../../../clearscore-group/libs/hooks/use-segmentation/src/index.ts","../../../../../../../../../node_modules/deepmerge/dist/cjs.js","../../../../../../../../clearscore-group/libs/hooks/use-market-config-deprecated/src/index.ts","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/extends.js","../../../../../../../../../node_modules/@radix-ui/react-context/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/primitive/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-compose-refs/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-slot/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-primitive/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-id/node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-id/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-collection/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-use-previous/dist/index.mjs","../../../../../../../../../node_modules/@radix-ui/react-navigation-menu/dist/index.mjs","../../../../../../../../clearscore-group/libs/ui/slate/utility/breakpoint/src/useWindowDimensions.ts","../../../../../../../../clearscore-group/libs/ui/slate/utility/breakpoint/src/lib/contants.ts","../../../../../../../../clearscore-group/libs/ui/slate/utility/breakpoint/src/useBreakpoint.ts","../../../../../../../../../node_modules/dompurify/dist/purify.js","../../../../../../../../../node_modules/isomorphic-dompurify/browser.js","../../../../../../../../clearscore-group/libs/ui/slate/components/svgr/src/lib/assets/_default.svg","../../../../../../../../clearscore-group/libs/ui/slate/components/svgr/src/svgr.tsx","../../../../../../../../clearscore-group/libs/ui/slate/components/svgr/src/lib/svgr-helpers.ts","../../../../../../../../clearscore-group/libs/ui/slate/components/icon/src/icon.tsx","../../../../../../../../clearscore-group/libs/ui/slate/components/text/src/text.tsx","../../../../../../../../clearscore-group/libs/ui/slate/components/tab-bar/src/lib/constants.ts","../../../../../../../../clearscore-group/libs/ui/slate/components/tab-bar/src/tab-bar.tsx","../../../../../../../../clearscore-group/libs/ui/slate/components/text-link/src/text-link.tsx","../../../../../../../../../node_modules/react/cjs/react.production.min.js","../../../../../../../../../node_modules/react/index.js","../../../../../../../../../node_modules/prop-types/lib/ReactPropTypesSecret.js","../../../../../../../../../node_modules/prop-types/factoryWithThrowingShims.js","../../../../../../../../../node_modules/prop-types/index.js","../../../../../../../../../node_modules/tabbable/dist/index.esm.js","../../../../../../../../../node_modules/focus-trap/dist/focus-trap.esm.js","../../../../../../../../../node_modules/focus-trap-react/dist/focus-trap-react.js","../../../../../../../libs/ui/rainbow/components/portal-core/src/portal-core.tsx","../../../../../../../libs/ui/rainbow/components/drawer/src/drawer.tsx","../../../../src/components/mobile-navigation-bar-cs24/lib/use-nav-hide/use-nav-hide.ts","../../../../src/components/mobile-navigation-bar-cs24/lib/constants.ts","../../../../src/libs/hooks/use-nav-links/lib/constants.ts","../../../../src/libs/hooks/use-nav-links/use-nav-links.ts","../../../../src/libs/hooks/use-navigation-tracking.js","../../../../src/components/mobile-navigation-bar-cs24/index.ts","../../../../src/components/mobile-navigation-bar-cs24/mobile-navigation-bar-cs24.tsx","../../../../src/components/mobile-navigation-bar/mobile-navigation-bar.jsx","../../../../../../../../clearscore-group/libs/helpers/branch/src/index.js","../../../../src/libs/hooks/use-identify-on-profile-fetch.js","../../../../../../../../../node_modules/date-fns/esm/formatISO9075/index.js","../../../../../../../../clearscore-group/libs/helpers/interpolate-with-components/src/index.js","../../../../src/libs/lang.js","../../../../src/libs/market-config.js","../../../../src/libs/hooks/use-new-terms/index.js","../../../../../../../../clearscore-group/libs/hooks/use-branch-tracking/src/index.js","../../../../src/libs/hooks/use-branch-login-tracking.js","../../../../src/libs/hooks/use-branch-tracking.js","../../../../src/libs/hooks/use-auth-listeners.js","../../../../src/templates/app/lib/market-config.ts","../../../../../../../../clearscore-group/libs/ui/slate/components/app-menu-bar/src/app-menu-bar.tsx","../../../../../../../../clearscore-group/libs/hooks/use-language/src/index.ts","../../../../../../../libs/ui/rainbow/components/spacer/src/constants.ts","../../../../../../../libs/ui/rainbow/components/spacer/src/spacer.tsx","../../../../../../../../clearscore-group/libs/hooks/use-request/src/index.js","../../../../../../../libs/ui/rainbow/icons/notification-outline/notification-outline.svg","../../../../../../../libs/ui/rainbow/icons/clearscore/clearscore.svg","../../../../../../../libs/ui/rainbow/icons/trend-down/trend-down.svg","../../../../../../../libs/ui/rainbow/icons/trend-up/trend-up.svg","../../../../../../../libs/ui/rainbow/components/tag/src/tag.tsx","../../../../../../../libs/ui/rainbow/components/modal/src/modal.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/lib/hooks/use-tracking.ts","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/lib/types.ts","../../../../../../../libs/ui/rainbow/components/stack/src/constants.ts","../../../../../../../libs/ui/rainbow/components/stack/src/stack.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/components/store-links/play-store-icon.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/assets/app-store-icon.svg","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/lib/constants.ts","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/components/store-links/store-links.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/assets/qr-code.svg","../../../../../../../libs/ui/webapp/shared/download-app-modal/assets/nz-qr-code.svg","../../../../../../../libs/ui/webapp/shared/download-app-modal/assets/au-qr-code.svg","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/components/install-content/qr-code.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/components/install-content/install-content.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/lib/hooks/use-modal-content.tsx","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/download-app-modal.tsx","../../../../../../../../clearscore-group/libs/helpers/has-client-data/src/index.js","../../../../../../../libs/ui/webapp/shared/download-app-modal/src/index.ts","../../../../../../../libs/core/webapp/add-client-instance/src/client-directory.js","../../../../../../../../clearscore-group/libs/helpers/interpolate-with-market/src/index.js","../../../../../../../libs/core/webapp/logout/src/index.js","../../../../../../../libs/core/webapp/add-client-instance/src/lib/get-interpolated-url.js","../../../../../../../libs/core/webapp/add-client-instance/src/lib/handle-erroneous-response-interceptor.js","../../../../../../../libs/core/webapp/add-client-instance/src/lib/auth.js","../../../../../../../libs/core/webapp/add-client-instance/src/clients.js","../../../../../../../libs/core/webapp/add-client-instance/src/index.js","../../../../../../../../clearscore-group/libs/hooks/use-cs-mutate-query/src/use-cs-mutate-query.js","../../../../../../../libs/core/webapp/cs-mutate-query-deprecated/src/use-auth-cs-mutate-query.ts","../../../../../../../libs/ui/rainbow/components/image/src/image.tsx","../../../../src/components/notifications/lib/hooks/use-tracking/index.js","../../../../src/components/notifications/lib/lang.js","../../../../src/components/notifications/lib/constants.ts","../../../../src/components/notifications/notifications.tsx","../../../../src/components/notification-drawer/types.ts","../../../../src/components/notification-drawer/notification-drawer.tsx","../../../../../../../libs/ui/rainbow/icons/clearscore-logo-symbol/clearscore-logo-symbol.svg","../../../../../../../libs/ui/rainbow/icons/document-hoverable/document-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/information-hoverable/information-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/log-out-hoverable/log-out-hoverable.svg","../../../../../../../../clearscore-group/libs/redux/prospect/src/lib/market-config.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/prospect.types.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/prospect.actions.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/reducers/prospect.domain.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/reducers/index.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/selectors/index.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/selectors/prospect.getPredicate.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/selectors/prospect.getSimple.js","../../../../../../../../clearscore-group/libs/redux/prospect/src/index.js","../../../../../../../libs/ui/rainbow/components/badge-notification/src/index.jsx","../../../../src/components/side-menu/lib/lang.js","../../../../src/components/side-menu/lib/market.ts","../../../../src/components/side-menu/lib/market-config.js","../../../../src/components/side-menu/side-menu.tsx","../../../../src/components/side-menu/lib/hooks/use-tracking.js","../../../../src/components/header-cs24/lib/lang.ts","../../../../src/components/header-cs24/lib/market-config.ts","../../../../src/components/header-cs24/lib/constants.ts","../../../../src/components/header-cs24/lib/hooks/use-cs24-style-takeover/use-cs24-style-takeover.ts","../../../../src/components/header-cs24/header-cs24.tsx","../../../../src/components/header-cs24/lib/helpers/transform-routes.ts","../../../../src/templates/app/component.tsx","../../../../src/templates/app/container.js","../../../../../../../../clearscore-group/libs/tools/feature-toggle/src/index.js","../../../../../../../../clearscore-group/libs/ui/shared/app-background/src/lib/market-config.ts","../../../../../../../../clearscore-group/libs/ui/shared/app-background/src/app-background.tsx","../../../../../../../libs/ui/rainbow/icons/account-hoverable/account-hoverable.svg","../../../../src/components/logo-navigation/logo-navigation.jsx","../../../../../../../libs/ui/rainbow/icons/success-inline/success-inline.svg","../../../../../../../libs/ui/rainbow/components/progress-indicator-with-number/src/progress-indicator-with-number.tsx","../../../../src/components/progress-navigation/lib/get-steps.js","../../../../src/components/progress-navigation/progress-navigation.jsx","../../../../../../../libs/ui/rainbow/components/progress-step-bar/src/index.ts","../../../../../../../libs/ui/rainbow/components/progress-step-bar/src/progress-step-bar.tsx","../../../../../../../libs/ui/rainbow/components/container/src/container.tsx","../../../../src/components/progress-step-bar-navigation/lib/constants.ts","../../../../src/components/progress-step-bar-navigation/progress-step-bar-navigation.tsx","../../../../src/components/progress-step-bar-navigation/index.ts","../../../../src/components/progress-header/lib/lang.js","../../../../src/components/progress-header/progress-header.jsx","../../../../src/components/progress-header/lib/market-config.js","../../../../src/templates/reg/reg-template.jsx","../../../../src/templates/reg/reg-template.container.js","../../../../src/templates/public/component.jsx","../../../../src/templates/public/container.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../../../../../../../../../node_modules/react-media/node_modules/prop-types/lib/ReactPropTypesSecret.js","../../../../../../../../../node_modules/react-media/node_modules/prop-types/factoryWithThrowingShims.js","../../../../../../../../../node_modules/react-media/node_modules/prop-types/index.js","../../../../../../../../../node_modules/invariant/browser.js","../../../../../../../../../node_modules/string-convert/camel2hyphen.js","../../../../../../../../../node_modules/json2mq/index.js","../../../../../../../../../node_modules/react-media/esm/react-media.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../../../../../../../libs/ui/rainbow/icons/card-credit-builder-hoverable/card-credit-builder-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/credit-card-multiple-hoverable/credit-card-multiple-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/target-hoverable/target-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/timeline-legacy-hoverable/timeline-legacy-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/shield-monitor-hoverable/shield-monitor-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/drivescore-logo-hoverable/drivescore-logo-hoverable.svg","../../../../../../../libs/ui/rainbow/icons/car-outline/car-outline.svg","../../../../../../../libs/ui/rainbow/icons/more/more.svg","../../../../../../../libs/ui/rainbow/icons/improve-logo-hoverable/improve-logo-hoverable.svg","../../../../../../../libs/ui/shared/icon-navigation/src/components/dashboard-icon/dashboard.svg","../../../../../../../libs/ui/shared/icon-navigation/src/components/dashboard-icon/component.jsx","../../../../../../../libs/ui/shared/icon-navigation/src/components/dashboard-icon/container.js","../../../../../../../libs/ui/shared/icon-navigation/src/lib/market-config.ts","../../../../../../../libs/ui/shared/icon-navigation/src/components/route-icon.component.tsx","../../../../../../../../../node_modules/path-to-regexp/dist.es2015/index.js","../../../../../../../libs/ui/shared/icon-navigation/src/index.tsx","../../../../../../../libs/ui/shared/icon-navigation/src/lib/parse-path.js","../../../../../../../libs/ui/rainbow/icons/menu-hamburger/menu-hamburger.svg","../../../../../../../libs/ui/rainbow/components/badge/src/badge.tsx","../../../../../../../libs/ui/rainbow/icons/notification-hoverable/notification-hoverable.svg","../../../../../../../libs/ui/shared/hamburger-navigation/src/hamburger-navigation.tsx","../../../../../../../libs/ui/rainbow/icons/chevron-down/chevron-down.svg","../../../../../../../libs/ui/rainbow/components/menu-secondary-return/src/menu-secondary-return.tsx","../../../../src/components/header/lib/lang.js","../../../../src/components/header/lib/hooks/use-tracking.js","../../../../src/components/header/lib/market-config.ts","../../../../src/components/header/header.tsx","../../../../src/templates/simple/component.jsx","../../../../src/templates/simple/container.js","../../../../../../../../clearscore-group/libs/redux/products/src/types.js","../../../../../../../../clearscore-group/libs/redux/products/src/reducers/lib/merge-fetch-status.js","../../../../../../../../clearscore-group/libs/redux/products/src/reducers/products.domain.js","../../../../../../../../clearscore-group/libs/redux/products/src/reducers/index.js","../../../../../../../../clearscore-group/libs/redux/products/src/reducers/lib/normalise-results.js","../../../../../../../../clearscore-group/libs/redux/products/src/reducers/lib/merge-results-request-data.js","../../../../src/libs/action-bridge.js","../../../../../../../../clearscore-group/libs/epic/stage-redirect/src/stage-redirect.epic.js","../../../../../../../../../node_modules/uuid/dist/esm-browser/rng.js","../../../../../../../../../node_modules/uuid/dist/esm-browser/regex.js","../../../../../../../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../../../../../../../node_modules/uuid/dist/esm-browser/validate.js","../../../../../../../../../node_modules/uuid/dist/esm-browser/v4.js","../../../../../../../../clearscore-group/libs/epic/market-config/src/sdui-helpers.js","../../../../../../../../clearscore-group/libs/epic/market-config/src/market-config.epic.js","../../../../../../../../clearscore-group/libs/epic/tracking/src/filterEvents.js","../../../../../../../../clearscore-group/libs/helpers/create-event-context/src/index.js","../../../../../../../../clearscore-group/libs/helpers/interpolate-values/src/utils/type-guards.ts","../../../../../../../../clearscore-group/libs/helpers/interpolate-values/src/utils/resolver.ts","../../../../../../../../clearscore-group/libs/helpers/interpolate-values/src/index.ts","../../../../../../../../clearscore-group/libs/epic/tracking/src/segment/transformer.js","../../../../../../../../clearscore-group/libs/epic/tracking/src/segment/observer.js","../../../../../../../../clearscore-group/libs/epic/tracking/src/index.js","../../../../../../../../clearscore-group/libs/redux/tracking-middleware/src/index.js","../../../../../../../libs/core/webapp/tracking/src/lib/segmentProps.js","../../../../../../../libs/core/webapp/tracking/src/events/first-time-login.js","../../../../../../../libs/core/webapp/tracking/src/events/product-apply-click.js","../../../../../../../libs/core/webapp/tracking/src/events/score-band-received.js","../../../../../../../libs/core/webapp/tracking/src/config.js","../../../../../../../libs/core/webapp/tracking/src/index.js","../../../../src/libs/epics/gdpr-redirect.js","../../../../src/libs/epics/report-not-found.epic.js","../../../../src/components/alert-link-wrapper/lib/hooks/use-tracking.js","../../../../src/components/alert-link-wrapper/alert-link-wrapper.jsx","../../../../src/libs/epics/global-notifications.epic/email-verification.js","../../../../src/libs/epics/global-notifications.epic/index.js","../../../../src/libs/epics/maintenance-mode-redirect.epic.js","../../../../src/libs/epic.js","../../../../../../../../clearscore-group/libs/epic/session/src/epics/logout.js","../../../../src/libs/epics/request-failed.epic.js","../../../../src/libs/epics/refresh-new-notifications.epic.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/transactions.types.js","../../../../../../../../../node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/helpers/normalise-id.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/reducers/transactions.accountId.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/reducers/transactions.accountNumber.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/reducers/index.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/index.js","../../../../../../../../clearscore-group/libs/redux/transactions/src/reducers/transactions.domain.js","../../../../../../../../clearscore-group/libs/redux/history/src/reducer/history.domain.js","../../../../../../../../clearscore-group/libs/redux/history/src/reducer/index.js","../../../../../../../../clearscore-group/libs/redux/history/src/types/index.js","../../../../../../../../clearscore-group/libs/redux/history/src/index.js","../../../../src/libs/reducer.js","../../../../../../../../clearscore-group/libs/redux/session-middleware/src/logoutMiddleware.js","../../../../../../../../clearscore-group/libs/redux/native-bridge-middleware/src/nativeBridgeMiddleware.js","../../../../../../../../clearscore-group/libs/redux/nova-user/src/nova-user.types.js","../../../../../../../../clearscore-group/libs/redux/nova-user/src/index.js","../../../../../../../../clearscore-group/libs/helpers/add-url-variables/src/interpolateValues.js","../../../../../../../../clearscore-group/libs/helpers/add-url-variables/src/index.js","../../../../../../../libs/core/webapp/request-middleware/src/index.js","../../../../src/webapp.jsx","../../../../src/libs/middleware.js","../../../../../../../../clearscore-group/libs/redux/monitoring-middleware/src/index.js","../../../../src/index.jsx"],"sourcesContent":["export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","export const LOGIN_OAUTH_SUBMIT = 'CS/LOGIN_OAUTH_SUBMIT';\nexport const LOGIN_OAUTH_SUBMIT_ERROR = 'CS/LOGIN_OAUTH_SUBMIT_ERROR';\nexport const LOGIN_OAUTH_SUBMIT_SUCCESS = 'CS/LOGIN_OAUTH_SUBMIT_SUCCESS';\n\nexport const LOGIN_OAUTH_AUTHORISE = 'CS/LOGIN_OAUTH_AUTHORISE';\nexport const LOGIN_OAUTH_AUTHORISE_ERROR = 'CS/LOGIN_OAUTH_AUTHORISE_ERROR';\nexport const LOGIN_OAUTH_AUTHORISE_SUCCESS = 'CS/LOGIN_OAUTH_AUTHORISE_SUCCESS';\n\nexport const LOGIN_OAUTH_REFRESH = 'CS/LOGIN_OAUTH_REFRESH';\nexport const LOGIN_OAUTH_REFRESH_ERROR = 'CS/LOGIN_OAUTH_REFRESH_ERROR';\nexport const LOGIN_OAUTH_REFRESH_SUCCESS = 'CS/LOGIN_OAUTH_REFRESH_SUCCESS';\n\nexport const SET_SESSION = 'CS/SET_SESSION';\n\n// Native only event, we should never act on this action\nexport const NATIVE_SET_SESSION = 'CS/NATIVE_SET_SESSION';\n\nexport const TIMEOUT_SUCCESS = 'CS/TIMEOUT_SUCCESS';\n\nexport const LOGOUT_SUBMIT = 'CS/LOGOUT_SUBMIT';\nexport const LOGOUT_SUBMIT_ERROR = 'CS/LOGOUT_SUBMIT_ERROR';\nexport const LOGOUT_SUBMIT_SUCCESS = 'CS/LOGOUT_SUBMIT_SUCCESS';\n\nexport const CLEAR_SESSION = 'CS/CLEAR_SESSION';\n\nexport const SET_USER_ROLE = 'CS/SET_USER_ROLE';\n","import * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\n/** Type for the bridge */\nconst ROUTER_TYPE = ['@@router'];\nconst DEFAULT_TYPES = [sessionTypes.LOGIN_OAUTH_REFRESH_SUCCESS];\n\n/**\n * Conditional to check if action should be pushed\n * Currently pushing all router and session stuff\n * @todo: if there is anymore we should come up with a better pattern\n * @param {object} action redux action\n * @param {Array} appBridgeTypes array of type to bridge\n * @returns {boolean} if action structure is correct\n */\nfunction _shouldBridge(action, appBridgeTypes) {\n if (!action) throw Error('action-bridge-types: undefined action');\n if (!action.type) throw Error('action-bridge-types: undefined action.type');\n const types = [...DEFAULT_TYPES, ...appBridgeTypes];\n return action.type.includes(ROUTER_TYPE) || types.includes(action.type);\n}\n\n/**\n * Propagate all actions to core store if available\n * @returns {Function} middleware\n */\nconst _actionBridge = (store, next, action, coreDispatch) => {\n if (coreDispatch) coreDispatch(action);\n next(action);\n};\n\n/**\n * If action has correct signature, perform API request.\n * Dispatch success or error actions\n * @param {object} coreDispatch redux store\n * @param {array} appBridgeTypes array of type to bridge\n * @returns {Function} middleware\n */\nconst actionBridgeMiddleware =\n (coreDispatch, appBridgeTypes = []) =>\n (store) =>\n (next) =>\n (action) =>\n _shouldBridge(action, appBridgeTypes) ? _actionBridge(store, next, action, coreDispatch) : next(action);\n\nexport default actionBridgeMiddleware;\n","import { filter } from 'rxjs/operators';\n\nvar keyHasType = function keyHasType(type, key) {\n return type === key || typeof key === 'function' && type === key.toString();\n};\n\nexport var ofType = function ofType() {\n for (var _len = arguments.length, keys = Array(_len), _key = 0; _key < _len; _key++) {\n keys[_key] = arguments[_key];\n }\n\n return function (source) {\n return source.pipe(filter(function (_ref) {\n var type = _ref.type;\n\n var len = keys.length;\n if (len === 1) {\n return keyHasType(type, keys[0]);\n } else {\n for (var i = 0; i < len; i++) {\n if (keyHasType(type, keys[i])) {\n return true;\n }\n }\n }\n return false;\n }));\n };\n};","var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport { Observable, of as _of, from as _from } from 'rxjs';\nimport { ofType as _ofType } from './operators';\n\nexport var ActionsObservable = function (_Observable) {\n _inherits(ActionsObservable, _Observable);\n\n _createClass(ActionsObservable, null, [{\n key: 'of',\n value: function of() {\n return new this(_of.apply(undefined, arguments));\n }\n }, {\n key: 'from',\n value: function from(actions, scheduler) {\n return new this(_from(actions, scheduler));\n }\n }]);\n\n function ActionsObservable(actionsSubject) {\n _classCallCheck(this, ActionsObservable);\n\n var _this = _possibleConstructorReturn(this, (ActionsObservable.__proto__ || Object.getPrototypeOf(ActionsObservable)).call(this));\n\n _this.source = actionsSubject;\n return _this;\n }\n\n _createClass(ActionsObservable, [{\n key: 'lift',\n value: function lift(operator) {\n var observable = new ActionsObservable(this);\n observable.operator = operator;\n return observable;\n }\n }, {\n key: 'ofType',\n value: function ofType() {\n return _ofType.apply(undefined, arguments)(this);\n }\n }]);\n\n return ActionsObservable;\n}(Observable);","function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nimport { Observable, Subject } from 'rxjs';\n\nexport var StateObservable = function (_Observable) {\n _inherits(StateObservable, _Observable);\n\n function StateObservable(stateSubject, initialState) {\n _classCallCheck(this, StateObservable);\n\n var _this = _possibleConstructorReturn(this, (StateObservable.__proto__ || Object.getPrototypeOf(StateObservable)).call(this, function (subscriber) {\n var subscription = _this.__notifier.subscribe(subscriber);\n if (subscription && !subscription.closed) {\n subscriber.next(_this.value);\n }\n return subscription;\n }));\n\n _this.value = initialState;\n _this.__notifier = new Subject();\n _this.__subscription = stateSubject.subscribe(function (value) {\n // We only want to update state$ if it has actually changed since\n // redux requires reducers use immutability patterns.\n // This is basically what distinctUntilChanged() does but it's so simple\n // we don't need to pull that code in\n if (value !== _this.value) {\n _this.value = value;\n _this.__notifier.next(value);\n }\n });\n return _this;\n }\n\n return StateObservable;\n}(Observable);","function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nimport { merge } from 'rxjs';\n\n/**\n Merges all epics into a single one.\n */\nexport var combineEpics = function combineEpics() {\n for (var _len = arguments.length, epics = Array(_len), _key = 0; _key < _len; _key++) {\n epics[_key] = arguments[_key];\n }\n\n var merger = function merger() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return merge.apply(undefined, _toConsumableArray(epics.map(function (epic) {\n var output$ = epic.apply(undefined, args);\n if (!output$) {\n throw new TypeError('combineEpics: one of the provided Epics \"' + (epic.name || '') + '\" does not return a stream. Double check you\\'re not missing a return statement!');\n }\n return output$;\n })));\n };\n\n // Technically the `name` property on Function's are supposed to be read-only.\n // While some JS runtimes allow it anyway (so this is useful in debugging)\n // some actually throw an exception when you attempt to do so.\n try {\n Object.defineProperty(merger, 'name', {\n value: 'combineEpics(' + epics.map(function (epic) {\n return epic.name || '';\n }).join(', ') + ')'\n });\n } catch (e) {}\n\n return merger;\n};","import { CurrencySymbol } from './currency-symbol';\nimport { Currency } from './currency';\nimport { DialingCode } from './dialing-code';\nimport { Locale } from './locale';\nimport { Market } from './market';\nimport { TimezoneAbbreviation } from './timezone-abbreviation';\nimport { Timezone } from './timezone';\n\n/* MARKETS */\nconst GB = 'gb';\nconst ZA = 'za';\nconst AU = 'au';\nconst CA = 'ca';\nconst NZ = 'nz';\nconst GLOBAL = 'global';\n\nconst MARKETS = [GB, ZA, AU, CA, NZ] as const;\n\n/* LOCALES */\nconst EN_GB = 'en-gb';\nconst EN_ZA = 'en-za';\nconst EN_AU = 'en-au';\nconst EN_CA = 'en-ca';\nconst EN_NZ = 'en-nz';\nconst FR_CA = 'fr-ca';\n\nconst LOCALES = [EN_GB, EN_ZA, EN_AU, EN_CA, EN_NZ, FR_CA] as const;\n\n/* CURRENCIES */\nconst GBP = 'GBP';\nconst ZAR = 'ZAR';\nconst AUD = 'AUD';\nconst CAD = 'CAD';\nconst NZD = 'NZD';\n\nconst CURRENCY = {\n [GB]: GBP,\n [ZA]: ZAR,\n [AU]: AUD,\n [CA]: CAD,\n [NZ]: NZD,\n} as const;\n\nconst GBP_SYMBOL = '£';\nconst ZAR_SYMBOL = 'R';\nconst AUD_SYMBOL = '$';\nconst CAD_SYMBOL = '$';\nconst NZD_SYMBOL = '$';\n\nconst CURRENCY_SYMBOLS = {\n [GBP]: GBP_SYMBOL,\n [ZAR]: ZAR_SYMBOL,\n [AUD]: AUD_SYMBOL,\n [CAD]: CAD_SYMBOL,\n [NZD]: NZD_SYMBOL,\n} as const;\n\n/* TIMEZONES */\nconst GB_TIMEZONE = 'Europe/London';\nconst ZA_TIMEZONE = 'Africa/Johannesburg';\nconst AU_TIMEZONE = 'Australia/Sydney';\nconst NZ_TIMEZONE = 'Pacific/Auckland';\n\nconst TIMEZONE = {\n [EN_GB]: GB_TIMEZONE,\n [EN_ZA]: ZA_TIMEZONE,\n [EN_AU]: AU_TIMEZONE,\n [EN_NZ]: NZ_TIMEZONE,\n} as const;\n\n/* TIMEZONE ABBREVIATIONS */\nconst GB_TIMEZONE_ABBREVIATION = 'GMT';\nconst BST_TIMEZONE_ABBREVIATION = 'BST';\nconst ZA_TIMEZONE_ABBREVIATION = 'SAST';\nconst AU_TIMEZONE_ABBREVIATION = 'AEST';\nconst NZ_TIMEZONE_ABBREVIATION = 'NZST';\n\nconst TIMEZONE_ABBREVIATION = {\n [EN_GB]: GB_TIMEZONE_ABBREVIATION,\n [EN_ZA]: ZA_TIMEZONE_ABBREVIATION,\n BST: BST_TIMEZONE_ABBREVIATION,\n [EN_AU]: AU_TIMEZONE_ABBREVIATION,\n [EN_NZ]: NZ_TIMEZONE_ABBREVIATION,\n} as const;\n\n/* DIALING CODES */\nconst GB_DIALING_CODE = '+44';\nconst ZA_DIALING_CODE = '+27';\nconst AU_DIALING_CODE = '+61';\nconst CA_DIALING_CODE = '+1';\nconst NZ_DIALING_CODE = '+64';\n\nconst DIALING_CODES = [GB_DIALING_CODE, ZA_DIALING_CODE, AU_DIALING_CODE, CA_DIALING_CODE, NZ_DIALING_CODE] as const;\n\nconst DIALING_CODE = {\n [GB]: GB_DIALING_CODE,\n [ZA]: ZA_DIALING_CODE,\n [AU]: AU_DIALING_CODE,\n [CA]: CA_DIALING_CODE,\n [NZ]: NZ_DIALING_CODE,\n} as const;\n\n/* OLD CONSTANTS (js) */\nexport {\n GB,\n ZA,\n AU,\n CA,\n NZ,\n GLOBAL,\n EN_GB,\n EN_ZA,\n EN_AU,\n EN_CA,\n EN_NZ,\n FR_CA,\n GBP,\n ZAR,\n AUD,\n CAD,\n NZD,\n GBP_SYMBOL,\n ZAR_SYMBOL,\n AUD_SYMBOL,\n CAD_SYMBOL,\n NZD_SYMBOL,\n MARKETS,\n LOCALES,\n CURRENCY,\n CURRENCY_SYMBOLS,\n TIMEZONE,\n TIMEZONE_ABBREVIATION,\n DIALING_CODES,\n DIALING_CODE,\n};\n\n/* NEW CONSTANTS (ts) */\nexport { CurrencySymbol, Currency, DialingCode, Locale, Market, TimezoneAbbreviation, Timezone };\n\n// workaround for bundling issues\nexport default {\n /* OLD CONSTANTS (js) */\n GB,\n ZA,\n AU,\n CA,\n NZ,\n GLOBAL,\n EN_GB,\n EN_ZA,\n EN_AU,\n EN_CA,\n EN_NZ,\n FR_CA,\n GBP,\n ZAR,\n AUD,\n CAD,\n NZD,\n GBP_SYMBOL,\n ZAR_SYMBOL,\n AUD_SYMBOL,\n CAD_SYMBOL,\n NZD_SYMBOL,\n MARKETS,\n LOCALES,\n CURRENCY,\n CURRENCY_SYMBOLS,\n TIMEZONE,\n TIMEZONE_ABBREVIATION,\n DIALING_CODES,\n DIALING_CODE,\n};\n","/**\n * Create an action object\n * @param {String} type Name of Redux action\n * @param {*} payload action payload\n * @return {{ type: string, payload?: any }} flux action format object\n */\nexport default function createAction(type, payload) {\n return {\n type,\n ...(payload && { payload }),\n };\n}\n","export default function createRequestPayload(\n client,\n url,\n // eslint-disable-next-line default-param-last\n method = 'get',\n data,\n meta,\n headers,\n timeout,\n { params } = {},\n) {\n return {\n request: {\n client,\n url,\n method,\n ...(data && { data }),\n ...(meta && { meta }),\n ...(headers && { headers }),\n ...(timeout && { timeout }),\n ...(params && { params }),\n },\n };\n}\n","/**\n * Given an single pathref, resolve to the value of the given data object\n * @param {string} pathArr single property path\n * @param {object} obj object of data to resolve\n * @returns {object} object containing resolved data\n */\nexport function resolveProp(pathArr, obj) {\n if (arguments.length === 1) {\n return (objHolder) => resolveProp(pathArr, objHolder);\n }\n if (obj === null || obj === undefined) {\n return undefined;\n }\n let willReturn = obj;\n let counter = 0;\n\n const pathArrValue = typeof pathArr === 'string' ? pathArr.split('.') : pathArr;\n\n while (counter < pathArrValue.length) {\n if (willReturn === null || willReturn === undefined) {\n return undefined;\n }\n willReturn = willReturn[pathArrValue[counter]];\n counter += 1;\n }\n\n return willReturn;\n}\n\n/**\n * Given an object of object property paths and an object, resolves the paths to the values in the object\n * @param {object} paths object of property paths\n * @param {object} data object of data to resolve\n * @returns {object} object containing resolved data\n */\n\nfunction resolveProps(paths, data) {\n return Object.keys(paths).reduce((resolvedData, prop) => {\n const pathRef = paths[prop];\n return {\n ...resolvedData,\n [prop]: resolveProp(pathRef, data),\n };\n }, {});\n}\n\nexport default resolveProps;\n","export default () => !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n","import { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\n\nconst CACHE_NAME = '__cs__';\nconst LOCAL_NAMESPACE = 'local';\nexport const RESET_MARKET_ENVS = {\n local: {},\n};\n\n/**\n * Returns an env after providing a object path\n * @param path\n * @return {*}\n */\n\nfunction getSingleEnv(path) {\n if (!canUseDom()) return ''; // @todo: [PM] get envs on the server\n let envs;\n\n if (window[CACHE_NAME] && window[CACHE_NAME].env) {\n envs = window[CACHE_NAME].env;\n } else {\n envs = window.env;\n }\n\n return resolveProp(`${LOCAL_NAMESPACE}.${path}`, envs) || resolveProp(path, envs);\n}\n\nexport const getEnvs = () => {\n if (!canUseDom()) return '';\n return window[CACHE_NAME].env || window.env;\n};\n\n/**\n * Set envs\n * @param envs - new market envs\n * @return void\n */\n\nexport const setEnvs = (envs = {}) => {\n if (window[CACHE_NAME] && window[CACHE_NAME].env) {\n window[CACHE_NAME].env = Object.assign(window[CACHE_NAME].env, envs);\n } else {\n window.env = Object.assign(window.env, envs);\n }\n};\n\n/**\n * Returns an env after providing a object path or array of multiple object paths\n * @param paths\n * @return {*}\n */\n\nexport default function getEnv(paths) {\n if (Array.isArray(paths)) {\n return paths.map((path) => getSingleEnv(path));\n }\n return getSingleEnv(paths);\n}\n","/* eslint-disable import/prefer-default-export */\nimport getEnv from '@clearscore-group/lib.helpers.envs';\n\n/**\n * Get the app version from querystring if running in webview\n * context (to be passed eventually to segmenter)\n */\nexport const getWebviewAppVersion = () => {\n if (!getEnv('WEBVIEW')) return null;\n\n return new URLSearchParams(window.location?.search).get('appVersion');\n};\n","const MARKET = 'CS/MARKET';\n\nexport const MARKET_SET_MARKETS = `${MARKET}_SET_MARKETS`;\nexport const MARKET_SET_LOCALES = `${MARKET}_SET_LOCALES`;\nexport const MARKET_SET_ENVS = `${MARKET}_SET_ENVS`;\n\nexport const MARKET_SET_ACTIVE_MARKET = `${MARKET}_SET_ACTIVE_MARKET`;\nexport const MARKET_SET_ACTIVE_LOCALE = `${MARKET}_SET_ACTIVE_LOCALE`;\n\nexport const MARKET_FETCH_CONFIG = `${MARKET}_FETCH_CONFIG`;\nexport const MARKET_FETCH_CONFIG_PENDING = `${MARKET}_FETCH_CONFIG_PENDING`;\nexport const MARKET_FETCH_CONFIG_SUCCESS = `${MARKET_FETCH_CONFIG}_SUCCESS`;\nexport const MARKET_FETCH_CONFIG_ERROR = `${MARKET_FETCH_CONFIG}_ERROR`;\n\nexport const MARKET_FETCH_SDUI_CONFIG = `${MARKET}_FETCH_SDUI_CONFIG`;\nexport const MARKET_FETCH_SDUI_CONFIG_PENDING = `${MARKET}_FETCH_SDUI_CONFIG_PENDING`;\nexport const MARKET_FETCH_SDUI_CONFIG_SUCCESS = `${MARKET_FETCH_SDUI_CONFIG}_SUCCESS`;\nexport const MARKET_FETCH_SDUI_CONFIG_ERROR = `${MARKET_FETCH_SDUI_CONFIG}_ERROR`;\n\nexport const MARKET_FETCH_STATIC_CONFIG = `${MARKET}_FETCH_STATIC_CONFIG`;\nexport const MARKET_FETCH_STATIC_CONFIG_SUCCESS = `${MARKET_FETCH_STATIC_CONFIG}_SUCCESS`;\nexport const MARKET_FETCH_STATIC_CONFIG_ERROR = `${MARKET_FETCH_STATIC_CONFIG}_ERROR`;\n","export const INITIAL = 'initial';\nexport const SUCCESS = 'success';\nexport const ERROR = 'error';\nexport const PENDING = 'pending';\n","/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module exports.\n * @public\n */\n\nexports.parse = parse;\nexports.serialize = serialize;\n\n/**\n * Module variables.\n * @private\n */\n\nvar decode = decodeURIComponent;\nvar encode = encodeURIComponent;\nvar pairSplitRegExp = /; */;\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF\n */\n\nvar fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n * @param {string} str\n * @param {object} [options]\n * @return {object}\n * @public\n */\n\nfunction parse(str, options) {\n if (typeof str !== 'string') {\n throw new TypeError('argument str must be a string');\n }\n\n var obj = {}\n var opt = options || {};\n var pairs = str.split(pairSplitRegExp);\n var dec = opt.decode || decode;\n\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i];\n var eq_idx = pair.indexOf('=');\n\n // skip things that don't look like key=value\n if (eq_idx < 0) {\n continue;\n }\n\n var key = pair.substr(0, eq_idx).trim()\n var val = pair.substr(++eq_idx, pair.length).trim();\n\n // quoted values\n if ('\"' == val[0]) {\n val = val.slice(1, -1);\n }\n\n // only assign once\n if (undefined == obj[key]) {\n obj[key] = tryDecode(val, dec);\n }\n }\n\n return obj;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize the a name value pair into a cookie string suitable for\n * http headers. An optional options object specified cookie parameters.\n *\n * serialize('foo', 'bar', { httpOnly: true })\n * => \"foo=bar; httpOnly\"\n *\n * @param {string} name\n * @param {string} val\n * @param {object} [options]\n * @return {string}\n * @public\n */\n\nfunction serialize(name, val, options) {\n var opt = options || {};\n var enc = opt.encode || encode;\n\n if (typeof enc !== 'function') {\n throw new TypeError('option encode is invalid');\n }\n\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n var value = enc(val);\n\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n var str = name + '=' + value;\n\n if (null != opt.maxAge) {\n var maxAge = opt.maxAge - 0;\n\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid')\n }\n\n str += '; Max-Age=' + Math.floor(maxAge);\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n if (typeof opt.expires.toUTCString !== 'function') {\n throw new TypeError('option expires is invalid');\n }\n\n str += '; Expires=' + opt.expires.toUTCString();\n }\n\n if (opt.httpOnly) {\n str += '; HttpOnly';\n }\n\n if (opt.secure) {\n str += '; Secure';\n }\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string'\n ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n case 'lax':\n str += '; SameSite=Lax';\n break;\n case 'strict':\n str += '; SameSite=Strict';\n break;\n case 'none':\n str += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n}\n\n/**\n * Try decoding a string using a decoding function.\n *\n * @param {string} str\n * @param {function} decode\n * @private\n */\n\nfunction tryDecode(str, decode) {\n try {\n return decode(str);\n } catch (e) {\n return str;\n }\n}\n","import cookie from 'cookie';\nimport getEnvs from '@clearscore-group/lib.helpers.envs';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\n\nconst hasDocumentCookie = () => canUseDom() && 'cookie' in window.document;\n\n// if it looks like JSON, we'll treat it like JSON\nconst isParsingCookie = (value = '') => value[0] === '{' || value[0] === '[' || value[0] === '\"';\nconst readCookie = (value) => {\n if (isParsingCookie(value)) {\n try {\n return JSON.parse(value);\n } catch (e) {\n // at least we tried\n }\n }\n return value;\n};\n\nconst getDefaultOptions = () => ({\n ...(getEnvs('COOKIE_DOMAIN') && { domain: getEnvs('COOKIE_DOMAIN') }),\n path: '/',\n secure: true,\n});\n\n/**\n * set cookie\n * @param {string} cookieName\n * @param {any} payload\n * @param {object} options\n */\nexport const setCookie = (cookieName, payload, options) => {\n const cookieValue = typeof payload === 'object' ? JSON.stringify(payload) : payload;\n\n if (hasDocumentCookie()) {\n document.cookie = cookie.serialize(cookieName, cookieValue, {\n ...getDefaultOptions(),\n ...options,\n });\n }\n};\n\n/**\n * get cookie\n * @param {string} cookieName\n */\nexport const getCookie = (cookieName) => {\n if (hasDocumentCookie()) {\n const cookieValue = cookie.parse(document.cookie ?? '')[cookieName];\n return readCookie(cookieValue);\n }\n return null;\n};\n\n/**\n * get all cookies\n */\nexport const getAllCookies = () => {\n if (hasDocumentCookie()) {\n const allCookies = cookie.parse(document.cookie ?? '');\n\n return Object.entries(allCookies).reduce(\n (acc, [cookieKey, cookieValue]) => ({\n ...acc,\n [cookieKey]: readCookie(cookieValue),\n }),\n {},\n );\n }\n return null;\n};\n\n/**\n * deletes cookie\n * @param {string} cookieName\n */\nexport const removeCookie = (cookieName) => {\n if (hasDocumentCookie()) {\n const options = {\n ...getDefaultOptions(),\n expires: new Date(1970, 1, 1, 0, 0, 1),\n maxAge: 0,\n };\n document.cookie = cookie.serialize(cookieName, '', options);\n }\n};\n","import getEnv from '@clearscore-group/lib.helpers.envs';\n\nexport const CS_SESSION_COOKIE = getEnv('SESSION_COOKIE') || 'CS_SESSION';\nexport const CS_PERSON_COOKIE = 'CS_PERSON';\nexport const CS_PUBLISHER_ID = 'CS_PUBLISHER_ID';\nexport const VISITED_SITE_COOKIE_NAME = 'CS_VISITED_SITE';\n// Please note this is concatenated with `alertId` to give full cookie key\nexport const CS_ALERT_VIEWED_COOKIE_PREFIX = 'CS_ALERT_VIEWED';\nexport const CS_CURRENT_LANGUAGE = 'CS_CURRENT_LANGUAGE';\nexport const CS_ANONYMOUS_ID_COOKIE = 'CS_ANONYMOUS_ID';\n\n// Expiry (in milliseconds)\nexport const EXPIRE_3DAYS = 259200000;\n","import { getCookie, setCookie } from './cookies';\nimport { CS_PUBLISHER_ID, EXPIRE_3DAYS } from './constants';\n\n/**\n * Directly set the publisher cookie to `body` with no validation\n */\nconst setPublisherCookieValue = (body) =>\n setCookie(CS_PUBLISHER_ID, body, {\n expires: new Date(Date.now() + EXPIRE_3DAYS),\n });\n\n/**\n * Sets the CS_PUBLISHER_ID cookie if utm_source + utm_medium is present in search params\n * @param {String} searchParams\n */\nexport const setPublisherCookie = (searchParams = '') => {\n const urlParams = new URLSearchParams(searchParams);\n const publisherId = urlParams.get('utm_source');\n const transactionId = urlParams.get('utm_medium');\n const campaignId = urlParams.get('utm_campaign');\n if (publisherId && transactionId) {\n setPublisherCookieValue({\n publisherId,\n transactionId,\n ...(campaignId && { campaignId }),\n });\n }\n};\n\n/**\n * Returns CS_PUBLISHER_ID cookie or {} if it does not exist\n */\nexport const getPublisherCookie = () => getCookie(CS_PUBLISHER_ID) || {};\n\n/**\n * Returns CS_PUBLISHER_ID cookie (if present) as the original map\n * of `utm_xxx` to value as opposed to the mappings above (`publisherId` etc.)\n */\nexport const getPublisherCookieUTM = () => {\n const { publisherId, transactionId, campaignId, sentToBackend } = getPublisherCookie();\n\n if (!publisherId || !transactionId) {\n return {};\n }\n\n return {\n utm_source: publisherId,\n utm_medium: transactionId,\n ...(campaignId && { utm_campaign: campaignId }),\n ...(sentToBackend && { sentToBackend }),\n };\n};\n\n/**\n * Check if a given publisher cookie has been sent to the backend\n * @param {Object} publisherCookie Publisher cookie as returned from `getPublisherCookie`\n */\nexport const publisherCookieIsSentToBackend = (publisherCookie) => !!publisherCookie.sentToBackend;\n\n/**\n * Mark the publisher cookie as \"sent to the backend\" so we can avoid sending it again\n */\nexport const markPublisherCookieAsSentToBackend = () => {\n const pubCookie = getPublisherCookie();\n\n if (Object.entries(pubCookie).length > 0 && !publisherCookieIsSentToBackend(pubCookie)) {\n setPublisherCookieValue({\n ...pubCookie,\n sentToBackend: true,\n });\n }\n};\n","/* eslint-disable camelcase */\nimport { setCookie, getCookie, removeCookie } from './cookies';\nimport * as constants from './constants';\n\n// needed for the remember-me checkbox on login\n// work around since you can not use JS APIs to calculate if a cookie has 'expires' set\n// We create a session with 'expires', then when changing language, or refreshing a token, we update the cookie.\n// except, 'updating' cookies is impossible, so we need to cache the unreachable properties of the cookie\nconst CS_SESSION_EXPIRES = 'CS_SESSION_EXPIRES';\nconst setExpires = (expiresDate) => {\n window[CS_SESSION_EXPIRES] = expiresDate;\n};\nconst getExpires = () => window[CS_SESSION_EXPIRES];\n\n/**\n * Sets the session cookie\n * @param session.sessionToken\n * @param session.accountId\n * @param session.username\n * @param session.market\n * @todo SESSION - remove old auth flow when LLT/2FA is live\n */\nexport const setSessionCookie = ({ market, access_token, refresh_token, session_id, remember, o_token, locale }) => {\n const expiresDate = new Date(new Date().setFullYear(new Date().getFullYear() + 1));\n setExpires(remember ? expiresDate : undefined);\n setCookie(\n constants.CS_SESSION_COOKIE,\n {\n access_token,\n refresh_token,\n session_id,\n o_token,\n market: market.toLowerCase(),\n ...(locale ? { locale } : {}),\n },\n {\n ...(remember && {\n expires: getExpires(),\n }),\n },\n );\n};\n/* eslint-enable camelcase */\n\n/**\n * Update the session cookie\n */\nexport const updateSessionCookie = (data) => {\n const cookie = getCookie(constants.CS_SESSION_COOKIE);\n setSessionCookie({\n ...cookie,\n ...data,\n remember: !!getExpires(),\n });\n};\n\n/**\n * Get the session cookie\n */\nexport const getSessionCookie = () => getCookie(constants.CS_SESSION_COOKIE);\n\n/**\n * Removes the session cookie\n */\nexport const removeSessionCookie = () => {\n removeCookie(constants.CS_SESSION_COOKIE);\n};\n\nexport default setSessionCookie;\n","import { getCookie, setCookie } from './cookies';\nimport { CS_ALERT_VIEWED_COOKIE_PREFIX } from './constants';\n\nconst getKeyForAlertId = (alertId) => `${CS_ALERT_VIEWED_COOKIE_PREFIX}_${alertId.toUpperCase()}`;\n\nexport const setAlertCookie = (alertId, alertCooldown) => {\n const key = getKeyForAlertId(alertId);\n\n setCookie(key, true, {\n expires: new Date(Date.now() + alertCooldown),\n });\n};\n\nexport const getAlertCookie = (alertId) => getCookie(getKeyForAlertId(alertId)) || null;\n\nexport const hasCookieForAlert = (alertId) => getAlertCookie(alertId) !== null;\n","// Generate UUID\nfunction s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n}\n\nfunction getId() {\n // eslint-disable-next-line no-undef\n return typeof crypto !== 'undefined' && typeof crypto?.randomUUID === 'function'\n ? // eslint-disable-next-line no-undef\n crypto.randomUUID()\n : // TODO: remove when everything is on node 16 and browser support is stable\n `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\n}\n\nexport default getId;\n\nexport function addIdToItem(item) {\n return {\n ...item,\n id: item.id ? item.id : getId(),\n };\n}\n\nexport function addIdToCollectionItems(collection) {\n return collection.map(addIdToItem);\n}\n","import getUid from '@clearscore-group/lib.helpers.uid';\n\nimport { getCookie, setCookie, removeCookie } from './cookies';\nimport { CS_ANONYMOUS_ID_COOKIE } from './constants';\n\nconst ONE_YEAR = new Date(new Date().setFullYear(new Date().getFullYear() + 1));\n\nconst setAnonymousCookie = (anonymousId) => {\n setCookie(CS_ANONYMOUS_ID_COOKIE, anonymousId, {\n expires: ONE_YEAR,\n });\n setCookie('ajs_anonymous_id', anonymousId, {\n expires: ONE_YEAR,\n });\n};\n\n/*\nThis function is both a getter and a setter, the reason for this is because we have\nusers may have an ajs_anonymous_id cookie already set. We want to use this if they do\n(and set CS_ANONYMOUS_ID to this value) and set it if they don't just in case they ever do\nload Segment (browser change etc). These cookies should ALWAYS match and we should try\nand get the ajs_anonymous_id cookie first, then CS_ANONYMOUS_ID, then generate and set\nboth to that value, the order matters.\n\nAt the time of writing, we are using Segment library on the website/webapp and also\ntracking via `tracking-event-receiver`.\n*/\nexport const orchestrateAnonymousCookie = () => {\n const segmentAnonId = getCookie('ajs_anonymous_id');\n const csAnonId = getCookie(CS_ANONYMOUS_ID_COOKIE);\n\n // If both cookies are undefined or they don't match we need to refresh the cookies to make the match\n const shouldRefreshAnonymousId = (!csAnonId && !segmentAnonId) || csAnonId !== segmentAnonId;\n\n if (shouldRefreshAnonymousId) {\n const uid = segmentAnonId || csAnonId || getUid();\n\n setAnonymousCookie(uid);\n\n return uid;\n }\n\n // We want to keep the TTL on the cookies at 1 year\n setAnonymousCookie(csAnonId);\n\n return csAnonId;\n};\n\nexport const removeAnonymousCookie = () => removeCookie(CS_ANONYMOUS_ID_COOKIE);\n","import {\n setCookie as setHelper,\n getCookie as getHelper,\n removeCookie as removeHelper,\n getAllCookies as getAllHelper,\n} from './cookies';\nimport {\n setPublisherCookie as setPublisherHelper,\n getPublisherCookie as getPublisherHelper,\n getPublisherCookieUTM as getPublisherUTMHelper,\n publisherCookieIsSentToBackend as publisherIsSentToBackendHelper,\n markPublisherCookieAsSentToBackend as markPublisherAsSentToBackendHelper,\n} from './cookies-publisher';\nimport {\n setPersonCookie as setPersonHelper,\n getPersonCookie as getPersonHelper,\n removePersonCookie as removePersonHelper,\n} from './cs-person';\nimport {\n setVisitedSiteCookie as setVisitedSiteHelper,\n getVisitedSiteCookie as getVisitedSiteHelper,\n removeVisitedSiteCookie as removeVisitedSiteHelper,\n} from './visited-site';\nimport {\n setSessionCookie as setSessionHelper,\n getSessionCookie as getSessionHelper,\n updateSessionCookie as updateSessionHelper,\n removeSessionCookie as removeSessionHelper,\n} from './cookies-session';\nimport {\n getAlertCookie as getAlertHelper,\n setAlertCookie as setAlertHelper,\n hasCookieForAlert as hasCookieForAlertHelper,\n} from './cookies-alerts';\nimport {\n removeAnonymousCookie as removeAnonymousCookieHelper,\n orchestrateAnonymousCookie as orchestrateAnonymousCookieHelper,\n} from './anonymous-id';\nimport * as consts from './constants';\n\nexport const getAllCookies = getAllHelper;\nexport const setCookie = setHelper;\nexport const getCookie = getHelper;\nexport const removeCookie = removeHelper;\nexport const getPersonCookie = getPersonHelper;\nexport const setPersonCookie = setPersonHelper;\nexport const removePersonCookie = removePersonHelper;\nexport const getVisitedSiteCookie = getVisitedSiteHelper;\nexport const setVisitedSiteCookie = setVisitedSiteHelper;\nexport const removeVisitedSiteCookie = removeVisitedSiteHelper;\nexport const getPublisherCookie = getPublisherHelper;\nexport const setPublisherCookie = setPublisherHelper;\nexport const getPublisherCookieUTM = getPublisherUTMHelper;\nexport const publisherCookieIsSentToBackend = publisherIsSentToBackendHelper;\nexport const markPublisherCookieAsSentToBackend = markPublisherAsSentToBackendHelper;\nexport const setSessionCookie = setSessionHelper;\nexport const getSessionCookie = getSessionHelper;\nexport const updateSessionCookie = updateSessionHelper;\nexport const removeSessionCookie = removeSessionHelper;\nexport const getAlertCookie = getAlertHelper;\nexport const setAlertCookie = setAlertHelper;\nexport const hasCookieForAlert = hasCookieForAlertHelper;\nexport const removeAnonymousCookie = removeAnonymousCookieHelper;\nexport const orchestrateAnonymousCookie = orchestrateAnonymousCookieHelper;\nexport const constants = consts;\n","import { getCookie, setCookie, removeCookie } from './cookies';\nimport { CS_PERSON_COOKIE } from './constants';\n\nconst second = 1000;\nconst minute = second * 60;\nconst thirtyMinutes = minute * 30;\n\nexport const setPersonCookie = (personIdentifier) => {\n setCookie(CS_PERSON_COOKIE, personIdentifier, {\n expires: new Date(new Date().getTime() + thirtyMinutes),\n });\n};\n\nexport const getPersonCookie = () => getCookie(CS_PERSON_COOKIE);\n\nexport const removePersonCookie = () => removeCookie(CS_PERSON_COOKIE);\n","import { getCookie, setCookie, removeCookie } from './cookies';\nimport { VISITED_SITE_COOKIE_NAME } from './constants';\n\nconst second = 1000;\nconst minute = second * 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst oneYear = day * 365;\n\nexport const setVisitedSiteCookie = (userIdentifier) => {\n setCookie(VISITED_SITE_COOKIE_NAME, userIdentifier, {\n expires: new Date(new Date().getTime() + oneYear),\n });\n};\n\nexport const getVisitedSiteCookie = () => getCookie(VISITED_SITE_COOKIE_NAME);\n\nexport const removeVisitedSiteCookie = () => removeCookie(VISITED_SITE_COOKIE_NAME);\n","import { GLOBAL, EN_GB } from '@clearscore-group/lib.config.i18n';\nimport { getSessionCookie } from '@clearscore-group/lib.helpers.cookies';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getCurrentMarketDetails = () => {\n const sessionToken = getSessionCookie();\n const marketSessionToken = resolveProp('market', sessionToken);\n const localeSessionToken = resolveProp('locale', sessionToken);\n\n return {\n marketSessionToken,\n localeSessionToken,\n };\n};\n\nexport const getActiveMarket = () => {\n const { marketSessionToken } = getCurrentMarketDetails();\n return marketSessionToken || GLOBAL;\n};\n\nexport const getActiveLocale = () => {\n const { marketSessionToken, localeSessionToken } = getCurrentMarketDetails();\n\n if (localeSessionToken) return localeSessionToken;\n if (marketSessionToken) return `en-${marketSessionToken}`;\n return EN_GB;\n};\n","import { MARKETS, LOCALES } from '@clearscore-group/lib.config.i18n';\nimport * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\n\nimport { getActiveLocale, getActiveMarket } from '../lib/helpers';\nimport {\n MARKET_SET_LOCALES,\n MARKET_SET_MARKETS,\n MARKET_SET_ACTIVE_LOCALE,\n MARKET_SET_ACTIVE_MARKET,\n MARKET_FETCH_CONFIG,\n MARKET_FETCH_CONFIG_PENDING,\n MARKET_FETCH_CONFIG_ERROR,\n MARKET_FETCH_CONFIG_SUCCESS,\n MARKET_FETCH_STATIC_CONFIG,\n MARKET_FETCH_STATIC_CONFIG_SUCCESS,\n MARKET_FETCH_SDUI_CONFIG_SUCCESS,\n} from '../types';\n\nconst initialState = () => ({\n checkStatus: requestStatuses.INITIAL,\n fetchStatus: requestStatuses.INITIAL,\n activeMarket: getActiveMarket(),\n activeLocale: getActiveLocale(),\n markets: MARKETS,\n locales: LOCALES,\n fluxRoutes: [],\n fluxEnvs: {},\n});\n\nconst domain = (state = initialState(), action = {}) => {\n const { type, payload } = action;\n\n switch (type) {\n case MARKET_FETCH_CONFIG:\n case MARKET_FETCH_CONFIG_PENDING: // allow core to be aware of pending updates, without re-fetching the config\n case MARKET_FETCH_STATIC_CONFIG:\n return {\n ...state,\n fetchStatus: requestStatuses.PENDING,\n };\n case MARKET_FETCH_CONFIG_SUCCESS:\n case MARKET_FETCH_STATIC_CONFIG_SUCCESS:\n return {\n ...state,\n fluxApp: payload?.app || '',\n fluxRoutes: payload?.routes || [],\n fluxSegementation: payload?.segmentation,\n fluxEnvs: payload?.envs || {},\n fetchStatus: requestStatuses.SUCCESS,\n };\n case MARKET_FETCH_CONFIG_ERROR:\n return {\n ...state,\n fetchStatus: requestStatuses.ERROR,\n };\n case MARKET_SET_ACTIVE_MARKET: {\n return {\n ...state,\n activeMarket: (payload && payload.market) || initialState().activeMarket,\n activeLocale: (payload && `en-${payload.market}`) || initialState().activeLocale,\n };\n }\n case MARKET_SET_ACTIVE_LOCALE:\n return {\n ...state,\n activeLocale: payload || initialState().activeLocale,\n };\n case MARKET_SET_LOCALES:\n return {\n ...state,\n locales: payload || initialState().locales,\n };\n case MARKET_SET_MARKETS:\n return {\n ...state,\n markets: payload || initialState().markets,\n };\n case MARKET_FETCH_SDUI_CONFIG_SUCCESS:\n return {\n ...state,\n sduiConfig: payload,\n };\n default:\n return state;\n }\n};\n\nexport default domain;\n","/* eslint-disable import/prefer-default-export */\nimport marketDomain from './domain';\n\nexport const domain = marketDomain;\n","import { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\n\nexport const getRequestStatus = (status, statusCode) => ({\n isInitial: status === requestStatuses.INITIAL,\n isPending: status === requestStatuses.PENDING,\n isComplete: status === requestStatuses.SUCCESS,\n hasFailed: status === requestStatuses.ERROR,\n statusCode,\n});\n\nconst calculateIsCompleteMultiple = (statusList) => {\n if (statusList.every((status) => status === requestStatuses.SUCCESS)) return true;\n if (statusList.every((status) => status === requestStatuses.ERROR)) return false;\n\n return statusList\n .map((status) => status === requestStatuses.SUCCESS || status === requestStatuses.ERROR)\n .every(Boolean);\n};\n\nexport const getRequestStatusMultiple = (statusList = [], statusCodes = []) => {\n const hasStatuses = statusList.length;\n\n return {\n isInitial: hasStatuses ? statusList.every((status) => status === requestStatuses.INITIAL) : true,\n isPending: statusList.some((status) => status === requestStatuses.PENDING),\n isComplete: hasStatuses ? calculateIsCompleteMultiple(statusList) : false,\n hasFailed: hasStatuses ? statusList.every((status) => status === requestStatuses.ERROR) : false,\n hasFailures: statusList.some((status) => status === requestStatuses.ERROR),\n statusCodes,\n };\n};\n\nexport default (state, prop) => {\n const props = prop.split('.');\n const hasValidRootReducer = props.length === 1 ? state : state[props[0]];\n if (hasValidRootReducer) {\n return resolveProp(prop, state) || requestStatuses.INITIAL;\n }\n console.error(`Cannot resolve root state for prop: ${prop}`); // eslint-disable-line no-console\n return requestStatuses.ERROR;\n};\n","import { createSelector } from 'reselect';\nimport resolveRequest, { getRequestStatus } from '@clearscore-group/lib.helpers.resolve-request';\n\nconst resolveFetchStatus = (state) => resolveRequest(state, 'market.fetchStatus');\n\nexport default createSelector(resolveFetchStatus, (fetchStatus) => getRequestStatus(fetchStatus));\n","import { createSelector } from 'reselect';\nimport resolveRequest, { getRequestStatus } from '@clearscore-group/lib.helpers.resolve-request';\n\nimport getFetchStatus from './getFetchStatus';\n\nconst getCheckStatus = (state) => resolveRequest(state, 'market.checkStatus');\n\nexport default createSelector(getCheckStatus, getFetchStatus, (checkStatus, fetchStatus) => ({\n check: getRequestStatus(checkStatus),\n fetch: fetchStatus,\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst marketsSelector = (state) => resolveProp('market.markets', state);\n\nexport default createSelector(marketsSelector, (markets) => markets);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst activeMarketSelector = (state) => resolveProp('market.activeMarket', state);\n\nexport default createSelector(activeMarketSelector, (activeMarket) => activeMarket);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst localesSelector = (state) => resolveProp('market.locales', state);\n\nexport default createSelector(localesSelector, (locales = []) => locales);\n","const legacyMap = {\n uk: 'en-gb',\n za: 'en-za',\n};\n\nexport default legacyMap;\n","import { createSelector } from 'reselect';\n\nimport legacyMap from './legacyMap';\n\nconst localeSelector = (state = {}) => state.locale;\nconst getActiveLanguage = (locale = {}) => ((locale && locale.languages) || []).find((copy) => copy.active === true);\n\nexport default createSelector(localeSelector, (locale) => {\n const activeLanguage = getActiveLanguage(locale) || {};\n const activeLocale = activeLanguage.languageCode || activeLanguage.code;\n return legacyMap[activeLocale] || activeLocale || 'en-gb';\n});\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nimport getLegacyLanguageCode from './legacy/legacy.getLangCode';\nimport localesSelector from './getLocales';\n\nconst activeLocaleSelector = (state) => resolveProp('market.activeLocale', state);\n\nexport default createSelector(\n activeLocaleSelector,\n localesSelector,\n getLegacyLanguageCode,\n (locale = '', locales = [], legacyLocale = '') =>\n locales.find((item) => item === locale) || legacyLocale || 'en-gb',\n);\n","import { createSelector } from 'reselect';\n\nimport getActiveMarket from './getActiveMarket.js';\n\nexport default createSelector(\n getActiveMarket,\n (activeMarket) => (marketConfig) => marketConfig[activeMarket] || marketConfig.gb || {},\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getResolution = (state) => resolveProp('market.resolution', state) || 'ip';\n\nexport default createSelector(getResolution, (resolution) => resolution);\n","import { createSelector } from 'reselect';\n\nimport getActiveLocale from './getActiveLocale';\n\nexport default createSelector(getActiveLocale, (locale) => (copy) => copy[locale] || copy['en-gb'] || copy.uk);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getSDUIConfig = (state) => resolveProp('market.sduiConfig', state);\n\nexport default createSelector(getSDUIConfig, (sduiConfig) => sduiConfig);\n","import marketGetPredicate from './getPredicate';\nimport marketGetFetchStatus from './getFetchStatus';\nimport marketGetMarkets from './getMarkets';\nimport marketGetActiveMarket from './getActiveMarket';\nimport marketGetLocales from './getLocales';\nimport marketGetActiveLocale from './getActiveLocale';\nimport marketGetConfig from './getConfig';\nimport marketGetResolution from './getResolution';\nimport marketLegacyGetLanguage from './legacy.getLanguage';\nimport marketGetSDUIConfig from './getSDUIConfig';\n\nexport const getPredicate = marketGetPredicate;\nexport const getFetchStatus = marketGetFetchStatus;\nexport const getConfig = marketGetConfig;\nexport const getMarkets = marketGetMarkets;\nexport const getActiveMarket = marketGetActiveMarket;\nexport const getLocales = marketGetLocales;\nexport const getActiveLocale = marketGetActiveLocale;\nexport const getResolution = marketGetResolution;\nexport const getLegacyLanguage = marketLegacyGetLanguage;\nexport const getSDUIConfig = marketGetSDUIConfig;\n","import { GB, ZA, GLOBAL, MARKETS, EN_GB, EN_ZA, LOCALES } from '@clearscore-group/lib.config.i18n';\n\nimport {\n setActiveLocale,\n setActiveMarket,\n setMarketsEnvs,\n setLocales,\n setMarkets,\n fetchMarketConfig,\n setFetchPending,\n fetchStaticMarketConfig,\n fetchSduiMarketConfig,\n} from './actions';\nimport {\n MARKET_SET_ACTIVE_LOCALE,\n MARKET_SET_ACTIVE_MARKET,\n MARKET_SET_LOCALES,\n MARKET_SET_MARKETS,\n MARKET_SET_ENVS,\n MARKET_FETCH_CONFIG,\n MARKET_FETCH_CONFIG_PENDING,\n MARKET_FETCH_CONFIG_ERROR,\n MARKET_FETCH_CONFIG_SUCCESS,\n MARKET_FETCH_STATIC_CONFIG,\n MARKET_FETCH_STATIC_CONFIG_ERROR,\n MARKET_FETCH_STATIC_CONFIG_SUCCESS,\n MARKET_FETCH_SDUI_CONFIG,\n MARKET_FETCH_SDUI_CONFIG_ERROR,\n MARKET_FETCH_SDUI_CONFIG_PENDING,\n MARKET_FETCH_SDUI_CONFIG_SUCCESS,\n} from './types';\nimport { domain } from './reducers';\nimport {\n getPredicate,\n getFetchStatus,\n getConfig,\n getActiveLocale,\n getActiveMarket,\n getLocales,\n getMarkets,\n getResolution,\n getLegacyLanguage,\n getSDUIConfig,\n} from './selectors/index';\n\nexport * as helpers from './lib/helpers';\n\nexport const actions = {\n setActiveLocale,\n setActiveMarket,\n setMarkets,\n setLocales,\n setMarketsEnvs,\n fetchMarketConfig,\n fetchSduiMarketConfig,\n setFetchPending,\n fetchStaticMarketConfig,\n};\nexport const types = {\n MARKET_SET_ACTIVE_LOCALE,\n MARKET_SET_ACTIVE_MARKET,\n MARKET_SET_MARKETS,\n MARKET_SET_LOCALES,\n MARKET_SET_ENVS,\n MARKET_FETCH_CONFIG,\n MARKET_FETCH_CONFIG_PENDING,\n MARKET_FETCH_CONFIG_ERROR,\n MARKET_FETCH_CONFIG_SUCCESS,\n MARKET_FETCH_STATIC_CONFIG,\n MARKET_FETCH_STATIC_CONFIG_ERROR,\n MARKET_FETCH_STATIC_CONFIG_SUCCESS,\n MARKET_FETCH_SDUI_CONFIG,\n MARKET_FETCH_SDUI_CONFIG_ERROR,\n MARKET_FETCH_SDUI_CONFIG_PENDING,\n MARKET_FETCH_SDUI_CONFIG_SUCCESS,\n};\n/* export for backward compatibility, however these should be imported directly \nfrom @clearscore-group/lib.config.i18n */\nexport const constants = { GB, ZA, GLOBAL, MARKETS, EN_GB, EN_ZA, LOCALES };\nexport const reducers = { domain };\nexport const selectors = {\n getFetchStatus,\n getPredicate,\n getConfig,\n getLocales,\n getMarkets,\n getActiveMarket,\n getActiveLocale,\n getResolution,\n getLegacyLanguage,\n getSDUIConfig,\n};\n","import createAction from '@clearscore-group/lib.helpers.create-action';\nimport createRequestPayload from '@clearscore-group/lib.helpers.create-request-payload';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\n\nimport { getWebviewAppVersion } from './utils';\nimport {\n MARKET_SET_LOCALES,\n MARKET_SET_ACTIVE_LOCALE,\n MARKET_SET_MARKETS,\n MARKET_SET_ACTIVE_MARKET,\n MARKET_SET_ENVS,\n MARKET_FETCH_CONFIG,\n MARKET_FETCH_CONFIG_PENDING,\n MARKET_FETCH_STATIC_CONFIG,\n MARKET_FETCH_SDUI_CONFIG,\n} from './types';\n\nexport const setMarkets = (markets) => ({ type: MARKET_SET_MARKETS, payload: markets });\n\nexport const setLocales = (locales) => ({ type: MARKET_SET_LOCALES, payload: locales });\n\nexport const setMarketsEnvs = (envs) => ({ type: MARKET_SET_ENVS, payload: envs });\n\nexport const setActiveMarket = (market) => createAction(MARKET_SET_ACTIVE_MARKET, { market });\n\nexport const setFetchPending = () => ({ type: MARKET_FETCH_CONFIG_PENDING });\n\nexport const fetchMarketConfig = (market) => {\n const meta = {\n market,\n };\n const timeout = getEnv('MARKET_REQUEST_TIMEOUT') || 1000;\n const appVersion = getWebviewAppVersion();\n\n const headers = {\n 'x-app-id': getEnv('APP'),\n 'x-market-id': market,\n ...(appVersion && { 'x-cs-app-version': appVersion }),\n };\n\n return createAction(\n MARKET_FETCH_CONFIG,\n createRequestPayload('international', '/render-engine-local/v1/config', 'get', null, meta, headers, timeout),\n );\n};\n\nexport const fetchSduiMarketConfig = () =>\n createAction(MARKET_FETCH_SDUI_CONFIG, createRequestPayload('international', '/sdc-feature/v1/config', 'get'));\n\nexport const fetchStaticMarketConfig = (market) =>\n createAction(MARKET_FETCH_STATIC_CONFIG, {\n ...createRequestPayload(\n 'renderEngine',\n `${market}.json?version=${getEnv(`${market.toUpperCase()}_VERSION`) || '1'}`,\n ),\n market,\n });\n\nexport const setActiveLocale = (activeLocale) => createAction(MARKET_SET_ACTIVE_LOCALE, activeLocale);\n","import type { Dispatch, Middleware, Reducer, Store } from 'redux';\nimport { combineReducers, createStore } from 'redux';\nimport { connectRouter, routerMiddleware, ConnectedRouter } from 'connected-react-router';\nimport createActionBridgeMiddleware from '@clearscore-group/lib.redux.action-bridge-middleware';\nimport type { Epic } from 'redux-observable';\nimport { combineEpics, createEpicMiddleware } from 'redux-observable';\nimport type { MemoryHistory, History } from 'history';\nimport { createMemoryHistory, createBrowserHistory } from 'history';\n// import { createBrowserHistory } from 'history'; // <-- this does not work in verticals with v4.9.0\n// import createBrowserHistory from 'history/createBrowserHistory';\nimport * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\nimport { reducers as marketReducers } from '@clearscore-group/lib.redux.market';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\nimport { Provider as ReduxProvider } from 'react-redux';\n\n// TODO: with our current setup they get included anyways\n// only that these tools never get initialized. Once modules are ready\n// we can conditionally handle this in a better way, like `import()` [TC]\nimport composeWithTools from './assets/development';\n\nexport const Provider = ReduxProvider;\nexport const Router = ConnectedRouter;\nexport const browserHistory = (basename = ''): History | MemoryHistory =>\n canUseDom() ? createBrowserHistory({ basename }) : createMemoryHistory({ initialEntries: [basename || '/'] });\n\ntype NestedReducer = Record;\n\nconst isCombined = (reducers?: S | Record): reducers is S => typeof reducers === 'function';\n\nexport const combineNestedReducers = (reducers: NestedReducer): Reducer => {\n const nestedReducers = Object.keys(reducers).reduce(\n (prev, reducer) => ({\n ...prev,\n [reducer]: typeof reducers[reducer] === 'function' ? reducers[reducer] : combineReducers(reducers[reducer]),\n }),\n {},\n );\n return combineReducers(nestedReducers);\n};\n\ninterface ComposeMiddleWaresOptions {\n pageMiddleWare: Middleware[];\n actionBridgeMiddleWare?: Middleware;\n epicMiddleWare?: Middleware;\n routerMiddleWare?: Middleware;\n}\n\nexport const composeMiddleWares = ({\n pageMiddleWare = [],\n actionBridgeMiddleWare,\n epicMiddleWare,\n routerMiddleWare,\n}: ComposeMiddleWaresOptions): Middleware[] =>\n [actionBridgeMiddleWare, epicMiddleWare, routerMiddleWare, ...pageMiddleWare].filter(\n (maybeMiddleware: Middleware | undefined): maybeMiddleware is Middleware => Boolean(maybeMiddleware),\n );\n\n// Can't use `?` as optional argument, since `reducers` is not in last position so it has\n// to be explicitly typed as `undefined`\nconst createRootReducer = (reducers: Reducer | NestedReducer | undefined, baseReducers: NestedReducer): Reducer => {\n const combinedReducers = isCombined(reducers)\n ? reducers\n : combineNestedReducers({ ...baseReducers, ...reducers });\n\n return (state, action) => {\n if ([sessionTypes.LOGOUT_SUBMIT, sessionTypes.TIMEOUT_SUCCESS].includes(action.type)) {\n return combinedReducers(undefined, action);\n }\n return combinedReducers(state, action);\n };\n};\n\ninterface ConfigStoreOptions {\n initialState?: Record;\n reducers?: Reducer | NestedReducer;\n name?: string;\n appBridgeTypes?: string[];\n coreDispatch?: Dispatch;\n pageMiddleWare?: Middleware[];\n pageEpics?: Record;\n history?: History;\n}\n\n/**\n * Returns store\n * @param initialState\n * @param reducers\n * @param name\n * @param appBridgeTypes\n * @param coreDispatch\n * @param pageMiddleWare\n * @param pageEpics\n * @param history\n * @return Object\n * */\nexport default function configureStore({\n initialState = {},\n reducers,\n name,\n appBridgeTypes = [],\n coreDispatch,\n pageMiddleWare = [],\n pageEpics,\n history = browserHistory(),\n}: ConfigStoreOptions = {}): Store {\n const epicMiddleWare = pageEpics && createEpicMiddleware();\n const actionBridgeMiddleWare = coreDispatch && createActionBridgeMiddleware(coreDispatch, appBridgeTypes);\n\n const middleWares = composeMiddleWares({\n pageMiddleWare,\n actionBridgeMiddleWare,\n epicMiddleWare,\n routerMiddleWare: routerMiddleware(history),\n });\n\n const rootReducer = createRootReducer(reducers, {\n router: connectRouter(history),\n market: marketReducers.domain,\n });\n\n const enhancer = composeWithTools({ name, middleWares });\n const store = createStore(rootReducer, initialState, enhancer);\n\n if (pageEpics) {\n epicMiddleWare?.run(isCombined(pageEpics) ? pageEpics : combineEpics(...Object.values(pageEpics)));\n }\n\n return store;\n}\n","import { Subject, from, queueScheduler } from 'rxjs';\nimport { map, mergeMap, observeOn, subscribeOn } from 'rxjs/operators';\nimport { ActionsObservable } from './ActionsObservable';\nimport { StateObservable } from './StateObservable';\nimport { warn } from './utils/console';\n\nexport function createEpicMiddleware() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n // This isn't great. RxJS doesn't publicly export the constructor for\n // QueueScheduler nor QueueAction, so we reach in. We need to do this because\n // we don't want our internal queuing mechanism to be on the same queue as any\n // other RxJS code outside of redux-observable internals.\n var QueueScheduler = queueScheduler.constructor;\n var uniqueQueueScheduler = new QueueScheduler(queueScheduler.SchedulerAction);\n\n if (process.env.NODE_ENV !== 'production' && typeof options === 'function') {\n throw new TypeError('Providing your root Epic to `createEpicMiddleware(rootEpic)` is no longer supported, instead use `epicMiddleware.run(rootEpic)`\\n\\nLearn more: https://redux-observable.js.org/MIGRATION.html#setting-up-the-middleware');\n }\n\n var epic$ = new Subject();\n var store = void 0;\n\n var epicMiddleware = function epicMiddleware(_store) {\n if (process.env.NODE_ENV !== 'production' && store) {\n // https://github.com/redux-observable/redux-observable/issues/389\n warn('this middleware is already associated with a store. createEpicMiddleware should be called for every store.\\n\\nLearn more: https://goo.gl/2GQ7Da');\n }\n store = _store;\n var actionSubject$ = new Subject().pipe(observeOn(uniqueQueueScheduler));\n var stateSubject$ = new Subject().pipe(observeOn(uniqueQueueScheduler));\n var action$ = new ActionsObservable(actionSubject$);\n var state$ = new StateObservable(stateSubject$, store.getState());\n\n var result$ = epic$.pipe(map(function (epic) {\n var output$ = 'dependencies' in options ? epic(action$, state$, options.dependencies) : epic(action$, state$);\n\n if (!output$) {\n throw new TypeError('Your root Epic \"' + (epic.name || '') + '\" does not return a stream. Double check you\\'re not missing a return statement!');\n }\n\n return output$;\n }), mergeMap(function (output$) {\n return from(output$).pipe(subscribeOn(uniqueQueueScheduler), observeOn(uniqueQueueScheduler));\n }));\n\n result$.subscribe(store.dispatch);\n\n return function (next) {\n return function (action) {\n // Downstream middleware gets the action first,\n // which includes their reducers, so state is\n // updated before epics receive the action\n var result = next(action);\n\n // It's important to update the state$ before we emit\n // the action because otherwise it would be stale\n stateSubject$.next(store.getState());\n actionSubject$.next(action);\n\n return result;\n };\n };\n };\n\n epicMiddleware.run = function (rootEpic) {\n if (process.env.NODE_ENV !== 'production' && !store) {\n warn('epicMiddleware.run(rootEpic) called before the middleware has been setup by redux. Provide the epicMiddleware instance to createStore() first.');\n }\n epic$.next(rootEpic);\n };\n\n return epicMiddleware;\n}","/* eslint-disable prefer-spread */\n/* eslint-disable prefer-template */\n// must be ie11 compatible\nimport * as logger from 'redux-logger';\nimport type * as Redux from 'redux';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\nimport { compose, applyMiddleware } from 'redux';\n\nconst regex = /@@redux-form\\/(BLUR|FOCUS|CHANGE)/g;\n\nfunction logging(name?: string): Redux.Middleware {\n // redux-logger has issue for this https://github.com/LogRocket/redux-logger/issues/233\n // rollup and webpack seem to understand it's build in different way, so need to check,\n // which one is fine\n // @ts-expect-error ts-middleware-issue\n const createLogger: typeof logger.createLogger = logger.__moduleExports\n ? // @ts-expect-error ts-middleware-issue\n logger.__moduleExports.createLogger\n : logger.createLogger;\n return createLogger({\n collapsed: function collapsed(getState, action, logEntry) {\n return !logEntry?.error;\n },\n titleFormatter: function titleFormatter(action, time, took) {\n return '[' + name + '] ' + action.type + ' (' + took.toFixed(2) + 'ms)';\n },\n predicate: function predicate(getState, action) {\n return !action.type.match(regex);\n },\n });\n}\n\ndeclare global {\n interface Window {\n __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;\n }\n}\n\nconst composeWithDevTools =\n // eslint-disable-next-line ssr-friendly/no-dom-globals-in-module-scope\n canUseDom() && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__\n : // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n function () {\n if (arguments.length === 0) return undefined;\n // eslint-disable-next-line prefer-rest-params\n if (typeof arguments[0] === 'object') return compose;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return compose.apply(null, arguments); // eslint-disable-line prefer-rest-params, @typescript-eslint/ban-ts-comment, max-len\n };\n\nfunction composeWithTools(options: {\n middleWares: Redux.Middleware[];\n name?: string;\n}): Redux.StoreEnhancer<{ dispatch: unknown }, unknown> {\n if (process.env.DEBUG) {\n options.middleWares.unshift(logging(options.name));\n // @ts-expect-error ts-middleware-issue\n return composeWithDevTools({ name: options.name })(applyMiddleware.apply(null, options.middleWares));\n }\n return compose(applyMiddleware.apply(null, options.middleWares));\n}\n\nexport default composeWithTools;\n","function getLastOfPath(object, path, Empty) {\n function cleanKey(key) {\n return key && key.indexOf('###') > -1 ? key.replace(/###/g, '.') : key;\n }\n\n function canNotTraverseDeeper() {\n return !object || typeof object === 'string';\n }\n\n var stack = typeof path !== 'string' ? [].concat(path) : path.split('.');\n\n while (stack.length > 1) {\n if (canNotTraverseDeeper()) return {};\n var key = cleanKey(stack.shift());\n if (!object[key] && Empty) object[key] = new Empty();\n object = object[key];\n }\n\n if (canNotTraverseDeeper()) return {};\n return {\n obj: object,\n k: cleanKey(stack.shift())\n };\n}\n\nexport function setPath(object, path, newValue) {\n var _getLastOfPath = getLastOfPath(object, path, Object),\n obj = _getLastOfPath.obj,\n k = _getLastOfPath.k;\n\n obj[k] = newValue;\n}\nexport function pushPath(object, path, newValue, concat) {\n var _getLastOfPath2 = getLastOfPath(object, path, Object),\n obj = _getLastOfPath2.obj,\n k = _getLastOfPath2.k;\n\n obj[k] = obj[k] || [];\n if (concat) obj[k] = obj[k].concat(newValue);\n if (!concat) obj[k].push(newValue);\n}\nexport function getPath(object, path) {\n var _getLastOfPath3 = getLastOfPath(object, path),\n obj = _getLastOfPath3.obj,\n k = _getLastOfPath3.k;\n\n if (!obj) return undefined;\n return obj[k];\n}\nvar arr = [];\nvar each = arr.forEach;\nvar slice = arr.slice;\nexport function defaults(obj) {\n each.call(slice.call(arguments, 1), function (source) {\n if (source) {\n for (var prop in source) {\n if (obj[prop] === undefined) obj[prop] = source[prop];\n }\n }\n });\n return obj;\n}\nexport function extend(obj) {\n each.call(slice.call(arguments, 1), function (source) {\n if (source) {\n for (var prop in source) {\n obj[prop] = source[prop];\n }\n }\n });\n return obj;\n}","function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nimport * as utils from './utils.js';\nimport IntlMessageFormat from 'intl-messageformat';\n\nfunction getDefaults() {\n return {\n memoize: true,\n memoizeFallback: false,\n bindI18n: '',\n bindI18nStore: '',\n parseErrorHandler: function parseErrorHandler(err, key, res, options) {\n return res;\n }\n };\n}\n\nvar ICU = /*#__PURE__*/function () {\n function ICU(options) {\n _classCallCheck(this, ICU);\n\n this.type = 'i18nFormat';\n this.mem = {};\n this.init(null, options);\n }\n\n _createClass(ICU, [{\n key: \"init\",\n value: function init(i18next, options) {\n var _this = this;\n\n var i18nextOptions = i18next && i18next.options && i18next.options.i18nFormat || {};\n this.options = utils.defaults(i18nextOptions, options, this.options || {}, getDefaults());\n this.formats = this.options.formats;\n\n if (i18next) {\n var _this$options = this.options,\n bindI18n = _this$options.bindI18n,\n bindI18nStore = _this$options.bindI18nStore,\n memoize = _this$options.memoize;\n i18next.IntlMessageFormat = IntlMessageFormat;\n i18next.ICU = this;\n\n if (memoize) {\n if (bindI18n) {\n i18next.on(bindI18n, function () {\n return _this.clearCache();\n });\n }\n\n if (bindI18nStore) {\n i18next.store.on(bindI18nStore, function () {\n return _this.clearCache();\n });\n }\n }\n }\n }\n }, {\n key: \"addUserDefinedFormats\",\n value: function addUserDefinedFormats(formats) {\n this.formats = this.formats ? _objectSpread(_objectSpread({}, this.formats), formats) : formats;\n }\n }, {\n key: \"parse\",\n value: function parse(res, options, lng, ns, key, info) {\n var hadSuccessfulLookup = info && info.resolved && info.resolved.res;\n var memKey = this.options.memoize && \"\".concat(lng, \".\").concat(ns, \".\").concat(key.replace(/\\./g, '###'));\n var fc;\n\n if (this.options.memoize) {\n fc = utils.getPath(this.mem, memKey);\n }\n\n try {\n if (!fc) {\n // without ignoreTag, react-i18next translations with <0> placeholders\n // will fail to parse, as IntlMessageFormat expects them to be defined in the\n // options passed to fc.format() as { 0: (children) => string }\n // but the replacement of placeholders is done in react-i18next\n fc = new IntlMessageFormat(res, lng, this.formats, {\n ignoreTag: true\n });\n if (this.options.memoize && (this.options.memoizeFallback || !info || hadSuccessfulLookup)) utils.setPath(this.mem, memKey, fc);\n }\n\n return fc.format(options);\n } catch (err) {\n return this.options.parseErrorHandler(err, key, res, options);\n }\n }\n }, {\n key: \"addLookupKeys\",\n value: function addLookupKeys(finalKeys, _key, _code, _ns, _options) {\n // no additional keys needed for select or plural\n // so there is no need to add keys to that finalKeys array\n return finalKeys;\n }\n }, {\n key: \"clearCache\",\n value: function clearCache() {\n this.mem = {};\n }\n }]);\n\n return ICU;\n}();\n\nICU.type = 'i18nFormat';\nexport default ICU;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\n\nvar arr = [];\nvar each = arr.forEach;\nvar slice = arr.slice;\nfunction defaults(obj) {\n each.call(slice.call(arguments, 1), function (source) {\n if (source) {\n for (var prop in source) {\n if (obj[prop] === undefined) obj[prop] = source[prop];\n }\n }\n });\n return obj;\n}\n\n// eslint-disable-next-line no-control-regex\nvar fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\nvar serializeCookie = function serializeCookie(name, val, options) {\n var opt = options || {};\n opt.path = opt.path || '/';\n var value = encodeURIComponent(val);\n var str = \"\".concat(name, \"=\").concat(value);\n\n if (opt.maxAge > 0) {\n var maxAge = opt.maxAge - 0;\n if (Number.isNaN(maxAge)) throw new Error('maxAge should be a Number');\n str += \"; Max-Age=\".concat(Math.floor(maxAge));\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += \"; Domain=\".concat(opt.domain);\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += \"; Path=\".concat(opt.path);\n }\n\n if (opt.expires) {\n if (typeof opt.expires.toUTCString !== 'function') {\n throw new TypeError('option expires is invalid');\n }\n\n str += \"; Expires=\".concat(opt.expires.toUTCString());\n }\n\n if (opt.httpOnly) str += '; HttpOnly';\n if (opt.secure) str += '; Secure';\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n\n case 'lax':\n str += '; SameSite=Lax';\n break;\n\n case 'strict':\n str += '; SameSite=Strict';\n break;\n\n case 'none':\n str += '; SameSite=None';\n break;\n\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n};\n\nvar cookie = {\n create: function create(name, value, minutes, domain) {\n var cookieOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n path: '/',\n sameSite: 'strict'\n };\n\n if (minutes) {\n cookieOptions.expires = new Date();\n cookieOptions.expires.setTime(cookieOptions.expires.getTime() + minutes * 60 * 1000);\n }\n\n if (domain) cookieOptions.domain = domain;\n document.cookie = serializeCookie(name, encodeURIComponent(value), cookieOptions);\n },\n read: function read(name) {\n var nameEQ = \"\".concat(name, \"=\");\n var ca = document.cookie.split(';');\n\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n\n while (c.charAt(0) === ' ') {\n c = c.substring(1, c.length);\n }\n\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n\n return null;\n },\n remove: function remove(name) {\n this.create(name, '', -1);\n }\n};\nvar cookie$1 = {\n name: 'cookie',\n lookup: function lookup(options) {\n var found;\n\n if (options.lookupCookie && typeof document !== 'undefined') {\n var c = cookie.read(options.lookupCookie);\n if (c) found = c;\n }\n\n return found;\n },\n cacheUserLanguage: function cacheUserLanguage(lng, options) {\n if (options.lookupCookie && typeof document !== 'undefined') {\n cookie.create(options.lookupCookie, lng, options.cookieMinutes, options.cookieDomain, options.cookieOptions);\n }\n }\n};\n\nvar querystring = {\n name: 'querystring',\n lookup: function lookup(options) {\n var found;\n\n if (typeof window !== 'undefined') {\n var search = window.location.search;\n\n if (!window.location.search && window.location.hash && window.location.hash.indexOf('?') > -1) {\n search = window.location.hash.substring(window.location.hash.indexOf('?'));\n }\n\n var query = search.substring(1);\n var params = query.split('&');\n\n for (var i = 0; i < params.length; i++) {\n var pos = params[i].indexOf('=');\n\n if (pos > 0) {\n var key = params[i].substring(0, pos);\n\n if (key === options.lookupQuerystring) {\n found = params[i].substring(pos + 1);\n }\n }\n }\n }\n\n return found;\n }\n};\n\nvar hasLocalStorageSupport = null;\n\nvar localStorageAvailable = function localStorageAvailable() {\n if (hasLocalStorageSupport !== null) return hasLocalStorageSupport;\n\n try {\n hasLocalStorageSupport = window !== 'undefined' && window.localStorage !== null;\n var testKey = 'i18next.translate.boo';\n window.localStorage.setItem(testKey, 'foo');\n window.localStorage.removeItem(testKey);\n } catch (e) {\n hasLocalStorageSupport = false;\n }\n\n return hasLocalStorageSupport;\n};\n\nvar localStorage = {\n name: 'localStorage',\n lookup: function lookup(options) {\n var found;\n\n if (options.lookupLocalStorage && localStorageAvailable()) {\n var lng = window.localStorage.getItem(options.lookupLocalStorage);\n if (lng) found = lng;\n }\n\n return found;\n },\n cacheUserLanguage: function cacheUserLanguage(lng, options) {\n if (options.lookupLocalStorage && localStorageAvailable()) {\n window.localStorage.setItem(options.lookupLocalStorage, lng);\n }\n }\n};\n\nvar hasSessionStorageSupport = null;\n\nvar sessionStorageAvailable = function sessionStorageAvailable() {\n if (hasSessionStorageSupport !== null) return hasSessionStorageSupport;\n\n try {\n hasSessionStorageSupport = window !== 'undefined' && window.sessionStorage !== null;\n var testKey = 'i18next.translate.boo';\n window.sessionStorage.setItem(testKey, 'foo');\n window.sessionStorage.removeItem(testKey);\n } catch (e) {\n hasSessionStorageSupport = false;\n }\n\n return hasSessionStorageSupport;\n};\n\nvar sessionStorage = {\n name: 'sessionStorage',\n lookup: function lookup(options) {\n var found;\n\n if (options.lookupSessionStorage && sessionStorageAvailable()) {\n var lng = window.sessionStorage.getItem(options.lookupSessionStorage);\n if (lng) found = lng;\n }\n\n return found;\n },\n cacheUserLanguage: function cacheUserLanguage(lng, options) {\n if (options.lookupSessionStorage && sessionStorageAvailable()) {\n window.sessionStorage.setItem(options.lookupSessionStorage, lng);\n }\n }\n};\n\nvar navigator$1 = {\n name: 'navigator',\n lookup: function lookup(options) {\n var found = [];\n\n if (typeof navigator !== 'undefined') {\n if (navigator.languages) {\n // chrome only; not an array, so can't use .push.apply instead of iterating\n for (var i = 0; i < navigator.languages.length; i++) {\n found.push(navigator.languages[i]);\n }\n }\n\n if (navigator.userLanguage) {\n found.push(navigator.userLanguage);\n }\n\n if (navigator.language) {\n found.push(navigator.language);\n }\n }\n\n return found.length > 0 ? found : undefined;\n }\n};\n\nvar htmlTag = {\n name: 'htmlTag',\n lookup: function lookup(options) {\n var found;\n var htmlTag = options.htmlTag || (typeof document !== 'undefined' ? document.documentElement : null);\n\n if (htmlTag && typeof htmlTag.getAttribute === 'function') {\n found = htmlTag.getAttribute('lang');\n }\n\n return found;\n }\n};\n\nvar path = {\n name: 'path',\n lookup: function lookup(options) {\n var found;\n\n if (typeof window !== 'undefined') {\n var language = window.location.pathname.match(/\\/([a-zA-Z-]*)/g);\n\n if (language instanceof Array) {\n if (typeof options.lookupFromPathIndex === 'number') {\n if (typeof language[options.lookupFromPathIndex] !== 'string') {\n return undefined;\n }\n\n found = language[options.lookupFromPathIndex].replace('/', '');\n } else {\n found = language[0].replace('/', '');\n }\n }\n }\n\n return found;\n }\n};\n\nvar subdomain = {\n name: 'subdomain',\n lookup: function lookup(options) {\n // If given get the subdomain index else 1\n var lookupFromSubdomainIndex = typeof options.lookupFromSubdomainIndex === 'number' ? options.lookupFromSubdomainIndex + 1 : 1; // get all matches if window.location. is existing\n // first item of match is the match itself and the second is the first group macht which sould be the first subdomain match\n // is the hostname no public domain get the or option of localhost\n\n var language = typeof window !== 'undefined' && window.location && window.location.hostname && window.location.hostname.match(/^(\\w{2,5})\\.(([a-z0-9-]{1,63}\\.[a-z]{2,6})|localhost)/i); // if there is no match (null) return undefined\n\n if (!language) return undefined; // return the given group match\n\n return language[lookupFromSubdomainIndex];\n }\n};\n\nfunction getDefaults() {\n return {\n order: ['querystring', 'cookie', 'localStorage', 'sessionStorage', 'navigator', 'htmlTag'],\n lookupQuerystring: 'lng',\n lookupCookie: 'i18next',\n lookupLocalStorage: 'i18nextLng',\n lookupSessionStorage: 'i18nextLng',\n // cache user language\n caches: ['localStorage'],\n excludeCacheFor: ['cimode'] // cookieMinutes: 10,\n // cookieDomain: 'myDomain'\n\n };\n}\n\nvar Browser = /*#__PURE__*/function () {\n function Browser(services) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, Browser);\n\n this.type = 'languageDetector';\n this.detectors = {};\n this.init(services, options);\n }\n\n _createClass(Browser, [{\n key: \"init\",\n value: function init(services) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var i18nOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n this.services = services;\n this.options = defaults(options, this.options || {}, getDefaults()); // backwards compatibility\n\n if (this.options.lookupFromUrlIndex) this.options.lookupFromPathIndex = this.options.lookupFromUrlIndex;\n this.i18nOptions = i18nOptions;\n this.addDetector(cookie$1);\n this.addDetector(querystring);\n this.addDetector(localStorage);\n this.addDetector(sessionStorage);\n this.addDetector(navigator$1);\n this.addDetector(htmlTag);\n this.addDetector(path);\n this.addDetector(subdomain);\n }\n }, {\n key: \"addDetector\",\n value: function addDetector(detector) {\n this.detectors[detector.name] = detector;\n }\n }, {\n key: \"detect\",\n value: function detect(detectionOrder) {\n var _this = this;\n\n if (!detectionOrder) detectionOrder = this.options.order;\n var detected = [];\n detectionOrder.forEach(function (detectorName) {\n if (_this.detectors[detectorName]) {\n var lookup = _this.detectors[detectorName].lookup(_this.options);\n\n if (lookup && typeof lookup === 'string') lookup = [lookup];\n if (lookup) detected = detected.concat(lookup);\n }\n });\n if (this.services.languageUtils.getBestMatchFromCodes) return detected; // new i18next v19.5.0\n\n return detected.length > 0 ? detected[0] : null; // a little backward compatibility\n }\n }, {\n key: \"cacheUserLanguage\",\n value: function cacheUserLanguage(lng, caches) {\n var _this2 = this;\n\n if (!caches) caches = this.options.caches;\n if (!caches) return;\n if (this.options.excludeCacheFor && this.options.excludeCacheFor.indexOf(lng) > -1) return;\n caches.forEach(function (cacheName) {\n if (_this2.detectors[cacheName]) _this2.detectors[cacheName].cacheUserLanguage(lng, _this2.options);\n });\n }\n }]);\n\n return Browser;\n}();\n\nBrowser.type = 'languageDetector';\n\nexport { Browser as default };\n","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","import type { Breadcrumb, Extra, Primitive, Scope } from '@sentry/types';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\n\nconst CACHE_NAME = '__cs__';\nconst MONITORING_NAME = 'monitoring';\n\n/**\n * helper to check if monitoring is available\n */\nfunction hasMonitoring() {\n return canUseDom() && window[CACHE_NAME] && window[CACHE_NAME][MONITORING_NAME];\n}\n\nfunction pageview(location: unknown) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.pageview?.(location);\n}\n\nfunction identity(uuid: string) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.identity?.(uuid);\n}\n\nfunction tag(name: string, value: Primitive) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.tag?.(name, value);\n}\n\nfunction property(name: string, value: Extra) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.property?.(name, value);\n}\n\nfunction addBreadcrumb(data: Breadcrumb) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.addBreadcrumb?.(data);\n}\n\nfunction error(err?: string) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.error?.(err);\n}\n\nfunction log(msg: string) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.log?.(msg);\n}\n\nfunction withScope(func: (scope: Scope) => void) {\n if (hasMonitoring()) window[CACHE_NAME][MONITORING_NAME]?.withScope?.(func);\n}\n\nexport default {\n hasMonitoring,\n identity,\n tag,\n property,\n addBreadcrumb,\n error,\n log,\n withScope,\n pageview,\n};\n","export const isValidLocale = (locale: string): boolean => {\n try {\n return typeof Intl.DateTimeFormat(locale) !== 'undefined';\n } catch {\n return false;\n }\n};\n","/* eslint-disable camelcase */\nimport { getSessionCookie } from '@clearscore-group/lib.helpers.cookies';\nimport { isValidLocale } from '@clearscore-group/lib.helpers.i18n';\n\nexport interface CSSessionCookie {\n access_token: string;\n refresh_token: string;\n session_id: string;\n o_token: string;\n market: string;\n locale: string;\n}\n\ninterface CustomDetectorOptions {\n name: string;\n lookup: () => string | undefined;\n}\n\nconst sessionCookie: CustomDetectorOptions = {\n name: 'sessionCookie',\n lookup: () => {\n try {\n const sessionCookieObj: CSSessionCookie = getSessionCookie();\n return isValidLocale(sessionCookieObj.locale) ? sessionCookieObj.locale : undefined;\n } catch {\n return undefined;\n }\n },\n};\n\nexport default sessionCookie;\n","import { isValidLocale } from '@clearscore-group/lib.helpers.i18n';\nimport { MARKETS } from '@clearscore-group/lib.config.i18n';\n\ninterface CustomDetectorOptions {\n name: string;\n lookup: () => undefined | string;\n}\n\nconst marketPath: CustomDetectorOptions = {\n name: 'marketPath',\n lookup: () => {\n if (typeof window !== 'undefined') {\n const regExp = new RegExp(\n [\n ...MARKETS.map((market: string) => `/${market}/`),\n ...MARKETS.map((market: string) => `/${market}$`),\n ].join('|'),\n );\n const result = regExp.exec(window.location.pathname)?.[0] ?? [];\n const possibleMarket = `en-${result[1]}${result[2]}` ?? '';\n return isValidLocale(possibleMarket) ? possibleMarket : undefined;\n }\n return undefined;\n },\n};\n\nexport default marketPath;\n","import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport ICU from 'i18next-icu';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport monitoring from '@clearscore-group/lib.helpers.monitoring';\nimport { EN_AU, EN_CA, EN_GB, EN_ZA, FR_CA, EN_NZ } from '@clearscore-group/lib.config.i18n';\nimport { constants, updateSessionCookie, getSessionCookie } from '@clearscore-group/lib.helpers.cookies';\n\nimport sessionCookieDetector from '../detectors/sessionCookie';\nimport marketPathDetector from '../detectors/marketPath';\n\nconst { CS_CURRENT_LANGUAGE } = constants;\n\nconst languageDetector = new LanguageDetector(null, {\n caches: ['cookie'],\n order: ['querystring', marketPathDetector.name, sessionCookieDetector.name, 'cookie', 'navigator'],\n lookupCookie: CS_CURRENT_LANGUAGE,\n});\n\nconst supportedLngs = [EN_GB, EN_AU, EN_CA, EN_ZA, FR_CA, EN_NZ];\n\nlanguageDetector.addDetector(marketPathDetector);\nlanguageDetector.addDetector(sessionCookieDetector);\n\ni18n.use(initReactI18next)\n .use(ICU)\n .use(languageDetector)\n .init({\n ns: [],\n resources: {\n EN_GB: {},\n },\n supportedLngs,\n lowerCaseLng: true,\n fallbackLng: EN_GB,\n interpolation: {\n escapeValue: false,\n },\n saveMissing: true,\n missingKeyHandler: (locale, ns, copyKey) => {\n // don't throw for copy tagged as coming from a feature service\n if (monitoring.hasMonitoring() && ns !== 'cs-dont-throw') {\n const errObject = new Error(`[i18n.missing-key] local: ${locale}, Scope: ${ns}, Copy-key: ${copyKey}`);\n monitoring.error(errObject);\n }\n },\n });\n\ni18n.on('languageChanged', (lng) => {\n if (getSessionCookie()) updateSessionCookie({ locale: lng });\n});\n\nexport default i18n;\n","/* eslint-disable react/prop-types */\nimport React from 'react';\nimport { I18nextProvider } from 'react-i18next';\nimport configureStore, { Router, Provider, browserHistory } from '@clearscore-group/lib.redux.store';\nimport { selectors as marketSelectors } from '@clearscore-group/lib.redux.market';\n\nimport i18n from './lib/i18n';\n\nconst isFunction = (config) => typeof config === 'function';\n\nexport const i18nInstance = i18n;\n\nexport default ({\n children,\n storeConfig,\n i18n: newI18nInstance = i18n, // allow modified instance for testing\n defaultMarket,\n defaultLocale,\n basename,\n history = browserHistory(basename),\n ...props\n}) => {\n const store = isFunction(storeConfig)\n ? storeConfig\n : configureStore({ ...storeConfig, defaultLocale, defaultMarket, history });\n const state = store.getState();\n const locale = marketSelectors.getActiveLocale(state);\n const providerProps = { store, history, locale, ...props };\n const getChild = () => (isFunction(children) ? children(providerProps) : children);\n\n return (\n \n \n {getChild()}\n \n \n );\n};\n","import type { ReactElement } from 'react';\nimport './style/styles.css';\n\ninterface FontProps {\n children?: ReactElement;\n}\n\ninterface Font {\n (props: FontProps): ReactElement | null;\n}\n\nconst Font: Font = ({ children }) => children || null;\n\nexport default Font;\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getRegistrationProspectId = (state) => resolveProp('router.location.pathname', state).replace(/\\/step.+\\//, '');\n\nexport default createSelector(getRegistrationProspectId, (prospectId) => prospectId);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getRegistrationStep = (state, props) => {\n const pathname = resolveProp('location.pathname', props) || resolveProp('router.location.pathname', state) || {};\n const step = pathname.match('/step([1-4])');\n return step ? parseInt(step[1], 10) : undefined;\n};\n\nexport default createSelector(getRegistrationStep, (registrationStep) => registrationStep);\n","const parse = (search: string): T => {\n const pairs = search.slice(1).split('&');\n const result = pairs.reduce((prev: Record, pair: string) => {\n const [key, encodedValue = ''] = pair.split('=');\n const value = decodeURIComponent(encodedValue);\n const arrValues = prev[key] && Array.isArray(prev[key]) ? prev[key] : [prev[key]];\n const arrValue = prev[key] ? [...arrValues, value] : value;\n return {\n ...prev,\n ...(key ? { [key]: arrValue as string[] } : {}),\n };\n }, {});\n return JSON.parse(JSON.stringify(result));\n};\n\ntype StringifyParams = Record;\n\nconst getValues = (params: StringifyParams, key: string): string[] => {\n if (Array.isArray(params[key])) {\n return params[key] as string[];\n }\n\n return [params[key]] as string[];\n};\n\nconst stringify = (params: StringifyParams): string => {\n const result = Object.entries(params).reduce((prev, [key, value]) => {\n if (value === undefined) return prev;\n\n return getValues(params, key).reduce((prevValue: string, decodedValue: string) => {\n const amp = prevValue.length > 0 ? '&' : '';\n return `${prevValue}${amp}${key}=${encodeURIComponent(decodedValue)}`;\n }, prev);\n }, '');\n return JSON.parse(JSON.stringify(result));\n};\n\nexport default {\n parse,\n stringify,\n};\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport queryString from '@clearscore-group/lib.helpers.query-string';\n\nconst getQueryParams = (state) => queryString.parse(resolveProp('router.location.search', state)) || {};\n\nexport default createSelector(getQueryParams, (queryParams) => queryParams);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getErrorName = (state) => {\n const error = resolveProp('router.location.pathname', state).match('/error.*/([^/]+)/?$');\n return error ? error[1] : 'generic';\n};\n\nexport default createSelector(getErrorName, (errorName) => errorName);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst windowPathname = () => (window && window.location ? window.location.pathname : undefined);\nconst currentPath = (state) => resolveProp('router.location.pathname', state) || windowPathname();\n\nexport default createSelector(currentPath, (path) => path);\n","import { createSelector } from 'reselect';\nimport { constants } from '@clearscore-group/lib.redux.market';\n\nimport getCurrentPath from './getCurrentPath';\n\nconst marketRegExCaptureGroup = RegExp(`^/(${constants.MARKETS.join('|')})(.*)$`, 'gi');\n\nexport default createSelector(getCurrentPath, (currentPath) =>\n currentPath && currentPath.match(marketRegExCaptureGroup)\n ? currentPath.replace(marketRegExCaptureGroup, '$1').toLowerCase()\n : null,\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getLocationState = (state) => resolveProp('router.location.state', state) || {};\n\nexport default createSelector(getLocationState, (locationState) => locationState);\n","import * as selectorsImport from './selectors';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const selectors = selectorsImport;\n","import { AU, NZ } from '@clearscore-group/lib.config.i18n';\n\nexport default (market) => {\n switch (market) {\n case AU:\n return {\n reidentify: '/au-registration/v1/register/reidentify',\n skipReidentify: '/au-registration/v1/skip-update',\n };\n case NZ:\n return {\n reidentify: '/nz-registration/v1/register/reidentify',\n skipReidentify: '/nz-registration/v1/skip-update',\n };\n default:\n return {\n reidentify: '/cs-identity/v1/reidentify',\n skipReidentify: '/cs-identity/v1/reidentify',\n };\n }\n};\n","export const IDENTITY_IDENTIFY = 'CS/IDENTITY_IDENTIFY';\nexport const IDENTITY_IDENTIFY_SUCCESS = `${IDENTITY_IDENTIFY}_SUCCESS`;\nexport const IDENTITY_IDENTIFY_ERROR = `${IDENTITY_IDENTIFY}_ERROR`;\nexport const IDENTITY_REIDENTIFY = 'CS/IDENTITY_REIDENTIFY';\nexport const IDENTITY_REIDENTIFY_SUCCESS = `${IDENTITY_REIDENTIFY}_SUCCESS`;\nexport const IDENTITY_REIDENTIFY_ERROR = `${IDENTITY_REIDENTIFY}_ERROR`;\nexport const IDENTITY_RESTART = 'CS/IDENTITY_RESTART';\nexport const IDENTITY_RESTART_SUCCESS = `${IDENTITY_RESTART}_SUCCESS`;\nexport const IDENTITY_RESTART_ERROR = `${IDENTITY_RESTART}_ERROR`;\nexport const IDENTITY_GENERATE_TOKEN = 'CS/IDENTITY_GENERATE_TOKEN';\nexport const IDENTITY_GENERATE_TOKEN_SUCCESS = `${IDENTITY_GENERATE_TOKEN}_SUCCESS`;\nexport const IDENTITY_GENERATE_TOKEN_ERROR = `${IDENTITY_GENERATE_TOKEN}_ERROR`;\nexport const IDENTITY_VERIFY_OTP_TOKEN = 'CS/IDENTITY_VERIFY_OTP_TOKEN';\nexport const IDENTITY_VERIFY_OTP_TOKEN_SUCCESS = `${IDENTITY_VERIFY_OTP_TOKEN}_SUCCESS`;\nexport const IDENTITY_VERIFY_OTP_TOKEN_ERROR = `${IDENTITY_VERIFY_OTP_TOKEN}_ERROR`;\nexport const IDENTITY_CHOOSE = 'CS/IDENTITY_CHOOSE';\nexport const IDENTITY_CHOOSE_SUCCESS = `${IDENTITY_CHOOSE}_SUCCESS`;\nexport const IDENTITY_CHOOSE_ERROR = `${IDENTITY_CHOOSE}_ERROR`;\nexport const IDENTITY_FIRST_TIME_VISIT = 'CS/IDENTITY_FIRST_TIME_VISIT';\nexport const IDENTITY_FIRST_TIME_REGISTRATION = 'CS/IDENTITY_FIRST_TIME_REGISTRATION';\n\nexport const IDENTITY_FETCH_KBA = 'CS/IDENTITY_FETCH_KBA';\nexport const IDENTITY_FETCH_KBA_SUCCESS = `${IDENTITY_FETCH_KBA}_SUCCESS`;\nexport const IDENTITY_FETCH_KBA_ERROR = `${IDENTITY_FETCH_KBA}_ERROR`;\nexport const IDENTITY_VERIFY_KBA = 'CS/IDENTITY_VERIFY_KBA';\nexport const IDENTITY_VERIFY_KBA_SUCCESS = `${IDENTITY_VERIFY_KBA}_SUCCESS`;\nexport const IDENTITY_VERIFY_KBA_ERROR = `${IDENTITY_VERIFY_KBA}_ERROR`;\n\nexport const IDENTITY_VERIFY_BAV = 'CS/IDENTITY_VERIFY_BAV';\nexport const IDENTITY_VERIFY_BAV_SUCCESS = `${IDENTITY_VERIFY_BAV}_SUCCESS`;\nexport const IDENTITY_VERIFY_BAV_ERROR = `${IDENTITY_VERIFY_BAV}_ERROR`;\nexport const IDENTITY_SKIP_BAV = 'CS/IDENTITY_SKIP_BAV';\nexport const IDENTITY_SKIP_BAV_SUCCESS = `${IDENTITY_SKIP_BAV}_SUCCESS`;\nexport const IDENTITY_SKIP_BAV_ERROR = `${IDENTITY_SKIP_BAV}_ERROR`;\n\nexport const IDENTITY_MARKETING_USER = 'CS/IDENTITY_MARKETING_USER';\nexport const IDENTITY_SKIP_OTP = 'CS/IDENTITY_SKIP_OTP';\nexport const IDENTITY_SKIP_OTP_SUCCESS = `${IDENTITY_SKIP_OTP}_SUCCESS`;\nexport const IDENTITY_SKIP_OTP_ERROR = `${IDENTITY_SKIP_OTP}_ERROR`;\n\nexport const IDENTITY_SKIP_REIDENTIFY = 'CS/IDENTITY_SKIP_REIDENTIFY';\nexport const IDENTITY_SKIP_REIDENTIFY_SUCCESS = `${IDENTITY_SKIP_REIDENTIFY}_SUCCESS`;\nexport const IDENTITY_SKIP_REIDENTIFY_ERROR = `${IDENTITY_SKIP_REIDENTIFY}_ERROR`;\n\nexport const IDENTITY_EMPTY = 'CS/IDENTITY_EMPTY';\n","import * as actionsImport from './identity.actions';\nimport * as reducersImport from './identity.reducers';\nimport * as selectorsImport from './selectors/index';\nimport * as typesImport from './identity.types';\n\nexport const actions = actionsImport;\nexport const reducers = reducersImport;\nexport const selectors = selectorsImport;\nexport const types = typesImport;\n","import createAction from '@clearscore-group/lib.helpers.create-action';\nimport createRequestPayload from '@clearscore-group/lib.helpers.create-request-payload';\n\nimport marketConfig from './lib/market-config';\nimport {\n IDENTITY_IDENTIFY,\n IDENTITY_REIDENTIFY,\n IDENTITY_RESTART,\n IDENTITY_GENERATE_TOKEN,\n IDENTITY_VERIFY_OTP_TOKEN,\n IDENTITY_CHOOSE,\n IDENTITY_FIRST_TIME_VISIT,\n IDENTITY_FIRST_TIME_REGISTRATION,\n IDENTITY_FETCH_KBA,\n IDENTITY_VERIFY_KBA,\n IDENTITY_VERIFY_BAV,\n IDENTITY_SKIP_BAV,\n IDENTITY_MARKETING_USER,\n IDENTITY_SKIP_OTP,\n IDENTITY_SKIP_REIDENTIFY,\n} from './identity.types';\n\nexport const identify = (blackBox) =>\n createAction(\n IDENTITY_IDENTIFY,\n createRequestPayload('international', '/cs-identity/v1/identify', 'post', { beginBlackbox: blackBox }),\n );\nexport const reidentify = (market, blackBox) =>\n createAction(\n IDENTITY_REIDENTIFY,\n createRequestPayload(\n 'international',\n marketConfig(market).reidentify,\n 'post',\n blackBox\n ? {\n beginBlackbox: blackBox,\n }\n : undefined,\n ),\n );\n\nexport const skipReidentify = (market, blackBox) =>\n createAction(\n IDENTITY_SKIP_REIDENTIFY,\n createRequestPayload(\n 'international',\n marketConfig(market).skipReidentify,\n 'post',\n blackBox\n ? {\n beginBlackbox: blackBox,\n }\n : undefined,\n ),\n );\n\nexport const restart = () =>\n createAction(IDENTITY_RESTART, createRequestPayload('international', `/cs-identity/v1/restart`, 'post'));\n\nexport const generateToken = ({ isResend = false } = {}) =>\n createAction(\n IDENTITY_GENERATE_TOKEN,\n createRequestPayload('international', '/cs-identity/v2/otp/generate', 'post', null, { isResend }),\n );\n\nexport const verifyOtpToken = (data) =>\n createAction(\n IDENTITY_VERIFY_OTP_TOKEN,\n createRequestPayload('international', `/cs-identity/v1/otp/verify/${data.otpCandidate}`, 'post'),\n );\nexport const choose = (data) =>\n createAction(IDENTITY_CHOOSE, createRequestPayload('international', '/cs-identity/v1/choose', 'post', data));\n\nexport const firstTimeVisit = () => createAction(IDENTITY_FIRST_TIME_VISIT);\n\nexport const firstTimeRegistration = () => createAction(IDENTITY_FIRST_TIME_REGISTRATION);\n\nexport const fetchKba = () =>\n createAction(IDENTITY_FETCH_KBA, createRequestPayload('international', `/cs-identity/v1/kba`));\n\nexport const verifyKba = (data) =>\n createAction(\n IDENTITY_VERIFY_KBA,\n createRequestPayload('international', `/cs-identity/v1/kba/verify`, 'post', data),\n );\n\nexport const verifyBav = (data) =>\n createAction(\n IDENTITY_VERIFY_BAV,\n createRequestPayload('international', `/cs-identity/v1/bav/verify`, 'post', data),\n );\n\nexport const skipBav = () =>\n createAction(IDENTITY_SKIP_BAV, createRequestPayload('international', `/cs-identity/v1/bav/skip`, 'post'));\n\nexport const trackUserCameFromMarketingSource = ({ context }) => createAction(IDENTITY_MARKETING_USER, { context });\n\nexport const skipOtp = () =>\n createAction(IDENTITY_SKIP_OTP, createRequestPayload('international', `/cs-identity/v1/otp/skip`, 'post'));\n","export const marketingCampaignConfig = {\n utm_source: 'utm_source',\n utm_medium: 'utm_medium',\n utm_campaign: 'utm_campaign',\n utm_term: 'utm_term',\n utm_content: 'utm_content',\n} as const;\n\nexport const getMarketingUrlParams = ({\n queryParams = {},\n}: {\n queryParams?: { [k: string]: string };\n}): {\n [k: string]: string | undefined;\n} =>\n Object.keys(queryParams).reduce(\n (values, param) => ({\n ...values,\n [param]: param in marketingCampaignConfig ? queryParams[param] : undefined,\n }),\n {},\n );\n\nexport const urlContainsMarketingParams = (queryParams: { [k: string]: string }): boolean =>\n Object.keys(queryParams).includes(marketingCampaignConfig.utm_source);\n","import type { Dispatch, Store } from 'redux';\nimport { MARKETS } from '@clearscore-group/lib.config.i18n';\nimport {\n setPersonCookie,\n setVisitedSiteCookie,\n getVisitedSiteCookie,\n setPublisherCookie,\n getSessionCookie,\n orchestrateAnonymousCookie,\n} from '@clearscore-group/lib.helpers.cookies';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport { selectors as routerSelectors } from '@clearscore-group/lib.redux.router';\nimport { actions as identityActions } from '@clearscore-group/lib.redux.identity';\nimport { actions as marketActions } from '@clearscore-group/lib.redux.market';\n\nimport { urlContainsMarketingParams, getMarketingUrlParams } from './helpers';\n\n/**\n * Set the active market from the `market` parameter in the querystring\n * if provided to ensure tracking events are fired in the correct region\n */\nconst setMarketFromQuerystring = (dispatch: Dispatch, overrideQueryString?: string | null): void => {\n if (!canUseDom()) {\n return;\n }\n\n const queryString = overrideQueryString || window.location.search;\n const qsMarket = new URLSearchParams(queryString).get('market') || '';\n\n if (!(MARKETS as unknown as Array).includes(qsMarket)) {\n // Invalid market passed in querystring\n return;\n }\n\n dispatch(marketActions.setActiveMarket(qsMarket));\n};\n\ninterface IInitialiseTrackingCookieEventHandlers {\n onFirstTimeVisit?: (userIdentifieer?: string) => void;\n onMarketingCampaignVisit?: (marketingUrlParams: { [k: string]: string | undefined }) => void;\n}\n\n/**\n * Initialise tracking by dispatching identity actions and saving UTM parameters from\n * the URL into a cookie to be persisted across the site\n *\n * If you're using `connected-react-router`, you need to pass the whole redux store to\n * this function so it's able to pull the query params from the state. Otherwise, you\n * can simply pass an object with the `dispatch` propery and the function will look\n * in the second argument (or window querystring) for UTM tags\n */\nexport default (\n {\n dispatch,\n getState,\n }: {\n dispatch: Store['dispatch'];\n getState?: Store['getState'];\n },\n overrideQueryString?: string | null,\n { onFirstTimeVisit, onMarketingCampaignVisit }: IInitialiseTrackingCookieEventHandlers = {},\n): null => {\n const isWebview = getEnv('WEBVIEW');\n // If it's a webview with injected session cookie, it's not a first time visit\n const isFirstVisit = !getVisitedSiteCookie() && (!isWebview || !getSessionCookie());\n const userIdentifier = orchestrateAnonymousCookie();\n\n if (isFirstVisit) {\n setMarketFromQuerystring(dispatch, overrideQueryString);\n dispatch(identityActions.firstTimeVisit());\n onFirstTimeVisit?.(userIdentifier);\n }\n\n // always set or overwrite the visited site cookie\n // extending by a year each time a user visits\n setVisitedSiteCookie(userIdentifier);\n setPersonCookie(userIdentifier);\n\n if (canUseDom()) {\n const queryString = overrideQueryString || window.location.search;\n\n let queryParams;\n if (!overrideQueryString && typeof getState === 'function') {\n // connected-react-router context with no override; select from provided store state\n queryParams = routerSelectors.getQueryParams(getState());\n } else {\n // Use override or window querystring, and reduce search params to a key-value object\n queryParams = Object.fromEntries(new URLSearchParams(queryString).entries());\n }\n\n if (urlContainsMarketingParams(queryParams)) {\n setPublisherCookie(queryString);\n const marketingUrlParams = getMarketingUrlParams({ queryParams });\n dispatch(\n identityActions.trackUserCameFromMarketingSource({\n context: marketingUrlParams,\n }),\n );\n onMarketingCampaignVisit?.(marketingUrlParams);\n }\n }\n\n return null;\n};\n","export const VERTICAL_TAKEOVER_CONTEXT_NAME = 'vertical-takeover';\n","const CACHE_NAME = '__cs__';\n\n// eslint-disable-next-line ssr-friendly/no-dom-globals-in-module-scope\nconst objGlobal = typeof window !== 'undefined' && window.document && window.document.createElement ? window : {};\n\nobjGlobal[CACHE_NAME] = objGlobal[CACHE_NAME] || {};\nobjGlobal[CACHE_NAME].verticals = objGlobal[CACHE_NAME].verticals || {};\nobjGlobal[CACHE_NAME].envs = objGlobal[CACHE_NAME].envs || {};\n\nexport const cache = objGlobal[CACHE_NAME];\n\nexport function loadRoutes() {\n return cache.routes || [];\n}\n\nexport function hasComponent(name) {\n const vertical = cache.verticals[name];\n return !!vertical;\n}\n\nexport function loadComponent(name) {\n const vertical = cache.verticals[name];\n return vertical ? vertical.Component : undefined;\n}\n\nexport function getEntry(key) {\n if (cache && cache[key]) {\n return cache[key];\n }\n return null;\n}\n\nexport function setEntry(key, value) {\n cache[key] = value;\n return getEntry(key);\n}\n","import type { Context } from 'react';\nimport { createContext } from 'react';\nimport { cache } from '@clearscore-group/lib.helpers.cache';\n\nconst REACT_CONTEXT_CACHE_NAME = '__cs_global_react_context_cache__';\n\nconst getGlobalContextCache = (): { [key: string]: Context } => {\n if (!cache[REACT_CONTEXT_CACHE_NAME]) {\n cache[REACT_CONTEXT_CACHE_NAME] = {};\n }\n return cache[REACT_CONTEXT_CACHE_NAME];\n};\n\nexport const createGlobalContext = (contextName: string, defaultValue: T): Context => {\n const globalContextObject = getGlobalContextCache();\n if (!globalContextObject[contextName]) {\n globalContextObject[contextName] = createContext(defaultValue);\n }\n return globalContextObject[contextName] as Context;\n};\n","function injectCss(src) {\n return new Promise((resolve, reject) => {\n const script = document.createElement('link');\n script.async = true;\n script.rel = 'stylesheet';\n script.href = src;\n script.addEventListener('load', resolve);\n script.addEventListener('error', (error) => reject(new Error(`Error css file. src: ${src}`, { cause: error })));\n script.addEventListener('abort', () => reject(new Error(`CSS loading aborted. src: ${src}`)));\n document.head.appendChild(script);\n });\n}\n\nexport default injectCss;\n","export default (string) => {\n if (string && string.split) {\n return string\n .split(/_|-| /)\n .map((part) => part[0].toUpperCase() + part.substr(1).toLowerCase())\n .join('');\n }\n\n return string;\n};\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar borderRadius = {\n \"rnb-border-radius-circle\": \"50%\",\n \"rnb-border-radius-small\": \"0.25rem\",\n \"rnb-border-radius-medium\": \"0.5rem\",\n \"rnb-border-radius-large\": \"1rem\",\n \"rnb-border-radius-big\": \"1.25rem\"\n};\nvar borderWidth = {\n \"rnb-border-width-thin\": \"1px\",\n \"rnb-border-width-thin-offset\": \"-1px\",\n \"rnb-border-width-default\": \"2px\",\n \"rnb-border-width-thick\": \"4px\"\n};\nconst black = \"#000\";\nconst blackRgb = \"0, 0, 0\";\nconst white = \"#fff\";\nconst whiteRgb = \"255, 255, 255\";\nconst midnight = \"#263648\";\nconst midnightRgb = \"38, 54, 72\";\nconst chill = \"#0f81a3\";\nconst chillRgb = \"15, 129, 163\";\nconst rose = \"#bd2f2f\";\nconst roseRgb = \"189, 47, 47\";\nconst lavender = \"#d27df3\";\nconst lavenderRgb = \"210, 125, 243\";\nconst sand = \"#f69f4d\";\nconst sandRgb = \"246, 159, 77\";\nconst dandelion = \"#e9c627\";\nconst dandelionRgb = \"233, 198, 39\";\nconst moss = \"#add230\";\nconst mossRgb = \"173, 210, 48\";\nconst sea = \"#2cdb7b\";\nconst seaRgb = \"44, 219, 123\";\nconst reef = \"#2bcfc8\";\nconst reefRgb = \"43, 207, 200\";\nconst salvia = \"#9E86E7\";\nconst salviaRgb = \"158, 134, 231\";\nconst sky = \"#49C1E3\";\nconst skyRgb = \"73, 193, 227\";\nconst core = {\n \"rnb-colour-transparent\": \"transparent\",\n \"rnb-colour-black-tint-4\": \"#f5f5f5\",\n \"rnb-colour-black-tint-4-rgb\": \"245, 245, 245\",\n \"rnb-colour-black-alpha-4\": `rgba(${blackRgb}, 0.04)`,\n \"rnb-colour-black-alpha-8\": `rgba(${blackRgb}, 0.08)`,\n \"rnb-colour-black-alpha-16\": `rgba(${blackRgb}, 0.16)`,\n \"rnb-colour-black-alpha-32\": `rgba(${blackRgb}, 0.32)`,\n \"rnb-colour-black-alpha-48\": `rgba(${blackRgb}, 0.48)`,\n \"rnb-colour-black-alpha-64\": `rgba(${blackRgb}, 0.64)`,\n \"rnb-colour-black\": black,\n \"rnb-colour-black-rgb\": blackRgb,\n \"rnb-colour-white-alpha-4\": `rgba(${whiteRgb}, 0.04)`,\n \"rnb-colour-white-alpha-8\": `rgba(${whiteRgb}, 0.08)`,\n \"rnb-colour-white-alpha-16\": `rgba(${whiteRgb}, 0.16)`,\n \"rnb-colour-white-alpha-32\": `rgba(${whiteRgb}, 0.32)`,\n \"rnb-colour-white-alpha-48\": `rgba(${whiteRgb}, 0.48)`,\n \"rnb-colour-white-alpha-64\": `rgba(${whiteRgb}, 0.64)`,\n \"rnb-colour-white-alpha-80\": `rgba(${whiteRgb}, 0.80)`,\n \"rnb-colour-white\": white,\n \"rnb-colour-white-rgb\": whiteRgb,\n \"rnb-colour-midnight-tint-4\": \"#f7f7f8\",\n \"rnb-colour-midnight-tint-4-rgb\": \"247, 247, 248\",\n \"rnb-colour-midnight-tint-8\": \"#eeeff1\",\n \"rnb-colour-midnight-tint-8-rgb\": \"238, 239, 241\",\n \"rnb-colour-midnight-tint-16\": \"#dcdfe2\",\n \"rnb-colour-midnight-tint-16-rgb\": \"220, 223, 226\",\n \"rnb-colour-midnight-tint-32\": \"#b9bec4\",\n \"rnb-colour-midnight-tint-32-rgb\": \"185, 190, 196\",\n \"rnb-colour-midnight-tint-48\": \"#979fa8\",\n \"rnb-colour-midnight-tint-48-rgb\": \"151, 159, 168\",\n \"rnb-colour-midnight-tint-64\": \"#747f8a\",\n \"rnb-colour-midnight-tint-64-rgb\": \"116, 127, 138\",\n \"rnb-colour-midnight-tint-80\": \"#515E6D\",\n \"rnb-colour-midnight-tint-80-rgb\": \"81, 94, 109\",\n \"rnb-colour-midnight-alpha-96\": `rgba(${midnightRgb}, 0.96)`,\n \"rnb-colour-midnight\": midnight,\n \"rnb-colour-midnight-rgb\": midnightRgb,\n \"rnb-colour-midnight-shade-64\": \"#18232e\",\n \"rnb-colour-midnight-shade-64-rgb\": \"24, 35, 46\",\n \"rnb-colour-midnight-shade-48\": \"#121a23\",\n \"rnb-colour-midnight-shade-48-rgb\": \"18, 26, 35\",\n \"rnb-colour-midnight-shade-32\": \"#0c1117\",\n \"rnb-colour-midnight-shade-32-rgb\": \"12, 17, 23\",\n \"rnb-colour-chill-tint-4\": \"#f6fafc\",\n \"rnb-colour-chill-tint-4-rgb\": \"246, 250, 252\",\n \"rnb-colour-chill-tint-8\": \"#ecf5f8\",\n \"rnb-colour-chill-tint-8-rgb\": \"236, 245, 248\",\n \"rnb-colour-chill-tint-16\": \"#d8ebf0\",\n \"rnb-colour-chill-tint-16-rgb\": \"216, 235, 240\",\n \"rnb-colour-chill-tint-32\": \"#b2d6e1\",\n \"rnb-colour-chill-tint-32-rgb\": \"178, 214, 225\",\n \"rnb-colour-chill-tint-64\": \"#66aec5\",\n \"rnb-colour-chill-tint-64-rgb\": \"102, 174, 197\",\n \"rnb-colour-chill\": chill,\n \"rnb-colour-chill-rgb\": chillRgb,\n \"rnb-colour-chill-shade-64\": \"#0a5269\",\n \"rnb-colour-chill-shade-64-rgb\": \"10, 82, 105\",\n \"rnb-colour-chill-shade-48\": \"#073e4e\",\n \"rnb-colour-chill-shade-48-rgb\": \"7, 62, 78\",\n \"rnb-colour-chill-shade-32\": \"#052934\",\n \"rnb-colour-chill-shade-32-rgb\": \"5, 41, 52\",\n \"rnb-colour-rose-tint-8\": \"#faefef\",\n \"rnb-colour-rose-tint-8-rgb\": \"250, 239, 239\",\n \"rnb-colour-rose-tint-16\": \"#f4dede\",\n \"rnb-colour-rose-tint-16-rgb\": \"244, 222, 222\",\n \"rnb-colour-rose-tint-32\": \"#e9bcbc\",\n \"rnb-colour-rose-tint-32-rgb\": \"233, 188, 188\",\n \"rnb-colour-rose-tint-64\": \"#d57a7a\",\n \"rnb-colour-rose-tint-64-rgb\": \"213, 122, 122\",\n \"rnb-colour-rose\": rose,\n \"rnb-colour-rose-rgb\": roseRgb,\n \"rnb-colour-rose-shade-64\": \"#791e1e\",\n \"rnb-colour-rose-shade-64-rgb\": \"121, 30, 30\",\n \"rnb-colour-rose-shade-48\": \"#5b1717\",\n \"rnb-colour-rose-shade-48-rgb\": \"91, 23, 23\",\n \"rnb-colour-rose-shade-32\": \"#3c0f0f\",\n \"rnb-colour-rose-shade-32-rgb\": \"60, 15, 15\",\n \"rnb-colour-lavender-tint-8\": \"#fcf5fe\",\n \"rnb-colour-lavender-tint-8-rgb\": \"252, 245, 254\",\n \"rnb-colour-lavender-tint-16\": \"#f8eafd\",\n \"rnb-colour-lavender-tint-16-rgb\": \"248, 234, 253\",\n \"rnb-colour-lavender-tint-32\": \"#f0d5fb\",\n \"rnb-colour-lavender-tint-32-rgb\": \"240, 213, 251\",\n \"rnb-colour-lavender-tint-64\": \"#e2acf7\",\n \"rnb-colour-lavender-tint-64-rgb\": \"226, 172, 247\",\n \"rnb-colour-lavender\": lavender,\n \"rnb-colour-lavender-rgb\": lavenderRgb,\n \"rnb-colour-lavender-shade-64\": \"#86509b\",\n \"rnb-colour-lavender-shade-64-rgb\": \"134, 80, 155\",\n \"rnb-colour-lavender-shade-48\": \"#653c75\",\n \"rnb-colour-lavender-shade-48-rgb\": \"101, 60, 117\",\n \"rnb-colour-lavender-shade-32\": \"#43284e\",\n \"rnb-colour-lavender-shade-32-rgb\": \"67, 40, 78\",\n \"rnb-colour-sand-tint-8\": \"#fff8f1\",\n \"rnb-colour-sand-tint-8-rgb\": \"255, 248, 241\",\n \"rnb-colour-sand-tint-16\": \"#fdefe2\",\n \"rnb-colour-sand-tint-16-rgb\": \"253, 239, 226\",\n \"rnb-colour-sand-tint-32\": \"#fce0c6\",\n \"rnb-colour-sand-tint-32-rgb\": \"252, 224, 198\",\n \"rnb-colour-sand-tint-64\": \"#f9c28d\",\n \"rnb-colour-sand-tint-64-rgb\": \"249, 194, 141\",\n \"rnb-colour-sand\": sand,\n \"rnb-colour-sand-rgb\": sandRgb,\n \"rnb-colour-sand-shade-64\": \"#9d6631\",\n \"rnb-colour-sand-shade-64-rgb\": \"157, 102, 49\",\n \"rnb-colour-sand-shade-48\": \"#764c25\",\n \"rnb-colour-sand-shade-48-rgb\": \"118, 76, 37\",\n \"rnb-colour-sand-shade-32\": \"#4f3319\",\n \"rnb-colour-sand-shade-32-rgb\": \"79, 51, 25\",\n \"rnb-colour-dandelion-tint-8\": \"#fefbee\",\n \"rnb-colour-dandelion-tint-8-rgb\": \"254, 251, 238\",\n \"rnb-colour-dandelion-tint-16\": \"#fbf6dc\",\n \"rnb-colour-dandelion-tint-16-rgb\": \"251, 246, 220\",\n \"rnb-colour-dandelion-tint-32\": \"#f8ecb9\",\n \"rnb-colour-dandelion-tint-32-rgb\": \"248, 236, 185\",\n \"rnb-colour-dandelion-tint-64\": \"#f1db75\",\n \"rnb-colour-dandelion-tint-64-rgb\": \"41, 219, 117\",\n \"rnb-colour-dandelion\": dandelion,\n \"rnb-colour-dandelion-rgb\": dandelionRgb,\n \"rnb-colour-dandelion-shade-64\": \"#957f19\",\n \"rnb-colour-dandelion-shade-64-rgb\": \"149, 127, 25\",\n \"rnb-colour-dandelion-shade-48\": \"#705f13\",\n \"rnb-colour-dandelion-shade-48-rgb\": \"112, 95, 19\",\n \"rnb-colour-dandelion-shade-32\": \"#4b3f0c\",\n \"rnb-colour-dandelion-shade-32-rgb\": \"75, 63, 12\",\n \"rnb-colour-moss-tint-8\": \"#f8fbee\",\n \"rnb-colour-moss-tint-8-rgb\": \"248, 251, 238\",\n \"rnb-colour-moss-tint-16\": \"#f2f8de\",\n \"rnb-colour-moss-tint-16-rgb\": \"242, 248, 222\",\n \"rnb-colour-moss-tint-32\": \"#e4f0bc\",\n \"rnb-colour-moss-tint-32-rgb\": \"228, 240, 188\",\n \"rnb-colour-moss-tint-64\": \"#cbe27b\",\n \"rnb-colour-moss-tint-64-rgb\": \"203, 226, 123\",\n \"rnb-colour-moss\": moss,\n \"rnb-colour-moss-rgb\": mossRgb,\n \"rnb-colour-moss-shade-64\": \"#6f861f\",\n \"rnb-colour-moss-shade-64-rgb\": \"111, 134, 3\",\n \"rnb-colour-moss-shade-48\": \"#536517\",\n \"rnb-colour-moss-shade-48-rgb\": \"83, 101, 23\",\n \"rnb-colour-moss-shade-32\": \"#37430f\",\n \"rnb-colour-moss-shade-32-rgb\": \"55, 67, 15\",\n \"rnb-colour-sea-tint-8\": \"#effdf5\",\n \"rnb-colour-sea-tint-8-rgb\": \"#239, 253, 245\",\n \"rnb-colour-sea-tint-16\": \"#ddf9ea\",\n \"rnb-colour-sea-tint-16-rgb\": \"221, 249, 234\",\n \"rnb-colour-sea-tint-32\": \"#bbf3d4\",\n \"rnb-colour-sea-tint-32-rgb\": \"187, 243, 212\",\n \"rnb-colour-sea-tint-64\": \"#78e8ab\",\n \"rnb-colour-sea-tint-64-rgb\": \"120, 232, 171\",\n \"rnb-colour-sea\": sea,\n \"rnb-colour-sea-rgb\": seaRgb,\n \"rnb-colour-sea-shade-64\": \"#1c8c4f\",\n \"rnb-colour-sea-shade-64-rgb\": \"28, 140, 79\",\n \"rnb-colour-sea-shade-48\": \"#15693b\",\n \"rnb-colour-sea-shade-48-rgb\": \"21, 105, 59\",\n \"rnb-colour-sea-shade-32\": \"#0e4627\",\n \"rnb-colour-sea-shade-32-rgb\": \"14, 70, 39\",\n \"rnb-colour-reef-tint-8\": \"#effcfb\",\n \"rnb-colour-reef-tint-8-rgb\": \"239, 252, 25\",\n \"rnb-colour-reef-tint-16\": \"#ddf8f7\",\n \"rnb-colour-reef-tint-16-rgb\": \"221, 248, 247\",\n \"rnb-colour-reef-tint-32\": \"#bbf0ee\",\n \"rnb-colour-reef-tint-32-rgb\": \"187, 240, 238\",\n \"rnb-colour-reef-tint-64\": \"#78e1dc\",\n \"rnb-colour-reef-tint-64-rgb\": \"120, 225, 220\",\n \"rnb-colour-reef\": reef,\n \"rnb-colour-reef-rgb\": reefRgb,\n \"rnb-colour-reef-shade-64\": \"#1c8580\",\n \"rnb-colour-reef-shade-64-rgb\": \"28, 133, 128\",\n \"rnb-colour-reef-shade-48\": \"#156460\",\n \"rnb-colour-reef-shade-48-rgb\": \"21, 100, 96\",\n \"rnb-colour-reef-shade-32\": \"#0e4341\",\n \"rnb-colour-reef-shade-32-rgb\": \"14, 67, 65\",\n \"rnb-colour-salvia\": salvia,\n \"rnb-colour-salvia-rgb\": salviaRgb,\n \"rnb-colour-salvia-shade-32\": \"#332B4A\",\n \"rnb-colour-salvia-shade-32-rgb\": \"51, 43, 74\",\n \"rnb-colour-salvia-shade-48\": \"#4C406F\",\n \"rnb-colour-salvia-shade-48-rgb\": \"76, 64, 111\",\n \"rnb-colour-salvia-shade-64\": \"#655694\",\n \"rnb-colour-salvia-shade-64-rgb\": \"101, 86, 148\",\n \"rnb-colour-salvia-tint-8\": \"#F7F5FD\",\n \"rnb-colour-salvia-tint-8-rgb\": \"247, 245, 253\",\n \"rnb-colour-salvia-tint-16\": \"#EFECFB\",\n \"rnb-colour-salvia-tint-16-rgb\": \"239, 236, 251\",\n \"rnb-colour-salvia-tint-32\": \"#E0D8F7\",\n \"rnb-colour-salvia-tint-32-rgb\": \"224, 216, 247\",\n \"rnb-colour-salvia-tint-64\": \"#C1B2F0\",\n \"rnb-colour-salvia-tint-64-rgb\": \"193, 178, 240\",\n \"rnb-colour-sky\": sky,\n \"rnb-colour-sky-rgb\": skyRgb,\n \"rnb-colour-sky-shade-32\": \"#173E49\",\n \"rnb-colour-sky-shade-32-rgb\": \"23, 62, 73\",\n \"rnb-colour-sky-shade-48\": \"#235D6D\",\n \"rnb-colour-sky-shade-48-rgb\": \"35, 93, 109\",\n \"rnb-colour-sky-shade-64\": \"#2F7C91\",\n \"rnb-colour-sky-shade-64-rgb\": \"47, 124, 145\",\n \"rnb-colour-sky-tint-8\": \"#F0FAFD\",\n \"rnb-colour-sky-tint-8-rgb\": \"240, 250, 253\",\n \"rnb-colour-sky-tint-16\": \"#E2F5FB\",\n \"rnb-colour-sky-tint-16-rgb\": \"225, 245, 251\",\n \"rnb-colour-sky-tint-32\": \"#C5EBF6\",\n \"rnb-colour-sky-tint-32-rgb\": \"197, 235, 246\",\n \"rnb-colour-sky-tint-64\": \"#8AD8ED\",\n \"rnb-colour-sky-tint-64-rgb\": \"138, 216, 237\",\n \"rnb-colour-grad-shade-a\": \"#1A2430\",\n \"rnb-colour-grad-shade-a-rgb\": \"26, 36, 48, 1\",\n \"rnb-colour-grad-shade-tint\": \"#3E3837\",\n \"rnb-colour-grad-shade-tint-rgb\": \"62, 56, 55, 1\",\n \"rnb-colour-grad-shade-b\": \"#C46466\",\n \"rnb-colour-grad-shade-b-rgb\": \"196, 100, 102, 1\"\n};\nconst defaults = {\n \"rnb-colour-band-theta\": core[\"rnb-colour-sand-tint-64\"],\n \"rnb-colour-band-alpha\": core[\"rnb-colour-sand-tint-64\"],\n \"rnb-colour-band-beta\": core[\"rnb-colour-dandelion-tint-64\"],\n \"rnb-colour-band-gamma\": core[\"rnb-colour-moss-tint-64\"],\n \"rnb-colour-band-delta\": core[\"rnb-colour-sea-tint-64\"],\n \"rnb-colour-band-epsilon\": core[\"rnb-colour-chill-tint-32\"],\n \"rnb-colour-primary-light\": core[\"rnb-colour-midnight\"],\n \"rnb-colour-primary-inverted-light\": core[\"rnb-colour-white\"],\n \"rnb-colour-primary-light-rgb\": core[\"rnb-colour-midnight-rgb\"],\n \"rnb-colour-secondary-light\": core[\"rnb-colour-midnight-tint-64\"],\n \"rnb-colour-secondary-light-rgb\": core[\"rnb-colour-midnight-tint-64-rgb\"],\n \"rnb-colour-tertiary-light\": core[\"rnb-colour-midnight-tint-48\"],\n \"rnb-colour-tertiary-light-rgb\": core[\"rnb-colour-midnight-tint-48-rgb\"],\n \"rnb-colour-positive-light\": core[\"rnb-colour-sea-shade-64\"],\n \"rnb-colour-positive-light-rgb\": core[\"rnb-colour-sea-shade-64-rgb\"],\n \"rnb-colour-negative-light\": core[\"rnb-colour-rose\"],\n \"rnb-colour-negative-light-rgb\": core[\"rnb-colour-rose-rgb\"],\n \"rnb-colour-attention-light\": core[\"rnb-colour-sand\"],\n \"rnb-colour-attention-light-rgb\": core[\"rnb-colour-sand-rgb\"],\n \"rnb-colour-disabled-light\": core[\"rnb-colour-midnight-tint-16\"],\n \"rnb-colour-disabled-light-rgb\": core[\"rnb-colour-midnight-tint-16-rgb\"],\n \"rnb-colour-action-light\": core[\"rnb-colour-chill\"],\n \"rnb-colour-action-light-rgb\": core[\"rnb-colour-chill-rgb\"],\n \"rnb-colour-action-hover-light\": core[\"rnb-colour-chill-shade-64\"],\n \"rnb-colour-overlay-light\": core[\"rnb-colour-midnight-alpha-96\"],\n \"rnb-colour-background-light\": core[\"rnb-colour-midnight-tint-4\"],\n \"rnb-colour-card-light\": core[\"rnb-colour-white\"],\n \"rnb-colour-cell-light\": core[\"rnb-colour-white\"],\n \"rnb-colour-section-light\": core[\"rnb-colour-white\"],\n \"rnb-colour-header-light\": core[\"rnb-colour-white\"],\n \"rnb-colour-footer-light\": core[\"rnb-colour-midnight-shade-64\"],\n \"rnb-colour-primary-dark\": core[\"rnb-colour-white\"],\n \"rnb-colour-primary-inverted-dark\": core[\"rnb-colour-midnight\"],\n \"rnb-colour-secondary-dark\": core[\"rnb-colour-white-alpha-64\"],\n \"rnb-colour-tertiary-dark\": core[\"rnb-colour-white-alpha-48\"],\n \"rnb-colour-positive-dark\": core[\"rnb-colour-sea\"],\n \"rnb-colour-negative-dark\": core[\"rnb-colour-rose-tint-64\"],\n \"rnb-colour-attention-dark\": core[\"rnb-colour-sand\"],\n \"rnb-colour-disabled-dark\": core[\"rnb-colour-white-alpha-16\"],\n \"rnb-colour-action-dark\": core[\"rnb-colour-white\"],\n \"rnb-colour-action-hover-dark\": core[\"rnb-colour-white-alpha-64\"],\n \"rnb-colour-overlay-dark\": core[\"rnb-colour-black-alpha-64\"],\n \"rnb-colour-background-dark\": core[\"rnb-colour-midnight-shade-32\"],\n \"rnb-colour-card-dark\": core[\"rnb-colour-midnight-shade-64\"],\n \"rnb-colour-cell-dark\": core[\"rnb-colour-white-alpha-4\"],\n \"rnb-colour-section-dark\": core[\"rnb-colour-white-alpha-4\"],\n \"rnb-colour-header-dark\": core[\"rnb-colour-white-alpha-4\"],\n \"rnb-colour-footer-dark\": core[\"rnb-colour-white-alpha-4\"]\n};\nvar colour = __spreadValues(__spreadValues({}, core), defaults);\nvar fontFamily = {\n \"rnb-font-family-cs-clarity\": \"CSClarity, Helvetica Neue, Helvetica, Arial, sans-serif\"\n};\nvar fontSize = {\n \"rnb-font-size-micro\": \"0.625rem\",\n \"rnb-font-size-tiny\": \"0.75rem\",\n \"rnb-font-size-mini\": \"0.875rem\",\n \"rnb-font-size-small\": \"1rem\",\n \"rnb-font-size-medium\": \"1.25rem\",\n \"rnb-font-size-large\": \"1.5rem\",\n \"rnb-font-size-big\": \"2rem\",\n \"rnb-font-size-huge\": \"2.5rem\",\n \"rnb-font-size-massive\": \"2.75rem\",\n \"rnb-font-size-jumbo\": \"4rem\",\n \"rnb-font-size-gargantuan\": \"6rem\",\n \"rnb-font-size-ridiculous\": \"8rem\"\n};\nvar fontWeight = {\n \"rnb-font-weight-thin\": 100,\n \"rnb-font-weight-light\": 200,\n \"rnb-font-weight-book\": 300,\n \"rnb-font-weight-regular\": 400,\n \"rnb-font-weight-medium\": 500,\n \"rnb-font-weight-bold\": 700,\n \"rnb-font-weight-black\": 900\n};\nvar lineHeight = {\n \"rnb-line-height-reset\": \"1\",\n \"rnb-line-height-text\": \"1.5\",\n \"rnb-line-height-heading\": \"1.2\"\n};\nconst small = 375;\nconst phablet = 512;\nconst medium = 768;\nconst large = 1024;\nconst huge = 1408;\nvar mediaQuery = {\n \"rnb-mq-small\": `(min-width: ${small}px)`,\n \"rnb-mq-phablet\": `(min-width: ${phablet}px)`,\n \"rnb-mq-medium\": `(min-width: ${medium}px)`,\n \"rnb-mq-lt-medium\": `(max-width: ${medium - 1}px)`,\n \"rnb-mq-large\": `(min-width: ${large}px)`,\n \"rnb-mq-huge\": `(min-width: ${huge}px)`\n};\nvar shadow = {\n \"rnb-shadow-sea\": `0 0 0 ${colour[\"rnb-colour-transparent\"]}`,\n \"rnb-shadow-earth\": `0 0.125rem 0.25rem ${colour[\"rnb-colour-black-alpha-16\"]}`,\n \"rnb-shadow-hill\": `0 0.25rem 0.5rem ${colour[\"rnb-colour-black-alpha-16\"]}`,\n \"rnb-shadow-mountain\": `0 0.5rem 0.75rem ${colour[\"rnb-colour-black-alpha-16\"]}`,\n \"rnb-shadow-hill-light\": `0 0 0.75rem ${colour[\"rnb-colour-black-alpha-4\"]}, 0 0.4rem 0.75rem ${colour[\"rnb-colour-black-alpha-8\"]}`,\n \"rnb-shadow-earth-top\": `0 -0.125rem 0.25rem ${colour[\"rnb-colour-black-alpha-16\"]}`,\n \"rnb-shadow-hill-top\": `0 -0.25rem 0.5rem ${colour[\"rnb-colour-black-alpha-16\"]}`,\n \"rnb-shadow-mountain-top\": `0 -0.5rem 0.75rem ${colour[\"rnb-colour-black-alpha-16\"]}`\n};\nconst spacing = {\n \"rnb-spacing-none\": \"0rem\",\n \"rnb-spacing-micro\": \"0.25rem\",\n \"rnb-spacing-tiny\": \"0.5rem\",\n \"rnb-spacing-small\": \"0.75rem\",\n \"rnb-spacing-medium\": \"1rem\",\n \"rnb-spacing-large\": \"1.5rem\",\n \"rnb-spacing-big\": \"2rem\",\n \"rnb-spacing-huge\": \"3rem\",\n \"rnb-spacing-super\": \"4rem\",\n \"rnb-spacing-jumbo\": \"8rem\"\n};\nvar spacing$1 = __spreadProps(__spreadValues({}, spacing), {\n \"rnb-spacing-inset-squash-micro\": `${spacing[\"rnb-spacing-micro\"]} ${spacing[\"rnb-spacing-tiny\"]}`,\n \"rnb-spacing-inset-squash-tiny\": `${spacing[\"rnb-spacing-tiny\"]} ${spacing[\"rnb-spacing-small\"]}`,\n \"rnb-spacing-inset-squash-small\": `${spacing[\"rnb-spacing-small\"]} ${spacing[\"rnb-spacing-medium\"]}`,\n \"rnb-spacing-inset-squash-medium\": `${spacing[\"rnb-spacing-medium\"]} ${spacing[\"rnb-spacing-large\"]}`,\n \"rnb-spacing-inset-squeeze-micro\": `${spacing[\"rnb-spacing-tiny\"]} ${spacing[\"rnb-spacing-micro\"]}`,\n \"rnb-spacing-inset-squeeze-tiny\": `${spacing[\"rnb-spacing-small\"]} ${spacing[\"rnb-spacing-tiny\"]}`,\n \"rnb-spacing-inset-squeeze-medium\": `${spacing[\"rnb-spacing-large\"]} ${spacing[\"rnb-spacing-medium\"]}`\n});\nvar timing = {\n \"rnb-timing-fast\": \"250ms\",\n \"rnb-timing-normal\": \"500ms\",\n \"rnb-timing-slow\": \"1000ms\",\n \"rnb-timing-easing-in\": \"cubic-bezier(0.4, 0, 1, 1)\"\n};\nvar zIndex = {\n \"rnb-zindex-dive\": -200,\n \"rnb-zindex-default\": 1,\n \"rnb-zindex-levitate\": 2,\n \"rnb-zindex-rise\": 200,\n \"rnb-zindex-sky\": 400,\n \"rnb-zindex-top\": 600\n};\nvar gradient = {\n \"rnb-gradient-exclusive\": `linear-gradient(-180deg, ${colour[\"rnb-colour-midnight\"]}, ${colour[\"rnb-colour-midnight-shade-64\"]})`\n};\nexport { borderRadius, borderWidth, colour, fontFamily, fontSize, fontWeight, gradient, lineHeight, mediaQuery, shadow, spacing$1 as spacing, timing, zIndex };\n","export const Size = {\n TINY: 'TINY',\n SMALL: 'SMALL',\n MEDIUM: 'MEDIUM',\n LARGE: 'LARGE',\n FULL_WIDTH: 'FULL_WIDTH',\n} as const;\n\nexport const Theme = {\n LIGHT: 'LIGHT',\n DARK: 'DARK',\n} as const;\n","import type { ReactElement, ReactNode } from 'react';\nimport React from 'react';\nimport cx from 'classnames';\nimport toTitleCase from '@clearscore-group/lib.normalize.title-case';\nimport { timing } from '@clearscore/ui.rainbow.tokens';\n\nimport { Size, Theme } from './constants';\nimport styles from './loader.module.css';\n\ninterface LoaderProps {\n size?: keyof typeof Size;\n animationDuration?: string;\n isFullPage?: boolean;\n theme?: keyof typeof Theme;\n children?: ReactNode;\n}\n\nexport interface LoaderExport {\n (props: LoaderProps): ReactElement;\n Size: typeof Size;\n Theme: typeof Theme;\n}\n\nconst Loader: LoaderExport = ({\n size = Size.MEDIUM,\n animationDuration = timing['rnb-timing-normal'],\n isFullPage,\n theme,\n children,\n}): ReactElement => {\n const inlineStyles = {\n animationDuration,\n };\n\n const loader = (\n \n {children || 'loading'}\n \n );\n\n if (isFullPage) {\n return (\n
\n {loader}\n
\n );\n }\n\n return loader;\n};\n\nLoader.Size = Size;\nLoader.Theme = Theme;\n\nexport default Loader;\n","// https://github.com/uupaa/dynamic-import-polyfill\nfunction toAbsoluteURL(url) {\n const a = document.createElement('a');\n a.setAttribute('href', url); // \n return a.cloneNode(false).href; // -> \"http://example.com/hoge.html\"\n}\n\nexport function importModule(url) {\n return new Promise((resolve, reject) => {\n const vector = `$importModule$${Math.random().toString(32).slice(2)}`;\n const script = document.createElement('script');\n const destructor = () => {\n delete window[vector];\n script.onerror = null;\n script.onload = null;\n script.remove();\n URL.revokeObjectURL(script.src);\n script.src = '';\n };\n script.defer = 'defer';\n script.type = 'module';\n script.onerror = () => {\n reject(new Error(`Failed to import: ${url}`));\n destructor();\n };\n script.onload = () => {\n resolve(window[vector]);\n destructor();\n };\n const absURL = toAbsoluteURL(url);\n const loader = `import * as m from \"${absURL}\"; window.${vector} = m;`; // export Module\n // eslint-disable-next-line no-undef\n const blob = new Blob([loader], { type: 'text/javascript' });\n script.src = URL.createObjectURL(blob);\n\n document.head.appendChild(script);\n });\n}\n\nexport default importModule;\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { js as importJs, css as importCss } from '@clearscore-group/lib.helpers.injectors';\nimport { hasComponent, loadComponent } from '@clearscore-group/lib.helpers.cache';\n\n/**\n * Object used to store the current vertical Component and associated store,\n * which is then used maintain the store when navigating within the same vertical\n */\nconst currentStore = {};\n\ninterface LazyLoadComponentProps {\n component: {\n routeProps: object;\n computedMatch: object;\n parentProps: object;\n name: string;\n vertical?: string;\n component?: string;\n };\n handleComplete?: () => void;\n handleError?: (error: unknown) => void;\n}\n\n/**\n * Component to lazy load a react component from the CDN, requires object which must contain\n * a component and id property\n */\nconst LazyLoadComponent = ({\n component,\n handleError = () => {},\n handleComplete = () => {},\n}: LazyLoadComponentProps) => {\n const { name, vertical, component: componentName } = component;\n const portaName = name.split('.').join('--');\n const [loaded, setLoaded] = useState<{\n Component: React.ComponentType | null;\n js: boolean;\n css: boolean;\n }>({\n Component: null,\n js: false,\n css: false,\n });\n const assetPath = vertical || componentName;\n const cssSrc = assetPath?.replace('index.js', `${name}.css`);\n\n const loadJs = useCallback(async () => {\n try {\n await importJs(assetPath);\n const Component = loadComponent(name) || loadComponent(portaName);\n setLoaded((prevLoaded) => ({ ...prevLoaded, Component, js: true }));\n } catch (e) {\n handleError(e);\n }\n }, [name, handleError]);\n\n const loadCss = useCallback(async () => {\n try {\n await importCss(cssSrc);\n setLoaded((prevLoaded) => ({ ...prevLoaded, css: true }));\n } catch (e) {\n handleError(e);\n }\n }, [name, handleError]);\n\n useEffect(() => {\n const componentInCache = hasComponent(name) || hasComponent(portaName);\n\n // If not loaded in local state, but loaded in cache, set in local state from cache\n if (!loaded.Component && componentInCache) {\n const Component = loadComponent(name) || loadComponent(portaName);\n setLoaded({ Component, js: true, css: true });\n } else if (!componentInCache) {\n // Otherwise if not cached, let's load up CSS and JS\n loadJs();\n loadCss();\n }\n }, [name, vertical, componentName, loaded.Component, loadJs, loadCss]);\n\n // If not everything loaded, let's return `null`\n if (!Object.values(loaded).every((val) => !!val)) {\n return null;\n }\n // Component should be defined after check above\n const Component = loaded.Component!;\n\n handleComplete();\n\n return (\n \n );\n};\n\nexport default LazyLoadComponent;\n","function injectScript(src) {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.async = true;\n script.src = src;\n script.addEventListener('load', resolve);\n script.addEventListener('error', () => reject(new Error(`Error loading script. src: ${src}`)));\n script.addEventListener('abort', () => reject(new Error(`Script loading aborted. src: ${src}`)));\n document.head.appendChild(script);\n });\n}\n\nexport default injectScript;\n","import React, { lazy, useEffect } from 'react';\nimport PropTypes from 'prop-types';\nimport { css } from '@clearscore-group/lib.helpers.injectors';\nimport Loader from '@clearscore/ui.rainbow.loader';\nimport { getCookie } from '@clearscore-group/lib.helpers.cookies';\n\n// needed for chrome 62, edge 17, edge 18\nimport { importModule } from './polyfill/import-module';\nimport LegacyBrowserLazyComponent from './legacy-browser-lazy-component';\n\nconst currentStore = {};\n\n// Placeholder, needed for tests\nlet getLazy = () => () => null;\nif (process.env.MODULE === 'esm') {\n getLazy = (path) => lazy(() => importModule(path).then((module) => ({ default: module.Component })));\n}\n\nconst useLazy = (assetPath) => {\n const lazyComponentStore = React.useRef({}).current;\n if (!lazyComponentStore[assetPath]) {\n lazyComponentStore[assetPath] = getLazy(assetPath.replace('index.js', 'index.mjs').replace('/resources/', '/'));\n }\n return lazyComponentStore[assetPath];\n};\n\nconst EsmComponent = ({ component }) => {\n const { vertical, component: componentName, parentProps, routeProps, computedMatch } = component;\n const assetPath = vertical ?? componentName;\n const Lazy = useLazy(assetPath);\n\n // fetching config causes a rerender of the whole app\n // this checks allows us to wait it out\n // so will show the loading spinner once instead of twice\n if (parentProps.currentMarketFetchStatus?.isPending) {\n return ;\n }\n\n return (\n }>\n \n \n );\n};\n\nEsmComponent.propTypes = {\n component: PropTypes.shape({\n routeProps: PropTypes.object.isRequired,\n computedMatch: PropTypes.object.isRequired,\n parentProps: PropTypes.object.isRequired,\n name: PropTypes.string.isRequired,\n vertical: PropTypes.string,\n component: PropTypes.string,\n esmodules: PropTypes.bool,\n }).isRequired,\n};\n\nconst LazyLoadComponent = ({ component }) => {\n const { vertical, component: componentName, esmodules } = component;\n const assetPath = vertical ?? componentName;\n const hasForcedCjs = getCookie('experiment-esm') === 'development'; // allow us to force cjs verticals for cypress\n const isModernBrowser = process.env.MODULE === 'esm'; // is this porta mjs core build\n const isEsmVertical = isModernBrowser && esmodules && !hasForcedCjs;\n\n useEffect(() => {\n // we need to load the styles which are named like `index.css` because of naming clashes\n // for both modules and nomodules\n // while we are rending esm and cjs together we need to check that the asset path is esm\n if (isEsmVertical) {\n css(`${assetPath.slice(0, assetPath.indexOf('index'))}index.css`.replace('/resources/', '/'));\n }\n }, [assetPath]);\n\n // while we are rending esm and cjs together we need to check that the asset path is esm\n if (isEsmVertical) {\n return ;\n }\n\n return ;\n};\n\nLazyLoadComponent.propTypes = {\n component: PropTypes.shape({\n routeProps: PropTypes.object.isRequired,\n computedMatch: PropTypes.object.isRequired,\n parentProps: PropTypes.object.isRequired,\n name: PropTypes.string.isRequired,\n vertical: PropTypes.string,\n component: PropTypes.string,\n esmodules: PropTypes.bool,\n }).isRequired,\n};\n\nexport default LazyLoadComponent;\n","const ROUTES = 'CS/ROUTES';\n/* eslint-disable import/prefer-default-export */\nexport const ROUTES_REINITIALISE = `${ROUTES}_REINITIALISE`;\n","import * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\n\nimport { ROUTES_REINITIALISE } from '../types';\n\n/**\n * Route initial state\n * @returns {array}\n */\nconst initialState = {\n current: 'global',\n fetchStatus: requestStatuses.SUCCESS,\n};\n\n/**\n * Routes Domain Reducer\n * @param state\n * @param action\n */\nexport default function routesReducer(state = initialState, { type, payload } = {}) {\n switch (type) {\n case ROUTES_REINITIALISE:\n return {\n ...state,\n current: payload.market,\n };\n default:\n return state;\n }\n}\n","import { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\n/**\n * Returns an object of routes by id\n * @param collection Array\n * @param id String (id or id.key etc)\n */\nconst objectById = (collection, id = 'id') =>\n collection.reduce((state, item) => {\n const key = resolveProp(id, item);\n return {\n ...state,\n [key]: item,\n };\n }, {});\n\n/**\n * Returns a simplified object with an array of ids\n * @param collection\n * @param id\n * @param name\n */\n// eslint-disable-next-line default-param-last\nexport const lookupById = (collection, id = 'id', name) =>\n collection.reduce((state, item) => {\n const reduceState = { ...state };\n if (item[id]) {\n if (Array.isArray(item[id])) {\n item[id].forEach((idvName) => {\n if (!state[idvName]) {\n reduceState[idvName] = {\n id: idvName,\n [name]: [item.id],\n };\n } else {\n reduceState[idvName][name].push(item.id);\n }\n });\n } else if (!state[item[id]]) {\n reduceState[item[id]] = {\n id: item[id],\n [name]: [item.id],\n };\n } else {\n reduceState[item[id]][name].push(item.id);\n }\n }\n return reduceState;\n }, {});\n\nexport default objectById;\n","export default (routes, accountIDVStatus) => {\n const routeHasVisibility = ({ visibility }) =>\n (Array.isArray(visibility) && visibility.includes(accountIDVStatus)) || !visibility || !accountIDVStatus;\n\n return routes.filter((route) => routeHasVisibility(route));\n};\n","import { loadRoutes } from '@clearscore-group/lib.helpers.cache';\nimport objectById from '@clearscore-group/lib.helpers.state-normalise';\nimport * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\nimport { ROUTES_REINITIALISE } from '../types';\nimport filterRoutesByStatus from './lib/filterRoutesByStatus';\n\n/**\n * Normalise routes by id\n * @param routes\n * @return {{byId, allIds: Array}}\n */\nfunction normaliseById(routes) {\n const byId = objectById(routes);\n const allIds = Object.keys(byId);\n\n return {\n status: requestStatuses.INITIAL,\n byId,\n allIds,\n };\n}\n\n/**\n * Route initial state\n * @returns {array}\n */\nconst initialState = normaliseById(loadRoutes());\n\n/**\n * Routes Reducer\n * @param state\n * @param action\n */\nexport default function routesReducer(state = initialState, action = {}) {\n switch (action.type) {\n case sessionTypes.TIMEOUT_SUCCESS:\n case sessionTypes.LOGOUT_SUBMIT:\n case ROUTES_REINITIALISE:\n if (action && action.payload && action.payload.routes) {\n const { routes, accountIDVStatus } = action.payload;\n return {\n ...normaliseById([...loadRoutes(), ...filterRoutesByStatus(routes, accountIDVStatus)]),\n status: requestStatuses.SUCCESS,\n };\n }\n return {\n ...state,\n status: requestStatuses.SUCCESS,\n };\n default:\n return state;\n }\n}\n","import { loadRoutes } from '@clearscore-group/lib.helpers.cache';\nimport { lookupById } from '@clearscore-group/lib.helpers.state-normalise';\nimport * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\nimport { ROUTES_REINITIALISE } from '../types';\nimport filterRoutesByStatus from './lib/filterRoutesByStatus';\n\n/**\n * Normalise routes by categories\n * @param routes\n * @return {{byId, allIds: Array}}\n */\nfunction normaliseCategories(routes) {\n const byId = lookupById(routes, 'category', 'routes');\n const allIds = Object.keys(byId);\n\n return {\n status: requestStatuses.SUCCESS,\n byId,\n allIds,\n };\n}\n\n/**\n * Route initial state\n * @returns {array}\n */\nconst initialState = normaliseCategories(loadRoutes());\n\n/**\n * Routes Reducer\n * @param state\n * @param action\n */\nexport default function routesReducer(state = initialState, action = {}) {\n switch (action.type) {\n case sessionTypes.TIMEOUT_SUCCESS:\n case sessionTypes.LOGOUT_SUBMIT:\n case ROUTES_REINITIALISE: {\n const { routes, accountIDVStatus } = action.payload || {};\n\n if (routes) {\n return {\n ...normaliseCategories([...loadRoutes(), ...filterRoutesByStatus(routes, accountIDVStatus)]),\n status: requestStatuses.SUCCESS,\n };\n }\n\n return {\n ...state,\n status: requestStatuses.SUCCESS,\n };\n }\n\n default:\n return state;\n }\n}\n","import { loadRoutes } from '@clearscore-group/lib.helpers.cache';\nimport { lookupById } from '@clearscore-group/lib.helpers.state-normalise';\nimport * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\nimport { ROUTES_REINITIALISE } from '../types';\nimport filterRoutesByStatus from './lib/filterRoutesByStatus';\n\n/**\n * Normalise routes by templates\n * @param routes\n * @return {{byId, allIds: Array}}\n */\nfunction normaliseTemplates(routes) {\n const byId = lookupById(routes, 'template', 'routes');\n const allIds = Object.keys(byId);\n\n return {\n status: requestStatuses.SUCCESS,\n byId,\n allIds,\n };\n}\n\n/**\n * Route initial state\n * @returns {array}\n */\nconst initialState = normaliseTemplates(loadRoutes());\n\n/**\n * Routes Reducer\n * @param state\n * @param action\n */\nexport default function routesReducer(state = initialState, action = {}) {\n switch (action.type) {\n case sessionTypes.TIMEOUT_SUCCESS:\n case sessionTypes.LOGOUT_SUBMIT:\n case ROUTES_REINITIALISE:\n if (action && action.payload && action.payload.routes) {\n const { routes, accountIDVStatus } = action.payload;\n\n return {\n ...normaliseTemplates([...loadRoutes(), ...filterRoutesByStatus(routes, accountIDVStatus)]),\n status: requestStatuses.SUCCESS,\n };\n }\n return {\n ...state,\n status: requestStatuses.SUCCESS,\n };\n default:\n return state;\n }\n}\n","import { loadRoutes } from '@clearscore-group/lib.helpers.cache';\nimport { lookupById } from '@clearscore-group/lib.helpers.state-normalise';\nimport * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\nimport { ROUTES_REINITIALISE } from '../types';\nimport filterRoutesByStatus from './lib/filterRoutesByStatus';\n\n/**\n * Normalise routes by status\n * @param routes\n * @return {{byId, allIds: Array}}\n */\nfunction normaliseStatus(routes) {\n const byId = lookupById(routes, 'idvStatus', 'routes');\n const allIds = Object.keys(byId);\n\n return {\n status: requestStatuses.INITIAL,\n byId,\n allIds,\n };\n}\n\n/**\n * Route initial state\n * @returns {array}\n */\nconst initialState = normaliseStatus(loadRoutes());\n\n/**\n * Routes Reducer\n * @param state\n * @param action\n */\nexport default function routesReducer(state = initialState, action = {}) {\n switch (action.type) {\n case sessionTypes.TIMEOUT_SUCCESS:\n case sessionTypes.LOGOUT_SUBMIT:\n case ROUTES_REINITIALISE:\n if (action && action.payload && action.payload.routes) {\n const { routes, accountIDVStatus } = action.payload;\n\n return {\n ...normaliseStatus([...loadRoutes(), ...filterRoutesByStatus(routes, accountIDVStatus)]),\n status: requestStatuses.SUCCESS,\n };\n }\n return {\n ...state,\n status: requestStatuses.SUCCESS,\n };\n default:\n return state;\n }\n}\n","import domainImport from './routes.domain';\nimport byId from './routes.byId';\nimport byCategory from './routes.byCategory';\nimport byTemplate from './routes.byTemplate';\nimport byStage from './routes.byStage';\nimport segments from './routes.segmentation';\n\nexport const domain = domainImport;\nexport const entities = {\n routes: byId,\n routeCategories: byCategory,\n routeTemplate: byTemplate,\n routeStages: byStage,\n routeSegments: segments,\n};\n","import * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\nimport { ROUTES_REINITIALISE } from '../types';\n\n/**\n * Route segmentation Reducer\n * @param state\n * @param action\n */\nexport default function routesSegmentation(state = {}, action = {}) {\n switch (action.type) {\n case sessionTypes.TIMEOUT_SUCCESS:\n case sessionTypes.LOGOUT_SUBMIT:\n case ROUTES_REINITIALISE:\n if (action?.payload?.segmentation) {\n const { segmentation } = action.payload;\n\n return {\n segmentation,\n status: requestStatuses.SUCCESS,\n };\n }\n return {\n segmentation: { groups: [] },\n status: requestStatuses.SUCCESS,\n };\n default:\n return state;\n }\n}\n","export const PROFILE_FETCH = 'CS/PROFILE_FETCH';\nexport const PROFILE_FETCH_SUCCESS = `CS/PROFILE_FETCH_SUCCESS`;\nexport const PROFILE_FETCH_ERROR = `CS/PROFILE_FETCH_ERROR`;\n\nexport const PROFILE_SAVE = 'CS/PROFILE_SAVE';\nexport const PROFILE_SAVE_SUCCESS = `CS/PROFILE_SAVE_SUCCESS`;\nexport const PROFILE_SAVE_ERROR = `CS/PROFILE_SAVE_ERROR`;\n\nexport const PROFILE_REMOVE = 'CS/PROFILE_REMOVE';\nexport const PROFILE_REMOVE_SUCCESS = `CS/PROFILE_REMOVE_SUCCESS`;\nexport const PROFILE_REMOVE_ERROR = `CS/PROFILE_REMOVE_ERROR`;\n\nexport const PROFILE_ERASE = 'CS/PROFILE_ERASE';\nexport const PROFILE_ERASE_SUCCESS = `CS/PROFILE_ERASE_SUCCESS`;\nexport const PROFILE_ERASE_ERROR = `CS/PROFILE_ERASE_ERROR`;\n\nexport const PROFILE_FETCH_REPORT_ADDRESSES = 'CS/PROFILE_FETCH_REPORT_ADDRESSES';\nexport const PROFILE_FETCH_REPORT_ADDRESSES_SUCCESS = `CS/PROFILE_FETCH_REPORT_ADDRESSES_SUCCESS`;\nexport const PROFILE_FETCH_REPORT_ADDRESSES_ERROR = `CS/PROFILE_FETCH_REPORT_ADDRESSES_ERROR`;\n\nexport const PROFILE_SAVE_CURRENT_ADDRESS = 'CS/PROFILE_SAVE_CURRENT_ADDRESS';\nexport const PROFILE_SAVE_CURRENT_ADDRESS_SUCCESS = `CS/PROFILE_SAVE_CURRENT_ADDRESS_SUCCESS`;\nexport const PROFILE_SAVE_CURRENT_ADDRESS_ERROR = `CS/PROFILE_SAVE_CURRENT_ADDRESS_ERROR`;\n\nexport const PROFILE_SEND_USER_DATA = 'CS/PROFILE_SEND_USER_DATA';\nexport const PROFILE_SEND_USER_DATA_SUCCESS = `CS/PROFILE_SEND_USER_DATA_SUCCESS`;\nexport const PROFILE_SEND_USER_DATA_ERROR = `CS/PROFILE_SEND_USER_DATA_ERROR`;\n\nexport const PROFILE_SEND_USER_DATA_UNVERIFIED_EMAIL = 'CS/PROFILE_SEND_USER_DATA_UNVERIFIED_EMAIL';\n\nexport const PROFILE_RESEND_EMAIL_VERIFICATION = 'CS/PROFILE_RESEND_EMAIL_VERIFICATION';\nexport const PROFILE_RESEND_EMAIL_VERIFICATION_SUCCESS = `CS/PROFILE_RESEND_EMAIL_VERIFICATION_SUCCESS`;\nexport const PROFILE_RESEND_EMAIL_VERIFICATION_ERROR = `CS/PROFILE_RESEND_EMAIL_VERIFICATION_ERROR`;\n\nexport const PROFILE_MKTG_PREF_FETCH = 'CS/PROFILE_MKTG_PREF_FETCH';\nexport const PROFILE_MKTG_PREF_FETCH_SUCCESS = `CS/PROFILE_MKTG_PREF_FETCH_SUCCESS`;\nexport const PROFILE_MKTG_PREF_FETCH_ERROR = `CS/PROFILE_MKTG_PREF_FETCH_ERROR`;\n\nexport const PROFILE_MKTG_PREF_SAVE = 'CS/PROFILE_MKTG_PREF_SAVE';\nexport const PROFILE_MKTG_PREF_SAVE_SUCCESS = `CS/PROFILE_MKTG_PREF_SAVE_SUCCESS`;\nexport const PROFILE_MKTG_PREF_SAVE_ERROR = `CS/PROFILE_MKTG_PREF_SAVE_ERROR`;\n\nexport const PROFILE_SAVE_TERMS = 'CS/PROFILE_SAVE_TERMS';\nexport const PROFILE_SAVE_TERMS_SUCCESS = `CS/PROFILE_SAVE_TERMS_SUCCESS`;\nexport const PROFILE_SAVE_TERMS_ERROR = `CS/PROFILE_SAVE_TERMS_ERROR`;\n","import createAction from '@clearscore-group/lib.helpers.create-action';\nimport createRequestPayload from '@clearscore-group/lib.helpers.create-request-payload';\nimport {\n PROFILE_FETCH,\n PROFILE_FETCH_SUCCESS,\n PROFILE_SAVE,\n PROFILE_REMOVE,\n PROFILE_SAVE_SUCCESS,\n PROFILE_ERASE,\n PROFILE_FETCH_REPORT_ADDRESSES,\n PROFILE_SAVE_CURRENT_ADDRESS,\n PROFILE_SEND_USER_DATA,\n PROFILE_SEND_USER_DATA_UNVERIFIED_EMAIL,\n PROFILE_RESEND_EMAIL_VERIFICATION,\n PROFILE_MKTG_PREF_FETCH,\n PROFILE_MKTG_PREF_SAVE,\n PROFILE_SAVE_TERMS,\n} from '@clearscore-group/lib.constants.profile-action-types';\n\n// PROFILE_FETCH\nexport const fetch = () => createAction(PROFILE_FETCH, createRequestPayload('international', '/profile-service/v2/'));\n\n// PROFILE_FETCH_SUCCESS\n// @todo: this seems to only needed for the angular integration\nexport const fetchSuccess = (profileData) => createAction(PROFILE_FETCH_SUCCESS, profileData);\n\n// PROFILE_SAVE\nexport const save = (profile) =>\n createAction(PROFILE_SAVE, createRequestPayload('international', '/profile-service/v2/', 'patch', profile));\n\nexport const remove = () =>\n createAction(PROFILE_REMOVE, createRequestPayload('caesium', '/accounts/@session.auth.accountId', 'delete'));\n\nexport const erase = () =>\n createAction(PROFILE_ERASE, createRequestPayload('international', '/profile-service/v2/', 'delete'));\n\n// PROFILE_SAVE_SUCCESS\n// @todo: this seems to only needed for the angular integration\nexport const saveSuccess = (profileData) => createAction(PROFILE_SAVE_SUCCESS, profileData);\n\n// PROFILE_FETCH_REPORT_ADDRESSES\nexport const fetchReportAddresses = () =>\n createAction(\n PROFILE_FETCH_REPORT_ADDRESSES,\n createRequestPayload('international', '/profile-service/v2/report/credit-report-address'),\n );\n\n// PROFILE_SAVE_CURRENT_ADDRESS\nexport const saveCurrentAddress = (addressId) =>\n createAction(\n PROFILE_SAVE_CURRENT_ADDRESS,\n createRequestPayload('international', `/profile-service/v2/account/current-address/${addressId}`, 'put'),\n );\n\n// PROFILE_SEND_USER_DATA\nexport const sendUserData = () =>\n createAction(\n PROFILE_SEND_USER_DATA,\n createRequestPayload('international', '/profile-service/v1/send-user-data', 'post'),\n );\n\n// PROFILE_RESEND_EMAIL_VERIFICATION\nexport const resendEmailVerification = ({ email }) =>\n createAction(\n PROFILE_RESEND_EMAIL_VERIFICATION,\n createRequestPayload('international', '/profile-service/v2/resend-email-verification', 'post', { email }),\n );\n\n// PROFILE_SEND_USER_DATA_UNVERIFIED_EMAIL\nexport const sendUserDataUnverifiedEmail = () => createAction(PROFILE_SEND_USER_DATA_UNVERIFIED_EMAIL);\n\nexport const fetchMarketingPreferences = () =>\n createAction(\n PROFILE_MKTG_PREF_FETCH,\n createRequestPayload('international', '/profile-service/v2/marketing-preferences'),\n );\n\nexport const saveMarketingPreferences = (mktgPreferences) =>\n createAction(\n PROFILE_MKTG_PREF_SAVE,\n createRequestPayload('international', '/profile-service/v2/marketing-preferences', 'patch', mktgPreferences),\n );\n\n// this action has been created to not conflict with profile save functionality in other verticals\nexport const saveTerms = (profile) =>\n createAction(PROFILE_SAVE_TERMS, createRequestPayload('international', '/profile-service/v2/', 'patch', profile));\n","import * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport { types as identityTypes } from '@clearscore-group/lib.redux.identity';\nimport {\n PROFILE_FETCH,\n PROFILE_FETCH_SUCCESS,\n PROFILE_FETCH_ERROR,\n PROFILE_SAVE,\n PROFILE_SAVE_SUCCESS,\n PROFILE_SAVE_ERROR,\n PROFILE_REMOVE,\n PROFILE_REMOVE_SUCCESS,\n PROFILE_REMOVE_ERROR,\n PROFILE_ERASE,\n PROFILE_ERASE_ERROR,\n PROFILE_ERASE_SUCCESS,\n PROFILE_FETCH_REPORT_ADDRESSES,\n PROFILE_FETCH_REPORT_ADDRESSES_SUCCESS,\n PROFILE_FETCH_REPORT_ADDRESSES_ERROR,\n PROFILE_SAVE_CURRENT_ADDRESS,\n PROFILE_SAVE_CURRENT_ADDRESS_SUCCESS,\n PROFILE_SAVE_CURRENT_ADDRESS_ERROR,\n PROFILE_SEND_USER_DATA,\n PROFILE_SEND_USER_DATA_SUCCESS,\n PROFILE_SEND_USER_DATA_ERROR,\n PROFILE_RESEND_EMAIL_VERIFICATION,\n PROFILE_RESEND_EMAIL_VERIFICATION_SUCCESS,\n PROFILE_RESEND_EMAIL_VERIFICATION_ERROR,\n PROFILE_MKTG_PREF_FETCH,\n PROFILE_MKTG_PREF_FETCH_SUCCESS,\n PROFILE_MKTG_PREF_FETCH_ERROR,\n PROFILE_MKTG_PREF_SAVE,\n PROFILE_MKTG_PREF_SAVE_SUCCESS,\n PROFILE_MKTG_PREF_SAVE_ERROR,\n PROFILE_SAVE_TERMS,\n PROFILE_SAVE_TERMS_SUCCESS,\n PROFILE_SAVE_TERMS_ERROR,\n} from '@clearscore-group/lib.constants.profile-action-types';\n\nconst initialState = {\n fetchStatus: requestStatuses.INITIAL,\n saveCurrentAddressStatus: requestStatuses.INITIAL,\n reportAddressesFetchStatus: requestStatuses.INITIAL,\n sendUserDataStatus: requestStatuses.INITIAL,\n resendEmailStatus: requestStatuses.INITIAL,\n mktgFetchStatus: requestStatuses.INITIAL,\n mktgSaveStatus: requestStatuses.INITIAL,\n};\n\nconst transformPhoneNumber = (requestData) => ({\n ...requestData,\n ...{\n phoneNumber: requestData.phoneNumber.number,\n phoneCountryCode: requestData.phoneNumber.countryCode,\n phoneType: requestData.phoneNumber.type,\n },\n});\n\nconst transformSaveSuccessRequestData = (requestData) =>\n requestData.phoneNumber && typeof requestData.phoneNumber !== 'string'\n ? transformPhoneNumber(requestData)\n : requestData;\n\nexport default (state = initialState, action = {}) => {\n const { type, payload, requestData } = action;\n\n // N.B phoneNumber property in profile-service GET and PATCH methods isn't consistent\n // 1. .save() action is creating requestData passed from phone-form.container that's matching PATCH method\n // 2. phoneNumber data needs to be transformed back to its original shape provided by profile-service GET method\n const saveSuccessRequestData = requestData && transformSaveSuccessRequestData(requestData);\n\n switch (type) {\n case PROFILE_FETCH:\n return {\n ...state,\n fetchStatus: requestStatuses.PENDING,\n };\n case PROFILE_FETCH_SUCCESS:\n return {\n ...state,\n data: {\n ...payload,\n },\n fetchStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_FETCH_ERROR:\n return {\n ...state,\n fetchStatus: requestStatuses.ERROR,\n };\n case PROFILE_SAVE: {\n const { modified, ...stateWithoutModified } = state;\n return {\n ...stateWithoutModified,\n saveStatus: requestStatuses.PENDING,\n };\n }\n case PROFILE_SAVE_SUCCESS:\n return {\n ...state,\n data: {\n ...state.data,\n ...saveSuccessRequestData,\n },\n modified: payload.modified,\n saveStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_SAVE_ERROR:\n return {\n ...state,\n saveStatus: requestStatuses.ERROR,\n };\n case PROFILE_ERASE:\n case PROFILE_REMOVE:\n return {\n ...state,\n removeStatus: requestStatuses.PENDING,\n };\n case PROFILE_ERASE_SUCCESS:\n case PROFILE_REMOVE_SUCCESS:\n return {\n ...state,\n data: {\n ...state.data,\n ...requestData,\n },\n removeStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_ERASE_ERROR:\n case PROFILE_REMOVE_ERROR:\n return {\n ...state,\n removeStatus: requestStatuses.ERROR,\n };\n case PROFILE_FETCH_REPORT_ADDRESSES:\n return {\n ...state,\n reportAddressesFetchStatus: requestStatuses.PENDING,\n };\n case PROFILE_FETCH_REPORT_ADDRESSES_SUCCESS:\n return {\n ...state,\n reportAddresses: [...Object.values(payload || {})],\n reportAddressesFetchStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_FETCH_REPORT_ADDRESSES_ERROR:\n return {\n ...state,\n reportAddressesFetchStatus: requestStatuses.ERROR,\n };\n case PROFILE_SAVE_CURRENT_ADDRESS:\n return {\n ...state,\n saveCurrentAddressStatus: requestStatuses.PENDING,\n };\n case PROFILE_SAVE_CURRENT_ADDRESS_SUCCESS:\n return {\n ...state,\n data: {\n ...state.data,\n ...requestData,\n },\n saveCurrentAddressStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_SAVE_CURRENT_ADDRESS_ERROR:\n return {\n ...state,\n saveCurrentAddressStatus: requestStatuses.ERROR,\n };\n case PROFILE_SEND_USER_DATA:\n return {\n ...state,\n sendUserDataStatus: requestStatuses.PENDING,\n };\n case PROFILE_SEND_USER_DATA_SUCCESS:\n return {\n ...state,\n sendUserDataStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_SEND_USER_DATA_ERROR:\n return {\n ...state,\n sendUserDataStatus: requestStatuses.ERROR,\n };\n case PROFILE_RESEND_EMAIL_VERIFICATION:\n return {\n ...state,\n resendEmailStatus: requestStatuses.PENDING,\n };\n case PROFILE_RESEND_EMAIL_VERIFICATION_SUCCESS:\n return {\n ...state,\n resendEmailStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_RESEND_EMAIL_VERIFICATION_ERROR:\n return {\n ...state,\n resendEmailStatus: requestStatuses.ERROR,\n };\n case PROFILE_MKTG_PREF_FETCH:\n return {\n ...state,\n mktgFetchStatus: requestStatuses.PENDING,\n };\n case PROFILE_MKTG_PREF_FETCH_SUCCESS:\n return {\n ...state,\n mktg: {\n ...state.mktg,\n ...payload,\n },\n mktgFetchStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_MKTG_PREF_FETCH_ERROR:\n return {\n ...state,\n mktgFetchStatus: requestStatuses.ERROR,\n };\n case PROFILE_MKTG_PREF_SAVE:\n return {\n ...state,\n mktgSaveStatus: requestStatuses.PENDING,\n };\n case PROFILE_MKTG_PREF_SAVE_SUCCESS:\n return {\n ...state,\n mktg: {\n ...state.mktg,\n ...requestData,\n },\n mktgSaveStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_MKTG_PREF_SAVE_ERROR:\n return {\n ...state,\n mktgSaveStatus: requestStatuses.ERROR,\n };\n case identityTypes.IDENTITY_IDENTIFY_SUCCESS:\n return {\n ...state,\n data: {\n ...state.data,\n accountIDVStatus: payload.accountIDVStatus,\n },\n };\n case PROFILE_SAVE_TERMS: {\n const { modified, ...stateWithoutModified } = state;\n return {\n ...stateWithoutModified,\n termsSaveStatus: requestStatuses.PENDING,\n };\n }\n case PROFILE_SAVE_TERMS_SUCCESS:\n return {\n ...state,\n data: {\n ...state.data,\n ...saveSuccessRequestData,\n },\n modified: payload.modified,\n termsSaveStatus: requestStatuses.SUCCESS,\n };\n case PROFILE_SAVE_TERMS_ERROR:\n return {\n ...state,\n termsSaveStatus: requestStatuses.ERROR,\n };\n default:\n return state;\n }\n};\n","/* eslint-disable import/prefer-default-export */\nimport profileDomain from './profile.domain';\n\nexport const domain = profileDomain;\n","import { AU, GB, ZA, CA, NZ } from '@clearscore-group/lib.config.i18n';\n\nfunction formatAddressParts(addressParts) {\n return addressParts.filter(Boolean).join(', ');\n}\n\nconst isBuildingNumberWithinBuildingName = (buildingNumber, buildingName) => {\n if (!buildingName) return false;\n\n const regex = /(\\d+)/g;\n const numbersInName = buildingName.match(regex);\n\n if (!numbersInName) return false;\n\n const isNumberInName = numbersInName.find((numberInName) => numberInName === buildingNumber);\n\n return !!isNumberInName;\n};\n\nexport function formatAddress(address, market) {\n const flatOrAbodeNumber = address.flatNumber || address.abodeNumber;\n let addressLine1;\n if (flatOrAbodeNumber) {\n if (isBuildingNumberWithinBuildingName(address.buildingNumber, address.buildingName)) {\n addressLine1 = formatAddressParts([flatOrAbodeNumber, address.buildingName]);\n } else {\n addressLine1 = formatAddressParts([flatOrAbodeNumber, address.buildingName, address.buildingNumber]);\n }\n } else if (isBuildingNumberWithinBuildingName(address.buildingNumber, address.buildingName)) {\n addressLine1 = formatAddressParts([address.buildingName]);\n } else {\n addressLine1 = formatAddressParts([address.buildingNumber, address.buildingName]);\n }\n const streetOrRoad = address.street || address.road;\n const townOrCity = address.town || address.city;\n const countyOrState = address.county || address.state;\n const postcodeOrPincode = address.postcode || address.pinCode;\n\n switch (market) {\n case AU: {\n const noCommasParts = [address.city, address.state, address.postalCode || address.postcode]\n .filter(Boolean)\n .join(' ');\n if (address.flatUnitNumber || address.streetNumber || address.street) {\n return formatAddressParts([\n address.flatUnitNumber,\n address.streetNumber,\n address.street,\n noCommasParts,\n ]);\n }\n return formatAddressParts([address.addressLine1, address.addressLine2, noCommasParts]);\n }\n case NZ: {\n const noCommasParts = [address.city, address.state, address.postalCode || address.postcode]\n .filter(Boolean)\n .join(' ');\n if (address.flatNumber || address.buildingNumber || address.street) {\n return formatAddressParts([address.flatNumber, address.buildingNumber, address.street, noCommasParts]);\n }\n return formatAddressParts([address.addressLine1, address.addressLine2, noCommasParts]);\n }\n\n case ZA:\n return formatAddressParts([\n address.flatNumber,\n address.buildingNumber,\n address.buildingName,\n streetOrRoad,\n townOrCity,\n countyOrState,\n postcodeOrPincode,\n ]);\n\n case CA:\n return formatAddressParts([\n address.addressLine2,\n address.flatNumber,\n address.buildingNumber,\n address.addressLine1,\n streetOrRoad,\n townOrCity,\n countyOrState,\n address.zipCode,\n postcodeOrPincode,\n ]);\n case GB:\n default:\n return formatAddressParts([addressLine1, streetOrRoad, townOrCity, countyOrState, postcodeOrPincode]);\n }\n}\n\nexport default function normalizeAddress(value) {\n if (!value) {\n return value;\n }\n\n const regex = /[A-Za-z0-9'.\\-\\s'/,]*/g;\n return value.match(regex).join('');\n}\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport { formatAddress } from '@clearscore-group/lib.normalize.address';\nimport { selectors as marketSelectors } from '@clearscore-group/lib.redux.market';\n\nconst year = 365;\nconst day = 24;\nconst hour = 60;\nconst minute = 60;\nconst second = 1000;\nconst millisInYear = second * minute * hour * day * year;\n\nconst getAccountId = (state) => resolveProp('profile.data.accountId', state);\nconst getUuid = (state) => resolveProp('profile.data.uuid', state);\nconst getEmail = (state) => resolveProp('profile.data.email', state);\nconst getEmailVerified = (state) => resolveProp('profile.data.emailVerified', state);\nconst getFirstName = (state) => resolveProp('profile.data.firstName', state);\nconst getMiddleNames = (state) => resolveProp('profile.data.middleNames', state);\nconst getLastName = (state) => resolveProp('profile.data.lastName', state);\nconst getDOB = (state) => {\n const dob = resolveProp('profile.data.dob', state) || '';\n return dob.replace(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/, '$3-$2-$1');\n};\nconst getAddress = (state) => resolveProp('profile.data.address', state) || {};\nconst getAddressId = (state) => resolveProp('profile.data.address.addressId', state) || {};\nconst getAddressBuildingName = (state) => resolveProp('profile.data.address.buildingName', state);\nconst getAddressFlatNumber = (state) => resolveProp('profile.data.address.flatNumber', state);\nconst getAddressRoad = (state) => resolveProp('profile.data.address.road', state);\nconst getAddressPinCode = (state) => resolveProp('profile.data.address.pinCode', state);\nconst getAddressCity = (state) => resolveProp('profile.data.address.city', state);\nconst getAddressState = (state) => resolveProp('profile.data.address.state', state);\nconst getAddressCurrent = (state) => resolveProp('profile.data.address.currentAddress', state);\nconst getPreviousAddresses = (state) => resolveProp('profile.data.previousAddresses', state) || [];\nconst getPhoneNumber = (state) => resolveProp('profile.data.phoneNumber', state);\nconst getPhoneCountryCode = (state) => resolveProp('profile.data.phoneCountryCode', state);\nconst getPhoneType = (state) => resolveProp('profile.data.phoneType', state);\nconst getPhoneVerified = (state) => resolveProp('profile.data.phoneVerified', state);\nconst getGender = (state) => resolveProp('profile.data.gender', state);\nconst getIDDocuments = (state) => resolveProp('profile.data.idDocuments', state);\nconst getEmployerName = (state) => resolveProp('profile.data.employerName', state);\nconst getMonthlyIncome = (state) => resolveProp('profile.data.income.amount', state);\nconst marketSelector = (state) => marketSelectors.getActiveMarket(state);\n\nexport default createSelector(\n getAccountId,\n getUuid,\n getEmail,\n getEmailVerified,\n getFirstName,\n getMiddleNames,\n getLastName,\n getDOB,\n getAddress,\n getAddressId,\n getAddressBuildingName,\n getAddressFlatNumber,\n getAddressRoad,\n getAddressPinCode,\n getAddressCity,\n getAddressState,\n getAddressCurrent,\n getPreviousAddresses,\n getPhoneNumber,\n getPhoneCountryCode,\n getPhoneType,\n getPhoneVerified,\n getGender,\n getIDDocuments,\n getEmployerName,\n getMonthlyIncome,\n marketSelector,\n (\n accountId,\n uuid,\n email,\n emailVerified,\n firstName,\n middleNames,\n lastName,\n dob,\n address,\n addressId,\n addressBuildingName,\n addressFlatNumber,\n addressRoad,\n addressPinCode,\n addressCity,\n addressState,\n addressCurrent,\n previousAddresses,\n phoneNumber,\n phoneCountryCode,\n phoneType,\n phoneVerified,\n gender,\n idDocuments,\n employerName,\n monthlyIncome,\n market,\n ) => {\n // dob formatted as yyy-mm-dd within selector. happy days.\n const ageInYears = (new Date() - new Date(dob)) / millisInYear;\n const age = Math.floor(ageInYears);\n const pan = ((idDocuments || []).find(({ type }) => type === 'PAN') || {}).value;\n const addressLineOne =\n addressCurrent || [addressFlatNumber, addressBuildingName, addressRoad].filter(Boolean).join(', ');\n\n return {\n accountId,\n uuid,\n email,\n emailVerified,\n firstName,\n middleNames,\n lastName,\n dob,\n age,\n phoneNumber,\n phoneCountryCode,\n phoneType,\n phoneVerified,\n gender,\n pan,\n employerName,\n monthlyIncome,\n address,\n previousAddresses,\n addressLineOne,\n addressCity,\n addressState,\n addressPinCode,\n idDocuments,\n fullName: [firstName, middleNames, lastName].filter(Boolean).join(' '),\n addressId,\n fullAddress: formatAddress(address, market),\n previousFullAddresses: previousAddresses.map((prevAddress) => formatAddress(prevAddress, market)),\n };\n },\n);\n","import { createSelector } from 'reselect';\nimport resolveRequest, { getRequestStatus } from '@clearscore-group/lib.helpers.resolve-request';\n\nconst getFetchStatus = (state) => resolveRequest(state, 'profile.fetchStatus');\nconst getSaveStatus = (state) => resolveRequest(state, 'profile.saveStatus');\nconst getRemoveStatus = (state) => resolveRequest(state, 'profile.removeStatus');\nconst getReportAddressesFetchStatus = (state) => resolveRequest(state, 'profile.reportAddressesFetchStatus');\nconst getSaveCurrentAddressStatus = (state) => resolveRequest(state, 'profile.saveCurrentAddressStatus');\nconst getSendUserDataStatus = (state) => resolveRequest(state, 'profile.sendUserDataStatus');\nconst getResendEmailStatus = (state) => resolveRequest(state, 'profile.resendEmailStatus');\nconst getMarketingFetchStatus = (state) => resolveRequest(state, 'profile.mktgFetchStatus');\nconst getMarketingSaveStatus = (state) => resolveRequest(state, 'profile.mktgSaveStatus');\nconst getTermsSaveStatus = (state) => resolveRequest(state, 'profile.termsSaveStatus');\n\nexport default createSelector(\n getFetchStatus,\n getSaveStatus,\n getRemoveStatus,\n getReportAddressesFetchStatus,\n getSaveCurrentAddressStatus,\n getSendUserDataStatus,\n getResendEmailStatus,\n getMarketingFetchStatus,\n getMarketingSaveStatus,\n getTermsSaveStatus,\n (\n fetchStatus,\n saveStatus,\n removeStatus,\n reportAddressesFetchStatus,\n saveCurrentAddressStatus,\n sendUserDataStatusParam,\n resendEmailStatus,\n mktgFetchStatus,\n mktgSaveStatus,\n termsSaveStatus,\n ) => ({\n fetch: getRequestStatus(fetchStatus),\n save: getRequestStatus(saveStatus),\n remove: getRequestStatus(removeStatus),\n reportAddressesFetch: getRequestStatus(reportAddressesFetchStatus),\n saveCurrentAddress: getRequestStatus(saveCurrentAddressStatus),\n sendUserData: getRequestStatus(sendUserDataStatusParam),\n resendEmail: getRequestStatus(resendEmailStatus),\n mktgFetch: getRequestStatus(mktgFetchStatus),\n mktgSave: getRequestStatus(mktgSaveStatus),\n termsSave: getRequestStatus(termsSaveStatus),\n }),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getUserStatus = (state) => resolveProp('profile.data.userStatus', state);\nconst getAllowSoftSearch = (state) =>\n resolveProp('profile.data.userPreferences.products.allowSoftSearch', state) || false;\nconst getWalkthrough = (state) => resolveProp('profile.data.userPreferences.ftw', state) || {};\nconst getAccountIDVStatus = (state) => resolveProp('profile.data.accountIDVStatus', state);\nconst getFailureReason = (state) => resolveProp('profile.data.failureReason', state);\nconst getEmploymentStatus = (state) => resolveProp('profile.data.employmentStatus', state);\nconst getResidentialStatus = (state) => resolveProp('profile.data.residentialStatus', state);\nconst getScoreBand = (state) => resolveProp('profile.data.userPreferences.scoreBand', state);\nconst getUserNovelty = (state) => resolveProp('profile.data.isNewUser', state);\n\nexport default createSelector(\n getAccountIDVStatus,\n getUserStatus,\n getFailureReason,\n getAllowSoftSearch,\n getWalkthrough,\n getEmploymentStatus,\n getResidentialStatus,\n getScoreBand,\n getUserNovelty,\n (\n accountIDVStatus,\n userStatus,\n failureReason,\n allowSoftSearch,\n walkthrough,\n employmentStatus,\n residentialStatus,\n scoreBand,\n isNewUser,\n ) => ({\n accountIDVStatus,\n userStatus,\n failureReason,\n allowSoftSearch,\n walkthrough,\n employmentStatus,\n residentialStatus,\n scoreBand,\n isNewUser,\n }),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getTncAgreedVersion = (state) => resolveProp('profile.data.tncAgreedVersion', state);\nconst getTncAgreedDate = (state) => resolveProp('profile.data.tncAgreedDate', state) || '';\n\nexport default createSelector(getTncAgreedVersion, getTncAgreedDate, (tncAgreedVersion, tncAgreedDate) => ({\n tncAgreedVersion,\n tncAgreedDate,\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getMarketingNewsEmailSubscribed = (state) => resolveProp('profile.mktg.newsEmailSubscribed', state);\nconst getMarketingOffersEmailSubscribed = (state) => resolveProp('profile.mktg.offersEmailSubscribed', state);\nconst getMarketingTipsEmailSubscribed = (state) => resolveProp('profile.mktg.tipsEmailSubscribed', state);\nconst getMarketingInfoEmailSubscribed = (state) => resolveProp('profile.mktg.infoEmailSubscribed', state);\nconst getMarketingPreferencesVersion = (state) => resolveProp('profile.data.mktgPreferencesVersion', state);\nconst getMarketingRtcEmailSubscribed = (state) => resolveProp('profile.mktg.rtcEmailSubscribed', state);\nconst getMarketingCoachEmailSubscribed = (state) => resolveProp('profile.mktg.coachEmailSubscribed', state);\nconst getMarketingEmailSubscribed = (state) => resolveProp('profile.mktg.emailSubscribed', state);\n\nexport default createSelector(\n getMarketingNewsEmailSubscribed,\n getMarketingOffersEmailSubscribed,\n getMarketingTipsEmailSubscribed,\n getMarketingInfoEmailSubscribed,\n getMarketingPreferencesVersion,\n getMarketingRtcEmailSubscribed,\n getMarketingCoachEmailSubscribed,\n getMarketingEmailSubscribed,\n (\n newsEmailSubscribed,\n offersEmailSubscribed,\n tipsEmailSubscribed,\n infoEmailSubscribed,\n mktgPreferencesVersion,\n rtcEmailSubscribed,\n coachEmailSubscribed,\n emailSubscribed,\n ) => {\n const preferences = {\n newsEmailSubscribed,\n offersEmailSubscribed,\n tipsEmailSubscribed,\n infoEmailSubscribed,\n mktgPreferencesVersion,\n rtcEmailSubscribed,\n coachEmailSubscribed,\n emailSubscribed,\n };\n\n return preferences;\n },\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getBankName = (state) => resolveProp('profile.data.bankName', state) || null;\nconst getAnnualIncome = (state) => resolveProp('profile.data.annualIncome', state) || {};\nconst getIncome = (state) => resolveProp('profile.data.income', state) || {};\n\nexport default createSelector(getBankName, getAnnualIncome, getIncome, (bankName, annualIncome, income) => ({\n bankName,\n annualIncome,\n income,\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getUserPreferences = (state) => resolveProp('profile.data.userPreferences', state) || {};\n\nexport default createSelector(getUserPreferences, ({ coaching }) => coaching || []);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getUserPreferenceProducts = (state) => resolveProp('profile.data.userPreferences.products', state) || {};\n\nexport default createSelector(getUserPreferenceProducts, (products) => products);\n","import profileGetSimple from './profile.getSimple';\nimport profileGetPredicate from './profile.getPredicate';\nimport profileGetStatus from './profile.getStatus';\nimport profileGetTerms from './profile.getTerms';\nimport profileGetMarketing from './profile.getMarketing';\nimport profileGetFinancial from './profile.getFinancial';\nimport profileGetCoachingProducts from './profile.getCoachingProducts';\nimport profileGetProducts from './profile.getProducts';\nimport profileGetAdditionalQuestionData from './profile.getAdditionalQuestionData';\nimport profileGetRemortgageData from './profile.getRemortgageData';\nimport profileGetReportAddresses from './profile.getReportAddresses';\nimport profileGetDocumentsMeta from './profile.getDocumentsMeta';\nimport profileGetSaveModified from './profile.getSaveModified';\nimport profileIsTwoFactorAuthEnabled from './profile.isTwoFactorAuthEnabled';\nimport profileGetSelfieRequired from './profile.getSelfieRequired';\nimport profileGetUserSettings from './profile.getUserSettings';\n\nexport const getSimple = profileGetSimple;\nexport const getPredicate = profileGetPredicate;\nexport const getStatus = profileGetStatus;\nexport const getTerms = profileGetTerms;\nexport const getMarketing = profileGetMarketing;\nexport const getFinancial = profileGetFinancial;\nexport const getCoachingProducts = profileGetCoachingProducts;\nexport const getProducts = profileGetProducts;\nexport const getAdditionalQuestionData = profileGetAdditionalQuestionData;\nexport const getRemortgageData = profileGetRemortgageData;\nexport const getReportAddresses = profileGetReportAddresses;\nexport const getDocumentsMeta = profileGetDocumentsMeta;\nexport const getSaveModified = profileGetSaveModified;\nexport const isTwoFactorAuthEnabled = profileIsTwoFactorAuthEnabled;\nexport const getSelfieRequired = profileGetSelfieRequired;\nexport const getUserSettings = profileGetUserSettings;\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getAnnualIncome = (state) => resolveProp('profile.data.annualIncome', state);\nconst getEmploymentStatus = (state) => resolveProp('profile.data.employmentStatus', state);\nconst getResidentialStatus = (state) => resolveProp('profile.data.residentialStatus', state);\nconst getAddresses = (state) => {\n const addresses = [resolveProp('profile.data.address', state)];\n const previousAddresses = resolveProp('profile.data.previousAddresses', state);\n if (previousAddresses && previousAddresses.length) addresses.push(...previousAddresses);\n return addresses;\n};\n\nexport default createSelector(\n getAnnualIncome,\n getEmploymentStatus,\n getResidentialStatus,\n getAddresses,\n (annualIncome, employmentStatus, residentialStatus, addresses) => ({\n annualIncome,\n employmentStatus,\n residentialStatus,\n addresses,\n }),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getUserPreferences = (state) => resolveProp('profile.data.userPreferences', state);\n\nexport default createSelector(getUserPreferences, (userPreferences) =>\n userPreferences && userPreferences.remortgages ? userPreferences.remortgages : undefined,\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getReportAddresses = (state) => resolveProp('profile.reportAddresses', state);\n\nexport default createSelector(getReportAddresses, (addresses) => addresses);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getDocumentsMeta = (state) => resolveProp('profile.data.documentsMeta', state);\n\nexport default createSelector(getDocumentsMeta, (documentsMeta) => ({\n documentsMeta,\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getSaveModified = (state) => resolveProp('profile.modified', state);\n\nexport default createSelector(getSaveModified, (modified) => modified);\n","import { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nexport default (state) => resolveProp('profile.data.2faEnabled', state);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getSelfieRequired = (state) => resolveProp('profile.data.idvSelfieRequired', state);\n\nexport default createSelector(getSelfieRequired, (selfieRequired) => selfieRequired);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getUserSettings = (state) => resolveProp('profile.data.userSettings', state);\n\nexport default createSelector(getUserSettings, (userSettings) => userSettings);\n","import * as profileTypes from '@clearscore-group/lib.constants.profile-action-types';\n\nimport * as actionsImport from './actions';\nimport * as constantsImport from './constants';\nimport * as reducersImport from './reducers';\nimport * as selectorsImport from './selectors';\n\nexport const actions = actionsImport;\nexport const constants = constantsImport;\nexport const reducers = reducersImport;\nexport const selectors = selectorsImport;\nexport const types = profileTypes;\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport { selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\n\nconst getRoutes = (state) => resolveProp('entities.routes.byId', state) || {};\nconst getRouteIdsByCategory = (state, { menu }) =>\n resolveProp(`entities.routeCategories.byId.${menu}.routes`, state) || [];\n\nexport default createSelector(\n getRoutes,\n getRouteIdsByCategory,\n profileSelectors.getStatus,\n (routes, routeIdsByCategory, { accountIDVStatus }) =>\n Object.values(routes).filter(\n ({ id, visibility }) =>\n routeIdsByCategory.includes(id) && (!visibility || visibility.includes(accountIDVStatus)),\n ),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport { selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\n\nconst routesAll = (state) => resolveProp('entities.routes.allIds', state) || [];\nconst getRoutes = (state) => resolveProp('entities.routes.byId', state) || {};\n\nexport default createSelector(routesAll, getRoutes, profileSelectors.getStatus, (ids, routes, { accountIDVStatus }) =>\n Object.entries(routes)\n .filter(\n ([key, { visibility, isTakeover }]) =>\n ids.includes(key) && !isTakeover && (!visibility || visibility.includes(accountIDVStatus)),\n )\n .reduce((state, [key]) => {\n state.push(routes[key]);\n return state;\n }, []),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst routeStages = (state, stage) => resolveProp(`entities.routeStages.byId.${stage}.routes`, state) || [];\nconst getRoutes = (state) => resolveProp('entities.routes.byId', state) || {};\n\nexport default createSelector(routeStages, getRoutes, (ids, routes) =>\n Object.keys(routes)\n .filter((key) => ids.includes(key))\n .reduce((state, key) => {\n state.push(routes[key]);\n return state;\n }, []),\n);\n","import { createSelector } from 'reselect';\nimport { selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\n\nimport getRoutesByStage from './routesStagesSelector';\n\nexport const setKbaRoute = (routes) =>\n routes.find((route) => route?.path === window.location.pathname) || routes[0] || {};\n\nconst getRouteByIDVStatus = (state) => {\n const { accountIDVStatus = 'CREATE_ACCOUNT', failureReason } = profileSelectors.getStatus(state);\n\n const routes = getRoutesByStage(state, failureReason || accountIDVStatus);\n\n // it enables to render open banking identification routes with kba status\n // by default a user will still be redirect to /kba from a route without kba status\n if (accountIDVStatus === 'KBA') {\n return setKbaRoute(routes);\n }\n\n return routes[0] || {};\n};\n\nexport default createSelector(getRouteByIDVStatus, (route) => ({\n route,\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getCurrentPath = (state, props) =>\n resolveProp('location.pathname', props) || resolveProp('router.location.pathname', state) || '';\n\nexport default createSelector(getCurrentPath, (path) => path);\n","import { createSelector } from 'reselect';\nimport resolveRequest from '@clearscore-group/lib.helpers.resolve-request';\n\nconst getActiveMarket = (state) => resolveRequest(state, 'market.activeMarket');\nconst getRoutesMarket = (state) => resolveRequest(state, 'routes.current');\nconst getFetchStatus = (state) => resolveRequest(state, 'market.fetchStatus');\n\nexport default createSelector(\n getActiveMarket,\n getRoutesMarket,\n getFetchStatus,\n (activeMarket, routesMarket, fetchStatus) => activeMarket === routesMarket && fetchStatus === 'success',\n);\n","/*!@license\n * UAParser.js v0.7.28\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2021 Faisal Salman \n * Licensed under MIT License\n */\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '0.7.28',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major', // deprecated\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 255;\n\n\n ///////////\n // Helper\n //////////\n\n\n var util = {\n extend : function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n has : function (str1, str2) {\n return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;\n },\n lowerize : function (str) {\n return str.toLowerCase();\n },\n major : function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g,'').split(\".\")[0] : undefined;\n },\n trim : function (str, len) {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n\n ///////////////\n // Map helper\n //////////////\n\n\n var mapper = {\n\n rgx : function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length == 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length == 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n str : function (str, map) {\n\n for (var i in map) {\n // check if array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (util.has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (util.has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n }\n };\n\n\n ///////////////\n // String map\n //////////////\n\n\n var maps = {\n\n browser : {\n // Safari < 3.0\n oldSafari : {\n version : {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n }\n },\n oldEdge : {\n version : {\n '0.1' : '12.',\n '21' : '13.',\n '31' : '14.',\n '39' : '15.',\n '41' : '16.',\n '42' : '17.',\n '44' : '18.'\n }\n }\n },\n\n os : {\n windows : {\n version : {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n }\n }\n }\n };\n\n\n //////////////\n // Regex map\n /////////////\n\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n // breaking change (reserved for next major release):\n ///edge\\/([\\w\\.]+)/i // Old Edge (Trident)\n //], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [\n\n // Presto based\n /(opera\\smini)\\/([\\w\\.-]+)/i, // Opera Mini\n /(opera\\s[mobiletab]{3,6})\\b.+version\\/([\\w\\.-]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/\\s]+)([\\w\\.]+)/i, // Opera\n ], [NAME, VERSION], [\n /opios[\\/\\s]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, 'Opera Mini']], [\n /\\sopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, 'Opera']], [\n\n // Mixed\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant\\s|iemobile|slim)(?:browser)?[\\/\\s]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(ba?idubrowser)[\\/\\s]?([\\w\\.]+)/i, // Baidu Browser\n /(?:ms|\\()(ie)\\s([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\\/([\\w\\.-]+)/i,\n // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([\\w\\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:[\\s\\/]uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UCBrowser']], [\n /(?:windowswechat)?\\sqbcore\\/([\\w\\.]+)\\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser\n ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[:\\s]([\\w\\.]{1,9})\\b.+like\\sgecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /yabrowser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [\n /focus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, 'Firefox Focus']], [\n /opt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, 'Opera Touch']], [\n /coc_coc_browser\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, 'Opera Coast']],\n [/xiaomi\\/miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI Browser']], [\n /fxios\\/([\\w\\.-]+)/i // Firefox for iOS\n ], [VERSION, [NAME, 'Firefox']], [\n /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360\n ], [[NAME, '360 Browser']], [\n /(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /\\s(electron)\\/([\\w\\.]+)\\ssafari/i, // Electron-based App\n /(tesla)(?:\\sqtcarbrowser|\\/(20[12]\\d\\.[\\w\\.-]+))/i, // Tesla\n /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/\\s]?([\\w\\.]+)/i // QQBrowser/Baidu App/2345 Browser\n ], [NAME, VERSION], [\n /(MetaSr)[\\/\\s]?([\\w\\.]+)/i, // SouGouBrowser\n /(LBBROWSER)/i // LieBao Browser\n ], [NAME], [\n\n // WebView\n /;fbav\\/([\\w\\.]+);/i // Facebook App for iOS & Android with version\n ], [VERSION, [NAME, 'Facebook']], [\n /FBAN\\/FBIOS|FB_IAB\\/FB4A/i // Facebook App for iOS & Android without version\n ], [[NAME, 'Facebook']], [\n /safari\\s(line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(chromium|instagram)[\\/\\s]([\\w\\.-]+)/i // Chromium/Instagram\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+)\\s.*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)|\\s)/i // Chrome Headless\n ], [VERSION, [NAME, 'Chrome Headless']], [\n\n /\\swv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, 'Chrome WebView'], VERSION], [\n\n /droid.+\\sversion\\/([\\w\\.]+)\\b.+(?:mobile\\ssafari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android Browser']], [\n\n /(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.]+)\\s.*mobile\\/\\w+\\s(safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w\\.]+)\\s.*(mobile\\s?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape)\\/([\\w\\.-]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /ile\\svr;\\srv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, 'Firefox Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)\\s[\\w\\s\\-]+\\/[\\w\\.]+$/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+)\\s.+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir\n /(links)\\s\\(([\\w\\.]+)/i, // Links\n /(gobrowser)\\/?([\\w\\.]*)/i, // GoBrowser\n /(ice\\s?browser)\\/v?([\\w\\._]+)/i, // ICE Browser\n /(mosaic)[\\/\\s]([\\w\\.]+)/i // Mosaic\n ], [NAME, VERSION]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, util.lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|armv?8e?l?)\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows\\s(ce|mobile);\\sppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, util.lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n // Ordered by popularity\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus\\s10)/i\n ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy\\snexus)/i,\n /\\ssamsung[\\s-]([\\w-]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n\n // Apple\n /\\((ip(?:hone|od)[\\s\\w]*);/i // iPod/iPhone\n ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [\n /\\((ipad);[\\w\\s\\),;-]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+\\s\\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [\n\n // Huawei\n /\\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\\d{2})/i,\n ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [\n /d\\/huawei([\\w\\s-]+)[;\\)]/i,\n /\\b(nexus\\s6p|vog-[at]?l\\d\\d|ane-[at]?l[x\\d]\\d|eml-a?l\\d\\da?|lya-[at]?l\\d[\\dc]|clt-a?l\\d\\di?|ele-l\\d\\d)/i,\n /\\b(\\w{2,4}-[atu][ln][01259][019])[;\\)\\s]/i\n ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\s\\w]+)(?:\\sbuild|\\))/i, // Xiaomi POCO\n /\\b;\\s(\\w+)\\sbuild\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[\\s\\-_]?note?[\\s_]?(?:\\d\\w)?)\\sbuild/i, // Xiaomi Hongmi\n /\\b(redmi[\\s\\-_]?(?:note|k)?[\\w\\s_]+)(?:\\sbuild|\\))/i, // Xiaomi Redmi\n /\\b(mi[\\s\\-_]?(?:a\\d|one|one[\\s_]plus|note lte)?[\\s_]?(?:\\d?\\w?)[\\s_]?(?:plus)?)\\sbuild/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [\n /\\b(mi[\\s\\-_]?(?:pad)(?:[\\w\\s_]+))(?:\\sbuild|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [\n\n // OPPO\n /;\\s(\\w+)\\sbuild.+\\soppo/i,\n /\\s(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /\\svivo\\s(\\w+)(?:\\sbuild|\\))/i,\n /\\s(v[12]\\d{3}\\w?[at])(?:\\sbuild|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\s(rmx[12]\\d{3})(?:\\sbuild|;)/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)\\b[\\w\\s]+build\\//i,\n /\\smot(?:orola)?[\\s-](\\w*)/i,\n /((?:moto[\\s\\w\\(\\)]+|xt\\d{3,4}|nexus\\s6)(?=\\sbuild|\\)))/i\n ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [\n /\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i\n ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3})\\sbuild|\\s3\\.[\\s\\w;-]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [\n /(lm-?f100[nv]?|nexus\\s[45])/i,\n /lg[e;\\s\\/-]+((?!browser|netcast)\\w+)/i,\n /\\blg(\\-?[\\d\\w]+)\\sbuild/i\n ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[\\w\\-\\s]+)/i,\n /lenovo\\s?(s(?:5000|6000)(?:[\\w-]+)|tab(?:[\\s\\w]+)|yt[\\d\\w-]{6}|tb[\\d\\w-]{6})/i // Lenovo tablets\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia\\s\\d+)/i,\n /nokia[\\s_-]?([\\w\\.-]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /droid.+;\\s(pixel\\sc)[\\s)]/i // Google Pixel C\n ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [\n /droid.+;\\s(pixel[\\s\\daxl]{0,6})(?:\\sbuild|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+\\s([c-g]\\d{4}|so[-l]\\w+|xq-a\\w[4-7][12])(?=\\sbuild\\/|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n /sony\\stablet\\s[ps]\\sbuild\\//i,\n /(?:sony)?sgp\\w+(?:\\sbuild\\/|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [\n\n // OnePlus\n /\\s(kb2005|in20[12]5|be20[12][59])\\b/i,\n /\\ba000(1)\\sbuild/i, // OnePlus\n /\\boneplus\\s(a\\d{4})[\\s)]/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi)(\\sbuild\\/|\\))/i, // Kindle Fire without Silk\n /(kf[a-z]+)(\\sbuild\\/|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [\n /(sd|kf)[0349hijorstuw]+(\\sbuild\\/|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [\n\n // BlackBerry\n /\\((playbook);[\\w\\s\\),;-]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10;\\s(\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus\\s7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [\n /\\s(z[es]6[027][01][km][ls]|zenfone\\s\\d\\w?)\\b/i\n ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus\\s9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[;_\\s-]{1,2}([\\w\\s]+(?=\\)|\\sbuild)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)-(\\w*)/i,\n /(alcatel|geeksphone|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid[x\\d\\.\\s;]+\\s([ab][1-7]\\-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+;\\s(m[1-5]\\snote)\\sbuild/i,\n /\\bmz-([\\w-]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp)\\s([\\w\\s]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft);\\s(lumia[\\s\\w]+)/i, // Microsoft Lumia\n /(lenovo)[_\\s-]?([\\w-]+)/i, // Lenovo\n /linux;.+(jolla);/i, // Jolla\n /droid.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(archos)\\s(gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /\\s(nook)[\\w\\s]+build\\/(\\w+)/i, // Nook\n /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i, // Dell Streak\n /[;\\/]\\s?(le[\\s\\-]+pan)[\\s\\-]+(\\w{1,9})\\sbuild/i, // Le Pan Tablets\n /[;\\/]\\s?(trinity)[\\-\\s]*(t\\d{3})\\sbuild/i, // Trinity Tablets\n /\\b(gigaset)[\\s\\-]+(q\\w{1,9})\\sbuild/i, // Gigaset Tablets\n /\\b(vodafone)\\s([\\w\\s]+)(?:\\)|\\sbuild)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /\\s(surface\\sduo)\\s/i // Surface Duo\n ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [\n /droid\\s[\\d\\.]+;\\s(fp\\du?)\\sbuild/i\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /\\s(u304aa)\\sbuild/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /sie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /[;\\/]\\s?(rct\\w+)\\sbuild/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /[;\\/\\s](venue[\\d\\s]{2,7})\\sbuild/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /[;\\/]\\s?(q(?:mv|ta)\\w+)\\sbuild/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /[;\\/]\\s(?:barnes[&\\s]+noble\\s|bn[rt])([\\w\\s\\+]*)\\sbuild/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /[;\\/]\\s(tm\\d{3}\\w+)\\sbuild/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /;\\s(k88)\\sbuild/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /;\\s(nx\\d{3}j)\\sbuild/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /[;\\/]\\s?(gen\\d{3})\\sbuild.*49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /[;\\/]\\s?(zur\\d{3})\\sbuild/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /[;\\/]\\s?((zeki)?tb.*\\b)\\sbuild/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /[;\\/]\\s([yr]\\d{2})\\sbuild/i,\n /[;\\/]\\s(dragon[\\-\\s]+touch\\s|dt)(\\w{5})\\sbuild/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /[;\\/]\\s?(ns-?\\w{0,9})\\sbuild/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /[;\\/]\\s?((nxa|Next)-?\\w{0,9})\\sbuild/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /[;\\/]\\s?(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05]))\\sbuild/i\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones\n /[;\\/]\\s?(lvtel\\-)?(v1[12])\\sbuild/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /;\\s(ph-1)\\s/i\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1\n /[;\\/]\\s?(v(100md|700na|7011|917g).*\\b)\\sbuild/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /[;\\/]\\s?(trio[\\s\\w\\-\\.]+)\\sbuild/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /[;\\/]\\s?tu_(1491)\\sbuild/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w\\s]+)\\sbuild/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint)\\s(\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [\n /droid\\s[\\d\\.]+;\\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [\n /droid\\s[\\d\\.]+;\\s(ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /\\s(ouya)\\s/i, // Ouya\n /(nintendo)\\s([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+;\\s(shield)\\sbuild/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation\\s[345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [\n /[\\s\\(;](xbox(?:\\sone)?(?!;\\sxbox))[\\s\\);]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [\n /(?:linux;\\snetcast.+smarttv|lg\\snetcast\\.tv-201\\d)/i, // LG SmartTV\n ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [\n /(apple)\\s?tv/i // Apple TV\n ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [\n /droid.+aft([\\w])(\\sbuild\\/|\\))/i // Fire TV\n ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i // Sharp\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n /hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [\n /[\\s\\/\\(](android\\s|smart[-\\s]?|opera\\s)tv[;\\)\\s]/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app\\/[\\d\\.]+\\s/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /droid.+;\\s(glass)\\s\\d/i // Google Glass\n ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [\n /droid\\s[\\d\\.]+;\\s(wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?:\\sqtcarbrowser|\\/20[12]\\d\\.[\\w\\.-]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: build|\\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?;\\s([^;]+?)(?: build|\\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\s(tablet|tab)[;\\/]/i, // Unidentifiable Tablet\n /\\s(mobile)(?:[;\\/]|\\ssafari)/i // Unidentifiable Mobile\n ], [[TYPE, util.lowerize]], [\n /(android[\\w\\.\\s\\-]{0,9});.+build/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']], [\n /(phone)/i\n ], [[TYPE, MOBILE]]\n ],\n\n engine : [[\n\n /windows.+\\sedge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, 'EdgeHTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i // iCab\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft\\s(windows)\\s(vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows)\\snt\\s6\\.2;\\s(arm)/i, // Windows RT\n /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i, // Windows Phone\n /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)(?!.+xbox)/i\n ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [\n /(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i\n ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i, // iOS\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i,\n /(macintosh|mac(?=_powerpc)\\s)(?!.+haiku)/i // Mac OS\n ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n // Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS\n /(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|sailfish|contiki)[\\/\\s-]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/\\s]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, 'BlackBerry']], [\n /(?:symbian\\s?os|symbos|s60(?=;)|series60)[\\/\\s-]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla.+\\(mobile;.+gecko.+firefox/i // Firefox OS\n ], [[NAME, 'Firefox OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, 'Chromecast']], [\n /(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i // Chromium OS\n ], [[NAME, 'Chromium OS'], VERSION],[\n\n // Console\n /(nintendo|playstation)\\s([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox);\\s+xbox\\s([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // GNU/Linux based\n /(mint)[\\/\\s\\(\\)]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[;\\s]/i, // Mageia/VectorLinux\n /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\\sgnu\\/linux)?(?:\\slinux)?[\\/\\s-]?(?!chrom|package)([\\w\\.-]*)/i,\n // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware\n // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus\n /(hurd|linux)\\s?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu)\\s?([\\w\\.]*)/i, // GNU\n\n // BSD based\n /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly\n /(haiku)\\s(\\w+)/i // Haiku\n ], [NAME, VERSION], [\n\n // Other\n /(sunos)\\s?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i, // Solaris\n /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i, // AIX\n /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia\n /(unix)\\s?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n\n /////////////////\n // Constructor\n ////////////////\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === 'object') {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = { name: undefined, version: undefined };\n mapper.rgx.call(_browser, _ua, _rgxmap.browser);\n _browser.major = util.major(_browser.version); // deprecated\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = { architecture: undefined };\n mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = { vendor: undefined, model: undefined, type: undefined };\n mapper.rgx.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n this.getEngine = function () {\n var _engine = { name: undefined, version: undefined };\n mapper.rgx.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = { name: undefined, version: undefined };\n mapper.rgx.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = {\n NAME : NAME,\n MAJOR : MAJOR, // deprecated\n VERSION : VERSION\n };\n UAParser.CPU = {\n ARCHITECTURE : ARCHITECTURE\n };\n UAParser.DEVICE = {\n MODEL : MODEL,\n VENDOR : VENDOR,\n TYPE : TYPE,\n CONSOLE : CONSOLE,\n MOBILE : MOBILE,\n SMARTTV : SMARTTV,\n TABLET : TABLET,\n WEARABLE: WEARABLE,\n EMBEDDED: EMBEDDED\n };\n UAParser.ENGINE = {\n NAME : NAME,\n VERSION : VERSION\n };\n UAParser.OS = {\n NAME : NAME,\n VERSION : VERSION\n };\n\n ///////////\n // Export\n //////////\n\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === 'function' && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== 'undefined') {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (uastring) {\n parser.setUA(uastring);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n// Save the previous value of the device variable.\nvar previousDevice = window.device;\n\nvar device = {};\n\nvar changeOrientationList = [];\n\n// Add device as a global object.\nwindow.device = device;\n\n// The element.\nvar documentElement = window.document.documentElement;\n\n// The client user agent string.\n// Lowercase, so we can use the more efficient indexOf(), instead of Regex\nvar userAgent = window.navigator.userAgent.toLowerCase();\n\n// Detectable television devices.\nvar television = ['googletv', 'viera', 'smarttv', 'internet.tv', 'netcast', 'nettv', 'appletv', 'boxee', 'kylo', 'roku', 'dlnadoc', 'pov_tv', 'hbbtv', 'ce-html'];\n\n// Main functions\n// --------------\n\ndevice.macos = function () {\n return find('mac');\n};\n\ndevice.ios = function () {\n return device.iphone() || device.ipod() || device.ipad();\n};\n\ndevice.iphone = function () {\n return !device.windows() && find('iphone');\n};\n\ndevice.ipod = function () {\n return find('ipod');\n};\n\ndevice.ipad = function () {\n var iPadOS13Up = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n return find('ipad') || iPadOS13Up;\n};\n\ndevice.android = function () {\n return !device.windows() && find('android');\n};\n\ndevice.androidPhone = function () {\n return device.android() && find('mobile');\n};\n\ndevice.androidTablet = function () {\n return device.android() && !find('mobile');\n};\n\ndevice.blackberry = function () {\n return find('blackberry') || find('bb10');\n};\n\ndevice.blackberryPhone = function () {\n return device.blackberry() && !find('tablet');\n};\n\ndevice.blackberryTablet = function () {\n return device.blackberry() && find('tablet');\n};\n\ndevice.windows = function () {\n return find('windows');\n};\n\ndevice.windowsPhone = function () {\n return device.windows() && find('phone');\n};\n\ndevice.windowsTablet = function () {\n return device.windows() && find('touch') && !device.windowsPhone();\n};\n\ndevice.fxos = function () {\n return (find('(mobile') || find('(tablet')) && find(' rv:');\n};\n\ndevice.fxosPhone = function () {\n return device.fxos() && find('mobile');\n};\n\ndevice.fxosTablet = function () {\n return device.fxos() && find('tablet');\n};\n\ndevice.meego = function () {\n return find('meego');\n};\n\ndevice.cordova = function () {\n return window.cordova && location.protocol === 'file:';\n};\n\ndevice.nodeWebkit = function () {\n return _typeof(window.process) === 'object';\n};\n\ndevice.mobile = function () {\n return device.androidPhone() || device.iphone() || device.ipod() || device.windowsPhone() || device.blackberryPhone() || device.fxosPhone() || device.meego();\n};\n\ndevice.tablet = function () {\n return device.ipad() || device.androidTablet() || device.blackberryTablet() || device.windowsTablet() || device.fxosTablet();\n};\n\ndevice.desktop = function () {\n return !device.tablet() && !device.mobile();\n};\n\ndevice.television = function () {\n var i = 0;\n while (i < television.length) {\n if (find(television[i])) {\n return true;\n }\n i++;\n }\n return false;\n};\n\ndevice.portrait = function () {\n if (screen.orientation && Object.prototype.hasOwnProperty.call(window, 'onorientationchange')) {\n return includes(screen.orientation.type, 'portrait');\n }\n if (device.ios() && Object.prototype.hasOwnProperty.call(window, 'orientation')) {\n return Math.abs(window.orientation) !== 90;\n }\n return window.innerHeight / window.innerWidth > 1;\n};\n\ndevice.landscape = function () {\n if (screen.orientation && Object.prototype.hasOwnProperty.call(window, 'onorientationchange')) {\n return includes(screen.orientation.type, 'landscape');\n }\n if (device.ios() && Object.prototype.hasOwnProperty.call(window, 'orientation')) {\n return Math.abs(window.orientation) === 90;\n }\n return window.innerHeight / window.innerWidth < 1;\n};\n\n// Public Utility Functions\n// ------------------------\n\n// Run device.js in noConflict mode,\n// returning the device variable to its previous owner.\ndevice.noConflict = function () {\n window.device = previousDevice;\n return this;\n};\n\n// Private Utility Functions\n// -------------------------\n\n// Check if element exists\nfunction includes(haystack, needle) {\n return haystack.indexOf(needle) !== -1;\n}\n\n// Simple UA string search\nfunction find(needle) {\n return includes(userAgent, needle);\n}\n\n// Check if documentElement already has a given class.\nfunction hasClass(className) {\n return documentElement.className.match(new RegExp(className, 'i'));\n}\n\n// Add one or more CSS classes to the element.\nfunction addClass(className) {\n var currentClassNames = null;\n if (!hasClass(className)) {\n currentClassNames = documentElement.className.replace(/^\\s+|\\s+$/g, '');\n documentElement.className = currentClassNames + ' ' + className;\n }\n}\n\n// Remove single CSS class from the element.\nfunction removeClass(className) {\n if (hasClass(className)) {\n documentElement.className = documentElement.className.replace(' ' + className, '');\n }\n}\n\n// HTML Element Handling\n// ---------------------\n\n// Insert the appropriate CSS class based on the _user_agent.\n\nif (device.ios()) {\n if (device.ipad()) {\n addClass('ios ipad tablet');\n } else if (device.iphone()) {\n addClass('ios iphone mobile');\n } else if (device.ipod()) {\n addClass('ios ipod mobile');\n }\n} else if (device.macos()) {\n addClass('macos desktop');\n} else if (device.android()) {\n if (device.androidTablet()) {\n addClass('android tablet');\n } else {\n addClass('android mobile');\n }\n} else if (device.blackberry()) {\n if (device.blackberryTablet()) {\n addClass('blackberry tablet');\n } else {\n addClass('blackberry mobile');\n }\n} else if (device.windows()) {\n if (device.windowsTablet()) {\n addClass('windows tablet');\n } else if (device.windowsPhone()) {\n addClass('windows mobile');\n } else {\n addClass('windows desktop');\n }\n} else if (device.fxos()) {\n if (device.fxosTablet()) {\n addClass('fxos tablet');\n } else {\n addClass('fxos mobile');\n }\n} else if (device.meego()) {\n addClass('meego mobile');\n} else if (device.nodeWebkit()) {\n addClass('node-webkit');\n} else if (device.television()) {\n addClass('television');\n} else if (device.desktop()) {\n addClass('desktop');\n}\n\nif (device.cordova()) {\n addClass('cordova');\n}\n\n// Orientation Handling\n// --------------------\n\n// Handle device orientation changes.\nfunction handleOrientation() {\n if (device.landscape()) {\n removeClass('portrait');\n addClass('landscape');\n walkOnChangeOrientationList('landscape');\n } else {\n removeClass('landscape');\n addClass('portrait');\n walkOnChangeOrientationList('portrait');\n }\n setOrientationCache();\n}\n\nfunction walkOnChangeOrientationList(newOrientation) {\n for (var index = 0; index < changeOrientationList.length; index++) {\n changeOrientationList[index](newOrientation);\n }\n}\n\ndevice.onChangeOrientation = function (cb) {\n if (typeof cb == 'function') {\n changeOrientationList.push(cb);\n }\n};\n\n// Detect whether device supports orientationchange event,\n// otherwise fall back to the resize event.\nvar orientationEvent = 'resize';\nif (Object.prototype.hasOwnProperty.call(window, 'onorientationchange')) {\n orientationEvent = 'orientationchange';\n}\n\n// Listen for changes in orientation.\nif (window.addEventListener) {\n window.addEventListener(orientationEvent, handleOrientation, false);\n} else if (window.attachEvent) {\n window.attachEvent(orientationEvent, handleOrientation);\n} else {\n window[orientationEvent] = handleOrientation;\n}\n\nhandleOrientation();\n\n// Public functions to get the current value of type, os, or orientation\n// ---------------------------------------------------------------------\n\nfunction findMatch(arr) {\n for (var i = 0; i < arr.length; i++) {\n if (device[arr[i]]()) {\n return arr[i];\n }\n }\n return 'unknown';\n}\n\ndevice.type = findMatch(['mobile', 'tablet', 'desktop']);\ndevice.os = findMatch(['ios', 'iphone', 'ipad', 'ipod', 'android', 'blackberry', 'macos', 'windows', 'fxos', 'meego', 'television']);\n\nfunction setOrientationCache() {\n device.orientation = findMatch(['portrait', 'landscape']);\n}\n\nsetOrientationCache();\n\nexport default device;","import canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport UAParser from 'ua-parser-js';\nimport currentDevice from 'current-device';\n\nimport { IOS_WEBVIEW, ANDROID_WEBVIEW, IOS_MOBILE, IOS_TABLET, ANDROID_MOBILE, ANDROID_TABLET } from './lib/constants';\n\nconst browserParsed = new UAParser().getResult();\nconst SERVER = 'server';\nconst NATIVE = 'native';\nconst MOBILE = 'mobile';\nconst WEBVIEW = 'WEBVIEW';\n\nfunction getDevice() {\n if (!canUseDom()) {\n return SERVER;\n }\n\n const deviceLib = currentDevice.noConflict();\n const device = deviceLib.default || deviceLib;\n\n const isWebview = getEnv(WEBVIEW);\n const type = isWebview ? NATIVE : device.type;\n\n if (type === MOBILE) {\n return device.os;\n }\n return `${type}_${device.os}`;\n}\n\nexport const isIOSWebview = () => getDevice() === IOS_WEBVIEW;\nexport const isAndroidWebview = () => getDevice() === ANDROID_WEBVIEW;\n\nexport const isIOSBrowser = () => [IOS_MOBILE, IOS_TABLET].includes(getDevice());\nexport const isAndroidBrowser = () => [ANDROID_MOBILE, ANDROID_TABLET].includes(getDevice());\n\nexport const isDesktop = () => getDevice().includes('desktop');\n\nexport const getBrowser = () => {\n const parser = new UAParser();\n const { browser } = parser.getResult();\n if (!browser.version) {\n // put within conditional so we don't have to update mocks in a tonne of vertical tests\n const ua = parser.getUA();\n if (ua.indexOf('Pingdom.com_bot') > -1) {\n const versionString = ua.replace('Pingdom.com_bot_version_', '').replace('_(http://www.pingdom.com/)', '');\n const [major, minor = 0] = versionString.split('.');\n const version = `${major}.${minor}`;\n return { name: 'pingdom', version };\n }\n return { name: 'unknown', version: 'unknown' };\n }\n\n const [major, minor = 0] = browser.version?.split('.') || ['unknown'];\n const version = `${major}.${minor}`;\n return {\n name: browser.name,\n version,\n };\n};\n\ngetDevice.DEVICE_NAME = `${browserParsed.os.name} ${browserParsed.browser.name}`;\n\nexport * as deviceConstants from './lib/constants';\n\nexport default getDevice;\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n function next() {\n while (env.stack.length) {\n var rec = env.stack.pop();\n try {\n var result = rec.dispose && rec.dispose.call(rec.value);\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n catch (e) {\n fail(e);\n }\n }\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n","/**\n * FingerprintJS v3.0.6 - Copyright (c) FingerprintJS, Inc, 2021 (https://fingerprintjs.com)\n * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.\n *\n * This software contains code from open-source projects:\n * MurmurHash3 by Karan Lyons (https://github.com/karanlyons/murmurHash3.js)\n */\n\nimport { __assign, __awaiter, __generator } from 'tslib';\n\n/*\n * Taken from https://github.com/karanlyons/murmurHash3.js/blob/a33d0723127e2e5415056c455f8aed2451ace208/murmurHash3.js\n */\n//\n// Given two 64bit ints (as an array of two 32bit ints) returns the two\n// added together as a 64bit int (as an array of two 32bit ints).\n//\nfunction x64Add(m, n) {\n m = [m[0] >>> 16, m[0] & 0xffff, m[1] >>> 16, m[1] & 0xffff];\n n = [n[0] >>> 16, n[0] & 0xffff, n[1] >>> 16, n[1] & 0xffff];\n var o = [0, 0, 0, 0];\n o[3] += m[3] + n[3];\n o[2] += o[3] >>> 16;\n o[3] &= 0xffff;\n o[2] += m[2] + n[2];\n o[1] += o[2] >>> 16;\n o[2] &= 0xffff;\n o[1] += m[1] + n[1];\n o[0] += o[1] >>> 16;\n o[1] &= 0xffff;\n o[0] += m[0] + n[0];\n o[0] &= 0xffff;\n return [(o[0] << 16) | o[1], (o[2] << 16) | o[3]];\n}\n//\n// Given two 64bit ints (as an array of two 32bit ints) returns the two\n// multiplied together as a 64bit int (as an array of two 32bit ints).\n//\nfunction x64Multiply(m, n) {\n m = [m[0] >>> 16, m[0] & 0xffff, m[1] >>> 16, m[1] & 0xffff];\n n = [n[0] >>> 16, n[0] & 0xffff, n[1] >>> 16, n[1] & 0xffff];\n var o = [0, 0, 0, 0];\n o[3] += m[3] * n[3];\n o[2] += o[3] >>> 16;\n o[3] &= 0xffff;\n o[2] += m[2] * n[3];\n o[1] += o[2] >>> 16;\n o[2] &= 0xffff;\n o[2] += m[3] * n[2];\n o[1] += o[2] >>> 16;\n o[2] &= 0xffff;\n o[1] += m[1] * n[3];\n o[0] += o[1] >>> 16;\n o[1] &= 0xffff;\n o[1] += m[2] * n[2];\n o[0] += o[1] >>> 16;\n o[1] &= 0xffff;\n o[1] += m[3] * n[1];\n o[0] += o[1] >>> 16;\n o[1] &= 0xffff;\n o[0] += m[0] * n[3] + m[1] * n[2] + m[2] * n[1] + m[3] * n[0];\n o[0] &= 0xffff;\n return [(o[0] << 16) | o[1], (o[2] << 16) | o[3]];\n}\n//\n// Given a 64bit int (as an array of two 32bit ints) and an int\n// representing a number of bit positions, returns the 64bit int (as an\n// array of two 32bit ints) rotated left by that number of positions.\n//\nfunction x64Rotl(m, n) {\n n %= 64;\n if (n === 32) {\n return [m[1], m[0]];\n }\n else if (n < 32) {\n return [(m[0] << n) | (m[1] >>> (32 - n)), (m[1] << n) | (m[0] >>> (32 - n))];\n }\n else {\n n -= 32;\n return [(m[1] << n) | (m[0] >>> (32 - n)), (m[0] << n) | (m[1] >>> (32 - n))];\n }\n}\n//\n// Given a 64bit int (as an array of two 32bit ints) and an int\n// representing a number of bit positions, returns the 64bit int (as an\n// array of two 32bit ints) shifted left by that number of positions.\n//\nfunction x64LeftShift(m, n) {\n n %= 64;\n if (n === 0) {\n return m;\n }\n else if (n < 32) {\n return [(m[0] << n) | (m[1] >>> (32 - n)), m[1] << n];\n }\n else {\n return [m[1] << (n - 32), 0];\n }\n}\n//\n// Given two 64bit ints (as an array of two 32bit ints) returns the two\n// xored together as a 64bit int (as an array of two 32bit ints).\n//\nfunction x64Xor(m, n) {\n return [m[0] ^ n[0], m[1] ^ n[1]];\n}\n//\n// Given a block, returns murmurHash3's final x64 mix of that block.\n// (`[0, h[0] >>> 1]` is a 33 bit unsigned right shift. This is the\n// only place where we need to right shift 64bit ints.)\n//\nfunction x64Fmix(h) {\n h = x64Xor(h, [0, h[0] >>> 1]);\n h = x64Multiply(h, [0xff51afd7, 0xed558ccd]);\n h = x64Xor(h, [0, h[0] >>> 1]);\n h = x64Multiply(h, [0xc4ceb9fe, 0x1a85ec53]);\n h = x64Xor(h, [0, h[0] >>> 1]);\n return h;\n}\n//\n// Given a string and an optional seed as an int, returns a 128 bit\n// hash using the x64 flavor of MurmurHash3, as an unsigned hex.\n//\nfunction x64hash128(key, seed) {\n key = key || '';\n seed = seed || 0;\n var remainder = key.length % 16;\n var bytes = key.length - remainder;\n var h1 = [0, seed];\n var h2 = [0, seed];\n var k1 = [0, 0];\n var k2 = [0, 0];\n var c1 = [0x87c37b91, 0x114253d5];\n var c2 = [0x4cf5ad43, 0x2745937f];\n var i;\n for (i = 0; i < bytes; i = i + 16) {\n k1 = [\n (key.charCodeAt(i + 4) & 0xff) |\n ((key.charCodeAt(i + 5) & 0xff) << 8) |\n ((key.charCodeAt(i + 6) & 0xff) << 16) |\n ((key.charCodeAt(i + 7) & 0xff) << 24),\n (key.charCodeAt(i) & 0xff) |\n ((key.charCodeAt(i + 1) & 0xff) << 8) |\n ((key.charCodeAt(i + 2) & 0xff) << 16) |\n ((key.charCodeAt(i + 3) & 0xff) << 24),\n ];\n k2 = [\n (key.charCodeAt(i + 12) & 0xff) |\n ((key.charCodeAt(i + 13) & 0xff) << 8) |\n ((key.charCodeAt(i + 14) & 0xff) << 16) |\n ((key.charCodeAt(i + 15) & 0xff) << 24),\n (key.charCodeAt(i + 8) & 0xff) |\n ((key.charCodeAt(i + 9) & 0xff) << 8) |\n ((key.charCodeAt(i + 10) & 0xff) << 16) |\n ((key.charCodeAt(i + 11) & 0xff) << 24),\n ];\n k1 = x64Multiply(k1, c1);\n k1 = x64Rotl(k1, 31);\n k1 = x64Multiply(k1, c2);\n h1 = x64Xor(h1, k1);\n h1 = x64Rotl(h1, 27);\n h1 = x64Add(h1, h2);\n h1 = x64Add(x64Multiply(h1, [0, 5]), [0, 0x52dce729]);\n k2 = x64Multiply(k2, c2);\n k2 = x64Rotl(k2, 33);\n k2 = x64Multiply(k2, c1);\n h2 = x64Xor(h2, k2);\n h2 = x64Rotl(h2, 31);\n h2 = x64Add(h2, h1);\n h2 = x64Add(x64Multiply(h2, [0, 5]), [0, 0x38495ab5]);\n }\n k1 = [0, 0];\n k2 = [0, 0];\n switch (remainder) {\n case 15:\n k2 = x64Xor(k2, x64LeftShift([0, key.charCodeAt(i + 14)], 48));\n // fallthrough\n case 14:\n k2 = x64Xor(k2, x64LeftShift([0, key.charCodeAt(i + 13)], 40));\n // fallthrough\n case 13:\n k2 = x64Xor(k2, x64LeftShift([0, key.charCodeAt(i + 12)], 32));\n // fallthrough\n case 12:\n k2 = x64Xor(k2, x64LeftShift([0, key.charCodeAt(i + 11)], 24));\n // fallthrough\n case 11:\n k2 = x64Xor(k2, x64LeftShift([0, key.charCodeAt(i + 10)], 16));\n // fallthrough\n case 10:\n k2 = x64Xor(k2, x64LeftShift([0, key.charCodeAt(i + 9)], 8));\n // fallthrough\n case 9:\n k2 = x64Xor(k2, [0, key.charCodeAt(i + 8)]);\n k2 = x64Multiply(k2, c2);\n k2 = x64Rotl(k2, 33);\n k2 = x64Multiply(k2, c1);\n h2 = x64Xor(h2, k2);\n // fallthrough\n case 8:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 7)], 56));\n // fallthrough\n case 7:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 6)], 48));\n // fallthrough\n case 6:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 5)], 40));\n // fallthrough\n case 5:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 4)], 32));\n // fallthrough\n case 4:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 3)], 24));\n // fallthrough\n case 3:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 2)], 16));\n // fallthrough\n case 2:\n k1 = x64Xor(k1, x64LeftShift([0, key.charCodeAt(i + 1)], 8));\n // fallthrough\n case 1:\n k1 = x64Xor(k1, [0, key.charCodeAt(i)]);\n k1 = x64Multiply(k1, c1);\n k1 = x64Rotl(k1, 31);\n k1 = x64Multiply(k1, c2);\n h1 = x64Xor(h1, k1);\n // fallthrough\n }\n h1 = x64Xor(h1, [0, key.length]);\n h2 = x64Xor(h2, [0, key.length]);\n h1 = x64Add(h1, h2);\n h2 = x64Add(h2, h1);\n h1 = x64Fmix(h1);\n h2 = x64Fmix(h2);\n h1 = x64Add(h1, h2);\n h2 = x64Add(h2, h1);\n return (('00000000' + (h1[0] >>> 0).toString(16)).slice(-8) +\n ('00000000' + (h1[1] >>> 0).toString(16)).slice(-8) +\n ('00000000' + (h2[0] >>> 0).toString(16)).slice(-8) +\n ('00000000' + (h2[1] >>> 0).toString(16)).slice(-8));\n}\n\nvar version = \"3.0.6\";\n\nfunction requestIdleCallbackIfAvailable(fallbackTimeout, deadlineTimeout) {\n if (deadlineTimeout === void 0) { deadlineTimeout = Infinity; }\n return new Promise(function (resolve) {\n var requestIdleCallback = window.requestIdleCallback;\n if (requestIdleCallback) {\n requestIdleCallback(function () { return resolve(); }, { timeout: deadlineTimeout });\n }\n else {\n setTimeout(resolve, Math.min(fallbackTimeout, deadlineTimeout));\n }\n });\n}\n\n/**\n * Converts an error object to a plain object that can be used with `JSON.stringify`.\n * If you just run `JSON.stringify(error)`, you'll get `'{}'`.\n */\nfunction errorToObject(error) {\n var _a;\n return __assign({ name: error.name, message: error.message, stack: (_a = error.stack) === null || _a === void 0 ? void 0 : _a.split('\\n') }, error);\n}\n\n/*\n * This file contains functions to work with pure data only (no browser features, DOM, side effects, etc).\n */\n/**\n * Does the same as Array.prototype.includes but has better typing\n */\nfunction includes(haystack, needle) {\n for (var i = 0, l = haystack.length; i < l; ++i) {\n if (haystack[i] === needle) {\n return true;\n }\n }\n return false;\n}\n/**\n * Like `!includes()` but with proper typing\n */\nfunction excludes(haystack, needle) {\n return !includes(haystack, needle);\n}\n/**\n * Be careful, NaN can return\n */\nfunction toInt(value) {\n return parseInt(value);\n}\n/**\n * Be careful, NaN can return\n */\nfunction toFloat(value) {\n return parseFloat(value);\n}\nfunction replaceNaN(value, replacement) {\n return typeof value === 'number' && isNaN(value) ? replacement : value;\n}\nfunction countTruthy(values) {\n return values.reduce(function (sum, value) { return sum + (value ? 1 : 0); }, 0);\n}\n\n/*\n * Functions to help with features that vary through browsers\n */\n/**\n * Checks whether the browser is based on Trident (the Internet Explorer engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction isTrident() {\n var w = window;\n var n = navigator;\n // The properties are checked to be in IE 10, IE 11 and not to be in other browsers in October 2020\n return (countTruthy([\n 'MSCSSMatrix' in w,\n 'msSetImmediate' in w,\n 'msIndexedDB' in w,\n 'msMaxTouchPoints' in n,\n 'msPointerEnabled' in n,\n ]) >= 4);\n}\n/**\n * Checks whether the browser is based on EdgeHTML (the pre-Chromium Edge engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction isEdgeHTML() {\n // Based on research in October 2020\n var w = window;\n var n = navigator;\n return (countTruthy(['msWriteProfilerMark' in w, 'MSStream' in w, 'msLaunchUri' in n, 'msSaveBlob' in n]) >= 3 &&\n !isTrident());\n}\n/**\n * Checks whether the browser is based on Chromium without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction isChromium() {\n // Based on research in October 2020. Tested to detect Chromium 42-86.\n var w = window;\n var n = navigator;\n return (countTruthy([\n 'webkitPersistentStorage' in n,\n 'webkitTemporaryStorage' in n,\n n.vendor.indexOf('Google') === 0,\n 'webkitResolveLocalFileSystemURL' in w,\n 'BatteryManager' in w,\n 'webkitMediaStream' in w,\n 'webkitSpeechGrammar' in w,\n ]) >= 5);\n}\n/**\n * Checks whether the browser is based on mobile or desktop Safari without using user-agent.\n * All iOS browsers use WebKit (the Safari engine).\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction isWebKit() {\n // Based on research in September 2020\n var w = window;\n var n = navigator;\n return (countTruthy([\n 'ApplePayError' in w,\n 'CSSPrimitiveValue' in w,\n 'Counter' in w,\n n.vendor.indexOf('Apple') === 0,\n 'getStorageUpdates' in n,\n 'WebKitMediaKeys' in w,\n ]) >= 4);\n}\n/**\n * Checks whether the WebKit browser is a desktop Safari.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction isDesktopSafari() {\n var w = window;\n return (countTruthy([\n 'safari' in w,\n !('DeviceMotionEvent' in w),\n !('ongestureend' in w),\n !('standalone' in navigator),\n ]) >= 3);\n}\n/**\n * Checks whether the browser is based on Gecko (Firefox engine) without using user-agent.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction isGecko() {\n var _a, _b;\n var w = window;\n // Based on research in September 2020\n return (countTruthy([\n 'buildID' in navigator,\n 'MozAppearance' in ((_b = (_a = document.documentElement) === null || _a === void 0 ? void 0 : _a.style) !== null && _b !== void 0 ? _b : {}),\n 'MediaRecorderErrorEvent' in w,\n 'mozInnerScreenX' in w,\n 'CSSMozDocumentRule' in w,\n 'CanvasCaptureMediaStream' in w,\n ]) >= 4);\n}\n/**\n * Checks whether the browser is based on Chromium version ≥86 without using user-agent.\n * It doesn't check that the browser is based on Chromium, there is a separate function for this.\n */\nfunction isChromium86OrNewer() {\n // Checked in Chrome 85 vs Chrome 86 both on desktop and Android\n var w = window;\n return (countTruthy([\n !('MediaSettingsRange' in w),\n 'RTCEncodedAudioFrame' in w,\n '' + w.Intl === '[object Intl]',\n '' + w.Reflect === '[object Reflect]',\n ]) >= 3);\n}\n/**\n * Checks whether the browser is based on WebKit version ≥606 (Safari ≥12) without using user-agent.\n * It doesn't check that the browser is based on WebKit, there is a separate function for this.\n *\n * @link https://en.wikipedia.org/wiki/Safari_version_history#Release_history Safari-WebKit versions map\n */\nfunction isWebKit606OrNewer() {\n // Checked in Safari 9–14\n var w = window;\n return (countTruthy([\n 'DOMRectList' in w,\n 'RTCPeerConnectionIceEvent' in w,\n 'SVGGeometryElement' in w,\n 'ontransitioncancel' in w,\n ]) >= 3);\n}\n\n// Inspired by and based on https://github.com/cozylife/audio-fingerprint\nfunction getAudioFingerprint() {\n return __awaiter(this, void 0, void 0, function () {\n var w, AudioContext, context, oscillator, compressor, buffer, error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n w = window;\n AudioContext = w.OfflineAudioContext || w.webkitOfflineAudioContext;\n if (!AudioContext) {\n return [2 /*return*/, -2 /* NotSupported */];\n }\n // In some browsers, audio context always stays suspended unless the context is started in response to a user action\n // (e.g. a click or a tap). It prevents audio fingerprint from being taken at an arbitrary moment of time.\n // Such browsers are old and unpopular, so the audio fingerprinting is just skipped in them.\n // See a similar case explanation at https://stackoverflow.com/questions/46363048/onaudioprocess-not-called-on-ios11#46534088\n if (doesCurrentBrowserSuspendAudioContext()) {\n return [2 /*return*/, -1 /* KnownToSuspend */];\n }\n context = new AudioContext(1, 44100, 44100);\n oscillator = context.createOscillator();\n oscillator.type = 'triangle';\n setAudioParam(context, oscillator.frequency, 10000);\n compressor = context.createDynamicsCompressor();\n setAudioParam(context, compressor.threshold, -50);\n setAudioParam(context, compressor.knee, 40);\n setAudioParam(context, compressor.ratio, 12);\n setAudioParam(context, compressor.reduction, -20);\n setAudioParam(context, compressor.attack, 0);\n setAudioParam(context, compressor.release, 0.25);\n oscillator.connect(compressor);\n compressor.connect(context.destination);\n oscillator.start(0);\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, 4, 5]);\n return [4 /*yield*/, renderAudio(context)];\n case 2:\n buffer = _a.sent();\n return [3 /*break*/, 5];\n case 3:\n error_1 = _a.sent();\n if (error_1.name === \"timeout\" /* Timeout */ || error_1.name === \"suspended\" /* Suspended */) {\n return [2 /*return*/, -3 /* Timeout */];\n }\n throw error_1;\n case 4:\n oscillator.disconnect();\n compressor.disconnect();\n return [7 /*endfinally*/];\n case 5: return [2 /*return*/, getHash(buffer.getChannelData(0))];\n }\n });\n });\n}\n/**\n * Checks if the current browser is known to always suspend audio context\n */\nfunction doesCurrentBrowserSuspendAudioContext() {\n return isWebKit() && !isDesktopSafari() && !isWebKit606OrNewer();\n}\nfunction setAudioParam(context, param, value) {\n var isAudioParam = function (value) {\n return value && typeof value.setValueAtTime === 'function';\n };\n if (isAudioParam(param)) {\n param.setValueAtTime(value, context.currentTime);\n }\n}\nfunction renderAudio(context) {\n var resumeTriesMaxCount = 3;\n var resumeRetryDelay = 500;\n var runningTimeout = 1000;\n return new Promise(function (resolve, reject) {\n context.oncomplete = function (event) { return resolve(event.renderedBuffer); };\n var resumeTriesLeft = resumeTriesMaxCount;\n var tryResume = function () {\n context.startRendering();\n switch (context.state) {\n case 'running':\n setTimeout(function () { return reject(makeInnerError(\"timeout\" /* Timeout */)); }, runningTimeout);\n break;\n // Sometimes the audio context doesn't start after calling `startRendering` (in addition to the cases where\n // audio context doesn't start at all). A known case is starting an audio context when the browser tab is in\n // background on iPhone. Retries usually help in this case.\n case 'suspended':\n // The audio context can reject starting until the tab is in foreground. Long fingerprint duration\n // in background isn't a problem, therefore the retry attempts don't count in background. It can lead to\n // a situation when a fingerprint takes very long time and finishes successfully. FYI, the audio context\n // can be suspended when `document.hidden === false` and start running after a retry.\n if (!document.hidden) {\n resumeTriesLeft--;\n }\n if (resumeTriesLeft > 0) {\n setTimeout(tryResume, resumeRetryDelay);\n }\n else {\n reject(makeInnerError(\"suspended\" /* Suspended */));\n }\n break;\n }\n };\n tryResume();\n });\n}\nfunction getHash(signal) {\n var hash = 0;\n for (var i = 4500; i < 5000; ++i) {\n hash += Math.abs(signal[i]);\n }\n return hash;\n}\nfunction makeInnerError(name) {\n var error = new Error(name);\n error.name = name;\n return error;\n}\n\n// We use m or w because these two characters take up the maximum width.\n// And we use a LLi so that the same matching fonts can get separated.\nvar testString = 'mmMwWLliI0O&1';\n// We test using 48px font size, we may use any size. I guess larger the better.\nvar testSize = '48px';\n// A font will be compared against all the three default fonts.\n// And if it doesn't match all 3 then that font is not available.\nvar baseFonts = ['monospace', 'sans-serif', 'serif'];\nvar fontList = [\n // This is android-specific font from \"Roboto\" family\n 'sans-serif-thin',\n 'ARNO PRO',\n 'Agency FB',\n 'Arabic Typesetting',\n 'Arial Unicode MS',\n 'AvantGarde Bk BT',\n 'BankGothic Md BT',\n 'Batang',\n 'Bitstream Vera Sans Mono',\n 'Calibri',\n 'Century',\n 'Century Gothic',\n 'Clarendon',\n 'EUROSTILE',\n 'Franklin Gothic',\n 'Futura Bk BT',\n 'Futura Md BT',\n 'GOTHAM',\n 'Gill Sans',\n 'HELV',\n 'Haettenschweiler',\n 'Helvetica Neue',\n 'Humanst521 BT',\n 'Leelawadee',\n 'Letter Gothic',\n 'Levenim MT',\n 'Lucida Bright',\n 'Lucida Sans',\n 'Menlo',\n 'MS Mincho',\n 'MS Outlook',\n 'MS Reference Specialty',\n 'MS UI Gothic',\n 'MT Extra',\n 'MYRIAD PRO',\n 'Marlett',\n 'Meiryo UI',\n 'Microsoft Uighur',\n 'Minion Pro',\n 'Monotype Corsiva',\n 'PMingLiU',\n 'Pristina',\n 'SCRIPTINA',\n 'Segoe UI Light',\n 'Serifa',\n 'SimHei',\n 'Small Fonts',\n 'Staccato222 BT',\n 'TRAJAN PRO',\n 'Univers CE 55 Medium',\n 'Vrinda',\n 'ZWAdobeF',\n];\nvar fontSpanStyle = {\n // CSS font reset to reset external styles\n fontStyle: 'normal',\n fontWeight: 'normal',\n letterSpacing: 'normal',\n lineBreak: 'auto',\n lineHeight: 'normal',\n textTransform: 'none',\n textAlign: 'left',\n textDecoration: 'none',\n textShadow: 'none',\n whiteSpace: 'normal',\n wordBreak: 'normal',\n wordSpacing: 'normal',\n // We need this css as in some weird browser this span elements shows up for a microSec which creates\n // a bad user experience\n position: 'absolute',\n left: '-9999px',\n fontSize: testSize,\n};\n// kudos to http://www.lalit.org/lab/javascript-css-font-detect/\nfunction getFonts() {\n var d = document;\n var holder = d.body;\n // div to load spans for the base fonts\n var baseFontsDiv = d.createElement('div');\n // div to load spans for the fonts to detect\n var fontsDiv = d.createElement('div');\n var defaultWidth = {};\n var defaultHeight = {};\n // creates a span where the fonts will be loaded\n var createSpan = function () {\n var span = d.createElement('span');\n span.textContent = testString;\n for (var _i = 0, _a = Object.keys(fontSpanStyle); _i < _a.length; _i++) {\n var prop = _a[_i];\n span.style[prop] = fontSpanStyle[prop];\n }\n return span;\n };\n // creates a span and load the font to detect and a base font for fallback\n var createSpanWithFonts = function (fontToDetect, baseFont) {\n var s = createSpan();\n s.style.fontFamily = \"'\" + fontToDetect + \"',\" + baseFont;\n return s;\n };\n // creates spans for the base fonts and adds them to baseFontsDiv\n var initializeBaseFontsSpans = function () {\n return baseFonts.map(function (baseFont) {\n var s = createSpan();\n s.style.fontFamily = baseFont;\n baseFontsDiv.appendChild(s);\n return s;\n });\n };\n // creates spans for the fonts to detect and adds them to fontsDiv\n var initializeFontsSpans = function () {\n // Stores {fontName : [spans for that font]}\n var spans = {};\n var _loop_1 = function (font) {\n spans[font] = baseFonts.map(function (baseFont) {\n var s = createSpanWithFonts(font, baseFont);\n fontsDiv.appendChild(s);\n return s;\n });\n };\n for (var _i = 0, fontList_1 = fontList; _i < fontList_1.length; _i++) {\n var font = fontList_1[_i];\n _loop_1(font);\n }\n return spans;\n };\n // checks if a font is available\n var isFontAvailable = function (fontSpans) {\n return baseFonts.some(function (baseFont, baseFontIndex) {\n return fontSpans[baseFontIndex].offsetWidth !== defaultWidth[baseFont] ||\n fontSpans[baseFontIndex].offsetHeight !== defaultHeight[baseFont];\n });\n };\n // create spans for base fonts\n var baseFontsSpans = initializeBaseFontsSpans();\n // add the spans to the DOM\n holder.appendChild(baseFontsDiv);\n // get the default width for the three base fonts\n for (var index = 0, length_1 = baseFonts.length; index < length_1; index++) {\n defaultWidth[baseFonts[index]] = baseFontsSpans[index].offsetWidth; // width for the default font\n defaultHeight[baseFonts[index]] = baseFontsSpans[index].offsetHeight; // height for the default font\n }\n // create spans for fonts to detect\n var fontsSpans = initializeFontsSpans();\n // add all the spans to the DOM\n holder.appendChild(fontsDiv);\n // check available fonts\n var available = [];\n for (var i = 0, l = fontList.length; i < l; i++) {\n if (isFontAvailable(fontsSpans[fontList[i]])) {\n available.push(fontList[i]);\n }\n }\n // remove spans from DOM\n holder.removeChild(fontsDiv);\n holder.removeChild(baseFontsDiv);\n return available;\n}\n\nfunction getPlugins() {\n if (isTrident()) {\n return [];\n }\n if (!navigator.plugins) {\n return undefined;\n }\n var plugins = [];\n // Safari 10 doesn't support iterating navigator.plugins with for...of\n for (var i = 0; i < navigator.plugins.length; ++i) {\n var plugin = navigator.plugins[i];\n if (!plugin) {\n continue;\n }\n var mimeTypes = [];\n for (var j = 0; j < plugin.length; ++j) {\n var mimeType = plugin[j];\n mimeTypes.push({\n type: mimeType.type,\n suffixes: mimeType.suffixes,\n });\n }\n plugins.push({\n name: plugin.name,\n description: plugin.description,\n mimeTypes: mimeTypes,\n });\n }\n return plugins;\n}\n\nfunction makeCanvasContext() {\n var canvas = document.createElement('canvas');\n canvas.width = 240;\n canvas.height = 140;\n canvas.style.display = 'inline';\n return [canvas, canvas.getContext('2d')];\n}\nfunction isSupported(canvas, context) {\n // TODO: look into: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob\n return !!(context && canvas.toDataURL);\n}\nfunction save(canvas) {\n // TODO: look into: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob\n return canvas.toDataURL();\n}\n// https://www.browserleaks.com/canvas#how-does-it-work\nfunction getCanvasFingerprint() {\n var _a = makeCanvasContext(), canvas = _a[0], context = _a[1];\n if (!isSupported(canvas, context)) {\n return { winding: false, data: '' };\n }\n // detect browser support of canvas winding\n // http://blogs.adobe.com/webplatform/2013/01/30/winding-rules-in-canvas/\n // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/canvas/winding.js\n context.rect(0, 0, 10, 10);\n context.rect(2, 2, 6, 6);\n var winding = !context.isPointInPath(5, 5, 'evenodd');\n context.textBaseline = 'alphabetic';\n context.fillStyle = '#f60';\n context.fillRect(125, 1, 62, 20);\n context.fillStyle = '#069';\n // https://github.com/Valve/fingerprintjs2/issues/66\n // this can affect FP generation when applying different CSS on different websites\n context.font = '11pt no-real-font-123';\n // the choice of emojis has a gigantic impact on rendering performance (especially in FF)\n // some newer emojis cause it to slow down 50-200 times\n // context.fillText(\"Cw爨m fjordbank \\ud83d\\ude03 gly\", 2, 15)\n var printedText = 'Cwm fjordbank \\ud83d\\ude03 gly';\n context.fillText(printedText, 2, 15);\n context.fillStyle = 'rgba(102, 204, 0, 0.2)';\n context.font = '18pt Arial';\n context.fillText(printedText, 4, 45);\n // canvas blending\n // http://blogs.adobe.com/webplatform/2013/01/28/blending-features-in-canvas/\n // http://jsfiddle.net/NDYV8/16/\n context.globalCompositeOperation = 'multiply';\n context.fillStyle = 'rgb(255,0,255)';\n context.beginPath();\n context.arc(50, 50, 50, 0, Math.PI * 2, true);\n context.closePath();\n context.fill();\n context.fillStyle = 'rgb(0,255,255)';\n context.beginPath();\n context.arc(100, 50, 50, 0, Math.PI * 2, true);\n context.closePath();\n context.fill();\n context.fillStyle = 'rgb(255,255,0)';\n context.beginPath();\n context.arc(75, 100, 50, 0, Math.PI * 2, true);\n context.closePath();\n context.fill();\n context.fillStyle = 'rgb(255,0,255)';\n // canvas winding\n // http://blogs.adobe.com/webplatform/2013/01/30/winding-rules-in-canvas/\n // http://jsfiddle.net/NDYV8/19/\n context.arc(75, 75, 75, 0, Math.PI * 2, true);\n context.arc(75, 75, 25, 0, Math.PI * 2, true);\n context.fill('evenodd');\n return {\n winding: winding,\n data: save(canvas),\n };\n}\n\n/**\n * This is a crude and primitive touch screen detection. It's not possible to currently reliably detect the availability\n * of a touch screen with a JS, without actually subscribing to a touch event.\n *\n * @see http://www.stucox.com/blog/you-cant-detect-a-touchscreen/\n * @see https://github.com/Modernizr/Modernizr/issues/548\n */\nfunction getTouchSupport() {\n var n = navigator;\n var maxTouchPoints = 0;\n var touchEvent;\n if (n.maxTouchPoints !== undefined) {\n maxTouchPoints = toInt(n.maxTouchPoints);\n }\n else if (n.msMaxTouchPoints !== undefined) {\n maxTouchPoints = n.msMaxTouchPoints;\n }\n try {\n document.createEvent('TouchEvent');\n touchEvent = true;\n }\n catch (_) {\n touchEvent = false;\n }\n var touchStart = 'ontouchstart' in window;\n return {\n maxTouchPoints: maxTouchPoints,\n touchEvent: touchEvent,\n touchStart: touchStart,\n };\n}\n\nfunction getOsCpu() {\n return navigator.oscpu;\n}\n\nfunction getLanguages() {\n var n = navigator;\n var result = [];\n var language = n.language || n.userLanguage || n.browserLanguage || n.systemLanguage;\n if (language !== undefined) {\n result.push([language]);\n }\n if (Array.isArray(n.languages)) {\n // Starting from Chromium 86, there is only a single value in `navigator.language` in Incognito mode:\n // the value of `navigator.language`. Therefore the value is ignored in this browser.\n if (!(isChromium() && isChromium86OrNewer())) {\n result.push(n.languages);\n }\n }\n else if (typeof n.languages === 'string') {\n var languages = n.languages;\n if (languages) {\n result.push(languages.split(','));\n }\n }\n return result;\n}\n\nfunction getColorDepth() {\n return window.screen.colorDepth;\n}\n\nfunction getDeviceMemory() {\n // `navigator.deviceMemory` is a string containing a number in some unidentified cases\n return replaceNaN(toFloat(navigator.deviceMemory), undefined);\n}\n\nfunction getScreenResolution() {\n var s = screen;\n // Some browsers return screen resolution as strings, e.g. \"1200\", instead of a number, e.g. 1200.\n // I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting.\n var dimensions = [toInt(s.width), toInt(s.height)];\n dimensions.sort().reverse();\n return dimensions;\n}\n\nfunction getAvailableScreenResolution() {\n var s = screen;\n if (s.availWidth && s.availHeight) {\n // Some browsers return screen resolution as strings, e.g. \"1200\", instead of a number, e.g. 1200.\n // I suspect it's done by certain plugins that randomize browser properties to prevent fingerprinting.\n var dimensions = [toInt(s.availWidth), toInt(s.availHeight)];\n dimensions.sort().reverse();\n return dimensions;\n }\n return undefined;\n}\n\nfunction getHardwareConcurrency() {\n try {\n // sometimes hardware concurrency is a string\n var concurrency = toInt(navigator.hardwareConcurrency);\n return isNaN(concurrency) ? 1 : concurrency;\n }\n catch (e) {\n return 1;\n }\n}\n\nfunction getTimezoneOffset() {\n var currentYear = new Date().getFullYear();\n // The timezone offset may change over time due to daylight saving time (DST) shifts.\n // The non-DST timezone offset is used as the result timezone offset.\n // Since the DST season differs in the northern and the southern hemispheres,\n // both January and July timezones offsets are considered.\n return Math.max(\n // `getTimezoneOffset` returns a number as a string in some unidentified cases\n toFloat(new Date(currentYear, 0, 1).getTimezoneOffset()), toFloat(new Date(currentYear, 6, 1).getTimezoneOffset()));\n}\n\nfunction getTimezone() {\n var _a;\n var DateTimeFormat = (_a = window.Intl) === null || _a === void 0 ? void 0 : _a.DateTimeFormat;\n if (DateTimeFormat) {\n return new DateTimeFormat().resolvedOptions().timeZone;\n }\n return undefined;\n}\n\nfunction getSessionStorage() {\n try {\n return !!window.sessionStorage;\n }\n catch (error) {\n /* SecurityError when referencing it means it exists */\n return true;\n }\n}\n\n// https://bugzilla.mozilla.org/show_bug.cgi?id=781447\nfunction getLocalStorage() {\n try {\n return !!window.localStorage;\n }\n catch (e) {\n /* SecurityError when referencing it means it exists */\n return true;\n }\n}\n\nfunction getIndexedDB() {\n // IE and Edge don't allow accessing indexedDB in private mode, therefore IE and Edge will have different\n // visitor identifier in normal and private modes.\n if (isTrident() || isEdgeHTML()) {\n return undefined;\n }\n try {\n return !!window.indexedDB;\n }\n catch (e) {\n /* SecurityError when referencing it means it exists */\n return true;\n }\n}\n\nfunction getOpenDatabase() {\n return !!window.openDatabase;\n}\n\nfunction getCpuClass() {\n return navigator.cpuClass;\n}\n\n/**\n * It should be improved to handle mock value on iOS:\n * https://github.com/fingerprintjs/fingerprintjs/issues/514#issuecomment-727782842\n */\nfunction getPlatform() {\n return navigator.platform;\n}\n\nfunction getPluginsSupport() {\n return navigator.plugins !== undefined;\n}\n\nfunction getProductSub() {\n return navigator.productSub; // It's undefined in IE\n}\n\nfunction getEmptyEvalLength() {\n return eval.toString().length;\n}\n\nfunction getErrorFF() {\n try {\n throw 'a';\n }\n catch (e) {\n try {\n e.toSource();\n return true;\n }\n catch (e2) {\n return false;\n }\n }\n}\n\nfunction getVendor() {\n return navigator.vendor;\n}\n\nfunction getChrome() {\n return window.chrome !== undefined;\n}\n\n/**\n * navigator.cookieEnabled cannot detect custom or nuanced cookie blocking configurations. For example, when blocking\n * cookies via the Advanced Privacy Settings in IE9, it always returns true. And there have been issues in the past with\n * site-specific exceptions. Don't rely on it.\n *\n * @see https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cookies.js Taken from here\n */\nfunction areCookiesEnabled() {\n var d = document;\n // Taken from here: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cookies.js\n // navigator.cookieEnabled cannot detect custom or nuanced cookie blocking configurations. For example, when blocking\n // cookies via the Advanced Privacy Settings in IE9, it always returns true. And there have been issues in the past\n // with site-specific exceptions. Don't rely on it.\n // try..catch because some in situations `document.cookie` is exposed but throws a\n // SecurityError if you try to access it; e.g. documents created from data URIs\n // or in sandboxed iframes (depending on flags/context)\n try {\n // Create cookie\n d.cookie = 'cookietest=1; SameSite=Strict;';\n var result = d.cookie.indexOf('cookietest=') !== -1;\n // Delete cookie\n d.cookie = 'cookietest=1; SameSite=Strict; expires=Thu, 01-Jan-1970 00:00:01 GMT';\n return result;\n }\n catch (e) {\n return false;\n }\n}\n\n/**\n * The list of entropy sources used to make visitor identifiers.\n *\n * This value isn't restricted by Semantic Versioning, i.e. it may be changed without bumping minor or major version of\n * this package.\n */\nvar sources = {\n // Expected errors and default values must be handled inside the functions. Unexpected errors must be thrown.\n osCpu: getOsCpu,\n languages: getLanguages,\n colorDepth: getColorDepth,\n deviceMemory: getDeviceMemory,\n screenResolution: getScreenResolution,\n availableScreenResolution: getAvailableScreenResolution,\n hardwareConcurrency: getHardwareConcurrency,\n timezoneOffset: getTimezoneOffset,\n timezone: getTimezone,\n sessionStorage: getSessionStorage,\n localStorage: getLocalStorage,\n indexedDB: getIndexedDB,\n openDatabase: getOpenDatabase,\n cpuClass: getCpuClass,\n platform: getPlatform,\n plugins: getPlugins,\n canvas: getCanvasFingerprint,\n // adBlock: isAdblockUsed, // https://github.com/fingerprintjs/fingerprintjs/issues/405\n touchSupport: getTouchSupport,\n fonts: getFonts,\n audio: getAudioFingerprint,\n pluginsSupport: getPluginsSupport,\n productSub: getProductSub,\n emptyEvalLength: getEmptyEvalLength,\n errorFF: getErrorFF,\n vendor: getVendor,\n chrome: getChrome,\n cookiesEnabled: areCookiesEnabled,\n};\n/**\n * Gets a components list from the given list of entropy sources.\n *\n * Warning for package users:\n * This function is out of Semantic Versioning, i.e. can change unexpectedly. Usage is at your own risk.\n */\nfunction getComponents(sources, sourceOptions, excludeSources) {\n return __awaiter(this, void 0, void 0, function () {\n var timestamp, components, _i, _a, sourceKey, result, error_1, nextTimestamp;\n var _b;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n timestamp = Date.now();\n components = {};\n _i = 0, _a = Object.keys(sources);\n _c.label = 1;\n case 1:\n if (!(_i < _a.length)) return [3 /*break*/, 7];\n sourceKey = _a[_i];\n if (!excludes(excludeSources, sourceKey)) {\n return [3 /*break*/, 6];\n }\n result = void 0;\n _c.label = 2;\n case 2:\n _c.trys.push([2, 4, , 5]);\n _b = {};\n return [4 /*yield*/, sources[sourceKey](sourceOptions)];\n case 3:\n result = (_b.value = _c.sent(), _b);\n return [3 /*break*/, 5];\n case 4:\n error_1 = _c.sent();\n result = error_1 && typeof error_1 === 'object' && 'message' in error_1 ? { error: error_1 } : { error: { message: error_1 } };\n return [3 /*break*/, 5];\n case 5:\n nextTimestamp = Date.now();\n components[sourceKey] = __assign(__assign({}, result), { duration: nextTimestamp - timestamp }); // TypeScript has beaten me here\n timestamp = nextTimestamp;\n _c.label = 6;\n case 6:\n _i++;\n return [3 /*break*/, 1];\n case 7: return [2 /*return*/, components];\n }\n });\n });\n}\n/**\n * Collects entropy components from the built-in sources to make the visitor identifier.\n */\nfunction getBuiltinComponents() {\n return getComponents(sources, undefined, []);\n}\n\nfunction componentsToCanonicalString(components) {\n var result = '';\n for (var _i = 0, _a = Object.keys(components); _i < _a.length; _i++) {\n var componentKey = _a[_i];\n var component = components[componentKey];\n var value = component.error ? 'error' : JSON.stringify(component.value);\n result += \"\" + (result ? '|' : '') + componentKey.replace(/([:|\\\\])/g, '\\\\$1') + \":\" + value;\n }\n return result;\n}\nfunction componentsToDebugString(components) {\n return JSON.stringify(components, function (_key, value) {\n if (value instanceof Error) {\n return errorToObject(value);\n }\n return value;\n }, 2);\n}\nfunction hashComponents(components) {\n return x64hash128(componentsToCanonicalString(components));\n}\n/**\n * Makes a GetResult implementation that calculates the visitor id hash on demand.\n * Designed for optimisation.\n */\nfunction makeLazyGetResult(components) {\n var visitorIdCache;\n // A plain class isn't used because its getters and setters aren't enumerable.\n return {\n components: components,\n get visitorId() {\n if (visitorIdCache === undefined) {\n visitorIdCache = hashComponents(this.components);\n }\n return visitorIdCache;\n },\n set visitorId(visitorId) {\n visitorIdCache = visitorId;\n },\n };\n}\n/**\n * The class isn't exported from the index file to not expose the constructor.\n * The hiding gives more freedom for future non-breaking updates.\n */\nvar OpenAgent = /** @class */ (function () {\n function OpenAgent() {\n }\n /**\n * @inheritDoc\n */\n OpenAgent.prototype.get = function (options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var components, result;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, getBuiltinComponents()];\n case 1:\n components = _a.sent();\n result = makeLazyGetResult(components);\n if (options.debug) {\n // console.log is ok here because it's under a debug clause\n // eslint-disable-next-line no-console\n console.log(\"Copy the text below to get the debug data:\\n\\n```\\nversion: \" + version + \"\\nuserAgent: \" + navigator.userAgent + \"\\ngetOptions: \" + JSON.stringify(options, undefined, 2) + \"\\nvisitorId: \" + result.visitorId + \"\\ncomponents: \" + componentsToDebugString(components) + \"\\n```\");\n }\n return [2 /*return*/, result];\n }\n });\n });\n };\n return OpenAgent;\n}());\n/**\n * Builds an instance of Agent and waits a delay required for a proper operation.\n */\nfunction load(_a) {\n var _b = (_a === void 0 ? {} : _a).delayFallback, delayFallback = _b === void 0 ? 50 : _b;\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0: \n // A delay is required to ensure consistent entropy components.\n // See https://github.com/fingerprintjs/fingerprintjs/issues/254\n // and https://github.com/fingerprintjs/fingerprintjs/issues/307\n // and https://github.com/fingerprintjs/fingerprintjs/commit/945633e7c5f67ae38eb0fea37349712f0e669b18\n // A proper deadline is unknown. Let it be twice the fallback timeout so that both cases have the same average time.\n return [4 /*yield*/, requestIdleCallbackIfAvailable(delayFallback, delayFallback * 2)];\n case 1:\n // A delay is required to ensure consistent entropy components.\n // See https://github.com/fingerprintjs/fingerprintjs/issues/254\n // and https://github.com/fingerprintjs/fingerprintjs/issues/307\n // and https://github.com/fingerprintjs/fingerprintjs/commit/945633e7c5f67ae38eb0fea37349712f0e669b18\n // A proper deadline is unknown. Let it be twice the fallback timeout so that both cases have the same average time.\n _c.sent();\n return [2 /*return*/, new OpenAgent()];\n }\n });\n });\n}\n\n// The default export is a syntax sugar (`import * as FP from '...' → import FP from '...'`).\n// It should contain all the public exported values.\nvar index = { load: load, hashComponents: hashComponents, componentsToDebugString: componentsToDebugString };\n// The exports below are for private usage. They may change unexpectedly. Use them at your own risk.\n/** Not documented, out of Semantic Versioning, usage is at your own risk */\nvar murmurX64Hash128 = x64hash128;\n\nexport default index;\nexport { componentsToDebugString, getComponents, hashComponents, isChromium, isDesktopSafari, isEdgeHTML, isGecko, isTrident, isWebKit, load, murmurX64Hash128 };\n","import FingerprintJS from '@fingerprintjs/fingerprintjs';\nimport { cache } from '@clearscore-group/lib.helpers.cache';\nimport device from '@clearscore-group/lib.helpers.device';\n\n// eslint-disable-next-line import/no-mutable-exports\nconst fingerprint = {\n component: [],\n hash: 'server',\n calculate: function fingerprintPromise() {\n return FingerprintJS.load()\n .then((fp) => fp.get())\n .then((components) => components.visitorId);\n },\n};\n\n(async () => {\n const fp = await FingerprintJS.load();\n const results = await fp.get();\n\n const {\n colorDepth,\n screenResolution,\n availableScreenResolution,\n plugins,\n fonts,\n canvas,\n audio,\n touchSupport,\n ...components\n } = results.components;\n\n const extendedComponents = {\n ...components,\n osAndBrowser: { value: device.DEVICE_NAME },\n };\n\n const visitorId = FingerprintJS.hashComponents(extendedComponents);\n\n fingerprint.hash = visitorId;\n fingerprint.components = extendedComponents;\n cache.device = {\n hash: fingerprint.hash,\n components: fingerprint.components,\n };\n})();\n\nexport default fingerprint;\n","import canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\nimport { removeAnonymousCookie, orchestrateAnonymousCookie } from '@clearscore-group/lib.helpers.cookies';\n\n/**\n * Make sure segment exists adn has that function\n * @param {String} fcnName - Function name\n * @return {boolean} does the fucntion exist\n */\nexport function hasSegmentFunction(fcnName) {\n return canUseDom() ? window.analytics && typeof window.analytics[fcnName] === 'function' : false;\n}\n\n/**\n * Get the user anonymousID\n * @return {String} the user anonymousId\n */\nexport function getAnonymousId() {\n return orchestrateAnonymousCookie();\n}\n\n/**\n * Reset the user is including anonymousID\n * @return {void}\n */\nexport function resetUser() {\n removeAnonymousCookie();\n if (hasSegmentFunction('reset')) {\n window.analytics.reset();\n }\n // This is to reset the uuid cache in\n // packages/clearscore/apps/webapp/core/src/libs/hooks/use-identify-on-profile-fetch.js\n // To stop the uuid being null when the user logs out and then in as the cache was still set\n if (canUseDom()) {\n window.uuidCache = undefined;\n }\n}\n\n/**\n * Export the segment library by default\n */\n// eslint-disable-next-line ssr-friendly/no-dom-globals-in-module-scope\nexport default canUseDom() ? window.analytics : false;\n","import createAction from '@clearscore-group/lib.helpers.create-action';\nimport createRequestPayload from '@clearscore-group/lib.helpers.create-request-payload';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport getDevice from '@clearscore-group/lib.helpers.device';\nimport fingerprint from '@clearscore-group/lib.helpers.device-fingerprinting';\nimport {\n getPublisherCookieUTM,\n publisherCookieIsSentToBackend,\n markPublisherCookieAsSentToBackend,\n} from '@clearscore-group/lib.helpers.cookies';\nimport { getAnonymousId } from '@clearscore-group/lib.helpers.segment';\nimport {\n SET_SESSION,\n LOGIN_OAUTH_AUTHORISE,\n LOGIN_OAUTH_SUBMIT,\n TIMEOUT_SUCCESS,\n LOGOUT_SUBMIT,\n CLEAR_SESSION,\n SET_USER_ROLE,\n LOGIN_OAUTH_REFRESH,\n NATIVE_SET_SESSION,\n} from '@clearscore-group/lib.constants.session-action-types';\n\n/**\n * Get the extra payload to add to requests containing the\n * user's UTM data (if any, and not sent already), and\n * mark cookie as \"sent\" if found so we don't send again\n */\nconst getMarketingIntentPayload = () => {\n const utmParams = getPublisherCookieUTM();\n\n if (Object.entries(utmParams).length > 0 && !publisherCookieIsSentToBackend(utmParams)) {\n markPublisherCookieAsSentToBackend(utmParams);\n\n return {\n utm_parameters: utmParams,\n };\n }\n\n return {};\n};\n\n/*\n * Send action for global login\n *\n * @param {Object} data - object containing required properties\n * @param {String} data.email - users uuid\n * @param {String} data.password - users password\n * @todo: remove conditional when oAuth is out\n */\nexport const login = (data, meta) =>\n createAction(\n LOGIN_OAUTH_SUBMIT,\n createRequestPayload(\n 'international',\n '/login-service/v3/authorise',\n 'post',\n {\n ...(getEnv('SSO_AGENT_ID') && { agent_id: navigator?.userAgent }),\n response_type: 'code', // its always code\n client_type: 'internal', // its always internal\n client_id: getEnv('OAUTH_CLIENT_ID'),\n device_id: fingerprint.hash,\n device_type: getDevice(), // Desktop\n device_name: getDevice.DEVICE_NAME, // Browser Name\n refresh_token_ttl: getEnv('OAUTH_REFRESH_TLL'), // default life of refresh token\n ...data,\n },\n meta,\n ),\n );\n\n/*\n * Auth code for a refresh_token and session_token\n *\n * @param {Object} data - object containing required properties\n * @param {String} data.email - users uuid\n * @param {String} data.password - users password\n */\nexport const authorise = (data, meta) =>\n createAction(\n LOGIN_OAUTH_AUTHORISE,\n createRequestPayload(\n 'international',\n '/login-service/v3/token',\n 'post',\n {\n grant_type: 'authorization_code',\n client_type: 'internal',\n client_id: getEnv('OAUTH_CLIENT_ID'),\n device_id: fingerprint.hash,\n session_id: getAnonymousId(),\n ...getMarketingIntentPayload(),\n ...data,\n },\n meta,\n ),\n );\n\n/*\n * Refresh oauth tokens\n *\n * @param {Object} data - object containing required properties\n */\nexport const refreshToken = (data, meta) =>\n createAction(\n LOGIN_OAUTH_REFRESH,\n createRequestPayload(\n 'international',\n '/login-service/v3/token',\n 'post',\n {\n grant_type: 'refresh_token',\n client_type: 'internal',\n client_id: getEnv('OAUTH_CLIENT_ID'),\n device_id: fingerprint.hash,\n session_id: getAnonymousId(),\n ...getMarketingIntentPayload(),\n ...data,\n },\n meta,\n ),\n );\n\n/*\n * Manually set the session data\n *\n * @param {string} data.accountId - users uuid\n * @param {string} data.sessionToken - unique session token\n */\nexport const setSession = (data) =>\n createAction(SET_SESSION, { accountId: '', sessionToken: data.accessToken || data.access_token || '', ...data });\n\n/*\n * Manually set the native session, we should never listen to this action\n *\n * @param {string} data.accountId - users uuid\n * @param {string} data.sessionToken - unique session token\n */\nexport const setNativeSession = (data) =>\n createAction(NATIVE_SET_SESSION, {\n accountId: '',\n sessionToken: data.accessToken || data.access_token || '',\n ...data,\n });\n\nexport const timeout = () => createAction(TIMEOUT_SUCCESS);\nexport const clearSession = () => createAction(CLEAR_SESSION);\n\nexport const logout = () => createAction(LOGOUT_SUBMIT);\n\nexport const setUserRole = ({ role }) => createAction(SET_USER_ROLE, { role });\n","export const PROFILE_STATUSES = {\n NONE: 'NONE',\n BAV: 'BAV',\n CREATE_ACCOUNT: 'CREATE_ACCOUNT',\n CARD_REQD: 'CARD_REQD',\n CHALLENGE: 'CHALLENGE',\n CHOICE_KBA_BAV: 'CHOICE_KBA_BAV',\n CREATE_ACCOUNT_FAIL: 'CREATE_ACCOUNT_FAIL',\n DOC_PENDING: 'DOC_PENDING',\n DOC_REJECTED: 'DOC_REJECTED',\n DOC_SECURITY: 'DOC_SECURITY',\n DOC_VERIFY: 'DOC_VERIFY',\n ERROR: 'ERROR',\n FAIL: 'FAIL',\n ID_CHECK: 'ID_CHECK',\n INCORRECT_PHONE_NUMBER: 'INCORRECT_PHONE_NUMBER',\n INCORRECT_EMAIL_ADDRESS: 'INCORRECT_EMAIL_ADDRESS',\n KBA: 'KBA',\n KBA_BLOCKED: 'KBA_BLOCKED',\n MISSING_ADDRESS: 'MISSING_ADDRESS',\n NO_FILE: 'NO_FILE',\n OTP: 'OTP',\n OTP_EMAIL: 'OTP_EMAIL',\n OTP_MASKED: 'OTP_MASKED',\n OTP_MASKED_EMAIL: 'OTP_MASKED_EMAIL',\n OTP_PHONE_OR_EMAIL: 'OTP_PHONE_OR_EMAIL',\n PASS: 'PASS',\n REVIEW_DVS: 'REVIEW_DVS',\n TEMP_NO_FILE: 'TEMP_NO_FILE',\n TEMP_PARTIAL_MATCH: 'TEMP_PARTIAL_MATCH',\n THIN_FILE: 'THIN_FILE',\n UNVERIFIED: 'UNVERIFIED',\n WAIT_72_HOURS: 'WAIT_72_HOURS',\n PASSED_DVS: 'PASSED_DVS',\n BUREAU_CONSENT: 'BUREAU_CONSENT',\n};\n\nexport const PROFILE_FAILURE_REASONS = {\n FAIL1: 'FAIL1',\n FAIL2: 'FAIL2',\n FAIL3: 'FAIL3',\n FAIL4: 'FAIL4',\n FAIL5: 'FAIL5',\n BAV_REQUIRED: 'BAV_REQUIRED',\n DOC_FILED_BAV: 'DOC_FILED_BAV',\n DOC_REQUIRED: 'DOC_REQUIRED',\n DOC_RESUBMIT: 'DOC_RESUBMIT',\n DOC_SUBMITTED: 'DOC_SUBMITTED',\n DOC_CIFAS: 'DOC_CIFAS',\n PARTIAL_MATCH_FAIL: 'PARTIAL_MATCH_FAIL',\n FRAUD_RISK: 'FRAUD_RISK',\n BAN: 'BAN',\n DVS_NO_MATCH: 'DVS_NO_MATCH',\n OTP_FAILED: 'OTP_FAILED',\n DVS_ERROR: 'DVS_ERROR',\n};\n\nexport const DUPLOCK_ROUTES = {\n DUP_LOCKED: '/reg/duplock',\n DUPLOCK_BAV: '/reg/duplock-bav',\n DUPLOCK_RECOVERY: '/reg/duplock-recovery',\n};\n\nexport const DUPLOCK_STATUSES = {\n DUP_LOCKED: 'DUP_LOCKED',\n DUPLOCK_BAV: 'DUPLOCK_BAV',\n DUPLOCK_RECOVERY: 'DUPLOCK_RECOVERY',\n};\n\nexport const ACCOUNT_STATUSES = {\n BLOCKED: 'BLOCKED',\n ACTIVE: 'ACTIVE',\n INACTIVE: 'INACTIVE',\n PASS: 'PASS',\n TEMP_LOCKED: 'TEMP_LOCKED',\n LOCKED: 'LOCKED',\n DUP_LOCKED: 'DUP_LOCKED',\n SEC_LOCKED: 'SEC_LOCKED',\n};\n\nexport const RESUBMIT_STATUS = {\n idvStatus: PROFILE_STATUSES.THIN_FILE,\n idvReason: 'DOC_RESUBMIT',\n};\n\nexport const DOCUMENTS_UPLOAD_STATUSES = [PROFILE_STATUSES.DOC_VERIFY, PROFILE_STATUSES.DOC_PENDING];\n\nexport const OPT_STATUSES = [\n PROFILE_STATUSES.ID_CHECK,\n PROFILE_STATUSES.OTP,\n PROFILE_STATUSES.OTP_MASKED,\n PROFILE_STATUSES.INCORRECT_PHONE_NUMBER,\n];\n\nexport const GB_PASS_STATUSES = [PROFILE_STATUSES.PASS, PROFILE_STATUSES.NO_FILE];\n\nexport const GB_REGISTRATION_STATUSES = [\n PROFILE_STATUSES.CREATE_ACCOUNT,\n PROFILE_STATUSES.CREATE_ACCOUNT_FAIL,\n PROFILE_STATUSES.FAIL,\n PROFILE_STATUSES.MISSING_ADDRESS,\n PROFILE_STATUSES.ID_CHECK,\n PROFILE_STATUSES.UNVERIFIED,\n PROFILE_STATUSES.KBA,\n PROFILE_STATUSES.DOC_VERIFY,\n PROFILE_STATUSES.DOC_PENDING,\n PROFILE_STATUSES.THIN_FILE,\n PROFILE_STATUSES.CHOICE_KBA_BAV,\n PROFILE_STATUSES.TEMP_NO_FILE,\n PROFILE_STATUSES.TEMP_PARTIAL_MATCH,\n PROFILE_STATUSES.BAV,\n PROFILE_STATUSES.DOC_REJECTED,\n PROFILE_STATUSES.DOC_SECURITY,\n PROFILE_STATUSES.WAIT_72_HOURS,\n];\n\nexport const EMPLOYMENT_STATUSES = {\n SALARIED: 'SALARIED',\n SELF_EMPLOYED_BUSINESS: 'SELF_EMPLOYED_BUSINESS',\n SELF_EMPLOYED_PROFESSIONAL: 'SELF_EMPLOYED_PROFESSIONAL',\n STUDENT: 'STUDENT',\n RETIRED: 'RETIRED',\n UNEMPLOYED: 'UNEMPLOYED',\n FT_EMPLOYED: 'FT_EMPLOYED',\n PT_EMPLOYED: 'PT_EMPLOYED',\n WORK_AT_HOME: 'WORK_AT_HOME',\n SELF_EMPLOYED: 'SELF_EMPLOYED',\n};\n\nexport const RESIDENTIAL_STATUSES = {\n HOMEOWNER: 'HOMEOWNER',\n PRIVATE_TENANT: 'PRIVATE_TENANT',\n COUNCIL_TENANT: 'COUNCIL_TENANT',\n WITH_PARENTS: 'WITH_PARENTS',\n RDP_TENANT: 'RDP_TENANT',\n};\n","export const UNAUTHORISED = 'unauthorised';\nexport const AUTHORISED = 'authorised';\nexport const PROSPECT = 'prospect';\nexport const PENDING = 'pending';\n","import * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\nimport { getSessionCookie } from '@clearscore-group/lib.helpers.cookies';\nimport { PROFILE_STATUSES, ACCOUNT_STATUSES } from '@clearscore-group/lib.constants.profile-statuses';\nimport * as roles from '@clearscore-group/lib.constants.role-statuses';\nimport { types as profileTypes } from '@clearscore-group/lib.redux.profile';\nimport * as types from '@clearscore-group/lib.constants.session-action-types';\n\n/**\n * List of all statuses for userRole AUTHORISED\n */\nexport const AUTHED_IDV_STATUSES = [PROFILE_STATUSES.PASS, PROFILE_STATUSES.THIN_FILE, PROFILE_STATUSES.NO_FILE];\n\nconst getProfileFetchSuccessRole = (payload) => {\n const { accountIDVStatus, failureReason, userStatus } = payload || {};\n\n if (AUTHED_IDV_STATUSES.includes(accountIDVStatus) && !failureReason && userStatus === ACCOUNT_STATUSES.ACTIVE) {\n return roles.AUTHORISED;\n }\n\n return roles.PROSPECT;\n};\n\nconst sessionToken = getSessionCookie();\n\n// @todo: This conditional is added to allow old consumers (native apps, etc) to continue working\n// once native stop being hybrid this code can be removed.\nif (sessionToken) {\n sessionToken.accountId = sessionToken.username;\n delete sessionToken.username;\n}\n\nconst role = sessionToken ? roles.PENDING : roles.UNAUTHORISED;\n\nconst initialState = sessionToken ? { role, meta: {}, error: null } : {};\n\nexport default (state = initialState, action = {}) => {\n const { type, payload } = action;\n switch (type) {\n case types.SET_USER_ROLE:\n return {\n ...state,\n role: payload.role,\n };\n case profileTypes.PROFILE_FETCH:\n return {\n ...state,\n role: roles.PENDING,\n };\n case profileTypes.PROFILE_FETCH_SUCCESS:\n return {\n ...state,\n role: getProfileFetchSuccessRole(payload),\n };\n case types.LOGIN_OAUTH_SUBMIT_ERROR:\n case types.LOGIN_OAUTH_AUTHORISE_ERROR:\n return {\n ...state,\n meta: {},\n error: payload ? payload.data : null,\n status: requestStatuses.ERROR,\n role: roles.UNAUTHORISED,\n };\n case types.CLEAR_SESSION:\n case types.TIMEOUT_SUCCESS:\n case types.LOGOUT_SUBMIT:\n return {\n meta: {},\n error: null,\n status: requestStatuses.INITIAL,\n };\n default:\n return state;\n }\n};\n","/* eslint-disable import/prefer-default-export */\nimport sessionDomain from './session.domain';\n\nexport const domain = sessionDomain;\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getAccountId = (state) => resolveProp('session.auth.accountId', state);\n\nexport default createSelector(getAccountId, (accountId) => accountId);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport * as roles from '@clearscore-group/lib.constants.role-statuses';\n\nconst authRole = (state) => resolveProp('session.role', state) || roles.UNAUTHORISED;\n\nexport default createSelector(authRole, (role) => role);\n","import { createSelector } from 'reselect';\nimport resolveRequest, { getRequestStatus } from '@clearscore-group/lib.helpers.resolve-request';\n\nconst getSessionStatus = (state) => resolveRequest(state, 'session.status');\n\nexport default createSelector(getSessionStatus, (sessionStatus) => ({\n fetch: getRequestStatus(sessionStatus),\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getError = (state) => resolveProp('session.error', state);\n\nexport default createSelector(getError, (error) => error);\n","import sessiongetAccountId from './session.getAccountId';\nimport sessionGetAuthRole from './session.getAuthRole';\nimport sessionGetPredicate from './session.getPredicate';\nimport sessionGetError from './session.getError';\n\nexport const getAccountId = sessiongetAccountId;\nexport const getAuthRole = sessionGetAuthRole;\nexport const getPredicate = sessionGetPredicate;\nexport const getError = sessionGetError;\n","import * as sessionTypes from '@clearscore-group/lib.constants.session-action-types';\n\nimport * as actionsImport from './session.actions';\nimport * as reducersImport from './reducers';\nimport * as selectorsImport from './selectors';\n\nexport const actions = actionsImport;\nexport const reducers = reducersImport;\nexport const selectors = selectorsImport;\nexport const types = sessionTypes;\n","import { createSelector } from 'reselect';\nimport { selectors as sessionSelectors } from '@clearscore-group/lib.redux.session';\nimport * as roles from '@clearscore-group/lib.constants.role-statuses';\n\nimport routesSelector from './routesSelector';\n\nconst getRoutesRole = ({ userRole }) => {\n if (userRole === roles.AUTHORISED) {\n return roles.AUTHORISED;\n } else if (userRole === roles.PROSPECT) {\n return roles.PROSPECT;\n } else if (userRole === roles.PENDING) {\n return roles.PENDING;\n }\n return roles.UNAUTHORISED;\n};\n\nexport default createSelector(routesSelector, sessionSelectors.getAuthRole, (routes, userRole) => {\n const loggedOut = userRole === roles.UNAUTHORISED;\n const isProspect = userRole === roles.PROSPECT;\n const isPending = userRole === roles.PENDING;\n const loggedIn = userRole === roles.AUTHORISED;\n const userRoutes = routes.filter((route) => {\n // TODO: We should add `isPending` role to the relevant routes render-engine config\n if (isPending && route.path.includes('login')) return true;\n\n return route.role.includes(getRoutesRole({ userRole }));\n });\n\n return { routes: userRoutes, loggedIn, loggedOut, isProspect, isPending };\n});\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getCurrentRouteMarket = (state) => resolveProp('routes.current', state) || 'global';\n\nexport default createSelector(getCurrentRouteMarket, (market) => market);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getSegmentation = (state) => resolveProp('entities.routeSegments.segmentation', state) || { groups: [] };\n\nexport default createSelector(getSegmentation, (segmentation) => segmentation);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getRoutes = (state) => resolveProp('entities.routes.byId', state) || {};\nconst filterTakeoverRoutes = (routes) =>\n Object.entries(routes)\n .filter(([, { isTakeover }]) => isTakeover)\n .reduce(\n (takeoverRoutes, [route]) => ({\n ...takeoverRoutes,\n [route]: routes[route],\n }),\n {},\n );\n\nexport default createSelector(getRoutes, filterTakeoverRoutes);\n","import routeSelectorImport from './routeSelector';\nimport routesSelectorImport from './routesSelector';\nimport getSubMenuImport from './routesSubMenu';\nimport getRouteByIDVStatusImport from './getRouteByIDVStatus';\nimport getCurrentRouteImport from './getCurrentRoute';\nimport getCurrentPathImport from './getCurrentPath';\nimport getRoutesByStageImport from './routesStagesSelector';\nimport containsMarketPathImport from './containsMarketPath';\nimport areRoutesLoadedImport from './areRoutesLoaded';\nimport getUserRoleRoutesImport from './getUserRoleRoutes';\nimport getCurrentRouteMarketImport from './getCurrentRouteMarket';\nimport getSegmentationImport from './getSegmentation';\nimport getTakeoverRoutesImport from './getTakeoverRoutes';\n\nexport const routeSelector = routeSelectorImport;\nexport const routesSelector = routesSelectorImport;\nexport const getSubMenu = getSubMenuImport;\nexport const getRouteByIDVStatus = getRouteByIDVStatusImport;\nexport const getCurrentRoute = getCurrentRouteImport;\nexport const getCurrentPath = getCurrentPathImport;\nexport const getRoutesByStage = getRoutesByStageImport;\nexport const containsMarketPath = containsMarketPathImport;\nexport const areRoutesLoaded = areRoutesLoadedImport;\nexport const getUserRoleRoutes = getUserRoleRoutesImport;\nexport const getCurrentRouteMarket = getCurrentRouteMarketImport;\nexport const getSegmentation = getSegmentationImport;\nexport const getTakeoverRoutes = getTakeoverRoutesImport;\n","import { ROUTES_REINITIALISE } from './types';\nimport { reinitialiseRoutes } from './actions';\n\nexport * as reducers from './reducer';\nexport * as selectors from './selectors';\nexport const types = { ROUTES_REINITIALISE };\nexport const actions = { reinitialiseRoutes };\n","import createAction from '@clearscore-group/lib.helpers.create-action';\n\nimport { ROUTES_REINITIALISE } from './types';\n\n/* eslint-disable import/prefer-default-export */\nexport const reinitialiseRoutes = (routes, accountIDVStatus, market, segmentation) =>\n createAction(ROUTES_REINITIALISE, { routes, accountIDVStatus, market, segmentation });\n","import type { ReactElement } from 'react';\nimport React, { useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useRouteMatch } from 'react-router-dom';\nimport LazyLoadComponent from '@clearscore-group/lib.flux-core.lazy-load';\nimport { selectors as routesSelectors } from '@clearscore-group/lib.redux.routes';\n\nimport type { VerticalTakeoverTriggerProps } from '../vertical-takeover.types';\n\nexport interface VerticalTakeoverLazyRendererProps {\n name: string;\n onClose: VoidFunction;\n triggerProps: VerticalTakeoverTriggerProps;\n}\n\ninterface TakeoverRoutes {\n [key: string]: Record;\n}\n\nconst VerticalTakeoverLazyRenderer = ({\n name,\n onClose,\n triggerProps,\n}: VerticalTakeoverLazyRendererProps): ReactElement | null => {\n const match = useRouteMatch();\n const takeoverRoutes: TakeoverRoutes = useSelector(routesSelectors.getTakeoverRoutes);\n const component = useMemo(\n () => Object.values(takeoverRoutes ?? {}).find(({ name: verticalName }) => name === verticalName),\n [name, takeoverRoutes],\n );\n return component ? (\n \n ) : null;\n};\n\nexport default VerticalTakeoverLazyRenderer;\n","import type { ReactElement, ReactNode } from 'react';\nimport React, { useContext, useState, useCallback, useMemo } from 'react';\nimport { createGlobalContext } from '@clearscore-group/lib.helpers.create-global-context';\n\nimport { VERTICAL_TAKEOVER_CONTEXT_NAME } from './lib/constants';\nimport VerticalTakeoverLazyRenderer from './components/vertical-takeover-lazy-renderer';\nimport type { VerticalTakeoverContextValue, VerticalTakeoverTriggerProps } from './vertical-takeover.types';\n\nconst VerticalTakeoverContext = createGlobalContext(\n VERTICAL_TAKEOVER_CONTEXT_NAME,\n undefined,\n);\n\ninterface VerticalTakeoverProviderProps {\n children: ReactNode;\n}\n\nconst VerticalTakeoverProvider = ({ children }: VerticalTakeoverProviderProps): ReactElement => {\n const [verticalName, setVerticalName] = useState();\n const [triggerProps, setTriggerProps] = useState();\n\n const trigger = useCallback((name: string, input: VerticalTakeoverTriggerProps): void => {\n setVerticalName(name);\n setTriggerProps(input);\n }, []);\n\n const close = useCallback(() => {\n setVerticalName(undefined);\n setTriggerProps(undefined);\n }, []);\n\n const value: VerticalTakeoverContextValue = useMemo(\n () => ({\n close,\n trigger,\n }),\n [close, trigger],\n );\n\n return (\n \n {children}\n {verticalName && triggerProps && (\n \n )}\n \n );\n};\n\nconst useVerticalTakeoverContext = (): VerticalTakeoverContextValue | undefined => {\n const context = useContext(VerticalTakeoverContext);\n return context;\n};\n\nexport { VerticalTakeoverProvider, useVerticalTakeoverContext };\n","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isError(wat) {\n switch (objectToString.call(wat)) {\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n return true;\n default:\n return isInstanceOf(wat, Error);\n }\n}\n/**\n * Checks whether given value is an instance of the given built-in class.\n *\n * @param wat The value to be checked\n * @param className\n * @returns A boolean representing the result.\n */\nfunction isBuiltin(wat, className) {\n return objectToString.call(wat) === `[object ${className}]`;\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isErrorEvent(wat) {\n return isBuiltin(wat, 'ErrorEvent');\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isDOMError(wat) {\n return isBuiltin(wat, 'DOMError');\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isDOMException(wat) {\n return isBuiltin(wat, 'DOMException');\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isString(wat) {\n return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given string is parameterized\n * {@link isParameterizedString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isParameterizedString(wat) {\n return (\n typeof wat === 'object' &&\n wat !== null &&\n '__sentry_template_string__' in wat &&\n '__sentry_template_values__' in wat\n );\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isPrimitive(wat) {\n return wat === null || isParameterizedString(wat) || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal, or a class instance.\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isPlainObject(wat) {\n return isBuiltin(wat, 'Object');\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isEvent(wat) {\n return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isElement(wat) {\n return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isRegExp(wat) {\n return isBuiltin(wat, 'RegExp');\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nfunction isThenable(wat) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isSyntheticEvent(wat) {\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value is NaN\n * {@link isNaN}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isNaN(wat) {\n return typeof wat === 'number' && wat !== wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nfunction isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n } catch (_e) {\n return false;\n }\n}\n\n/**\n * Checks whether given value's type is a Vue ViewModel.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nfunction isVueViewModel(wat) {\n // Not using Object.prototype.toString because in Vue 3 it would read the instance's Symbol(Symbol.toStringTag) property.\n return !!(typeof wat === 'object' && wat !== null && ((wat ).__isVue || (wat )._isVue));\n}\n\nexport { isDOMError, isDOMException, isElement, isError, isErrorEvent, isEvent, isInstanceOf, isNaN, isParameterizedString, isPlainObject, isPrimitive, isRegExp, isString, isSyntheticEvent, isThenable, isVueViewModel };\n//# sourceMappingURL=is.js.map\n","/** Internal global with common properties and Sentry extensions */\n\n// The code below for 'isGlobalObj' and 'GLOBAL_OBJ' was copied from core-js before modification\n// https://github.com/zloirock/core-js/blob/1b944df55282cdc99c90db5f49eb0b6eda2cc0a3/packages/core-js/internals/global.js\n// core-js has the following licence:\n//\n// Copyright (c) 2014-2022 Denis Pushkarev\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/** Returns 'obj' if it's the global object, otherwise returns undefined */\nfunction isGlobalObj(obj) {\n return obj && obj.Math == Math ? obj : undefined;\n}\n\n/** Get's the global object for the current JavaScript runtime */\nconst GLOBAL_OBJ =\n (typeof globalThis == 'object' && isGlobalObj(globalThis)) ||\n // eslint-disable-next-line no-restricted-globals\n (typeof window == 'object' && isGlobalObj(window)) ||\n (typeof self == 'object' && isGlobalObj(self)) ||\n (typeof global == 'object' && isGlobalObj(global)) ||\n (function () {\n return this;\n })() ||\n {};\n\n/**\n * @deprecated Use GLOBAL_OBJ instead or WINDOW from @sentry/browser. This will be removed in v8\n */\nfunction getGlobalObject() {\n return GLOBAL_OBJ ;\n}\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value\n * @returns the singleton\n */\nfunction getGlobalSingleton(name, creator, obj) {\n const gbl = (obj || GLOBAL_OBJ) ;\n const __SENTRY__ = (gbl.__SENTRY__ = gbl.__SENTRY__ || {});\n const singleton = __SENTRY__[name] || (__SENTRY__[name] = creator());\n return singleton;\n}\n\nexport { GLOBAL_OBJ, getGlobalObject, getGlobalSingleton };\n//# sourceMappingURL=worldwide.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","import { DEBUG_BUILD } from './debug-build.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\nconst CONSOLE_LEVELS = [\n 'debug',\n 'info',\n 'warn',\n 'error',\n 'log',\n 'assert',\n 'trace',\n] ;\n\n/** This may be mutated by the console instrumentation. */\nconst originalConsoleMethods\n\n = {};\n\n/** JSDoc */\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nfunction consoleSandbox(callback) {\n if (!('console' in GLOBAL_OBJ)) {\n return callback();\n }\n\n const console = GLOBAL_OBJ.console ;\n const wrappedFuncs = {};\n\n const wrappedLevels = Object.keys(originalConsoleMethods) ;\n\n // Restore all wrapped console methods\n wrappedLevels.forEach(level => {\n const originalConsoleMethod = originalConsoleMethods[level] ;\n wrappedFuncs[level] = console[level] ;\n console[level] = originalConsoleMethod;\n });\n\n try {\n return callback();\n } finally {\n // Revert restoration to wrapped state\n wrappedLevels.forEach(level => {\n console[level] = wrappedFuncs[level] ;\n });\n }\n}\n\nfunction makeLogger() {\n let enabled = false;\n const logger = {\n enable: () => {\n enabled = true;\n },\n disable: () => {\n enabled = false;\n },\n isEnabled: () => enabled,\n };\n\n if (DEBUG_BUILD) {\n CONSOLE_LEVELS.forEach(name => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logger[name] = (...args) => {\n if (enabled) {\n consoleSandbox(() => {\n GLOBAL_OBJ.console[name](`${PREFIX}[${name}]:`, ...args);\n });\n }\n };\n });\n } else {\n CONSOLE_LEVELS.forEach(name => {\n logger[name] = () => undefined;\n });\n }\n\n return logger ;\n}\n\nconst logger = makeLogger();\n\nexport { CONSOLE_LEVELS, consoleSandbox, logger, originalConsoleMethods };\n//# sourceMappingURL=logger.js.map\n","import { htmlTreeAsString } from './browser.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { isError, isEvent, isInstanceOf, isElement, isPlainObject, isPrimitive } from './is.js';\nimport { logger } from './logger.js';\nimport { truncate } from './string.js';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, )` or `origMethod.apply(this, [])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nfunction fill(source, name, replacementFactory) {\n if (!(name in source)) {\n return;\n }\n\n const original = source[name] ;\n const wrapped = replacementFactory(original) ;\n\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n markFunctionWrapped(wrapped, original);\n }\n\n source[name] = wrapped;\n}\n\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nfunction addNonEnumerableProperty(obj, name, value) {\n try {\n Object.defineProperty(obj, name, {\n // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n value: value,\n writable: true,\n configurable: true,\n });\n } catch (o_O) {\n DEBUG_BUILD && logger.log(`Failed to add non-enumerable property \"${name}\" to object`, obj);\n }\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nfunction markFunctionWrapped(wrapped, original) {\n try {\n const proto = original.prototype || {};\n wrapped.prototype = original.prototype = proto;\n addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n } catch (o_O) {} // eslint-disable-line no-empty\n}\n\n/**\n * This extracts the original function if available. See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\nfunction getOriginalFunction(func) {\n return func.__sentry_original__;\n}\n\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nfunction urlEncode(object) {\n return Object.keys(object)\n .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n .join('&');\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argurment itself, when value is neither an Event nor\n * an Error.\n */\nfunction convertToPlainObject(\n value,\n)\n\n {\n if (isError(value)) {\n return {\n message: value.message,\n name: value.name,\n stack: value.stack,\n ...getOwnProperties(value),\n };\n } else if (isEvent(value)) {\n const newObj\n\n = {\n type: value.type,\n target: serializeEventTarget(value.target),\n currentTarget: serializeEventTarget(value.currentTarget),\n ...getOwnProperties(value),\n };\n\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n newObj.detail = value.detail;\n }\n\n return newObj;\n } else {\n return value;\n }\n}\n\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target) {\n try {\n return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n } catch (_oO) {\n return '';\n }\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj) {\n if (typeof obj === 'object' && obj !== null) {\n const extractedProps = {};\n for (const property in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, property)) {\n extractedProps[property] = (obj )[property];\n }\n }\n return extractedProps;\n } else {\n return {};\n }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nfunction extractExceptionKeysForMessage(exception, maxLength = 40) {\n const keys = Object.keys(convertToPlainObject(exception));\n keys.sort();\n\n if (!keys.length) {\n return '[object has no keys]';\n }\n\n if (keys[0].length >= maxLength) {\n return truncate(keys[0], maxLength);\n }\n\n for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n const serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n\n return '';\n}\n\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n */\nfunction dropUndefinedKeys(inputValue) {\n // This map keeps track of what already visited nodes map to.\n // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n // references as the input object.\n const memoizationMap = new Map();\n\n // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys(inputValue, memoizationMap) {\n if (isPojo(inputValue)) {\n // If this node has already been visited due to a circular reference, return the object it was mapped to in the new object\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal ;\n }\n\n const returnValue = {};\n // Store the mapping of this value in case we visit it again, in case of circular data\n memoizationMap.set(inputValue, returnValue);\n\n for (const key of Object.keys(inputValue)) {\n if (typeof inputValue[key] !== 'undefined') {\n returnValue[key] = _dropUndefinedKeys(inputValue[key], memoizationMap);\n }\n }\n\n return returnValue ;\n }\n\n if (Array.isArray(inputValue)) {\n // If this node has already been visited due to a circular reference, return the array it was mapped to in the new object\n const memoVal = memoizationMap.get(inputValue);\n if (memoVal !== undefined) {\n return memoVal ;\n }\n\n const returnValue = [];\n // Store the mapping of this value in case we visit it again, in case of circular data\n memoizationMap.set(inputValue, returnValue);\n\n inputValue.forEach((item) => {\n returnValue.push(_dropUndefinedKeys(item, memoizationMap));\n });\n\n return returnValue ;\n }\n\n return inputValue;\n}\n\nfunction isPojo(input) {\n if (!isPlainObject(input)) {\n return false;\n }\n\n try {\n const name = (Object.getPrototypeOf(input) ).constructor.name;\n return !name || name === 'Object';\n } catch (e) {\n return true;\n }\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nfunction objectify(wat) {\n let objectified;\n switch (true) {\n case wat === undefined || wat === null:\n objectified = new String(wat);\n break;\n\n // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n // an object in order to wrap it.\n case typeof wat === 'symbol' || typeof wat === 'bigint':\n objectified = Object(wat);\n break;\n\n // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n case isPrimitive(wat):\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n objectified = new (wat ).constructor(wat);\n break;\n\n // by process of elimination, at this point we know that `wat` must already be an object\n default:\n objectified = wat;\n break;\n }\n return objectified;\n}\n\nexport { addNonEnumerableProperty, convertToPlainObject, dropUndefinedKeys, extractExceptionKeysForMessage, fill, getOriginalFunction, markFunctionWrapped, objectify, urlEncode };\n//# sourceMappingURL=object.js.map\n","import { addNonEnumerableProperty } from './object.js';\nimport { snipLine } from './string.js';\nimport { GLOBAL_OBJ } from './worldwide.js';\n\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nfunction uuid4() {\n const gbl = GLOBAL_OBJ ;\n const crypto = gbl.crypto || gbl.msCrypto;\n\n let getRandomByte = () => Math.random() * 16;\n try {\n if (crypto && crypto.randomUUID) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n if (crypto && crypto.getRandomValues) {\n getRandomByte = () => {\n // crypto.getRandomValues might return undefined instead of the typed array\n // in old Chromium versions (e.g. 23.0.1235.0 (151422))\n // However, `typedArray` is still filled in-place.\n // @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#typedarray\n const typedArray = new Uint8Array(1);\n crypto.getRandomValues(typedArray);\n return typedArray[0];\n };\n }\n } catch (_) {\n // some runtimes can crash invoking crypto\n // https://github.com/getsentry/sentry-javascript/issues/8935\n }\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n return (([1e7] ) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c =>\n // eslint-disable-next-line no-bitwise\n ((c ) ^ ((getRandomByte() & 15) >> ((c ) / 4))).toString(16),\n );\n}\n\nfunction getFirstException(event) {\n return event.exception && event.exception.values ? event.exception.values[0] : undefined;\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nfunction getEventDescription(event) {\n const { message, event_id: eventId } = event;\n if (message) {\n return message;\n }\n\n const firstException = getFirstException(event);\n if (firstException) {\n if (firstException.type && firstException.value) {\n return `${firstException.type}: ${firstException.value}`;\n }\n return firstException.type || firstException.value || eventId || '';\n }\n return eventId || '';\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nfunction addExceptionTypeValue(event, value, type) {\n const exception = (event.exception = event.exception || {});\n const values = (exception.values = exception.values || []);\n const firstException = (values[0] = values[0] || {});\n if (!firstException.value) {\n firstException.value = value || '';\n }\n if (!firstException.type) {\n firstException.type = type || 'Error';\n }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nfunction addExceptionMechanism(event, newMechanism) {\n const firstException = getFirstException(event);\n if (!firstException) {\n return;\n }\n\n const defaultMechanism = { type: 'generic', handled: true };\n const currentMechanism = firstException.mechanism;\n firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n if (newMechanism && 'data' in newMechanism) {\n const mergedData = { ...(currentMechanism && currentMechanism.data), ...newMechanism.data };\n firstException.mechanism.data = mergedData;\n }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nfunction parseSemver(input) {\n const match = input.match(SEMVER_REGEXP) || [];\n const major = parseInt(match[1], 10);\n const minor = parseInt(match[2], 10);\n const patch = parseInt(match[3], 10);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4],\n };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nfunction addContextToFrame(lines, frame, linesOfContext = 5) {\n // When there is no line number in the frame, attaching context is nonsensical and will even break grouping\n if (frame.lineno === undefined) {\n return;\n }\n\n const maxLines = lines.length;\n const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map((line) => snipLine(line, 0));\n\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map((line) => snipLine(line, 0));\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nfunction checkOrSetAlreadyCaught(exception) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (exception && (exception ).__sentry_captured__) {\n return true;\n }\n\n try {\n // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n // `ExtraErrorData` integration\n addNonEnumerableProperty(exception , '__sentry_captured__', true);\n } catch (err) {\n // `exception` is a primitive, so we can't mark it seen\n }\n\n return false;\n}\n\n/**\n * Checks whether the given input is already an array, and if it isn't, wraps it in one.\n *\n * @param maybeArray Input to turn into an array, if necessary\n * @returns The input, if already an array, or an array with the input as the only element, if not\n */\nfunction arrayify(maybeArray) {\n return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n\nexport { addContextToFrame, addExceptionMechanism, addExceptionTypeValue, arrayify, checkOrSetAlreadyCaught, getEventDescription, parseSemver, uuid4 };\n//# sourceMappingURL=misc.js.map\n","import { isThenable } from './is.js';\n\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\n\n/** SyncPromise internal states */\nvar States; (function (States) {\n /** Pending */\n const PENDING = 0; States[States[\"PENDING\"] = PENDING] = \"PENDING\";\n /** Resolved / OK */\n const RESOLVED = 1; States[States[\"RESOLVED\"] = RESOLVED] = \"RESOLVED\";\n /** Rejected / Error */\n const REJECTED = 2; States[States[\"REJECTED\"] = REJECTED] = \"REJECTED\";\n})(States || (States = {}));\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nfunction resolvedSyncPromise(value) {\n return new SyncPromise(resolve => {\n resolve(value);\n });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nfunction rejectedSyncPromise(reason) {\n return new SyncPromise((_, reject) => {\n reject(reason);\n });\n}\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nclass SyncPromise {\n\n constructor(\n executor,\n ) {SyncPromise.prototype.__init.call(this);SyncPromise.prototype.__init2.call(this);SyncPromise.prototype.__init3.call(this);SyncPromise.prototype.__init4.call(this);\n this._state = States.PENDING;\n this._handlers = [];\n\n try {\n executor(this._resolve, this._reject);\n } catch (e) {\n this._reject(e);\n }\n }\n\n /** JSDoc */\n then(\n onfulfilled,\n onrejected,\n ) {\n return new SyncPromise((resolve, reject) => {\n this._handlers.push([\n false,\n result => {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result );\n } else {\n try {\n resolve(onfulfilled(result));\n } catch (e) {\n reject(e);\n }\n }\n },\n reason => {\n if (!onrejected) {\n reject(reason);\n } else {\n try {\n resolve(onrejected(reason));\n } catch (e) {\n reject(e);\n }\n }\n },\n ]);\n this._executeHandlers();\n });\n }\n\n /** JSDoc */\n catch(\n onrejected,\n ) {\n return this.then(val => val, onrejected);\n }\n\n /** JSDoc */\n finally(onfinally) {\n return new SyncPromise((resolve, reject) => {\n let val;\n let isRejected;\n\n return this.then(\n value => {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n },\n reason => {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n },\n ).then(() => {\n if (isRejected) {\n reject(val);\n return;\n }\n\n resolve(val );\n });\n });\n }\n\n /** JSDoc */\n __init() {this._resolve = (value) => {\n this._setResult(States.RESOLVED, value);\n };}\n\n /** JSDoc */\n __init2() {this._reject = (reason) => {\n this._setResult(States.REJECTED, reason);\n };}\n\n /** JSDoc */\n __init3() {this._setResult = (state, value) => {\n if (this._state !== States.PENDING) {\n return;\n }\n\n if (isThenable(value)) {\n void (value ).then(this._resolve, this._reject);\n return;\n }\n\n this._state = state;\n this._value = value;\n\n this._executeHandlers();\n };}\n\n /** JSDoc */\n __init4() {this._executeHandlers = () => {\n if (this._state === States.PENDING) {\n return;\n }\n\n const cachedHandlers = this._handlers.slice();\n this._handlers = [];\n\n cachedHandlers.forEach(handler => {\n if (handler[0]) {\n return;\n }\n\n if (this._state === States.RESOLVED) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handler[1](this._value );\n }\n\n if (this._state === States.REJECTED) {\n handler[2](this._value);\n }\n\n handler[0] = true;\n });\n };}\n}\n\nexport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise };\n//# sourceMappingURL=syncpromise.js.map\n","import { GLOBAL_OBJ } from './worldwide.js';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n *\n * TODO(v8): Return type should be rounded.\n */\nfunction dateTimestampInSeconds() {\n return Date.now() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc() {\n const { performance } = GLOBAL_OBJ ;\n if (!performance || !performance.now) {\n return dateTimestampInSeconds;\n }\n\n // Some browser and environments don't have a timeOrigin, so we fallback to\n // using Date.now() to compute the starting time.\n const approxStartingTimeOrigin = Date.now() - performance.now();\n const timeOrigin = performance.timeOrigin == undefined ? approxStartingTimeOrigin : performance.timeOrigin;\n\n // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n //\n // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n // correct for this.\n // See: https://github.com/getsentry/sentry-javascript/issues/2590\n // See: https://github.com/mdn/content/issues/4713\n // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n return () => {\n return (timeOrigin + performance.now()) / ONE_SECOND_IN_MS;\n };\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nconst timestampInSeconds = createUnixTimestampInSecondsFunc();\n\n/**\n * Re-exported with an old name for backwards-compatibility.\n * TODO (v8): Remove this\n *\n * @deprecated Use `timestampInSeconds` instead.\n */\nconst timestampWithMs = timestampInSeconds;\n\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nlet _browserPerformanceTimeOriginMode;\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nconst browserPerformanceTimeOrigin = (() => {\n // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n // data as reliable if they are within a reasonable threshold of the current time.\n\n const { performance } = GLOBAL_OBJ ;\n if (!performance || !performance.now) {\n _browserPerformanceTimeOriginMode = 'none';\n return undefined;\n }\n\n const threshold = 3600 * 1000;\n const performanceNow = performance.now();\n const dateNow = Date.now();\n\n // if timeOrigin isn't available set delta to threshold so it isn't used\n const timeOriginDelta = performance.timeOrigin\n ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n : threshold;\n const timeOriginIsReliable = timeOriginDelta < threshold;\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n const navigationStart = performance.timing && performance.timing.navigationStart;\n const hasNavigationStart = typeof navigationStart === 'number';\n // if navigationStart isn't available set delta to threshold so it isn't used\n const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n const navigationStartIsReliable = navigationStartDelta < threshold;\n\n if (timeOriginIsReliable || navigationStartIsReliable) {\n // Use the more reliable time origin\n if (timeOriginDelta <= navigationStartDelta) {\n _browserPerformanceTimeOriginMode = 'timeOrigin';\n return performance.timeOrigin;\n } else {\n _browserPerformanceTimeOriginMode = 'navigationStart';\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n _browserPerformanceTimeOriginMode = 'dateNow';\n return dateNow;\n})();\n\nexport { _browserPerformanceTimeOriginMode, browserPerformanceTimeOrigin, dateTimestampInSeconds, timestampInSeconds, timestampWithMs };\n//# sourceMappingURL=time.js.map\n","/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","const DEFAULT_ENVIRONMENT = 'production';\n\nexport { DEFAULT_ENVIRONMENT };\n//# sourceMappingURL=constants.js.map\n","import { SyncPromise, logger, isThenable, getGlobalSingleton } from '@sentry/utils';\nimport { DEBUG_BUILD } from './debug-build.js';\n\n/**\n * Returns the global event processors.\n * @deprecated Global event processors will be removed in v8.\n */\nfunction getGlobalEventProcessors() {\n return getGlobalSingleton('globalEventProcessors', () => []);\n}\n\n/**\n * Add a EventProcessor to be kept globally.\n * @deprecated Use `addEventProcessor` instead. Global event processors will be removed in v8.\n */\nfunction addGlobalEventProcessor(callback) {\n // eslint-disable-next-line deprecation/deprecation\n getGlobalEventProcessors().push(callback);\n}\n\n/**\n * Process an array of event processors, returning the processed event (or `null` if the event was dropped).\n */\nfunction notifyEventProcessors(\n processors,\n event,\n hint,\n index = 0,\n) {\n return new SyncPromise((resolve, reject) => {\n const processor = processors[index];\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n } else {\n const result = processor({ ...event }, hint) ;\n\n DEBUG_BUILD && processor.id && result === null && logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n if (isThenable(result)) {\n void result\n .then(final => notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n .then(null, reject);\n } else {\n void notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n}\n\nexport { addGlobalEventProcessor, getGlobalEventProcessors, notifyEventProcessors };\n//# sourceMappingURL=eventProcessors.js.map\n","import { timestampInSeconds, uuid4, dropUndefinedKeys } from '@sentry/utils';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nfunction makeSession(context) {\n // Both timestamp and started are in seconds since the UNIX epoch.\n const startingTime = timestampInSeconds();\n\n const session = {\n sid: uuid4(),\n init: true,\n timestamp: startingTime,\n started: startingTime,\n duration: 0,\n status: 'ok',\n errors: 0,\n ignoreDuration: false,\n toJSON: () => sessionToJSON(session),\n };\n\n if (context) {\n updateSession(session, context);\n }\n\n return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see BaseClient.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nfunction updateSession(session, context = {}) {\n if (context.user) {\n if (!session.ipAddress && context.user.ip_address) {\n session.ipAddress = context.user.ip_address;\n }\n\n if (!session.did && !context.did) {\n session.did = context.user.id || context.user.email || context.user.username;\n }\n }\n\n session.timestamp = context.timestamp || timestampInSeconds();\n\n if (context.abnormal_mechanism) {\n session.abnormal_mechanism = context.abnormal_mechanism;\n }\n\n if (context.ignoreDuration) {\n session.ignoreDuration = context.ignoreDuration;\n }\n if (context.sid) {\n // Good enough uuid validation. — Kamil\n session.sid = context.sid.length === 32 ? context.sid : uuid4();\n }\n if (context.init !== undefined) {\n session.init = context.init;\n }\n if (!session.did && context.did) {\n session.did = `${context.did}`;\n }\n if (typeof context.started === 'number') {\n session.started = context.started;\n }\n if (session.ignoreDuration) {\n session.duration = undefined;\n } else if (typeof context.duration === 'number') {\n session.duration = context.duration;\n } else {\n const duration = session.timestamp - session.started;\n session.duration = duration >= 0 ? duration : 0;\n }\n if (context.release) {\n session.release = context.release;\n }\n if (context.environment) {\n session.environment = context.environment;\n }\n if (!session.ipAddress && context.ipAddress) {\n session.ipAddress = context.ipAddress;\n }\n if (!session.userAgent && context.userAgent) {\n session.userAgent = context.userAgent;\n }\n if (typeof context.errors === 'number') {\n session.errors = context.errors;\n }\n if (context.status) {\n session.status = context.status;\n }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n * this function will keep the previously set status, unless it was `'ok'` in which case\n * it is changed to `'exited'`.\n */\nfunction closeSession(session, status) {\n let context = {};\n if (status) {\n context = { status };\n } else if (session.status === 'ok') {\n context = { status: 'exited' };\n }\n\n updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session) {\n return dropUndefinedKeys({\n sid: `${session.sid}`,\n init: session.init,\n // Make sure that sec is converted to ms for date constructor\n started: new Date(session.started * 1000).toISOString(),\n timestamp: new Date(session.timestamp * 1000).toISOString(),\n status: session.status,\n errors: session.errors,\n did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n duration: session.duration,\n abnormal_mechanism: session.abnormal_mechanism,\n attrs: {\n release: session.release,\n environment: session.environment,\n ip_address: session.ipAddress,\n user_agent: session.userAgent,\n },\n });\n}\n\nexport { closeSession, makeSession, updateSession };\n//# sourceMappingURL=session.js.map\n","import { dropUndefinedKeys, generateSentryTraceHeader, timestampInSeconds } from '@sentry/utils';\n\n// These are aligned with OpenTelemetry trace flags\nconst TRACE_FLAG_NONE = 0x0;\nconst TRACE_FLAG_SAMPLED = 0x1;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n */\nfunction spanToTraceContext(span) {\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n const { data, op, parent_span_id, status, tags, origin } = spanToJSON(span);\n\n return dropUndefinedKeys({\n data,\n op,\n parent_span_id,\n span_id,\n status,\n tags,\n trace_id,\n origin,\n });\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nfunction spanToTraceHeader(span) {\n const { traceId, spanId } = span.spanContext();\n const sampled = spanIsSampled(span);\n return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Convert a span time input intp a timestamp in seconds.\n */\nfunction spanTimeInputToSeconds(input) {\n if (typeof input === 'number') {\n return ensureTimestampInSeconds(input);\n }\n\n if (Array.isArray(input)) {\n // See {@link HrTime} for the array-based time format\n return input[0] + input[1] / 1e9;\n }\n\n if (input instanceof Date) {\n return ensureTimestampInSeconds(input.getTime());\n }\n\n return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp) {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n * Note that all fields returned here are optional and need to be guarded against.\n *\n * Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n * This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n * And `spanToJSON` needs the Span class from `span.ts` to check here.\n * TODO v8: When we remove the deprecated stuff from `span.ts`, we can remove the circular dependency again.\n */\nfunction spanToJSON(span) {\n if (spanIsSpanClass(span)) {\n return span.getSpanJSON();\n }\n\n // Fallback: We also check for `.toJSON()` here...\n // eslint-disable-next-line deprecation/deprecation\n if (typeof span.toJSON === 'function') {\n // eslint-disable-next-line deprecation/deprecation\n return span.toJSON();\n }\n\n return {};\n}\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSpanClass(span) {\n return typeof (span ).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nfunction spanIsSampled(span) {\n // We align our trace flags with the ones OpenTelemetry use\n // So we also check for sampled the same way they do.\n const { traceFlags } = span.spanContext();\n // eslint-disable-next-line no-bitwise\n return Boolean(traceFlags & TRACE_FLAG_SAMPLED);\n}\n\nexport { TRACE_FLAG_NONE, TRACE_FLAG_SAMPLED, spanIsSampled, spanTimeInputToSeconds, spanToJSON, spanToTraceContext, spanToTraceHeader };\n//# sourceMappingURL=spanUtils.js.map\n","import { logger, uuid4, timestampInSeconds, isThenable, GLOBAL_OBJ } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from './constants.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { getCurrentHub, runWithAsyncContext, getIsolationScope } from './hub.js';\nimport { makeSession, updateSession, closeSession } from './session.js';\nimport { parseEventHintOrCaptureContext } from './utils/prepareEvent.js';\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception The exception to capture.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nfunction captureException(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exception,\n hint,\n) {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param exception The exception to capture.\n * @param captureContext Define the level of the message or pass in additional data to attach to the message.\n * @returns the id of the captured message.\n */\nfunction captureMessage(\n message,\n // eslint-disable-next-line deprecation/deprecation\n captureContext,\n) {\n // This is necessary to provide explicit scopes upgrade, without changing the original\n // arity of the `captureMessage(message, level)` method.\n const level = typeof captureContext === 'string' ? captureContext : undefined;\n const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().captureMessage(message, level, context);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param exception The event to send to Sentry.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured event.\n */\nfunction captureEvent(event, hint) {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().captureEvent(event, hint);\n}\n\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n *\n * @deprecated Use getCurrentScope() directly.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction configureScope(callback) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().configureScope(callback);\n}\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction addBreadcrumb(breadcrumb, hint) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().addBreadcrumb(breadcrumb, hint);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, deprecation/deprecation\nfunction setContext(name, context) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction setExtras(extras) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction setExtra(key, extra) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction setTags(tags) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction setTag(key, value) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().setTag(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction setUser(user) {\n // eslint-disable-next-line deprecation/deprecation\n getCurrentHub().setUser(user);\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n */\n\n/**\n * Either creates a new active scope, or sets the given scope as active scope in the given callback.\n */\nfunction withScope(\n ...rest\n) {\n // eslint-disable-next-line deprecation/deprecation\n const hub = getCurrentHub();\n\n // If a scope is defined, we want to make this the active scope instead of the default one\n if (rest.length === 2) {\n const [scope, callback] = rest;\n if (!scope) {\n // eslint-disable-next-line deprecation/deprecation\n return hub.withScope(callback);\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return hub.withScope(() => {\n // eslint-disable-next-line deprecation/deprecation\n hub.getStackTop().scope = scope ;\n return callback(scope );\n });\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return hub.withScope(rest[0]);\n}\n\n/**\n * Attempts to fork the current isolation scope and the current scope based on the current async context strategy. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n *\n * @param callback The callback in which the passed isolation scope is active. (Note: In environments without async\n * context strategy, the currently active isolation scope may change within execution of the callback.)\n * @returns The same value that `callback` returns.\n */\nfunction withIsolationScope(callback) {\n return runWithAsyncContext(() => {\n return callback(getIsolationScope());\n });\n}\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback.\n *\n * @param span Spans started in the context of the provided callback will be children of this span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nfunction withActiveSpan(span, callback) {\n return withScope(scope => {\n // eslint-disable-next-line deprecation/deprecation\n scope.setSpan(span);\n return callback(scope);\n });\n}\n\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.end()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * NOTE: This function should only be used for *manual* instrumentation. Auto-instrumentation should call\n * `startTransaction` directly on the hub.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n *\n * @deprecated Use `startSpan()`, `startSpanManual()` or `startInactiveSpan()` instead.\n */\nfunction startTransaction(\n context,\n customSamplingContext,\n // eslint-disable-next-line deprecation/deprecation\n) {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().startTransaction({ ...context }, customSamplingContext);\n}\n\n/**\n * Create a cron monitor check in and send it to Sentry.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nfunction captureCheckIn(checkIn, upsertMonitorConfig) {\n const scope = getCurrentScope();\n const client = getClient();\n if (!client) {\n DEBUG_BUILD && logger.warn('Cannot capture check-in. No client defined.');\n } else if (!client.captureCheckIn) {\n DEBUG_BUILD && logger.warn('Cannot capture check-in. Client does not support sending check-ins.');\n } else {\n return client.captureCheckIn(checkIn, upsertMonitorConfig, scope);\n }\n\n return uuid4();\n}\n\n/**\n * Wraps a callback with a cron monitor check in. The check in will be sent to Sentry when the callback finishes.\n *\n * @param monitorSlug The distinct slug of the monitor.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nfunction withMonitor(\n monitorSlug,\n callback,\n upsertMonitorConfig,\n) {\n const checkInId = captureCheckIn({ monitorSlug, status: 'in_progress' }, upsertMonitorConfig);\n const now = timestampInSeconds();\n\n function finishCheckIn(status) {\n captureCheckIn({ monitorSlug, status, checkInId, duration: timestampInSeconds() - now });\n }\n\n let maybePromiseResult;\n try {\n maybePromiseResult = callback();\n } catch (e) {\n finishCheckIn('error');\n throw e;\n }\n\n if (isThenable(maybePromiseResult)) {\n Promise.resolve(maybePromiseResult).then(\n () => {\n finishCheckIn('ok');\n },\n () => {\n finishCheckIn('error');\n },\n );\n } else {\n finishCheckIn('ok');\n }\n\n return maybePromiseResult;\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nasync function flush(timeout) {\n const client = getClient();\n if (client) {\n return client.flush(timeout);\n }\n DEBUG_BUILD && logger.warn('Cannot flush events. No client defined.');\n return Promise.resolve(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nasync function close(timeout) {\n const client = getClient();\n if (client) {\n return client.close(timeout);\n }\n DEBUG_BUILD && logger.warn('Cannot flush events and disable SDK. No client defined.');\n return Promise.resolve(false);\n}\n\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n * @deprecated This function will be removed in the next major version of the Sentry SDK.\n */\nfunction lastEventId() {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().lastEventId();\n}\n\n/**\n * Get the currently active client.\n */\nfunction getClient() {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().getClient();\n}\n\n/**\n * Returns true if Sentry has been properly initialized.\n */\nfunction isInitialized() {\n return !!getClient();\n}\n\n/**\n * Get the currently active scope.\n */\nfunction getCurrentScope() {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().getScope();\n}\n\n/**\n * Start a session on the current isolation scope.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns the new active session\n */\nfunction startSession(context) {\n const client = getClient();\n const isolationScope = getIsolationScope();\n const currentScope = getCurrentScope();\n\n const { release, environment = DEFAULT_ENVIRONMENT } = (client && client.getOptions()) || {};\n\n // Will fetch userAgent if called from browser sdk\n const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n const session = makeSession({\n release,\n environment,\n user: currentScope.getUser() || isolationScope.getUser(),\n ...(userAgent && { userAgent }),\n ...context,\n });\n\n // End existing session if there's one\n const currentSession = isolationScope.getSession();\n if (currentSession && currentSession.status === 'ok') {\n updateSession(currentSession, { status: 'exited' });\n }\n\n endSession();\n\n // Afterwards we set the new session on the scope\n isolationScope.setSession(session);\n\n // TODO (v8): Remove this and only use the isolation scope(?).\n // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n currentScope.setSession(session);\n\n return session;\n}\n\n/**\n * End the session on the current isolation scope.\n */\nfunction endSession() {\n const isolationScope = getIsolationScope();\n const currentScope = getCurrentScope();\n\n const session = currentScope.getSession() || isolationScope.getSession();\n if (session) {\n closeSession(session);\n }\n _sendSessionUpdate();\n\n // the session is over; take it off of the scope\n isolationScope.setSession();\n\n // TODO (v8): Remove this and only use the isolation scope(?).\n // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n currentScope.setSession();\n}\n\n/**\n * Sends the current Session on the scope\n */\nfunction _sendSessionUpdate() {\n const isolationScope = getIsolationScope();\n const currentScope = getCurrentScope();\n const client = getClient();\n // TODO (v8): Remove currentScope and only use the isolation scope(?).\n // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n const session = currentScope.getSession() || isolationScope.getSession();\n if (session && client && client.captureSession) {\n client.captureSession(session);\n }\n}\n\n/**\n * Sends the current session on the scope to Sentry\n *\n * @param end If set the session will be marked as exited and removed from the scope.\n * Defaults to `false`.\n */\nfunction captureSession(end = false) {\n // both send the update and pull the session from the scope\n if (end) {\n endSession();\n return;\n }\n\n // only send the update\n _sendSessionUpdate();\n}\n\nexport { addBreadcrumb, captureCheckIn, captureEvent, captureException, captureMessage, captureSession, close, configureScope, endSession, flush, getClient, getCurrentScope, isInitialized, lastEventId, setContext, setExtra, setExtras, setTag, setTags, setUser, startSession, startTransaction, withActiveSpan, withIsolationScope, withMonitor, withScope };\n//# sourceMappingURL=exports.js.map\n","/**\n * Returns the root span of a given span.\n *\n * As long as we use `Transaction`s internally, the returned root span\n * will be a `Transaction` but be aware that this might change in the future.\n *\n * If the given span has no root span or transaction, `undefined` is returned.\n */\nfunction getRootSpan(span) {\n // TODO (v8): Remove this check and just return span\n // eslint-disable-next-line deprecation/deprecation\n return span.transaction;\n}\n\nexport { getRootSpan };\n//# sourceMappingURL=getRootSpan.js.map\n","import { dropUndefinedKeys } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from '../constants.js';\nimport { getClient, getCurrentScope } from '../exports.js';\nimport { getRootSpan } from '../utils/getRootSpan.js';\nimport { spanToJSON, spanIsSampled } from '../utils/spanUtils.js';\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nfunction getDynamicSamplingContextFromClient(\n trace_id,\n client,\n scope,\n) {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n // TODO(v8): Remove segment from User\n // eslint-disable-next-line deprecation/deprecation\n const { segment: user_segment } = (scope && scope.getUser()) || {};\n\n const dsc = dropUndefinedKeys({\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n user_segment,\n public_key,\n trace_id,\n }) ;\n\n client.emit && client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * A Span with a frozen dynamic sampling context.\n */\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nfunction getDynamicSamplingContextFromSpan(span) {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n // passing emit=false here to only emit later once the DSC is actually populated\n const dsc = getDynamicSamplingContextFromClient(spanToJSON(span).trace_id || '', client, getCurrentScope());\n\n // TODO (v8): Remove v7FrozenDsc as a Transaction will no longer have _frozenDynamicSamplingContext\n const txn = getRootSpan(span) ;\n if (!txn) {\n return dsc;\n }\n\n // TODO (v8): Remove v7FrozenDsc as a Transaction will no longer have _frozenDynamicSamplingContext\n // For now we need to avoid breaking users who directly created a txn with a DSC, where this field is still set.\n // @see Transaction class constructor\n const v7FrozenDsc = txn && txn._frozenDynamicSamplingContext;\n if (v7FrozenDsc) {\n return v7FrozenDsc;\n }\n\n // TODO (v8): Replace txn.metadata with txn.attributes[]\n // We can't do this yet because attributes aren't always set yet.\n // eslint-disable-next-line deprecation/deprecation\n const { sampleRate: maybeSampleRate, source } = txn.metadata;\n if (maybeSampleRate != null) {\n dsc.sample_rate = `${maybeSampleRate}`;\n }\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n const jsonSpan = spanToJSON(txn);\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n if (source && source !== 'url') {\n dsc.transaction = jsonSpan.description;\n }\n\n dsc.sampled = String(spanIsSampled(txn));\n\n client.emit && client.emit('createDsc', dsc);\n\n return dsc;\n}\n\nexport { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromSpan };\n//# sourceMappingURL=dynamicSamplingContext.js.map\n","import { dropUndefinedKeys, arrayify } from '@sentry/utils';\nimport { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext.js';\nimport { getRootSpan } from './getRootSpan.js';\nimport { spanToTraceContext, spanToJSON } from './spanUtils.js';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nfunction applyScopeDataToEvent(event, data) {\n const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n // Apply general data\n applyDataToEvent(event, data);\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (span) {\n applySpanToEvent(event, span);\n }\n\n applyFingerprintToEvent(event, fingerprint);\n applyBreadcrumbsToEvent(event, breadcrumbs);\n applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nfunction mergeScopeData(data, mergeData) {\n const {\n extra,\n tags,\n user,\n contexts,\n level,\n sdkProcessingMetadata,\n breadcrumbs,\n fingerprint,\n eventProcessors,\n attachments,\n propagationContext,\n // eslint-disable-next-line deprecation/deprecation\n transactionName,\n span,\n } = mergeData;\n\n mergeAndOverwriteScopeData(data, 'extra', extra);\n mergeAndOverwriteScopeData(data, 'tags', tags);\n mergeAndOverwriteScopeData(data, 'user', user);\n mergeAndOverwriteScopeData(data, 'contexts', contexts);\n mergeAndOverwriteScopeData(data, 'sdkProcessingMetadata', sdkProcessingMetadata);\n\n if (level) {\n data.level = level;\n }\n\n if (transactionName) {\n // eslint-disable-next-line deprecation/deprecation\n data.transactionName = transactionName;\n }\n\n if (span) {\n data.span = span;\n }\n\n if (breadcrumbs.length) {\n data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n }\n\n if (fingerprint.length) {\n data.fingerprint = [...data.fingerprint, ...fingerprint];\n }\n\n if (eventProcessors.length) {\n data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n }\n\n if (attachments.length) {\n data.attachments = [...data.attachments, ...attachments];\n }\n\n data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nfunction mergeAndOverwriteScopeData\n\n(data, prop, mergeVal) {\n if (mergeVal && Object.keys(mergeVal).length) {\n // Clone object\n data[prop] = { ...data[prop] };\n for (const key in mergeVal) {\n if (Object.prototype.hasOwnProperty.call(mergeVal, key)) {\n data[prop][key] = mergeVal[key];\n }\n }\n }\n}\n\nfunction applyDataToEvent(event, data) {\n const {\n extra,\n tags,\n user,\n contexts,\n level,\n // eslint-disable-next-line deprecation/deprecation\n transactionName,\n } = data;\n\n const cleanedExtra = dropUndefinedKeys(extra);\n if (cleanedExtra && Object.keys(cleanedExtra).length) {\n event.extra = { ...cleanedExtra, ...event.extra };\n }\n\n const cleanedTags = dropUndefinedKeys(tags);\n if (cleanedTags && Object.keys(cleanedTags).length) {\n event.tags = { ...cleanedTags, ...event.tags };\n }\n\n const cleanedUser = dropUndefinedKeys(user);\n if (cleanedUser && Object.keys(cleanedUser).length) {\n event.user = { ...cleanedUser, ...event.user };\n }\n\n const cleanedContexts = dropUndefinedKeys(contexts);\n if (cleanedContexts && Object.keys(cleanedContexts).length) {\n event.contexts = { ...cleanedContexts, ...event.contexts };\n }\n\n if (level) {\n event.level = level;\n }\n\n if (transactionName) {\n event.transaction = transactionName;\n }\n}\n\nfunction applyBreadcrumbsToEvent(event, breadcrumbs) {\n const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event, sdkProcessingMetadata) {\n event.sdkProcessingMetadata = {\n ...event.sdkProcessingMetadata,\n ...sdkProcessingMetadata,\n };\n}\n\nfunction applySpanToEvent(event, span) {\n event.contexts = { trace: spanToTraceContext(span), ...event.contexts };\n const rootSpan = getRootSpan(span);\n if (rootSpan) {\n event.sdkProcessingMetadata = {\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n ...event.sdkProcessingMetadata,\n };\n const transactionName = spanToJSON(rootSpan).description;\n if (transactionName) {\n event.tags = { transaction: transactionName, ...event.tags };\n }\n }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event, fingerprint) {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint ? arrayify(event.fingerprint) : [];\n\n // If we have something on the scope, then merge it with event\n if (fingerprint) {\n event.fingerprint = event.fingerprint.concat(fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n}\n\nexport { applyScopeDataToEvent, mergeAndOverwriteScopeData, mergeScopeData };\n//# sourceMappingURL=applyScopeDataToEvent.js.map\n","import { isPlainObject, dateTimestampInSeconds, uuid4, logger } from '@sentry/utils';\nimport { getGlobalEventProcessors, notifyEventProcessors } from './eventProcessors.js';\nimport { updateSession } from './session.js';\nimport { applyScopeDataToEvent } from './utils/applyScopeDataToEvent.js';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * The global scope is kept in this module.\n * When accessing this via `getGlobalScope()` we'll make sure to set one if none is currently present.\n */\nlet globalScope;\n\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nclass Scope {\n /** Flag if notifying is happening. */\n\n /** Callback for client to receive scope changes. */\n\n /** Callback list that will be called after {@link applyToEvent}. */\n\n /** Array of breadcrumbs. */\n\n /** User */\n\n /** Tags */\n\n /** Extra */\n\n /** Contexts */\n\n /** Attachments */\n\n /** Propagation Context for distributed tracing */\n\n /**\n * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n * sent to Sentry\n */\n\n /** Fingerprint */\n\n /** Severity */\n // eslint-disable-next-line deprecation/deprecation\n\n /**\n * Transaction Name\n */\n\n /** Span */\n\n /** Session */\n\n /** Request Mode Session Status */\n\n /** The client on this scope */\n\n // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n constructor() {\n this._notifyingListeners = false;\n this._scopeListeners = [];\n this._eventProcessors = [];\n this._breadcrumbs = [];\n this._attachments = [];\n this._user = {};\n this._tags = {};\n this._extra = {};\n this._contexts = {};\n this._sdkProcessingMetadata = {};\n this._propagationContext = generatePropagationContext();\n }\n\n /**\n * Inherit values from the parent scope.\n * @deprecated Use `scope.clone()` and `new Scope()` instead.\n */\n static clone(scope) {\n return scope ? scope.clone() : new Scope();\n }\n\n /**\n * Clone this scope instance.\n */\n clone() {\n const newScope = new Scope();\n newScope._breadcrumbs = [...this._breadcrumbs];\n newScope._tags = { ...this._tags };\n newScope._extra = { ...this._extra };\n newScope._contexts = { ...this._contexts };\n newScope._user = this._user;\n newScope._level = this._level;\n newScope._span = this._span;\n newScope._session = this._session;\n newScope._transactionName = this._transactionName;\n newScope._fingerprint = this._fingerprint;\n newScope._eventProcessors = [...this._eventProcessors];\n newScope._requestSession = this._requestSession;\n newScope._attachments = [...this._attachments];\n newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n newScope._propagationContext = { ...this._propagationContext };\n newScope._client = this._client;\n\n return newScope;\n }\n\n /** Update the client on the scope. */\n setClient(client) {\n this._client = client;\n }\n\n /**\n * Get the client assigned to this scope.\n *\n * It is generally recommended to use the global function `Sentry.getClient()` instead, unless you know what you are doing.\n */\n getClient() {\n return this._client;\n }\n\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n addScopeListener(callback) {\n this._scopeListeners.push(callback);\n }\n\n /**\n * @inheritDoc\n */\n addEventProcessor(callback) {\n this._eventProcessors.push(callback);\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setUser(user) {\n // If null is passed we want to unset everything, but still define keys,\n // so that later down in the pipeline any existing values are cleared.\n this._user = user || {\n email: undefined,\n id: undefined,\n ip_address: undefined,\n segment: undefined,\n username: undefined,\n };\n\n if (this._session) {\n updateSession(this._session, { user });\n }\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getUser() {\n return this._user;\n }\n\n /**\n * @inheritDoc\n */\n getRequestSession() {\n return this._requestSession;\n }\n\n /**\n * @inheritDoc\n */\n setRequestSession(requestSession) {\n this._requestSession = requestSession;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setTags(tags) {\n this._tags = {\n ...this._tags,\n ...tags,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setTag(key, value) {\n this._tags = { ...this._tags, [key]: value };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setExtras(extras) {\n this._extra = {\n ...this._extra,\n ...extras,\n };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setExtra(key, extra) {\n this._extra = { ...this._extra, [key]: extra };\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setFingerprint(fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setLevel(\n // eslint-disable-next-line deprecation/deprecation\n level,\n ) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Sets the transaction name on the scope for future events.\n */\n setTransactionName(name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setContext(key, context) {\n if (context === null) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._contexts[key];\n } else {\n this._contexts[key] = context;\n }\n\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Sets the Span on the scope.\n * @param span Span\n * @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.\n */\n setSpan(span) {\n this._span = span;\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * Returns the `Span` if there is one.\n * @deprecated Use `getActiveSpan()` instead.\n */\n getSpan() {\n return this._span;\n }\n\n /**\n * Returns the `Transaction` attached to the scope (if there is one).\n * @deprecated You should not rely on the transaction, but just use `startSpan()` APIs instead.\n */\n getTransaction() {\n // Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will\n // have a pointer to the currently-active transaction.\n const span = this._span;\n // Cannot replace with getRootSpan because getRootSpan returns a span, not a transaction\n // Also, this method will be removed anyway.\n // eslint-disable-next-line deprecation/deprecation\n return span && span.transaction;\n }\n\n /**\n * @inheritDoc\n */\n setSession(session) {\n if (!session) {\n delete this._session;\n } else {\n this._session = session;\n }\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getSession() {\n return this._session;\n }\n\n /**\n * @inheritDoc\n */\n update(captureContext) {\n if (!captureContext) {\n return this;\n }\n\n const scopeToMerge = typeof captureContext === 'function' ? captureContext(this) : captureContext;\n\n if (scopeToMerge instanceof Scope) {\n const scopeData = scopeToMerge.getScopeData();\n\n this._tags = { ...this._tags, ...scopeData.tags };\n this._extra = { ...this._extra, ...scopeData.extra };\n this._contexts = { ...this._contexts, ...scopeData.contexts };\n if (scopeData.user && Object.keys(scopeData.user).length) {\n this._user = scopeData.user;\n }\n if (scopeData.level) {\n this._level = scopeData.level;\n }\n if (scopeData.fingerprint.length) {\n this._fingerprint = scopeData.fingerprint;\n }\n if (scopeToMerge.getRequestSession()) {\n this._requestSession = scopeToMerge.getRequestSession();\n }\n if (scopeData.propagationContext) {\n this._propagationContext = scopeData.propagationContext;\n }\n } else if (isPlainObject(scopeToMerge)) {\n const scopeContext = captureContext ;\n this._tags = { ...this._tags, ...scopeContext.tags };\n this._extra = { ...this._extra, ...scopeContext.extra };\n this._contexts = { ...this._contexts, ...scopeContext.contexts };\n if (scopeContext.user) {\n this._user = scopeContext.user;\n }\n if (scopeContext.level) {\n this._level = scopeContext.level;\n }\n if (scopeContext.fingerprint) {\n this._fingerprint = scopeContext.fingerprint;\n }\n if (scopeContext.requestSession) {\n this._requestSession = scopeContext.requestSession;\n }\n if (scopeContext.propagationContext) {\n this._propagationContext = scopeContext.propagationContext;\n }\n }\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n clear() {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._requestSession = undefined;\n this._span = undefined;\n this._session = undefined;\n this._notifyScopeListeners();\n this._attachments = [];\n this._propagationContext = generatePropagationContext();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n addBreadcrumb(breadcrumb, maxBreadcrumbs) {\n const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n // No data has been changed, so don't notify scope listeners\n if (maxCrumbs <= 0) {\n return this;\n }\n\n const mergedBreadcrumb = {\n timestamp: dateTimestampInSeconds(),\n ...breadcrumb,\n };\n\n const breadcrumbs = this._breadcrumbs;\n breadcrumbs.push(mergedBreadcrumb);\n this._breadcrumbs = breadcrumbs.length > maxCrumbs ? breadcrumbs.slice(-maxCrumbs) : breadcrumbs;\n\n this._notifyScopeListeners();\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getLastBreadcrumb() {\n return this._breadcrumbs[this._breadcrumbs.length - 1];\n }\n\n /**\n * @inheritDoc\n */\n clearBreadcrumbs() {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n }\n\n /**\n * @inheritDoc\n */\n addAttachment(attachment) {\n this._attachments.push(attachment);\n return this;\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `getScopeData()` instead.\n */\n getAttachments() {\n const data = this.getScopeData();\n\n return data.attachments;\n }\n\n /**\n * @inheritDoc\n */\n clearAttachments() {\n this._attachments = [];\n return this;\n }\n\n /** @inheritDoc */\n getScopeData() {\n const {\n _breadcrumbs,\n _attachments,\n _contexts,\n _tags,\n _extra,\n _user,\n _level,\n _fingerprint,\n _eventProcessors,\n _propagationContext,\n _sdkProcessingMetadata,\n _transactionName,\n _span,\n } = this;\n\n return {\n breadcrumbs: _breadcrumbs,\n attachments: _attachments,\n contexts: _contexts,\n tags: _tags,\n extra: _extra,\n user: _user,\n level: _level,\n fingerprint: _fingerprint || [],\n eventProcessors: _eventProcessors,\n propagationContext: _propagationContext,\n sdkProcessingMetadata: _sdkProcessingMetadata,\n transactionName: _transactionName,\n span: _span,\n };\n }\n\n /**\n * Applies data from the scope to the event and runs all event processors on it.\n *\n * @param event Event\n * @param hint Object containing additional information about the original exception, for use by the event processors.\n * @hidden\n * @deprecated Use `applyScopeDataToEvent()` directly\n */\n applyToEvent(\n event,\n hint = {},\n additionalEventProcessors = [],\n ) {\n applyScopeDataToEvent(event, this.getScopeData());\n\n // TODO (v8): Update this order to be: Global > Client > Scope\n const eventProcessors = [\n ...additionalEventProcessors,\n // eslint-disable-next-line deprecation/deprecation\n ...getGlobalEventProcessors(),\n ...this._eventProcessors,\n ];\n\n return notifyEventProcessors(eventProcessors, event, hint);\n }\n\n /**\n * Add data which will be accessible during event processing but won't get sent to Sentry\n */\n setSDKProcessingMetadata(newData) {\n this._sdkProcessingMetadata = { ...this._sdkProcessingMetadata, ...newData };\n\n return this;\n }\n\n /**\n * @inheritDoc\n */\n setPropagationContext(context) {\n this._propagationContext = context;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n getPropagationContext() {\n return this._propagationContext;\n }\n\n /**\n * Capture an exception for this scope.\n *\n * @param exception The exception to capture.\n * @param hint Optinal additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\n captureException(exception, hint) {\n const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n if (!this._client) {\n logger.warn('No client configured on scope - will not capture exception!');\n return eventId;\n }\n\n const syntheticException = new Error('Sentry syntheticException');\n\n this._client.captureException(\n exception,\n {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n this,\n );\n\n return eventId;\n }\n\n /**\n * Capture a message for this scope.\n *\n * @param message The message to capture.\n * @param level An optional severity level to report the message with.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured message.\n */\n captureMessage(message, level, hint) {\n const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n if (!this._client) {\n logger.warn('No client configured on scope - will not capture message!');\n return eventId;\n }\n\n const syntheticException = new Error(message);\n\n this._client.captureMessage(\n message,\n level,\n {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId,\n },\n this,\n );\n\n return eventId;\n }\n\n /**\n * Captures a manually created event for this scope and sends it to Sentry.\n *\n * @param exception The event to capture.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured event.\n */\n captureEvent(event, hint) {\n const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n if (!this._client) {\n logger.warn('No client configured on scope - will not capture event!');\n return eventId;\n }\n\n this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n\n return eventId;\n }\n\n /**\n * This will be called on every set call.\n */\n _notifyScopeListeners() {\n // We need this check for this._notifyingListeners to be able to work on scope during updates\n // If this check is not here we'll produce endless recursion when something is done with the scope\n // during the callback.\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n this._scopeListeners.forEach(callback => {\n callback(this);\n });\n this._notifyingListeners = false;\n }\n }\n}\n\n/**\n * Get the global scope.\n * This scope is applied to _all_ events.\n */\nfunction getGlobalScope() {\n if (!globalScope) {\n globalScope = new Scope();\n }\n\n return globalScope;\n}\n\n/**\n * This is mainly needed for tests.\n * DO NOT USE this, as this is an internal API and subject to change.\n * @hidden\n */\nfunction setGlobalScope(scope) {\n globalScope = scope;\n}\n\nfunction generatePropagationContext() {\n return {\n traceId: uuid4(),\n spanId: uuid4().substring(16),\n };\n}\n\nexport { Scope, getGlobalScope, setGlobalScope };\n//# sourceMappingURL=scope.js.map\n","const SDK_VERSION = '7.112.2';\n\nexport { SDK_VERSION };\n//# sourceMappingURL=version.js.map\n","import { isThenable, uuid4, dateTimestampInSeconds, consoleSandbox, logger, GLOBAL_OBJ, getGlobalSingleton } from '@sentry/utils';\nimport { DEFAULT_ENVIRONMENT } from './constants.js';\nimport { DEBUG_BUILD } from './debug-build.js';\nimport { Scope } from './scope.js';\nimport { closeSession, makeSession, updateSession } from './session.js';\nimport { SDK_VERSION } from './version.js';\n\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nconst API_VERSION = parseFloat(SDK_VERSION);\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * @deprecated The `Hub` class will be removed in version 8 of the SDK in favour of `Scope` and `Client` objects.\n *\n * If you previously used the `Hub` class directly, replace it with `Scope` and `Client` objects. More information:\n * - [Multiple Sentry Instances](https://docs.sentry.io/platforms/javascript/best-practices/multiple-sentry-instances/)\n * - [Browser Extensions](https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/)\n *\n * Some of our APIs are typed with the Hub class instead of the interface (e.g. `getCurrentHub`). Most of them are deprecated\n * themselves and will also be removed in version 8. More information:\n * - [Migration Guide](https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub)\n */\n// eslint-disable-next-line deprecation/deprecation\nclass Hub {\n /** Is a {@link Layer}[] containing the client and scope */\n\n /** Contains the last event id of a captured event. */\n\n /**\n * Creates a new instance of the hub, will push one {@link Layer} into the\n * internal stack on creation.\n *\n * @param client bound to the hub.\n * @param scope bound to the hub.\n * @param version number, higher number means higher priority.\n *\n * @deprecated Instantiation of Hub objects is deprecated and the constructor will be removed in version 8 of the SDK.\n *\n * If you are currently using the Hub for multi-client use like so:\n *\n * ```\n * // OLD\n * const hub = new Hub();\n * hub.bindClient(client);\n * makeMain(hub)\n * ```\n *\n * instead initialize the client as follows:\n *\n * ```\n * // NEW\n * Sentry.withIsolationScope(() => {\n * Sentry.setCurrentClient(client);\n * client.init();\n * });\n * ```\n *\n * If you are using the Hub to capture events like so:\n *\n * ```\n * // OLD\n * const client = new Client();\n * const hub = new Hub(client);\n * hub.captureException()\n * ```\n *\n * instead capture isolated events as follows:\n *\n * ```\n * // NEW\n * const client = new Client();\n * const scope = new Scope();\n * scope.setClient(client);\n * scope.captureException();\n * ```\n */\n constructor(\n client,\n scope,\n isolationScope,\n _version = API_VERSION,\n ) {this._version = _version;\n let assignedScope;\n if (!scope) {\n assignedScope = new Scope();\n assignedScope.setClient(client);\n } else {\n assignedScope = scope;\n }\n\n let assignedIsolationScope;\n if (!isolationScope) {\n assignedIsolationScope = new Scope();\n assignedIsolationScope.setClient(client);\n } else {\n assignedIsolationScope = isolationScope;\n }\n\n this._stack = [{ scope: assignedScope }];\n\n if (client) {\n // eslint-disable-next-line deprecation/deprecation\n this.bindClient(client);\n }\n\n this._isolationScope = assignedIsolationScope;\n }\n\n /**\n * Checks if this hub's version is older than the given version.\n *\n * @param version A version number to compare to.\n * @return True if the given version is newer; otherwise false.\n *\n * @deprecated This will be removed in v8.\n */\n isOlderThan(version) {\n return this._version < version;\n }\n\n /**\n * This binds the given client to the current scope.\n * @param client An SDK client (client) instance.\n *\n * @deprecated Use `initAndBind()` directly, or `setCurrentClient()` and/or `client.init()` instead.\n */\n bindClient(client) {\n // eslint-disable-next-line deprecation/deprecation\n const top = this.getStackTop();\n top.client = client;\n top.scope.setClient(client);\n // eslint-disable-next-line deprecation/deprecation\n if (client && client.setupIntegrations) {\n // eslint-disable-next-line deprecation/deprecation\n client.setupIntegrations();\n }\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `withScope` instead.\n */\n pushScope() {\n // We want to clone the content of prev scope\n // eslint-disable-next-line deprecation/deprecation\n const scope = this.getScope().clone();\n // eslint-disable-next-line deprecation/deprecation\n this.getStack().push({\n // eslint-disable-next-line deprecation/deprecation\n client: this.getClient(),\n scope,\n });\n return scope;\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `withScope` instead.\n */\n popScope() {\n // eslint-disable-next-line deprecation/deprecation\n if (this.getStack().length <= 1) return false;\n // eslint-disable-next-line deprecation/deprecation\n return !!this.getStack().pop();\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `Sentry.withScope()` instead.\n */\n withScope(callback) {\n // eslint-disable-next-line deprecation/deprecation\n const scope = this.pushScope();\n\n let maybePromiseResult;\n try {\n maybePromiseResult = callback(scope);\n } catch (e) {\n // eslint-disable-next-line deprecation/deprecation\n this.popScope();\n throw e;\n }\n\n if (isThenable(maybePromiseResult)) {\n // @ts-expect-error - isThenable returns the wrong type\n return maybePromiseResult.then(\n res => {\n // eslint-disable-next-line deprecation/deprecation\n this.popScope();\n return res;\n },\n e => {\n // eslint-disable-next-line deprecation/deprecation\n this.popScope();\n throw e;\n },\n );\n }\n\n // eslint-disable-next-line deprecation/deprecation\n this.popScope();\n return maybePromiseResult;\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `Sentry.getClient()` instead.\n */\n getClient() {\n // eslint-disable-next-line deprecation/deprecation\n return this.getStackTop().client ;\n }\n\n /**\n * Returns the scope of the top stack.\n *\n * @deprecated Use `Sentry.getCurrentScope()` instead.\n */\n getScope() {\n // eslint-disable-next-line deprecation/deprecation\n return this.getStackTop().scope;\n }\n\n /**\n * @deprecated Use `Sentry.getIsolationScope()` instead.\n */\n getIsolationScope() {\n return this._isolationScope;\n }\n\n /**\n * Returns the scope stack for domains or the process.\n * @deprecated This will be removed in v8.\n */\n getStack() {\n return this._stack;\n }\n\n /**\n * Returns the topmost scope layer in the order domain > local > process.\n * @deprecated This will be removed in v8.\n */\n getStackTop() {\n return this._stack[this._stack.length - 1];\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `Sentry.captureException()` instead.\n */\n captureException(exception, hint) {\n const eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n const syntheticException = new Error('Sentry syntheticException');\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().captureException(exception, {\n originalException: exception,\n syntheticException,\n ...hint,\n event_id: eventId,\n });\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `Sentry.captureMessage()` instead.\n */\n captureMessage(\n message,\n // eslint-disable-next-line deprecation/deprecation\n level,\n hint,\n ) {\n const eventId = (this._lastEventId = hint && hint.event_id ? hint.event_id : uuid4());\n const syntheticException = new Error(message);\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().captureMessage(message, level, {\n originalException: message,\n syntheticException,\n ...hint,\n event_id: eventId,\n });\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `Sentry.captureEvent()` instead.\n */\n captureEvent(event, hint) {\n const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n if (!event.type) {\n this._lastEventId = eventId;\n }\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().captureEvent(event, { ...hint, event_id: eventId });\n return eventId;\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated This will be removed in v8.\n */\n lastEventId() {\n return this._lastEventId;\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `Sentry.addBreadcrumb()` instead.\n */\n addBreadcrumb(breadcrumb, hint) {\n // eslint-disable-next-line deprecation/deprecation\n const { scope, client } = this.getStackTop();\n\n if (!client) return;\n\n const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } =\n (client.getOptions && client.getOptions()) || {};\n\n if (maxBreadcrumbs <= 0) return;\n\n const timestamp = dateTimestampInSeconds();\n const mergedBreadcrumb = { timestamp, ...breadcrumb };\n const finalBreadcrumb = beforeBreadcrumb\n ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) )\n : mergedBreadcrumb;\n\n if (finalBreadcrumb === null) return;\n\n if (client.emit) {\n client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n }\n\n // TODO(v8): I know this comment doesn't make much sense because the hub will be deprecated but I still wanted to\n // write it down. In theory, we would have to add the breadcrumbs to the isolation scope here, however, that would\n // duplicate all of the breadcrumbs. There was the possibility of adding breadcrumbs to both, the isolation scope\n // and the normal scope, and deduplicating it down the line in the event processing pipeline. However, that would\n // have been very fragile, because the breadcrumb objects would have needed to keep their identity all throughout\n // the event processing pipeline.\n // In the new implementation, the top level `Sentry.addBreadcrumb()` should ONLY write to the isolation scope.\n\n scope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.setUser()` instead.\n */\n setUser(user) {\n // TODO(v8): The top level `Sentry.setUser()` function should write ONLY to the isolation scope.\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().setUser(user);\n // eslint-disable-next-line deprecation/deprecation\n this.getIsolationScope().setUser(user);\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.setTags()` instead.\n */\n setTags(tags) {\n // TODO(v8): The top level `Sentry.setTags()` function should write ONLY to the isolation scope.\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().setTags(tags);\n // eslint-disable-next-line deprecation/deprecation\n this.getIsolationScope().setTags(tags);\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.setExtras()` instead.\n */\n setExtras(extras) {\n // TODO(v8): The top level `Sentry.setExtras()` function should write ONLY to the isolation scope.\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().setExtras(extras);\n // eslint-disable-next-line deprecation/deprecation\n this.getIsolationScope().setExtras(extras);\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.setTag()` instead.\n */\n setTag(key, value) {\n // TODO(v8): The top level `Sentry.setTag()` function should write ONLY to the isolation scope.\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().setTag(key, value);\n // eslint-disable-next-line deprecation/deprecation\n this.getIsolationScope().setTag(key, value);\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.setExtra()` instead.\n */\n setExtra(key, extra) {\n // TODO(v8): The top level `Sentry.setExtra()` function should write ONLY to the isolation scope.\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().setExtra(key, extra);\n // eslint-disable-next-line deprecation/deprecation\n this.getIsolationScope().setExtra(key, extra);\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.setContext()` instead.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setContext(name, context) {\n // TODO(v8): The top level `Sentry.setContext()` function should write ONLY to the isolation scope.\n // eslint-disable-next-line deprecation/deprecation\n this.getScope().setContext(name, context);\n // eslint-disable-next-line deprecation/deprecation\n this.getIsolationScope().setContext(name, context);\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use `getScope()` directly.\n */\n configureScope(callback) {\n // eslint-disable-next-line deprecation/deprecation\n const { scope, client } = this.getStackTop();\n if (client) {\n callback(scope);\n }\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line deprecation/deprecation\n run(callback) {\n // eslint-disable-next-line deprecation/deprecation\n const oldHub = makeMain(this);\n try {\n callback(this);\n } finally {\n // eslint-disable-next-line deprecation/deprecation\n makeMain(oldHub);\n }\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `Sentry.getClient().getIntegrationByName()` instead.\n */\n getIntegration(integration) {\n // eslint-disable-next-line deprecation/deprecation\n const client = this.getClient();\n if (!client) return null;\n try {\n // eslint-disable-next-line deprecation/deprecation\n return client.getIntegration(integration);\n } catch (_oO) {\n DEBUG_BUILD && logger.warn(`Cannot retrieve integration ${integration.id} from the current Hub`);\n return null;\n }\n }\n\n /**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.end()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n *\n * @deprecated Use `startSpan()`, `startSpanManual()` or `startInactiveSpan()` instead.\n */\n startTransaction(context, customSamplingContext) {\n const result = this._callExtensionMethod('startTransaction', context, customSamplingContext);\n\n if (DEBUG_BUILD && !result) {\n // eslint-disable-next-line deprecation/deprecation\n const client = this.getClient();\n if (!client) {\n logger.warn(\n \"Tracing extension 'startTransaction' is missing. You should 'init' the SDK before calling 'startTransaction'\",\n );\n } else {\n logger.warn(`Tracing extension 'startTransaction' has not been added. Call 'addTracingExtensions' before calling 'init':\nSentry.addTracingExtensions();\nSentry.init({...});\n`);\n }\n }\n\n return result;\n }\n\n /**\n * @inheritDoc\n * @deprecated Use `spanToTraceHeader()` instead.\n */\n traceHeaders() {\n return this._callExtensionMethod('traceHeaders');\n }\n\n /**\n * @inheritDoc\n *\n * @deprecated Use top level `captureSession` instead.\n */\n captureSession(endSession = false) {\n // both send the update and pull the session from the scope\n if (endSession) {\n // eslint-disable-next-line deprecation/deprecation\n return this.endSession();\n }\n\n // only send the update\n this._sendSessionUpdate();\n }\n\n /**\n * @inheritDoc\n * @deprecated Use top level `endSession` instead.\n */\n endSession() {\n // eslint-disable-next-line deprecation/deprecation\n const layer = this.getStackTop();\n const scope = layer.scope;\n const session = scope.getSession();\n if (session) {\n closeSession(session);\n }\n this._sendSessionUpdate();\n\n // the session is over; take it off of the scope\n scope.setSession();\n }\n\n /**\n * @inheritDoc\n * @deprecated Use top level `startSession` instead.\n */\n startSession(context) {\n // eslint-disable-next-line deprecation/deprecation\n const { scope, client } = this.getStackTop();\n const { release, environment = DEFAULT_ENVIRONMENT } = (client && client.getOptions()) || {};\n\n // Will fetch userAgent if called from browser sdk\n const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n const session = makeSession({\n release,\n environment,\n user: scope.getUser(),\n ...(userAgent && { userAgent }),\n ...context,\n });\n\n // End existing session if there's one\n const currentSession = scope.getSession && scope.getSession();\n if (currentSession && currentSession.status === 'ok') {\n updateSession(currentSession, { status: 'exited' });\n }\n // eslint-disable-next-line deprecation/deprecation\n this.endSession();\n\n // Afterwards we set the new session on the scope\n scope.setSession(session);\n\n return session;\n }\n\n /**\n * Returns if default PII should be sent to Sentry and propagated in ourgoing requests\n * when Tracing is used.\n *\n * @deprecated Use top-level `getClient().getOptions().sendDefaultPii` instead. This function\n * only unnecessarily increased API surface but only wrapped accessing the option.\n */\n shouldSendDefaultPii() {\n // eslint-disable-next-line deprecation/deprecation\n const client = this.getClient();\n const options = client && client.getOptions();\n return Boolean(options && options.sendDefaultPii);\n }\n\n /**\n * Sends the current Session on the scope\n */\n _sendSessionUpdate() {\n // eslint-disable-next-line deprecation/deprecation\n const { scope, client } = this.getStackTop();\n\n const session = scope.getSession();\n if (session && client && client.captureSession) {\n client.captureSession(session);\n }\n }\n\n /**\n * Calls global extension method and binding current instance to the function call\n */\n // @ts-expect-error Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _callExtensionMethod(method, ...args) {\n const carrier = getMainCarrier();\n const sentry = carrier.__SENTRY__;\n if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n return sentry.extensions[method].apply(this, args);\n }\n DEBUG_BUILD && logger.warn(`Extension method ${method} couldn't be found, doing nothing.`);\n }\n}\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nfunction getMainCarrier() {\n GLOBAL_OBJ.__SENTRY__ = GLOBAL_OBJ.__SENTRY__ || {\n extensions: {},\n hub: undefined,\n };\n return GLOBAL_OBJ;\n}\n\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n *\n * @deprecated Use `setCurrentClient()` instead.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction makeMain(hub) {\n const registry = getMainCarrier();\n const oldHub = getHubFromCarrier(registry);\n setHubOnCarrier(registry, hub);\n return oldHub;\n}\n\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n *\n * @deprecated Use the respective replacement method directly instead.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction getCurrentHub() {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n\n if (registry.__SENTRY__ && registry.__SENTRY__.acs) {\n const hub = registry.__SENTRY__.acs.getCurrentHub();\n\n if (hub) {\n return hub;\n }\n }\n\n // Return hub that lives on a global object\n return getGlobalHub(registry);\n}\n\n/**\n * Get the currently active isolation scope.\n * The isolation scope is active for the current exection context,\n * meaning that it will remain stable for the same Hub.\n */\nfunction getIsolationScope() {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentHub().getIsolationScope();\n}\n\n// eslint-disable-next-line deprecation/deprecation\nfunction getGlobalHub(registry = getMainCarrier()) {\n // If there's no hub, or its an old API, assign a new one\n\n if (\n !hasHubOnCarrier(registry) ||\n // eslint-disable-next-line deprecation/deprecation\n getHubFromCarrier(registry).isOlderThan(API_VERSION)\n ) {\n // eslint-disable-next-line deprecation/deprecation\n setHubOnCarrier(registry, new Hub());\n }\n\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n}\n\n/**\n * @private Private API with no semver guarantees!\n *\n * If the carrier does not contain a hub, a new hub is created with the global hub client and scope.\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction ensureHubOnCarrier(carrier, parent = getGlobalHub()) {\n // If there's no hub on current domain, or it's an old API, assign a new one\n if (\n !hasHubOnCarrier(carrier) ||\n // eslint-disable-next-line deprecation/deprecation\n getHubFromCarrier(carrier).isOlderThan(API_VERSION)\n ) {\n // eslint-disable-next-line deprecation/deprecation\n const client = parent.getClient();\n // eslint-disable-next-line deprecation/deprecation\n const scope = parent.getScope();\n // eslint-disable-next-line deprecation/deprecation\n const isolationScope = parent.getIsolationScope();\n // eslint-disable-next-line deprecation/deprecation\n setHubOnCarrier(carrier, new Hub(client, scope.clone(), isolationScope.clone()));\n }\n}\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nfunction setAsyncContextStrategy(strategy) {\n // Get main carrier (global for every environment)\n const registry = getMainCarrier();\n registry.__SENTRY__ = registry.__SENTRY__ || {};\n registry.__SENTRY__.acs = strategy;\n}\n\n/**\n * Runs the supplied callback in its own async context. Async Context strategies are defined per SDK.\n *\n * @param callback The callback to run in its own async context\n * @param options Options to pass to the async context strategy\n * @returns The result of the callback\n */\nfunction runWithAsyncContext(callback, options = {}) {\n const registry = getMainCarrier();\n\n if (registry.__SENTRY__ && registry.__SENTRY__.acs) {\n return registry.__SENTRY__.acs.runWithAsyncContext(callback, options);\n }\n\n // if there was no strategy, fallback to just calling the callback\n return callback();\n}\n\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\n}\n\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction getHubFromCarrier(carrier) {\n // eslint-disable-next-line deprecation/deprecation\n return getGlobalSingleton('hub', () => new Hub(), carrier);\n}\n\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n * @returns A boolean indicating success or failure\n */\n// eslint-disable-next-line deprecation/deprecation\nfunction setHubOnCarrier(carrier, hub) {\n if (!carrier) return false;\n const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n __SENTRY__.hub = hub;\n return true;\n}\n\nexport { API_VERSION, Hub, ensureHubOnCarrier, getCurrentHub, getHubFromCarrier, getIsolationScope, getMainCarrier, makeMain, runWithAsyncContext, setAsyncContextStrategy, setHubOnCarrier };\n//# sourceMappingURL=hub.js.map\n","import { getClient } from '../exports.js';\n\n// Treeshakable guard to remove all code related to tracing\n\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\nfunction hasTracingEnabled(\n maybeOptions,\n) {\n if (typeof __SENTRY_TRACING__ === 'boolean' && !__SENTRY_TRACING__) {\n return false;\n }\n\n const client = getClient();\n const options = maybeOptions || (client && client.getOptions());\n return !!options && (options.enableTracing || 'tracesSampleRate' in options || 'tracesSampler' in options);\n}\n\nexport { hasTracingEnabled };\n//# sourceMappingURL=hasTracingEnabled.js.map\n","import { tracingContextFromHeaders, logger, dropUndefinedKeys, addNonEnumerableProperty } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../debug-build.js';\nimport { getCurrentHub, runWithAsyncContext, getIsolationScope } from '../hub.js';\nimport { spanToJSON, spanIsSampled, spanTimeInputToSeconds } from '../utils/spanUtils.js';\nimport './errors.js';\nimport './spanstatus.js';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext.js';\nimport { getCurrentScope, withScope } from '../exports.js';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors.js';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled.js';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n *\n * Note that if you have not enabled tracing extensions via `addTracingExtensions`\n * or you didn't set `tracesSampleRate`, this function will not generate spans\n * and the `span` returned from the callback will be undefined.\n *\n * This function is meant to be used internally and may break at any time. Use at your own risk.\n *\n * @internal\n * @private\n *\n * @deprecated Use `startSpan` instead.\n */\nfunction trace(\n context,\n callback,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n onError = () => {},\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n afterFinish = () => {},\n) {\n // eslint-disable-next-line deprecation/deprecation\n const hub = getCurrentHub();\n const scope = getCurrentScope();\n // eslint-disable-next-line deprecation/deprecation\n const parentSpan = scope.getSpan();\n\n const spanContext = normalizeContext(context);\n const activeSpan = createChildSpanOrTransaction(hub, {\n parentSpan,\n spanContext,\n forceTransaction: false,\n scope,\n });\n\n // eslint-disable-next-line deprecation/deprecation\n scope.setSpan(activeSpan);\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n error => {\n activeSpan && activeSpan.setStatus('internal_error');\n onError(error, activeSpan);\n },\n () => {\n activeSpan && activeSpan.end();\n // eslint-disable-next-line deprecation/deprecation\n scope.setSpan(parentSpan);\n afterFinish();\n },\n );\n}\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * Note that if you have not enabled tracing extensions via `addTracingExtensions`\n * or you didn't set `tracesSampleRate`, this function will not generate spans\n * and the `span` returned from the callback will be undefined.\n */\nfunction startSpan(context, callback) {\n const spanContext = normalizeContext(context);\n\n return runWithAsyncContext(() => {\n return withScope(context.scope, scope => {\n // eslint-disable-next-line deprecation/deprecation\n const hub = getCurrentHub();\n // eslint-disable-next-line deprecation/deprecation\n const parentSpan = scope.getSpan();\n\n const shouldSkipSpan = context.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? undefined\n : createChildSpanOrTransaction(hub, {\n parentSpan,\n spanContext,\n forceTransaction: context.forceTransaction,\n scope,\n });\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet\n if (activeSpan) {\n const { status } = spanToJSON(activeSpan);\n if (!status || status === 'ok') {\n activeSpan.setStatus('internal_error');\n }\n }\n },\n () => activeSpan && activeSpan.end(),\n );\n });\n });\n}\n\n/**\n * @deprecated Use {@link startSpan} instead.\n */\nconst startActiveSpan = startSpan;\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. You'll have to call `span.end()` manually.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * Note that if you have not enabled tracing extensions via `addTracingExtensions`\n * or you didn't set `tracesSampleRate`, this function will not generate spans\n * and the `span` returned from the callback will be undefined.\n */\nfunction startSpanManual(\n context,\n callback,\n) {\n const spanContext = normalizeContext(context);\n\n return runWithAsyncContext(() => {\n return withScope(context.scope, scope => {\n // eslint-disable-next-line deprecation/deprecation\n const hub = getCurrentHub();\n // eslint-disable-next-line deprecation/deprecation\n const parentSpan = scope.getSpan();\n\n const shouldSkipSpan = context.onlyIfParent && !parentSpan;\n const activeSpan = shouldSkipSpan\n ? undefined\n : createChildSpanOrTransaction(hub, {\n parentSpan,\n spanContext,\n forceTransaction: context.forceTransaction,\n scope,\n });\n\n function finishAndSetSpan() {\n activeSpan && activeSpan.end();\n }\n\n return handleCallbackErrors(\n () => callback(activeSpan, finishAndSetSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n if (activeSpan && activeSpan.isRecording()) {\n const { status } = spanToJSON(activeSpan);\n if (!status || status === 'ok') {\n activeSpan.setStatus('internal_error');\n }\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * Note that if you have not enabled tracing extensions via `addTracingExtensions`\n * or you didn't set `tracesSampleRate` or `tracesSampler`, this function will not generate spans\n * and the `span` returned from the callback will be undefined.\n */\nfunction startInactiveSpan(context) {\n if (!hasTracingEnabled()) {\n return undefined;\n }\n\n const spanContext = normalizeContext(context);\n // eslint-disable-next-line deprecation/deprecation\n const hub = getCurrentHub();\n const parentSpan = context.scope\n ? // eslint-disable-next-line deprecation/deprecation\n context.scope.getSpan()\n : getActiveSpan();\n\n const shouldSkipSpan = context.onlyIfParent && !parentSpan;\n\n if (shouldSkipSpan) {\n return undefined;\n }\n\n const scope = context.scope || getCurrentScope();\n\n // Even though we don't actually want to make this span active on the current scope,\n // we need to make it active on a temporary scope that we use for event processing\n // as otherwise, it won't pick the correct span for the event when processing it\n const temporaryScope = (scope ).clone();\n\n return createChildSpanOrTransaction(hub, {\n parentSpan,\n spanContext,\n forceTransaction: context.forceTransaction,\n scope: temporaryScope,\n });\n}\n\n/**\n * Returns the currently active span.\n */\nfunction getActiveSpan() {\n // eslint-disable-next-line deprecation/deprecation\n return getCurrentScope().getSpan();\n}\n\nconst continueTrace = (\n {\n sentryTrace,\n baggage,\n }\n\n,\n callback,\n) => {\n // TODO(v8): Change this function so it doesn't do anything besides setting the propagation context on the current scope:\n /*\n return withScope((scope) => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n return callback();\n })\n */\n\n const currentScope = getCurrentScope();\n\n // eslint-disable-next-line deprecation/deprecation\n const { traceparentData, dynamicSamplingContext, propagationContext } = tracingContextFromHeaders(\n sentryTrace,\n baggage,\n );\n\n currentScope.setPropagationContext(propagationContext);\n\n if (DEBUG_BUILD && traceparentData) {\n logger.log(`[Tracing] Continuing trace ${traceparentData.traceId}.`);\n }\n\n const transactionContext = {\n ...traceparentData,\n metadata: dropUndefinedKeys({\n dynamicSamplingContext,\n }),\n };\n\n if (!callback) {\n return transactionContext;\n }\n\n return runWithAsyncContext(() => {\n return callback(transactionContext);\n });\n};\n\nfunction createChildSpanOrTransaction(\n // eslint-disable-next-line deprecation/deprecation\n hub,\n {\n parentSpan,\n spanContext,\n forceTransaction,\n scope,\n }\n\n,\n) {\n if (!hasTracingEnabled()) {\n return undefined;\n }\n\n const isolationScope = getIsolationScope();\n\n let span;\n if (parentSpan && !forceTransaction) {\n // eslint-disable-next-line deprecation/deprecation\n span = parentSpan.startChild(spanContext);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const sampled = spanIsSampled(parentSpan);\n\n // eslint-disable-next-line deprecation/deprecation\n span = hub.startTransaction({\n traceId,\n parentSpanId,\n parentSampled: sampled,\n ...spanContext,\n metadata: {\n dynamicSamplingContext: dsc,\n // eslint-disable-next-line deprecation/deprecation\n ...spanContext.metadata,\n },\n });\n } else {\n const { traceId, dsc, parentSpanId, sampled } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n // eslint-disable-next-line deprecation/deprecation\n span = hub.startTransaction({\n traceId,\n parentSpanId,\n parentSampled: sampled,\n ...spanContext,\n metadata: {\n dynamicSamplingContext: dsc,\n // eslint-disable-next-line deprecation/deprecation\n ...spanContext.metadata,\n },\n });\n }\n\n // We always set this as active span on the scope\n // In the case of this being an inactive span, we ensure to pass a detached scope in here in the first place\n // But by having this here, we can ensure that the lookup through `getCapturedScopesOnSpan` results in the correct scope & span combo\n // eslint-disable-next-line deprecation/deprecation\n scope.setSpan(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to TransactionContext.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n *\n * Eventually the StartSpanOptions will be more aligned with OpenTelemetry.\n */\nfunction normalizeContext(context) {\n if (context.startTime) {\n const ctx = { ...context };\n ctx.startTimestamp = spanTimeInputToSeconds(context.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return context;\n}\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\nfunction setCapturedScopesOnSpan(span, scope, isolationScope) {\n if (span) {\n addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, isolationScope);\n addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n */\nfunction getCapturedScopesOnSpan(span) {\n return {\n scope: (span )[SCOPE_ON_START_SPAN_FIELD],\n isolationScope: (span )[ISOLATION_SCOPE_ON_START_SPAN_FIELD],\n };\n}\n\nexport { continueTrace, getActiveSpan, getCapturedScopesOnSpan, startActiveSpan, startInactiveSpan, startSpan, startSpanManual, trace };\n//# sourceMappingURL=trace.js.map\n","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n","const REACT_RENDER_OP = 'ui.react.render';\n\nconst REACT_UPDATE_OP = 'ui.react.update';\n\nconst REACT_MOUNT_OP = 'ui.react.mount';\n\nexport { REACT_MOUNT_OP, REACT_RENDER_OP, REACT_UPDATE_OP };\n//# sourceMappingURL=constants.js.map\n","import { startInactiveSpan } from '@sentry/browser';\nimport { withActiveSpan, spanToJSON } from '@sentry/core';\nimport { timestampInSeconds } from '@sentry/utils';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport * as React from 'react';\nimport { REACT_MOUNT_OP, REACT_UPDATE_OP, REACT_RENDER_OP } from './constants.js';\n\nconst _jsxFileName = \"/home/runner/work/sentry-javascript/sentry-javascript/packages/react/src/profiler.tsx\";\nconst UNKNOWN_COMPONENT = 'unknown';\n\n/**\n * The Profiler component leverages Sentry's Tracing integration to generate\n * spans based on component lifecycles.\n */\nclass Profiler extends React.Component {\n /**\n * The span of the mount activity\n * Made protected for the React Native SDK to access\n */\n\n /**\n * The span that represents the duration of time between shouldComponentUpdate and componentDidUpdate\n */\n\n // eslint-disable-next-line @typescript-eslint/member-ordering\n static __initStatic() {this.defaultProps = {\n disabled: false,\n includeRender: true,\n includeUpdates: true,\n };}\n\n constructor(props) {\n super(props);\n const { name, disabled = false } = this.props;\n\n if (disabled) {\n return;\n }\n\n this._mountSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n attributes: { 'ui.component_name': name },\n });\n }\n\n // If a component mounted, we can finish the mount activity.\n componentDidMount() {\n if (this._mountSpan) {\n this._mountSpan.end();\n }\n }\n\n shouldComponentUpdate({ updateProps, includeUpdates = true }) {\n // Only generate an update span if includeUpdates is true, if there is a valid mountSpan,\n // and if the updateProps have changed. It is ok to not do a deep equality check here as it is expensive.\n // We are just trying to give baseline clues for further investigation.\n if (includeUpdates && this._mountSpan && updateProps !== this.props.updateProps) {\n // See what props haved changed between the previous props, and the current props. This is\n // set as data on the span. We just store the prop keys as the values could be potenially very large.\n const changedProps = Object.keys(updateProps).filter(k => updateProps[k] !== this.props.updateProps[k]);\n if (changedProps.length > 0) {\n const now = timestampInSeconds();\n this._updateSpan = withActiveSpan(this._mountSpan, () => {\n return startInactiveSpan({\n name: `<${this.props.name}>`,\n onlyIfParent: true,\n op: REACT_UPDATE_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp: now,\n attributes: {\n 'ui.component_name': this.props.name,\n 'ui.react.changed_props': changedProps,\n },\n });\n });\n }\n }\n\n return true;\n }\n\n componentDidUpdate() {\n if (this._updateSpan) {\n this._updateSpan.end();\n this._updateSpan = undefined;\n }\n }\n\n // If a component is unmounted, we can say it is no longer on the screen.\n // This means we can finish the span representing the component render.\n componentWillUnmount() {\n const endTimestamp = timestampInSeconds();\n const { name, includeRender = true } = this.props;\n\n if (this._mountSpan && includeRender) {\n const startTimestamp = spanToJSON(this._mountSpan).timestamp;\n withActiveSpan(this._mountSpan, () => {\n const renderSpan = startInactiveSpan({\n onlyIfParent: true,\n name: `<${name}>`,\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp,\n attributes: { 'ui.component_name': name },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\n });\n }\n }\n\n render() {\n return this.props.children;\n }\n} Profiler.__initStatic();\n\n/**\n * withProfiler is a higher order component that wraps a\n * component in a {@link Profiler} component. It is recommended that\n * the higher order component be used over the regular {@link Profiler} component.\n *\n * @param WrappedComponent component that is wrapped by Profiler\n * @param options the {@link ProfilerProps} you can pass into the Profiler\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction withProfiler(\n WrappedComponent,\n // We do not want to have `updateProps` given in options, it is instead filled through the HOC.\n options,\n) {\n const componentDisplayName =\n (options && options.name) || WrappedComponent.displayName || WrappedComponent.name || UNKNOWN_COMPONENT;\n\n const Wrapped = (props) => (\n React.createElement(Profiler, { ...options, name: componentDisplayName, updateProps: props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 159}}\n , React.createElement(WrappedComponent, { ...props, __self: this, __source: {fileName: _jsxFileName, lineNumber: 160}} )\n )\n );\n\n Wrapped.displayName = `profiler(${componentDisplayName})`;\n\n // Copy over static methods from Wrapped component to Profiler HOC\n // See: https://reactjs.org/docs/higher-order-components.html#static-methods-must-be-copied-over\n hoistNonReactStatics(Wrapped, WrappedComponent);\n return Wrapped;\n}\n\n/**\n *\n * `useProfiler` is a React hook that profiles a React component.\n *\n * Requires React 16.8 or above.\n * @param name displayName of component being profiled\n */\nfunction useProfiler(\n name,\n options = {\n disabled: false,\n hasRenderSpan: true,\n },\n) {\n const [mountSpan] = React.useState(() => {\n if (options && options.disabled) {\n return undefined;\n }\n\n return startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_MOUNT_OP,\n origin: 'auto.ui.react.profiler',\n attributes: { 'ui.component_name': name },\n });\n });\n\n React.useEffect(() => {\n if (mountSpan) {\n mountSpan.end();\n }\n\n return () => {\n if (mountSpan && options.hasRenderSpan) {\n const startTimestamp = spanToJSON(mountSpan).timestamp;\n const endTimestamp = timestampInSeconds();\n\n const renderSpan = startInactiveSpan({\n name: `<${name}>`,\n onlyIfParent: true,\n op: REACT_RENDER_OP,\n origin: 'auto.ui.react.profiler',\n startTimestamp,\n attributes: { 'ui.component_name': name },\n });\n if (renderSpan) {\n // Have to cast to Span because the type of _mountSpan is Span | undefined\n // and not getting narrowed properly\n renderSpan.end(endTimestamp);\n }\n }\n };\n // We only want this to run once.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport { Profiler, UNKNOWN_COMPONENT, useProfiler, withProfiler };\n//# sourceMappingURL=profiler.js.map\n","import type { QueryClient } from '@tanstack/react-query';\nimport getEnv, { setEnvs } from '@clearscore-group/lib.helpers.envs';\n\nexport const setQueryClient = (queryClient: QueryClient): void => setEnvs({ queryClient });\nexport const getQueryClient = (): QueryClient => getEnv('queryClient');\n","import type { PropsWithChildren } from 'react';\nimport './font-provider.module.css';\n\nexport const SlateFontProvider = ({ children }: PropsWithChildren) => children || null;\n","/**\n * Do not edit directly\n * Generated on Wed, 09 Oct 2024 15:20:38 GMT\n */\n\nexport const SizeBreakpointSmall = \"375px\";\nexport const SizeBreakpointMedium = \"768px\";\nexport const SizeBreakpointLarge = \"1024px\";\nexport const SizeBreakpointXlarge = \"1408px\";\n","import * as breakpoints from '@slate/foundations/dist/ts/media-queries';\n\ntype BreakpointToSize = T extends `SizeBreakpoint${infer Size}` ? Lowercase : never;\nexport type SlateBreakpoints = BreakpointToSize;\n\nexport const MAP_THEME_MODE = {\n light: 'slateLight',\n dark: 'slateDark',\n} as const;\n\nexport const MAP_THEME_BREAKPOINTS: Record = Object.fromEntries(\n Object.keys(breakpoints)\n .map((key) => [\n (key.split('Breakpoint')[1] ?? '').toLowerCase() as SlateBreakpoints,\n breakpoints[key as keyof typeof breakpoints] as string,\n ])\n .filter(([key]) => !!key),\n) as Record;\n","import type { SlateBreakpoints } from './constants';\nimport { MAP_THEME_MODE, MAP_THEME_BREAKPOINTS } from './constants';\n\n/**\n * Generate class name based on theme mode and breakpoint\n */\nexport const getClassName = (prefers: keyof typeof MAP_THEME_MODE, breakpoint?: SlateBreakpoints) => {\n if (breakpoint) return `${MAP_THEME_MODE[prefers]}_${breakpoint}`;\n return MAP_THEME_MODE[prefers];\n};\n\n/**\n * Generate CSS variable in order to selectively hide elements through the style waterfall\n */\nexport const getHiddenVariable = (prefers: keyof typeof MAP_THEME_MODE) => {\n const allModes = [\n Object.values(MAP_THEME_MODE)\n .filter((mode) => mode !== MAP_THEME_MODE[prefers])[0]\n .replace('slate', '')\n .toLowerCase(),\n prefers,\n ] as (keyof typeof MAP_THEME_MODE)[];\n\n return `${allModes.map((mode) => `--slate-display-${mode}: ${mode === prefers ? 'initial' : 'none'}`).join(';')};`;\n};\n\n/**\n * Wrap CSS theme in media queries\n */\nexport const wrapThemeInMediaQuery = (\n prefers: keyof typeof MAP_THEME_MODE,\n theme: string,\n disablePrefersColorScheme?: boolean,\n) => {\n if (typeof theme !== 'string') return '';\n const cssColorScheme = `color-scheme: ${prefers};${getHiddenVariable(prefers)}`;\n const rootBlock = theme.split(':root')[1].replace('{', `{\\n${cssColorScheme}\\n`);\n\n const stylingBlocks: string[] = [];\n\n if (prefers === 'light') stylingBlocks.push(`:root${rootBlock}`);\n if (!disablePrefersColorScheme) stylingBlocks.push(`@media (prefers-color-scheme: ${prefers}){:root${rootBlock}}`);\n\n stylingBlocks.push(`.${getClassName(prefers)}${rootBlock}`);\n Object.entries(MAP_THEME_BREAKPOINTS)\n .sort()\n .forEach(([name, breakpoint]) =>\n stylingBlocks.push(\n `@media (min-width: ${breakpoint}){.${getClassName(prefers, name as SlateBreakpoints)}${rootBlock}}`,\n ),\n );\n\n return stylingBlocks.join('\\n');\n};\n","import '@slate/foundations/dist/css/media-queries.css';\nimport './lib/reset.css';\nimport cx from 'classnames';\nimport type { PropsWithChildren } from 'react';\nimport React, { useCallback } from 'react';\n\nimport type { SlateBreakpoints, MAP_THEME_MODE } from './lib/constants';\nimport { getClassName, wrapThemeInMediaQuery } from './lib/style-helpers';\n\nexport interface SlateThemeProviderProps {\n light: string;\n dark?: string;\n disablePrefersColorScheme?: boolean;\n}\n\n/**\n * Root level theme provider that access a `@slate/foundations` theme and applies it to the document.\n *\n * This provider takes the CSS stylesheets with the CSS variables generated by the `@slate/foundations`.\n * It then transforms these stylesheets in order to apply theme switching via media queries.\n * It also adds support for SlateThemeSection components to apply theme-specific styles to components.\n *\n * @param light - The light theme to apply to the document. (Default)\n * @param dark - The dark theme to apply to the document.\n * @param disablePrefersColorScheme - Disables the automatic switching of themes based on the user's system preferences.\n */\nexport const SlateThemeProvider = ({\n children,\n light,\n dark,\n disablePrefersColorScheme,\n}: PropsWithChildren): React.ReactElement => {\n const Theme = useCallback(\n () => (\n \n {light ? : null}\n {dark ? (\n \n ) : null}\n \n ),\n [light, dark],\n );\n\n return (\n \n \n {children}\n \n );\n};\n\nexport interface SlateThemeSectionProps {\n mode?: keyof typeof MAP_THEME_MODE;\n breakpoint?: SlateBreakpoints;\n children: React.ReactElement<{ className: string }> | React.ReactElement<{ className: string }>[];\n}\n\n/**\n * Selectively force a component/section to use a specific theme.\n *\n * @param mode - The theme mode to apply to the children.\n * @param children - This should be a ReactNode that accepts a `className` property.\n * @param breakpoint - An optional breakpoint to apply the theme at.\n */\nexport const SlateThemeSection = ({ children, mode, breakpoint }: SlateThemeSectionProps) => {\n const childrenArray = React.Children.toArray(children) as React.ReactElement<{ className: string }>[];\n\n const allClassNameProps = !childrenArray.some((child) => !Object.hasOwn(child.props, 'className'));\n\n if (!allClassNameProps) {\n throw new Error('SlateThemeSection children must have a className prop', {\n cause: children,\n });\n }\n\n return React.Children.map(children, (child) =>\n React.cloneElement(child, { className: cx(child.props.className, mode && getClassName(mode, breakpoint)) }),\n );\n};\n","import { useEffect, useRef } from 'react';\n\nfunction usePrevious(value) {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n\nexport default usePrevious;\n","/* eslint-disable camelcase */\nimport { getSessionCookie } from '@clearscore-group/lib.helpers.cookies';\n\nexport const getSessionToken = () => {\n const { access_token, sessionToken } = getSessionCookie() || {};\n return access_token || sessionToken;\n};\n\nexport const getRefreshToken = () => {\n const { refresh_token } = getSessionCookie() || {};\n return refresh_token;\n};\n\nexport const getStructuredData = () => {\n const { access_token, sessionToken, refresh_token } = getSessionCookie() || {};\n return { authToken: access_token || sessionToken, refreshToken: refresh_token };\n};\n","function e(e){this.message=e}e.prototype=new Error,e.prototype.name=\"InvalidCharacterError\";var r=\"undefined\"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,\"\");if(t.length%4==1)throw new e(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var n,o,a=0,i=0,c=\"\";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(o);return c};function t(e){var t=e.replace(/-/g,\"+\").replace(/_/g,\"/\");switch(t.length%4){case 0:break;case 2:t+=\"==\";break;case 3:t+=\"=\";break;default:throw\"Illegal base64url string!\"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t=\"0\"+t),\"%\"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if(\"string\"!=typeof e)throw new n(\"Invalid token specified\");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(\".\")[o]))}catch(e){throw new n(\"Invalid token specified: \"+e.message)}}n.prototype=new Error,n.prototype.name=\"InvalidTokenError\";export default o;export{n as InvalidTokenError};\n//# sourceMappingURL=jwt-decode.esm.js.map\n","const blacklistedSearchParams = ['email', 'firstName', 'lastName', 'dob'];\n\n/* eslint-disable import/prefer-default-export */\nexport const getSanitisedUrl = () => {\n const { location } = window;\n const url = new URL(location.href);\n blacklistedSearchParams.forEach((p) => url.searchParams.delete(p));\n const search = !url.search && location.search ? '?' : url.search;\n const urlString = `${url.protocol}//${url.host}${url.pathname}${search}`;\n\n return { url: urlString, search };\n};\n","import { useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { selectors as marketSelectors } from '@clearscore-group/lib.redux.market';\nimport getDevice, { getBrowser } from '@clearscore-group/lib.helpers.device';\n\nlet _device;\nconst device = () => {\n if (!_device) {\n _device = getDevice();\n }\n\n return _device;\n};\n\n/**\n * Hook to get the default segment props that must be pulled from the redux store\n */\nconst useDefaultSegmentProps = () => {\n const market = useSelector(marketSelectors.getActiveMarket);\n const browser = getBrowser();\n return useMemo(\n () => ({\n device: device(),\n cs_site: market,\n browserName: browser.name,\n browserVersion: browser.version,\n }),\n [market, browser],\n );\n};\n\nexport default useDefaultSegmentProps;\n","import { MARKETS } from '@clearscore-group/lib.config.i18n';\nimport { getSessionCookie } from '@clearscore-group/lib.helpers.cookies';\nimport type { Market } from '@clearscore-group/lib.config.i18n';\n\nexport const getMarketFromPath = (): string | undefined => {\n const path = window.location.pathname;\n\n // we check 2 patterns: /market_name and /market_name/\n // e.g. /gb and /za/\n return MARKETS.find((market: string) => !!path.match(new RegExp(`\\\\/[\\b${market}\\\\b]{2}($|/)`, 'g')));\n};\n\nexport const getMarketFromParams = (): string | undefined => {\n const searchParams = new URLSearchParams(window.location.search);\n const marketParam = searchParams.get('market');\n return MARKETS.find((market: string) => market === marketParam);\n};\n\n/* detecting the market from session cookie, url path and market param */\nexport const getMarket = (): Market | undefined => {\n const cookie = getSessionCookie();\n\n return cookie?.market || getMarketFromPath() || getMarketFromParams();\n};\n\nconst isObject = (value: unknown) => value && typeof value === 'object' && value.constructor === Object;\n\ntype TMarketConfig = Partial>;\ntype TMarketConfigValue = T extends TMarketConfig ? T[keyof T] : never;\n\nexport const getMarketConfig = (marketConfig: T): TMarketConfigValue => {\n if (!marketConfig || !isObject(marketConfig)) {\n throw new Error('A market config object must be provided');\n }\n const market = getMarket();\n const config = market ? marketConfig[market] : null;\n if (!config) {\n throw new Error(`Config for ${market} could not be resolved`);\n }\n return config as TMarketConfigValue;\n};\n","import axios from 'axios';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport { getMarket } from '@clearscore-group/lib.helpers.market';\nimport { orchestrateAnonymousCookie } from '@clearscore-group/lib.helpers.cookies';\n\nimport { getSanitisedUrl } from './helpers';\n\nconst getBaseUrl = (clientUrl) => clientUrl.replace(/@market@/gi, getMarket?.() || 'global');\n\nexport const sendToTrackingEventReceiver = async ({ name, event, uuid, props, app }) => {\n const { url, search } = getSanitisedUrl();\n const additionalProps = event === 'page' ? { path: window.location.pathname, ...props } : props;\n\n const clientUrl = getEnv('INTERNATIONAL_API_DOMAIN') ?? '';\n\n const payload = {\n ...(event === 'track' && { event: name }),\n timestamp: new Date().toISOString(),\n userId: uuid,\n anonymousId: orchestrateAnonymousCookie(),\n type: event,\n [event === 'identify' ? 'traits' : 'properties']: additionalProps,\n context: {\n page: {\n path: window.location.pathname,\n referrer: document.referrer || 'Direct',\n search,\n title: document.title,\n url,\n },\n userAgent: window.navigator.userAgent,\n locale: window.navigator.languages?.[0] ? window.navigator.languages[0] : window.navigator.language,\n },\n };\n\n await axios\n .post('te-receiver/publish', payload, {\n baseURL: getBaseUrl(clientUrl),\n headers: { 'x-cs-site': props.cs_site, 'x-cs-app': app || getEnv('APP') },\n })\n .catch(() => {});\n};\n","import { useCallback } from 'react';\nimport monitoring from '@clearscore-group/lib.helpers.monitoring';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport { selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\nimport { getSessionToken } from '@clearscore-group/lib.helpers.session';\nimport { useSelector } from 'react-redux';\nimport jwtDecode from 'jwt-decode';\n\nimport { getSanitisedUrl } from './lib/helpers';\nimport useDefaultSegmentProps from './lib/hooks/use-default-segment-props';\nimport { sendToTrackingEventReceiver } from './lib/tracking-event-receiver';\n\n/**\n * Get the default segment props that must be generated at event send time\n */\nconst getWindowSegmentProps = () => {\n const { url } = getSanitisedUrl();\n\n return {\n location: url,\n referrer: document.referrer || 'Direct',\n };\n};\n\nexport const TRACKING_EVENT_RECEIVER_ENABLED = 'TRACKING_EVENT_RECEIVER_ENABLED';\n\nconst getUUIDFromSession = () => {\n try {\n return jwtDecode(getSessionToken())?.sub;\n } catch (e) {\n return null;\n }\n};\n\nconst useTracking = () => {\n const defaultSegmentProps = useDefaultSegmentProps();\n const { uuid: profileUuid } = useSelector(profileSelectors.getSimple);\n const uuid = !profileUuid ? getUUIDFromSession() : profileUuid;\n\n const track = useCallback(\n ({ name, props = {}, event = 'track', onComplete, app } = {}) => {\n const hasTracking = typeof window?.analytics?.track === 'function';\n\n if (!hasTracking && monitoring.hasMonitoring()) {\n monitoring.log(`Cannot send tracking event ${name} - no window.analytics available`);\n }\n\n if (\n getEnv(TRACKING_EVENT_RECEIVER_ENABLED) === 'true' ||\n getEnv(TRACKING_EVENT_RECEIVER_ENABLED) === true\n ) {\n sendToTrackingEventReceiver({\n name,\n event,\n uuid: uuid || null,\n props: {\n ...getWindowSegmentProps(),\n ...defaultSegmentProps,\n ...props,\n },\n app,\n });\n }\n\n if (!hasTracking) {\n return;\n }\n\n let hasFiredOnComplete = false;\n\n const fallbackTimeout = setTimeout(() => {\n if (onComplete && !hasFiredOnComplete) onComplete();\n }, 100);\n\n const customOnComplete = () => {\n hasFiredOnComplete = true;\n clearTimeout(fallbackTimeout);\n onComplete();\n };\n\n window.analytics[event](\n name,\n {\n ...getWindowSegmentProps(),\n ...defaultSegmentProps,\n ...props,\n },\n // analytics.js \"options\" object - not needed for us (yet!)\n {},\n // An optional function called when the analytics request completes\n onComplete ? customOnComplete : undefined,\n );\n },\n [defaultSegmentProps],\n );\n\n return track;\n};\n\nexport default useTracking;\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport usePrevious from '@clearscore-group/lib.hooks.use-previous';\n\nimport useTracking from '../use-tracking';\nimport { getSanitisedUrl } from '../lib/helpers';\n\nconst usePageTracking = ({ hasPageTracking, location: setLocation, props } = {}) => {\n const track = useTracking();\n const reactRouterLocation = useLocation();\n const location = setLocation || reactRouterLocation;\n const referrer = usePrevious(location.pathname);\n\n const { source, props: stateProps = {} } = location?.state?.tracking || {};\n\n useEffect(() => {\n if (hasPageTracking) {\n track({\n event: 'page',\n props: {\n ...getSanitisedUrl(),\n ...stateProps,\n ...props,\n referrer,\n source,\n },\n });\n }\n }, [location?.pathname]); // eslint-disable-line react-hooks/exhaustive-deps\n};\n\nexport default usePageTracking;\n","import { useCallback } from 'react';\nimport { useSelector } from 'react-redux';\nimport useTracking from '@clearscore-group/lib.hooks.use-tracking';\nimport { getCookie } from '@clearscore-group/lib.helpers.cookies';\n\nconst useScoreBand = () => useSelector((state) => state.dashboard?.data?.creditReportInfo?.scoreBand);\n\nconst useWebappTracking = () => {\n const TRACK_FBP = getCookie('_fbp');\n const TRACK_FBC = getCookie('_fbc');\n const track = useTracking();\n const scoreBand = useScoreBand();\n\n const webappTrack = useCallback(\n ({ name, props = {}, onComplete } = {}) =>\n track({\n name,\n props: {\n score_band: scoreBand,\n ...(TRACK_FBP && { fbp: TRACK_FBP }),\n ...(TRACK_FBC && { fbc: TRACK_FBC }),\n ...props,\n },\n onComplete,\n }),\n [track, scoreBand, TRACK_FBP, TRACK_FBC],\n );\n\n return webappTrack;\n};\n\nexport default useWebappTracking;\n","export const DASHBOARD_FETCH = 'CS/DASHBOARD_FETCH';\nexport const DASHBOARD_FETCH_SUCCESS = 'CS/DASHBOARD_FETCH_SUCCESS';\nexport const DASHBOARD_FETCH_ERROR = 'CS/DASHBOARD_FETCH_ERROR';\n\nexport const DASHBOARD_SERVICE_FETCH_ERROR = 'CS/DASHBOARD_SERVICE_FETCH_ERROR';\nexport const DASHBOARD_SERVICE_REPORT_NOT_FOUND_ERROR = 'CS/DASHBOARD_SERVICE_REPORT_NOT_FOUND_ERROR';\n","/* eslint-disable import/prefer-default-export */\nimport createAction from '@clearscore-group/lib.helpers.create-action';\nimport createRequestPayload from '@clearscore-group/lib.helpers.create-request-payload';\n\nimport { DASHBOARD_FETCH } from './dashboard.types';\n\n// DASHBOARD_FETCH\nexport const fetch = () =>\n createAction(DASHBOARD_FETCH, createRequestPayload('international', '/report-viewer/v2/dashboard'));\n","export const NO_FILE = 'NO_FILE';\nexport const PASS = 'PASS';\n","import * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\n\nimport { DASHBOARD_FETCH, DASHBOARD_FETCH_SUCCESS, DASHBOARD_FETCH_ERROR } from '../dashboard.types';\n\nconst initialState = {\n fetchStatus: requestStatuses.INITIAL,\n};\n\nexport default function dashboardReducer(state = initialState, action = {}) {\n const { type, payload, statusCode } = action;\n\n switch (type) {\n case DASHBOARD_FETCH:\n return {\n ...state,\n fetchStatus: requestStatuses.PENDING,\n };\n case DASHBOARD_FETCH_SUCCESS: {\n return {\n ...state,\n fetchStatus: requestStatuses.SUCCESS,\n data: payload,\n };\n }\n case DASHBOARD_FETCH_ERROR:\n return {\n ...state,\n fetchStatus: requestStatuses.ERROR,\n statusCode,\n };\n default:\n return state;\n }\n}\n","/* eslint-disable import/prefer-default-export */\nimport dashboardDomain from './dashboard.domain';\n\nexport const domain = dashboardDomain;\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getCourseSummary = (state) => resolveProp('dashboard.data.coachingSummary.courseSummary', state);\n\nexport default createSelector(getCourseSummary, (courseSummary) => ({\n courseSummary,\n}));\n","/* eslint-disable object-shorthand */\nexport const themeNames = ['alpha', 'beta', 'gamma', 'delta', 'epsilon', 'no-file'];\n\n/**\n * Simple lookup to change numeric scoreband into themes\n * @param {number} scoreband of the user\n * @return {string} theme name\n */\nexport function theme(scoreband) {\n return themeNames[scoreband] || 'default';\n}\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport { theme as themes } from '@clearscore-group/lib.constants.score-bands';\n\nimport { NO_FILE } from '../dashboard.constants';\n\nconst getScore = (state) => resolveProp('dashboard.data.creditReportInfo.score', state) || 0;\nconst getScoreMax = (state) => resolveProp('dashboard.data.creditReportInfo.scoreMaxValue', state);\nconst getScoreBand = (state) => resolveProp('dashboard.data.creditReportInfo.scoreBand', state);\nconst getTheme = (state) => {\n const accountIdvStatus = resolveProp('dashboard.data.accountIDVStatus', state);\n const scoreBand = resolveProp('dashboard.data.creditReportInfo.scoreBand', state);\n const scoreBandWithNoFile = accountIdvStatus === NO_FILE ? '5' : scoreBand;\n return themes(scoreBandWithNoFile);\n};\n\nexport default createSelector(getScore, getScoreMax, getScoreBand, getTheme, (score, scoreMax, scoreBand, theme) => ({\n score,\n scoreMax,\n scoreBand,\n theme,\n}));\n","import dashboardGetCoachingSummary from './dashboard.getCoachingSummary';\nimport dashboardGetScores from './dashboard.getScores';\nimport dashboardGetReportMeta from './dashboard.getReportMeta';\nimport dashboardGetUserStatus from './dashboard.getUserStatus';\nimport dashboardGetPredicate from './dashboard.getPredicate';\nimport dashboardGetDebt from './dashboard.getDebt';\nimport dashboardGetRawData from './dashboard.getRawData';\n\nexport const getCoachingSummary = dashboardGetCoachingSummary;\nexport const getScores = dashboardGetScores;\nexport const getReportMeta = dashboardGetReportMeta;\nexport const getUserStatus = dashboardGetUserStatus;\nexport const getPredicate = dashboardGetPredicate;\nexport const getDebt = dashboardGetDebt;\nexport const getRawData = dashboardGetRawData;\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst reportIdSelector = (state) => resolveProp('dashboard.data.creditReportInfo.clientRef', state);\nconst scoreProviderSelector = (state) => resolveProp('dashboard.data.creditReportInfo.scoreProvider', state);\nconst daysUntilNextReportSelector = (state) =>\n resolveProp('dashboard.data.creditReportInfo.daysUntilNextReport', state);\nconst changedScoreSelector = (state) => resolveProp('dashboard.data.creditReportInfo.changedScore', state);\nconst numPositiveFactorsSelector = (state) =>\n resolveProp('dashboard.data.creditReportInfo.numPositiveScoreFactors', state);\nconst numNegativeFactorsSelector = (state) =>\n resolveProp('dashboard.data.creditReportInfo.numNegativeScoreFactors', state);\n\nconst daysToNextIdentificationCheckSelector = (state) =>\n resolveProp('dashboard.data.daysToNextIdentificationCheck', state);\n\nexport default createSelector(\n reportIdSelector,\n scoreProviderSelector,\n daysUntilNextReportSelector,\n changedScoreSelector,\n numPositiveFactorsSelector,\n numNegativeFactorsSelector,\n daysToNextIdentificationCheckSelector,\n (\n reportId,\n scoreProvider,\n daysUntilNextReport,\n changedScore,\n numPositiveFactors,\n numNegativeFactors,\n daysToNextIdentificationCheck,\n ) => ({\n reportId,\n scoreProvider,\n daysUntilNextReport,\n changedScore,\n numPositiveFactors,\n numNegativeFactors,\n numFactors: numPositiveFactors + numNegativeFactors,\n daysToNextIdentificationCheck,\n }),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getDashboardStatus = (state) => resolveProp('dashboard.data.dashboardStatus', state);\nconst getAccountIdvStatus = (state) => resolveProp('dashboard.data.accountIDVStatus', state);\n\nexport default createSelector(getDashboardStatus, getAccountIdvStatus, (dashboardStatus, accountIDVStatus) => ({\n dashboardStatus,\n accountIDVStatus,\n}));\n","import { createSelector } from 'reselect';\nimport resolveRequest, { getRequestStatus } from '@clearscore-group/lib.helpers.resolve-request';\n\nconst getFetchStatus = (state) => resolveRequest(state, 'dashboard.fetchStatus');\nconst getFetchStatusCode = (state) => resolveRequest(state, 'dashboard.statusCode');\n\nexport default createSelector(getFetchStatus, getFetchStatusCode, (fetchStatus, statusCode) => ({\n fetch: getRequestStatus(fetchStatus, statusCode),\n}));\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getShortTermDebt = (state) =>\n resolveProp('dashboard.data.creditReportInfo.currentShortTermDebt.amount', state) || 0;\nconst getShortTermDebtChange = (state) =>\n resolveProp('dashboard.data.creditReportInfo.changeInShortTermDebt.amount', state) || 0;\nconst getShortTermCreditLimit = (state) =>\n resolveProp('dashboard.data.creditReportInfo.currentShortTermCreditLimit.amount', state) || 0;\nconst getLongTermDebt = (state) =>\n resolveProp('dashboard.data.creditReportInfo.currentLongTermDebt.amount', state) || 0;\nconst getLongTermDebtChange = (state) =>\n resolveProp('dashboard.data.creditReportInfo.changeInLongTermDebt.amount', state) || 0;\n\nexport default createSelector(\n getShortTermDebt,\n getShortTermDebtChange,\n getShortTermCreditLimit,\n getLongTermDebt,\n getLongTermDebtChange,\n (shortTermDebt, shortTermDebtChange, shortTermCreditLimit, longTermDebt, longTermDebtChange) => ({\n shortTermDebt,\n shortTermDebtChange,\n shortTermCreditLimit,\n longTermDebt,\n longTermDebtChange,\n }),\n);\n","import { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst getDashboardData = (state) => resolveProp('dashboard.data', state);\n\nexport default createSelector(getDashboardData, (data) => data);\n","import * as actionsImport from './dashboard.actions';\nimport * as constantsImport from './dashboard.constants';\nimport * as reducersImport from './reducers';\nimport * as selectorsImport from './selectors';\nimport * as typesImport from './dashboard.types';\n\nexport const actions = actionsImport;\nexport const constants = constantsImport;\nexport const reducers = reducersImport;\nexport const selectors = selectorsImport;\nexport const types = typesImport;\n","import { connect } from 'react-redux';\nimport { withRouter as _withRouter } from 'react-router-dom';\n\nconst withRouter = (useRouter) => (Component) => useRouter ? _withRouter(Component) : Component;\n\nexport default (mapState, mapDispatch, { mergeProps, useRouter, options } = {}) =>\n (Component) =>\n withRouter(useRouter)(connect(mapState, mapDispatch, mergeProps, options)(Component));\n","export const ROUTE_NO_MATCH_AUTH = '/';\nexport const ROUTE_NO_MATCH_PROSPECT = '/';\nexport const ROUTE_NO_MATCH_UNAUTH = '/login';\nexport const AUTHORISED = 'authorised';\nexport const PROSPECT = 'prospect';\n","import { useLayoutEffect } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nconst useScrollToTop = () => {\n const history = useHistory();\n\n useLayoutEffect(\n () =>\n history.listen(() => {\n document.body.scrollIntoView();\n }),\n [],\n );\n};\n\nexport default useScrollToTop;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { func, shape, string, node, element, oneOfType } from 'prop-types';\nimport { Route, Redirect } from 'react-router-dom';\nimport querystring from '@clearscore-group/lib.helpers.query-string';\nimport { selectors as routesSelectors } from '@clearscore-group/lib.redux.routes';\n\nimport { ROUTE_NO_MATCH_UNAUTH } from '../../lib/constants';\n\nconst getRedirectPath = (location) => {\n const { redirect } = querystring.parse(location.search);\n return redirect || ROUTE_NO_MATCH_UNAUTH;\n};\n\nconst shouldRedirectOnLogin = (location, loggedIn) => loggedIn && location.search?.indexOf('?redirect=') === 0;\n\nconst AuthRoute = ({ Component, location, path, ...rest }) => {\n const { loggedIn } = useSelector(routesSelectors.getUserRoleRoutes);\n const redirectOnLogin = shouldRedirectOnLogin(location, loggedIn);\n return (\n \n loggedIn || !redirectOnLogin ? (\n \n ) : (\n \n )\n }\n />\n );\n};\n\nAuthRoute.propTypes = {\n location: shape({\n search: string,\n pathname: string,\n }),\n path: string.isRequired,\n Component: oneOfType([node, element, func]).isRequired,\n};\n\nAuthRoute.defaultProps = {\n location: {},\n};\n\nexport default AuthRoute;\n","// matches a location pathname to a route path\n// we have to account for path parameters in the route path\n// we have to account for a possible OR pipe in the route path\n// this is why we have to use replace and regex\nconst matchPath = (pathname: string, routePath: string) => {\n const pathRegex = new RegExp(routePath.replace(/-/g, '\\\\-').replace(/\\/:([^/]+)/g, '/([^/]+)'));\n\n return pathRegex.test(pathname);\n};\n\nexport default matchPath;\n","import React from 'react';\nimport { func, string, array, shape, node, element, oneOfType } from 'prop-types';\nimport { Route, Redirect } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\nimport { selectors as sessionSelectors } from '@clearscore-group/lib.redux.session';\n\nimport { ROUTE_NO_MATCH_PROSPECT } from '../../lib/constants';\nimport matchPath from '../../lib/match-path';\n\nconst isValidProspectRoute = ({ routes, location, currentRole, accountIDVStatus, failureReason }) => {\n const failureRouteExists =\n !!failureReason && routes.find((searchRoute) => searchRoute.failureReason?.includes(failureReason));\n return !!routes.find((route) => {\n // if path and role fails, definitely wrong place\n if (!matchPath(location.pathname, route.path) || !route.role.includes(currentRole)) {\n return false;\n } else if (!route.idvStatus && !route.failureReason) {\n // if path has no guards go there\n return true;\n } else if (failureReason) {\n // failureReason, check if path is specific to failure reason, otherwise\n // if there is no matching failureRoute check idvStatus match\n return (\n route.failureReason?.includes(failureReason) ||\n (!failureRouteExists && route.idvStatus?.includes(accountIDVStatus))\n );\n }\n return route.idvStatus?.includes(accountIDVStatus);\n });\n};\n\nconst getCorrectProspectRoute = ({ routes, currentRole, accountIDVStatus, failureReason }) => {\n const [failurePath] = routes.filter(\n (route) => route.role.includes(currentRole) && route.failureReason?.includes(failureReason),\n );\n const [validPath] = routes.filter(\n (route) => route.role.includes(currentRole) && route.idvStatus?.includes(accountIDVStatus),\n );\n if (failurePath) return failurePath.path;\n return validPath ? validPath.path : ROUTE_NO_MATCH_PROSPECT;\n};\n\nconst ProspectRoute = ({ Component, routes, location, path, ...rest }) => {\n const { accountIDVStatus, failureReason } = useSelector(profileSelectors.getStatus);\n const currentRole = useSelector(sessionSelectors.getAuthRole);\n\n return (\n \n isValidProspectRoute({ routes, location, currentRole, accountIDVStatus, failureReason }) ? (\n \n ) : (\n \n )\n }\n />\n );\n};\n\nProspectRoute.propTypes = {\n routes: array,\n location: shape({\n search: string,\n pathname: string,\n }),\n path: string.isRequired,\n Component: oneOfType([node, element, func]).isRequired,\n};\n\nProspectRoute.defaultProps = {\n routes: [],\n location: {},\n};\n\nexport default ProspectRoute;\n","import React from 'react';\nimport { shape, string, array } from 'prop-types';\nimport { Redirect } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\nimport { selectors as sessionSelectors } from '@clearscore-group/lib.redux.session';\nimport { selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport querystring from '@clearscore-group/lib.helpers.query-string';\n\nimport {\n ROUTE_NO_MATCH_UNAUTH,\n ROUTE_NO_MATCH_AUTH,\n ROUTE_NO_MATCH_PROSPECT,\n AUTHORISED,\n PROSPECT,\n} from '../../lib/constants';\n\nconst getUnauthedRedirect = (location) => {\n const [NO_MATCH_UNAUTH = ROUTE_NO_MATCH_UNAUTH] = getEnv(['ROUTE_NO_MATCH_UNAUTH']);\n if (location.pathname !== '/') {\n // eslint-disable-next-line camelcase\n const { redirect, client_id, client_type, device_id, device_name, session_id, ...rest } = querystring.parse(\n location.search,\n );\n const search = querystring.stringify(rest);\n return {\n pathname: NO_MATCH_UNAUTH,\n search: `redirect=${location.pathname}${search ? `&${search}` : ''}`,\n };\n }\n return { pathname: NO_MATCH_UNAUTH };\n};\n\nconst getAuthedRedirect = (location) => {\n const [NO_MATCH_AUTH = ROUTE_NO_MATCH_AUTH] = getEnv(['ROUTE_NO_MATCH_AUTH']);\n const { redirect, ...rest } = querystring.parse(location.search);\n const search = querystring.stringify(rest);\n return {\n pathname: redirect || NO_MATCH_AUTH,\n search: search || '',\n state: location.state,\n };\n};\n\nconst getProspectRedirect = ({ routes, currentRole, accountIDVStatus, failureReason }) => {\n const [NO_MATCH_PROSPECT = ROUTE_NO_MATCH_PROSPECT] = getEnv(['ROUTE_NO_MATCH_PROSPECT']);\n const [failurePath] = routes.filter(\n (route) => route.role.includes(currentRole) && route.failureReason?.includes(failureReason),\n );\n const [validPath] = routes.filter(\n (route) => route.role.includes(currentRole) && route.idvStatus?.includes(accountIDVStatus),\n );\n if (failurePath) return { pathname: failurePath.path, search: '' };\n return { pathname: validPath ? validPath.path : NO_MATCH_PROSPECT, search: '' };\n};\n\nconst getFallThroughRedirect = ({ currentRole, location, routes, accountIDVStatus, failureReason }) => {\n switch (currentRole) {\n case AUTHORISED:\n return getAuthedRedirect(location);\n case PROSPECT:\n return getProspectRedirect({ currentRole, routes, accountIDVStatus, failureReason });\n default:\n return getUnauthedRedirect(location);\n }\n};\n\nconst NoMatchRoute = ({ location, routes }) => {\n const currentRole = useSelector(sessionSelectors.getAuthRole);\n const { accountIDVStatus, failureReason } = useSelector(profileSelectors.getStatus);\n const redirectTo = getFallThroughRedirect({ currentRole, location, routes, accountIDVStatus, failureReason });\n return ;\n};\n\nNoMatchRoute.propTypes = {\n routes: array,\n location: shape({\n search: string,\n pathname: string,\n }),\n};\n\nNoMatchRoute.defaultProps = {\n location: {},\n routes: [],\n};\n\nexport default NoMatchRoute;\n","import React from 'react';\nimport { string, func, node, element, oneOfType } from 'prop-types';\nimport { Route } from 'react-router-dom';\n\nconst UnauthRoute = ({ Component, path, ...rest }) => (\n } />\n);\n\nUnauthRoute.propTypes = {\n path: string.isRequired,\n Component: oneOfType([node, element, func]).isRequired,\n};\n\nexport default UnauthRoute;\n","'use strict';\nmodule.exports = str => encodeURIComponent(str).replace(/[!'()*]/g, x => `%${x.charCodeAt(0).toString(16).toUpperCase()}`);\n","'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn [decodeURIComponent(components.join(''))];\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher) || [];\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher) || [];\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n","'use strict';\n\nmodule.exports = (string, separator) => {\n\tif (!(typeof string === 'string' && typeof separator === 'string')) {\n\t\tthrow new TypeError('Expected the arguments to be of type `string`');\n\t}\n\n\tif (separator === '') {\n\t\treturn [string];\n\t}\n\n\tconst separatorIndex = string.indexOf(separator);\n\n\tif (separatorIndex === -1) {\n\t\treturn [string];\n\t}\n\n\treturn [\n\t\tstring.slice(0, separatorIndex),\n\t\tstring.slice(separatorIndex + separator.length)\n\t];\n};\n","'use strict';\nmodule.exports = function (obj, predicate) {\n\tvar ret = {};\n\tvar keys = Object.keys(obj);\n\tvar isArr = Array.isArray(predicate);\n\n\tfor (var i = 0; i < keys.length; i++) {\n\t\tvar key = keys[i];\n\t\tvar val = obj[key];\n\n\t\tif (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n\t\t\tret[key] = val;\n\t\t}\n\t}\n\n\treturn ret;\n};\n","'use strict';\nconst strictUriEncode = require('strict-uri-encode');\nconst decodeComponent = require('decode-uri-component');\nconst splitOnFirst = require('split-on-first');\nconst filterObject = require('filter-obj');\n\nconst isNullOrUndefined = value => value === null || value === undefined;\n\nfunction encoderForArrayFormat(options) {\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tconst index = result.length;\n\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[', index, ']'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [\n\t\t\t\t\t...result,\n\t\t\t\t\t[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')\n\t\t\t\t];\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, [encode(key, options), '[]'].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '[]=', encode(value, options)].join('')];\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (value === null || value === undefined || value.length === 0) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (result.length === 0) {\n\t\t\t\t\treturn [[encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t\t}\n\n\t\t\t\treturn [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn key => (result, value) => {\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined ||\n\t\t\t\t\t(options.skipNull && value === null) ||\n\t\t\t\t\t(options.skipEmptyString && value === '')\n\t\t\t\t) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn [...result, encode(key, options)];\n\t\t\t\t}\n\n\t\t\t\treturn [...result, [encode(key, options), '=', encode(value, options)].join('')];\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(options) {\n\tlet result;\n\n\tswitch (options.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tcase 'comma':\n\t\tcase 'separator':\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tconst isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n\t\t\t\tconst isEncodedArray = (typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator));\n\t\t\t\tvalue = isEncodedArray ? decode(value, options) : value;\n\t\t\t\tconst newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(item => decode(item, options)) : value === null ? value : decode(value, options);\n\t\t\t\taccumulator[key] = newValue;\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn (key, value, accumulator) => {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction validateArrayFormatSeparator(value) {\n\tif (typeof value !== 'string' || value.length !== 1) {\n\t\tthrow new TypeError('arrayFormatSeparator must be single character string');\n\t}\n}\n\nfunction encode(value, options) {\n\tif (options.encode) {\n\t\treturn options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction decode(value, options) {\n\tif (options.decode) {\n\t\treturn decodeComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t}\n\n\tif (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input))\n\t\t\t.sort((a, b) => Number(a) - Number(b))\n\t\t\t.map(key => input[key]);\n\t}\n\n\treturn input;\n}\n\nfunction removeHash(input) {\n\tconst hashStart = input.indexOf('#');\n\tif (hashStart !== -1) {\n\t\tinput = input.slice(0, hashStart);\n\t}\n\n\treturn input;\n}\n\nfunction getHash(url) {\n\tlet hash = '';\n\tconst hashStart = url.indexOf('#');\n\tif (hashStart !== -1) {\n\t\thash = url.slice(hashStart);\n\t}\n\n\treturn hash;\n}\n\nfunction extract(input) {\n\tinput = removeHash(input);\n\tconst queryStart = input.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\n\treturn input.slice(queryStart + 1);\n}\n\nfunction parseValue(value, options) {\n\tif (options.parseNumbers && !Number.isNaN(Number(value)) && (typeof value === 'string' && value.trim() !== '')) {\n\t\tvalue = Number(value);\n\t} else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n\t\tvalue = value.toLowerCase() === 'true';\n\t}\n\n\treturn value;\n}\n\nfunction parse(query, options) {\n\toptions = Object.assign({\n\t\tdecode: true,\n\t\tsort: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ',',\n\t\tparseNumbers: false,\n\t\tparseBooleans: false\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst formatter = parserForArrayFormat(options);\n\n\t// Create an object with no prototype\n\tconst ret = Object.create(null);\n\n\tif (typeof query !== 'string') {\n\t\treturn ret;\n\t}\n\n\tquery = query.trim().replace(/^[?#&]/, '');\n\n\tif (!query) {\n\t\treturn ret;\n\t}\n\n\tfor (const param of query.split('&')) {\n\t\tif (param === '') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet [key, value] = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '=');\n\n\t\t// Missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tvalue = value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? value : decode(value, options);\n\t\tformatter(decode(key, options), value, ret);\n\t}\n\n\tfor (const key of Object.keys(ret)) {\n\t\tconst value = ret[key];\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tvalue[k] = parseValue(value[k], options);\n\t\t\t}\n\t\t} else {\n\t\t\tret[key] = parseValue(value, options);\n\t\t}\n\t}\n\n\tif (options.sort === false) {\n\t\treturn ret;\n\t}\n\n\treturn (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce((result, key) => {\n\t\tconst value = ret[key];\n\t\tif (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(value);\n\t\t} else {\n\t\t\tresult[key] = value;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = (object, options) => {\n\tif (!object) {\n\t\treturn '';\n\t}\n\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none',\n\t\tarrayFormatSeparator: ','\n\t}, options);\n\n\tvalidateArrayFormatSeparator(options.arrayFormatSeparator);\n\n\tconst shouldFilter = key => (\n\t\t(options.skipNull && isNullOrUndefined(object[key])) ||\n\t\t(options.skipEmptyString && object[key] === '')\n\t);\n\n\tconst formatter = encoderForArrayFormat(options);\n\n\tconst objectCopy = {};\n\n\tfor (const key of Object.keys(object)) {\n\t\tif (!shouldFilter(key)) {\n\t\t\tobjectCopy[key] = object[key];\n\t\t}\n\t}\n\n\tconst keys = Object.keys(objectCopy);\n\n\tif (options.sort !== false) {\n\t\tkeys.sort(options.sort);\n\t}\n\n\treturn keys.map(key => {\n\t\tconst value = object[key];\n\n\t\tif (value === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (value === null) {\n\t\t\treturn encode(key, options);\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.reduce(formatter(key), [])\n\t\t\t\t.join('&');\n\t\t}\n\n\t\treturn encode(key, options) + '=' + encode(value, options);\n\t}).filter(x => x.length > 0).join('&');\n};\n\nexports.parseUrl = (url, options) => {\n\toptions = Object.assign({\n\t\tdecode: true\n\t}, options);\n\n\tconst [url_, hash] = splitOnFirst(url, '#');\n\n\treturn Object.assign(\n\t\t{\n\t\t\turl: url_.split('?')[0] || '',\n\t\t\tquery: parse(extract(url), options)\n\t\t},\n\t\toptions && options.parseFragmentIdentifier && hash ? {fragmentIdentifier: decode(hash, options)} : {}\n\t);\n};\n\nexports.stringifyUrl = (object, options) => {\n\toptions = Object.assign({\n\t\tencode: true,\n\t\tstrict: true\n\t}, options);\n\n\tconst url = removeHash(object.url).split('?')[0] || '';\n\tconst queryFromUrl = exports.extract(object.url);\n\tconst parsedQueryFromUrl = exports.parse(queryFromUrl, {sort: false});\n\n\tconst query = Object.assign(parsedQueryFromUrl, object.query);\n\tlet queryString = exports.stringify(query, options);\n\tif (queryString) {\n\t\tqueryString = `?${queryString}`;\n\t}\n\n\tlet hash = getHash(object.url);\n\tif (object.fragmentIdentifier) {\n\t\thash = `#${encode(object.fragmentIdentifier, options)}`;\n\t}\n\n\treturn `${url}${queryString}${hash}`;\n};\n\nexports.pick = (input, filter, options) => {\n\toptions = Object.assign({\n\t\tparseFragmentIdentifier: true\n\t}, options);\n\n\tconst {url, query, fragmentIdentifier} = exports.parseUrl(input, options);\n\treturn exports.stringifyUrl({\n\t\turl,\n\t\tquery: filterObject(query, filter),\n\t\tfragmentIdentifier\n\t}, options);\n};\n\nexports.exclude = (input, filter, options) => {\n\tconst exclusionFilter = Array.isArray(filter) ? key => !filter.includes(key) : (key, value) => !filter(key, value);\n\n\treturn exports.pick(input, exclusionFilter, options);\n};\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","import { parse } from 'query-string';\nimport { getCookie } from '@clearscore-group/lib.helpers.cookies';\nimport deepEqual from 'fast-deep-equal';\n\nconst featurePrefix = 'feature-';\n\ntype FeatureKey = `${typeof featurePrefix}${string}`;\n\ninterface ParsedQueryStringFeatures {\n [key: FeatureKey]: boolean;\n}\n\ninterface ParsedFeatures {\n [key: string]: boolean;\n}\n\nexport const parseQueryParamFeatures = (querystring: string): ParsedFeatures | undefined => {\n const features: ParsedQueryStringFeatures = parse(querystring) as unknown as ParsedQueryStringFeatures;\n const featureReducer = (parsedFeatures: ParsedFeatures, [key, value]: [FeatureKey, string]): ParsedFeatures => {\n if (key.startsWith(featurePrefix)) {\n const featureKey = key.replace(featurePrefix, '');\n // eslint-disable-next-line no-param-reassign\n parsedFeatures[featureKey] = value === 'true';\n }\n return parsedFeatures;\n };\n const parsedFeatures = Object.entries(features).reduce(\n // @ts-expect-error Object.entries has key values of string seems to be a fun Typescript bug\n featureReducer,\n {} as ParsedFeatures,\n ) as unknown as ParsedFeatures;\n\n return Object.keys(parsedFeatures).length > 0 ? parsedFeatures : undefined;\n};\n\nexport const shouldUpdateFeaturesCookieAndReload = (parsedFeatures: ParsedFeatures): boolean =>\n !deepEqual(getCookie('features'), parsedFeatures);\n","import React, { useRef, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Switch, Route, useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { usePageTracking } from '@clearscore-group/lib.hooks.use-tracking';\nimport { selectors as routesSelectors } from '@clearscore-group/lib.redux.routes';\nimport {\n actions as marketActions,\n constants as marketConstants,\n selectors as marketSelectors,\n} from '@clearscore-group/lib.redux.market';\nimport { MARKETS } from '@clearscore-group/lib.config.i18n';\nimport { selectors as sessionSelectors } from '@clearscore-group/lib.redux.session';\nimport monitoring from '@clearscore-group/lib.helpers.monitoring';\nimport { setCookie } from '@clearscore-group/lib.helpers.cookies';\n\nimport { AUTHORISED, PROSPECT } from '../lib/constants';\nimport { useCoreErrorTracking } from '../lib/hooks/use-tracking';\nimport useScrollToTop from '../lib/hooks/use-scroll-to-top';\nimport AuthRoute from './core-routes/auth-route';\nimport ProspectRoute from './core-routes/prospect-route';\nimport NoMatchRoute from './core-routes/nomatch-route';\nimport UnauthRoute from './core-routes/unauth-route';\nimport { parseQueryParamFeatures, shouldUpdateFeaturesCookieAndReload } from '../lib/feature-query-params';\n\nconst useShouldFetchMarketConfig = (currentMarket, parentDispatch) => {\n const { fetch: currentMarketFetchStatus } = useSelector(marketSelectors.getPredicate);\n const currentRouteMarket = useSelector(routesSelectors.getCurrentRouteMarket);\n\n if (\n currentMarket === currentRouteMarket ||\n currentMarketFetchStatus.isPending ||\n currentMarketFetchStatus.isComplete ||\n currentMarketFetchStatus.hasFailed\n ) {\n return;\n }\n parentDispatch(marketActions.fetchMarketConfig(currentMarket));\n};\n\nconst useGetRoutesToRender = (routes, location, isPending) => {\n const previousRoutes = useRef([]);\n const areRoutesLoaded = useSelector(routesSelectors.areRoutesLoaded);\n const isActiveMarketGlobal = useSelector(marketSelectors.getActiveMarket) === marketConstants.GLOBAL;\n const isMarketInRoute = location.pathname.split('/').some((path) => MARKETS.includes(path));\n const shouldRenderRoutes = isMarketInRoute || isActiveMarketGlobal || (areRoutesLoaded && !isPending);\n\n useEffect(() => {\n if (shouldRenderRoutes) {\n previousRoutes.current = routes;\n }\n }, [routes, shouldRenderRoutes]);\n\n const routesToRender = shouldRenderRoutes ? routes : previousRoutes.current;\n return routesToRender;\n};\n\nconst getRouteForRoleType = (roles, currentRole) => {\n const currentRoleType = roles.find((role) => role === currentRole);\n switch (currentRoleType) {\n case AUTHORISED:\n return AuthRoute;\n case PROSPECT:\n return ProspectRoute;\n default:\n return UnauthRoute;\n }\n};\n\nconst Routes = ({ parentState, templates, coreAppBridgeTypes, location, hasPageTracking }) => {\n const parentDispatch = useDispatch();\n const { routes, isPending } = useSelector(routesSelectors.getUserRoleRoutes);\n const routesToRender = useGetRoutesToRender(routes, location, isPending);\n const currentMarket = useSelector(marketSelectors.getActiveMarket);\n const currentRole = useSelector(sessionSelectors.getAuthRole);\n const parsedQueryParamFeatures = parseQueryParamFeatures(location.search);\n const history = useHistory();\n\n useShouldFetchMarketConfig(currentMarket, parentDispatch);\n useScrollToTop();\n usePageTracking({ hasPageTracking });\n useCoreErrorTracking();\n\n if (!isPending && !routesToRender.length) {\n monitoring.log('CS-37393 - White Screen No Routes');\n }\n\n if (parsedQueryParamFeatures && shouldUpdateFeaturesCookieAndReload(parsedQueryParamFeatures)) {\n setCookie('features', parsedQueryParamFeatures);\n history.go(0);\n }\n\n return (\n \n {routesToRender.map((route) => {\n const RouteComponent = getRouteForRoleType(route.role, currentRole);\n const Template = templates[route.template];\n if (!Template) {\n throw Error(\n `Core-App Template Error: You requested template ${\n route.template\n } while we only have ${Object.keys(templates)}`,\n );\n }\n return (\n \n );\n })}\n {!isPending && routesToRender.length && (\n \n \n \n )}\n \n );\n};\n\nexport default Routes;\n\nRoutes.propTypes = {\n parentState: PropTypes.object.isRequired,\n templates: PropTypes.object.isRequired,\n coreAppBridgeTypes: PropTypes.arrayOf(PropTypes.string),\n location: PropTypes.shape({\n search: PropTypes.string,\n pathname: PropTypes.string,\n }),\n hasPageTracking: PropTypes.bool,\n};\n\nRoutes.defaultProps = {\n coreAppBridgeTypes: [],\n location: {},\n hasPageTracking: false,\n};\n","import { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport usePrevious from '@clearscore-group/lib.hooks.use-previous';\nimport useWebappTracking from '@clearscore-group/lib.hooks.use-webapp-tracking';\nimport { types as dashboardTypes, selectors as dashboardSelectors } from '@clearscore-group/lib.redux.dashboard';\nimport { types as profileTypes, selectors as profileSelectors } from '@clearscore-group/lib.redux.profile';\n\nexport const useCoreErrorTracking = () => {\n const track = useWebappTracking();\n const { fetch: profileFetch } = useSelector(profileSelectors.getPredicate);\n const { fetch: dashboardFetch } = useSelector(dashboardSelectors.getPredicate);\n const { creditReportInfo } = useSelector(dashboardSelectors.getRawData) || {};\n const location = useLocation();\n const prevRoute = usePrevious(location.pathname);\n\n const trackError = (props) =>\n track({\n name: 'fe_core_error_logged',\n props: {\n path: prevRoute,\n ...props,\n },\n });\n\n useEffect(() => {\n if (profileFetch.hasFailed) {\n trackError({ failed_api_name: profileTypes.PROFILE_FETCH_ERROR });\n }\n }, [profileFetch.hasFailed]);\n\n useEffect(() => {\n if (dashboardFetch.hasFailed) {\n trackError({ failed_api_name: dashboardTypes.DASHBOARD_FETCH_ERROR });\n }\n }, [dashboardFetch.hasFailed]);\n\n useEffect(() => {\n if (dashboardFetch.isComplete && !creditReportInfo) {\n trackError({ error_message: 'report_not_found' });\n }\n }, [dashboardFetch.isComplete]);\n};\n\nconst MARKETING_CAMPAIGN_EVENT = 'fe_marketing_campaign_source';\nconst FIRST_TIME_VISIT_EVENT = 'fe_new_prospect_visited';\n\nexport const useCoreVisitTracking = () => {\n const track = useWebappTracking();\n\n return {\n onFirstTimeVisit: (userIdentity) =>\n track({\n name: FIRST_TIME_VISIT_EVENT,\n props: {\n CS_VISITED_SITE_COOKIE: userIdentity,\n },\n }),\n // eslint-disable-next-line camelcase\n onMarketingCampaignVisit: ({ utm_source, utm_medium, utm_campaign, utm_term, utm_content }) =>\n track({\n name: MARKETING_CAMPAIGN_EVENT,\n props: {\n campaign_source: utm_source,\n campaign_medium: utm_medium,\n campaign_name: utm_campaign,\n campaign_term: utm_term,\n campaign_content: utm_content,\n },\n }),\n };\n};\n","import connect from '@clearscore-group/lib.redux.connect';\n\nimport Routes from './core-router-component';\n\n/**\n * WARNING\n * Do not add a mapDispatch as its mutates the dispatch function passed\n * to the component and prevent action bridge from working\n * */\nconst CoreRouter = connect(null, null, { useRouter: true })(Routes);\n\nexport default CoreRouter;\n","/* eslint-disable */\nfunction handleFirstTab(e) {\n if (e.keyCode === 9) {\n document.body.classList.add('isKeyboardUser');\n window.removeEventListener('keydown', handleFirstTab);\n window.addEventListener('mousedown', handleMouseDownOnce);\n }\n}\n\nfunction handleMouseDownOnce() {\n document.body.classList.remove('isKeyboardUser');\n window.removeEventListener('mousedown', handleMouseDownOnce);\n window.addEventListener('keydown', handleFirstTab);\n}\n\nexport function detectKeyboardUser() {\n window.addEventListener('keydown', handleFirstTab);\n}\n","import React, { Fragment } from 'react';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\n// import { ReactQueryDevtools } from '@tanstack/react-query-devtools';\nimport PropTypes from 'prop-types';\nimport CSProvider from '@clearscore-group/lib.redux.cs-provider';\nimport Font from '@clearscore/ui.rainbow.font';\nimport initialiseTrackingCookies from '@clearscore-group/lib.helpers.initialise-tracking-cookies';\nimport { VerticalTakeoverProvider } from '@clearscore-group/ui.shared.vertical-takeover';\nimport * as Sentry from '@sentry/react';\nimport { setQueryClient } from '@clearscore-group/lib.helpers.query-client';\nimport { orchestrateAnonymousCookie } from '@clearscore-group/lib.helpers.cookies';\nimport { SlateFontProvider } from '@clearscore-group/ui.slate.utility.font-provider';\nimport { SlateThemeProvider } from '@clearscore-group/ui.slate.theme-provider';\n// TODO: Look at modernising the PostCSS Setup within ClearScore Group to further optimise the new Slate CSS\n// Ticket -> https://clearscore.atlassian.net/browse/CS-142509\nimport CS24Light from '@slate/foundations/dist/css/cs-24-light.css';\nimport CS24Dark from '@slate/foundations/dist/css/cs-24-dark.css';\n\nimport { useCoreVisitTracking } from './lib/hooks/use-tracking';\nimport Router from './core-router';\nimport { detectKeyboardUser } from './lib/a11y-outline';\n\n// NOTE: `reset` should go before any other styles, otherwise it will brake fonts\n// and you will have specificity wars.\nimport './styles/reset.module.css';\nimport './styles/index.module.css';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n retry: 0,\n },\n },\n logger: {\n log: () => {},\n warn: () => {},\n error: () => {},\n },\n});\nsetQueryClient(queryClient); // make query-client available without hooks\n\nconst CoreRouter = ({ store, storeConfig, templates, hasPageTracking }) => {\n const { onFirstTimeVisit, onMarketingCampaignVisit } = useCoreVisitTracking();\n\n initialiseTrackingCookies(store, null, { onFirstTimeVisit, onMarketingCampaignVisit });\n const parentState = store.getState();\n\n return (\n \n \n \n \n \n \n );\n};\n\nconst CoreApp = ({ storeConfig, templates, hasPageTracking }) => {\n // Enable keyboard focus highlight in browser\n detectKeyboardUser();\n\n orchestrateAnonymousCookie();\n\n return (\n \n \n {({ store }) => (\n \n \n \n )}\n \n {/* TODO: configure react query devtools*/}\n {/* */}\n \n );\n};\n\nCoreRouter.propTypes = {\n store: PropTypes.object.isRequired,\n /** @type {Object} config use to configure redux store, including reducers, initial state etc. */\n storeConfig: PropTypes.object.isRequired,\n /** @type {Object} mapping of config template string to template component */\n templates: PropTypes.object.isRequired,\n hasPageTracking: PropTypes.bool,\n};\n\nCoreRouter.defaultProps = {\n hasPageTracking: false,\n};\n\nCoreApp.propTypes = {\n /** @type {Object} config use to configure redux store, including reducers, initial state etc. */\n storeConfig: PropTypes.object.isRequired,\n /** @type {Object} mapping of config template string to template component */\n templates: PropTypes.object.isRequired,\n hasPageTracking: PropTypes.bool,\n};\n\nCoreApp.defaultProps = {\n hasPageTracking: false,\n};\n\n// https://github.com/getsentry/sentry-javascript/tree/master/packages/react\nexport default Sentry.withProfiler(CoreApp);\n","\n","export const ALERTS_SHOW_ALERT = 'CS/ALERTS_SHOW_ALERT';\nexport const ALERTS_HIDE_ALERT = 'CS/ALERTS_HIDE_ALERT';\nexport const ALERTS_PARTIAL_HIDE_ALERT = 'CS/ALERTS_PARTIAL_HIDE_ALERT';\n","import createAction from '@clearscore-group/lib.helpers.create-action';\n\nimport { ALERTS_SHOW_ALERT, ALERTS_HIDE_ALERT, ALERTS_PARTIAL_HIDE_ALERT } from '../alerts.types';\n\nexport const showAlert = (payload) => createAction(ALERTS_SHOW_ALERT, payload);\n\nexport const delayedDismissAlert = () => createAction(ALERTS_PARTIAL_HIDE_ALERT);\n\nexport const dismissAlert = () => createAction(ALERTS_HIDE_ALERT);\n","import { LOCATION_CHANGE } from 'connected-react-router';\n\nimport { ALERTS_SHOW_ALERT, ALERTS_HIDE_ALERT, ALERTS_PARTIAL_HIDE_ALERT } from '../alerts.types';\n\nexport const initialState = {\n isAlertOpen: false,\n isDismissible: true,\n isNewTab: false,\n};\n\nexport default (state = initialState, action = {}) => {\n const { type, payload } = action;\n const { isDismissible, isNewTab } = state;\n\n switch (type) {\n case ALERTS_SHOW_ALERT:\n return {\n isDismissible,\n isNewTab,\n ...payload,\n isAlertOpen: true,\n };\n\n case ALERTS_PARTIAL_HIDE_ALERT: // useful for delays/transitions\n return {\n ...state,\n ...initialState,\n };\n\n case ALERTS_HIDE_ALERT:\n return initialState;\n\n case LOCATION_CHANGE:\n if (!state.sticky) {\n return initialState;\n }\n return state;\n default:\n return state;\n }\n};\n","import alertsDomain from './alerts.domain';\n/* eslint-disable import/prefer-default-export */\nexport const domain = alertsDomain;\n","import alertsGetAlert from './alerts.getAlert';\n/* eslint-disable import/prefer-default-export */\nexport const getAlert = alertsGetAlert;\n","import { createStructuredSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\n\nconst alertId = (state) => resolveProp('alerts.alertId', state);\nconst isAlertOpen = (state) => resolveProp('alerts.isAlertOpen', state);\nconst alertType = (state) => resolveProp('alerts.alertType', state);\nconst alertContent = (state) => resolveProp('alerts.alertContent', state);\nconst alertCloseText = (state) => resolveProp('alerts.alertCloseText', state);\nconst isDismissible = (state) => resolveProp('alerts.isDismissible', state);\nconst duration = (state) => resolveProp('alerts.duration', state);\nconst href = (state) => resolveProp('alerts.href', state);\nconst ctaText = (state) => resolveProp('alerts.ctaText', state);\nconst title = (state) => resolveProp('alerts.title', state);\nconst isNewTab = (state) => resolveProp('alerts.isNewTab', state);\nconst alertCooldown = (state) => resolveProp('alerts.alertCooldown', state);\n\nexport default createStructuredSelector({\n alertId,\n isAlertOpen,\n alertType,\n alertContent,\n alertCloseText,\n isDismissible,\n duration,\n href,\n ctaText,\n title,\n isNewTab,\n alertCooldown,\n});\n","import * as actionsImport from './actions/index';\nimport * as typesImport from './alerts.types';\nimport * as reducersImport from './reducers/index';\nimport * as selectorsImport from './selectors/index';\nimport * as constantsImport from './constants';\n\nexport const actions = actionsImport;\nexport const types = typesImport;\nexport const reducers = reducersImport;\nexport const selectors = selectorsImport;\nexport const constants = constantsImport;\n","export const WARNING = 'warning';\nexport const ERROR = 'error';\nexport const SUCCESS = 'success';\nexport const ALERT_INFO = 'alert_info';\n","import { useEffect } from 'react';\n\nconst useTimeout = (callback, delay = null) => {\n useEffect(() => {\n let id;\n\n if (delay !== null) {\n id = setTimeout(callback, delay);\n }\n\n return () => clearTimeout(id);\n });\n};\n\nexport default useTimeout;\n","import { forwardRef, useEffect, useRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\n\ninterface PortalProps {\n children: React.ReactNode;\n className?: string;\n}\n\nconst Portal = (\n { children, className = 'react-portal' }: PortalProps,\n forwardedRef: React.ForwardedRef,\n) => {\n const createDomElement = () => {\n if (!canUseDom()) return null;\n\n const el = document.createElement('div');\n el.classList.add(className);\n\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(el);\n } else {\n // eslint-disable-next-line no-param-reassign\n forwardedRef.current = el;\n }\n }\n\n return el;\n };\n\n // eslint-disable-next-line react-compiler/react-compiler\n const elRef = useRef(createDomElement());\n\n useEffect(() => {\n const el = elRef.current;\n if (!el) return undefined;\n\n document.body.appendChild(el);\n return () => {\n document.body.removeChild(el);\n };\n }, [className, elRef]);\n\n // eslint-disable-next-line react-compiler/react-compiler\n return canUseDom() && elRef.current ? ReactDOM.createPortal(children, elRef.current) : null;\n};\n\nexport default forwardRef(Portal);\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\nimport canUseDom from '@clearscore-group/lib.helpers.can-use-dom';\n\nfunction getValue(mediaQueryLists, values) {\n const index = mediaQueryLists.findIndex((mql) => mql.matches);\n if (Array.isArray(values)) {\n return typeof values[index] === 'undefined' ? values[0] : values[index];\n }\n return values;\n}\n\nfunction useMedia(queries, values) {\n const isBrowser = canUseDom();\n // fall back to first query if rendering on the server as window is unavailable\n const mediaQueryLists = isBrowser ? queries.map((q) => window.matchMedia(q)) : [true];\n const [value, setValue] = useState(getValue(mediaQueryLists, values));\n\n function setState() {\n setValue(getValue(mediaQueryLists, values));\n }\n\n useEffect(() => {\n if (canUseDom()) {\n mediaQueryLists.forEach((mql) => mql.addListener(setState));\n }\n\n setState();\n return () => {\n if (canUseDom()) {\n mediaQueryLists.forEach((mql) => mql.removeListener(setState));\n }\n };\n }, [queries, values, isBrowser]);\n\n return value;\n}\n\nexport default useMedia;\n","const removeSubDomain = (url = '') => (url.split('.').length > 2 ? url.split('.').slice(1).join('.') : url);\nconst matchSubDomain = (url = '', subdomains = []) => subdomains.includes(url.split('//')[1]?.split('.')[0]);\n\n// apps which should keep focus when going to other apps, ie. `app` and `beta` on all envs.\nconst APPS = ['app', 'app-ci', 'app-stg', 'beta', 'beta-ci', 'beta-stg'];\n\nconst sameOrigin = (pathname) => {\n const { hostname } = window.location;\n const comingFromApp = matchSubDomain(`//${hostname}`, APPS);\n const goingToApp = matchSubDomain(pathname, APPS);\n const appToApp = (comingFromApp && goingToApp) || !comingFromApp;\n return removeSubDomain(pathname).includes(removeSubDomain(hostname)) && appToApp;\n};\n\n// always ensure www links start with // (i.e. learn articles)\n// if its a link on same domain, then remove http(s) so RR doesn't prefix with `/`\nconst normalisePath = (pathname) => {\n const url = pathname.startsWith('www.') ? `//${pathname}` : pathname;\n return sameOrigin(pathname) ? url.replace(/https?:/, '') : url;\n};\n\nexport default (href) => {\n const url = normalisePath(href);\n const hasFullUrl = /^(https?:\\/\\/|\\/\\/)/.test(url); // starts with 'http(s)?:' or '//'\n const isRelative = /^(\\.\\.?\\/|\\/(?!\\/)|\\?)/.test(url); // starts with './', '../', single '/', or '?'\n const isAppLink = hasFullUrl\n ? url.split('//')[1].split('/')[0].indexOf(':') > 0\n : url.split('/')[0].indexOf(':') > 0; // e.g. tel:1902 or mail:pete@clearscore.com\n const isSameOrigin = !isAppLink && sameOrigin(url);\n const isRelativeWithoutSlash = !hasFullUrl && !isAppLink; // i.e. href=\"results/details\"\n return url && (isSameOrigin || isRelative || isRelativeWithoutSlash);\n};\n","/* eslint-disable import/prefer-default-export */\nexport const themes = {\n LIGHT: 'LIGHT',\n DARK: 'DARK',\n INHERIT: 'INHERIT',\n} as const;\n","import type { ReactNode, ReactElement, MouseEventHandler } from 'react';\nimport React from 'react';\nimport cx from 'classnames';\nimport { Link as RouterLink } from 'react-router-dom';\nimport toTitleCase from '@clearscore-group/lib.normalize.title-case';\nimport isInternalUrl from '@clearscore-group/lib.helpers.is-internal-url';\n\nimport { themes } from './constants';\nimport styles from './text-link.module.css';\n\nexport interface ToProps {\n pathname?: string;\n search?: string;\n hash?: string;\n state?: object;\n}\n\ntype PathPropsTo = ToProps | string | ((location: ToProps) => ToProps);\n\ninterface PathnameProps {\n href?: string;\n to?: PathPropsTo;\n}\n\ninterface TextLinkExports {\n themes: typeof themes;\n}\n\nexport interface TextLinkProps {\n children: ReactNode;\n theme?: (typeof themes)[keyof typeof themes];\n href?: string;\n title?: string;\n ariaLabel?: string;\n isNewTab?: boolean;\n isSimpleLink?: boolean;\n to?: PathPropsTo;\n onClick?: MouseEventHandler;\n dataId?: string;\n}\n\ntype TextLink = (props: TextLinkProps) => ReactElement;\n\nconst removeSubDomain = (url: string | undefined = ''): string =>\n url.split('.').length > 2 ? url.split('.').slice(1).join('.') : url;\nconst getSubDomain = (url: string): string | undefined =>\n url.split('//').length > 1 ? url.split('.').shift() : undefined;\n\nconst sameOrigin = (pathname: string): boolean => {\n const { hostname } = window.location;\n return removeSubDomain(pathname).includes(removeSubDomain(hostname));\n};\n\nconst sameSubDomain = (pathname: string): boolean => {\n const { origin } = window.location;\n const linkSubdomain = getSubDomain(pathname);\n\n if (!linkSubdomain) return true;\n\n const originSubDomain = getSubDomain(origin);\n const pathnameSubDomain = getSubDomain(pathname);\n\n if (!originSubDomain || !pathnameSubDomain) return false;\n\n return originSubDomain.includes(pathnameSubDomain);\n};\n\n// always ensure www links start with // (i.e. learn articles)\n// if its a link on same domain, then remove http(s) so RR doesn't prefix with `/`\nconst normalisePath = (pathname: string): string => {\n const url = pathname.startsWith('www.') ? `//${pathname}` : pathname;\n return sameOrigin(pathname) ? url.replace(/https?:/, '') : url;\n};\n\nconst getPathname = ({ href, to }: PathnameProps): string => {\n if (typeof to === 'string') return to;\n if (typeof to === 'function') return getPathname({ to: to(window.location) });\n if (typeof to?.pathname === 'string') return to.pathname;\n if (typeof href === 'string') return href;\n return '';\n};\n\n// note: href is now deprecated please do not use\nconst TextLink: TextLink & TextLinkExports = ({\n children,\n theme = themes.LIGHT,\n href,\n title,\n isNewTab = false,\n onClick,\n isSimpleLink = false,\n to,\n ariaLabel,\n dataId,\n}) => {\n const link = normalisePath(getPathname({ href, to }));\n const internalLink = isInternalUrl(link);\n const newTabProps = { rel: 'noopener noreferrer', target: '_blank' };\n const reactRouterSafe = !link.startsWith('#') && sameSubDomain(link); // react-router doesn't like '#' or different sub-domains links\n const linkProps = {\n className: cx(styles.component, styles[`isTheme${toTitleCase(theme)}`], {\n [styles.isSimpleLink]: isSimpleLink,\n }),\n onClick,\n title,\n 'aria-label': ariaLabel,\n };\n\n switch (true) {\n case internalLink && reactRouterSafe:\n return (\n \n {children}\n \n );\n case !link:\n return (\n \n );\n case internalLink:\n return (\n \n {children}\n \n );\n default:\n return (\n \n {children}\n \n );\n }\n};\n\nTextLink.themes = themes;\n\nexport default TextLink;\n","import type { ReactNode, ReactElement } from 'react';\nimport React from 'react';\n\nimport styles from './text-strong.module.css';\n\nexport interface ITextStrongProps {\n children: ReactNode;\n}\n\ntype TextStrong = (props: ITextStrongProps) => ReactElement;\n\nconst TextStrong: TextStrong = ({ children }) => {children};\n\nexport default TextStrong;\n","import { mediaQuery } from '@clearscore/ui.rainbow.tokens';\n\nexport const types = {\n MICRO: 'MICRO',\n TINY: 'TINY',\n MINI: 'MINI',\n SMALL: 'SMALL',\n MEDIUM: 'MEDIUM',\n LARGE: 'LARGE',\n BIG: 'BIG',\n HUGE: 'HUGE',\n MASSIVE: 'MASSIVE',\n JUMBO: 'JUMBO',\n GARGANTUAN: 'GARGANTUAN',\n RIDICULOUS: 'RIDICULOUS',\n} as const;\n\nexport const weights = {\n THIN: 'THIN',\n LIGHT: 'LIGHT',\n BOOK: 'BOOK',\n REGULAR: 'REGULAR',\n MEDIUM: 'MEDIUM',\n BOLD: 'BOLD',\n BLACK: 'BLACK',\n} as const;\n\nexport const spacings = {\n TIGHT: 'TIGHT',\n WIDE: 'WIDE',\n EXPLODED: 'EXPLODED',\n} as const;\n\nexport const tags = {\n DIV: 'div',\n H1: 'h1',\n H2: 'h2',\n H3: 'h3',\n H4: 'h4',\n H5: 'h5',\n H6: 'h6',\n P: 'p',\n SPAN: 'span',\n LABEL: 'label',\n LEGEND: 'legend',\n} as const;\n\nexport const presets = {\n J1: {\n type: [types.GARGANTUAN, types.RIDICULOUS],\n weight: weights.THIN,\n breakpoints: [null, mediaQuery['rnb-mq-medium']],\n },\n J2: {\n type: [types.JUMBO, types.GARGANTUAN],\n weight: weights.THIN,\n breakpoints: [null, mediaQuery['rnb-mq-medium']],\n },\n J3: {\n type: [types.MASSIVE, types.JUMBO],\n weight: weights.THIN,\n breakpoints: [null, mediaQuery['rnb-mq-medium']],\n },\n J4: {\n type: [types.BIG, types.MASSIVE],\n breakpoints: [null, mediaQuery['rnb-mq-medium']],\n },\n\n H1: {\n type: [types.BIG, types.HUGE],\n tag: tags.H1,\n breakpoints: [null, mediaQuery['rnb-mq-medium']],\n },\n H2: {\n type: [types.MEDIUM, types.LARGE],\n tag: tags.H2,\n weight: weights.BOLD,\n breakpoints: [null, mediaQuery['rnb-mq-medium']],\n },\n H3: {\n type: types.SMALL,\n weight: weights.BOLD,\n tag: tags.H3,\n },\n H4: {\n type: types.MINI,\n weight: weights.BOLD,\n tag: tags.H4,\n },\n H5: {\n type: types.MINI,\n spacing: spacings.WIDE,\n tag: tags.H5,\n isUppercase: true,\n },\n H6: {\n type: types.TINY,\n weight: weights.BOLD,\n spacing: spacings.WIDE,\n tag: tags.H6,\n isUppercase: true,\n },\n\n BODY1: {\n type: types.SMALL,\n tag: tags.P,\n },\n BODY2: {\n type: types.MINI,\n tag: tags.P,\n },\n BODY3: {\n type: types.MINI,\n weight: weights.BOLD,\n tag: tags.P,\n },\n BODY4: {\n type: types.TINY,\n tag: tags.P,\n },\n BODY5: {\n type: types.TINY,\n weight: weights.BOLD,\n tag: tags.P,\n },\n BODY6: {\n type: types.MICRO,\n spacing: spacings.WIDE,\n tag: tags.P,\n },\n\n BUTTON1: {\n type: types.MINI,\n weight: weights.BOLD,\n spacing: spacings.WIDE,\n },\n BUTTON2: {\n type: types.TINY,\n weight: weights.BOLD,\n spacing: spacings.WIDE,\n },\n\n CAPTION: {\n type: types.TINY,\n spacing: spacings.WIDE,\n },\n\n OVERLINE: {\n type: types.TINY,\n spacing: spacings.EXPLODED,\n isUppercase: true,\n },\n LINK: {\n type: types.MINI,\n weight: weights.BOLD,\n },\n} as const;\n","import type { ReactElement, ReactNode, HTMLAttributes, LabelHTMLAttributes } from 'react';\nimport React from 'react';\nimport cx from 'classnames';\nimport toTitleCase from '@clearscore-group/lib.normalize.title-case';\nimport useMedia from '@clearscore-group/lib.hooks.use-media';\nimport type { mediaQuery } from '@clearscore/ui.rainbow.tokens';\n\nimport type { TextLinkProps } from './components/text-link';\nimport TextLink from './components/text-link';\nimport TextStrong from './components/text-strong';\nimport { types, weights, spacings, tags, presets } from './constants';\nimport styles from './text.module.css';\n\ntype ValueOf = T[keyof T];\n\ninterface ITextProps\n extends HTMLAttributes<\n HTMLHeadingElement | HTMLParagraphElement | HTMLDivElement | HTMLSpanElement | HTMLLegendElement\n >,\n Pick, 'htmlFor'>,\n Omit {\n children: ReactNode | ReactNode[];\n type?: readonly ValueOf[] | ValueOf;\n weight?: ValueOf;\n spacing?: ValueOf;\n tag?: ValueOf;\n breakpoints?: readonly (ValueOf | null)[];\n isItalic?: boolean;\n isUppercase?: boolean;\n isLink?: boolean;\n isSimpleLink?: boolean;\n dataId?: string;\n}\n\ninterface DisplayNameExport {\n displayName?: string;\n}\n\ntype Text = (props: ITextProps) => ReactElement;\n\nexport interface TextExports {\n types: typeof types;\n weights: typeof weights;\n spacings: typeof spacings;\n tags: typeof tags;\n presets: typeof presets;\n Link: typeof TextLink;\n Strong: typeof TextStrong;\n Link1: Text & DisplayNameExport;\n J1: Text & DisplayNameExport;\n J2: Text & DisplayNameExport;\n J3: Text & DisplayNameExport;\n J4: Text & DisplayNameExport;\n H1: Text & DisplayNameExport;\n H2: Text & DisplayNameExport;\n H3: Text & DisplayNameExport;\n H4: Text & DisplayNameExport;\n H5: Text & DisplayNameExport;\n H6: Text & DisplayNameExport;\n Body1: Text & DisplayNameExport;\n Body2: Text & DisplayNameExport;\n Body3: Text & DisplayNameExport;\n Body4: Text & DisplayNameExport;\n Body5: Text & DisplayNameExport;\n Body6: Text & DisplayNameExport;\n Button1: Text & DisplayNameExport;\n Button2: Text & DisplayNameExport;\n Caption: Text & DisplayNameExport;\n Overline: Text & DisplayNameExport;\n}\n\nconst Text: Text & TextExports = ({\n children,\n type,\n weight = weights.REGULAR,\n spacing = spacings.TIGHT,\n tag = tags.DIV,\n breakpoints = [],\n isItalic = false,\n isUppercase = false,\n isLink = false,\n isSimpleLink = false,\n dataId,\n isNewTab,\n ...wrapProps\n}) => {\n const typeValue = useMedia(breakpoints, type);\n const typeClass = styles[`isType${toTitleCase(typeValue)}`];\n const weightClass = styles[`isWeight${toTitleCase(weight)}`];\n const spacingClass = styles[`isSpacing${toTitleCase(spacing)}`];\n const isWrapped = isLink || wrapProps.href || wrapProps.to;\n const Tag = tag as React.ElementType;\n\n return (\n \n {isWrapped ? (\n \n {children}\n \n ) : (\n children\n )}\n \n );\n};\n\nText.types = types;\nText.weights = weights;\nText.spacings = spacings;\nText.tags = tags;\nText.presets = presets;\n\nText.Link = TextLink;\nText.Strong = TextStrong;\n\nText.Link1 = ({ tag, ...props }): ReactElement => ;\nText.Link1.displayName = 'Link1';\nText.J1 = ({ tag, ...props }): ReactElement => ;\nText.J1.displayName = 'J1';\nText.J2 = ({ tag, ...props }): ReactElement => ;\nText.J2.displayName = 'J2';\nText.J3 = ({ tag, ...props }): ReactElement => ;\nText.J3.displayName = 'J3';\nText.J4 = ({ tag, ...props }): ReactElement => ;\nText.J4.displayName = 'J4';\nText.H1 = ({ tag, ...props }): ReactElement => ;\nText.H1.displayName = 'H1';\nText.H2 = ({ tag, ...props }): ReactElement => ;\nText.H2.displayName = 'H2';\nText.H3 = ({ tag, ...props }): ReactElement => ;\nText.H3.displayName = 'H3';\nText.H4 = ({ tag, ...props }): ReactElement => ;\nText.H4.displayName = 'H4';\nText.H5 = ({ tag, ...props }): ReactElement => ;\nText.H5.displayName = 'H5';\nText.H6 = ({ tag, ...props }): ReactElement => ;\nText.H6.displayName = 'H6';\nText.Body1 = ({ tag, ...props }): ReactElement => ;\nText.Body1.displayName = 'Body1';\nText.Body2 = ({ tag, ...props }): ReactElement => ;\nText.Body2.displayName = 'Body2';\nText.Body3 = ({ tag, ...props }): ReactElement => ;\nText.Body3.displayName = 'Body3';\nText.Body4 = ({ tag, ...props }): ReactElement => ;\nText.Body4.displayName = 'Body4';\nText.Body5 = ({ tag, ...props }): ReactElement => ;\nText.Body5.displayName = 'Body5';\nText.Body6 = ({ tag, ...props }): ReactElement => ;\nText.Body6.displayName = 'Body6';\nText.Button1 = ({ tag, ...props }): ReactElement => ;\nText.Button1.displayName = 'Button1';\nText.Button2 = ({ tag, ...props }): ReactElement => ;\nText.Button2.displayName = 'Button2';\nText.Caption = ({ tag, ...props }): ReactElement => ;\nText.Caption.displayName = 'Caption';\nText.Overline = ({ tag, ...props }): ReactElement => ;\nText.Overline.displayName = 'Overline';\n\nexport default Text;\n","","","","","","import type { MouseEvent, ReactElement } from 'react';\nimport React from 'react';\nimport cx from 'classnames';\n\nimport styles from './icon.module.css';\n\nconst Type = {\n BUTTON: 'button',\n SUBMIT: 'submit',\n} as const;\n\nconst Tag = {\n BUTTON: 'button',\n DIV: 'div',\n} as const;\n\ninterface ClickableIconProps {\n onClick?: (event: MouseEvent) => void;\n children: ReactElement;\n name?: string;\n type?: (typeof Type)[keyof typeof Type];\n isActive?: boolean;\n isDisabled?: boolean;\n dataId?: string;\n tag?: (typeof Tag)[keyof typeof Tag];\n ariaLabel?: string;\n}\n\nexport interface ClickableIconExport {\n (props: ClickableIconProps): ReactElement;\n Type: typeof Type;\n Tag: typeof Tag;\n}\n\nconst ClickableIcon: ClickableIconExport = ({\n type = Type.BUTTON,\n name = undefined,\n onClick,\n children,\n isActive = false,\n isDisabled = false,\n dataId = undefined,\n tag = Tag.BUTTON,\n ariaLabel,\n}) => {\n if (tag === Tag.DIV) {\n return (\n \n {children}\n \n );\n }\n\n return (\n \n {children}\n \n );\n};\n\nClickableIcon.Type = Type;\nClickableIcon.Tag = Tag;\n\nexport default ClickableIcon;\n","export const types = {\n PRIMARY: 'PRIMARY',\n SECONDARY: 'SECONDARY',\n TERTIARY: 'TERTIARY',\n STICKY: 'STICKY',\n} as const;\n\nexport const sizes = {\n TINY: 'TINY',\n SMALL: 'SMALL',\n LARGE: 'LARGE',\n} as const;\n\nexport const themes = {\n LIGHT: 'LIGHT',\n DARK: 'DARK',\n INHERIT: 'INHERIT',\n CS24: 'CS24',\n} as const;\n","import type { HTMLAttributeAnchorTarget, MouseEvent, ReactElement } from 'react';\nimport React, { PureComponent } from 'react';\nimport cx from 'classnames';\nimport { Link as RouterLink } from 'react-router-dom';\nimport Loader from '@clearscore/ui.rainbow.loader';\nimport Text from '@clearscore/ui.rainbow.text';\nimport toTitleCase from '@clearscore-group/lib.normalize.title-case';\nimport type { LocationDescriptorObject } from 'history';\n\nimport { types, sizes, themes } from './constants';\nimport styles from './button.module.css';\nimport type { IButtonProps } from './types';\n\nconst getReactRouterLinkToProps = (href: string | undefined): LocationDescriptorObject => {\n if (href) {\n const [hashPathname, hash] = href.split('#');\n const [pathname, search] = hashPathname.split('?');\n return {\n pathname,\n hash,\n search,\n };\n }\n\n return {\n pathname: '',\n hash: '',\n search: '',\n };\n};\n\nexport default class Button extends PureComponent {\n // eslint-disable-next-line react/static-property-placement\n static defaultProps = {\n type: types.PRIMARY,\n size: sizes.SMALL,\n theme: themes.LIGHT,\n isWide: false,\n isNarrow: false,\n isFlat: false,\n isResponsive: false,\n isDisabled: false,\n isLoading: false,\n loadingLabel: 'loading',\n onClick: undefined,\n href: undefined,\n newTab: false,\n htmlType: 'button',\n dataId: undefined,\n routerTrackingSource: undefined,\n routerTrackingProps: undefined,\n state: undefined,\n download: false,\n };\n\n static types = types;\n static sizes = sizes;\n static themes = themes;\n\n get isDisabled(): boolean {\n const { isDisabled, isLoading } = this.props;\n return (isDisabled || isLoading) === true;\n }\n\n handleClick = (event: MouseEvent): void => {\n const { onClick } = this.props;\n\n if (!this.isDisabled && onClick) {\n onClick(event);\n }\n };\n\n get target(): HTMLAttributeAnchorTarget | undefined {\n const { href, newTab } = this.props;\n if (!href) {\n return undefined;\n }\n\n return newTab ? '_blank' : '_self';\n }\n\n get ButtonText(): ReactElement {\n const { isLoading, size, children, loadingLabel } = this.props;\n const sizeClass = styles[`isSize${toTitleCase(size)}`];\n const loaderClass: string = cx(styles.loaderWrapper, sizeClass);\n const TextButton: typeof Text.Button1 | typeof Text.Button2 =\n size === sizes.LARGE ? Text.Button1 : Text.Button2;\n\n return (\n \n {isLoading ? (\n
\n
\n {loadingLabel}\n
\n {'\\u00A0'}\n
\n ) : (\n children\n )}\n
\n );\n }\n\n render(): ReactElement {\n const {\n type,\n size,\n theme,\n isWide,\n isNarrow,\n isFlat,\n isResponsive,\n isDisabled,\n href,\n dataId,\n htmlType,\n newTab,\n routerTrackingSource,\n routerTrackingProps,\n state,\n download,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n loadingLabel, // suppressed to prevent being spread onto html\n ...props\n } = this.props;\n\n const typeClass: string = styles[`isType${toTitleCase(type)}`];\n const sizeClass: string = styles[`isSize${toTitleCase(size)}`];\n const themeClass: string = styles[`isTheme${toTitleCase(theme)}`];\n const CustomTag: 'a' | 'button' = href ? 'a' : 'button';\n const buttonProps = {\n ...props,\n className: cx(styles.button, typeClass, sizeClass, themeClass, {\n [styles.isWide]: isWide,\n [styles.isNarrow]: isNarrow,\n [styles.isFlat]: isFlat,\n [styles.isDisabled]: isDisabled,\n [styles.isResponsive]: isResponsive,\n }),\n disabled: this.isDisabled,\n onClick: this.handleClick,\n };\n /**\n * We need to remove incompatible HTML attributes,\n * from our button/anchor/link.\n */\n delete buttonProps.isLoading;\n\n const isInternalLink: boolean = (!newTab && href && !href.startsWith('http')) === true;\n if (isInternalLink && href) {\n /**\n * Checks the route and updates the UI without reloading the full page in the browser.\n */\n const getToPropValues = (): LocationDescriptorObject => {\n const toProps = getReactRouterLinkToProps(href);\n if (state && (routerTrackingSource || routerTrackingProps)) {\n return {\n ...toProps,\n state: {\n ...state,\n tracking: {\n source: routerTrackingSource,\n props: routerTrackingProps,\n },\n },\n };\n }\n\n if (state) {\n return {\n ...toProps,\n state,\n };\n }\n\n return {\n ...toProps,\n state: {\n tracking: {\n source: routerTrackingSource,\n props: routerTrackingProps,\n },\n },\n };\n };\n\n const hasState = state || routerTrackingSource || routerTrackingProps;\n const to: LocationDescriptorObject | string = hasState ? getToPropValues() : href;\n\n return (\n \n {this.ButtonText}\n \n );\n }\n\n return (\n \n {this.ButtonText}\n \n );\n }\n}\n","export const DisplayState = {\n SUCCESS: 'SUCCESS',\n INFO: 'INFO',\n INFO_WARNING: 'INFO_WARNING',\n WARNING: 'WARNING',\n ERROR: 'ERROR',\n ALERT_INFO: 'ALERT_INFO',\n} as const;\n","import type { ReactElement, ReactNode } from 'react';\nimport React, { Fragment } from 'react';\nimport cx from 'classnames';\nimport SuccessSvg from '@clearscore/rainbow.icons.status-success';\nimport InformationSvg from '@clearscore/rainbow.icons.status-info';\nimport AttentionSvg from '@clearscore/rainbow.icons.status-warning';\nimport AlertErrorSvg from '@clearscore/rainbow.icons.status-error';\nimport CloseSimple from '@clearscore/rainbow.icons.cross';\nimport ClickableIcon from '@clearscore/ui.rainbow.clickable-icon';\nimport Text from '@clearscore/ui.rainbow.text';\nimport Button from '@clearscore/ui.rainbow.button';\nimport toTitleCase from '@clearscore-group/lib.normalize.title-case';\n\nimport { DisplayState } from './constants';\nimport styles from './notification.module.css';\nimport type { INotificationBaseProps, TDisplayState } from './types';\n\ninterface INotificationProps extends INotificationBaseProps {\n href?: string;\n isNewTab?: boolean;\n children?: ReactNode;\n}\n\nexport interface INotification {\n (props: INotificationProps): ReactElement;\n DisplayState: typeof DisplayState;\n}\n\nconst NOOP = (): void => {\n // noop\n};\n\nconst getIcon = (displayState: TDisplayState): ReactElement =>\n ({\n [DisplayState.SUCCESS]: ,\n [DisplayState.INFO]: ,\n [DisplayState.INFO_WARNING]: ,\n [DisplayState.WARNING]: ,\n [DisplayState.ERROR]: ,\n [DisplayState.ALERT_INFO]: ,\n }[displayState] || );\n\nconst Notification: INotification = ({\n dataId = '',\n title = '',\n displayState = DisplayState.INFO,\n ctaText = '',\n href = '',\n ctaHandler = undefined,\n isNewTab = false,\n onDismiss = NOOP,\n isDismissible = true,\n dismissText = 'dismiss notification',\n children,\n}) => {\n const hasCtaLink = ctaText && href;\n const hasCtaButton = ctaText && !href;\n return (\n \n
{getIcon(displayState)}
\n\n
\n {title ? {title} : null}\n {children}\n
\n {hasCtaLink ? (\n
\n \n {ctaText}\n \n
\n ) : null}\n {hasCtaButton ? (\n \n ) : null}\n {isDismissible ? (\n
\n \n \n \n {dismissText}\n \n \n
\n ) : null}\n \n );\n};\n\nNotification.DisplayState = DisplayState;\n\nexport default Notification;\n","import type { ReactElement } from 'react';\nimport React, { useState, useEffect } from 'react';\nimport cx from 'classnames';\nimport useTimeout from '@clearscore-group/lib.hooks.use-timeout';\nimport Portal from '@clearscore-group/lib.helpers.portal';\nimport Text from '@clearscore/ui.rainbow.text';\n\nimport styles from './notification.controller.module.css';\nimport Notification from '../notification';\nimport type { INotificationBaseProps } from '../types';\n\ntype TTimeout = ReturnType;\ntype TNotificationController = (props: INotificationBaseProps) => ReactElement;\n\nconst NotificationController: TNotificationController = ({\n dataId = '',\n isOpen = false,\n children = null,\n duration = null,\n displayState = Notification.DisplayState.INFO,\n ctaText = '',\n ctaHandler = undefined,\n title = '',\n onDismiss = undefined,\n isDismissible = true,\n href = '',\n isNewTab = false,\n}) => {\n const [render, setRender] = useState(false);\n useEffect(() => {\n let timer: TTimeout;\n\n isOpen ? setRender(true) : (timer = setTimeout(() => setRender(false), 100));\n\n return (): void => clearTimeout(timer);\n }, [isOpen, setRender]);\n useTimeout(onDismiss, duration);\n\n return (\n \n \n {render && (\n \n {children}\n \n )}\n \n \n );\n};\n\nexport default NotificationController;\n","import React, { useEffect, useCallback } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { setAlertCookie } from '@clearscore-group/lib.helpers.cookies';\nimport { actions as alertActions, selectors as alertSelectors } from '@clearscore-group/lib.redux.alerts';\nimport { NotificationController } from '@clearscore/ui.rainbow.notification';\n\nimport useTracking from './lib/hooks/use-tracking';\n\nconst toUpper = (v) => (typeof v === 'string' ? v.toUpperCase() : v);\n\nconst AlertContainer = () => {\n const dispatch = useDispatch();\n const { trackBanner } = useTracking();\n\n const {\n isAlertOpen: isOpen,\n alertType: displayState,\n alertCloseText,\n alertContent: children,\n duration,\n ctaText = alertCloseText,\n isDismissible,\n alertId,\n href,\n title,\n isNewTab,\n alertCooldown,\n } = useSelector(alertSelectors.getAlert);\n\n const notificationControllerProps = {\n isOpen,\n // NOTE: there is mismatch in constants between rainbow and\n // rest of the system rainbow use UPPERCASE.\n displayState: toUpper(displayState),\n ctaText,\n children,\n duration,\n isDismissible,\n alertId,\n href,\n title,\n isNewTab,\n dataId: displayState,\n };\n\n const isAlertWithCooldown = alertId && alertCooldown > 0;\n\n const trackIfPossible = useCallback(\n (name) => {\n if (alertId) {\n trackBanner({ name, alertId, ctaText, href });\n }\n },\n [alertId, ctaText, href, dispatch],\n );\n\n useEffect(() => {\n if (isOpen) {\n trackIfPossible('fe_banner_viewed');\n }\n }, [isOpen, trackIfPossible, alertId, alertCooldown]);\n\n const onDismiss = () => {\n dispatch(alertActions.delayedDismissAlert());\n trackIfPossible('fe_banner_dismissed');\n\n if (isAlertWithCooldown) {\n setAlertCookie(alertId, alertCooldown);\n }\n };\n\n const ctaHandler = () => {\n dispatch(alertActions.dismissAlert());\n trackIfPossible('fe_banner_clicked');\n\n if (isAlertWithCooldown) {\n setAlertCookie(alertId, alertCooldown);\n }\n };\n\n return ;\n};\n\nexport default AlertContainer;\n","import { useLocation } from 'react-router-dom';\nimport useWebappTracking from '@clearscore-group/lib.hooks.use-webapp-tracking';\n\nexport default () => {\n const track = useWebappTracking();\n const { pathname } = useLocation();\n\n return {\n trackBanner: ({ name, alertId, ctaText, href }) =>\n track({\n name,\n props: {\n banner_id: alertId,\n cta_text: ctaText,\n destination: href,\n source: pathname,\n },\n }),\n };\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport styles from './full-width-container.module.css';\n\nconst FullWidthContainer = ({ children }) =>
{children}
;\n\nFullWidthContainer.propTypes = {\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,\n};\n\nexport default FullWidthContainer;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport connect from '@clearscore-group/lib.redux.connect';\nimport getEnv from '@clearscore-group/lib.helpers.envs';\nimport Logo from '@clearscore/rainbow.icons.clearscore-logo-wordmark';\nimport LazyLoadComponent from '@clearscore-group/lib.flux-core.lazy-load';\nimport ConnectedAlert from '@clearscore-group/ui.shared.alert';\n\nimport styles from './index.module.css';\nimport FullWidthContainer from './full-width-container';\n\nconst websiteUrl = getEnv('INTERNATIONAL_WEBSITE');\n\nconst GlobalTemplate = ({ route, parentState, dispatch, match, coreAppBridgeTypes }) => {\n const isCreditSimpleUser = window\n ? window.location.pathname.includes('signup/credit-simple') ||\n window.location.pathname.includes('signup/nz/credit-simple')\n : false;\n return (\n
\n
\n \n
\n\n
\n \n
\n {isCreditSimpleUser ? (\n
\n \n
|
\n
\n ) : null}\n \n \n \n
\n
\n
\n\n \n
\n );\n};\n\nGlobalTemplate.propTypes = {\n route: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n parentState: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n coreAppBridgeTypes: PropTypes.array.isRequired,\n};\n\nconst mapState = (state) => ({\n parentState: state,\n});\n\nexport default connect(mapState)(GlobalTemplate);\n","// Ramda v0.26.1\n// https://github.com/ramda/ramda\n// (c) 2013-2019 Scott Sauyet, Michael Hurley, and David Chambers\n// Ramda may be freely distributed under the MIT license.\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.R = {})));\n}(this, (function (exports) { 'use strict';\n\n function _cloneRegExp(pattern) {\n return new RegExp(pattern.source, (pattern.global ? 'g' : '') +\n (pattern.ignoreCase ? 'i' : '') +\n (pattern.multiline ? 'm' : '') +\n (pattern.sticky ? 'y' : '') +\n (pattern.unicode ? 'u' : ''));\n }\n\n function _isPlaceholder(a) {\n return a != null &&\n typeof a === 'object' &&\n a['@@functional/placeholder'] === true;\n }\n\n /**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n }\n\n /**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(undefined); //=> \"Undefined\"\n */\n var type = _curry1(function type(val) {\n return val === null\n ? 'Null'\n : val === undefined\n ? 'Undefined'\n : Object.prototype.toString.call(val).slice(8, -1);\n });\n\n /**\n * Copies an object.\n *\n * @private\n * @param {*} value The value to be copied\n * @param {Array} refFrom Array containing the source references\n * @param {Array} refTo Array containing the copied source references\n * @param {Boolean} deep Whether or not to perform deep cloning.\n * @return {*} The copied value.\n */\n function _clone(value, refFrom, refTo, deep) {\n var copy = function copy(copiedValue) {\n var len = refFrom.length;\n var idx = 0;\n while (idx < len) {\n if (value === refFrom[idx]) {\n return refTo[idx];\n }\n idx += 1;\n }\n refFrom[idx + 1] = value;\n refTo[idx + 1] = copiedValue;\n for (var key in value) {\n copiedValue[key] = deep ?\n _clone(value[key], refFrom, refTo, true) : value[key];\n }\n return copiedValue;\n };\n switch (type(value)) {\n case 'Object': return copy({});\n case 'Array': return copy([]);\n case 'Date': return new Date(value.valueOf());\n case 'RegExp': return _cloneRegExp(value);\n default: return value;\n }\n }\n\n /**\n * Creates a deep copy of the value which may contain (nested) `Array`s and\n * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are\n * assigned by reference rather than copied\n *\n * Dispatches to a `clone` method if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {*} -> {*}\n * @param {*} value The object or array to clone\n * @return {*} A deeply cloned copy of `val`\n * @example\n *\n * const objects = [{}, {}, {}];\n * const objectsClone = R.clone(objects);\n * objects === objectsClone; //=> false\n * objects[0] === objectsClone[0]; //=> false\n */\n var clone = _curry1(function clone(value) {\n return value != null && typeof value.clone === 'function' ?\n value.clone() :\n _clone(value, [], [], true);\n });\n\n exports.clone = clone;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","'use strict';\n\nmodule.exports = require('./clone').clone;\n","/**\n * Lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = isEqual;\n","export const SUCCESS = 'SUCCESS';\nexport const ERROR = 'ERROR';\nexport const RESET = 'RESET';\n\nexport const successType = (type) => `${type}_${SUCCESS}`;\nexport const errorType = (type) => `${type}_${ERROR}`;\nexport const resetType = (type) => `${type}_${RESET}`;\n\nexport const getTypes = (type) => ({\n pending: type,\n success: successType(type),\n error: errorType(type),\n reset: resetType(type),\n});\n","import * as requestStatuses from '@clearscore-group/lib.constants.request-statuses';\n\nimport { getTypes } from './types';\n\nexport default (TYPE) => {\n const TYPES = getTypes(TYPE);\n const initialState = {\n status: requestStatuses.INITIAL,\n };\n return (state = initialState, action = {}) => {\n const { payload = {}, type = '' } = action;\n switch (type) {\n case TYPES.pending:\n return {\n ...state,\n status: requestStatuses.PENDING,\n statusCode: undefined,\n request: action.requestData,\n meta: payload?.request?.meta,\n };\n case TYPES.success:\n return {\n ...state,\n status: requestStatuses.SUCCESS,\n data: payload?.data || payload,\n statusCode: action.statusCode,\n request: action.requestData,\n meta: action.requestMeta,\n };\n case TYPES.error:\n return {\n ...state,\n status: requestStatuses.ERROR,\n data: payload?.data || payload,\n statusCode: action.statusCode || payload?.status,\n request: action.requestData,\n meta: action.requestMeta,\n };\n case TYPES.reset:\n return {\n ...state,\n status: requestStatuses.INITIAL,\n statusCode: undefined,\n request: undefined,\n meta: undefined,\n };\n default:\n return state;\n }\n };\n};\n","/* eslint-disable guard-for-in, no-restricted-syntax */\nimport clonedeep from 'ramda.clone';\nimport isEqual from 'lodash.isequal';\n\nimport requestReducerFactory from './request-reducer';\n\nconst reducersFactory = (actionTypes) =>\n Object.keys(actionTypes).reduce(\n (prev, actionType) => ({\n ...prev,\n [actionType]: requestReducerFactory(actionTypes[actionType]),\n }),\n {},\n );\n\nconst createReducers = (actionTypes) => {\n const reducers = reducersFactory(actionTypes);\n\n const reduce = (stateValue, action) => {\n const mutatableCopy = clonedeep(stateValue);\n for (const currentReducerKey in reducers) {\n // eslint-disable-next-line no-param-reassign\n mutatableCopy[currentReducerKey] = reducers[currentReducerKey](mutatableCopy[currentReducerKey], action);\n }\n return isEqual(stateValue, mutatableCopy) ? stateValue : mutatableCopy;\n };\n return (state = {}, action = {}) => reduce(state, action);\n};\n\nexport default createReducers;\n","import createAction from '@clearscore-group/lib.helpers.create-action';\nimport { createSelector } from 'reselect';\nimport resolveRequest, { getRequestStatus } from '@clearscore-group/lib.helpers.resolve-request';\n\nimport createReducers from './reducers';\nimport { getTypes } from './types';\n\nconst snakify = (input) =>\n input\n .split(/(?=[A-Z])/)\n .join('_')\n .toUpperCase();\n\nconst createActionSelector = (moduleName, type) =>\n createSelector(\n (state) => resolveRequest(state, `${moduleName}.${type}`),\n (result) => result,\n );\nconst createStatusSelector = (moduleName, type) =>\n createSelector(createActionSelector(moduleName, type), ({ status, statusCode }) =>\n getRequestStatus(status, statusCode),\n );\n\nexport default ({ moduleName, actionCreators, customReducer }) => {\n // eslint-disable-next-line default-param-last\n const createActionType = (prev = {}, actionName) => ({\n ...prev,\n [actionName]: `CS/${snakify(moduleName)}_${snakify(actionName)}`,\n });\n const createType = (prev, actionName, actionTypes) => ({\n ...prev,\n [actionName]: getTypes(actionTypes[actionName]),\n });\n const createActions = (prev, actionName, types) => ({\n ...prev,\n [actionName]: actionCreators[actionName](types[actionName].pending),\n [`${actionName}Reset`]: (payload) => createAction(types[actionName].reset, payload),\n });\n const createSelectors = (prev, actionName) => ({\n ...prev,\n [actionName]: {\n getState: createActionSelector(moduleName, actionName),\n getStatus: createStatusSelector(moduleName, actionName),\n },\n });\n\n const { types, actions, selectors, actionTypes } = Object.keys(actionCreators).reduce((prev, actionName) => {\n const newActionTypes = createActionType(prev.actionTypes, actionName);\n const newType = createType(prev.types, actionName, newActionTypes);\n const newActions = createActions(prev.actions, actionName, newType);\n const newSelectors = createSelectors(prev.selectors, actionName);\n return {\n ...prev,\n actionTypes: newActionTypes,\n types: newType,\n actions: newActions,\n selectors: newSelectors,\n };\n }, {});\n\n return {\n reducers: {\n domain: createReducers(actionTypes, customReducer),\n },\n types,\n actionTypes,\n actions,\n selectors,\n };\n};\n","/* eslint-disable no-nested-ternary */\nimport createAction from '@clearscore-group/lib.helpers.create-action';\nimport createRequestPayload from '@clearscore-group/lib.helpers.create-request-payload';\n\nexport const fetchHasNewNotifications = (TYPE) => () =>\n createAction(TYPE, createRequestPayload('international', '/notifications/v1/notifications/hasNew'));\n\nexport const fetch = (TYPE) => () =>\n createAction(TYPE, createRequestPayload('international', '/notifications/v1/notifications'));\n\nexport const trackNotificationsClick = (TYPE) => (id, title, description, destination, rank, isSeen) =>\n createAction(TYPE, {\n context: {\n id,\n title,\n description,\n destination,\n rank: rank + 1,\n viewType: isSeen ? 'repeat_view' : 'first_view',\n },\n });\n\nexport const trackNotificationIconSeen = (TYPE) => (isBadgeShown, status) =>\n createAction(TYPE, {\n context: {\n isBadgeShown,\n status,\n },\n });\n","export default function requiredArgs(required, args) {\n if (args.length < required) {\n throw new TypeError(required + ' argument' + (required > 1 ? 's' : '') + ' required, but only ' + args.length + ' present');\n }\n}","import requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @param {Date|Number} argument - the value to convert\n * @returns {Date} the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\n\nexport default function toDate(argument) {\n requiredArgs(1, arguments);\n var argStr = Object.prototype.toString.call(argument); // Clone the date\n\n if (argument instanceof Date || typeof argument === 'object' && argStr === '[object Date]') {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new Date(argument.getTime());\n } else if (typeof argument === 'number' || argStr === '[object Number]') {\n return new Date(argument);\n } else {\n if ((typeof argument === 'string' || argStr === '[object String]') && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\"Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule\"); // eslint-disable-next-line no-console\n\n console.warn(new Error().stack);\n }\n\n return new Date(NaN);\n }\n}","var roundingMap = {\n ceil: Math.ceil,\n round: Math.round,\n floor: Math.floor,\n trunc: function (value) {\n return value < 0 ? Math.ceil(value) : Math.floor(value);\n } // Math.trunc is not supported by IE\n\n};\nvar defaultRoundingMethod = 'trunc';\nexport function getRoundingMethod(method) {\n return method ? roundingMap[method] : roundingMap[defaultRoundingMethod];\n}","import { millisecondsInHour } from \"../constants/index.js\";\nimport differenceInMilliseconds from \"../differenceInMilliseconds/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport { getRoundingMethod } from \"../_lib/roundingMethods/index.js\";\n/**\n * @name differenceInHours\n * @category Hour Helpers\n * @summary Get the number of hours between the given dates.\n *\n * @description\n * Get the number of hours between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @param {Object} [options] - an object with options.\n * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`)\n * @returns {Number} the number of hours\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00?\n * const result = differenceInHours(\n * new Date(2014, 6, 2, 19, 0),\n * new Date(2014, 6, 2, 6, 50)\n * )\n * //=> 12\n */\n\nexport default function differenceInHours(dateLeft, dateRight, options) {\n requiredArgs(2, arguments);\n var diff = differenceInMilliseconds(dateLeft, dateRight) / millisecondsInHour;\n return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff);\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of milliseconds\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\n\nexport default function differenceInMilliseconds(dateLeft, dateRight) {\n requiredArgs(2, arguments);\n return toDate(dateLeft).getTime() - toDate(dateRight).getTime();\n}","/**\n * Days in 1 week.\n *\n * @name daysInWeek\n * @constant\n * @type {number}\n * @default\n */\nexport var daysInWeek = 7;\n/**\n * Maximum allowed time.\n *\n * @name maxTime\n * @constant\n * @type {number}\n * @default\n */\n\nexport var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n/**\n * Milliseconds in 1 minute\n *\n * @name millisecondsInMinute\n * @constant\n * @type {number}\n * @default\n */\n\nexport var millisecondsInMinute = 60000;\n/**\n * Milliseconds in 1 hour\n *\n * @name millisecondsInHour\n * @constant\n * @type {number}\n * @default\n */\n\nexport var millisecondsInHour = 3600000;\n/**\n * Milliseconds in 1 second\n *\n * @name millisecondsInSecond\n * @constant\n * @type {number}\n * @default\n */\n\nexport var millisecondsInSecond = 1000;\n/**\n * Minimum allowed time.\n *\n * @name minTime\n * @constant\n * @type {number}\n * @default\n */\n\nexport var minTime = -maxTime;\n/**\n * Minutes in 1 hour\n *\n * @name minutesInHour\n * @constant\n * @type {number}\n * @default\n */\n\nexport var minutesInHour = 60;\n/**\n * Months in 1 quarter\n *\n * @name monthsInQuarter\n * @constant\n * @type {number}\n * @default\n */\n\nexport var monthsInQuarter = 3;\n/**\n * Months in 1 year\n *\n * @name monthsInYear\n * @constant\n * @type {number}\n * @default\n */\n\nexport var monthsInYear = 12;\n/**\n * Quarters in 1 year\n *\n * @name quartersInYear\n * @constant\n * @type {number}\n * @default\n */\n\nexport var quartersInYear = 4;\n/**\n * Seconds in 1 hour\n *\n * @name secondsInHour\n * @constant\n * @type {number}\n * @default\n */\n\nexport var secondsInHour = 3600;\n/**\n * Seconds in 1 minute\n *\n * @name secondsInMinute\n * @constant\n * @type {number}\n * @default\n */\n\nexport var secondsInMinute = 60;","import isDate from \"../isDate/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - Now `isValid` doesn't throw an exception\n * if the first argument is not an instance of Date.\n * Instead, argument is converted beforehand using `toDate`.\n *\n * Examples:\n *\n * | `isValid` argument | Before v2.0.0 | v2.0.0 onward |\n * |---------------------------|---------------|---------------|\n * | `new Date()` | `true` | `true` |\n * | `new Date('2016-01-01')` | `true` | `true` |\n * | `new Date('')` | `false` | `false` |\n * | `new Date(1488370835081)` | `true` | `true` |\n * | `new Date(NaN)` | `false` | `false` |\n * | `'2016-01-01'` | `TypeError` | `false` |\n * | `''` | `TypeError` | `false` |\n * | `1488370835081` | `TypeError` | `true` |\n * | `NaN` | `TypeError` | `false` |\n *\n * We introduce this change to make *date-fns* consistent with ECMAScript behavior\n * that try to coerce arguments to the expected type\n * (which is also the case with other *date-fns* functions).\n *\n * @param {*} date - the date to check\n * @returns {Boolean} the date is valid\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertable into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\n\nexport default function isValid(dirtyDate) {\n requiredArgs(1, arguments);\n\n if (!isDate(dirtyDate) && typeof dirtyDate !== 'number') {\n return false;\n }\n\n var date = toDate(dirtyDate);\n return !isNaN(Number(date));\n}","import requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {*} value - the value to check\n * @returns {boolean} true if the given value is a date\n * @throws {TypeError} 1 arguments required\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\n\nexport default function isDate(value) {\n requiredArgs(1, arguments);\n return value instanceof Date || typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]';\n}","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'less than a second',\n other: 'less than {{count}} seconds'\n },\n xSeconds: {\n one: '1 second',\n other: '{{count}} seconds'\n },\n halfAMinute: 'half a minute',\n lessThanXMinutes: {\n one: 'less than a minute',\n other: 'less than {{count}} minutes'\n },\n xMinutes: {\n one: '1 minute',\n other: '{{count}} minutes'\n },\n aboutXHours: {\n one: 'about 1 hour',\n other: 'about {{count}} hours'\n },\n xHours: {\n one: '1 hour',\n other: '{{count}} hours'\n },\n xDays: {\n one: '1 day',\n other: '{{count}} days'\n },\n aboutXWeeks: {\n one: 'about 1 week',\n other: 'about {{count}} weeks'\n },\n xWeeks: {\n one: '1 week',\n other: '{{count}} weeks'\n },\n aboutXMonths: {\n one: 'about 1 month',\n other: 'about {{count}} months'\n },\n xMonths: {\n one: '1 month',\n other: '{{count}} months'\n },\n aboutXYears: {\n one: 'about 1 year',\n other: 'about {{count}} years'\n },\n xYears: {\n one: '1 year',\n other: '{{count}} years'\n },\n overXYears: {\n one: 'over 1 year',\n other: 'over {{count}} years'\n },\n almostXYears: {\n one: 'almost 1 year',\n other: 'almost {{count}} years'\n }\n};\n\nvar formatDistance = function (token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', count.toString());\n }\n\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'in ' + result;\n } else {\n return result + ' ago';\n }\n }\n\n return result;\n};\n\nexport default formatDistance;","export default function buildFormatLongFn(args) {\n return function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // TODO: Remove String()\n var width = options.width ? String(options.width) : args.defaultWidth;\n var format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE, MMMM do, y',\n long: 'MMMM do, y',\n medium: 'MMM d, y',\n short: 'MM/dd/yyyy'\n};\nvar timeFormats = {\n full: 'h:mm:ss a zzzz',\n long: 'h:mm:ss a z',\n medium: 'h:mm:ss a',\n short: 'h:mm a'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: 'P'\n};\n\nvar formatRelative = function (token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\n\nexport default formatRelative;","export default function buildLocalizeFn(args) {\n return function (dirtyIndex, dirtyOptions) {\n var options = dirtyOptions || {};\n var context = options.context ? String(options.context) : 'standalone';\n var valuesArray;\n\n if (context === 'formatting' && args.formattingValues) {\n var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n var width = options.width ? String(options.width) : defaultWidth;\n valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n var _defaultWidth = args.defaultWidth;\n\n var _width = options.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[_width] || args.values[_defaultWidth];\n }\n\n var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; // @ts-ignore: For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n\n return valuesArray[index];\n };\n}","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['B', 'A'],\n abbreviated: ['BC', 'AD'],\n wide: ['Before Christ', 'Anno Domini']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'],\n wide: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter']\n}; // Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\n\nvar monthValues = {\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n wide: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n};\nvar dayValues = {\n narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n short: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n abbreviated: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n wide: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mi',\n noon: 'n',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mi',\n noon: 'n',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n }\n};\n\nvar ordinalNumber = function (dirtyNumber, _options) {\n var number = Number(dirtyNumber); // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n var rem100 = number % 100;\n\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + 'st';\n\n case 2:\n return number + 'nd';\n\n case 3:\n return number + 'rd';\n }\n }\n\n return number + 'th';\n};\n\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function (quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","export default function buildMatchFn(args) {\n return function (string) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var width = options.width;\n var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];\n var matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n\n var matchedString = matchResult[0];\n var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];\n var key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function (pattern) {\n return pattern.test(matchedString);\n }) : findKey(parsePatterns, function (pattern) {\n return pattern.test(matchedString);\n });\n var value;\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback ? options.valueCallback(value) : value;\n var rest = string.slice(matchedString.length);\n return {\n value: value,\n rest: rest\n };\n };\n}\n\nfunction findKey(object, predicate) {\n for (var key in object) {\n if (object.hasOwnProperty(key) && predicate(object[key])) {\n return key;\n }\n }\n\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (var key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n\n return undefined;\n}","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i\n};\nvar parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n};\nvar matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i\n};\nvar parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function (value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function (index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","export default function buildMatchPatternFn(args) {\n return function (string) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n var matchedString = matchResult[0];\n var parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];\n value = options.valueCallback ? options.valueCallback(value) : value;\n var rest = string.slice(matchedString.length);\n return {\n value: value,\n rest: rest\n };\n };\n}","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n\n/**\n * @type {Locale}\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp]{@link https://github.com/kossnocorp}\n * @author Lesha Koss [@leshakoss]{@link https://github.com/leshakoss}\n */\nvar locale = {\n code: 'en-US',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0\n /* Sunday */\n ,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","export default function toInteger(dirtyNumber) {\n if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {\n return NaN;\n }\n\n var number = Number(dirtyNumber);\n\n if (isNaN(number)) {\n return number;\n }\n\n return number < 0 ? Math.ceil(number) : Math.floor(number);\n}","import toInteger from \"../_lib/toInteger/index.js\";\nimport addMilliseconds from \"../addMilliseconds/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name subMilliseconds\n * @category Millisecond Helpers\n * @summary Subtract the specified number of milliseconds from the given date.\n *\n * @description\n * Subtract the specified number of milliseconds from the given date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of milliseconds to be subtracted. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the milliseconds subtracted\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000:\n * const result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:29.250\n */\n\nexport default function subMilliseconds(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var amount = toInteger(dirtyAmount);\n return addMilliseconds(dirtyDate, -amount);\n}","import toInteger from \"../_lib/toInteger/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name addMilliseconds\n * @category Millisecond Helpers\n * @summary Add the specified number of milliseconds to the given date.\n *\n * @description\n * Add the specified number of milliseconds to the given date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of milliseconds to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the milliseconds added\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n * const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:30.750\n */\n\nexport default function addMilliseconds(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var timestamp = toDate(dirtyDate).getTime();\n var amount = toInteger(dirtyAmount);\n return new Date(timestamp + amount);\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCISOWeek(dirtyDate) {\n requiredArgs(1, arguments);\n var weekStartsOn = 1;\n var date = toDate(dirtyDate);\n var day = date.getUTCDay();\n var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n date.setUTCDate(date.getUTCDate() - diff);\n date.setUTCHours(0, 0, 0, 0);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport startOfUTCISOWeek from \"../startOfUTCISOWeek/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCISOWeekYear(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var year = date.getUTCFullYear();\n var fourthOfJanuaryOfNextYear = new Date(0);\n fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0);\n var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear);\n var fourthOfJanuaryOfThisYear = new Date(0);\n fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0);\n var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear);\n\n if (date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}","import toDate from \"../../toDate/index.js\";\nimport startOfUTCISOWeek from \"../startOfUTCISOWeek/index.js\";\nimport startOfUTCISOWeekYear from \"../startOfUTCISOWeekYear/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nvar MILLISECONDS_IN_WEEK = 604800000; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCISOWeek(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime(); // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n\n return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;\n}","import getUTCISOWeekYear from \"../getUTCISOWeekYear/index.js\";\nimport startOfUTCISOWeek from \"../startOfUTCISOWeek/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCISOWeekYear(dirtyDate) {\n requiredArgs(1, arguments);\n var year = getUTCISOWeekYear(dirtyDate);\n var fourthOfJanuary = new Date(0);\n fourthOfJanuary.setUTCFullYear(year, 0, 4);\n fourthOfJanuary.setUTCHours(0, 0, 0, 0);\n var date = startOfUTCISOWeek(fourthOfJanuary);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport toInteger from \"../toInteger/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCWeek(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n var options = dirtyOptions || {};\n var locale = options.locale;\n var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn;\n var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n\n if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n throw new RangeError('weekStartsOn must be between 0 and 6 inclusively');\n }\n\n var date = toDate(dirtyDate);\n var day = date.getUTCDay();\n var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n date.setUTCDate(date.getUTCDate() - diff);\n date.setUTCHours(0, 0, 0, 0);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport startOfUTCWeek from \"../startOfUTCWeek/index.js\";\nimport toInteger from \"../toInteger/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCWeekYear(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var year = date.getUTCFullYear();\n var options = dirtyOptions || {};\n var locale = options.locale;\n var localeFirstWeekContainsDate = locale && locale.options && locale.options.firstWeekContainsDate;\n var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);\n var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n\n if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively');\n }\n\n var firstWeekOfNextYear = new Date(0);\n firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setUTCHours(0, 0, 0, 0);\n var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions);\n var firstWeekOfThisYear = new Date(0);\n firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setUTCHours(0, 0, 0, 0);\n var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions);\n\n if (date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}","import toDate from \"../../toDate/index.js\";\nimport startOfUTCWeek from \"../startOfUTCWeek/index.js\";\nimport startOfUTCWeekYear from \"../startOfUTCWeekYear/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nvar MILLISECONDS_IN_WEEK = 604800000; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCWeek(dirtyDate, options) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime(); // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n\n return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;\n}","import getUTCWeekYear from \"../getUTCWeekYear/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport startOfUTCWeek from \"../startOfUTCWeek/index.js\";\nimport toInteger from \"../toInteger/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCWeekYear(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n var options = dirtyOptions || {};\n var locale = options.locale;\n var localeFirstWeekContainsDate = locale && locale.options && locale.options.firstWeekContainsDate;\n var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);\n var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);\n var year = getUTCWeekYear(dirtyDate, dirtyOptions);\n var firstWeek = new Date(0);\n firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setUTCHours(0, 0, 0, 0);\n var date = startOfUTCWeek(firstWeek, dirtyOptions);\n return date;\n}","export default function addLeadingZeros(number, targetLength) {\n var sign = number < 0 ? '-' : '';\n var output = Math.abs(number).toString();\n\n while (output.length < targetLength) {\n output = '0' + output;\n }\n\n return sign + output;\n}","import addLeadingZeros from \"../../addLeadingZeros/index.js\";\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nvar formatters = {\n // Year\n y: function (date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n var signedYear = date.getUTCFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript)\n\n var year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === 'yy' ? year % 100 : year, token.length);\n },\n // Month\n M: function (date, token) {\n var month = date.getUTCMonth();\n return token === 'M' ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n // Day of the month\n d: function (date, token) {\n return addLeadingZeros(date.getUTCDate(), token.length);\n },\n // AM or PM\n a: function (date, token) {\n var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? 'pm' : 'am';\n\n switch (token) {\n case 'a':\n case 'aa':\n return dayPeriodEnumValue.toUpperCase();\n\n case 'aaa':\n return dayPeriodEnumValue;\n\n case 'aaaaa':\n return dayPeriodEnumValue[0];\n\n case 'aaaa':\n default:\n return dayPeriodEnumValue === 'am' ? 'a.m.' : 'p.m.';\n }\n },\n // Hour [1-12]\n h: function (date, token) {\n return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length);\n },\n // Hour [0-23]\n H: function (date, token) {\n return addLeadingZeros(date.getUTCHours(), token.length);\n },\n // Minute\n m: function (date, token) {\n return addLeadingZeros(date.getUTCMinutes(), token.length);\n },\n // Second\n s: function (date, token) {\n return addLeadingZeros(date.getUTCSeconds(), token.length);\n },\n // Fraction of second\n S: function (date, token) {\n var numberOfDigits = token.length;\n var milliseconds = date.getUTCMilliseconds();\n var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3));\n return addLeadingZeros(fractionalSeconds, token.length);\n }\n};\nexport default formatters;","import getUTCDayOfYear from \"../../../_lib/getUTCDayOfYear/index.js\";\nimport getUTCISOWeek from \"../../../_lib/getUTCISOWeek/index.js\";\nimport getUTCISOWeekYear from \"../../../_lib/getUTCISOWeekYear/index.js\";\nimport getUTCWeek from \"../../../_lib/getUTCWeek/index.js\";\nimport getUTCWeekYear from \"../../../_lib/getUTCWeekYear/index.js\";\nimport addLeadingZeros from \"../../addLeadingZeros/index.js\";\nimport lightFormatters from \"../lightFormatters/index.js\";\nvar dayPeriodEnum = {\n am: 'am',\n pm: 'pm',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n};\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nvar formatters = {\n // Era\n G: function (date, token, localize) {\n var era = date.getUTCFullYear() > 0 ? 1 : 0;\n\n switch (token) {\n // AD, BC\n case 'G':\n case 'GG':\n case 'GGG':\n return localize.era(era, {\n width: 'abbreviated'\n });\n // A, B\n\n case 'GGGGG':\n return localize.era(era, {\n width: 'narrow'\n });\n // Anno Domini, Before Christ\n\n case 'GGGG':\n default:\n return localize.era(era, {\n width: 'wide'\n });\n }\n },\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === 'yo') {\n var signedYear = date.getUTCFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript)\n\n var year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, {\n unit: 'year'\n });\n }\n\n return lightFormatters.y(date, token);\n },\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n var signedWeekYear = getUTCWeekYear(date, options); // Returns 1 for 1 BC (which is year 0 in JavaScript)\n\n var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear; // Two digit year\n\n if (token === 'YY') {\n var twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n } // Ordinal number\n\n\n if (token === 'Yo') {\n return localize.ordinalNumber(weekYear, {\n unit: 'year'\n });\n } // Padding\n\n\n return addLeadingZeros(weekYear, token.length);\n },\n // ISO week-numbering year\n R: function (date, token) {\n var isoWeekYear = getUTCISOWeekYear(date); // Padding\n\n return addLeadingZeros(isoWeekYear, token.length);\n },\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n var year = date.getUTCFullYear();\n return addLeadingZeros(year, token.length);\n },\n // Quarter\n Q: function (date, token, localize) {\n var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);\n\n switch (token) {\n // 1, 2, 3, 4\n case 'Q':\n return String(quarter);\n // 01, 02, 03, 04\n\n case 'QQ':\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n\n case 'Qo':\n return localize.ordinalNumber(quarter, {\n unit: 'quarter'\n });\n // Q1, Q2, Q3, Q4\n\n case 'QQQ':\n return localize.quarter(quarter, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n\n case 'QQQQQ':\n return localize.quarter(quarter, {\n width: 'narrow',\n context: 'formatting'\n });\n // 1st quarter, 2nd quarter, ...\n\n case 'QQQQ':\n default:\n return localize.quarter(quarter, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Stand-alone quarter\n q: function (date, token, localize) {\n var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);\n\n switch (token) {\n // 1, 2, 3, 4\n case 'q':\n return String(quarter);\n // 01, 02, 03, 04\n\n case 'qq':\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n\n case 'qo':\n return localize.ordinalNumber(quarter, {\n unit: 'quarter'\n });\n // Q1, Q2, Q3, Q4\n\n case 'qqq':\n return localize.quarter(quarter, {\n width: 'abbreviated',\n context: 'standalone'\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n\n case 'qqqqq':\n return localize.quarter(quarter, {\n width: 'narrow',\n context: 'standalone'\n });\n // 1st quarter, 2nd quarter, ...\n\n case 'qqqq':\n default:\n return localize.quarter(quarter, {\n width: 'wide',\n context: 'standalone'\n });\n }\n },\n // Month\n M: function (date, token, localize) {\n var month = date.getUTCMonth();\n\n switch (token) {\n case 'M':\n case 'MM':\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n\n case 'Mo':\n return localize.ordinalNumber(month + 1, {\n unit: 'month'\n });\n // Jan, Feb, ..., Dec\n\n case 'MMM':\n return localize.month(month, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // J, F, ..., D\n\n case 'MMMMM':\n return localize.month(month, {\n width: 'narrow',\n context: 'formatting'\n });\n // January, February, ..., December\n\n case 'MMMM':\n default:\n return localize.month(month, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Stand-alone month\n L: function (date, token, localize) {\n var month = date.getUTCMonth();\n\n switch (token) {\n // 1, 2, ..., 12\n case 'L':\n return String(month + 1);\n // 01, 02, ..., 12\n\n case 'LL':\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n\n case 'Lo':\n return localize.ordinalNumber(month + 1, {\n unit: 'month'\n });\n // Jan, Feb, ..., Dec\n\n case 'LLL':\n return localize.month(month, {\n width: 'abbreviated',\n context: 'standalone'\n });\n // J, F, ..., D\n\n case 'LLLLL':\n return localize.month(month, {\n width: 'narrow',\n context: 'standalone'\n });\n // January, February, ..., December\n\n case 'LLLL':\n default:\n return localize.month(month, {\n width: 'wide',\n context: 'standalone'\n });\n }\n },\n // Local week of year\n w: function (date, token, localize, options) {\n var week = getUTCWeek(date, options);\n\n if (token === 'wo') {\n return localize.ordinalNumber(week, {\n unit: 'week'\n });\n }\n\n return addLeadingZeros(week, token.length);\n },\n // ISO week of year\n I: function (date, token, localize) {\n var isoWeek = getUTCISOWeek(date);\n\n if (token === 'Io') {\n return localize.ordinalNumber(isoWeek, {\n unit: 'week'\n });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n // Day of the month\n d: function (date, token, localize) {\n if (token === 'do') {\n return localize.ordinalNumber(date.getUTCDate(), {\n unit: 'date'\n });\n }\n\n return lightFormatters.d(date, token);\n },\n // Day of year\n D: function (date, token, localize) {\n var dayOfYear = getUTCDayOfYear(date);\n\n if (token === 'Do') {\n return localize.ordinalNumber(dayOfYear, {\n unit: 'dayOfYear'\n });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n // Day of week\n E: function (date, token, localize) {\n var dayOfWeek = date.getUTCDay();\n\n switch (token) {\n // Tue\n case 'E':\n case 'EE':\n case 'EEE':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // T\n\n case 'EEEEE':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'formatting'\n });\n // Tu\n\n case 'EEEEEE':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'formatting'\n });\n // Tuesday\n\n case 'EEEE':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Local day of week\n e: function (date, token, localize, options) {\n var dayOfWeek = date.getUTCDay();\n var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case 'e':\n return String(localDayOfWeek);\n // Padded numerical value\n\n case 'ee':\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n\n case 'eo':\n return localize.ordinalNumber(localDayOfWeek, {\n unit: 'day'\n });\n\n case 'eee':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // T\n\n case 'eeeee':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'formatting'\n });\n // Tu\n\n case 'eeeeee':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'formatting'\n });\n // Tuesday\n\n case 'eeee':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n var dayOfWeek = date.getUTCDay();\n var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n\n switch (token) {\n // Numerical value (same as in `e`)\n case 'c':\n return String(localDayOfWeek);\n // Padded numerical value\n\n case 'cc':\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n\n case 'co':\n return localize.ordinalNumber(localDayOfWeek, {\n unit: 'day'\n });\n\n case 'ccc':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'standalone'\n });\n // T\n\n case 'ccccc':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'standalone'\n });\n // Tu\n\n case 'cccccc':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'standalone'\n });\n // Tuesday\n\n case 'cccc':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'standalone'\n });\n }\n },\n // ISO day of week\n i: function (date, token, localize) {\n var dayOfWeek = date.getUTCDay();\n var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n\n switch (token) {\n // 2\n case 'i':\n return String(isoDayOfWeek);\n // 02\n\n case 'ii':\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n\n case 'io':\n return localize.ordinalNumber(isoDayOfWeek, {\n unit: 'day'\n });\n // Tue\n\n case 'iii':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // T\n\n case 'iiiii':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'formatting'\n });\n // Tu\n\n case 'iiiiii':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'formatting'\n });\n // Tuesday\n\n case 'iiii':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // AM or PM\n a: function (date, token, localize) {\n var hours = date.getUTCHours();\n var dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am';\n\n switch (token) {\n case 'a':\n case 'aa':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n });\n\n case 'aaa':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n }).toLowerCase();\n\n case 'aaaaa':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'narrow',\n context: 'formatting'\n });\n\n case 'aaaa':\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n var hours = date.getUTCHours();\n var dayPeriodEnumValue;\n\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am';\n }\n\n switch (token) {\n case 'b':\n case 'bb':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n });\n\n case 'bbb':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n }).toLowerCase();\n\n case 'bbbbb':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'narrow',\n context: 'formatting'\n });\n\n case 'bbbb':\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n var hours = date.getUTCHours();\n var dayPeriodEnumValue;\n\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case 'B':\n case 'BB':\n case 'BBB':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n });\n\n case 'BBBBB':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'narrow',\n context: 'formatting'\n });\n\n case 'BBBB':\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === 'ho') {\n var hours = date.getUTCHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, {\n unit: 'hour'\n });\n }\n\n return lightFormatters.h(date, token);\n },\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === 'Ho') {\n return localize.ordinalNumber(date.getUTCHours(), {\n unit: 'hour'\n });\n }\n\n return lightFormatters.H(date, token);\n },\n // Hour [0-11]\n K: function (date, token, localize) {\n var hours = date.getUTCHours() % 12;\n\n if (token === 'Ko') {\n return localize.ordinalNumber(hours, {\n unit: 'hour'\n });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n // Hour [1-24]\n k: function (date, token, localize) {\n var hours = date.getUTCHours();\n if (hours === 0) hours = 24;\n\n if (token === 'ko') {\n return localize.ordinalNumber(hours, {\n unit: 'hour'\n });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n // Minute\n m: function (date, token, localize) {\n if (token === 'mo') {\n return localize.ordinalNumber(date.getUTCMinutes(), {\n unit: 'minute'\n });\n }\n\n return lightFormatters.m(date, token);\n },\n // Second\n s: function (date, token, localize) {\n if (token === 'so') {\n return localize.ordinalNumber(date.getUTCSeconds(), {\n unit: 'second'\n });\n }\n\n return lightFormatters.s(date, token);\n },\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return 'Z';\n }\n\n switch (token) {\n // Hours and optional minutes\n case 'X':\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n\n case 'XXXX':\n case 'XX':\n // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n\n case 'XXXXX':\n case 'XXX': // Hours and minutes with `:` delimiter\n\n default:\n return formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case 'x':\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n\n case 'xxxx':\n case 'xx':\n // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n\n case 'xxxxx':\n case 'xxx': // Hours and minutes with `:` delimiter\n\n default:\n return formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (GMT)\n O: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n switch (token) {\n // Short\n case 'O':\n case 'OO':\n case 'OOO':\n return 'GMT' + formatTimezoneShort(timezoneOffset, ':');\n // Long\n\n case 'OOOO':\n default:\n return 'GMT' + formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (specific non-location)\n z: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n switch (token) {\n // Short\n case 'z':\n case 'zz':\n case 'zzz':\n return 'GMT' + formatTimezoneShort(timezoneOffset, ':');\n // Long\n\n case 'zzzz':\n default:\n return 'GMT' + formatTimezone(timezoneOffset, ':');\n }\n },\n // Seconds timestamp\n t: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timestamp = Math.floor(originalDate.getTime() / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n // Milliseconds timestamp\n T: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timestamp = originalDate.getTime();\n return addLeadingZeros(timestamp, token.length);\n }\n};\n\nfunction formatTimezoneShort(offset, dirtyDelimiter) {\n var sign = offset > 0 ? '-' : '+';\n var absOffset = Math.abs(offset);\n var hours = Math.floor(absOffset / 60);\n var minutes = absOffset % 60;\n\n if (minutes === 0) {\n return sign + String(hours);\n }\n\n var delimiter = dirtyDelimiter || '';\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, dirtyDelimiter) {\n if (offset % 60 === 0) {\n var sign = offset > 0 ? '-' : '+';\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n\n return formatTimezone(offset, dirtyDelimiter);\n}\n\nfunction formatTimezone(offset, dirtyDelimiter) {\n var delimiter = dirtyDelimiter || '';\n var sign = offset > 0 ? '-' : '+';\n var absOffset = Math.abs(offset);\n var hours = addLeadingZeros(Math.floor(absOffset / 60), 2);\n var minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n\nexport default formatters;","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nvar MILLISECONDS_IN_DAY = 86400000; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCDayOfYear(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var timestamp = date.getTime();\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n var startOfYearTimestamp = date.getTime();\n var difference = timestamp - startOfYearTimestamp;\n return Math.floor(difference / MILLISECONDS_IN_DAY) + 1;\n}","function dateLongFormatter(pattern, formatLong) {\n switch (pattern) {\n case 'P':\n return formatLong.date({\n width: 'short'\n });\n\n case 'PP':\n return formatLong.date({\n width: 'medium'\n });\n\n case 'PPP':\n return formatLong.date({\n width: 'long'\n });\n\n case 'PPPP':\n default:\n return formatLong.date({\n width: 'full'\n });\n }\n}\n\nfunction timeLongFormatter(pattern, formatLong) {\n switch (pattern) {\n case 'p':\n return formatLong.time({\n width: 'short'\n });\n\n case 'pp':\n return formatLong.time({\n width: 'medium'\n });\n\n case 'ppp':\n return formatLong.time({\n width: 'long'\n });\n\n case 'pppp':\n default:\n return formatLong.time({\n width: 'full'\n });\n }\n}\n\nfunction dateTimeLongFormatter(pattern, formatLong) {\n var matchResult = pattern.match(/(P+)(p+)?/) || [];\n var datePattern = matchResult[1];\n var timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n var dateTimeFormat;\n\n switch (datePattern) {\n case 'P':\n dateTimeFormat = formatLong.dateTime({\n width: 'short'\n });\n break;\n\n case 'PP':\n dateTimeFormat = formatLong.dateTime({\n width: 'medium'\n });\n break;\n\n case 'PPP':\n dateTimeFormat = formatLong.dateTime({\n width: 'long'\n });\n break;\n\n case 'PPPP':\n default:\n dateTimeFormat = formatLong.dateTime({\n width: 'full'\n });\n break;\n }\n\n return dateTimeFormat.replace('{{date}}', dateLongFormatter(datePattern, formatLong)).replace('{{time}}', timeLongFormatter(timePattern, formatLong));\n}\n\nvar longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter\n};\nexport default longFormatters;","var protectedDayOfYearTokens = ['D', 'DD'];\nvar protectedWeekYearTokens = ['YY', 'YYYY'];\nexport function isProtectedDayOfYearToken(token) {\n return protectedDayOfYearTokens.indexOf(token) !== -1;\n}\nexport function isProtectedWeekYearToken(token) {\n return protectedWeekYearTokens.indexOf(token) !== -1;\n}\nexport function throwProtectedError(token, format, input) {\n if (token === 'YYYY') {\n throw new RangeError(\"Use `yyyy` instead of `YYYY` (in `\".concat(format, \"`) for formatting years to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n } else if (token === 'YY') {\n throw new RangeError(\"Use `yy` instead of `YY` (in `\".concat(format, \"`) for formatting years to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n } else if (token === 'D') {\n throw new RangeError(\"Use `d` instead of `D` (in `\".concat(format, \"`) for formatting days of the month to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n } else if (token === 'DD') {\n throw new RangeError(\"Use `dd` instead of `DD` (in `\".concat(format, \"`) for formatting days of the month to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n }\n}","import isValid from \"../isValid/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport subMilliseconds from \"../subMilliseconds/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport formatters from \"../_lib/format/formatters/index.js\";\nimport longFormatters from \"../_lib/format/longFormatters/index.js\";\nimport getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport { isProtectedDayOfYearToken, isProtectedWeekYearToken, throwProtectedError } from \"../_lib/protectedTokens/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\"; // This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\n\nvar formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g; // This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\n\nvar longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\nvar escapedStringRegExp = /^'([^]*?)'?$/;\nvar doubleQuoteRegExp = /''/g;\nvar unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n/**\n * @name format\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://git.io/fxCyr\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear]{@link https://date-fns.org/docs/getISOWeekYear}\n * and [getWeekYear]{@link https://date-fns.org/docs/getWeekYear}).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://git.io/fxCyr\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://git.io/fxCyr\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The second argument is now required for the sake of explicitness.\n *\n * ```javascript\n * // Before v2.0.0\n * format(new Date(2016, 0, 1))\n *\n * // v2.0.0 onward\n * format(new Date(2016, 0, 1), \"yyyy-MM-dd'T'HH:mm:ss.SSSxxx\")\n * ```\n *\n * - New format string API for `format` function\n * which is based on [Unicode Technical Standard #35](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table).\n * See [this post](https://blog.date-fns.org/post/unicode-tokens-in-date-fns-v2-sreatyki91jg) for more details.\n *\n * - Characters are now escaped using single quote symbols (`'`) instead of square brackets.\n *\n * @param {Date|Number} date - the original date\n * @param {String} format - the string of tokens\n * @param {Object} [options] - an object with options.\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @param {Number} [options.firstWeekContainsDate=1] - the day of January, which is\n * @param {Boolean} [options.useAdditionalWeekYearTokens=false] - if true, allows usage of the week-numbering year tokens `YY` and `YYYY`;\n * see: https://git.io/fxCyr\n * @param {Boolean} [options.useAdditionalDayOfYearTokens=false] - if true, allows usage of the day of year tokens `D` and `DD`;\n * see: https://git.io/fxCyr\n * @returns {String} the formatted date string\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `localize` property\n * @throws {RangeError} `options.locale` must contain `formatLong` property\n * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6\n * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7\n * @throws {RangeError} use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * var result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * var result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * var result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\n\nexport default function format(dirtyDate, dirtyFormatStr, dirtyOptions) {\n requiredArgs(2, arguments);\n var formatStr = String(dirtyFormatStr);\n var options = dirtyOptions || {};\n var locale = options.locale || defaultLocale;\n var localeFirstWeekContainsDate = locale.options && locale.options.firstWeekContainsDate;\n var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);\n var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n\n if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively');\n }\n\n var localeWeekStartsOn = locale.options && locale.options.weekStartsOn;\n var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n\n if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n throw new RangeError('weekStartsOn must be between 0 and 6 inclusively');\n }\n\n if (!locale.localize) {\n throw new RangeError('locale must contain localize property');\n }\n\n if (!locale.formatLong) {\n throw new RangeError('locale must contain formatLong property');\n }\n\n var originalDate = toDate(dirtyDate);\n\n if (!isValid(originalDate)) {\n throw new RangeError('Invalid time value');\n } // Convert the date in system timezone to the same date in UTC+00:00 timezone.\n // This ensures that when UTC functions will be implemented, locales will be compatible with them.\n // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/376\n\n\n var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate);\n var utcDate = subMilliseconds(originalDate, timezoneOffset);\n var formatterOptions = {\n firstWeekContainsDate: firstWeekContainsDate,\n weekStartsOn: weekStartsOn,\n locale: locale,\n _originalDate: originalDate\n };\n var result = formatStr.match(longFormattingTokensRegExp).map(function (substring) {\n var firstCharacter = substring[0];\n\n if (firstCharacter === 'p' || firstCharacter === 'P') {\n var longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong, formatterOptions);\n }\n\n return substring;\n }).join('').match(formattingTokensRegExp).map(function (substring) {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return \"'\";\n }\n\n var firstCharacter = substring[0];\n\n if (firstCharacter === \"'\") {\n return cleanEscapedString(substring);\n }\n\n var formatter = formatters[firstCharacter];\n\n if (formatter) {\n if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) {\n throwProtectedError(substring, dirtyFormatStr, dirtyDate);\n }\n\n if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) {\n throwProtectedError(substring, dirtyFormatStr, dirtyDate);\n }\n\n return formatter(utcDate, substring, locale.localize, formatterOptions);\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError('Format string contains an unescaped latin alphabet character `' + firstCharacter + '`');\n }\n\n return substring;\n }).join('');\n return result;\n}\n\nfunction cleanEscapedString(input) {\n return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}","/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport default function getTimezoneOffsetInMilliseconds(date) {\n var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));\n utcDate.setUTCFullYear(date.getFullYear());\n return date.getTime() - utcDate.getTime();\n}","/* eslint-disable no-bitwise, no-empty */\nimport { createSelector } from 'reselect';\nimport { resolveProp } from '@clearscore-group/lib.helpers.resolve-props';\nimport differenceInHours from 'date-fns/differenceInHours';\nimport formatDate from 'date-fns/format';\n\nconst DAYS_IN_WEEK = 7;\nconst HOURS_IN_DAY = 24;\n\nexport const getHasNewNotifications = createSelector(\n (state) => resolveProp('notifications.fetchHasNewNotifications.data', state),\n (hasNewData = { hasNew: false, count: 0 }) => hasNewData,\n);\n\nconst getDifferenceInHours = (date) => {\n const now = new Date();\n return Math.abs(differenceInHours(date, now));\n};\n\nexport const getHumanReadableFormat = (distance, notificationDate, language) => {\n if (distance <= HOURS_IN_DAY) return language.today;\n if (distance <= HOURS_IN_DAY * 2) return language.yesterday;\n if (distance < HOURS_IN_DAY * DAYS_IN_WEEK)\n return `${Math.floor(distance / HOURS_IN_DAY)} ${language.days} ${language.ago}`;\n const numWeeks = Math.floor(distance / HOURS_IN_DAY / DAYS_IN_WEEK);\n if (numWeeks <= 8) {\n if (numWeeks < 2) return `${numWeeks} ${language.week} ${language.ago}`;\n return `${numWeeks} ${language.weeks} ${language.ago}`;\n }\n return formatDate(new Date(notificationDate), 'd MMM yyyy');\n};\n\nexport const getNotifications = (language) =>\n createSelector(\n (state) => resolveProp('notifications.fetch.data', state),\n (notifications = []) =>\n notifications.map((notification) => ({\n description: notification?.payload?.description,\n destinationUrl: notification?.payload?.destinationUrl,\n friendlyDateCreated: getHumanReadableFormat(\n getDifferenceInHours(new Date(notification.createdAt)),\n notification.createdAt,\n language,\n ),\n id: notification.id,\n isSeen: !!notification?.seenAt,\n title: notification?.payload?.title,\n isExclusive: !!notification?.payload?.badge,\n disclaimer: notification?.payload?.disclaimer,\n badge: notification?.payload?.badge,\n notificationType: notification?.payload?.notificationType,\n modalId: notification?.payload?.modalId,\n modalProperties: notification?.payload?.modalProperties,\n ctaText: notification?.payload?.ctaText,\n icon: notification?.payload?.icon,\n })),\n );\n","import createReduxModule from '@clearscore-group/lib.redux.create-requests';\n\nimport * as actionCreators from './actions';\nimport * as customSelectors from './selectors';\n\nconst redux = createReduxModule({ moduleName: 'notifications', actionCreators });\n\nexport const { types } = redux;\nexport const { actions } = redux;\nexport const { reducers } = redux;\nexport const selectors = { ...redux.selectors, ...customSelectors };\n","import { useSelector } from 'react-redux';\nimport { selectors as routeSelectors } from '@clearscore-group/lib.redux.routes';\n\ninterface Segments {\n groups: string[] | string;\n}\n\nconst useSegmentation = (): Segments => useSelector(routeSelectors.getSegmentation);\n\n/**\n * Check if a user has any of the argument groups\n * @param {...string} requestedGroups groups to check for\n */\n\nexport const useHasSegmentationGroups = (...requestedGroups: string[]) => {\n const { groups } = useSegmentation();\n\n return requestedGroups.some((rg) => groups.includes(rg));\n};\n\ninterface VariantMap {\n [key: string]: string;\n}\n\nexport const useExperiment = (experimentName: string, variantMap: VariantMap) => {\n const { groups } = useSegmentation();\n\n const selectedVariant = Object.keys(variantMap).find((variant) => groups.includes(`${experimentName}:${variant}`));\n\n if (selectedVariant) {\n return variantMap[selectedVariant];\n }\n\n return variantMap.control || null;\n};\n\nexport default useSegmentation;\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn target.propertyIsEnumerable(symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","import deepmerge from 'deepmerge';\nimport type { DefaultRootState } from 'react-redux';\nimport { useSelector } from 'react-redux';\nimport type { MARKETS } from '@clearscore-group/lib.config.i18n';\nimport { GB } from '@clearscore-group/lib.config.i18n';\nimport { selectors as marketSelectors } from '@clearscore-group/lib.redux.market';\n\ntype TMarketConfigKey = (typeof MARKETS)[number] | 'common';\ntype TMarketConfig = Partial>;\n\nconst isObject = (value: unknown): value is TMarketConfig =>\n !!value && typeof value === 'object' && value.constructor === Object;\n\nconst useMarketConfig = (marketConfig: T): T extends TMarketConfig ? T[keyof T] : never => {\n if (!marketConfig || !isObject(marketConfig)) throw new Error('A market config object must be provided');\n const market = useSelector(marketSelectors.getActiveMarket);\n\n // GB market defaulting is temporary and will be removed.\n // Common config should be placed under a 'common' property.\n const baseConfig = marketConfig.common || marketConfig[GB];\n\n if (marketConfig[market]) {\n return baseConfig\n ? deepmerge(baseConfig, marketConfig[market], {\n arrayMerge: (_, sourceArray) => sourceArray,\n })\n : marketConfig[market];\n }\n\n return baseConfig || null;\n};\n\nexport default useMarketConfig;\n","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import {createContext as $3bkAK$createContext, useMemo as $3bkAK$useMemo, createElement as $3bkAK$createElement, useContext as $3bkAK$useContext} from \"react\";\n\n\nfunction $c512c27ab02ef895$export$fd42f52fd3ae1109(rootComponentName, defaultContext) {\n const Context = /*#__PURE__*/ $3bkAK$createContext(defaultContext);\n function Provider(props) {\n const { children: children , ...context } = props; // Only re-memoize when prop values change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const value = $3bkAK$useMemo(()=>context\n , Object.values(context));\n return /*#__PURE__*/ $3bkAK$createElement(Context.Provider, {\n value: value\n }, children);\n }\n function useContext(consumerName) {\n const context = $3bkAK$useContext(Context);\n if (context) return context;\n if (defaultContext !== undefined) return defaultContext; // if a defaultContext wasn't specified, it's a required context.\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n Provider.displayName = rootComponentName + 'Provider';\n return [\n Provider,\n useContext\n ];\n}\n/* -------------------------------------------------------------------------------------------------\n * createContextScope\n * -----------------------------------------------------------------------------------------------*/ function $c512c27ab02ef895$export$50c7b4e9d9f19c1(scopeName, createContextScopeDeps = []) {\n let defaultContexts = [];\n /* -----------------------------------------------------------------------------------------------\n * createContext\n * ---------------------------------------------------------------------------------------------*/ function $c512c27ab02ef895$export$fd42f52fd3ae1109(rootComponentName, defaultContext) {\n const BaseContext = /*#__PURE__*/ $3bkAK$createContext(defaultContext);\n const index = defaultContexts.length;\n defaultContexts = [\n ...defaultContexts,\n defaultContext\n ];\n function Provider(props) {\n const { scope: scope , children: children , ...context } = props;\n const Context = (scope === null || scope === void 0 ? void 0 : scope[scopeName][index]) || BaseContext; // Only re-memoize when prop values change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const value = $3bkAK$useMemo(()=>context\n , Object.values(context));\n return /*#__PURE__*/ $3bkAK$createElement(Context.Provider, {\n value: value\n }, children);\n }\n function useContext(consumerName, scope) {\n const Context = (scope === null || scope === void 0 ? void 0 : scope[scopeName][index]) || BaseContext;\n const context = $3bkAK$useContext(Context);\n if (context) return context;\n if (defaultContext !== undefined) return defaultContext; // if a defaultContext wasn't specified, it's a required context.\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n }\n Provider.displayName = rootComponentName + 'Provider';\n return [\n Provider,\n useContext\n ];\n }\n /* -----------------------------------------------------------------------------------------------\n * createScope\n * ---------------------------------------------------------------------------------------------*/ const createScope = ()=>{\n const scopeContexts = defaultContexts.map((defaultContext)=>{\n return /*#__PURE__*/ $3bkAK$createContext(defaultContext);\n });\n return function useScope(scope) {\n const contexts = (scope === null || scope === void 0 ? void 0 : scope[scopeName]) || scopeContexts;\n return $3bkAK$useMemo(()=>({\n [`__scope${scopeName}`]: {\n ...scope,\n [scopeName]: contexts\n }\n })\n , [\n scope,\n contexts\n ]);\n };\n };\n createScope.scopeName = scopeName;\n return [\n $c512c27ab02ef895$export$fd42f52fd3ae1109,\n $c512c27ab02ef895$var$composeContextScopes(createScope, ...createContextScopeDeps)\n ];\n}\n/* -------------------------------------------------------------------------------------------------\n * composeContextScopes\n * -----------------------------------------------------------------------------------------------*/ function $c512c27ab02ef895$var$composeContextScopes(...scopes) {\n const baseScope = scopes[0];\n if (scopes.length === 1) return baseScope;\n const createScope1 = ()=>{\n const scopeHooks = scopes.map((createScope)=>({\n useScope: createScope(),\n scopeName: createScope.scopeName\n })\n );\n return function useComposedScopes(overrideScopes) {\n const nextScopes1 = scopeHooks.reduce((nextScopes, { useScope: useScope , scopeName: scopeName })=>{\n // We are calling a hook inside a callback which React warns against to avoid inconsistent\n // renders, however, scoping doesn't have render side effects so we ignore the rule.\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const scopeProps = useScope(overrideScopes);\n const currentScope = scopeProps[`__scope${scopeName}`];\n return {\n ...nextScopes,\n ...currentScope\n };\n }, {});\n return $3bkAK$useMemo(()=>({\n [`__scope${baseScope.scopeName}`]: nextScopes1\n })\n , [\n nextScopes1\n ]);\n };\n };\n createScope1.scopeName = baseScope.scopeName;\n return createScope1;\n}\n\n\n\n\nexport {$c512c27ab02ef895$export$fd42f52fd3ae1109 as createContext, $c512c27ab02ef895$export$50c7b4e9d9f19c1 as createContextScope};\n//# sourceMappingURL=index.mjs.map\n","function $e42e1063c40fb3ef$export$b9ecd428b558ff10(originalEventHandler, ourEventHandler, { checkForDefaultPrevented: checkForDefaultPrevented = true } = {}) {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 || originalEventHandler(event);\n if (checkForDefaultPrevented === false || !event.defaultPrevented) return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n };\n}\n\n\n\n\nexport {$e42e1063c40fb3ef$export$b9ecd428b558ff10 as composeEventHandlers};\n//# sourceMappingURL=index.mjs.map\n","import {useCallback as $3vqmr$useCallback} from \"react\";\n\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */ function $6ed0406888f73fc4$var$setRef(ref, value) {\n if (typeof ref === 'function') ref(value);\n else if (ref !== null && ref !== undefined) ref.current = value;\n}\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */ function $6ed0406888f73fc4$export$43e446d32b3d21af(...refs) {\n return (node)=>refs.forEach((ref)=>$6ed0406888f73fc4$var$setRef(ref, node)\n )\n ;\n}\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */ function $6ed0406888f73fc4$export$c7b2cbe3552a0d05(...refs) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return $3vqmr$useCallback($6ed0406888f73fc4$export$43e446d32b3d21af(...refs), refs);\n}\n\n\n\n\nexport {$6ed0406888f73fc4$export$43e446d32b3d21af as composeRefs, $6ed0406888f73fc4$export$c7b2cbe3552a0d05 as useComposedRefs};\n//# sourceMappingURL=index.mjs.map\n","import $9IrjX$babelruntimehelpersesmextends from \"@babel/runtime/helpers/esm/extends\";\nimport {forwardRef as $9IrjX$forwardRef, Children as $9IrjX$Children, isValidElement as $9IrjX$isValidElement, createElement as $9IrjX$createElement, cloneElement as $9IrjX$cloneElement, Fragment as $9IrjX$Fragment} from \"react\";\nimport {composeRefs as $9IrjX$composeRefs} from \"@radix-ui/react-compose-refs\";\n\n\n\n\n/* -------------------------------------------------------------------------------------------------\n * Slot\n * -----------------------------------------------------------------------------------------------*/ const $5e63c961fc1ce211$export$8c6ed5c666ac1360 = /*#__PURE__*/ $9IrjX$forwardRef((props, forwardedRef)=>{\n const { children: children , ...slotProps } = props;\n const childrenArray = $9IrjX$Children.toArray(children);\n const slottable = childrenArray.find($5e63c961fc1ce211$var$isSlottable);\n if (slottable) {\n // the new element to render is the one passed as a child of `Slottable`\n const newElement = slottable.props.children;\n const newChildren = childrenArray.map((child)=>{\n if (child === slottable) {\n // because the new element will be the one rendered, we are only interested\n // in grabbing its children (`newElement.props.children`)\n if ($9IrjX$Children.count(newElement) > 1) return $9IrjX$Children.only(null);\n return /*#__PURE__*/ $9IrjX$isValidElement(newElement) ? newElement.props.children : null;\n } else return child;\n });\n return /*#__PURE__*/ $9IrjX$createElement($5e63c961fc1ce211$var$SlotClone, $9IrjX$babelruntimehelpersesmextends({}, slotProps, {\n ref: forwardedRef\n }), /*#__PURE__*/ $9IrjX$isValidElement(newElement) ? /*#__PURE__*/ $9IrjX$cloneElement(newElement, undefined, newChildren) : null);\n }\n return /*#__PURE__*/ $9IrjX$createElement($5e63c961fc1ce211$var$SlotClone, $9IrjX$babelruntimehelpersesmextends({}, slotProps, {\n ref: forwardedRef\n }), children);\n});\n$5e63c961fc1ce211$export$8c6ed5c666ac1360.displayName = 'Slot';\n/* -------------------------------------------------------------------------------------------------\n * SlotClone\n * -----------------------------------------------------------------------------------------------*/ const $5e63c961fc1ce211$var$SlotClone = /*#__PURE__*/ $9IrjX$forwardRef((props, forwardedRef)=>{\n const { children: children , ...slotProps } = props;\n if (/*#__PURE__*/ $9IrjX$isValidElement(children)) return /*#__PURE__*/ $9IrjX$cloneElement(children, {\n ...$5e63c961fc1ce211$var$mergeProps(slotProps, children.props),\n ref: forwardedRef ? $9IrjX$composeRefs(forwardedRef, children.ref) : children.ref\n });\n return $9IrjX$Children.count(children) > 1 ? $9IrjX$Children.only(null) : null;\n});\n$5e63c961fc1ce211$var$SlotClone.displayName = 'SlotClone';\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/ const $5e63c961fc1ce211$export$d9f1ccf0bdb05d45 = ({ children: children })=>{\n return /*#__PURE__*/ $9IrjX$createElement($9IrjX$Fragment, null, children);\n};\n/* ---------------------------------------------------------------------------------------------- */ function $5e63c961fc1ce211$var$isSlottable(child) {\n return /*#__PURE__*/ $9IrjX$isValidElement(child) && child.type === $5e63c961fc1ce211$export$d9f1ccf0bdb05d45;\n}\nfunction $5e63c961fc1ce211$var$mergeProps(slotProps, childProps) {\n // all child props should override\n const overrideProps = {\n ...childProps\n };\n for(const propName in childProps){\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n // if the handler exists on both, we compose them\n if (slotPropValue && childPropValue) overrideProps[propName] = (...args)=>{\n childPropValue(...args);\n slotPropValue(...args);\n };\n else if (slotPropValue) overrideProps[propName] = slotPropValue;\n } else if (propName === 'style') overrideProps[propName] = {\n ...slotPropValue,\n ...childPropValue\n };\n else if (propName === 'className') overrideProps[propName] = [\n slotPropValue,\n childPropValue\n ].filter(Boolean).join(' ');\n }\n return {\n ...slotProps,\n ...overrideProps\n };\n}\nconst $5e63c961fc1ce211$export$be92b6f5f03c0fe9 = $5e63c961fc1ce211$export$8c6ed5c666ac1360;\n\n\n\n\nexport {$5e63c961fc1ce211$export$8c6ed5c666ac1360 as Slot, $5e63c961fc1ce211$export$d9f1ccf0bdb05d45 as Slottable, $5e63c961fc1ce211$export$be92b6f5f03c0fe9 as Root};\n//# sourceMappingURL=index.mjs.map\n","import $4q5Fq$babelruntimehelpersesmextends from \"@babel/runtime/helpers/esm/extends\";\nimport {forwardRef as $4q5Fq$forwardRef, useEffect as $4q5Fq$useEffect, createElement as $4q5Fq$createElement} from \"react\";\nimport {flushSync as $4q5Fq$flushSync} from \"react-dom\";\nimport {Slot as $4q5Fq$Slot} from \"@radix-ui/react-slot\";\n\n\n\n\n\nconst $8927f6f2acc4f386$var$NODES = [\n 'a',\n 'button',\n 'div',\n 'form',\n 'h2',\n 'h3',\n 'img',\n 'input',\n 'label',\n 'li',\n 'nav',\n 'ol',\n 'p',\n 'span',\n 'svg',\n 'ul'\n]; // Temporary while we await merge of this fix:\n// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/55396\n// prettier-ignore\n/* -------------------------------------------------------------------------------------------------\n * Primitive\n * -----------------------------------------------------------------------------------------------*/ const $8927f6f2acc4f386$export$250ffa63cdc0d034 = $8927f6f2acc4f386$var$NODES.reduce((primitive, node)=>{\n const Node = /*#__PURE__*/ $4q5Fq$forwardRef((props, forwardedRef)=>{\n const { asChild: asChild , ...primitiveProps } = props;\n const Comp = asChild ? $4q5Fq$Slot : node;\n $4q5Fq$useEffect(()=>{\n window[Symbol.for('radix-ui')] = true;\n }, []);\n return /*#__PURE__*/ $4q5Fq$createElement(Comp, $4q5Fq$babelruntimehelpersesmextends({}, primitiveProps, {\n ref: forwardedRef\n }));\n });\n Node.displayName = `Primitive.${node}`;\n return {\n ...primitive,\n [node]: Node\n };\n}, {});\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/ /**\n * Flush custom event dispatch\n * https://github.com/radix-ui/primitives/pull/1378\n *\n * React batches *all* event handlers since version 18, this introduces certain considerations when using custom event types.\n *\n * Internally, React prioritises events in the following order:\n * - discrete\n * - continuous\n * - default\n *\n * https://github.com/facebook/react/blob/a8a4742f1c54493df00da648a3f9d26e3db9c8b5/packages/react-dom/src/events/ReactDOMEventListener.js#L294-L350\n *\n * `discrete` is an important distinction as updates within these events are applied immediately.\n * React however, is not able to infer the priority of custom event types due to how they are detected internally.\n * Because of this, it's possible for updates from custom events to be unexpectedly batched when\n * dispatched by another `discrete` event.\n *\n * In order to ensure that updates from custom events are applied predictably, we need to manually flush the batch.\n * This utility should be used when dispatching a custom event from within another `discrete` event, this utility\n * is not nessesary when dispatching known event types, or if dispatching a custom type inside a non-discrete event.\n * For example:\n *\n * dispatching a known click 👎\n * target.dispatchEvent(new Event(‘click’))\n *\n * dispatching a custom type within a non-discrete event 👎\n * onScroll={(event) => event.target.dispatchEvent(new CustomEvent(‘customType’))}\n *\n * dispatching a custom type within a `discrete` event 👍\n * onPointerDown={(event) => dispatchDiscreteCustomEvent(event.target, new CustomEvent(‘customType’))}\n *\n * Note: though React classifies `focus`, `focusin` and `focusout` events as `discrete`, it's not recommended to use\n * this utility with them. This is because it's possible for those handlers to be called implicitly during render\n * e.g. when focus is within a component as it is unmounted, or when managing focus on mount.\n */ function $8927f6f2acc4f386$export$6d1a0317bde7de7f(target, event) {\n if (target) $4q5Fq$flushSync(()=>target.dispatchEvent(event)\n );\n}\n/* -----------------------------------------------------------------------------------------------*/ const $8927f6f2acc4f386$export$be92b6f5f03c0fe9 = $8927f6f2acc4f386$export$250ffa63cdc0d034;\n\n\n\n\nexport {$8927f6f2acc4f386$export$250ffa63cdc0d034 as Primitive, $8927f6f2acc4f386$export$be92b6f5f03c0fe9 as Root, $8927f6f2acc4f386$export$6d1a0317bde7de7f as dispatchDiscreteCustomEvent};\n//# sourceMappingURL=index.mjs.map\n","import {useRef as $lwiWj$useRef, useEffect as $lwiWj$useEffect, useMemo as $lwiWj$useMemo} from \"react\";\n\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */ function $b1b2314f5f9a1d84$export$25bec8c6f54ee79a(callback) {\n const callbackRef = $lwiWj$useRef(callback);\n $lwiWj$useEffect(()=>{\n callbackRef.current = callback;\n }); // https://github.com/facebook/react/issues/19240\n return $lwiWj$useMemo(()=>(...args)=>{\n var _callbackRef$current;\n return (_callbackRef$current = callbackRef.current) === null || _callbackRef$current === void 0 ? void 0 : _callbackRef$current.call(callbackRef, ...args);\n }\n , []);\n}\n\n\n\n\nexport {$b1b2314f5f9a1d84$export$25bec8c6f54ee79a as useCallbackRef};\n//# sourceMappingURL=index.mjs.map\n","import {useCallback as $bnPw9$useCallback, useState as $bnPw9$useState, useRef as $bnPw9$useRef, useEffect as $bnPw9$useEffect} from \"react\";\nimport {useCallbackRef as $bnPw9$useCallbackRef} from \"@radix-ui/react-use-callback-ref\";\n\n\n\nfunction $71cd76cc60e0454e$export$6f32135080cb4c3({ prop: prop , defaultProp: defaultProp , onChange: onChange = ()=>{} }) {\n const [uncontrolledProp, setUncontrolledProp] = $71cd76cc60e0454e$var$useUncontrolledState({\n defaultProp: defaultProp,\n onChange: onChange\n });\n const isControlled = prop !== undefined;\n const value1 = isControlled ? prop : uncontrolledProp;\n const handleChange = $bnPw9$useCallbackRef(onChange);\n const setValue = $bnPw9$useCallback((nextValue)=>{\n if (isControlled) {\n const setter = nextValue;\n const value = typeof nextValue === 'function' ? setter(prop) : nextValue;\n if (value !== prop) handleChange(value);\n } else setUncontrolledProp(nextValue);\n }, [\n isControlled,\n prop,\n setUncontrolledProp,\n handleChange\n ]);\n return [\n value1,\n setValue\n ];\n}\nfunction $71cd76cc60e0454e$var$useUncontrolledState({ defaultProp: defaultProp , onChange: onChange }) {\n const uncontrolledState = $bnPw9$useState(defaultProp);\n const [value] = uncontrolledState;\n const prevValueRef = $bnPw9$useRef(value);\n const handleChange = $bnPw9$useCallbackRef(onChange);\n $bnPw9$useEffect(()=>{\n if (prevValueRef.current !== value) {\n handleChange(value);\n prevValueRef.current = value;\n }\n }, [\n value,\n prevValueRef,\n handleChange\n ]);\n return uncontrolledState;\n}\n\n\n\n\nexport {$71cd76cc60e0454e$export$6f32135080cb4c3 as useControllableState};\n//# sourceMappingURL=index.mjs.map\n","import {useLayoutEffect as $dxlwH$useLayoutEffect} from \"react\";\n\n\n/**\n * On the server, React emits a warning when calling `useLayoutEffect`.\n * This is because neither `useLayoutEffect` nor `useEffect` run on the server.\n * We use this safe version which suppresses the warning by replacing it with a noop on the server.\n *\n * See: https://reactjs.org/docs/hooks-reference.html#uselayouteffect\n */ const $9f79659886946c16$export$e5c5a5f917a5871c = Boolean(globalThis === null || globalThis === void 0 ? void 0 : globalThis.document) ? $dxlwH$useLayoutEffect : ()=>{};\n\n\n\n\nexport {$9f79659886946c16$export$e5c5a5f917a5871c as useLayoutEffect};\n//# sourceMappingURL=index.mjs.map\n","import * as $2AODx$react from \"react\";\nimport {useLayoutEffect as $2AODx$useLayoutEffect} from \"@radix-ui/react-use-layout-effect\";\n\n\n\nconst $1746a345f3d73bb7$var$useReactId = $2AODx$react['useId'.toString()] || (()=>undefined\n);\nlet $1746a345f3d73bb7$var$count = 0;\nfunction $1746a345f3d73bb7$export$f680877a34711e37(deterministicId) {\n const [id, setId] = $2AODx$react.useState($1746a345f3d73bb7$var$useReactId()); // React versions older than 18 will have client-side ids only.\n $2AODx$useLayoutEffect(()=>{\n if (!deterministicId) setId((reactId)=>reactId !== null && reactId !== void 0 ? reactId : String($1746a345f3d73bb7$var$count++)\n );\n }, [\n deterministicId\n ]);\n return deterministicId || (id ? `radix-${id}` : '');\n}\n\n\n\n\nexport {$1746a345f3d73bb7$export$f680877a34711e37 as useId};\n//# sourceMappingURL=index.mjs.map\n","import $6vYhU$react from \"react\";\nimport {createContextScope as $6vYhU$createContextScope} from \"@radix-ui/react-context\";\nimport {useComposedRefs as $6vYhU$useComposedRefs} from \"@radix-ui/react-compose-refs\";\nimport {Slot as $6vYhU$Slot} from \"@radix-ui/react-slot\";\n\n\n\n\n\n// We have resorted to returning slots directly rather than exposing primitives that can then\n// be slotted like ``.\n// This is because we encountered issues with generic types that cannot be statically analysed\n// due to creating them dynamically via createCollection.\nfunction $e02a7d9cb1dc128c$export$c74125a8e3af6bb2(name) {\n /* -----------------------------------------------------------------------------------------------\n * CollectionProvider\n * ---------------------------------------------------------------------------------------------*/ const PROVIDER_NAME = name + 'CollectionProvider';\n const [createCollectionContext, createCollectionScope] = $6vYhU$createContextScope(PROVIDER_NAME);\n const [CollectionProviderImpl, useCollectionContext] = createCollectionContext(PROVIDER_NAME, {\n collectionRef: {\n current: null\n },\n itemMap: new Map()\n });\n const CollectionProvider = (props)=>{\n const { scope: scope , children: children } = props;\n const ref = $6vYhU$react.useRef(null);\n const itemMap = $6vYhU$react.useRef(new Map()).current;\n return /*#__PURE__*/ $6vYhU$react.createElement(CollectionProviderImpl, {\n scope: scope,\n itemMap: itemMap,\n collectionRef: ref\n }, children);\n };\n /*#__PURE__*/ Object.assign(CollectionProvider, {\n displayName: PROVIDER_NAME\n });\n /* -----------------------------------------------------------------------------------------------\n * CollectionSlot\n * ---------------------------------------------------------------------------------------------*/ const COLLECTION_SLOT_NAME = name + 'CollectionSlot';\n const CollectionSlot = /*#__PURE__*/ $6vYhU$react.forwardRef((props, forwardedRef)=>{\n const { scope: scope , children: children } = props;\n const context = useCollectionContext(COLLECTION_SLOT_NAME, scope);\n const composedRefs = $6vYhU$useComposedRefs(forwardedRef, context.collectionRef);\n return /*#__PURE__*/ $6vYhU$react.createElement($6vYhU$Slot, {\n ref: composedRefs\n }, children);\n });\n /*#__PURE__*/ Object.assign(CollectionSlot, {\n displayName: COLLECTION_SLOT_NAME\n });\n /* -----------------------------------------------------------------------------------------------\n * CollectionItem\n * ---------------------------------------------------------------------------------------------*/ const ITEM_SLOT_NAME = name + 'CollectionItemSlot';\n const ITEM_DATA_ATTR = 'data-radix-collection-item';\n const CollectionItemSlot = /*#__PURE__*/ $6vYhU$react.forwardRef((props, forwardedRef)=>{\n const { scope: scope , children: children , ...itemData } = props;\n const ref = $6vYhU$react.useRef(null);\n const composedRefs = $6vYhU$useComposedRefs(forwardedRef, ref);\n const context = useCollectionContext(ITEM_SLOT_NAME, scope);\n $6vYhU$react.useEffect(()=>{\n context.itemMap.set(ref, {\n ref: ref,\n ...itemData\n });\n return ()=>void context.itemMap.delete(ref)\n ;\n });\n return /*#__PURE__*/ $6vYhU$react.createElement($6vYhU$Slot, {\n [ITEM_DATA_ATTR]: '',\n ref: composedRefs\n }, children);\n });\n /*#__PURE__*/ Object.assign(CollectionItemSlot, {\n displayName: ITEM_SLOT_NAME\n });\n /* -----------------------------------------------------------------------------------------------\n * useCollection\n * ---------------------------------------------------------------------------------------------*/ function useCollection(scope) {\n const context = useCollectionContext(name + 'CollectionConsumer', scope);\n const getItems = $6vYhU$react.useCallback(()=>{\n const collectionNode = context.collectionRef.current;\n if (!collectionNode) return [];\n const orderedNodes = Array.from(collectionNode.querySelectorAll(`[${ITEM_DATA_ATTR}]`));\n const items = Array.from(context.itemMap.values());\n const orderedItems = items.sort((a, b)=>orderedNodes.indexOf(a.ref.current) - orderedNodes.indexOf(b.ref.current)\n );\n return orderedItems;\n }, [\n context.collectionRef,\n context.itemMap\n ]);\n return getItems;\n }\n return [\n {\n Provider: CollectionProvider,\n Slot: CollectionSlot,\n ItemSlot: CollectionItemSlot\n },\n useCollection,\n createCollectionScope\n ];\n}\n\n\n\n\nexport {$e02a7d9cb1dc128c$export$c74125a8e3af6bb2 as createCollection};\n//# sourceMappingURL=index.mjs.map\n","import {useRef as $8LvvK$useRef, useMemo as $8LvvK$useMemo} from \"react\";\n\n\nfunction $010c2913dbd2fe3d$export$5cae361ad82dce8b(value) {\n const ref = $8LvvK$useRef({\n value: value,\n previous: value\n }); // We compare values before making an update to ensure that\n // a change has been made. This ensures the previous value is\n // persisted correctly between renders.\n return $8LvvK$useMemo(()=>{\n if (ref.current.value !== value) {\n ref.current.previous = ref.current.value;\n ref.current.value = value;\n }\n return ref.current.previous;\n }, [\n value\n ]);\n}\n\n\n\n\nexport {$010c2913dbd2fe3d$export$5cae361ad82dce8b as usePrevious};\n//# sourceMappingURL=index.mjs.map\n","import $yHMN2$babelruntimehelpersesmextends from \"@babel/runtime/helpers/esm/extends\";\nimport {forwardRef as $yHMN2$forwardRef, useState as $yHMN2$useState, useRef as $yHMN2$useRef, useCallback as $yHMN2$useCallback, useEffect as $yHMN2$useEffect, createElement as $yHMN2$createElement, Fragment as $yHMN2$Fragment, useMemo as $yHMN2$useMemo} from \"react\";\nimport $yHMN2$reactdom from \"react-dom\";\nimport {createContextScope as $yHMN2$createContextScope} from \"@radix-ui/react-context\";\nimport {composeEventHandlers as $yHMN2$composeEventHandlers} from \"@radix-ui/primitive\";\nimport {Primitive as $yHMN2$Primitive, dispatchDiscreteCustomEvent as $yHMN2$dispatchDiscreteCustomEvent} from \"@radix-ui/react-primitive\";\nimport {useControllableState as $yHMN2$useControllableState} from \"@radix-ui/react-use-controllable-state\";\nimport {useComposedRefs as $yHMN2$useComposedRefs, composeRefs as $yHMN2$composeRefs} from \"@radix-ui/react-compose-refs\";\nimport {useDirection as $yHMN2$useDirection} from \"@radix-ui/react-direction\";\nimport {Presence as $yHMN2$Presence} from \"@radix-ui/react-presence\";\nimport {useId as $yHMN2$useId} from \"@radix-ui/react-id\";\nimport {createCollection as $yHMN2$createCollection} from \"@radix-ui/react-collection\";\nimport {DismissableLayer as $yHMN2$DismissableLayer} from \"@radix-ui/react-dismissable-layer\";\nimport {usePrevious as $yHMN2$usePrevious} from \"@radix-ui/react-use-previous\";\nimport {useLayoutEffect as $yHMN2$useLayoutEffect} from \"@radix-ui/react-use-layout-effect\";\nimport {useCallbackRef as $yHMN2$useCallbackRef} from \"@radix-ui/react-use-callback-ref\";\nimport {Root as $yHMN2$Root} from \"@radix-ui/react-visually-hidden\";\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenu\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$NAVIGATION_MENU_NAME = 'NavigationMenu';\nconst [$322c88a641701f3b$var$Collection, $322c88a641701f3b$var$useCollection, $322c88a641701f3b$var$createCollectionScope] = $yHMN2$createCollection($322c88a641701f3b$var$NAVIGATION_MENU_NAME);\nconst [$322c88a641701f3b$var$FocusGroupCollection, $322c88a641701f3b$var$useFocusGroupCollection, $322c88a641701f3b$var$createFocusGroupCollectionScope] = $yHMN2$createCollection($322c88a641701f3b$var$NAVIGATION_MENU_NAME);\nconst [$322c88a641701f3b$var$createNavigationMenuContext, $322c88a641701f3b$export$fb8ea5af8c9fcdf0] = $yHMN2$createContextScope($322c88a641701f3b$var$NAVIGATION_MENU_NAME, [\n $322c88a641701f3b$var$createCollectionScope,\n $322c88a641701f3b$var$createFocusGroupCollectionScope\n]);\nconst [$322c88a641701f3b$var$NavigationMenuProviderImpl, $322c88a641701f3b$var$useNavigationMenuContext] = $322c88a641701f3b$var$createNavigationMenuContext($322c88a641701f3b$var$NAVIGATION_MENU_NAME);\nconst [$322c88a641701f3b$var$ViewportContentProvider, $322c88a641701f3b$var$useViewportContentContext] = $322c88a641701f3b$var$createNavigationMenuContext($322c88a641701f3b$var$NAVIGATION_MENU_NAME);\nconst $322c88a641701f3b$export$5b2278cf1e8bcae2 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , value: valueProp , onValueChange: onValueChange , defaultValue: defaultValue , delayDuration: delayDuration = 200 , skipDelayDuration: skipDelayDuration = 300 , orientation: orientation = 'horizontal' , dir: dir , ...NavigationMenuProps } = props;\n const [navigationMenu, setNavigationMenu] = $yHMN2$useState(null);\n const composedRef = $yHMN2$useComposedRefs(forwardedRef, (node)=>setNavigationMenu(node)\n );\n const direction = $yHMN2$useDirection(dir);\n const openTimerRef = $yHMN2$useRef(0);\n const closeTimerRef = $yHMN2$useRef(0);\n const skipDelayTimerRef = $yHMN2$useRef(0);\n const [isOpenDelayed, setIsOpenDelayed] = $yHMN2$useState(true);\n const [value1 = '', setValue] = $yHMN2$useControllableState({\n prop: valueProp,\n onChange: (value)=>{\n const isOpen = value !== '';\n const hasSkipDelayDuration = skipDelayDuration > 0;\n if (isOpen) {\n window.clearTimeout(skipDelayTimerRef.current);\n if (hasSkipDelayDuration) setIsOpenDelayed(false);\n } else {\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(()=>setIsOpenDelayed(true)\n , skipDelayDuration);\n }\n onValueChange === null || onValueChange === void 0 || onValueChange(value);\n },\n defaultProp: defaultValue\n });\n const startCloseTimer = $yHMN2$useCallback(()=>{\n window.clearTimeout(closeTimerRef.current);\n closeTimerRef.current = window.setTimeout(()=>setValue('')\n , 150);\n }, [\n setValue\n ]);\n const handleOpen = $yHMN2$useCallback((itemValue)=>{\n window.clearTimeout(closeTimerRef.current);\n setValue(itemValue);\n }, [\n setValue\n ]);\n const handleDelayedOpen = $yHMN2$useCallback((itemValue)=>{\n const isOpenItem = value1 === itemValue;\n if (isOpenItem) // If the item is already open (e.g. we're transitioning from the content to the trigger)\n // then we want to clear the close timer immediately.\n window.clearTimeout(closeTimerRef.current);\n else openTimerRef.current = window.setTimeout(()=>{\n window.clearTimeout(closeTimerRef.current);\n setValue(itemValue);\n }, delayDuration);\n }, [\n value1,\n setValue,\n delayDuration\n ]);\n $yHMN2$useEffect(()=>{\n return ()=>{\n window.clearTimeout(openTimerRef.current);\n window.clearTimeout(closeTimerRef.current);\n window.clearTimeout(skipDelayTimerRef.current);\n };\n }, []);\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuProvider, {\n scope: __scopeNavigationMenu,\n isRootMenu: true,\n value: value1,\n dir: direction,\n orientation: orientation,\n rootNavigationMenu: navigationMenu,\n onTriggerEnter: (itemValue)=>{\n window.clearTimeout(openTimerRef.current);\n if (isOpenDelayed) handleDelayedOpen(itemValue);\n else handleOpen(itemValue);\n },\n onTriggerLeave: ()=>{\n window.clearTimeout(openTimerRef.current);\n startCloseTimer();\n },\n onContentEnter: ()=>window.clearTimeout(closeTimerRef.current)\n ,\n onContentLeave: startCloseTimer,\n onItemSelect: (itemValue)=>{\n setValue((prevValue)=>prevValue === itemValue ? '' : itemValue\n );\n },\n onItemDismiss: ()=>setValue('')\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.nav, $yHMN2$babelruntimehelpersesmextends({\n \"aria-label\": \"Main\",\n \"data-orientation\": orientation,\n dir: direction\n }, NavigationMenuProps, {\n ref: composedRef\n })));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$5b2278cf1e8bcae2, {\n displayName: $322c88a641701f3b$var$NAVIGATION_MENU_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuSub\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$SUB_NAME = 'NavigationMenuSub';\nconst $322c88a641701f3b$export$5958edd6c4ee7c79 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , value: valueProp , onValueChange: onValueChange , defaultValue: defaultValue , orientation: orientation = 'horizontal' , ...subProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$SUB_NAME, __scopeNavigationMenu);\n const [value = '', setValue] = $yHMN2$useControllableState({\n prop: valueProp,\n onChange: onValueChange,\n defaultProp: defaultValue\n });\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuProvider, {\n scope: __scopeNavigationMenu,\n isRootMenu: false,\n value: value,\n dir: context.dir,\n orientation: orientation,\n rootNavigationMenu: context.rootNavigationMenu,\n onTriggerEnter: (itemValue)=>setValue(itemValue)\n ,\n onItemSelect: (itemValue)=>setValue(itemValue)\n ,\n onItemDismiss: ()=>setValue('')\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.div, $yHMN2$babelruntimehelpersesmextends({\n \"data-orientation\": orientation\n }, subProps, {\n ref: forwardedRef\n })));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$5958edd6c4ee7c79, {\n displayName: $322c88a641701f3b$var$SUB_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$NavigationMenuProvider = (props)=>{\n const { scope: scope , isRootMenu: isRootMenu , rootNavigationMenu: rootNavigationMenu , dir: dir , orientation: orientation , children: children , value: value , onItemSelect: onItemSelect , onItemDismiss: onItemDismiss , onTriggerEnter: onTriggerEnter , onTriggerLeave: onTriggerLeave , onContentEnter: onContentEnter , onContentLeave: onContentLeave } = props;\n const [viewport, setViewport] = $yHMN2$useState(null);\n const [viewportContent, setViewportContent] = $yHMN2$useState(new Map());\n const [indicatorTrack, setIndicatorTrack] = $yHMN2$useState(null);\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuProviderImpl, {\n scope: scope,\n isRootMenu: isRootMenu,\n rootNavigationMenu: rootNavigationMenu,\n value: value,\n previousValue: $yHMN2$usePrevious(value),\n baseId: $yHMN2$useId(),\n dir: dir,\n orientation: orientation,\n viewport: viewport,\n onViewportChange: setViewport,\n indicatorTrack: indicatorTrack,\n onIndicatorTrackChange: setIndicatorTrack,\n onTriggerEnter: $yHMN2$useCallbackRef(onTriggerEnter),\n onTriggerLeave: $yHMN2$useCallbackRef(onTriggerLeave),\n onContentEnter: $yHMN2$useCallbackRef(onContentEnter),\n onContentLeave: $yHMN2$useCallbackRef(onContentLeave),\n onItemSelect: $yHMN2$useCallbackRef(onItemSelect),\n onItemDismiss: $yHMN2$useCallbackRef(onItemDismiss),\n onViewportContentChange: $yHMN2$useCallback((contentValue, contentData)=>{\n setViewportContent((prevContent)=>{\n prevContent.set(contentValue, contentData);\n return new Map(prevContent);\n });\n }, []),\n onViewportContentRemove: $yHMN2$useCallback((contentValue)=>{\n setViewportContent((prevContent)=>{\n if (!prevContent.has(contentValue)) return prevContent;\n prevContent.delete(contentValue);\n return new Map(prevContent);\n });\n }, [])\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$Collection.Provider, {\n scope: scope\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$ViewportContentProvider, {\n scope: scope,\n items: viewportContent\n }, children)));\n};\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuList\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$LIST_NAME = 'NavigationMenuList';\nconst $322c88a641701f3b$export$c361068a95fd2286 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , ...listProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$LIST_NAME, __scopeNavigationMenu);\n const list = /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.ul, $yHMN2$babelruntimehelpersesmextends({\n \"data-orientation\": context.orientation\n }, listProps, {\n ref: forwardedRef\n }));\n return /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.div, {\n style: {\n position: 'relative'\n },\n ref: context.onIndicatorTrackChange\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$Collection.Slot, {\n scope: __scopeNavigationMenu\n }, context.isRootMenu ? /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroup, {\n asChild: true\n }, list) : list));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$c361068a95fd2286, {\n displayName: $322c88a641701f3b$var$LIST_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuItem\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$ITEM_NAME = 'NavigationMenuItem';\nconst [$322c88a641701f3b$var$NavigationMenuItemContextProvider, $322c88a641701f3b$var$useNavigationMenuItemContext] = $322c88a641701f3b$var$createNavigationMenuContext($322c88a641701f3b$var$ITEM_NAME);\nconst $322c88a641701f3b$export$ffdbb83a2de845c2 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , value: valueProp , ...itemProps } = props;\n const autoValue = $yHMN2$useId(); // We need to provide an initial deterministic value as `useId` will return\n // empty string on the first render and we don't want to match our internal \"closed\" value.\n const value = valueProp || autoValue || 'LEGACY_REACT_AUTO_VALUE';\n const contentRef = $yHMN2$useRef(null);\n const triggerRef = $yHMN2$useRef(null);\n const focusProxyRef = $yHMN2$useRef(null);\n const restoreContentTabOrderRef = $yHMN2$useRef(()=>{});\n const wasEscapeCloseRef = $yHMN2$useRef(false);\n const handleContentEntry = $yHMN2$useCallback((side = 'start')=>{\n if (contentRef.current) {\n restoreContentTabOrderRef.current();\n const candidates = $322c88a641701f3b$var$getTabbableCandidates(contentRef.current);\n if (candidates.length) $322c88a641701f3b$var$focusFirst(side === 'start' ? candidates : candidates.reverse());\n }\n }, []);\n const handleContentExit = $yHMN2$useCallback(()=>{\n if (contentRef.current) {\n const candidates = $322c88a641701f3b$var$getTabbableCandidates(contentRef.current);\n if (candidates.length) restoreContentTabOrderRef.current = $322c88a641701f3b$var$removeFromTabOrder(candidates);\n }\n }, []);\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuItemContextProvider, {\n scope: __scopeNavigationMenu,\n value: value,\n triggerRef: triggerRef,\n contentRef: contentRef,\n focusProxyRef: focusProxyRef,\n wasEscapeCloseRef: wasEscapeCloseRef,\n onEntryKeyDown: handleContentEntry,\n onFocusProxyEnter: handleContentEntry,\n onRootContentClose: handleContentExit,\n onContentFocusOutside: handleContentExit\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.li, $yHMN2$babelruntimehelpersesmextends({}, itemProps, {\n ref: forwardedRef\n })));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$ffdbb83a2de845c2, {\n displayName: $322c88a641701f3b$var$ITEM_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuTrigger\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$TRIGGER_NAME = 'NavigationMenuTrigger';\nconst $322c88a641701f3b$export$37fe8002734d8f2 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , disabled: disabled , ...triggerProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$TRIGGER_NAME, props.__scopeNavigationMenu);\n const itemContext = $322c88a641701f3b$var$useNavigationMenuItemContext($322c88a641701f3b$var$TRIGGER_NAME, props.__scopeNavigationMenu);\n const ref = $yHMN2$useRef(null);\n const composedRefs = $yHMN2$useComposedRefs(ref, itemContext.triggerRef, forwardedRef);\n const triggerId = $322c88a641701f3b$var$makeTriggerId(context.baseId, itemContext.value);\n const contentId = $322c88a641701f3b$var$makeContentId(context.baseId, itemContext.value);\n const hasPointerMoveOpenedRef = $yHMN2$useRef(false);\n const wasClickCloseRef = $yHMN2$useRef(false);\n const open = itemContext.value === context.value;\n return /*#__PURE__*/ $yHMN2$createElement($yHMN2$Fragment, null, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$Collection.ItemSlot, {\n scope: __scopeNavigationMenu,\n value: itemContext.value\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroupItem, {\n asChild: true\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.button, $yHMN2$babelruntimehelpersesmextends({\n id: triggerId,\n disabled: disabled,\n \"data-disabled\": disabled ? '' : undefined,\n \"data-state\": $322c88a641701f3b$var$getOpenState(open),\n \"aria-expanded\": open,\n \"aria-controls\": contentId\n }, triggerProps, {\n ref: composedRefs,\n onPointerEnter: $yHMN2$composeEventHandlers(props.onPointerEnter, ()=>{\n wasClickCloseRef.current = false;\n itemContext.wasEscapeCloseRef.current = false;\n }),\n onPointerMove: $yHMN2$composeEventHandlers(props.onPointerMove, $322c88a641701f3b$var$whenMouse(()=>{\n if (disabled || wasClickCloseRef.current || itemContext.wasEscapeCloseRef.current || hasPointerMoveOpenedRef.current) return;\n context.onTriggerEnter(itemContext.value);\n hasPointerMoveOpenedRef.current = true;\n })),\n onPointerLeave: $yHMN2$composeEventHandlers(props.onPointerLeave, $322c88a641701f3b$var$whenMouse(()=>{\n if (disabled) return;\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n })),\n onClick: $yHMN2$composeEventHandlers(props.onClick, ()=>{\n context.onItemSelect(itemContext.value);\n wasClickCloseRef.current = open;\n }),\n onKeyDown: $yHMN2$composeEventHandlers(props.onKeyDown, (event)=>{\n const verticalEntryKey = context.dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight';\n const entryKey = {\n horizontal: 'ArrowDown',\n vertical: verticalEntryKey\n }[context.orientation];\n if (open && event.key === entryKey) {\n itemContext.onEntryKeyDown(); // Prevent FocusGroupItem from handling the event\n event.preventDefault();\n }\n })\n })))), open && /*#__PURE__*/ $yHMN2$createElement($yHMN2$Fragment, null, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Root, {\n \"aria-hidden\": true,\n tabIndex: 0,\n ref: itemContext.focusProxyRef,\n onFocus: (event)=>{\n const content = itemContext.contentRef.current;\n const prevFocusedElement = event.relatedTarget;\n const wasTriggerFocused = prevFocusedElement === ref.current;\n const wasFocusFromContent = content === null || content === void 0 ? void 0 : content.contains(prevFocusedElement);\n if (wasTriggerFocused || !wasFocusFromContent) itemContext.onFocusProxyEnter(wasTriggerFocused ? 'start' : 'end');\n }\n }), context.viewport && /*#__PURE__*/ $yHMN2$createElement(\"span\", {\n \"aria-owns\": contentId\n })));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$37fe8002734d8f2, {\n displayName: $322c88a641701f3b$var$TRIGGER_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuLink\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$LINK_NAME = 'NavigationMenuLink';\nconst $322c88a641701f3b$var$LINK_SELECT = 'navigationMenu.linkSelect';\nconst $322c88a641701f3b$export$6893bf21536567da = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , active: active , onSelect: onSelect , ...linkProps } = props;\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroupItem, {\n asChild: true\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.a, $yHMN2$babelruntimehelpersesmextends({\n \"data-active\": active ? '' : undefined,\n \"aria-current\": active ? 'page' : undefined\n }, linkProps, {\n ref: forwardedRef,\n onClick: $yHMN2$composeEventHandlers(props.onClick, (event1)=>{\n const target = event1.target;\n const linkSelectEvent = new CustomEvent($322c88a641701f3b$var$LINK_SELECT, {\n bubbles: true,\n cancelable: true\n });\n target.addEventListener($322c88a641701f3b$var$LINK_SELECT, (event)=>onSelect === null || onSelect === void 0 ? void 0 : onSelect(event)\n , {\n once: true\n });\n $yHMN2$dispatchDiscreteCustomEvent(target, linkSelectEvent);\n if (!linkSelectEvent.defaultPrevented && !event1.metaKey) {\n const rootContentDismissEvent = new CustomEvent($322c88a641701f3b$var$ROOT_CONTENT_DISMISS, {\n bubbles: true,\n cancelable: true\n });\n $yHMN2$dispatchDiscreteCustomEvent(target, rootContentDismissEvent);\n }\n }, {\n checkForDefaultPrevented: false\n })\n })));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$6893bf21536567da, {\n displayName: $322c88a641701f3b$var$LINK_NAME\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuIndicator\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$INDICATOR_NAME = 'NavigationMenuIndicator';\nconst $322c88a641701f3b$export$8ddb526647c0d8fb = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { forceMount: forceMount , ...indicatorProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$INDICATOR_NAME, props.__scopeNavigationMenu);\n const isVisible = Boolean(context.value);\n return context.indicatorTrack ? /*#__PURE__*/ $yHMN2$reactdom.createPortal(/*#__PURE__*/ $yHMN2$createElement($yHMN2$Presence, {\n present: forceMount || isVisible\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuIndicatorImpl, $yHMN2$babelruntimehelpersesmextends({}, indicatorProps, {\n ref: forwardedRef\n }))), context.indicatorTrack) : null;\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$8ddb526647c0d8fb, {\n displayName: $322c88a641701f3b$var$INDICATOR_NAME\n});\nconst $322c88a641701f3b$var$NavigationMenuIndicatorImpl = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , ...indicatorProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$INDICATOR_NAME, __scopeNavigationMenu);\n const getItems = $322c88a641701f3b$var$useCollection(__scopeNavigationMenu);\n const [activeTrigger, setActiveTrigger] = $yHMN2$useState(null);\n const [position, setPosition] = $yHMN2$useState(null);\n const isHorizontal = context.orientation === 'horizontal';\n const isVisible = Boolean(context.value);\n $yHMN2$useEffect(()=>{\n var _items$find;\n const items = getItems();\n const triggerNode = (_items$find = items.find((item)=>item.value === context.value\n )) === null || _items$find === void 0 ? void 0 : _items$find.ref.current;\n if (triggerNode) setActiveTrigger(triggerNode);\n }, [\n getItems,\n context.value\n ]);\n /**\n * Update position when the indicator or parent track size changes\n */ const handlePositionChange = ()=>{\n if (activeTrigger) setPosition({\n size: isHorizontal ? activeTrigger.offsetWidth : activeTrigger.offsetHeight,\n offset: isHorizontal ? activeTrigger.offsetLeft : activeTrigger.offsetTop\n });\n };\n $322c88a641701f3b$var$useResizeObserver(activeTrigger, handlePositionChange);\n $322c88a641701f3b$var$useResizeObserver(context.indicatorTrack, handlePositionChange); // We need to wait for the indicator position to be available before rendering to\n // snap immediately into position rather than transitioning from initial\n return position ? /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.div, $yHMN2$babelruntimehelpersesmextends({\n \"aria-hidden\": true,\n \"data-state\": isVisible ? 'visible' : 'hidden',\n \"data-orientation\": context.orientation\n }, indicatorProps, {\n ref: forwardedRef,\n style: {\n position: 'absolute',\n ...isHorizontal ? {\n left: 0,\n width: position.size + 'px',\n transform: `translateX(${position.offset}px)`\n } : {\n top: 0,\n height: position.size + 'px',\n transform: `translateY(${position.offset}px)`\n },\n ...indicatorProps.style\n }\n })) : null;\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuContent\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$CONTENT_NAME = 'NavigationMenuContent';\nconst $322c88a641701f3b$export$38e00e996c2f93f7 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { forceMount: forceMount , ...contentProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$CONTENT_NAME, props.__scopeNavigationMenu);\n const itemContext = $322c88a641701f3b$var$useNavigationMenuItemContext($322c88a641701f3b$var$CONTENT_NAME, props.__scopeNavigationMenu);\n const composedRefs = $yHMN2$useComposedRefs(itemContext.contentRef, forwardedRef);\n const open = itemContext.value === context.value;\n const commonProps = {\n value: itemContext.value,\n triggerRef: itemContext.triggerRef,\n focusProxyRef: itemContext.focusProxyRef,\n wasEscapeCloseRef: itemContext.wasEscapeCloseRef,\n onContentFocusOutside: itemContext.onContentFocusOutside,\n onRootContentClose: itemContext.onRootContentClose,\n ...contentProps\n };\n return !context.viewport ? /*#__PURE__*/ $yHMN2$createElement($yHMN2$Presence, {\n present: forceMount || open\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuContentImpl, $yHMN2$babelruntimehelpersesmextends({\n \"data-state\": $322c88a641701f3b$var$getOpenState(open)\n }, commonProps, {\n ref: composedRefs,\n onPointerEnter: $yHMN2$composeEventHandlers(props.onPointerEnter, context.onContentEnter),\n onPointerLeave: $yHMN2$composeEventHandlers(props.onPointerLeave, $322c88a641701f3b$var$whenMouse(context.onContentLeave)),\n style: {\n // Prevent interaction when animating out\n pointerEvents: !open && context.isRootMenu ? 'none' : undefined,\n ...commonProps.style\n }\n }))) : /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$ViewportContentMounter, $yHMN2$babelruntimehelpersesmextends({\n forceMount: forceMount\n }, commonProps, {\n ref: composedRefs\n }));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$38e00e996c2f93f7, {\n displayName: $322c88a641701f3b$var$CONTENT_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$ViewportContentMounter = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$CONTENT_NAME, props.__scopeNavigationMenu);\n const { onViewportContentChange: onViewportContentChange , onViewportContentRemove: onViewportContentRemove } = context;\n $yHMN2$useLayoutEffect(()=>{\n onViewportContentChange(props.value, {\n ref: forwardedRef,\n ...props\n });\n }, [\n props,\n forwardedRef,\n onViewportContentChange\n ]);\n $yHMN2$useLayoutEffect(()=>{\n return ()=>onViewportContentRemove(props.value)\n ;\n }, [\n props.value,\n onViewportContentRemove\n ]); // Content is proxied into the viewport\n return null;\n});\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$ROOT_CONTENT_DISMISS = 'navigationMenu.rootContentDismiss';\nconst $322c88a641701f3b$var$NavigationMenuContentImpl = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , value: value , triggerRef: triggerRef , focusProxyRef: focusProxyRef , wasEscapeCloseRef: wasEscapeCloseRef , onRootContentClose: onRootContentClose , onContentFocusOutside: onContentFocusOutside , ...contentProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$CONTENT_NAME, __scopeNavigationMenu);\n const ref = $yHMN2$useRef(null);\n const composedRefs = $yHMN2$useComposedRefs(ref, forwardedRef);\n const triggerId = $322c88a641701f3b$var$makeTriggerId(context.baseId, value);\n const contentId = $322c88a641701f3b$var$makeContentId(context.baseId, value);\n const getItems = $322c88a641701f3b$var$useCollection(__scopeNavigationMenu);\n const prevMotionAttributeRef = $yHMN2$useRef(null);\n const { onItemDismiss: onItemDismiss } = context;\n $yHMN2$useEffect(()=>{\n const content = ref.current; // Bubble dismiss to the root content node and focus its trigger\n if (context.isRootMenu && content) {\n const handleClose = ()=>{\n var _triggerRef$current;\n onItemDismiss();\n onRootContentClose();\n if (content.contains(document.activeElement)) (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 || _triggerRef$current.focus();\n };\n content.addEventListener($322c88a641701f3b$var$ROOT_CONTENT_DISMISS, handleClose);\n return ()=>content.removeEventListener($322c88a641701f3b$var$ROOT_CONTENT_DISMISS, handleClose)\n ;\n }\n }, [\n context.isRootMenu,\n props.value,\n triggerRef,\n onItemDismiss,\n onRootContentClose\n ]);\n const motionAttribute = $yHMN2$useMemo(()=>{\n const items = getItems();\n const values = items.map((item)=>item.value\n );\n if (context.dir === 'rtl') values.reverse();\n const index = values.indexOf(context.value);\n const prevIndex = values.indexOf(context.previousValue);\n const isSelected = value === context.value;\n const wasSelected = prevIndex === values.indexOf(value); // We only want to update selected and the last selected content\n // this avoids animations being interrupted outside of that range\n if (!isSelected && !wasSelected) return prevMotionAttributeRef.current;\n const attribute = (()=>{\n // Don't provide a direction on the initial open\n if (index !== prevIndex) {\n // If we're moving to this item from another\n if (isSelected && prevIndex !== -1) return index > prevIndex ? 'from-end' : 'from-start'; // If we're leaving this item for another\n if (wasSelected && index !== -1) return index > prevIndex ? 'to-start' : 'to-end';\n } // Otherwise we're entering from closed or leaving the list\n // entirely and should not animate in any direction\n return null;\n })();\n prevMotionAttributeRef.current = attribute;\n return attribute;\n }, [\n context.previousValue,\n context.value,\n context.dir,\n getItems,\n value\n ]);\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroup, {\n asChild: true\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$DismissableLayer, $yHMN2$babelruntimehelpersesmextends({\n id: contentId,\n \"aria-labelledby\": triggerId,\n \"data-motion\": motionAttribute,\n \"data-orientation\": context.orientation\n }, contentProps, {\n ref: composedRefs,\n onDismiss: ()=>{\n var _ref$current;\n const rootContentDismissEvent = new Event($322c88a641701f3b$var$ROOT_CONTENT_DISMISS, {\n bubbles: true,\n cancelable: true\n });\n (_ref$current = ref.current) === null || _ref$current === void 0 || _ref$current.dispatchEvent(rootContentDismissEvent);\n },\n onFocusOutside: $yHMN2$composeEventHandlers(props.onFocusOutside, (event)=>{\n var _context$rootNavigati;\n onContentFocusOutside();\n const target = event.target; // Only dismiss content when focus moves outside of the menu\n if ((_context$rootNavigati = context.rootNavigationMenu) !== null && _context$rootNavigati !== void 0 && _context$rootNavigati.contains(target)) event.preventDefault();\n }),\n onPointerDownOutside: $yHMN2$composeEventHandlers(props.onPointerDownOutside, (event)=>{\n var _context$viewport;\n const target = event.target;\n const isTrigger = getItems().some((item)=>{\n var _item$ref$current;\n return (_item$ref$current = item.ref.current) === null || _item$ref$current === void 0 ? void 0 : _item$ref$current.contains(target);\n });\n const isRootViewport = context.isRootMenu && ((_context$viewport = context.viewport) === null || _context$viewport === void 0 ? void 0 : _context$viewport.contains(target));\n if (isTrigger || isRootViewport || !context.isRootMenu) event.preventDefault();\n }),\n onKeyDown: $yHMN2$composeEventHandlers(props.onKeyDown, (event)=>{\n const isMetaKey = event.altKey || event.ctrlKey || event.metaKey;\n const isTabKey = event.key === 'Tab' && !isMetaKey;\n if (isTabKey) {\n const candidates = $322c88a641701f3b$var$getTabbableCandidates(event.currentTarget);\n const focusedElement = document.activeElement;\n const index = candidates.findIndex((candidate)=>candidate === focusedElement\n );\n const isMovingBackwards = event.shiftKey;\n const nextCandidates = isMovingBackwards ? candidates.slice(0, index).reverse() : candidates.slice(index + 1, candidates.length);\n if ($322c88a641701f3b$var$focusFirst(nextCandidates)) // prevent browser tab keydown because we've handled focus\n event.preventDefault();\n else {\n var _focusProxyRef$curren;\n // If we can't focus that means we're at the edges\n // so focus the proxy and let browser handle\n // tab/shift+tab keypress on the proxy instead\n (_focusProxyRef$curren = focusProxyRef.current) === null || _focusProxyRef$curren === void 0 || _focusProxyRef$curren.focus();\n }\n }\n }),\n onEscapeKeyDown: $yHMN2$composeEventHandlers(props.onEscapeKeyDown, (event)=>{\n // prevent the dropdown from reopening\n // after the escape key has been pressed\n wasEscapeCloseRef.current = true;\n })\n })));\n});\n/* -------------------------------------------------------------------------------------------------\n * NavigationMenuViewport\n * -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$VIEWPORT_NAME = 'NavigationMenuViewport';\nconst $322c88a641701f3b$export$ee880b97cc6d44a5 = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { forceMount: forceMount , ...viewportProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$VIEWPORT_NAME, props.__scopeNavigationMenu);\n const open = Boolean(context.value);\n return /*#__PURE__*/ $yHMN2$createElement($yHMN2$Presence, {\n present: forceMount || open\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuViewportImpl, $yHMN2$babelruntimehelpersesmextends({}, viewportProps, {\n ref: forwardedRef\n })));\n});\n/*#__PURE__*/ Object.assign($322c88a641701f3b$export$ee880b97cc6d44a5, {\n displayName: $322c88a641701f3b$var$VIEWPORT_NAME\n});\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$NavigationMenuViewportImpl = /*#__PURE__*/ $yHMN2$forwardRef((props1, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , children: children , ...viewportImplProps } = props1;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$VIEWPORT_NAME, __scopeNavigationMenu);\n const composedRefs = $yHMN2$useComposedRefs(forwardedRef, context.onViewportChange);\n const viewportContentContext = $322c88a641701f3b$var$useViewportContentContext($322c88a641701f3b$var$CONTENT_NAME, props1.__scopeNavigationMenu);\n const [size, setSize] = $yHMN2$useState(null);\n const [content, setContent] = $yHMN2$useState(null);\n const viewportWidth = size ? (size === null || size === void 0 ? void 0 : size.width) + 'px' : undefined;\n const viewportHeight = size ? (size === null || size === void 0 ? void 0 : size.height) + 'px' : undefined;\n const open = Boolean(context.value); // We persist the last active content value as the viewport may be animating out\n // and we want the content to remain mounted for the lifecycle of the viewport.\n const activeContentValue = open ? context.value : context.previousValue;\n /**\n * Update viewport size to match the active content node.\n * We prefer offset dimensions over `getBoundingClientRect` as the latter respects CSS transform.\n * For example, if content animates in from `scale(0.5)` the dimensions would be anything\n * from `0.5` to `1` of the intended size.\n */ const handleSizeChange = ()=>{\n if (content) setSize({\n width: content.offsetWidth,\n height: content.offsetHeight\n });\n };\n $322c88a641701f3b$var$useResizeObserver(content, handleSizeChange);\n return /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.div, $yHMN2$babelruntimehelpersesmextends({\n \"data-state\": $322c88a641701f3b$var$getOpenState(open),\n \"data-orientation\": context.orientation\n }, viewportImplProps, {\n ref: composedRefs,\n style: {\n // Prevent interaction when animating out\n pointerEvents: !open && context.isRootMenu ? 'none' : undefined,\n ['--radix-navigation-menu-viewport-width']: viewportWidth,\n ['--radix-navigation-menu-viewport-height']: viewportHeight,\n ...viewportImplProps.style\n },\n onPointerEnter: $yHMN2$composeEventHandlers(props1.onPointerEnter, context.onContentEnter),\n onPointerLeave: $yHMN2$composeEventHandlers(props1.onPointerLeave, $322c88a641701f3b$var$whenMouse(context.onContentLeave))\n }), Array.from(viewportContentContext.items).map(([value, { ref: ref , forceMount: forceMount , ...props }])=>{\n const isActive = activeContentValue === value;\n return /*#__PURE__*/ $yHMN2$createElement($yHMN2$Presence, {\n key: value,\n present: forceMount || isActive\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$NavigationMenuContentImpl, $yHMN2$babelruntimehelpersesmextends({}, props, {\n ref: $yHMN2$composeRefs(ref, (node)=>{\n // We only want to update the stored node when another is available\n // as we need to smoothly transition between them.\n if (isActive && node) setContent(node);\n })\n })));\n }));\n});\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$FOCUS_GROUP_NAME = 'FocusGroup';\nconst $322c88a641701f3b$var$FocusGroup = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , ...groupProps } = props;\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$FOCUS_GROUP_NAME, __scopeNavigationMenu);\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroupCollection.Provider, {\n scope: __scopeNavigationMenu\n }, /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroupCollection.Slot, {\n scope: __scopeNavigationMenu\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.div, $yHMN2$babelruntimehelpersesmextends({\n dir: context.dir\n }, groupProps, {\n ref: forwardedRef\n }))));\n});\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$var$ARROW_KEYS = [\n 'ArrowRight',\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowDown'\n];\nconst $322c88a641701f3b$var$FOCUS_GROUP_ITEM_NAME = 'FocusGroupItem';\nconst $322c88a641701f3b$var$FocusGroupItem = /*#__PURE__*/ $yHMN2$forwardRef((props, forwardedRef)=>{\n const { __scopeNavigationMenu: __scopeNavigationMenu , ...groupProps } = props;\n const getItems = $322c88a641701f3b$var$useFocusGroupCollection(__scopeNavigationMenu);\n const context = $322c88a641701f3b$var$useNavigationMenuContext($322c88a641701f3b$var$FOCUS_GROUP_ITEM_NAME, __scopeNavigationMenu);\n return /*#__PURE__*/ $yHMN2$createElement($322c88a641701f3b$var$FocusGroupCollection.ItemSlot, {\n scope: __scopeNavigationMenu\n }, /*#__PURE__*/ $yHMN2$createElement($yHMN2$Primitive.button, $yHMN2$babelruntimehelpersesmextends({}, groupProps, {\n ref: forwardedRef,\n onKeyDown: $yHMN2$composeEventHandlers(props.onKeyDown, (event)=>{\n const isFocusNavigationKey = [\n 'Home',\n 'End',\n ...$322c88a641701f3b$var$ARROW_KEYS\n ].includes(event.key);\n if (isFocusNavigationKey) {\n let candidateNodes = getItems().map((item)=>item.ref.current\n );\n const prevItemKey = context.dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft';\n const prevKeys = [\n prevItemKey,\n 'ArrowUp',\n 'End'\n ];\n if (prevKeys.includes(event.key)) candidateNodes.reverse();\n if ($322c88a641701f3b$var$ARROW_KEYS.includes(event.key)) {\n const currentIndex = candidateNodes.indexOf(event.currentTarget);\n candidateNodes = candidateNodes.slice(currentIndex + 1);\n }\n /**\n * Imperative focus during keydown is risky so we prevent React's batching updates\n * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332\n */ setTimeout(()=>$322c88a641701f3b$var$focusFirst(candidateNodes)\n ); // Prevent page scroll while navigating\n event.preventDefault();\n }\n })\n })));\n});\n/**\n * Returns a list of potential tabbable candidates.\n *\n * NOTE: This is only a close approximation. For example it doesn't take into account cases like when\n * elements are not visible. This cannot be worked out easily by just reading a property, but rather\n * necessitate runtime knowledge (computed styles, etc). We deal with these cases separately.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker\n * Credit: https://github.com/discord/focus-layers/blob/master/src/util/wrapFocus.tsx#L1\n */ function $322c88a641701f3b$var$getTabbableCandidates(container) {\n const nodes = [];\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: (node)=>{\n const isHiddenInput = node.tagName === 'INPUT' && node.type === 'hidden';\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP; // `.tabIndex` is not the same as the `tabindex` attribute. It works on the\n // runtime's understanding of tabbability, so this automatically accounts\n // for any kind of element that could be tabbed to.\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }\n });\n while(walker.nextNode())nodes.push(walker.currentNode); // we do not take into account the order of nodes with positive `tabIndex` as it\n // hinders accessibility to have tab order different from visual order.\n return nodes;\n}\nfunction $322c88a641701f3b$var$focusFirst(candidates) {\n const previouslyFocusedElement = document.activeElement;\n return candidates.some((candidate)=>{\n // if focus is already where we want to go, we don't want to keep going through the candidates\n if (candidate === previouslyFocusedElement) return true;\n candidate.focus();\n return document.activeElement !== previouslyFocusedElement;\n });\n}\nfunction $322c88a641701f3b$var$removeFromTabOrder(candidates) {\n candidates.forEach((candidate)=>{\n candidate.dataset.tabindex = candidate.getAttribute('tabindex') || '';\n candidate.setAttribute('tabindex', '-1');\n });\n return ()=>{\n candidates.forEach((candidate)=>{\n const prevTabIndex = candidate.dataset.tabindex;\n candidate.setAttribute('tabindex', prevTabIndex);\n });\n };\n}\nfunction $322c88a641701f3b$var$useResizeObserver(element, onResize) {\n const handleResize = $yHMN2$useCallbackRef(onResize);\n $yHMN2$useLayoutEffect(()=>{\n let rAF = 0;\n if (element) {\n /**\n * Resize Observer will throw an often benign error that says `ResizeObserver loop\n * completed with undelivered notifications`. This means that ResizeObserver was not\n * able to deliver all observations within a single animation frame, so we use\n * `requestAnimationFrame` to ensure we don't deliver unnecessary observations.\n * Further reading: https://github.com/WICG/resize-observer/issues/38\n */ const resizeObserver = new ResizeObserver(()=>{\n cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(handleResize);\n });\n resizeObserver.observe(element);\n return ()=>{\n window.cancelAnimationFrame(rAF);\n resizeObserver.unobserve(element);\n };\n }\n }, [\n element,\n handleResize\n ]);\n}\nfunction $322c88a641701f3b$var$getOpenState(open) {\n return open ? 'open' : 'closed';\n}\nfunction $322c88a641701f3b$var$makeTriggerId(baseId, value) {\n return `${baseId}-trigger-${value}`;\n}\nfunction $322c88a641701f3b$var$makeContentId(baseId, value) {\n return `${baseId}-content-${value}`;\n}\nfunction $322c88a641701f3b$var$whenMouse(handler) {\n return (event)=>event.pointerType === 'mouse' ? handler(event) : undefined\n ;\n}\n/* -----------------------------------------------------------------------------------------------*/ const $322c88a641701f3b$export$be92b6f5f03c0fe9 = $322c88a641701f3b$export$5b2278cf1e8bcae2;\nconst $322c88a641701f3b$export$d7a01e11500dfb6f = $322c88a641701f3b$export$5958edd6c4ee7c79;\nconst $322c88a641701f3b$export$54c2e3dc7acea9f5 = $322c88a641701f3b$export$c361068a95fd2286;\nconst $322c88a641701f3b$export$6d08773d2e66f8f2 = $322c88a641701f3b$export$ffdbb83a2de845c2;\nconst $322c88a641701f3b$export$41fb9f06171c75f4 = $322c88a641701f3b$export$37fe8002734d8f2;\nconst $322c88a641701f3b$export$a6c7ac8248d6e38a = $322c88a641701f3b$export$6893bf21536567da;\nconst $322c88a641701f3b$export$adb584737d712b70 = $322c88a641701f3b$export$8ddb526647c0d8fb;\nconst $322c88a641701f3b$export$7c6e2c02157bb7d2 = $322c88a641701f3b$export$38e00e996c2f93f7;\nconst $322c88a641701f3b$export$d5c6c08dc2d3ca7 = $322c88a641701f3b$export$ee880b97cc6d44a5;\n\n\n\n\nexport {$322c88a641701f3b$export$fb8ea5af8c9fcdf0 as createNavigationMenuScope, $322c88a641701f3b$export$5b2278cf1e8bcae2 as NavigationMenu, $322c88a641701f3b$export$5958edd6c4ee7c79 as NavigationMenuSub, $322c88a641701f3b$export$c361068a95fd2286 as NavigationMenuList, $322c88a641701f3b$export$ffdbb83a2de845c2 as NavigationMenuItem, $322c88a641701f3b$export$37fe8002734d8f2 as NavigationMenuTrigger, $322c88a641701f3b$export$6893bf21536567da as NavigationMenuLink, $322c88a641701f3b$export$8ddb526647c0d8fb as NavigationMenuIndicator, $322c88a641701f3b$export$38e00e996c2f93f7 as NavigationMenuContent, $322c88a641701f3b$export$ee880b97cc6d44a5 as NavigationMenuViewport, $322c88a641701f3b$export$be92b6f5f03c0fe9 as Root, $322c88a641701f3b$export$d7a01e11500dfb6f as Sub, $322c88a641701f3b$export$54c2e3dc7acea9f5 as List, $322c88a641701f3b$export$6d08773d2e66f8f2 as Item, $322c88a641701f3b$export$41fb9f06171c75f4 as Trigger, $322c88a641701f3b$export$a6c7ac8248d6e38a as Link, $322c88a641701f3b$export$adb584737d712b70 as Indicator, $322c88a641701f3b$export$7c6e2c02157bb7d2 as Content, $322c88a641701f3b$export$d5c6c08dc2d3ca7 as Viewport};\n//# sourceMappingURL=index.mjs.map\n","import { useState, useEffect } from 'react';\n\nfunction getWindowDimensions() {\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height,\n };\n}\n\nexport function useWindowDimensions() {\n const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return windowDimensions;\n}\n","export const BREAKPOINTS = ['xsmall', 'small', 'medium', 'large', 'xlarge'] as const;\nexport type Breakpoint = (typeof BREAKPOINTS)[number];\n","import { useEffect, useState } from 'react';\n\nimport { useWindowDimensions } from './useWindowDimensions';\nimport { BREAKPOINTS } from './lib/contants';\n\nexport function useBreakpoint() {\n const [breakpoint, setBreakpoint] = useState({ name: '', value: 0 });\n const { width } = useWindowDimensions();\n\n useEffect(() => {\n const breakpoints = BREAKPOINTS.map((breakpointName) => ({\n name: breakpointName,\n value:\n parseInt(\n getComputedStyle(document.documentElement).getPropertyValue(\n `--slate-size-breakpoint-${breakpointName}`,\n ),\n 10,\n ) || 0,\n }));\n\n if (width < breakpoints[0].value) {\n setBreakpoint(breakpoints[0]);\n return;\n }\n\n const index = breakpoints.findIndex(({ value }) => value > width);\n\n setBreakpoint(breakpoints[index - 1] || breakpoints[breakpoints.length - 1]);\n }, [width]);\n\n return breakpoint;\n}\n","/*! @license DOMPurify 3.1.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.4/LICENSE */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMPurify = factory());\n})(this, (function () { 'use strict';\n\n const {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n } = Object;\n let {\n freeze,\n seal,\n create\n } = Object; // eslint-disable-line import/no-mutable-exports\n let {\n apply,\n construct\n } = typeof Reflect !== 'undefined' && Reflect;\n if (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n }\n if (!seal) {\n seal = function seal(x) {\n return x;\n };\n }\n if (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n }\n if (!construct) {\n construct = function construct(Func, args) {\n return new Func(...args);\n };\n }\n const arrayForEach = unapply(Array.prototype.forEach);\n const arrayPop = unapply(Array.prototype.pop);\n const arrayPush = unapply(Array.prototype.push);\n const stringToLowerCase = unapply(String.prototype.toLowerCase);\n const stringToString = unapply(String.prototype.toString);\n const stringMatch = unapply(String.prototype.match);\n const stringReplace = unapply(String.prototype.replace);\n const stringIndexOf = unapply(String.prototype.indexOf);\n const stringTrim = unapply(String.prototype.trim);\n const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\n const regExpTest = unapply(RegExp.prototype.test);\n const typeErrorCreate = unconstruct(TypeError);\n function numberIsNaN(x) {\n // eslint-disable-next-line unicorn/prefer-number-properties\n return typeof x === 'number' && isNaN(x);\n }\n\n /**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param {Function} func - The function to be wrapped and called.\n * @returns {Function} A new function that calls the given function with a specified thisArg and arguments.\n */\n function unapply(func) {\n return function (thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return apply(func, thisArg, args);\n };\n }\n\n /**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param {Function} func - The constructor function to be wrapped and called.\n * @returns {Function} A new function that constructs an instance of the given constructor function with the provided arguments.\n */\n function unconstruct(func) {\n return function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return construct(func, args);\n };\n }\n\n /**\n * Add properties to a lookup table\n *\n * @param {Object} set - The set to which elements will be added.\n * @param {Array} array - The array containing elements to be added to the set.\n * @param {Function} transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns {Object} The modified set with added elements.\n */\n function addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n }\n\n /**\n * Clean up an array to harden against CSPP\n *\n * @param {Array} array - The array to be cleaned.\n * @returns {Array} The cleaned version of the array\n */\n function cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n }\n\n /**\n * Shallow clone an object\n *\n * @param {Object} object - The object to be cloned.\n * @returns {Object} A new object that copies the original.\n */\n function clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n }\n\n /**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param {Object} object - The object to look up the getter function in its prototype chain.\n * @param {String} prop - The property name for which to find the getter function.\n * @returns {Function} The getter function found in the prototype chain or a fallback function.\n */\n function lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n }\n\n const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\n\n // SVG\n const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\n const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n\n // List of SVG elements that are disallowed by default.\n // We still need to know them so that we can do namespace\n // checks properly in case one wants to add them to\n // allow-list.\n const svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\n const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n\n // Similarly to SVG, we want to know all MathML elements,\n // even those that we disallow by default.\n const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\n const text = freeze(['#text']);\n\n const html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\n const svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\n const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\n const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n // eslint-disable-next-line unicorn/better-regex\n const MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\n const ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\n const TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\n const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\n const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\n const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n );\n\n const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\n const ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n );\n\n const DOCTYPE_NAME = seal(/^html$/i);\n const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n var EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n ERB_EXPR: ERB_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR,\n DATA_ATTR: DATA_ATTR,\n ARIA_ATTR: ARIA_ATTR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n DOCTYPE_NAME: DOCTYPE_NAME,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT\n });\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n const NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n };\n\n const getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n };\n\n /**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {HTMLScriptElement} purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return {TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\n const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n };\n function createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = '3.1.4';\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Specify the maximum element nesting depth to prevent mXSS */\n const MAX_NESTING_DEPTH = 255;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES),\n // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR,\n // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS),\n // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS,\n // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n const HTML_INTEGRATION_POINTS = addToSet({}, ['foreignobject', 'annotation-xml']);\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n\n /**\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n node.parentNode.removeChild(node);\n } catch (_) {\n node.remove();\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '' + dirty + '';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param {Node} root The root element or node to start traversing on.\n * @return {NodeIterator} The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(elm) {\n return elm instanceof HTMLFormElement && (\n // eslint-disable-next-line unicorn/no-typeof-undefined\n typeof elm.__depth !== 'undefined' && typeof elm.__depth !== 'number' ||\n // eslint-disable-next-line unicorn/no-typeof-undefined\n typeof elm.__removalCount !== 'undefined' && typeof elm.__removalCount !== 'number' || typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function' || typeof elm.hasChildNodes !== 'function');\n };\n\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param {Node} object object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function _isNode(object) {\n return typeof Node === 'function' && object instanceof Node;\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n arrayForEach(hooks[entryPoint], hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove any ocurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove element if anything forbids its presence */\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeElements', currentNode, null);\n return false;\n };\n\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement || value === '__depth' || value === '__removalCount')) {\n return false;\n }\n\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param {string} tagName name of the tag of the node to sanitize\n * @returns {boolean} Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n const {\n attributes\n } = currentNode;\n\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n let l = attributes.length;\n\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n let value = name === 'value' ? attrValue : stringTrim(attrValue);\n\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n\n /* Remove attribute */\n _removeAttribute(name, currentNode);\n\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n continue;\n }\n\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n\n /* Handle invalid data-* attribute set by try-catching it */\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {}\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n const parentNode = getParentNode(shadowNode);\n\n /* Set the nesting depth of an element */\n if (shadowNode.nodeType === NODE_TYPE.element) {\n if (parentNode && parentNode.__depth) {\n /*\n We want the depth of the node in the original tree, which can\n change when it's removed from its parent.\n */\n shadowNode.__depth = (shadowNode.__removalCount || 0) + parentNode.__depth + 1;\n } else {\n shadowNode.__depth = 1;\n }\n }\n\n /*\n * Remove an element if nested too deeply to avoid mXSS\n * or if the __depth might have been tampered with\n */\n if (shadowNode.__depth >= MAX_NESTING_DEPTH || shadowNode.__depth < 0 || numberIsNaN(shadowNode.__depth)) {\n _forceRemove(shadowNode);\n }\n\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n shadowNode.content.__depth = shadowNode.__depth;\n _sanitizeShadowDOM(shadowNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(shadowNode);\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} cfg object\n */\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '';\n }\n\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n\n /* Clean up removed elements */\n DOMPurify.removed = [];\n\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n const parentNode = getParentNode(currentNode);\n\n /* Set the nesting depth of an element */\n if (currentNode.nodeType === NODE_TYPE.element) {\n if (parentNode && parentNode.__depth) {\n /*\n We want the depth of the node in the original tree, which can\n change when it's removed from its parent.\n */\n currentNode.__depth = (currentNode.__removalCount || 0) + parentNode.__depth + 1;\n } else {\n currentNode.__depth = 1;\n }\n }\n\n /*\n * Remove an element if nested too deeply to avoid mXSS\n * or if the __depth might have been tampered with\n */\n if (currentNode.__depth >= MAX_NESTING_DEPTH || currentNode.__depth < 0 || numberIsNaN(currentNode.__depth)) {\n _forceRemove(currentNode);\n }\n\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n currentNode.content.__depth = currentNode.__depth;\n _sanitizeShadowDOM(currentNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(currentNode);\n }\n\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '\\n' + serializedHTML;\n }\n\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {String} tag Tag name of containing element.\n * @param {String} attr Attribute name.\n * @param {String} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n */\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n return DOMPurify;\n }\n var purify = createDOMPurify();\n\n return purify;\n\n}));\n//# sourceMappingURL=purify.js.map\n","module.exports = window.DOMPurify || (window.DOMPurify = require('dompurify').default || require('dompurify'));\n","\n\n \n svg/01 Clarity icon/_default\n Created with Sketch.\n \n \n \n\n","import type { ComponentProps, ComponentPropsWithoutRef } from 'react';\nimport React, { Suspense } from 'react';\nimport type { SlateComponentProps } from '@clearscore-group/ui.slate.utility.slate-component-types';\n\nimport { wrapPromise, fetchSVG, getSVGAttributes, getSVGInnerHtml, isUrlSVG } from './lib/svgr-helpers';\nimport DefaultIcon from './lib/assets/_default.svg';\n\nconst SVGCache: Record> = {};\n\ninterface ExternalSVGProps extends SlateComponentProps> {\n /** The URL of the SVG to render */\n src: string;\n}\n\n/**\n * External SVG Renderer\n *\n * @param props - Component Props\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.src - The URL of the SVG to render\n */\nconst ExternalSVG = ({ src, innerRef, id, ...rest }: ExternalSVGProps) => {\n if (!SVGCache[src]) {\n const fetchedSVG = wrapPromise(fetchSVG(src));\n // eslint-disable-next-line react-compiler/react-compiler\n SVGCache[src] = fetchedSVG;\n }\n const svgData = SVGCache[src].read();\n\n if (!svgData) return ;\n\n const svgAttributes = getSVGAttributes(svgData);\n const svgInnerHtml = getSVGInnerHtml(svgData);\n\n const svgProps = Object.fromEntries(\n Object.entries(svgAttributes).filter(([key]) => !['style', 'xmlns', 'xmlns:xlink', 'xml:space'].includes(key)),\n );\n\n const element = React.cloneElement(, {\n ...svgProps,\n ...rest,\n dangerouslySetInnerHTML: {\n __html: svgInnerHtml,\n },\n });\n\n return element;\n};\n\nexport interface SVGProps extends SlateComponentProps> {\n /** The URL of the SVG to render */\n src: string | React.FC>;\n}\n\n/**\n * Render SVGs from local or remote locations\n *\n * @param props - Component Props\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.src - Either a URL to an .svg or a locally imported SVG as a React.FC<>\n *\n * @throws Failed to load svg\n */\nexport const SVG = ({ src, innerRef, id, ...rest }: SVGProps) => {\n if (isUrlSVG(src)) {\n // However if we're remotely sourcing an .svg asset then we need to suspend and fetch the data.\n return (\n }>\n \n \n );\n }\n\n try {\n // If we're locally importing an SVG then just render normally.\n const LocalSVG = src;\n return )} />;\n } catch (error) {\n // If we cant render then throw an error\n throw new Error('Failed to load svg', { cause: src });\n }\n};\n","import DOMpurify from 'isomorphic-dompurify';\n\nimport type { SVGProps } from '../svgr';\n\n/**\n * Type Guard to check if the src is a React Function.\n *\n * @param src - Source of the SVG\n */\nexport const isFunctionalComponent = (src: SVGProps['src']): src is React.FC> =>\n typeof src === 'function';\n\n/**\n * Type Guard to check if the src is a React Function.\n *\n * @param src - Source of the SVG\n */\nexport const isUrlSVG = (src: SVGProps['src']): src is string => {\n if (typeof src !== 'string') return false;\n return src.includes('Icon_Name') || src.endsWith('.svg');\n};\n\n/**\n * Helper function to tell if the src is a SVG component or not.\n *\n * @param src - Source of the SVG\n */\nexport const isSvg = (src: SVGProps['src']) => {\n if (isFunctionalComponent(src)) return true;\n else if (isUrlSVG(src)) return true;\n return false;\n};\n\n/**\n * Common Suspense boilerplate to wrap a promise to trip a suspense boundary.\n *\n * @param promise - The promise to await\n */\nexport function wrapPromise(promise: Promise) {\n let status: 'pending' | 'success' | 'error' = 'pending';\n let result: T | any;\n const suspender = promise.then(\n (r: T) => {\n status = 'success';\n result = r;\n },\n (e: any) => {\n status = 'error';\n result = e;\n },\n );\n return {\n read() {\n if (status === 'pending') {\n throw suspender;\n } else if (status === 'error') {\n return undefined;\n } else if (status === 'success') {\n return result;\n } else {\n return undefined;\n }\n },\n };\n}\n\n/**\n * Simple fetch wrapper to make a request and return as text\n *\n * @param url - URL to fetch\n */\nexport const fetchSVG = async (url: string) => {\n const res = await fetch(url).catch(() => {});\n if (!res?.headers.get('content-type')?.includes('image/svg+xml')) return undefined;\n const data = await res?.text();\n return data;\n};\n\n/**\n * Strip attributes from SVG html string\n *\n * @param html - The SVG as a HTML string\n */\nexport const getSVGAttributes = (html: string) => {\n const attributeString = `${html.split('\">')[0].split(' {\n const sanitisedHTML = DOMpurify.sanitize(html);\n const innerHTMLStart = sanitisedHTML.indexOf('\">');\n const innerHTMLEnd = sanitisedHTML.indexOf('');\n return sanitisedHTML.slice(innerHTMLStart + 2, innerHTMLEnd);\n};\n","import React from 'react';\nimport cx from 'classnames';\nimport { SVG } from '@clearscore-group/ui.slate.svgr';\nimport type { SlateComponentProps } from '@clearscore-group/ui.slate.utility.slate-component-types';\n\nimport styles from './icon.module.css';\nimport type { IconSentiment, IconSize, IconNames } from './lib/constants';\n\nconst CDN = 'https://assets.clearscore.com/match/original/Icon_Name/';\n\nexport type { IconNames, IconSentiment, IconSize };\n\nexport type IconProps = SlateComponentProps<{\n /** The name of the icon to load. */\n name: IconNames;\n /** The color of the icon to display.*/\n sentiment?: IconSentiment;\n /** The size of the icon to display. */\n size?: IconSize;\n /** The `data-id` attribute to add to the icon (helpful for testing.) */\n dataId?: string;\n}>;\n\n/**\n * SVG icon loader for `@slate/foundations/icons`\n *\n * @param props - Component Props\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.name - The name of the icon to load\n * @param props.sentiment - The color of the icon to display (e.g. `primary`, `secondary`...)\n * @param props.size - The size of the icon to display (e.g. `xsmall`, `small`...)\n * @param props.dataId - The `data-id` attribute to add to the icon (helpful for testing)\n */\nexport const Icon = ({ name, sentiment = 'primary', size = 'large', dataId, innerRef, id }: IconProps) => (\n \n);\n","import React from 'react';\nimport cx from 'classnames';\nimport type { PolymorphicComponentProps } from '@clearscore-group/ui.slate.polymorphic-type-utility';\nimport type { SlateComponentProps } from '@clearscore-group/ui.slate.utility.slate-component-types';\n\nimport styles from './text.module.css';\nimport type { TextAlignment, TextSentiment, TextTags, TextVariant } from './lib/constants';\n\nexport type { TextTags, TextVariant, TextSentiment };\n\nexport type TextProps = PolymorphicComponentProps<\n T,\n SlateComponentProps<{\n /** Sets the HTML as for the element. This is independent of the variant. */\n accessibilityRole: TextTags;\n /** The content of the text. */\n content: string;\n /** Controls the font style of the text.*/\n variant?: TextVariant;\n /** Controls the colour of the text. */\n sentiment?: TextSentiment;\n /** Controls the alignment of the text. */\n alignment?: TextAlignment;\n }>,\n 'children'\n>;\n\nexport type TextComponent = (props: TextProps) => React.ReactElement | null;\n\n/**\n * Text styles a string with Slate's specific variant and sentiment using a HTML tag.\n *\n * @param props - Component Props\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.accessibilityRole - The HTML tag to render the text as (e.g. `p`, `span`, `h1`...)\n * @param props.content - The copy to display\n * @param props.variant - The size of the text (e.g. `body`, `hero1`, `heading1`...)\n * @param props.sentiment - The color of the text (e.g. `primary`, `secondary`...)\n * @param props.className - Additional classes to apply to the component\n * @param props.alignment - The alignment of the text (e.g. `leading`, `center`, `trailing`)\n */\nexport const Text = ({\n content,\n variant = 'body',\n sentiment = 'primary',\n accessibilityRole,\n className,\n innerRef,\n id,\n alignment,\n ...rest\n}: TextProps) => {\n const Tag = accessibilityRole;\n return (\n \n {content}\n \n );\n};\n","export const ARC_SIZE_MAP = {\n xsmall: {\n viewBox: '0 0 390 18',\n d: 'M0 16.7203C63.5386 5.71378 128.666 0 195 0C261.334 0 326.461 5.71378 390 16.7203V17.6842H0L0 16.7203Z',\n yOffset: 17,\n },\n small: {\n viewBox: '0 0 390 18',\n d: 'M0 16.7203C63.5386 5.71378 128.666 0 195 0C261.334 0 326.461 5.71378 390 16.7203V17.6842H0L0 16.7203Z',\n yOffset: 17,\n },\n medium: {\n viewBox: '0 0 768 19',\n d: 'M0 18.608H768C642.977 6.97137 514.712 0.923828 384 0.923828C253.287 0.923828 125.023 6.97137 0 18.608Z',\n yOffset: 18,\n },\n large: {\n viewBox: '0 0 768 19',\n d: 'M0 18.608H768C642.977 6.97137 514.712 0.923828 384 0.923828C253.287 0.923828 125.023 6.97137 0 18.608Z',\n yOffset: 18,\n },\n xlarge: {\n viewBox: '0 0 768 19',\n d: 'M0 18.608H768C642.977 6.97137 514.712 0.923828 384 0.923828C253.287 0.923828 125.023 6.97137 0 18.608Z',\n yOffset: 18,\n },\n} as const;\n\nexport const BREAKPOINTS = ['xsmall', 'small', 'medium'] as const;\nexport type Breakpoint = (typeof BREAKPOINTS)[number];\n\nexport const MAP_COMPONENT_TYPES = {\n link: 'a',\n button: 'button',\n} as const;\n","import type { SyntheticEvent } from 'react';\nimport React from 'react';\nimport { Root, Item } from '@radix-ui/react-navigation-menu';\nimport { useBreakpoint } from '@clearscore-group/ui.slate.breakpoint';\nimport type { IconNames } from '@clearscore-group/ui.slate.icon';\nimport { Icon } from '@clearscore-group/ui.slate.icon';\nimport { Text } from '@clearscore-group/ui.slate.text';\nimport cx from 'classnames';\nimport type { PolymorphicComponentProps, PolymorphicAs } from '@clearscore-group/ui.slate.polymorphic-type-utility';\nimport type { SlateComponentProps } from '@clearscore-group/ui.slate.utility.slate-component-types';\n\nimport type { Breakpoint } from './lib/constants';\nimport { ARC_SIZE_MAP } from './lib/constants';\nimport styles from './tab-bar.module.css';\n\ntype AllowedTypes = 'button' | 'a';\n\nexport type TabBarItemProps = PolymorphicComponentProps<\n T,\n SlateComponentProps<{\n /** Label to be displayed below the icon. */\n label: string;\n /** The name of the icon that displays in each tab. */\n iconName: string;\n /** Optional notifications alert. */\n notifications?: string;\n /** Unique identifier for the tab. */\n id: string;\n /** The URL required for web only. */\n destination: string;\n /** Choose to render as a `button` or an `a` tag for accessibility. */\n accessibilityRole: PolymorphicAs;\n /** The selected tab. */\n selectedId: string;\n /** The callback function to be called when the tab is clicked. */\n onClick: (e: SyntheticEvent) => void;\n }>\n>;\n\n/**\n * TabBarItem Slate Component\n *\n * @param props - Component props.\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.label - Label to be displayed below the icon.\n * @param props.iconName - The name of the icon that displays in each tab.\n * @param props.notifications -Optional notifications alert.\n * @param props.destination - The URL required for web only.\n * @param props.accessibilityRole - Choose to render as a `button` or an `a` tag for accessibility.\n * @param props.selectedId - The selected tab.\n * @param props.onClick - The callback function to be called when the tab is clicked.\n */\nexport const TabBarItem = ({\n accessibilityRole,\n label,\n iconName,\n notifications,\n id,\n destination,\n selectedId,\n onClick,\n innerRef,\n ...rest\n}: TabBarItemProps) => {\n const Tag = accessibilityRole as string;\n const tagProps = accessibilityRole === 'a' ? { href: destination } : { type: 'button' };\n\n return (\n \n \n {typeof notifications === 'string' ? (\n
\n
\n \n
\n
\n ) : null}\n
\n \n
\n
\n \n
\n \n
\n );\n};\n\nexport type TabBarProps = SlateComponentProps<{\n /** The unique identifier of the selected tab. */\n selectedId: string;\n /** An array of items shown in the tab bar. */\n options: Omit, 'selectedId'>[];\n /** Renders the tab bar with a curved top. */\n isCurved?: boolean;\n}>;\n\n/**\n * TabBar Slate Component\n *\n * @param props - Component props.\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.selectedId - The unique identifier of the selected tab.\n * @param props.options - An array of items shown in the tab bar.\n * @param props.isCurved - An attribute used to render the tab bar with a curved top.\n */\nexport const TabBar = ({ selectedId, options, isCurved = false, innerRef, id }: TabBarProps): React.ReactElement => {\n const { name: breakpoint } = useBreakpoint();\n\n return (\n \n
\n
\n {isCurved && (\n \n \n \n )}\n\n
    \n {options.map((option) => (\n )}\n key={option.id}\n selectedId={selectedId}\n />\n ))}\n
\n
\n
\n
\n );\n};\n","/* eslint-disable react/require-default-props */\nimport type { ComponentPropsWithoutRef } from 'react';\nimport React from 'react';\nimport cx from 'classnames';\nimport { Icon } from '@clearscore-group/ui.slate.icon';\nimport type { SlateComponentProps } from '@clearscore-group/ui.slate.utility.slate-component-types';\n\nimport styles from './text-link.module.css';\nimport type { TextLinkVariant } from './lib/constants';\n\nexport type TextLinkProps = SlateComponentProps<\n Omit<\n {\n /** The content of the link */\n content: string;\n /** Removes the link underline */\n isSimple?: boolean;\n /** Whether to show an icon to signify an external navigation */\n showExternalIcon?: boolean;\n /** Style of the link to use */\n variant?: TextLinkVariant;\n } & ComponentPropsWithoutRef<'a'>,\n 'children' | 'className'\n >\n>;\n\n/**\n * TextLink Slate Component\n *\n * @param props - Component Props\n * @param props.id - An ID to be used on the root of the component\n * @param props.innerRef - A reference to the inner component\n * @param props.content - The content of the link\n * @param props.isSimple - Removes the link underline\n * @param props.showExternalIcon - Whether to show an icon to signify an external navigation\n * @param props.variant - Style of the link to use\n */\nexport const TextLink = ({\n content,\n isSimple,\n showExternalIcon,\n variant = 'bodyLink',\n innerRef,\n id,\n ...rest\n}: TextLinkProps) => (\n \n {content}\n {showExternalIcon ? (\n \n ) : null}\n \n);\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1summary:first-of-type:not([inert])', 'details:not([inert])'];\nvar candidateSelector = /* #__PURE__ */candidateSelectors.join(',');\nvar NoElement = typeof Element === 'undefined';\nvar matches = NoElement ? function () {} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\nvar getRootNode = !NoElement && Element.prototype.getRootNode ? function (element) {\n var _element$getRootNode;\n return element === null || element === void 0 ? void 0 : (_element$getRootNode = element.getRootNode) === null || _element$getRootNode === void 0 ? void 0 : _element$getRootNode.call(element);\n} : function (element) {\n return element === null || element === void 0 ? void 0 : element.ownerDocument;\n};\n\n/**\n * Determines if a node is inert or in an inert ancestor.\n * @param {Element} [node]\n * @param {boolean} [lookUp] If true and `node` is not inert, looks up at ancestors to\n * see if any of them are inert. If false, only `node` itself is considered.\n * @returns {boolean} True if inert itself or by way of being in an inert ancestor.\n * False if `node` is falsy.\n */\nvar isInert = function isInert(node, lookUp) {\n var _node$getAttribute;\n if (lookUp === void 0) {\n lookUp = true;\n }\n // CAREFUL: JSDom does not support inert at all, so we can't use the `HTMLElement.inert`\n // JS API property; we have to check the attribute, which can either be empty or 'true';\n // if it's `null` (not specified) or 'false', it's an active element\n var inertAtt = node === null || node === void 0 ? void 0 : (_node$getAttribute = node.getAttribute) === null || _node$getAttribute === void 0 ? void 0 : _node$getAttribute.call(node, 'inert');\n var inert = inertAtt === '' || inertAtt === 'true';\n\n // NOTE: this could also be handled with `node.matches('[inert], :is([inert] *)')`\n // if it weren't for `matches()` not being a function on shadow roots; the following\n // code works for any kind of node\n // CAREFUL: JSDom does not appear to support certain selectors like `:not([inert] *)`\n // so it likely would not support `:is([inert] *)` either...\n var result = inert || lookUp && node && isInert(node.parentNode); // recursive\n\n return result;\n};\n\n/**\n * Determines if a node's content is editable.\n * @param {Element} [node]\n * @returns True if it's content-editable; false if it's not or `node` is falsy.\n */\nvar isContentEditable = function isContentEditable(node) {\n var _node$getAttribute2;\n // CAREFUL: JSDom does not support the `HTMLElement.isContentEditable` API so we have\n // to use the attribute directly to check for this, which can either be empty or 'true';\n // if it's `null` (not specified) or 'false', it's a non-editable element\n var attValue = node === null || node === void 0 ? void 0 : (_node$getAttribute2 = node.getAttribute) === null || _node$getAttribute2 === void 0 ? void 0 : _node$getAttribute2.call(node, 'contenteditable');\n return attValue === '' || attValue === 'true';\n};\n\n/**\n * @param {Element} el container to check in\n * @param {boolean} includeContainer add container to check\n * @param {(node: Element) => boolean} filter filter candidates\n * @returns {Element[]}\n */\nvar getCandidates = function getCandidates(el, includeContainer, filter) {\n // even if `includeContainer=false`, we still have to check it for inertness because\n // if it's inert, all its children are inert\n if (isInert(el)) {\n return [];\n }\n var candidates = Array.prototype.slice.apply(el.querySelectorAll(candidateSelector));\n if (includeContainer && matches.call(el, candidateSelector)) {\n candidates.unshift(el);\n }\n candidates = candidates.filter(filter);\n return candidates;\n};\n\n/**\n * @callback GetShadowRoot\n * @param {Element} element to check for shadow root\n * @returns {ShadowRoot|boolean} ShadowRoot if available or boolean indicating if a shadowRoot is attached but not available.\n */\n\n/**\n * @callback ShadowRootFilter\n * @param {Element} shadowHostNode the element which contains shadow content\n * @returns {boolean} true if a shadow root could potentially contain valid candidates.\n */\n\n/**\n * @typedef {Object} CandidateScope\n * @property {Element} scopeParent contains inner candidates\n * @property {Element[]} candidates list of candidates found in the scope parent\n */\n\n/**\n * @typedef {Object} IterativeOptions\n * @property {GetShadowRoot|boolean} getShadowRoot true if shadow support is enabled; falsy if not;\n * if a function, implies shadow support is enabled and either returns the shadow root of an element\n * or a boolean stating if it has an undisclosed shadow root\n * @property {(node: Element) => boolean} filter filter candidates\n * @property {boolean} flatten if true then result will flatten any CandidateScope into the returned list\n * @property {ShadowRootFilter} shadowRootFilter filter shadow roots;\n */\n\n/**\n * @param {Element[]} elements list of element containers to match candidates from\n * @param {boolean} includeContainer add container list to check\n * @param {IterativeOptions} options\n * @returns {Array.}\n */\nvar getCandidatesIteratively = function getCandidatesIteratively(elements, includeContainer, options) {\n var candidates = [];\n var elementsToCheck = Array.from(elements);\n while (elementsToCheck.length) {\n var element = elementsToCheck.shift();\n if (isInert(element, false)) {\n // no need to look up since we're drilling down\n // anything inside this container will also be inert\n continue;\n }\n if (element.tagName === 'SLOT') {\n // add shadow dom slot scope (slot itself cannot be focusable)\n var assigned = element.assignedElements();\n var content = assigned.length ? assigned : element.children;\n var nestedCandidates = getCandidatesIteratively(content, true, options);\n if (options.flatten) {\n candidates.push.apply(candidates, nestedCandidates);\n } else {\n candidates.push({\n scopeParent: element,\n candidates: nestedCandidates\n });\n }\n } else {\n // check candidate element\n var validCandidate = matches.call(element, candidateSelector);\n if (validCandidate && options.filter(element) && (includeContainer || !elements.includes(element))) {\n candidates.push(element);\n }\n\n // iterate over shadow content if possible\n var shadowRoot = element.shadowRoot ||\n // check for an undisclosed shadow\n typeof options.getShadowRoot === 'function' && options.getShadowRoot(element);\n\n // no inert look up because we're already drilling down and checking for inertness\n // on the way down, so all containers to this root node should have already been\n // vetted as non-inert\n var validShadowRoot = !isInert(shadowRoot, false) && (!options.shadowRootFilter || options.shadowRootFilter(element));\n if (shadowRoot && validShadowRoot) {\n // add shadow dom scope IIF a shadow root node was given; otherwise, an undisclosed\n // shadow exists, so look at light dom children as fallback BUT create a scope for any\n // child candidates found because they're likely slotted elements (elements that are\n // children of the web component element (which has the shadow), in the light dom, but\n // slotted somewhere _inside_ the undisclosed shadow) -- the scope is created below,\n // _after_ we return from this recursive call\n var _nestedCandidates = getCandidatesIteratively(shadowRoot === true ? element.children : shadowRoot.children, true, options);\n if (options.flatten) {\n candidates.push.apply(candidates, _nestedCandidates);\n } else {\n candidates.push({\n scopeParent: element,\n candidates: _nestedCandidates\n });\n }\n } else {\n // there's not shadow so just dig into the element's (light dom) children\n // __without__ giving the element special scope treatment\n elementsToCheck.unshift.apply(elementsToCheck, element.children);\n }\n }\n }\n return candidates;\n};\n\n/**\n * @private\n * Determines if the node has an explicitly specified `tabindex` attribute.\n * @param {HTMLElement} node\n * @returns {boolean} True if so; false if not.\n */\nvar hasTabIndex = function hasTabIndex(node) {\n return !isNaN(parseInt(node.getAttribute('tabindex'), 10));\n};\n\n/**\n * Determine the tab index of a given node.\n * @param {HTMLElement} node\n * @returns {number} Tab order (negative, 0, or positive number).\n * @throws {Error} If `node` is falsy.\n */\nvar getTabIndex = function getTabIndex(node) {\n if (!node) {\n throw new Error('No node provided');\n }\n if (node.tabIndex < 0) {\n // in Chrome,
,