diff --git a/docs/iframe.html b/docs/iframe.html index 27b6f1953..7dd96b934 100644 --- a/docs/iframe.html +++ b/docs/iframe.html @@ -352,4 +352,4 @@ import './97192.4ba8ee11.iframe.bundle.js'; - import './main.237ccbc7.iframe.bundle.js'; \ No newline at end of file + import './main.e36073f9.iframe.bundle.js'; \ No newline at end of file diff --git a/docs/main.237ccbc7.iframe.bundle.js.map b/docs/main.237ccbc7.iframe.bundle.js.map deleted file mode 100644 index 080d7d32b..000000000 --- a/docs/main.237ccbc7.iframe.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.237ccbc7.iframe.bundle.js","mappings":";;;;;AAyBA;ACqKA;;;;;;;ACiCA;AC7LA;AAAA;AAKA;;;ACVA;;;AAsBA;;AAEA;;ACYA;ACrCA;AAUA;AAOA;AAkDA;;AAuXA;AAAA;AAAA;AAAA;AAlZA;AAaA;AAOA;;;;;;;ACWA;;AC5EA;;;;;;;;;;;ACmPA;;;;;AAeA;;;AAcA;;;;;;;AAyDA;AC9QA;ACqhBA;AACA;AC9fA;AASA;;;AAWA;AC1GA;;;AAoBA;;;AAIA;AAKA;AACA;AAGA;;AAIA;;AAEA;AAGA;AACA;AAGA;AAGA;;AAEA;;AAWA;AACA;AACA;;;;;AAiCA;;;AAIA;AAKA;;;AAGA;AACA;AAGA;AACA;AACA;;AAWA;AACA;AACA;;;AAwBA;;;AAIA;;AAMA;;AAEA;;AAEA;;AAGA;AACA;AACA;;AAUA;AACA;AACA;;;AAwBA;;;AAIA;AAKA;;AAEA;AACA;AAGA;AACA;AACA;;AAUA;AACA;AACA;;;AA6BA;;;AAIA;AAKA;;AAEA;AACA;AAGA;AACA;AACA;;AAUA;AACA;AACA;;;AA8BA;;;AAyBA;;AAuBA;;;;AAyBA;;;;;;;AAOA;;;;AAIA;AACA;AAkBA;;;AAGA;;AAEA;;;AAGA;AAUA;;;AASA;AACA;;AAEA;;;AA6BA;;AAMA;;AAWA;;AAEA;;;;;;AAMA;;AAEA;;;;AAaA;;;;;;;;;;;;;AAaA;ACxeA;;;;;;;;;;;ACyLA;;;;;;;;;;;;;;;;;;;AC8nCA;;AChtBA;AAGA;AAGA;AACA;;;;;;;;;;;ACjoBA;AACA;;;;;AAKA;AACA;AACA;;;ACFA;AC0EA;;;;;ACoJA;AACA;AACA;;;;AAIA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;;AAuCA;;;;AAIA;AACA;AACA;AACA;;AAEA;;;AA0CA;;;;AAIA;AACA;AACA;;AAEA;;AAuEA;;;;AAIA;AACA;AACA;;AAEA;;;AAkCA;;;AAGA;AACA;AACA;;;AAGA;;;;AA+CA;AACA;AACA;AACA;;AAEA","sources":["webpack://posthog/./frontend/src/lib/components/ReverseProxyChecker/reverseProxyCheckerLogic.ts","webpack://posthog/./frontend/src/lib/components/Alerts/views/EditAlertModal.tsx","webpack://posthog/./frontend/src/lib/components/AuthorizedUrlList/authorizedUrlListLogic.ts","webpack://posthog/./frontend/src/lib/components/JSSnippet.tsx","webpack://posthog/./frontend/src/lib/components/Metalytics/metalyticsLogic.ts","webpack://posthog/./frontend/src/lib/components/Support/SupportForm.tsx","webpack://posthog/./frontend/src/lib/components/Support/supportLogic.ts","webpack://posthog/./frontend/src/lib/components/VersionChecker/versionCheckerLogic.ts","webpack://posthog/./frontend/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown.tsx","webpack://posthog/./frontend/src/queries/examples.ts","webpack://posthog/./frontend/src/scenes/paths/renderPaths.ts","webpack://posthog/./frontend/src/scenes/billing/billingLogic.tsx","webpack://posthog/./frontend/src/scenes/early-access-features/InstructionsModal.tsx","webpack://posthog/./frontend/src/scenes/feature-flags/FeatureFlagSnippets.tsx","webpack://posthog/./frontend/src/scenes/notebooks/Nodes/NotebookNodeReplayTimestamp.tsx","webpack://posthog/./frontend/src/scenes/notebooks/Notebook/SlashCommands.tsx","webpack://posthog/./ee/frontend/mobile-replay/transformer/transformers.ts","webpack://posthog/./frontend/src/scenes/session-recordings/player/sessionRecordingDataLogic.ts","webpack://posthog/./frontend/src/scenes/session-recordings/playlist/sessionRecordingsListPropertiesLogic.ts","webpack://posthog/./frontend/src/scenes/settings/organization/VerifiedDomains/ConfigureSAMLModal.tsx","webpack://posthog/./frontend/src/scenes/settings/environment/ManagedReverseProxy.tsx","webpack://posthog/./frontend/src/scenes/surveys/surveyLogic.tsx"],"sourcesContent":["import { afterMount, kea, path, reducers } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport api from 'lib/api'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\n\nimport type { reverseProxyCheckerLogicType } from './reverseProxyCheckerLogicType'\n\nconst CHECK_INTERVAL_MS = 1000 * 60 * 60 // 1 hour\n\nexport const reverseProxyCheckerLogic = kea([\n path(['components', 'ReverseProxyChecker', 'reverseProxyCheckerLogic']),\n loaders({\n hasReverseProxy: [\n false as boolean | null,\n {\n loadHasReverseProxy: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT properties.$lib_custom_api_host AS lib_custom_api_host\n FROM events\n WHERE timestamp >= now() - INTERVAL 1 DAY \n AND timestamp <= now()\n ORDER BY timestamp DESC\n limit 10`,\n }\n\n const res = await api.query(query)\n return !!res.results?.find((x) => !!x[0])\n },\n },\n ],\n }),\n reducers({\n lastCheckedTimestamp: [\n 0,\n { persist: true },\n {\n loadHasReverseProxySuccess: () => Date.now(),\n },\n ],\n }),\n afterMount(({ actions, values }) => {\n if (values.lastCheckedTimestamp < Date.now() - CHECK_INTERVAL_MS) {\n actions.loadHasReverseProxy()\n }\n }),\n])\n","import { IconInfo } from '@posthog/icons'\nimport {\n LemonBanner,\n LemonCheckbox,\n LemonInput,\n LemonSegmentedButton,\n LemonSelect,\n SpinnerOverlay,\n Tooltip,\n} from '@posthog/lemon-ui'\nimport { useActions, useValues } from 'kea'\nimport { Form, Group } from 'kea-forms'\nimport { AlertStateIndicator } from 'lib/components/Alerts/views/ManageAlertsModal'\nimport { MemberSelectMultiple } from 'lib/components/MemberSelectMultiple'\nimport { TZLabel } from 'lib/components/TZLabel'\nimport { UserActivityIndicator } from 'lib/components/UserActivityIndicator/UserActivityIndicator'\nimport { dayjs } from 'lib/dayjs'\nimport { IconChevronLeft } from 'lib/lemon-ui/icons'\nimport { LemonButton } from 'lib/lemon-ui/LemonButton'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonModal } from 'lib/lemon-ui/LemonModal'\nimport { alphabet, formatDate } from 'lib/utils'\nimport { useCallback } from 'react'\nimport { trendsDataLogic } from 'scenes/trends/trendsDataLogic'\n\nimport { AlertCalculationInterval, AlertConditionType, AlertState, InsightThresholdType } from '~/queries/schema'\nimport { InsightShortId, QueryBasedInsightModel } from '~/types'\n\nimport { alertFormLogic, canCheckOngoingInterval } from '../alertFormLogic'\nimport { alertLogic } from '../alertLogic'\nimport { SnoozeButton } from '../SnoozeButton'\nimport { AlertType } from '../types'\n\nexport function AlertStateTable({ alert }: { alert: AlertType }): JSX.Element | null {\n if (!alert.checks || alert.checks.length === 0) {\n return null\n }\n\n return (\n
\n
\n

Current status:

\n \n

\n {alert.snoozed_until && ` until ${formatDate(dayjs(alert?.snoozed_until), 'MMM D, HH:mm')}`}\n

\n
\n \n \n \n \n \n \n \n \n \n \n {alert.checks.map((check) => (\n \n \n \n \n \n \n ))}\n \n
StatusTimeValueTargets notified
{check.state}\n \n {check.calculated_value}{check.targets_notified ? 'Yes' : 'No'}
\n
\n )\n}\n\ninterface EditAlertModalProps {\n isOpen: boolean | undefined\n alertId?: AlertType['id']\n insightId: QueryBasedInsightModel['id']\n insightShortId: InsightShortId\n onEditSuccess: () => void\n onClose?: () => void\n}\n\nexport function EditAlertModal({\n isOpen,\n alertId,\n insightId,\n insightShortId,\n onClose,\n onEditSuccess,\n}: EditAlertModalProps): JSX.Element {\n const _alertLogic = alertLogic({ alertId })\n const { alert, alertLoading } = useValues(_alertLogic)\n const { loadAlert } = useActions(_alertLogic)\n\n // need to reload edited alert as well\n const _onEditSuccess = useCallback(() => {\n loadAlert()\n onEditSuccess()\n }, [loadAlert, onEditSuccess])\n\n const formLogicProps = { alert, insightId, onEditSuccess: _onEditSuccess }\n const formLogic = alertFormLogic(formLogicProps)\n const { alertForm, isAlertFormSubmitting, alertFormChanged } = useValues(formLogic)\n const { deleteAlert, snoozeAlert, clearSnooze } = useActions(formLogic)\n const { setAlertFormValue } = useActions(formLogic)\n\n const trendsLogic = trendsDataLogic({ dashboardItemId: insightShortId })\n const { alertSeries, isNonTimeSeriesDisplay, isBreakdownValid, formula } = useValues(trendsLogic)\n\n const creatingNewAlert = alertForm.id === undefined\n // can only check ongoing interval for absolute value/increase alerts with upper threshold\n const can_check_ongoing_interval = canCheckOngoingInterval(alertForm)\n\n return (\n \n {alertLoading ? (\n \n ) : (\n \n \n
\n } onClick={onClose} size=\"xsmall\" />\n\n

{creatingNewAlert ? 'New' : 'Edit '} Alert

\n
\n
\n\n \n
\n
\n
\n \n \n \n \n \n \n
\n {alert?.created_by ? (\n \n ) : null}\n
\n\n
\n

Definition

\n
\n {isBreakdownValid && (\n \n For trends with breakdown, the alert will fire if any of the breakdown\n values breaches the threshold.\n \n )}\n
\n
When
\n \n \n ({\n label: isBreakdownValid\n ? 'any breakdown value'\n : formula\n ? `Formula (${formula})`\n : `${alphabet[index]} - ${\n custom_name ?? name ?? event\n }`,\n value: isBreakdownValid || formula ? 0 : index,\n })\n )}\n disabledReason={\n (isBreakdownValid &&\n `For trends with breakdown, the alert will fire if any of the breakdown\n values breaches the threshold.`) ||\n (formula &&\n `When using formula mode, can only alert on formula value`)\n }\n />\n \n \n \n \n \n \n \n
\n
\n
less than
\n \n \n setAlertFormValue('threshold', {\n configuration: {\n type: alertForm.threshold.configuration.type,\n bounds: {\n ...alertForm.threshold.configuration.bounds,\n lower:\n value &&\n alertForm.threshold.configuration.type ===\n InsightThresholdType.PERCENTAGE\n ? value / 100\n : value,\n },\n },\n })\n }\n />\n \n
or more than
\n \n \n setAlertFormValue('threshold', {\n configuration: {\n type: alertForm.threshold.configuration.type,\n bounds: {\n ...alertForm.threshold.configuration.bounds,\n upper:\n value &&\n alertForm.threshold.configuration.type ===\n InsightThresholdType.PERCENTAGE\n ? value / 100\n : value,\n },\n },\n })\n }\n />\n \n {alertForm.condition.type !== AlertConditionType.ABSOLUTE_VALUE && (\n \n \n \n \n \n )}\n
\n
\n
\n {alertForm.condition.type === AlertConditionType.ABSOLUTE_VALUE\n ? 'check'\n : 'compare'}\n
\n \n ({\n label: interval,\n value: interval,\n }))}\n />\n \n
and notify
\n
\n u.id) ?? []}\n idKey=\"id\"\n onChange={(value) => setAlertFormValue('subscribed_users', value)}\n />\n
\n
\n
\n
\n\n
\n

Advanced

\n \n
\n \n \n \n \n \n \n
\n
\n \n \n \n
\n
\n\n {alert && }\n
\n\n \n
\n
\n {!creatingNewAlert ? (\n \n Delete alert\n \n ) : null}\n {!creatingNewAlert && alert?.state === AlertState.FIRING ? (\n \n ) : null}\n {!creatingNewAlert && alert?.state === AlertState.SNOOZED ? (\n \n Clear snooze\n \n ) : null}\n
\n
\n \n {creatingNewAlert ? 'Create alert' : 'Save'}\n \n
\n \n )}\n
\n )\n}\n","import Fuse from 'fuse.js'\nimport {\n actions,\n afterMount,\n connect,\n kea,\n key,\n listeners,\n path,\n props,\n reducers,\n selectors,\n sharedListeners,\n} from 'kea'\nimport { forms } from 'kea-forms'\nimport { loaders } from 'kea-loaders'\nimport { encodeParams, urlToAction } from 'kea-router'\nimport { subscriptions } from 'kea-subscriptions'\nimport api from 'lib/api'\nimport { isDomain, isURL } from 'lib/utils'\nimport { apiHostOrigin } from 'lib/utils/apiHost'\nimport { teamLogic } from 'scenes/teamLogic'\nimport { urls } from 'scenes/urls'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport { ExperimentIdType, ToolbarParams, ToolbarUserIntent } from '~/types'\n\nimport type { authorizedUrlListLogicType } from './authorizedUrlListLogicType'\n\nexport interface ProposeNewUrlFormType {\n url: string\n}\n\nexport enum AuthorizedUrlListType {\n TOOLBAR_URLS = 'TOOLBAR_URLS',\n RECORDING_DOMAINS = 'RECORDING_DOMAINS',\n WEB_EXPERIMENTS = 'WEB_EXPERIMENTS',\n}\n\n/**\n * Firefox does not allow you construct a new URL with e.g. https://*.example.com (which is to be fair more standards compliant than Chrome)\n * when used to probe for e.g. for authorized urls we only care if the proposed URL has a path so we can safely replace the wildcard with a character\n * NB this changes its input and shouldn't be used for general purpose URL parsing\n */\nexport function sanitizePossibleWildCardedURL(url: string): URL {\n const deWildCardedURL = url.replace(/\\*/g, 'x')\n return new URL(deWildCardedURL)\n}\n\n/**\n * Checks if the URL has a wildcard (*) in the port position e.g. http://localhost:*\n */\nexport function hasPortWildcard(input: unknown): boolean {\n if (!input || typeof input !== 'string') {\n return false\n }\n // This regex matches URLs with a wildcard (*) in the port position\n const portWildcardRegex = /^(https?:\\/\\/[^:/]+):\\*(.*)$/\n return portWildcardRegex.test(input.trim())\n}\n\nexport const validateProposedUrl = (\n proposedUrl: string,\n currentUrls: string[],\n onlyAllowDomains: boolean = false\n): string | undefined => {\n if (!isURL(proposedUrl)) {\n return 'Please enter a valid URL'\n }\n\n if (hasPortWildcard(proposedUrl)) {\n return 'Wildcards are not allowed in the port position'\n }\n\n if (onlyAllowDomains && !isDomain(sanitizePossibleWildCardedURL(proposedUrl))) {\n return \"Please enter a valid domain (URLs with a path aren't allowed)\"\n }\n\n if (proposedUrl.indexOf('*') > -1 && !proposedUrl.match(/^(.*)\\*[^*]*\\.[^*]+\\.[^*]+$/)) {\n return 'Wildcards can only be used for subdomains'\n }\n\n if (currentUrls.indexOf(proposedUrl) > -1) {\n return `This ${onlyAllowDomains ? 'domains' : 'URL'} already is registered`\n }\n\n return\n}\n\n/** defaultIntent: whether to launch with empty intent (i.e. toolbar mode is default) */\nexport function appEditorUrl(\n appUrl: string,\n options?: { actionId?: number | null; experimentId?: ExperimentIdType; userIntent?: ToolbarUserIntent }\n): string {\n // See https://github.com/PostHog/posthog-js/blob/f7119c/src/extensions/toolbar.ts#L52 for where these params\n // are passed. `appUrl` is an extra `redirect_to_site` param.\n const params: ToolbarParams & { appUrl: string } = {\n userIntent:\n options?.userIntent ??\n (options?.actionId ? 'edit-action' : options?.experimentId ? 'edit-experiment' : 'add-action'),\n // Make sure to pass the app url, otherwise the api_host will be used by\n // the toolbar, which isn't correct when used behind a reverse proxy as\n // we require e.g. SSO login to the app, which will not work when placed\n // behind a proxy unless we register each domain with the OAuth2 client.\n apiURL: apiHostOrigin(),\n appUrl,\n ...(options?.actionId ? { actionId: options.actionId } : {}),\n ...(options?.experimentId ? { experimentId: options.experimentId } : {}),\n }\n return '/api/user/redirect_to_site/' + encodeParams(params, '?')\n}\n\nexport const checkUrlIsAuthorized = (url: string | URL, authorizedUrls: string[]): boolean => {\n try {\n const parsedUrl = typeof url === 'string' ? sanitizePossibleWildCardedURL(url) : url\n const urlWithoutPath = parsedUrl.protocol + '//' + parsedUrl.host\n // Is this domain already in the list of urls?\n const exactMatch =\n authorizedUrls.filter((authorizedUrl) => authorizedUrl.indexOf(urlWithoutPath) > -1).length > 0\n\n if (exactMatch) {\n return true\n }\n\n const wildcardMatch = !!authorizedUrls.find((authorizedUrl) => {\n // Matches something like `https://*.example.com` against the urlWithoutPath\n const regex = new RegExp(authorizedUrl.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*'))\n return urlWithoutPath.match(regex)\n })\n\n if (wildcardMatch) {\n return true\n }\n } catch (error) {\n // Ignore invalid URLs\n }\n\n return false\n}\n\nexport interface SuggestedDomain {\n url: string\n count: number\n}\n\nexport const filterNotAuthorizedUrls = (\n suggestions: SuggestedDomain[],\n authorizedUrls: string[]\n): SuggestedDomain[] => {\n const suggestedDomains: SuggestedDomain[] = []\n\n suggestions.forEach(({ url, count }) => {\n const parsedUrl = sanitizePossibleWildCardedURL(url)\n const urlWithoutPath = parsedUrl.protocol + '//' + parsedUrl.host\n // Have we already added this domain?\n if (suggestedDomains.some((sd) => sd.url === urlWithoutPath)) {\n return\n }\n\n if (!checkUrlIsAuthorized(parsedUrl, authorizedUrls)) {\n suggestedDomains.push({ url: urlWithoutPath, count })\n }\n })\n\n return suggestedDomains\n}\n\nexport const NEW_URL = 'https://'\n\nexport interface KeyedAppUrl {\n url: string\n type: 'authorized' | 'suggestion'\n originalIndex: number\n // how many seen in the last three days\n count?: number\n}\n\nexport interface AuthorizedUrlListLogicProps {\n actionId: number | null\n experimentId: ExperimentIdType | null\n type: AuthorizedUrlListType\n query: string | null | undefined\n}\n\nexport const defaultAuthorizedUrlProperties = {\n actionId: null,\n experimentId: null,\n query: null,\n}\n\nexport const authorizedUrlListLogic = kea([\n path((key) => ['lib', 'components', 'AuthorizedUrlList', 'authorizedUrlListLogic', key]),\n key((props) => (props.experimentId ? `${props.type}-${props.experimentId}` : `${props.type}-${props.actionId}`)),\n props({} as AuthorizedUrlListLogicProps),\n connect({\n values: [teamLogic, ['currentTeam', 'currentTeamId']],\n actions: [teamLogic, ['updateCurrentTeam']],\n }),\n actions(() => ({\n setAuthorizedUrls: (authorizedUrls: string[]) => ({ authorizedUrls }),\n addUrl: (url: string, launch?: boolean) => ({ url, launch }),\n newUrl: true,\n removeUrl: (index: number) => ({ index }),\n updateUrl: (index: number, url: string) => ({ index, url }),\n launchAtUrl: (url: string) => ({ url }),\n setSearchTerm: (term: string) => ({ term }),\n setEditUrlIndex: (originalIndex: number | null) => ({ originalIndex }),\n cancelProposingUrl: true,\n })),\n loaders(({ values }) => ({\n suggestions: {\n __default: [] as SuggestedDomain[],\n loadSuggestions: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`select properties.$current_url, count()\n from events\n where event = '$pageview'\n and timestamp >= now() - interval 3 day \n and timestamp <= now()\n group by properties.$current_url\n order by count() desc\n limit 25`,\n }\n\n const response = await api.query(query)\n const result = response.results as [string, number][]\n\n if (result && result.length === 0) {\n return []\n }\n\n const suggestedDomains = filterNotAuthorizedUrls(\n result.map(([url, count]) => ({ url, count })),\n values.authorizedUrls\n )\n\n return suggestedDomains.slice(0, 20)\n },\n },\n })),\n subscriptions(({ props, actions }) => ({\n currentTeam: (currentTeam) => {\n actions.setAuthorizedUrls(\n (props.type === AuthorizedUrlListType.RECORDING_DOMAINS\n ? currentTeam.recording_domains\n : currentTeam.app_urls) || []\n )\n },\n })),\n afterMount(({ actions }) => {\n actions.loadSuggestions()\n }),\n forms(({ values, actions }) => ({\n proposedUrl: {\n defaults: { url: '' } as ProposeNewUrlFormType,\n errors: ({ url }) => ({\n url: validateProposedUrl(url, values.authorizedUrls, values.onlyAllowDomains),\n }),\n submit: async ({ url }) => {\n if (values.editUrlIndex !== null && values.editUrlIndex >= 0) {\n actions.updateUrl(values.editUrlIndex, url)\n } else {\n actions.addUrl(url)\n }\n },\n },\n })),\n reducers(() => ({\n showProposedURLForm: [\n false as boolean,\n {\n newUrl: () => true,\n submitProposedUrlSuccess: () => false,\n cancelProposingUrl: () => false,\n },\n ],\n authorizedUrls: [\n [] as string[],\n {\n setAuthorizedUrls: (_, { authorizedUrls }) => authorizedUrls,\n addUrl: (state, { url }) => (!state.includes(url) ? state.concat([url]) : state),\n updateUrl: (state, { index, url }) => Object.assign([...state], { [index]: url }),\n removeUrl: (state, { index }) => {\n const newUrls = [...state]\n newUrls.splice(index, 1)\n return newUrls\n },\n },\n ],\n suggestions: [\n [],\n {\n addUrl: (state, { url }) => [...state].filter((sd) => url !== sd.url),\n },\n ],\n searchTerm: [\n '',\n {\n setSearchTerm: (_, { term }) => term,\n },\n ],\n editUrlIndex: [\n null as number | null,\n {\n setEditUrlIndex: (_, { originalIndex }) => originalIndex,\n removeUrl: (editUrlIndex, { index }) =>\n editUrlIndex && index < editUrlIndex\n ? editUrlIndex - 1\n : index === editUrlIndex\n ? null\n : editUrlIndex,\n newUrl: () => -1,\n updateUrl: () => null,\n addUrl: () => null,\n cancelProposingUrl: () => null,\n },\n ],\n })),\n sharedListeners(({ values, props }) => ({\n saveUrls: async () => {\n if (props.type === AuthorizedUrlListType.RECORDING_DOMAINS) {\n await teamLogic.asyncActions.updateCurrentTeam({ recording_domains: values.authorizedUrls })\n } else {\n await teamLogic.asyncActions.updateCurrentTeam({ app_urls: values.authorizedUrls })\n }\n },\n })),\n listeners(({ sharedListeners, values, actions }) => ({\n setEditUrlIndex: () => {\n actions.setProposedUrlValue('url', values.urlToEdit)\n },\n newUrl: () => {\n actions.setProposedUrlValue('url', NEW_URL)\n },\n addUrl: [\n sharedListeners.saveUrls,\n ({ url, launch }) => {\n if (launch) {\n actions.launchAtUrl(url)\n }\n },\n ],\n removeUrl: sharedListeners.saveUrls,\n updateUrl: sharedListeners.saveUrls,\n launchAtUrl: ({ url }) => {\n window.location.href = values.launchUrl(url)\n },\n cancelProposingUrl: () => {\n actions.resetProposedUrl()\n },\n submitProposedUrlSuccess: () => {\n actions.setEditUrlIndex(null)\n actions.resetProposedUrl()\n },\n })),\n selectors({\n urlToEdit: [\n (s) => [s.authorizedUrls, s.editUrlIndex],\n (authorizedUrls, editUrlIndex) => {\n if (editUrlIndex === null || editUrlIndex === -1) {\n return NEW_URL\n }\n return authorizedUrls[editUrlIndex]\n },\n ],\n urlsKeyed: [\n (s) => [s.authorizedUrls, s.suggestions, s.searchTerm],\n (authorizedUrls, suggestions, searchTerm): KeyedAppUrl[] => {\n const keyedUrls = authorizedUrls\n .map((url, index) => ({\n url,\n type: 'authorized',\n originalIndex: index,\n }))\n .concat(\n suggestions.map(({ url, count }, index) => ({\n url,\n type: 'suggestion',\n originalIndex: index,\n count,\n }))\n ) as KeyedAppUrl[]\n\n if (!searchTerm) {\n return keyedUrls\n }\n\n return new Fuse(keyedUrls, {\n keys: ['url'],\n threshold: 0.3,\n })\n .search(searchTerm)\n .map((result) => result.item)\n },\n ],\n launchUrl: [\n (_, p) => [p.actionId, p.experimentId],\n (actionId, experimentId) => (url: string) => {\n if (experimentId) {\n return appEditorUrl(url, {\n experimentId,\n })\n }\n\n return appEditorUrl(url, {\n actionId,\n })\n },\n ],\n isAddUrlFormVisible: [(s) => [s.editUrlIndex], (editUrlIndex) => editUrlIndex === -1],\n onlyAllowDomains: [(_, p) => [p.type], (type) => type === AuthorizedUrlListType.RECORDING_DOMAINS],\n\n checkUrlIsAuthorized: [\n (s) => [s.authorizedUrls],\n (authorizedUrls) => (url: string) => {\n return checkUrlIsAuthorized(url, authorizedUrls)\n },\n ],\n }),\n urlToAction(({ actions }) => ({\n [urls.toolbarLaunch()]: (_, searchParams) => {\n if (searchParams.addNew) {\n actions.newUrl()\n }\n },\n })),\n])\n","import { useValues } from 'kea'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport { FEATURE_FLAGS } from 'lib/constants'\nimport { featureFlagLogic } from 'lib/logic/featureFlagLogic'\nimport { apiHostOrigin } from 'lib/utils/apiHost'\nimport posthog from 'posthog-js'\nimport { teamLogic } from 'scenes/teamLogic'\n\nfunction snippetFunctions(arrayJs = '/static/array.js'): string {\n const methods: string[] = []\n const posthogPrototype = Object.getPrototypeOf(posthog)\n for (const key of Object.getOwnPropertyNames(posthogPrototype)) {\n if (\n typeof posthogPrototype[key] === 'function' &&\n !key.startsWith('_') &&\n !['constructor', 'toString', 'push'].includes(key)\n ) {\n methods.push(key)\n }\n }\n const snippetMethods = methods.join(' ')\n\n return `!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(\".\");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(\"script\")).type=\"text/javascript\",p.crossOrigin=\"anonymous\",p.async=!0,p.src=s.api_host.replace(\".i.posthog.com\",\"-assets.i.posthog.com\")+\"${arrayJs}\",(r=t.getElementsByTagName(\"script\")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=\"posthog\",u.people=u.people||[],u.toString=function(t){var e=\"posthog\";return\"posthog\"!==a&&(e+=\".\"+a),t||(e+=\" (stub)\"),e},u.people.toString=function(){return u.toString(1)+\".people (stub)\"},o=\"${snippetMethods}\".split(\" \"),n=0;n',\n ` ${snippetFunctions(arrayJs)}`,\n ` posthog.init('${currentTeam?.api_token}', {\n api_host:'${apiHostOrigin()}'${\n isPersonProfilesDisabled\n ? ``\n : `,\\n person_profiles: 'identified_only' // or 'always' to create profiles for anonymous users as well`\n }\n })`,\n '',\n ]\n .map((x) => ' '.repeat(indent) + x)\n .join('\\n')\n}\n\nexport function JSSnippet(): JSX.Element {\n const snippet = useJsSnippet()\n\n return {snippet}\n}\n\nexport function JSSnippetV2(): JSX.Element {\n const { currentTeam } = useValues(teamLogic)\n\n const snippet = useJsSnippet(0, `/array/${currentTeam?.api_token}/array.js`)\n\n return {snippet}\n}\n","import { connect, kea, path, selectors } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport { subscriptions } from 'kea-subscriptions'\nimport api from 'lib/api'\nimport { membersLogic } from 'scenes/organization/membersLogic'\n\nimport { sidePanelContextLogic } from '~/layout/navigation-3000/sidepanel/panels/sidePanelContextLogic'\nimport { SidePanelSceneContext } from '~/layout/navigation-3000/sidepanel/types'\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\n\nimport type { metalyticsLogicType } from './metalyticsLogicType'\n\nexport const metalyticsLogic = kea([\n path(['lib', 'components', 'metalytics', 'metalyticsLogic']),\n connect({\n values: [sidePanelContextLogic, ['sceneSidePanelContext'], membersLogic, ['members']],\n }),\n\n loaders(({ values }) => ({\n viewCount: [\n null as { views: number; users: number } | null,\n {\n loadViewCount: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT SUM(count) AS count, COUNT(DISTINCT app_source_id) AS unique_users\n FROM app_metrics\n WHERE app_source = 'metalytics'\n AND instance_id = ${values.instanceId}`,\n }\n\n // NOTE: I think this gets cached heavily - how to correctly invalidate?\n const response = await api.query(query, undefined, undefined, true)\n const result = response.results as number[][]\n return {\n views: result[0][0],\n users: result[0][1],\n }\n },\n },\n ],\n recentUsers: [\n [] as string[],\n {\n loadUsersLast30days: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT DISTINCT app_source_id\n FROM app_metrics\n WHERE app_source = 'metalytics'\n AND instance_id = ${values.instanceId}\n AND timestamp >= NOW() - INTERVAL 30 DAY\n ORDER BY timestamp DESC`,\n }\n\n const response = await api.query(query, undefined, undefined, true)\n return response.results.map((result) => result[0]) as string[]\n },\n },\n ],\n })),\n\n selectors({\n instanceId: [\n (s) => [s.sceneSidePanelContext],\n (sidePanelContext: SidePanelSceneContext) =>\n sidePanelContext?.activity_item_id\n ? `${sidePanelContext.activity_scope}:${sidePanelContext.activity_item_id}`\n : null,\n ],\n scope: [\n (s) => [s.sceneSidePanelContext],\n (sidePanelContext: SidePanelSceneContext) => sidePanelContext?.activity_scope,\n ],\n\n recentUserMembers: [\n (s) => [s.recentUsers, s.members],\n (recentUsers, members) => {\n if (!members || !recentUsers) {\n return []\n }\n // Filter members whose IDs match the recentUsers array\n const filteredMembers = members.filter((member) => recentUsers.includes(String(member.user.id)))\n return filteredMembers\n },\n ],\n }),\n\n subscriptions(({ actions }) => ({\n instanceId: async (instanceId) => {\n if (instanceId) {\n actions.loadViewCount()\n actions.loadUsersLast30days()\n\n await api.create('/api/projects/@current/metalytics/', {\n metric_name: 'viewed',\n instance_id: instanceId,\n })\n }\n },\n })),\n])\n","import { IconBug, IconInfo, IconQuestion } from '@posthog/icons'\nimport {\n LemonInput,\n LemonSegmentedButton,\n LemonSegmentedButtonOption,\n lemonToast,\n Link,\n Tooltip,\n} from '@posthog/lemon-ui'\nimport { useActions, useValues } from 'kea'\nimport { Form } from 'kea-forms'\nimport { useUploadFiles } from 'lib/hooks/useUploadFiles'\nimport { IconFeedback } from 'lib/lemon-ui/icons'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonFileInput } from 'lib/lemon-ui/LemonFileInput/LemonFileInput'\nimport { LemonSelect } from 'lib/lemon-ui/LemonSelect/LemonSelect'\nimport { LemonTextArea } from 'lib/lemon-ui/LemonTextArea/LemonTextArea'\nimport { useRef } from 'react'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { userLogic } from 'scenes/userLogic'\n\nimport {\n SEVERITY_LEVEL_TO_NAME,\n SUPPORT_TICKET_TEMPLATES,\n supportLogic,\n SupportTicketKind,\n TARGET_AREA_TO_NAME,\n} from './supportLogic'\n\nconst SUPPORT_TICKET_OPTIONS: LemonSegmentedButtonOption[] = [\n {\n value: 'support',\n label: 'Question',\n icon: ,\n },\n {\n value: 'feedback',\n label: 'Feedback',\n icon: ,\n },\n {\n value: 'bug',\n label: 'Bug',\n icon: ,\n },\n]\n\nconst SUPPORT_TICKET_KIND_TO_PROMPT: Record = {\n bug: \"What's the bug?\",\n feedback: 'What feedback do you have?',\n support: 'What can we help you with?',\n}\n\nexport function SupportForm(): JSX.Element | null {\n const { sendSupportRequest } = useValues(supportLogic)\n const { setSendSupportRequestValue } = useActions(supportLogic)\n const { objectStorageAvailable } = useValues(preflightLogic)\n // the support model can be shown when logged out, file upload is not offered to anonymous users\n const { user } = useValues(userLogic)\n // only allow authentication issues for logged out users\n\n const dropRef = useRef(null)\n\n const { setFilesToUpload, filesToUpload, uploading } = useUploadFiles({\n onUpload: (url, fileName) => {\n setSendSupportRequestValue('message', sendSupportRequest.message + `\\n\\nAttachment \"${fileName}\": ${url}`)\n },\n onError: (detail) => {\n lemonToast.error(`Error uploading image: ${detail}`)\n },\n })\n\n const changeKind = (kind: SupportTicketKind): void => {\n setSendSupportRequestValue('kind', kind)\n if (kind === 'bug') {\n setSendSupportRequestValue('severity_level', 'medium')\n } else {\n setSendSupportRequestValue('severity_level', 'low')\n }\n }\n\n return (\n \n {!user && (\n <>\n \n \n \n \n \n \n \n )}\n \n \n \n \n \n \n \n {(props) => (\n
\n \n {objectStorageAvailable && !!user && (\n \n )}\n
\n )}\n \n
\n
\n \n \n Definitions\n \n
\n \n ({\n label: value,\n value: key,\n }))}\n />\n \n
\n \n )\n}\n","import { captureException } from '@sentry/react'\nimport * as Sentry from '@sentry/react'\nimport { actions, connect, kea, listeners, path, props, reducers, selectors } from 'kea'\nimport { forms } from 'kea-forms'\nimport { urlToAction } from 'kea-router'\nimport { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast'\nimport { uuid } from 'lib/utils'\nimport posthog from 'posthog-js'\nimport { organizationLogic } from 'scenes/organizationLogic'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { teamLogic } from 'scenes/teamLogic'\nimport { userLogic } from 'scenes/userLogic'\n\nimport { sidePanelStateLogic } from '~/layout/navigation-3000/sidepanel/sidePanelStateLogic'\nimport { AvailableFeature, OrganizationBasicType, Region, SidePanelTab, TeamPublicType, UserType } from '~/types'\n\nimport type { supportLogicType } from './supportLogicType'\nimport { openSupportModal } from './SupportModal'\n\nexport function getPublicSupportSnippet(\n cloudRegion: Region | null | undefined,\n currentOrganization: OrganizationBasicType | null,\n currentTeam: TeamPublicType | null,\n includeCurrentLocation = true\n): string {\n if (!cloudRegion) {\n return ''\n }\n return (\n (includeCurrentLocation ? getCurrentLocationLink() : '') +\n getSessionReplayLink() +\n `\\nAdmin: http://go/adminOrg${cloudRegion}/${currentOrganization?.id} (project ID ${currentTeam?.id})` +\n getSentryLink(cloudRegion, currentTeam)\n ).trimStart()\n}\n\nfunction getCurrentLocationLink(): string {\n const cleanedCurrentUrl = window.location.href.replace(/panel=support[^&]*(&)?/, '').replace(/#$/, '')\n return `\\nLocation: ${cleanedCurrentUrl}`\n}\n\nfunction getSessionReplayLink(): string {\n const replayUrl = posthog\n .get_session_replay_url({ withTimestamp: true, timestampLookBack: 30 })\n .replace(window.location.origin + '/replay/', 'http://go/session/')\n return `\\nSession: ${replayUrl}`\n}\n\nfunction getErrorTrackingLink(): string {\n const filterGroup = encodeURIComponent(\n JSON.stringify({\n type: 'AND',\n values: [\n {\n type: 'AND',\n values: [\n {\n key: '$session_id',\n value: [posthog.get_session_id()],\n operator: 'exact',\n type: 'event',\n },\n ],\n },\n ],\n })\n )\n\n return `\\nExceptions: https://us.posthog.com/project/2/error_tracking?filterGroup=${filterGroup}`\n}\n\nfunction getDjangoAdminLink(\n user: UserType | null,\n cloudRegion: Region | null | undefined,\n currentOrganization: OrganizationBasicType | null,\n currentTeam: TeamPublicType | null\n): string {\n if (!user || !cloudRegion) {\n return ''\n }\n const link = `http://go/admin${cloudRegion}/${user.email}`\n return `\\nAdmin: ${link} (organization ID ${currentOrganization?.id}: ${currentOrganization?.name}, project ID ${currentTeam?.id}: ${currentTeam?.name})`\n}\n\nfunction getBillingAdminLink(currentOrganization: OrganizationBasicType | null): string {\n if (!currentOrganization) {\n return ''\n }\n return `\\nBilling admin: http://go/billing/${currentOrganization.id}`\n}\n\nfunction getSentryLink(cloudRegion: Region | null | undefined, currentTeam: TeamPublicType | null): string {\n if (!cloudRegion || !currentTeam) {\n return ''\n }\n return `\\nSentry: http://go/sentry${cloudRegion}/${currentTeam.id}`\n}\n\nconst SUPPORT_TICKET_KIND_TO_TITLE: Record = {\n support: 'Contact support',\n feedback: 'Give feedback',\n bug: 'Report a bug',\n}\n\nexport const TARGET_AREA_TO_NAME = [\n {\n title: 'General',\n options: [\n {\n value: 'apps',\n 'data-attr': `support-form-target-area-apps`,\n label: 'Data pipelines',\n },\n {\n value: 'login',\n 'data-attr': `support-form-target-area-login`,\n label: 'Authentication (incl. login, sign-up, invites)',\n },\n {\n value: 'billing',\n 'data-attr': `support-form-target-area-billing`,\n label: 'Billing',\n },\n {\n value: 'onboarding',\n 'data-attr': `support-form-target-area-onboarding`,\n label: 'Onboarding',\n },\n {\n value: 'sdk',\n 'data-attr': `support-form-target-area-onboarding`,\n label: 'SDK / Implementation',\n },\n {\n value: 'cohorts',\n 'data-attr': `support-form-target-area-cohorts`,\n label: 'Cohorts',\n },\n {\n value: 'data_management',\n 'data-attr': `support-form-target-area-data_management`,\n label: 'Data management (incl. events, actions, properties)',\n },\n {\n value: 'notebooks',\n 'data-attr': `support-form-target-area-notebooks`,\n label: 'Notebooks',\n },\n {\n value: 'mobile',\n 'data-attr': `support-form-target-area-mobile`,\n label: 'Mobile',\n },\n ],\n },\n {\n title: 'Individual product',\n options: [\n {\n value: 'experiments',\n 'data-attr': `support-form-target-area-experiments`,\n label: 'Experiments',\n },\n {\n value: 'data_warehouse',\n 'data-attr': `support-form-target-area-data_warehouse`,\n label: 'Data warehouse',\n },\n {\n value: 'batch_exports',\n 'data-attr': `support-form-target-area-batch-exports`,\n label: 'Batch exports',\n },\n {\n value: 'feature_flags',\n 'data-attr': `support-form-target-area-feature_flags`,\n label: 'Feature flags',\n },\n {\n value: 'analytics',\n 'data-attr': `support-form-target-area-analytics`,\n label: 'Product analytics (incl. insights, dashboards, annotations)',\n },\n {\n value: 'session_replay',\n 'data-attr': `support-form-target-area-session_replay`,\n label: 'Session replay (incl. recordings)',\n },\n {\n value: 'toolbar',\n 'data-attr': `support-form-target-area-toolbar`,\n label: 'Toolbar (incl. heatmaps)',\n },\n {\n value: 'surveys',\n 'data-attr': `support-form-target-area-surveys`,\n label: 'Surveys',\n },\n {\n value: 'web_analytics',\n 'data-attr': `support-form-target-area-web_analytics`,\n label: 'Web Analytics',\n },\n {\n value: 'error_tracking',\n 'data-attr': `support-form-target-area-error_tracking`,\n label: 'Error tracking',\n },\n ],\n },\n]\n\nexport const SEVERITY_LEVEL_TO_NAME = {\n critical: 'Outage, data loss, or data breach',\n high: 'Feature is not working at all',\n medium: 'Feature not working as expected',\n low: 'Question or feature request',\n}\n\nexport const SUPPORT_KIND_TO_SUBJECT = {\n bug: 'Bug Report',\n feedback: 'Feedback',\n support: 'Support Ticket',\n}\n\nexport type SupportTicketTargetArea =\n | 'experiments'\n | 'apps'\n | 'login'\n | 'billing'\n | 'onboarding'\n | 'cohorts'\n | 'data_management'\n | 'notebooks'\n | 'data_warehouse'\n | 'feature_flags'\n | 'analytics'\n | 'session_replay'\n | 'toolbar'\n | 'surveys'\n | 'web_analytics'\n | 'error_tracking'\nexport type SupportTicketSeverityLevel = keyof typeof SEVERITY_LEVEL_TO_NAME\nexport type SupportTicketKind = keyof typeof SUPPORT_KIND_TO_SUBJECT\n\nexport const getLabelBasedOnTargetArea = (target_area: SupportTicketTargetArea): null | string => {\n for (const category of TARGET_AREA_TO_NAME) {\n for (const option of category.options) {\n if (option.value === target_area) {\n return option.label\n }\n }\n }\n return null // Return null if the value is not found\n}\n\nexport const URL_PATH_TO_TARGET_AREA: Record = {\n insights: 'analytics',\n recordings: 'session_replay',\n replay: 'session_replay',\n dashboard: 'analytics',\n feature_flags: 'feature_flags',\n experiments: 'experiments',\n 'web-performance': 'session_replay',\n events: 'analytics',\n 'data-management': 'data_management',\n cohorts: 'cohorts',\n annotations: 'analytics',\n persons: 'analytics',\n groups: 'analytics',\n app: 'apps',\n toolbar: 'session_replay',\n warehouse: 'data_warehouse',\n surveys: 'surveys',\n web: 'web_analytics',\n}\n\nexport const SUPPORT_TICKET_TEMPLATES = {\n bug: 'Please describe the bug you saw, and how to reproduce it.\\n\\nIf the bug appeared on a specific insight or dashboard, please include a link to it.',\n feedback:\n \"If your request is due to a problem, please describe the problem as best you can.\\n\\nPlease also describe the solution you'd like to see, and any alternatives you considered.\\n\\nYou can add images below to help illustrate your request, if needed!\",\n support:\n \"Please explain as fully as possible what you're aiming to do, and what you'd like help with.\\n\\nIf your question involves an existing insight or dashboard, please include a link to it.\",\n}\n\nexport function getURLPathToTargetArea(pathname: string): SupportTicketTargetArea | null {\n const first_part = pathname.split('/')[1]\n return URL_PATH_TO_TARGET_AREA[first_part] ?? null\n}\n\nexport type SupportFormLogicProps = {\n onClose?: () => void\n}\n\nexport type SupportFormFields = {\n name: string\n email: string\n kind: SupportTicketKind\n target_area: SupportTicketTargetArea | null\n severity_level: SupportTicketSeverityLevel | null\n message: string\n isEmailFormOpen?: boolean | 'true' | 'false'\n}\n\nexport const supportLogic = kea([\n props({} as SupportFormLogicProps),\n path(['lib', 'components', 'support', 'supportLogic']),\n connect(() => ({\n values: [\n userLogic,\n ['user'],\n preflightLogic,\n ['preflight'],\n sidePanelStateLogic,\n ['sidePanelAvailable'],\n userLogic,\n ['hasAvailableFeature'],\n ],\n actions: [sidePanelStateLogic, ['openSidePanel', 'setSidePanelOptions']],\n })),\n actions(() => ({\n closeSupportForm: true,\n openSupportForm: (values: Partial) => values,\n submitZendeskTicket: (form: SupportFormFields) => form,\n updateUrlParams: true,\n openEmailForm: true,\n closeEmailForm: true,\n })),\n reducers(() => ({\n isSupportFormOpen: [\n false,\n {\n openSupportForm: () => true,\n closeSupportForm: () => false,\n },\n ],\n isEmailFormOpen: [\n false,\n {\n openEmailForm: () => true,\n closeEmailForm: () => false,\n },\n ],\n })),\n forms(({ actions, values }) => ({\n sendSupportRequest: {\n defaults: {\n name: '',\n email: '',\n kind: 'support',\n severity_level: null,\n target_area: null,\n message: '',\n } as SupportFormFields,\n errors: ({ name, email, message, kind, target_area, severity_level }) => {\n return {\n name: !values.user ? (!name ? 'Please enter your name' : '') : '',\n email: !values.user ? (!email ? 'Please enter your email' : '') : '',\n message: !message ? 'Please enter a message' : '',\n kind: !kind ? 'Please choose' : undefined,\n severity_level: !severity_level ? 'Please choose' : undefined,\n target_area: !target_area ? 'Please choose' : undefined,\n }\n },\n submit: async (formValues) => {\n // name must be present for zendesk to accept the ticket\n formValues.name = values.user?.first_name ?? formValues.name ?? 'name not set'\n formValues.email = values.user?.email ?? formValues.email ?? ''\n actions.submitZendeskTicket(formValues)\n actions.closeSupportForm()\n actions.resetSendSupportRequest()\n },\n },\n })),\n selectors({\n title: [\n (s) => [s.sendSupportRequest ?? null],\n (sendSupportRequest) =>\n sendSupportRequest.kind\n ? SUPPORT_TICKET_KIND_TO_TITLE[sendSupportRequest.kind]\n : 'Leave a message with PostHog',\n ],\n }),\n listeners(({ actions, props, values }) => ({\n updateUrlParams: async () => {\n const panelOptions = [\n values.sendSupportRequest.kind ?? '',\n values.sendSupportRequest.target_area ?? '',\n values.sendSupportRequest.severity_level ?? '',\n values.isEmailFormOpen ?? 'false',\n ].join(':')\n\n if (panelOptions !== ':') {\n actions.setSidePanelOptions(panelOptions)\n }\n },\n openSupportForm: async ({ name, email, isEmailFormOpen, kind, target_area, severity_level, message }) => {\n let area = target_area ?? getURLPathToTargetArea(window.location.pathname)\n if (!userLogic.values.user) {\n area = 'login'\n }\n kind = kind ?? 'support'\n actions.resetSendSupportRequest({\n name: name ?? '',\n email: email ?? '',\n kind,\n target_area: area,\n severity_level: severity_level ?? null,\n message: message ?? '',\n })\n\n if (isEmailFormOpen === 'true' || isEmailFormOpen === true) {\n actions.openEmailForm()\n } else {\n actions.closeEmailForm()\n }\n\n if (values.sidePanelAvailable) {\n const panelOptions = [kind ?? '', area ?? ''].join(':')\n actions.openSidePanel(SidePanelTab.Support, panelOptions === ':' ? undefined : panelOptions)\n } else {\n openSupportModal()\n }\n\n actions.updateUrlParams()\n },\n submitZendeskTicket: async ({ name, email, kind, target_area, severity_level, message }) => {\n const zendesk_ticket_uuid = uuid()\n const subject =\n SUPPORT_KIND_TO_SUBJECT[kind ?? 'support'] +\n ': ' +\n (target_area\n ? getLabelBasedOnTargetArea(target_area) ?? `${target_area} (feature preview)`\n : 'General') +\n ' (' +\n zendesk_ticket_uuid +\n ')'\n const cloudRegion = preflightLogic.values.preflight?.region\n\n const payload = {\n request: {\n requester: { name: name, email: email },\n subject: subject,\n custom_fields: [\n {\n id: 22084126888475,\n value: severity_level,\n },\n {\n id: 22129191462555,\n value: posthog.get_distinct_id(),\n },\n {\n id: 27242745654043,\n value: target_area ?? '',\n },\n {\n id: 27031528411291,\n value: userLogic?.values?.user?.organization?.id ?? '',\n },\n {\n id: 26073267652251,\n value: values.hasAvailableFeature(AvailableFeature.PRIORITY_SUPPORT)\n ? 'priority_support'\n : values.hasAvailableFeature(AvailableFeature.EMAIL_SUPPORT)\n ? 'email_support'\n : 'free_support',\n },\n ],\n comment: {\n body:\n message +\n `\\n\\n-----` +\n `\\nKind: ${kind}` +\n `\\nTarget area: ${target_area}` +\n `\\nReport event: http://go/ticketByUUID/${zendesk_ticket_uuid}` +\n getSessionReplayLink() +\n getErrorTrackingLink() +\n getCurrentLocationLink() +\n getDjangoAdminLink(\n userLogic.values.user,\n cloudRegion,\n organizationLogic.values.currentOrganization,\n teamLogic.values.currentTeam\n ) +\n (target_area === 'billing' || target_area === 'login' || target_area === 'onboarding'\n ? getBillingAdminLink(organizationLogic.values.currentOrganization)\n : '') +\n getSentryLink(cloudRegion, teamLogic.values.currentTeam) +\n (cloudRegion && teamLogic.values.currentTeam\n ? '\\nPersons-on-events mode for project: ' +\n (teamLogic.values.currentTeam.modifiers?.personsOnEventsMode ??\n teamLogic.values.currentTeam.default_modifiers?.personsOnEventsMode ??\n 'unknown')\n : ''),\n },\n },\n }\n\n try {\n const zendeskRequestBody = JSON.stringify(payload, undefined, 4)\n const response = await fetch('https://posthoghelp.zendesk.com/api/v2/requests.json', {\n method: 'POST',\n body: zendeskRequestBody,\n headers: { 'Content-Type': 'application/json' },\n })\n if (!response.ok) {\n const error = new Error(`There was an error creating the support ticket with zendesk.`)\n const extra: Record = { zendeskBody: zendeskRequestBody }\n Object.entries(payload).forEach(([key, value]) => {\n extra[`payload_${key}`] = value\n })\n const body = await response.text()\n const contexts = {\n response: {\n status_code: response.status,\n data: body,\n body_size: body?.length,\n },\n }\n captureException(error, {\n extra,\n contexts,\n })\n lemonToast.error(`There was an error sending the message.`)\n return\n }\n\n const json = await response.json()\n\n const zendesk_ticket_id = json.request.id\n const zendesk_ticket_link = `https://posthoghelp.zendesk.com/agent/tickets/${zendesk_ticket_id}`\n const properties = {\n zendesk_ticket_uuid,\n kind,\n target_area,\n message,\n zendesk_ticket_id,\n zendesk_ticket_link,\n }\n posthog.capture('support_ticket', properties)\n Sentry.captureMessage('User submitted Zendesk ticket', {\n tags: {\n zendesk_ticket_uuid,\n zendesk_ticket_link,\n support_request_kind: kind,\n support_request_area: target_area,\n team_id: teamLogic.values.currentTeamId,\n },\n extra: properties,\n level: 'log',\n })\n lemonToast.success(\"Got the message! If we have follow-up information for you, we'll reply via email.\")\n } catch (e) {\n captureException(e)\n lemonToast.error(`There was an error sending the message.`)\n }\n },\n\n closeSupportForm: () => {\n props.onClose?.()\n },\n\n setSendSupportRequestValue: () => {\n actions.updateUrlParams()\n },\n })),\n\n urlToAction(({ actions, values }) => ({\n '*': (_, _search, hashParams) => {\n if (values.isSupportFormOpen) {\n return\n }\n\n const [panel, ...panelOptions] = (hashParams['panel'] ?? '').split(':')\n\n if (panel === SidePanelTab.Support) {\n const [kind, area, severity, isEmailFormOpen] = panelOptions\n\n actions.openSupportForm({\n kind: Object.keys(SUPPORT_KIND_TO_SUBJECT).includes(kind) ? kind : null,\n target_area: getLabelBasedOnTargetArea(area) ? area : null,\n severity_level: Object.keys(SEVERITY_LEVEL_TO_NAME).includes(severity) ? severity : null,\n isEmailFormOpen: isEmailFormOpen ?? 'false',\n })\n return\n }\n\n // Legacy supportModal param\n if ('supportModal' in hashParams) {\n const [kind, area, severity] = (hashParams['supportModal'] || '').split(':')\n\n actions.openSupportForm({\n kind: Object.keys(SUPPORT_KIND_TO_SUBJECT).includes(kind) ? kind : null,\n target_area: Object.keys(TARGET_AREA_TO_NAME).includes(area) ? area : null,\n severity_level: Object.keys(SEVERITY_LEVEL_TO_NAME).includes(severity) ? severity : null,\n })\n }\n },\n })),\n])\n","import { actions, afterMount, kea, key, listeners, path, props, reducers, sharedListeners } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport api from 'lib/api'\nimport { isNotNil } from 'lib/utils'\nimport {\n diffVersions,\n highestVersion,\n isEqualVersion,\n parseVersion,\n SemanticVersion,\n tryParseVersion,\n versionToString,\n} from 'lib/utils/semver'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\n\nimport type { versionCheckerLogicType } from './versionCheckerLogicType'\n\n// If you would like to deprecate all posthog-js versions older than a specific version\n// (i.e. after fixing an important bug) please edit\n// https://github.com/PostHog/posthog-js/blob/main/deprecation.json\n\nconst CHECK_INTERVAL_MS = 1000 * 60 * 60 * 6 // 6 hour\n\nexport type SDKVersion = {\n version: SemanticVersion\n timestamp?: string\n}\n\nexport type SDKVersionWarning = {\n latestUsedVersion: string\n latestAvailableVersion: string\n numVersionsBehind?: number\n level: 'warning' | 'info' | 'error'\n}\n\nexport interface PosthogJSDeprecation {\n deprecateBeforeVersion?: string\n deprecateOlderThanDays?: number\n}\n\nexport interface AvailableVersions {\n sdkVersions?: SemanticVersion[]\n deprecation?: PosthogJSDeprecation\n}\n\nexport interface VersionCheckerLogicProps {\n teamId: number | null\n}\n\nexport const versionCheckerLogic = kea([\n props({ teamId: null } as VersionCheckerLogicProps),\n key(({ teamId }) => teamId || 'no-team-id'),\n path((key) => ['components', 'VersionChecker', 'versionCheckerLogic', key]),\n actions({\n setVersionWarning: (versionWarning: SDKVersionWarning | null) => ({ versionWarning }),\n setSdkVersions: (sdkVersions: SDKVersion[]) => ({ sdkVersions }),\n }),\n loaders(({ values }) => ({\n availableVersions: [\n {} as AvailableVersions,\n {\n loadAvailableVersions: async (): Promise => {\n // Make both requests simultaneously and don't return until both have finished, to avoid a flash\n // of partial results in the UI.\n const availableVersionsPromise: Promise = fetch(\n 'https://api.github.com/repos/posthog/posthog-js/tags'\n )\n .then((r) => r.json())\n .then((r) => r.map((x: any) => tryParseVersion(x.name)).filter(isNotNil))\n const deprecationPromise: Promise = fetch(\n 'https://raw.githubusercontent.com/PostHog/posthog-js/main/deprecation.json'\n ).then((r) => r.json())\n const settled = await Promise.allSettled([availableVersionsPromise, deprecationPromise])\n const availableVersions = settled[0].status === 'fulfilled' ? settled[0].value : []\n const deprecation = settled[1].status === 'fulfilled' ? settled[1].value : {}\n // if one or more of the requests failed, merge in the previous value if we have one\n return {\n ...values.availableVersions,\n sdkVersions: availableVersions,\n deprecation: deprecation,\n }\n },\n },\n ],\n usedVersions: [\n null as SDKVersion[] | null,\n {\n loadUsedVersions: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT properties.$lib_version AS lib_version, max(timestamp) AS latest_timestamp, count(lib_version) as count\n FROM events\n WHERE timestamp >= now() - INTERVAL 1 DAY \n AND timestamp <= now()\n AND properties.$lib = 'web'\n GROUP BY lib_version\n ORDER BY latest_timestamp DESC\n limit 10`,\n }\n\n const res = await api.query(query, undefined, undefined, true)\n\n return (\n res.results\n ?.map((x) => {\n const version = tryParseVersion(x[0])\n if (!version) {\n return null\n }\n return {\n version,\n timestamp: x[1],\n }\n })\n .filter(isNotNil) ?? null\n )\n },\n },\n ],\n })),\n\n reducers({\n lastCheckTimestamp: [\n 0,\n { persist: true },\n {\n loadUsedVersionsSuccess: () => Date.now(),\n },\n ],\n versionWarning: [\n null as SDKVersionWarning | null,\n // bumping cache key due to an incorrect tag being cached on 2024-02-12\n { persist: true, prefix: '2024-02-12' },\n {\n setVersionWarning: (_, { versionWarning }) => versionWarning,\n },\n ],\n }),\n\n sharedListeners(({ values, actions }) => ({\n checkForVersionWarning: () => {\n if (!values.usedVersions?.length) {\n return\n }\n const { deprecation, sdkVersions } = values.availableVersions\n\n // We want the highest semantic version to be the latest used one, rather than\n // the one with the latest timestamp, because secondary installations can spew old versions\n const latestUsedVersion = highestVersion(values.usedVersions.map((v) => v.version))\n\n // the latest version published on github\n const latestAvailableVersion = sdkVersions?.[0]\n\n // the version where, anything before this deprecated (i.e. this version is allowed, before it is not)\n const deprecateBeforeVersion = deprecation?.deprecateBeforeVersion\n ? parseVersion(deprecation.deprecateBeforeVersion)\n : null\n\n let warning: SDKVersionWarning | null = null\n\n if (deprecateBeforeVersion) {\n const diff = diffVersions(deprecateBeforeVersion, latestUsedVersion)\n // if they are behind the deprecatedBeforeVersion by any amount, show an error\n if (diff && diff.diff > 0) {\n warning = {\n latestUsedVersion: versionToString(latestUsedVersion),\n latestAvailableVersion: versionToString(latestAvailableVersion || deprecateBeforeVersion),\n level: 'error',\n }\n }\n }\n\n if (!warning && sdkVersions && latestAvailableVersion) {\n const diff = diffVersions(latestAvailableVersion, latestUsedVersion)\n\n if (diff && diff.diff > 0) {\n // there's a difference between the latest used version and the latest available version\n\n let numVersionsBehind = sdkVersions.findIndex((v) => isEqualVersion(v, latestUsedVersion))\n if (numVersionsBehind === -1) {\n // if we couldn't find the versions, use the length of the list as a fallback\n numVersionsBehind = sdkVersions.length - 1\n }\n if (numVersionsBehind < diff.diff) {\n // we might have deleted versions, but if the actual diff is X then we must be at least X versions behind\n numVersionsBehind = diff.diff\n }\n\n let level: 'warning' | 'info' | 'error' | undefined\n if (diff.kind === 'major') {\n level = 'info' // it is desirable to be on the latest major version, but not critical\n } else if (diff.kind === 'minor') {\n level = numVersionsBehind >= 40 ? 'warning' : undefined\n }\n\n if (level === undefined && numVersionsBehind >= 50) {\n level = 'error'\n }\n\n // we check if there is a \"latest user version string\" to avoid returning odd data in unexpected cases\n if (level && !!versionToString(latestUsedVersion).trim().length) {\n warning = {\n latestUsedVersion: versionToString(latestUsedVersion),\n latestAvailableVersion: versionToString(latestAvailableVersion),\n level,\n numVersionsBehind,\n }\n }\n }\n }\n\n actions.setVersionWarning(warning)\n },\n })),\n\n listeners(({ sharedListeners }) => ({\n loadAvailableVersionsSuccess: sharedListeners.checkForVersionWarning,\n loadUsedVersionsSuccess: sharedListeners.checkForVersionWarning,\n })),\n\n afterMount(({ actions, values }) => {\n if (values.lastCheckTimestamp < Date.now() - CHECK_INTERVAL_MS) {\n actions.loadAvailableVersions()\n actions.loadUsedVersions()\n }\n }),\n])\n","import { useValues } from 'kea'\nimport { TextContent } from 'lib/components/Cards/TextCard/TextCard'\nimport { useUploadFiles } from 'lib/hooks/useUploadFiles'\nimport { IconMarkdown, IconTools } from 'lib/lemon-ui/icons'\nimport { LemonFileInput } from 'lib/lemon-ui/LemonFileInput'\nimport { LemonTabs } from 'lib/lemon-ui/LemonTabs'\nimport { LemonTextArea, LemonTextAreaProps } from 'lib/lemon-ui/LemonTextArea/LemonTextArea'\nimport { lemonToast } from 'lib/lemon-ui/LemonToast'\nimport { Link } from 'lib/lemon-ui/Link'\nimport { Tooltip } from 'lib/lemon-ui/Tooltip'\nimport posthog from 'posthog-js'\nimport React, { useRef, useState } from 'react'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\n\nexport const LemonTextAreaMarkdown = React.forwardRef(\n function _LemonTextAreaMarkdown({ value, onChange, ...editAreaProps }, ref): JSX.Element {\n const { objectStorageAvailable } = useValues(preflightLogic)\n\n const [isPreviewShown, setIsPreviewShown] = useState(false)\n const dropRef = useRef(null)\n\n const { setFilesToUpload, filesToUpload, uploading } = useUploadFiles({\n onUpload: (url, fileName) => {\n onChange?.(value + `\\n\\n![${fileName}](${url})`)\n posthog.capture('markdown image uploaded', { name: fileName })\n },\n onError: (detail) => {\n posthog.capture('markdown image upload failed', { error: detail })\n lemonToast.error(`Error uploading image: ${detail}`)\n },\n })\n\n return (\n setIsPreviewShown(key === 'preview')}\n tabs={[\n {\n key: 'write',\n label: 'Write',\n content: (\n
\n \n
\n \n Markdown formatting support\n
\n {objectStorageAvailable ? (\n \n ) : (\n
\n \n \n \n \n \n \n Add external images using{' '}\n \n {' '}\n Markdown image links\n \n .\n \n
\n )}\n
\n ),\n },\n {\n key: 'preview',\n label: 'Preview',\n content: value ? (\n \n ) : (\n Nothing to preview\n ),\n },\n ]}\n />\n )\n }\n)\n","// This file contains example queries, used in storybook and in the /query interface.\nimport { defaultDataTableColumns } from '~/queries/nodes/DataTable/utils'\nimport {\n ActionsNode,\n DataTableNode,\n DataVisualizationNode,\n EventsNode,\n EventsQuery,\n FunnelsQuery,\n HogQLQuery,\n HogQuery,\n InsightVizNode,\n LifecycleQuery,\n Node,\n NodeKind,\n PathsQuery,\n PersonsNode,\n RetentionQuery,\n StickinessQuery,\n TrendsQuery,\n} from '~/queries/schema'\nimport {\n ChartDisplayType,\n FilterLogicalOperator,\n PropertyFilterType,\n PropertyGroupFilter,\n PropertyOperator,\n StepOrderValue,\n} from '~/types'\n\nconst Events: EventsQuery = {\n kind: NodeKind.EventsQuery,\n select: defaultDataTableColumns(NodeKind.EventsQuery),\n properties: [\n { type: PropertyFilterType.Event, key: '$browser', operator: PropertyOperator.Exact, value: 'Chrome' },\n ],\n after: '-24h',\n limit: 100,\n}\n\nconst EventsTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n source: Events,\n}\nconst EventsTableFull: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: Events,\n}\n\nconst TotalEvents: EventsQuery = {\n kind: NodeKind.EventsQuery,\n select: ['count()'],\n}\n\nexport const TotalEventsTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: TotalEvents,\n}\n\nconst PropertyFormulas: EventsQuery = {\n kind: NodeKind.EventsQuery,\n select: [\n '1 + 2 + 3',\n 'event',\n 'person.created_at',\n \"concat(properties['$browser'], ' 💚 ', properties['$geoip_city_name']) -- Browser 💚 City\",\n \"'random string'\",\n ],\n limit: 100,\n}\n\nconst PropertyFormulasTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: PropertyFormulas,\n}\n\nconst EventAggregations: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: {\n kind: NodeKind.EventsQuery,\n select: [\n \"concat(properties['$geoip_city_name'], ' ', 'Rocks') -- City\",\n 'event',\n 'count() + 100000 -- Inflamed total',\n '1 + 2',\n ],\n orderBy: ['-count()'],\n },\n}\n\nconst Persons: PersonsNode = {\n kind: NodeKind.PersonsNode,\n properties: [\n { type: PropertyFilterType.Person, key: '$browser', operator: PropertyOperator.Exact, value: 'Chrome' },\n ],\n}\n\nconst PersonsTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n columns: defaultDataTableColumns(NodeKind.PersonsNode),\n source: Persons,\n}\n\nconst PersonsTableFull: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n columns: defaultDataTableColumns(NodeKind.PersonsNode),\n source: Persons,\n}\n\nconst properties: PropertyGroupFilter = {\n type: FilterLogicalOperator.And,\n values: [\n {\n type: FilterLogicalOperator.Or,\n values: [\n {\n type: PropertyFilterType.Event,\n key: '$current_url',\n operator: PropertyOperator.Exact,\n value: ['https://hedgebox.net/files/'],\n },\n {\n type: PropertyFilterType.Event,\n key: '$geoip_country_code',\n operator: PropertyOperator.Exact,\n value: ['US', 'AU'],\n },\n ],\n },\n ],\n}\n\nconst filterTestAccounts = false\nconst series: (EventsNode | ActionsNode)[] = [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n custom_name: 'Views',\n event: '$pageview',\n properties: [\n {\n type: PropertyFilterType.Event,\n key: '$browser',\n operator: PropertyOperator.Exact,\n value: 'Chrome',\n },\n {\n type: PropertyFilterType.Cohort,\n key: 'id',\n operator: PropertyOperator.In,\n value: 2,\n },\n ],\n },\n // {\n // kind: NodeKind.ActionsNode,\n // id: 1,\n // name: 'Interacted with file',\n // custom_name: 'Interactions',\n // properties: [\n // {\n // type: PropertyFilterType.Event,\n // key: '$geoip_country_code',\n // operator: PropertyOperator.Exact,\n // value: ['US'],\n // },\n // ],\n // math: PropertyMathType.Average,\n // math_property: '$session_duration',\n // },\n]\n\nconst InsightTrendsQuery: TrendsQuery = {\n kind: NodeKind.TrendsQuery,\n properties,\n filterTestAccounts,\n interval: 'day',\n dateRange: {\n date_from: '-7d',\n },\n series,\n trendsFilter: {\n display: ChartDisplayType.ActionsAreaGraph,\n },\n breakdownFilter: {\n breakdown: '$geoip_country_code',\n breakdown_type: 'event',\n },\n}\n\nconst InsightFunnelsQuery: FunnelsQuery = {\n kind: NodeKind.FunnelsQuery,\n properties,\n filterTestAccounts,\n interval: 'day',\n dateRange: {\n date_from: '-7d',\n },\n series,\n funnelsFilter: {\n funnelOrderType: StepOrderValue.ORDERED,\n },\n breakdownFilter: {\n breakdown: '$geoip_country_code',\n breakdown_type: 'event',\n },\n}\n\nconst InsightRetentionQuery: RetentionQuery = {\n kind: NodeKind.RetentionQuery,\n properties,\n filterTestAccounts,\n retentionFilter: {\n // TODO: this should be typed as (EventsNode | ActionsNode)[] without math and properties\n targetEntity: { type: 'events', id: '$pageview', name: '$pageview' },\n returningEntity: { type: 'events', id: '$pageview', name: '$pageview' },\n },\n}\n\nconst InsightPathsQuery: PathsQuery = {\n kind: NodeKind.PathsQuery,\n properties,\n filterTestAccounts,\n pathsFilter: {},\n}\n\nconst InsightStickinessQuery: StickinessQuery = {\n kind: NodeKind.StickinessQuery,\n properties,\n filterTestAccounts,\n interval: 'day',\n dateRange: {\n date_from: '-7d',\n },\n series,\n stickinessFilter: {},\n}\n\nconst InsightLifecycleQuery: LifecycleQuery = {\n kind: NodeKind.LifecycleQuery,\n properties,\n filterTestAccounts,\n dateRange: {\n date_from: '-7d',\n },\n series, // TODO: Visualization only supports one event or action\n}\n\nconst HogQLRaw: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: ` select event,\n person.properties.email,\n properties.$browser,\n count()\n from events\n where {filters} -- replaced with global date and property filters\n and person.properties.email is not null\n group by event,\n properties.$browser,\n person.properties.email\n order by count() desc\n limit 100`,\n filters: {\n dateRange: {\n date_from: '-24h',\n },\n },\n}\n\nconst HogQLForDataVisualization: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `select toDate(timestamp) as timestamp, count()\nfrom events\nwhere {filters} and timestamp <= now()\ngroup by timestamp\norder by timestamp asc\nlimit 100`,\n explain: true,\n filters: {\n dateRange: {\n date_from: '-7d',\n },\n },\n}\n\nconst HogQLForDataWarehouse: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `select toDate(timestamp) as timestamp, count()\nfrom events\ngroup by timestamp\nlimit 100`,\n explain: true,\n}\n\nconst DataWarehouse: DataVisualizationNode = {\n kind: NodeKind.DataVisualizationNode,\n source: HogQLForDataWarehouse,\n}\n\nconst HogQLTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: HogQLRaw,\n}\n\nconst DataVisualization: DataVisualizationNode = {\n kind: NodeKind.DataVisualizationNode,\n source: HogQLForDataVisualization,\n tableSettings: {\n columns: [\n {\n column: 'timestamp',\n settings: {\n formatting: {\n prefix: '',\n suffix: '',\n },\n },\n },\n {\n column: 'count()',\n settings: {\n formatting: {\n prefix: '',\n suffix: '',\n },\n },\n },\n ],\n },\n chartSettings: { goalLines: undefined },\n}\n\nconst Hog: HogQuery = {\n kind: NodeKind.HogQuery,\n code: 'return 1 + 2;',\n}\n\nconst Hoggonacci: HogQuery = {\n kind: NodeKind.HogQuery,\n code: `fn fibonacci(number) {\n if (number < 2) {\n return number;\n } else {\n return fibonacci(number - 1) + fibonacci(number - 2);\n }\n}\nreturn fibonacci(16);`,\n}\n/* a subset of examples including only those we can show all users and that don't use HogQL */\nexport const queryExamples: Record = {\n Events,\n EventsTable,\n EventsTableFull,\n TotalEventsTable,\n PropertyFormulasTable,\n EventAggregations,\n Persons,\n PersonsTable,\n PersonsTableFull,\n InsightTrendsQuery,\n InsightTrends: { kind: NodeKind.InsightVizNode, source: InsightTrendsQuery } as InsightVizNode,\n InsightFunnelsQuery,\n InsightFunnels: { kind: NodeKind.InsightVizNode, source: InsightFunnelsQuery } as InsightVizNode,\n InsightRetentionQuery,\n InsightRetention: {\n kind: NodeKind.InsightVizNode,\n source: InsightRetentionQuery,\n } as InsightVizNode,\n InsightPathsQuery,\n InsightPaths: { kind: NodeKind.InsightVizNode, source: InsightPathsQuery } as InsightVizNode,\n InsightStickinessQuery,\n InsightStickiness: {\n kind: NodeKind.InsightVizNode,\n source: InsightStickinessQuery,\n } as InsightVizNode,\n InsightLifecycleQuery,\n InsightLifecycle: {\n kind: NodeKind.InsightVizNode,\n source: InsightLifecycleQuery,\n } as InsightVizNode,\n}\n\nexport const stringifiedQueryExamples: Record = Object.fromEntries(\n Object.entries(queryExamples).map(([key, node]) => [key, JSON.stringify(node)])\n)\n\nexport const examples: Record = {\n ...queryExamples,\n HogQLRaw,\n HogQLTable,\n DataVisualization,\n Hog,\n Hoggonacci,\n DataWarehouse,\n}\n\nexport const stringifiedExamples: Record = Object.fromEntries(\n Object.entries(examples).map(([key, node]) => [key, JSON.stringify(node)])\n)\n","import * as d3 from 'd3'\nimport * as Sankey from 'd3-sankey'\nimport { D3Selector } from 'lib/hooks/useD3'\nimport { stripHTTP } from 'lib/utils'\nimport { Dispatch, RefObject, SetStateAction } from 'react'\n\nimport { FunnelPathsFilter, PathsFilter } from '~/queries/schema'\n\nimport { FALLBACK_CANVAS_WIDTH, HIDE_PATH_CARD_HEIGHT } from './Paths'\nimport { PathNode } from './pathsDataLogic'\nimport { isSelectedPathStartOrEnd, PathNodeData, PathTargetLink, roundedRect } from './pathUtils'\n\nconst createCanvas = (canvasRef: RefObject, width: number, height: number): D3Selector => {\n return d3\n .select(canvasRef.current)\n .append('svg')\n .classed('Paths__canvas', true)\n .style('background', 'var(--item-background)')\n .style('width', `${width}px`)\n .style('height', `${height}px`)\n}\n\nconst createSankey = (width: number, height: number): Sankey.SankeyLayout => {\n // @ts-expect-error - d3 sankey typing things\n return new Sankey.sankey()\n .nodeId((d: PathNodeData) => d.name)\n .nodeAlign(Sankey.sankeyJustify)\n .nodeSort(null)\n .nodeWidth(15)\n .size([width, height])\n}\n\nconst appendPathNodes = (\n svg: any,\n nodes: PathNodeData[],\n pathsFilter: PathsFilter,\n funnelPathsFilter: FunnelPathsFilter,\n setNodeCards: Dispatch>\n): void => {\n svg.append('g')\n .selectAll('rect')\n .data(nodes)\n .join('rect')\n .attr('x', (d: PathNodeData) => d.x0 + 1)\n .attr('y', (d: PathNodeData) => d.y0)\n .attr('height', (d: PathNodeData) => d.y1 - d.y0)\n .attr('width', (d: PathNodeData) => d.x1 - d.x0 - 2)\n .attr('fill', (d: PathNodeData) => {\n let c\n for (const link of d.sourceLinks) {\n if (c === undefined) {\n c = link.color\n } else if (c !== link.color) {\n c = null\n }\n }\n if (c === undefined) {\n for (const link of d.targetLinks) {\n if (c === undefined) {\n c = link.color\n } else if (c !== link.color) {\n c = null\n }\n }\n }\n if (isSelectedPathStartOrEnd(pathsFilter, funnelPathsFilter, d)) {\n return d3.color('purple')\n }\n const startNodeColor = c && d3.color(c) ? d3.color(c) : d3.color('#5375ff')\n return startNodeColor\n })\n .on('mouseover', (_event: MouseEvent, data: PathNodeData) => {\n if (data.y1 - data.y0 > HIDE_PATH_CARD_HEIGHT) {\n return\n }\n setNodeCards(\n nodes.map((node: PathNodeData) =>\n node.index === data.index\n ? { ...node, visible: true }\n : { ...node, visible: node.y1 - node.y0 > HIDE_PATH_CARD_HEIGHT }\n )\n )\n })\n .append('title')\n .text((d: PathNodeData) => `${stripHTTP(d.name)}\\n${d.value.toLocaleString()}`)\n}\n\nconst appendDropoffs = (svg: D3Selector): void => {\n const dropOffGradient = svg\n .append('defs')\n .append('linearGradient')\n .attr('id', 'dropoff-gradient')\n .attr('gradientTransform', 'rotate(90)')\n\n dropOffGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgba(220,53,69,0.7)')\n\n dropOffGradient.append('stop').attr('offset', '100%').attr('stop-color', 'var(--bg-light)')\n}\n\nconst appendPathLinks = (\n svg: any,\n links: PathNodeData[],\n nodes: PathNodeData[],\n setNodeCards: Dispatch>\n): void => {\n const link = svg\n .append('g')\n .attr('fill', 'none')\n .selectAll('g')\n .data(links)\n .join('g')\n .attr('stroke', 'var(--primary)')\n .attr('opacity', 0.35)\n\n link.append('path')\n .attr('d', Sankey.sankeyLinkHorizontal())\n .attr('id', (d: PathNodeData) => `path-${d.index}`)\n .attr('stroke-width', (d: PathNodeData) => {\n return Math.max(1, d.width)\n })\n .on('mouseover', (_event: MouseEvent, data: PathNodeData) => {\n svg.select(`#path-${data.index}`).attr('stroke', 'blue')\n if (data?.source?.targetLinks.length === 0) {\n return\n }\n const nodesToColor = [data.source]\n const pathCardsToShow: number[] = []\n while (nodesToColor.length > 0) {\n const _node = nodesToColor.pop()\n _node?.targetLinks.forEach((_link: PathTargetLink) => {\n svg.select(`#path-${_link.index}`).attr('stroke', 'blue')\n nodesToColor.push(_link.source)\n pathCardsToShow.push(_link.source.index)\n })\n }\n const pathCards = [data.target]\n pathCardsToShow.push(data.target.index, data.source.index)\n while (pathCards.length > 0) {\n const node = pathCards.pop()\n node?.sourceLinks.forEach((l: PathTargetLink) => {\n pathCards.push(l.target)\n pathCardsToShow.push(l.target.index)\n })\n }\n setNodeCards(\n nodes.map((node: PathNodeData) => ({\n ...node,\n ...{\n visible: pathCardsToShow.includes(node.index)\n ? true\n : node.y1 - node.y0 > HIDE_PATH_CARD_HEIGHT,\n },\n }))\n )\n })\n .on('mouseleave', () => {\n svg.selectAll('path').attr('stroke', 'var(--primary)')\n })\n\n link.append('g')\n .append('path')\n .attr('d', (data: PathNodeData) => {\n if (data.source.layer === 0) {\n return\n }\n const _height =\n data.source.y1 - data.source.y0 - data.source.sourceLinks.reduce((prev, curr) => prev + curr.width, 0)\n return roundedRect(0, 0, 30, _height, Math.min(25, _height), false, true, false, false)\n })\n .attr('fill', 'url(#dropoff-gradient)')\n .attr('stroke-width', 0)\n .attr('transform', (data: PathNodeData) => {\n return (\n 'translate(' +\n Math.round(data.source.x1) +\n ',' +\n Math.round(data.source.y0 + data.source.sourceLinks.reduce((prev, curr) => prev + curr.width, 0)) +\n ')'\n )\n })\n}\n\nconst addChartAxisLines = (svg: D3Selector, height: number, nodes: PathNodeData[], maxLayer: number): void => {\n if (maxLayer > 5) {\n const arr = [...Array(maxLayer)]\n const minWidthApart = nodes[1].x0 - nodes[0].x0\n arr.forEach((_, i) => {\n svg.append('line')\n .style('stroke', 'var(--border)')\n .attr('stroke-width', 2)\n .attr('x1', minWidthApart * (i + 1) - 20)\n .attr('y1', 0)\n .attr('x2', minWidthApart * (i + 1) - 20)\n .attr('y2', height)\n })\n }\n}\n\nexport function renderPaths(\n canvasRef: RefObject,\n canvasWidth: number,\n canvasHeight: number,\n paths: { links: PathNode[]; nodes: any[] },\n pathsFilter: PathsFilter,\n funnelPathsFilter: FunnelPathsFilter,\n setNodeCards: Dispatch>\n): void {\n if (!paths || paths.nodes.length === 0) {\n return\n }\n\n const maxLayer = paths.links.reduce((prev, curr) => {\n // @ts-expect-error - sometimes target is an object instead of string\n const currNum = curr.target.name || curr.target\n return Math.max(prev, Number(currNum.match(/[^_]*/)))\n }, 0)\n\n const minWidth = canvasWidth > FALLBACK_CANVAS_WIDTH || maxLayer < 3 ? canvasWidth : FALLBACK_CANVAS_WIDTH\n\n const width = maxLayer > 5 && canvasWidth ? (minWidth / 5) * maxLayer : minWidth\n const height = canvasHeight\n\n const svg = createCanvas(canvasRef, width, height)\n const sankey = createSankey(width, height)\n const { nodes, links } = sankey({\n nodes: paths.nodes.map((d) => ({ ...d })),\n links: paths.links.map((d) => ({ ...d })),\n })\n\n setNodeCards(nodes.map((node: PathNodeData) => ({ ...node, visible: node.y1 - node.y0 > HIDE_PATH_CARD_HEIGHT })))\n\n appendPathNodes(svg, nodes, pathsFilter, funnelPathsFilter, setNodeCards)\n appendDropoffs(svg)\n appendPathLinks(svg, links, nodes, setNodeCards)\n addChartAxisLines(svg, height, nodes, maxLayer)\n}\n","import { LemonDialog, lemonToast, Link } from '@posthog/lemon-ui'\nimport { actions, afterMount, connect, kea, listeners, path, reducers, selectors } from 'kea'\nimport { FieldNamePath, forms } from 'kea-forms'\nimport { loaders } from 'kea-loaders'\nimport { router, urlToAction } from 'kea-router'\nimport api, { getJSONOrNull } from 'lib/api'\nimport { FEATURE_FLAGS } from 'lib/constants'\nimport { dayjs } from 'lib/dayjs'\nimport { LemonBannerAction } from 'lib/lemon-ui/LemonBanner/LemonBanner'\nimport { lemonBannerLogic } from 'lib/lemon-ui/LemonBanner/lemonBannerLogic'\nimport { LemonButtonPropsBase } from 'lib/lemon-ui/LemonButton'\nimport { featureFlagLogic } from 'lib/logic/featureFlagLogic'\nimport { pluralize } from 'lib/utils'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\nimport posthog from 'posthog-js'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { userLogic } from 'scenes/userLogic'\n\nimport { BillingPlanType, BillingProductV2Type, BillingType, ProductKey } from '~/types'\n\nimport type { billingLogicType } from './billingLogicType'\nimport { DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD } from './CreditCTAHero'\n\nexport const ALLOCATION_THRESHOLD_ALERT = 0.85 // Threshold to show warning of event usage near limit\nexport const ALLOCATION_THRESHOLD_BLOCK = 1.2 // Threshold to block usage\n\nexport interface BillingAlertConfig {\n status: 'info' | 'warning' | 'error'\n title: string\n message?: string\n contactSupport?: boolean\n buttonCTA?: string\n dismissKey?: string\n action?: LemonBannerAction\n pathName?: string\n onClose?: () => void\n}\n\nexport enum BillingAPIErrorCodes {\n OPEN_INVOICES_ERROR = 'open_invoices_error',\n NO_ACTIVE_PAYMENT_METHOD_ERROR = 'no_active_payment_method_error',\n COULD_NOT_PAY_INVOICES_ERROR = 'could_not_pay_invoices_error',\n}\n\nexport interface UnsubscribeError {\n detail: string | JSX.Element\n link: JSX.Element\n}\n\nexport interface BillingError {\n status: 'info' | 'warning' | 'error'\n message: string\n action: LemonButtonPropsBase\n}\n\nconst parseBillingResponse = (data: Partial): BillingType => {\n if (data.billing_period) {\n data.billing_period = {\n current_period_start: dayjs(data.billing_period.current_period_start),\n current_period_end: dayjs(data.billing_period.current_period_end),\n interval: data.billing_period.interval,\n }\n }\n\n data.free_trial_until = data.free_trial_until ? dayjs(data.free_trial_until) : undefined\n data.amount_off_expires_at = data.amount_off_expires_at ? dayjs(data.amount_off_expires_at) : undefined\n // If expiration is in the middle of the current period, we let it expire at the end of the period\n if (\n data.amount_off_expires_at &&\n data.billing_period &&\n data.amount_off_expires_at.isBefore(data.billing_period.current_period_end) &&\n data.amount_off_expires_at.isAfter(data.billing_period.current_period_start)\n ) {\n data.amount_off_expires_at = data.billing_period.current_period_end\n }\n\n return data as BillingType\n}\n\nexport const billingLogic = kea([\n path(['scenes', 'billing', 'billingLogic']),\n actions({\n setProductSpecificAlert: (productSpecificAlert: BillingAlertConfig | null) => ({ productSpecificAlert }),\n setScrollToProductKey: (scrollToProductKey: ProductKey | null) => ({ scrollToProductKey }),\n setShowLicenseDirectInput: (show: boolean) => ({ show }),\n reportBillingAlertShown: (alertConfig: BillingAlertConfig) => ({ alertConfig }),\n reportBillingAlertActionClicked: (alertConfig: BillingAlertConfig) => ({ alertConfig }),\n reportCreditsFormSubmitted: (creditInput: number) => ({ creditInput }),\n reportCreditsModalShown: true,\n reportBillingShown: true,\n registerInstrumentationProps: true,\n reportCreditsCTAShown: (creditOverview: any) => ({ creditOverview }),\n setRedirectPath: true,\n setIsOnboarding: true,\n determineBillingAlert: true,\n setUnsubscribeError: (error: null | UnsubscribeError) => ({ error }),\n resetUnsubscribeError: true,\n setBillingAlert: (billingAlert: BillingAlertConfig | null) => ({ billingAlert }),\n showPurchaseCreditsModal: (isOpen: boolean) => ({ isOpen }),\n toggleCreditCTAHeroDismissed: (isDismissed: boolean) => ({ isDismissed }),\n setComputedDiscount: (discount: number) => ({ discount }),\n }),\n connect(() => ({\n values: [featureFlagLogic, ['featureFlags'], preflightLogic, ['preflight']],\n actions: [\n userLogic,\n ['loadUser'],\n eventUsageLogic,\n ['reportProductUnsubscribed'],\n lemonBannerLogic({ dismissKey: 'usage-limit-exceeded' }),\n ['resetDismissKey as resetUsageLimitExceededKey'],\n lemonBannerLogic({ dismissKey: 'usage-limit-approaching' }),\n ['resetDismissKey as resetUsageLimitApproachingKey'],\n ],\n })),\n reducers({\n billingAlert: [\n null as BillingAlertConfig | null,\n {\n setBillingAlert: (_, { billingAlert }) => billingAlert,\n },\n ],\n scrollToProductKey: [\n null as ProductKey | null,\n {\n setScrollToProductKey: (_, { scrollToProductKey }) => scrollToProductKey,\n },\n ],\n productSpecificAlert: [\n null as BillingAlertConfig | null,\n {\n setProductSpecificAlert: (_, { productSpecificAlert }) => productSpecificAlert,\n },\n ],\n showLicenseDirectInput: [\n false,\n {\n setShowLicenseDirectInput: (_, { show }) => show,\n },\n ],\n redirectPath: [\n '' as string,\n {\n setRedirectPath: () => {\n return window.location.pathname.includes('/onboarding')\n ? window.location.pathname + window.location.search\n : ''\n },\n },\n ],\n isOnboarding: [\n false,\n {\n setIsOnboarding: () => window.location.pathname.includes('/onboarding'),\n },\n ],\n unsubscribeError: [\n null as null | UnsubscribeError,\n {\n resetUnsubscribeError: () => null,\n setUnsubscribeError: (_, { error }) => error,\n },\n ],\n timeRemainingInSeconds: [\n 0,\n {\n loadBillingSuccess: (_, { billing }) => {\n if (!billing?.billing_period) {\n return 0\n }\n const currentTime = dayjs()\n const periodEnd = dayjs(billing.billing_period.current_period_end)\n return periodEnd.diff(currentTime, 'second')\n },\n },\n ],\n timeTotalInSeconds: [\n 0,\n {\n loadBillingSuccess: (_, { billing }) => {\n if (!billing?.billing_period) {\n return 0\n }\n const periodStart = dayjs(billing.billing_period.current_period_start)\n const periodEnd = dayjs(billing.billing_period.current_period_end)\n return periodEnd.diff(periodStart, 'second')\n },\n },\n ],\n isPurchaseCreditsModalOpen: [\n false,\n {\n showPurchaseCreditsModal: (_, { isOpen }) => isOpen,\n },\n ],\n isCreditCTAHeroDismissed: [\n false,\n { persist: true },\n {\n toggleCreditCTAHeroDismissed: (_, { isDismissed }) => isDismissed,\n },\n ],\n computedDiscount: [\n 0,\n {\n setComputedDiscount: (_, { discount }) => discount,\n },\n ],\n }),\n loaders(({ actions, values }) => ({\n billing: [\n null as BillingType | null,\n {\n loadBilling: async () => {\n // Note: this is a temporary flag to skip forecasting in the billing page\n // for customers running into performance issues until we have a more permanent fix\n // of splitting the billing and forecasting data.\n const skipForecasting = values.featureFlags[FEATURE_FLAGS.BILLING_SKIP_FORECASTING]\n const response = await api.get(\n 'api/billing' + (skipForecasting ? '?include_forecasting=false' : '')\n )\n\n return parseBillingResponse(response)\n },\n\n updateBillingLimits: async (limits: { [key: string]: number | null }) => {\n try {\n const response = await api.update('api/billing', { custom_limits_usd: limits })\n lemonToast.success('Billing limits updated')\n return parseBillingResponse(response)\n } catch (error: any) {\n lemonToast.error(\n 'There was an error updating your billing limits. Please try again or contact support.'\n )\n throw error\n }\n },\n\n deactivateProduct: async (key: string) => {\n // clear upgrade params from URL\n // Note(@zach): This is not working properly. We need to look into this.\n const currentURL = new URL(window.location.href)\n currentURL.searchParams.delete('upgraded')\n currentURL.searchParams.delete('products')\n router.actions.push(currentURL.pathname + currentURL.search)\n\n actions.resetUnsubscribeError()\n try {\n const response = await api.getResponse('api/billing/deactivate?products=' + key)\n const jsonRes = await getJSONOrNull(response)\n\n lemonToast.success(\n \"You have been unsubscribed. We're sad to see you go. May the hedgehogs be ever in your favor.\"\n )\n actions.reportProductUnsubscribed(key)\n\n return parseBillingResponse(jsonRes)\n } catch (error: any) {\n if (error.code) {\n if (error.code === BillingAPIErrorCodes.OPEN_INVOICES_ERROR) {\n actions.setUnsubscribeError({\n detail: error.detail,\n link: (\n \n View invoices\n \n ),\n } as UnsubscribeError)\n } else if (error.code === BillingAPIErrorCodes.NO_ACTIVE_PAYMENT_METHOD_ERROR) {\n actions.setUnsubscribeError({\n detail: error.detail,\n } as UnsubscribeError)\n } else if (error.code === BillingAPIErrorCodes.COULD_NOT_PAY_INVOICES_ERROR) {\n actions.setUnsubscribeError({\n detail: error.detail,\n link: (\n \n {error.link ? 'View invoice' : 'View invoices'}\n \n ),\n } as UnsubscribeError)\n }\n } else {\n actions.setUnsubscribeError({\n detail:\n typeof error.detail === 'string'\n ? error.detail\n : `We encountered a problem. Please try again or submit a support ticket.`,\n } as UnsubscribeError)\n }\n console.error(error)\n // This is a bit of a hack to prevent the page from re-rendering.\n return values.billing\n }\n },\n },\n ],\n billingError: [\n null as BillingError | null,\n {\n getInvoices: async () => {\n // First check to see if there are open invoices\n try {\n const res = await api.getResponse('api/billing/get_invoices?status=open')\n const jsonRes = await getJSONOrNull(res)\n const numOpenInvoices = jsonRes['count']\n if (numOpenInvoices > 0) {\n const viewInvoicesButton = {\n to:\n numOpenInvoices == 1 && jsonRes['link']\n ? jsonRes['link']\n : values.billing?.stripe_portal_url,\n children: `View invoice${numOpenInvoices > 1 ? 's' : ''}`,\n targetBlank: true,\n }\n return {\n status: 'warning',\n message: `You have ${numOpenInvoices} open invoice${\n numOpenInvoices > 1 ? 's' : ''\n }. Please pay ${\n numOpenInvoices > 1 ? 'them' : 'it'\n } before adding items to your subscription.`,\n action: viewInvoicesButton,\n }\n }\n } catch (error: any) {\n console.error(error)\n }\n return null\n },\n },\n ],\n creditOverview: [\n {\n eligible: false,\n estimated_monthly_credit_amount_usd: DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD,\n status: 'none',\n invoice_url: null,\n collection_method: null,\n cc_last_four: null,\n email: null,\n },\n {\n loadCreditOverview: async () => {\n // Check if the user is subscribed\n if (values.billing?.has_active_subscription) {\n const response = await api.get('api/billing/credits/overview')\n if (!values.creditForm.creditInput) {\n actions.setCreditFormValue(\n 'creditInput',\n Math.round(\n (response.estimated_monthly_credit_amount_usd ||\n DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD) * 12\n )\n )\n }\n\n if (response.eligible && response.status === 'none') {\n actions.reportCreditsCTAShown(response)\n }\n return response\n }\n // Return default values if not subscribed\n return {\n eligible: false,\n estimated_monthly_credit_amount_usd: DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD,\n status: 'none',\n invoice_url: null,\n collection_method: null,\n cc_last_four: null,\n email: null,\n }\n },\n },\n ],\n products: [\n [] as BillingProductV2Type[],\n {\n loadProducts: async () => {\n const response = await api.get('api/billing/available_products')\n return response\n },\n },\n ],\n })),\n selectors({\n upgradeLink: [(s) => [s.preflight], (): string => '/organization/billing'],\n isUnlicensedDebug: [\n (s) => [s.preflight, s.billing],\n (preflight, billing): boolean => !!preflight?.is_debug && !billing?.billing_period,\n ],\n projectedTotalAmountUsdWithBillingLimits: [\n (s) => [s.billing],\n (billing: BillingType): number => {\n if (!billing) {\n return 0\n }\n let projectedTotal = 0\n for (const product of billing.products || []) {\n const billingLimit =\n billing?.custom_limits_usd?.[product.type] ||\n (product.usage_key ? billing?.custom_limits_usd?.[product.usage_key] || 0 : 0)\n projectedTotal += Math.min(parseFloat(product.projected_amount_usd || '0'), billingLimit)\n }\n return projectedTotal\n },\n ],\n supportPlans: [\n (s) => [s.billing],\n (billing: BillingType): BillingPlanType[] => {\n const platformAndSupportProduct = billing?.products?.find(\n (product) => product.type == ProductKey.PLATFORM_AND_SUPPORT\n )\n if (!platformAndSupportProduct?.plans) {\n return []\n }\n\n const addonPlans = platformAndSupportProduct?.addons?.map((addon) => addon.plans).flat()\n const insertionIndex = Math.max(0, (platformAndSupportProduct?.plans?.length ?? 1) - 1)\n const allPlans = platformAndSupportProduct?.plans?.slice(0) || []\n allPlans.splice(insertionIndex, 0, ...addonPlans)\n return allPlans\n },\n ],\n hasSupportAddonPlan: [\n (s) => [s.billing],\n (billing: BillingType): boolean => {\n return !!billing?.products\n ?.find((product) => product.type == ProductKey.PLATFORM_AND_SUPPORT)\n ?.addons.find((addon) => addon.plans.find((plan) => plan.current_plan))\n },\n ],\n creditDiscount: [(s) => [s.computedDiscount], (computedDiscount) => computedDiscount || 0],\n }),\n forms(({ actions, values }) => ({\n activateLicense: {\n defaults: { license: '' } as { license: string },\n errors: ({ license }) => ({\n license: !license ? 'Please enter your license key' : undefined,\n }),\n submit: async ({ license }, breakpoint) => {\n await breakpoint(500)\n try {\n await api.update('api/billing/license', {\n license,\n })\n\n // Reset the URL so we don't trigger the license submission again\n router.actions.replace(\n `/${values.isOnboarding ? 'ingestion' : 'organization'}/billing?success=true`\n )\n setTimeout(() => {\n window.location.reload() // Permissions, projects etc will be out of date at this point, so refresh\n }, 100)\n } catch (e: any) {\n actions.setActivateLicenseManualErrors({\n license: e.detail || 'License could not be activated. Please contact support.',\n })\n throw e\n }\n },\n },\n creditForm: {\n defaults: {\n creditInput: '',\n collectionMethod: 'charge_automatically',\n },\n submit: async ({ creditInput, collectionMethod }) => {\n await api.create('api/billing/credits/purchase', {\n annual_amount_usd: +Math.round(+creditInput - +creditInput * values.creditDiscount),\n discount_percent: values.computedDiscount * 100,\n collection_method: collectionMethod,\n })\n\n actions.showPurchaseCreditsModal(false)\n actions.loadCreditOverview()\n actions.reportCreditsFormSubmitted(+creditInput)\n\n LemonDialog.open({\n title: 'Your credit purchase has been submitted',\n width: 536,\n content:\n collectionMethod === 'send_invoice' ? (\n <>\n

\n The invoice for your credits has been created and it will be emailed to the email on\n file.\n

\n

\n Once the invoice is paid we will apply the credits to your account. Until the\n invoice is paid you will be charged for usage as normal.\n

\n \n ) : (\n <>\n

\n Your card will be charged soon and the credits will be applied to your account.\n Please make sure your{' '}\n \n card on file\n {' '}\n is up to date. You will receive an email when the credits are applied.\n

\n \n ),\n })\n },\n errors: ({ creditInput, collectionMethod }) => ({\n creditInput: !creditInput\n ? 'Please enter the amount of credits you want to purchase'\n : // This value is used because 3333 - 10% = 3000\n +creditInput < 3333\n ? 'Please enter a credit amount of at least $3,333'\n : undefined,\n collectionMethod: !collectionMethod ? 'Please select a collection method' : undefined,\n }),\n },\n })),\n listeners(({ actions, values }) => ({\n reportBillingShown: () => {\n posthog.capture('billing v2 shown')\n },\n reportBillingAlertShown: ({ alertConfig }) => {\n posthog.capture('billing alert shown', {\n ...alertConfig,\n })\n },\n reportBillingAlertActionClicked: ({ alertConfig }) => {\n posthog.capture('billing alert action clicked', {\n ...alertConfig,\n })\n },\n reportCreditsModalShown: () => {\n posthog.capture('credits modal shown')\n },\n reportCreditsFormSubmitted: ({ creditInput }) => {\n posthog.capture('credits modal credit form submitted', {\n credit_amount_usd: creditInput,\n })\n },\n reportCreditsCTAShown: ({ creditOverview }) => {\n posthog.capture('credits cta shown', {\n eligible: creditOverview.eligible,\n status: creditOverview.status,\n estimated_monthly_credit_amount_usd:\n creditOverview.estimated_monthly_credit_amount_usd || DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD,\n })\n },\n toggleCreditCTAHeroDismissed: ({ isDismissed }) => {\n if (isDismissed) {\n posthog.capture('credits cta hero dismissed')\n }\n },\n loadBillingSuccess: () => {\n if (\n router.values.location.pathname.includes('/organization/billing') &&\n router.values.searchParams['success']\n ) {\n // if the activation is successful, we reload the user to get the updated billing info on the organization\n actions.loadUser()\n router.actions.replace('/organization/billing')\n }\n actions.registerInstrumentationProps()\n\n actions.determineBillingAlert()\n\n actions.loadCreditOverview()\n },\n determineBillingAlert: () => {\n if (values.productSpecificAlert) {\n actions.setBillingAlert(values.productSpecificAlert)\n return\n }\n\n if (!values.billing || !values.preflight?.cloud) {\n return\n }\n\n if (values.billing.free_trial_until && values.billing.free_trial_until.isAfter(dayjs())) {\n const remainingDays = values.billing.free_trial_until.diff(dayjs(), 'days')\n const remainingHours = values.billing.free_trial_until.diff(dayjs(), 'hours')\n\n if (remainingHours > 72) {\n return\n }\n\n actions.setBillingAlert({\n status: 'info',\n title: `Your free trial will end in ${\n remainingHours < 24 ? pluralize(remainingHours, 'hour') : pluralize(remainingDays, 'day')\n }.`,\n message: `Setup billing now to ensure you don't lose access to premium features.`,\n })\n return\n }\n\n if (values.billing.deactivated) {\n actions.setBillingAlert({\n status: 'error',\n title: 'Your organization has been temporarily suspended.',\n message: 'Please contact support to reactivate it.',\n contactSupport: true,\n })\n return\n }\n\n const productOverLimit = values.billing.products?.find((x: BillingProductV2Type) => {\n return x.percentage_usage > 1 && x.usage_key\n })\n\n if (productOverLimit) {\n actions.setBillingAlert({\n status: 'error',\n title: 'Usage limit exceeded',\n message: `You have exceeded the usage limit for ${productOverLimit.name}. Please \n ${productOverLimit.subscribed ? 'increase your billing limit' : 'upgrade your plan'}\n or ${\n productOverLimit.name === 'Data warehouse'\n ? 'data will not be synced'\n : 'data loss may occur'\n }.`,\n dismissKey: 'usage-limit-exceeded',\n })\n return\n }\n\n actions.resetUsageLimitExceededKey()\n\n const productApproachingLimit = values.billing.products?.find(\n (x) => x.percentage_usage > ALLOCATION_THRESHOLD_ALERT\n )\n\n if (productApproachingLimit) {\n actions.setBillingAlert({\n status: 'info',\n title: 'You will soon hit your usage limit',\n message: `You have currently used ${parseFloat(\n (productApproachingLimit.percentage_usage * 100).toFixed(2)\n )}% of your ${\n productApproachingLimit.usage_key && productApproachingLimit.usage_key.toLowerCase()\n } allocation.`,\n dismissKey: 'usage-limit-approaching',\n })\n return\n }\n\n actions.resetUsageLimitApproachingKey()\n },\n setCreditFormValue: ({ name, value }) => {\n if (name === 'creditInput' || (name as FieldNamePath)?.[0] === 'creditInput') {\n const spend = +value\n let discount = 0\n if (spend >= 100000) {\n discount = 0.35\n } else if (spend >= 60000) {\n discount = 0.25\n } else if (spend >= 20000) {\n discount = 0.2\n } else if (spend >= 3000) {\n discount = 0.1\n }\n actions.setComputedDiscount(discount)\n }\n },\n registerInstrumentationProps: async (_, breakpoint) => {\n await breakpoint(100)\n if (posthog && values.billing) {\n const payload = {\n has_billing_plan: !!values.billing.has_active_subscription,\n free_trial_until: values.billing.free_trial_until?.toISOString(),\n customer_deactivated: values.billing.deactivated,\n current_total_amount_usd: values.billing.current_total_amount_usd,\n }\n if (values.billing.custom_limits_usd) {\n for (const product of Object.keys(values.billing.custom_limits_usd)) {\n payload[`custom_limits_usd.${product}`] = values.billing.custom_limits_usd[product]\n }\n }\n if (values.billing.products) {\n for (const product of values.billing.products) {\n const type = product.type.toLowerCase()\n payload[`percentage_usage.${type}`] = product.percentage_usage\n payload[`current_amount_usd.${type}`] = product.current_amount_usd\n payload[`unit_amount_usd.${type}`] = product.unit_amount_usd\n payload[`usage_limit.${type}`] = product.usage_limit\n payload[`current_usage.${type}`] = product.current_usage\n payload[`projected_usage.${type}`] = product.projected_usage\n payload[`free_allocation.${type}`] = product.free_allocation\n }\n }\n if (values.billing.billing_period) {\n payload['billing_period_start'] = values.billing.billing_period.current_period_start\n payload['billing_period_end'] = values.billing.billing_period.current_period_end\n }\n posthog.register(payload)\n }\n },\n showPurchaseCreditsModal: ({ isOpen }) => {\n if (isOpen) {\n actions.reportCreditsModalShown()\n }\n },\n })),\n afterMount(({ actions }) => {\n actions.loadBilling()\n actions.getInvoices()\n }),\n urlToAction(({ actions }) => ({\n // IMPORTANT: This needs to be above the \"*\" so it takes precedence\n '/*/billing': (_params, _search, hash) => {\n if (hash.license) {\n actions.setShowLicenseDirectInput(true)\n actions.setActivateLicenseValues({ license: hash.license })\n actions.submitActivateLicense()\n }\n if (_search.products) {\n const products = _search.products.split(',')\n actions.setScrollToProductKey(products[0])\n }\n if (_search.billing_error) {\n actions.setBillingAlert({\n status: 'error',\n title: 'Error',\n message: _search.billing_error,\n })\n }\n actions.setRedirectPath()\n actions.setIsOnboarding()\n },\n '*': () => {\n actions.setRedirectPath()\n actions.setIsOnboarding()\n },\n })),\n])\n","import { LemonCollapse, LemonModal, Link } from '@posthog/lemon-ui'\nimport { useValues } from 'kea'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport EarlyAccessFeatureImage from 'public/early-access-feature-demo.png'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { urls } from 'scenes/urls'\n\nimport { FeatureFlagType, PipelineStage, Region } from '~/types'\n\ninterface InstructionsModalProps {\n flag: FeatureFlagType['key']\n visible: boolean\n onClose: () => void\n}\n\nexport function InstructionsModal({ onClose, visible, flag }: InstructionsModalProps): JSX.Element {\n const { preflight } = useValues(preflightLogic)\n\n const getCloudPanels = (): JSX.Element => (\n \n Give your users a{' '}\n \n prebuilt widget\n {' '}\n to opt-in to features\n \n \n ),\n },\n {\n key: '2',\n header: 'Option 2: Custom implementation',\n content: (\n
\n Opt user in\n
\n \n
\n\n Opt user out\n
\n \n
\n\n Retrieve Previews\n
\n \n
\n
\n ),\n },\n ]}\n />\n )\n\n const getSelfHostedPanels = (): JSX.Element => (\n
\n Opt user in\n
\n \n
\n\n Opt user out\n
\n \n
\n\n Retrieve Previews\n
\n \n
\n
\n )\n\n const panels: JSX.Element = preflight?.cloud ? getCloudPanels() : getSelfHostedPanels()\n\n return (\n \n
\n
\n Implement manual release condition toggles to give your users the ability choose which features they\n want to try\n
\n {panels}\n
\n
\n )\n}\n\nfunction FeatureEnrollInstructions({ flag }: { flag: string }): JSX.Element {\n return (\n \n {`posthog.updateEarlyAccessFeatureEnrollment(\"${flag}\", true)\n`}\n \n )\n}\n\nfunction FeatureUnenrollInstructions({ flag }: { flag: string }): JSX.Element {\n return (\n \n {`posthog.updateEarlyAccessFeatureEnrollment(\"${flag}\", false)\n`}\n \n )\n}\n\nfunction RetrievePreviewsInstructions(): JSX.Element {\n return (\n \n {`posthog.getEarlyAccessFeatures((previewItemData) => {\n // do something with early access feature\n})\n`}\n \n )\n}\n","import { useValues } from 'kea'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport { apiHostOrigin } from 'lib/utils/apiHost'\nimport { teamLogic } from 'scenes/teamLogic'\n\nimport { GroupType } from '~/types'\n\nexport const UTM_TAGS = '?utm_medium=in-product&utm_campaign=feature-flag'\n\nexport interface FeatureFlagSnippet {\n flagKey: string\n multivariant?: boolean\n groupType?: GroupType\n localEvaluation?: boolean\n payload?: boolean\n samplePropertyName?: string\n instantlyAvailableProperties?: boolean\n}\n\nconst LOCAL_EVAL_REMINDER = `Remember to set a personal API key in the SDK to enable local evaluation.\n`\n\nexport function NodeJSSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n payload,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'await client.'\n const flagFunction = payload ? 'getFeatureFlagPayload' : multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n // add group properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n groupProperties: { ${groupType.group_type}: {'${propertyName}': 'value', 'name': 'xyz'}}`\n : `\n // add person properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n personProperties: {'${propertyName}': 'value'}`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${\n payload\n ? `\n undefined,`\n : ''\n }\n {\n groups: { '${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>' },${localEvalAddition}\n }\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${\n payload\n ? `\n undefined,`\n : ''\n }\n {${localEvalAddition}\n }\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n\n const variableName = payload ? 'matchedFlagPayload' : multivariant ? 'enabledVariant' : 'isMyFlagEnabledForUser'\n\n const conditional = multivariant ? `${variableName} === 'example-variant'` : `${variableName}`\n\n const followUpCode = payload\n ? ''\n : `\n\nif (${conditional}) {\n // Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n}`\n\n return (\n <>\n \n {`${\n localEvaluation ? '// ' + LOCAL_EVAL_REMINDER : ''\n }const ${variableName} = ${flagSnippet}${followUpCode}`}\n \n \n )\n}\n\nexport function PHPSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'PostHog::'\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n // empty person properties\n [],\n // add group properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n [${groupType.group_type} => ['${propertyName}' => 'value', 'name' => 'xyz']]`\n : `\n // add person properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n ['${propertyName}' => 'value']`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',\n // group types\n ['${groupType.group_type}' => '<${groupType.name_singular || 'group'} ID>'],${localEvalAddition}\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${localEvalAddition}\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n const variableName = multivariant ? '$enabledVariant' : '$isMyFlagEnabledForUser'\n\n const conditional = multivariant ? `${variableName} === 'example-variant'` : `${variableName}`\n\n return (\n <>\n \n {`${localEvaluation ? '// ' + LOCAL_EVAL_REMINDER : ''}${variableName} = ${flagSnippet}\n\nif (${conditional}) {\n // Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n}`}\n \n \n )\n}\n\nexport function GolangSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'client.'\n\n const flagFunction = multivariant ? 'GetFeatureFlag' : 'IsFeatureEnabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n // add group properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n groupProperties: map[string]Properties{\"${groupType.group_type}\": posthog.NewProperties().Set(\"${propertyName}\", \"value\").Set(\"name\", \"xyz\")}`\n : `\n // add person properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n PersonProperties: posthog.NewProperties().Set(\"${propertyName}\", \"value\")`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n FeatureFlagPayload{\n Key: \"${flagKey}\",\n DistinctId: \"distinct-id\",\n Groups: Groups{'${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>'},${localEvalAddition}\n }\n)`\n : `${clientSuffix}${flagFunction}(\n FeatureFlagPayload{\n Key: '${flagKey}',\n DistinctId: \"distinct-id\",${localEvalAddition}\n })`\n const variableName = multivariant ? 'enabledVariant, err' : 'isMyFlagEnabledForUser, err'\n\n const conditional = multivariant ? `enabledVariant == 'example-variant'` : `isMyFlagEnabledForUser`\n\n return (\n <>\n \n {`${localEvaluation ? '// ' + LOCAL_EVAL_REMINDER : ''}${variableName} := ${flagSnippet}\n\nif ${conditional} {\n // Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n}`}\n \n \n )\n}\n\nexport function RubySnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n payload,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'posthog.'\n const flagFunction = payload ? 'get_feature_flag_payload' : multivariant ? 'get_feature_flag' : 'is_feature_enabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n # add group properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n group_properties: { ${groupType.group_type}: {'${propertyName}': 'value', 'name': 'xyz'}}`\n : `\n # add person properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n person_properties: {'${propertyName}': 'value'}`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',\n groups: { '${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>' },${localEvalAddition}\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${localEvalAddition}\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n const variableName = payload ? 'matched_flag_payload' : multivariant ? 'enabled_variant' : 'is_my_flag_enabled'\n\n const conditional = multivariant ? `${variableName} == 'example-variant'` : `${variableName}`\n\n const followUpCode = payload\n ? ''\n : `\n\nif ${conditional}\n # Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\nend`\n\n return (\n <>\n \n {`${localEvaluation ? '# ' + LOCAL_EVAL_REMINDER : ''}${variableName} = ${flagSnippet}${followUpCode}`}\n \n \n )\n}\n\nexport function PythonSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n payload,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'posthog.'\n const flagFunction = payload ? 'get_feature_flag_payload' : multivariant ? 'get_feature_flag' : 'feature_enabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n # add group properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n group_properties={ ${groupType.group_type}: {'${propertyName}': 'value', 'name': 'xyz'}}`\n : `\n # add person properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n person_properties={'${propertyName}': 'value'}`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',\n groups={ '${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>' },${localEvalAddition}\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${localEvalAddition}\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n const variableName = payload ? 'matched_flag_payload' : multivariant ? 'enabled_variant' : 'is_my_flag_enabled'\n\n const conditional = multivariant ? `${variableName} == 'example-variant'` : `${variableName}`\n\n const followUpCode = payload\n ? ''\n : `\n\nif ${conditional}:\n # Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n`\n\n return (\n <>\n \n {`${localEvaluation ? '# ' + LOCAL_EVAL_REMINDER : ''}${variableName} = ${flagSnippet}${followUpCode}`}\n \n \n )\n}\n\nexport function AndroidSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'PostHog.'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload(\"${flagKey}\")`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == \"example-variant\"` : ''\n return (\n \n {`if (${clientSuffix}${flagFunction}(\"${flagKey}\")${variantSuffix}) {\n // do something\n}\n `}\n \n )\n}\n\nexport function FlutterSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'await Posthog().'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload('${flagKey}');`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n\n return (\n \n {`if (${clientSuffix}${flagFunction}('${flagKey}')${variantSuffix}) {\n // do something\n}\n `}\n \n )\n}\n\nexport function iOSSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'PostHogSDK.shared.'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload(\"${flagKey}\")`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? `as? String == \"example-variant\"` : ''\n return (\n \n {`if ${clientSuffix}${flagFunction}(\"${flagKey}\")${variantSuffix} {\n // do something\n}`}\n \n )\n}\n\nexport function ReactNativeSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'posthog.'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload('${flagKey}')`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n return (\n \n {`// With a hook\nimport { useFeatureFlag } from 'posthog-react-native'\n\nconst MyComponent = () => {\n const showFlaggedFeature = useFeatureFlag('${flagKey}')\n\n if (showFlaggedFeature === undefined) {\n // the response is undefined if the flags are being loaded\n return null\n }\n\n return showFlaggedFeature ${variantSuffix} ? Testing feature 😄 : Not Testing feature 😢\n}\n\n// Or calling on the method directly\n${clientSuffix}${flagFunction}('${flagKey}')\n `}\n \n )\n}\n\nexport function ReactSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const flagFunction = payload\n ? 'useFeatureFlagPayload'\n : multivariant\n ? 'useFeatureFlagVariantKey'\n : 'useFeatureFlagEnabled'\n\n const variable = payload ? 'payload' : multivariant ? 'variant' : 'flagEnabled'\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n\n return (\n \n {`\nimport { ${flagFunction} } from 'posthog-js/react'\n\nfunction App() {\n const ${variable} = ${flagFunction}('${flagKey}')\n\n if (${variable}${variantSuffix}) {\n // do something\n }\n}`}\n \n )\n}\n\nexport function APISnippet({ groupType }: FeatureFlagSnippet): JSX.Element {\n const { currentTeam } = useValues(teamLogic)\n\n const groupAddition = groupType\n ? `\n \"groups\": { \"${groupType.group_type}\": \"<${groupType.name_singular || 'group'} ID>\" },`\n : ''\n\n return (\n <>\n \n {`curl ${apiHostOrigin()}/decide?v=3/ \\\\\n-X POST -H 'Content-Type: application/json' \\\\\n-d '{\n \"api_key\": \"${currentTeam ? currentTeam.api_token : '[project_api_key]'}\",\n \"distinct_id\": \"[user distinct id]\",${groupAddition}\n}'\n `}\n \n \n )\n}\n\nexport function JSSnippet({\n flagKey,\n multivariant,\n payload,\n groupType,\n instantlyAvailableProperties,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n if (payload) {\n return (\n <>\n \n {`posthog.getFeatureFlagPayload('${flagKey ?? ''}')`}\n \n \n )\n }\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const propertyOverrideSnippet = `// Your flag depends on properties that are not instantly available. If you want\n// to make them available without waiting for server delays, send these properties for flag evaluation, like so:\n// Make sure to call this before evaluating flags. More info: https://posthog.com/docs/libraries/js#overriding-server-properties \nposthog.${\n groupType\n ? `setGroupPropertiesForFlags({ '${groupType.group_type}': {'${propertyName}': 'value'}})`\n : `setPersonPropertiesForFlags({'${propertyName}': 'value'})`\n }\n\n`\n\n const clientSuffix = 'posthog.'\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n return (\n <>\n \n {`${instantlyAvailableProperties ? '' : propertyOverrideSnippet}// Ensure flags are loaded before usage.\n// You'll only need to call this on the code for when the first time a user visits.\n${clientSuffix}onFeatureFlags(function() {\n // feature flags should be available at this point\n if (${clientSuffix}${flagFunction}('${flagKey ?? ''}') ${variantSuffix}) {\n // do something\n }\n})\n\n// Otherwise, you can just do:\nif (${clientSuffix}${flagFunction}('${flagKey ?? ''}') ${variantSuffix}) {\n // do something\n}`}\n \n \n )\n}\n\nexport function JSBootstrappingSnippet(): JSX.Element {\n return (\n \n {`// Initialise the posthog library with a distinct ID and feature flags for immediate loading\n// This avoids the delay between the library loading and feature flags becoming available to use.\n\nposthog.init('{project_api_key}', {\n api_host: '${apiHostOrigin()}'\n bootstrap:\n {\n distinctID: 'your-anonymous-id',\n featureFlags: {\n // input the flag values here from 'posthog.getAllFlags(distinct_id)' which you can find in the server-side libraries.\n // example:\n // 'flag-1': true,\n // 'variant-flag': 'control',\n // 'other-flag': false\n },\n }\n})\n `}\n \n )\n}\n","import { mergeAttributes, Node, NodeViewProps } from '@tiptap/core'\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react'\nimport { NotebookNodeType, NotebookTarget } from '~/types'\nimport { dayjs } from 'lib/dayjs'\nimport { JSONContent } from '../Notebook/utils'\nimport clsx from 'clsx'\nimport { urls } from 'scenes/urls'\nimport { LemonButton } from '@posthog/lemon-ui'\nimport { notebookLogic } from '../Notebook/notebookLogic'\nimport { useValues } from 'kea'\nimport { useMemo } from 'react'\nimport { openNotebook } from '~/models/notebooksModel'\n\nexport interface NotebookNodeReplayTimestampAttrs {\n playbackTime?: number\n sessionRecordingId: string\n sourceNodeId?: string\n}\n\nconst Component = (props: NodeViewProps): JSX.Element => {\n const { shortId, findNodeLogic, findNodeLogicById } = useValues(notebookLogic)\n const { sessionRecordingId, playbackTime = 0, sourceNodeId } = props.node.attrs as NotebookNodeReplayTimestampAttrs\n\n const relatedNodeInNotebook = useMemo(() => {\n const logicById = sourceNodeId ? findNodeLogicById(sourceNodeId) : null\n\n return logicById ?? findNodeLogic(NotebookNodeType.Recording, { id: sessionRecordingId })\n }, [findNodeLogic])\n\n const handlePlayInNotebook = (): void => {\n // TODO: Figure out how to send this action info to the playlist OR the replay node...\n\n relatedNodeInNotebook?.values.sendMessage('play-replay', {\n sessionRecordingId,\n time: playbackTime ?? 0,\n })\n }\n\n return (\n \n openNotebook(shortId, NotebookTarget.Popover)\n }\n to={\n !relatedNodeInNotebook\n ? urls.replaySingle(sessionRecordingId) + `?t=${playbackTime / 1000}`\n : undefined\n }\n >\n {formatTimestamp(playbackTime)}\n \n \n )\n}\n\nexport const NotebookNodeReplayTimestamp = Node.create({\n name: NotebookNodeType.ReplayTimestamp,\n inline: true,\n group: 'inline',\n atom: true,\n\n serializedText: (attrs: NotebookNodeReplayTimestampAttrs): string => {\n // timestamp is not a block so `getText` does not add a separator.\n // we need to add it manually\n return `${attrs.playbackTime ? formatTimestamp(attrs.playbackTime) : '00:00'}:\\n`\n },\n\n addAttributes() {\n return {\n playbackTime: { default: null, keepOnSplit: false },\n sessionRecordingId: { default: null, keepOnSplit: true, isRequired: true },\n sourceNodeId: { default: null, keepOnSplit: true },\n }\n },\n\n parseHTML() {\n return [{ tag: NotebookNodeType.ReplayTimestamp }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [NotebookNodeType.ReplayTimestamp, mergeAttributes(HTMLAttributes)]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Component)\n },\n})\n\nexport function formatTimestamp(time: number): string {\n return dayjs.duration(time, 'milliseconds').format('HH:mm:ss').replace(/^00:/, '').trim()\n}\n\nexport function buildTimestampCommentContent(attrs: NotebookNodeReplayTimestampAttrs): JSONContent {\n return {\n type: 'paragraph',\n content: [\n {\n type: NotebookNodeType.ReplayTimestamp,\n attrs,\n },\n { type: 'text', text: ' ' },\n ],\n }\n}\n","import {\n IconCursor,\n IconFunnels,\n IconHogQL,\n IconLifecycle,\n IconPeople,\n IconRetention,\n IconRewindPlay,\n IconStickiness,\n IconTrends,\n IconUpload,\n IconUserPaths,\n} from '@posthog/icons'\nimport { IconCode } from '@posthog/icons'\nimport { LemonButton, LemonDivider, lemonToast } from '@posthog/lemon-ui'\nimport { Extension } from '@tiptap/core'\nimport { ReactRenderer } from '@tiptap/react'\nimport Suggestion from '@tiptap/suggestion'\nimport Fuse from 'fuse.js'\nimport { useValues } from 'kea'\nimport { IconBold, IconItalic } from 'lib/lemon-ui/icons'\nimport { Popover } from 'lib/lemon-ui/Popover'\nimport { selectFiles } from 'lib/utils/file-utils'\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react'\n\nimport { KeyboardShortcut } from '~/layout/navigation-3000/components/KeyboardShortcut'\nimport { defaultDataTableColumns } from '~/queries/nodes/DataTable/utils'\nimport { NodeKind } from '~/queries/schema'\nimport { BaseMathType, ChartDisplayType, FunnelVizType, NotebookNodeType, PathType, RetentionPeriod } from '~/types'\n\nimport { buildNodeEmbed } from '../Nodes/NotebookNodeEmbed'\nimport { buildInsightVizQueryContent, buildNodeQueryContent } from '../Nodes/NotebookNodeQuery'\nimport NotebookIconHeading from './NotebookIconHeading'\nimport { notebookLogic } from './notebookLogic'\nimport { EditorCommands, EditorRange } from './utils'\n\ntype SlashCommandConditionalProps =\n | {\n mode: 'add'\n getPos: () => number\n range?: never\n }\n | {\n mode: 'slash'\n getPos?: never\n range: EditorRange\n }\n\ntype SlashCommandsProps = SlashCommandConditionalProps & {\n query?: string\n decorationNode?: any\n onClose?: () => void\n}\n\ntype SlashCommandsPopoverProps = SlashCommandsProps & {\n visible: boolean\n children?: JSX.Element\n}\n\ntype SlashCommandsRef = {\n onKeyDown: (event: KeyboardEvent) => boolean\n}\n\ntype SlashCommandsItem = {\n title: string\n search?: string\n icon?: JSX.Element\n command: (chain: EditorCommands, pos: number | EditorRange) => EditorCommands | Promise\n}\n\nconst TEXT_CONTROLS: SlashCommandsItem[] = [\n {\n title: 'h1',\n icon: ,\n command: (chain) => chain.toggleHeading({ level: 1 }),\n },\n {\n title: 'h2',\n icon: ,\n command: (chain) => chain.toggleHeading({ level: 2 }),\n },\n {\n title: 'h3',\n icon: ,\n command: (chain) => chain.toggleHeading({ level: 3 }),\n },\n {\n title: 'bold',\n icon: ,\n command: (chain) => chain.toggleBold(),\n },\n {\n title: 'italic',\n icon: ,\n command: (chain) => chain.toggleItalic(),\n },\n]\n\nconst SLASH_COMMANDS: SlashCommandsItem[] = [\n {\n title: 'Trend',\n search: 'graph trend insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.TrendsQuery,\n filterTestAccounts: false,\n series: [\n {\n kind: NodeKind.EventsNode,\n event: '$pageview',\n name: '$pageview',\n math: BaseMathType.TotalCount,\n },\n ],\n interval: 'day',\n trendsFilter: {\n display: ChartDisplayType.ActionsLineGraph,\n },\n })\n ),\n },\n {\n title: 'Funnel',\n search: 'funnel insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.FunnelsQuery,\n series: [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n },\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n },\n ],\n funnelsFilter: {\n funnelVizType: FunnelVizType.Steps,\n },\n })\n ),\n },\n {\n title: 'Retention',\n search: 'retention insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.RetentionQuery,\n retentionFilter: {\n period: RetentionPeriod.Day,\n totalIntervals: 11,\n targetEntity: {\n id: '$pageview',\n name: '$pageview',\n type: 'events',\n },\n returningEntity: {\n id: '$pageview',\n name: '$pageview',\n type: 'events',\n },\n retentionType: 'retention_first_time',\n },\n })\n ),\n },\n {\n title: 'Paths',\n search: 'user paths insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.PathsQuery,\n pathsFilter: {\n includeEventTypes: [PathType.PageView],\n },\n })\n ),\n },\n {\n title: 'Stickiness',\n search: 'stickiness insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.StickinessQuery,\n series: [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n math: BaseMathType.TotalCount,\n },\n ],\n stickinessFilter: {},\n })\n ),\n },\n {\n title: 'Lifecycle',\n search: 'lifecycle insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.LifecycleQuery,\n series: [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n math: BaseMathType.TotalCount,\n },\n ],\n })\n ),\n },\n {\n title: 'HogQL',\n search: 'sql',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildNodeQueryContent({\n kind: NodeKind.DataTableNode,\n source: {\n kind: NodeKind.HogQLQuery,\n query: `select event,\n person.properties.email,\n properties.$browser,\n count()\n from events\n where {filters} -- replaced with global date and property filters\n and person.properties.email is not null\ngroup by event,\n properties.$browser,\n person.properties.email\norder by count() desc\n limit 100`,\n filters: {\n dateRange: {\n date_from: '-24h',\n },\n },\n },\n })\n ),\n },\n {\n title: 'Events',\n search: 'data explore',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildNodeQueryContent({\n kind: NodeKind.DataTableNode,\n source: {\n kind: NodeKind.EventsQuery,\n select: defaultDataTableColumns(NodeKind.EventsQuery),\n properties: [],\n after: '-24h',\n limit: 100,\n },\n })\n ),\n },\n {\n title: 'People',\n search: 'persons users',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildNodeQueryContent({\n kind: NodeKind.DataTableNode,\n columns: defaultDataTableColumns(NodeKind.ActorsQuery),\n source: {\n kind: NodeKind.ActorsQuery,\n properties: [],\n },\n })\n ),\n },\n {\n title: 'Session recordings',\n search: 'video replay',\n icon: ,\n command: (chain, pos) => chain.insertContentAt(pos, { type: NotebookNodeType.RecordingPlaylist, attrs: {} }),\n },\n {\n title: 'Image',\n search: 'picture gif',\n icon: ,\n command: async (chain, pos) => {\n // Trigger upload followed by insert\n try {\n const files = await selectFiles({ contentType: 'image/*', multiple: false })\n\n if (files.length) {\n return chain.insertContentAt(pos, { type: NotebookNodeType.Image, attrs: { file: files[0] } })\n }\n } catch (e) {\n lemonToast.error('Something went wrong when trying to select a file.')\n }\n\n return chain\n },\n },\n {\n title: 'Embedded iframe',\n search: 'iframe embed',\n icon: ,\n command: async (chain, pos) => {\n return chain.insertContentAt(pos, buildNodeEmbed())\n },\n },\n]\n\nexport const SlashCommands = forwardRef(function SlashCommands(\n { mode, range, getPos, onClose, query }: SlashCommandsProps,\n ref\n): JSX.Element | null {\n const { editor } = useValues(notebookLogic)\n // We start with 1 because the first item is the text controls\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [selectedHorizontalIndex, setSelectedHorizontalIndex] = useState(0)\n\n const allCommmands = [...TEXT_CONTROLS, ...SLASH_COMMANDS]\n\n const fuse = useMemo(() => {\n return new Fuse(allCommmands, {\n keys: ['title', 'search'],\n threshold: 0.3,\n })\n }, [allCommmands])\n\n const filteredCommands = useMemo(() => {\n if (!query) {\n return allCommmands\n }\n return fuse.search(query).map((result) => result.item)\n }, [query, fuse])\n\n const filteredSlashCommands = useMemo(\n () => filteredCommands.filter((item) => SLASH_COMMANDS.includes(item)),\n [filteredCommands]\n )\n\n useEffect(() => {\n setSelectedIndex(0)\n setSelectedHorizontalIndex(0)\n }, [query])\n\n const execute = async (item: SlashCommandsItem): Promise => {\n if (editor) {\n const selectedNode = editor.getSelectedNode()\n const isTextNode = selectedNode === null || selectedNode.isText\n const isTextCommand = TEXT_CONTROLS.map((c) => c.title).includes(item.title)\n\n const position = mode === 'slash' ? range.from : getPos()\n let chain = mode === 'slash' ? editor.deleteRange(range) : editor.chain()\n\n if (!isTextNode && isTextCommand) {\n chain = chain.insertContentAt(position, { type: 'paragraph' })\n }\n\n const partialCommand = await item.command(chain, position)\n partialCommand.run()\n\n onClose?.()\n }\n }\n\n const onPressEnter = async (): Promise => {\n const command =\n selectedIndex === -1 ? TEXT_CONTROLS[selectedHorizontalIndex] : filteredSlashCommands[selectedIndex]\n\n await execute(command)\n }\n const onPressUp = (): void => {\n setSelectedIndex(Math.max(selectedIndex - 1, -1))\n }\n const onPressDown = (): void => {\n setSelectedIndex(Math.min(selectedIndex + 1, SLASH_COMMANDS.length - 1))\n }\n\n const onPressLeft = (): void => {\n setSelectedHorizontalIndex(Math.max(selectedHorizontalIndex - 1, 0))\n }\n const onPressRight = (): void => {\n setSelectedHorizontalIndex(Math.min(selectedHorizontalIndex + 1, TEXT_CONTROLS.length - 1))\n }\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent): boolean => {\n const keyMappings = {\n ArrowUp: onPressUp,\n ArrowDown: onPressDown,\n ArrowLeft: onPressLeft,\n ArrowRight: onPressRight,\n Enter: onPressEnter,\n }\n\n if (keyMappings[event.key]) {\n keyMappings[event.key]()\n return true\n }\n\n return false\n },\n [selectedIndex, selectedHorizontalIndex, filteredCommands]\n )\n\n // Expose the keydown handler to the tiptap extension\n useImperativeHandle(ref, () => ({ onKeyDown }), [onKeyDown])\n\n useEffect(() => {\n if (mode !== 'add') {\n return\n }\n\n // If not opened from a slash command, we want to add our own keyboard listeners\n const keyDownListener = (event: KeyboardEvent): void => {\n const preventDefault = onKeyDown(event)\n if (preventDefault) {\n event.preventDefault()\n }\n }\n\n window.addEventListener('keydown', keyDownListener, true)\n\n return () => window.removeEventListener('keydown', keyDownListener, true)\n }, [onKeyDown, mode])\n\n if (!editor) {\n return null\n }\n\n return (\n
\n
\n {TEXT_CONTROLS.map((item, index) => (\n void execute(item)}\n icon={item.icon}\n />\n ))}\n
\n\n \n\n {filteredSlashCommands.map((item, index) => (\n void execute(item)}\n >\n {item.title}\n \n ))}\n\n {filteredSlashCommands.length === 0 && (\n
\n Nothing matching /{query}\n
\n )}\n\n {mode === 'add' && (\n <>\n \n
\n You can trigger this menu by typing \n
\n \n )}\n
\n )\n})\n\nexport const SlashCommandsPopover = forwardRef(\n function SlashCommandsPopover(\n { visible = true, decorationNode, children, onClose, ...props }: SlashCommandsPopoverProps,\n ref\n ): JSX.Element | null {\n return (\n }\n referenceElement={decorationNode}\n visible={visible}\n onClickOutside={onClose}\n >\n {children}\n \n )\n }\n)\n\nexport const SlashCommandsExtension = Extension.create({\n name: 'slash-commands',\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: '/',\n startOfLine: true,\n render: () => {\n let renderer: ReactRenderer\n\n return {\n onStart: (props) => {\n renderer = new ReactRenderer(SlashCommandsPopover, {\n props: { ...props, mode: 'slash' },\n editor: props.editor,\n })\n },\n\n onUpdate(props) {\n renderer.updateProps(props)\n\n if (!props.clientRect) {\n return\n }\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n renderer.destroy()\n return true\n }\n return renderer.ref?.onKeyDown(props.event) ?? false\n },\n\n onExit() {\n renderer.destroy()\n },\n }\n },\n }),\n ]\n },\n})\n","import {\n addedNodeMutation,\n customEvent,\n EventType,\n fullSnapshotEvent,\n incrementalSnapshotEvent,\n IncrementalSource,\n metaEvent,\n mutationData,\n removedNodeMutation,\n} from '@rrweb/types'\nimport { captureMessage } from '@sentry/react'\nimport { isObject } from 'lib/utils'\nimport { PLACEHOLDER_SVG_DATA_IMAGE_URL } from 'scenes/session-recordings/player/rrweb'\n\nimport {\n attributes,\n documentNode,\n elementNode,\n fullSnapshotEvent as MobileFullSnapshotEvent,\n keyboardEvent,\n metaEvent as MobileMetaEvent,\n MobileIncrementalSnapshotEvent,\n MobileNodeMutation,\n MobileNodeType,\n NodeType,\n serializedNodeWithId,\n textNode,\n wireframe,\n wireframeButton,\n wireframeCheckBox,\n wireframeDiv,\n wireframeImage,\n wireframeInputComponent,\n wireframeNavigationBar,\n wireframePlaceholder,\n wireframeProgress,\n wireframeRadio,\n wireframeRadioGroup,\n wireframeRectangle,\n wireframeScreenshot,\n wireframeSelect,\n wireframeStatusBar,\n wireframeText,\n wireframeToggle,\n} from '../mobile.types'\nimport { makeNavigationBar, makeOpenKeyboardPlaceholder, makeStatusBar } from './screen-chrome'\nimport { ConversionContext, ConversionResult } from './types'\nimport {\n asStyleString,\n makeBodyStyles,\n makeColorStyles,\n makeDeterminateProgressStyles,\n makeHTMLStyles,\n makeIndeterminateProgressStyles,\n makeMinimalStyles,\n makePositionStyles,\n makeStylesString,\n} from './wireframeStyle'\n\nexport const BACKGROUND = '#f3f4ef'\nconst FOREGROUND = '#35373e'\n\n/**\n * generates a sequence of ids\n * from 100 to 9,999,999\n * the transformer reserves ids in the range 0 to 9,999,999\n * we reserve a range of ids because we need nodes to have stable ids across snapshots\n * in order for incremental snapshots to work\n * some mobile elements have to be wrapped in other elements in order to be styled correctly\n * which means the web version of a mobile replay will use ids that don't exist in the mobile replay,\n * and we need to ensure they don't clash\n * -----\n * id is typed as a number in rrweb\n * and there's a few places in their code where rrweb uses a check for `id === -1` to bail out of processing\n * so, it's safest to assume that id is expected to be a positive integer\n */\nfunction* ids(): Generator {\n let i = 100\n while (i < 9999999) {\n yield i++\n }\n}\n\nlet globalIdSequence = ids()\n\n// there are some fixed ids that we need to use for fixed elements or artificial mutations\nconst DOCUMENT_ID = 1\nconst HTML_DOC_TYPE_ID = 2\nconst HTML_ELEMENT_ID = 3\nconst HEAD_ID = 4\nconst BODY_ID = 5\n// the nav bar should always be the last item in the body so that it is at the top of the stack\nconst NAVIGATION_BAR_PARENT_ID = 7\nexport const NAVIGATION_BAR_ID = 8\n// the keyboard so that it is still before the nav bar\nconst KEYBOARD_PARENT_ID = 9\nexport const KEYBOARD_ID = 10\nexport const STATUS_BAR_PARENT_ID = 11\nexport const STATUS_BAR_ID = 12\n\nfunction isKeyboardEvent(x: unknown): x is keyboardEvent {\n return isObject(x) && 'data' in x && isObject(x.data) && 'tag' in x.data && x.data.tag === 'keyboard'\n}\n\nexport function _isPositiveInteger(id: unknown): id is number {\n return typeof id === 'number' && id > 0 && id % 1 === 0\n}\n\nfunction _isNullish(x: unknown): x is null | undefined {\n return x === null || x === undefined\n}\n\nfunction isRemovedNodeMutation(x: addedNodeMutation | removedNodeMutation): x is removedNodeMutation {\n return isObject(x) && 'id' in x\n}\n\nexport const makeCustomEvent = (\n mobileCustomEvent: (customEvent | keyboardEvent) & {\n timestamp: number\n delay?: number\n }\n): (customEvent | incrementalSnapshotEvent) & {\n timestamp: number\n delay?: number\n} => {\n if (isKeyboardEvent(mobileCustomEvent)) {\n // keyboard events are handled as incremental snapshots to add or remove a keyboard from the DOM\n // TODO eventually we can pass something to makeIncrementalEvent here\n const adds: addedNodeMutation[] = []\n const removes = []\n if (mobileCustomEvent.data.payload.open) {\n const keyboardPlaceHolder = makeOpenKeyboardPlaceholder(mobileCustomEvent, {\n timestamp: mobileCustomEvent.timestamp,\n idSequence: globalIdSequence,\n })\n if (keyboardPlaceHolder) {\n adds.push({\n parentId: KEYBOARD_PARENT_ID,\n nextId: null,\n node: keyboardPlaceHolder.result,\n })\n // mutations seem not to want a tree of nodes to add\n // so even though `keyboardPlaceholder` is a tree with content\n // we have to add the text content as well\n adds.push({\n parentId: keyboardPlaceHolder.result.id,\n nextId: null,\n node: {\n type: NodeType.Text,\n id: globalIdSequence.next().value,\n textContent: 'keyboard',\n },\n })\n } else {\n captureMessage('Failed to create keyboard placeholder', { extra: { mobileCustomEvent } })\n }\n } else {\n removes.push({\n parentId: KEYBOARD_PARENT_ID,\n id: KEYBOARD_ID,\n })\n }\n const mutation: mutationData = { adds, attributes: [], removes, source: IncrementalSource.Mutation, texts: [] }\n return {\n type: EventType.IncrementalSnapshot,\n data: mutation,\n timestamp: mobileCustomEvent.timestamp,\n }\n }\n return mobileCustomEvent\n}\n\nexport const makeMetaEvent = (\n mobileMetaEvent: MobileMetaEvent & {\n timestamp: number\n }\n): metaEvent & {\n timestamp: number\n delay?: number\n} => ({\n type: EventType.Meta,\n data: {\n href: mobileMetaEvent.data.href || '', // the replay doesn't use the href, so we safely ignore any absence\n // mostly we need width and height in order to size the viewport\n width: mobileMetaEvent.data.width,\n height: mobileMetaEvent.data.height,\n },\n timestamp: mobileMetaEvent.timestamp,\n})\n\nexport function makeDivElement(\n wireframe: wireframeDiv,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const _id = _isPositiveInteger(wireframe.id) ? wireframe.id : context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: asStyleString([makeStylesString(wireframe), 'overflow:hidden', 'white-space:nowrap']),\n 'data-rrweb-id': _id,\n },\n id: _id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction makeTextElement(\n wireframe: wireframeText,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (wireframe.type !== 'text') {\n console.error('Passed incorrect wireframe type to makeTextElement')\n return null\n }\n\n // because we might have to style the text, we always wrap it in a div\n // and apply styles to that\n const id = context.idSequence.next().value\n\n const childNodes = [...children]\n if (!_isNullish(wireframe.text)) {\n childNodes.unshift({\n type: NodeType.Text,\n textContent: wireframe.text,\n // since the text node is wrapped, we assign it a synthetic id\n id,\n })\n }\n\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: asStyleString([makeStylesString(wireframe), 'overflow:hidden', 'white-space:normal']),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes,\n },\n context,\n }\n}\n\nfunction makeWebViewElement(\n wireframe: wireframe,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const labelledWireframe: wireframePlaceholder = { ...wireframe } as wireframePlaceholder\n if ('url' in wireframe) {\n labelledWireframe.label = wireframe.url\n }\n\n return makePlaceholderElement(labelledWireframe, children, context)\n}\n\nexport function makePlaceholderElement(\n wireframe: wireframe,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const txt = 'label' in wireframe && wireframe.label ? wireframe.label : wireframe.type || 'PLACEHOLDER'\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe, {\n verticalAlign: 'center',\n horizontalAlign: 'center',\n backgroundColor: wireframe.style?.backgroundColor || BACKGROUND,\n color: wireframe.style?.color || FOREGROUND,\n backgroundImage: PLACEHOLDER_SVG_DATA_IMAGE_URL,\n backgroundSize: 'auto',\n backgroundRepeat: 'unset',\n ...context.styleOverride,\n }),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [\n {\n type: NodeType.Text,\n // since the text node is wrapped, we assign it a synthetic id\n id: context.idSequence.next().value,\n textContent: txt,\n },\n ...children,\n ],\n },\n context,\n }\n}\n\nexport function dataURIOrPNG(src: string): string {\n // replace all new lines in src\n src = src.replace(/\\r?\\n|\\r/g, '')\n if (!src.startsWith('data:image/')) {\n return 'data:image/png;base64,' + src\n }\n return src\n}\n\nfunction makeImageElement(\n wireframe: wireframeImage | wireframeScreenshot,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (!wireframe.base64) {\n return makePlaceholderElement(wireframe, children, context)\n }\n\n const src = dataURIOrPNG(wireframe.base64)\n return {\n result: {\n type: NodeType.Element,\n tagName: 'img',\n attributes: {\n src: src,\n width: wireframe.width,\n height: wireframe.height,\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction inputAttributes(wireframe: T): attributes {\n const attributes = {\n style: makeStylesString(wireframe),\n type: wireframe.inputType,\n ...(wireframe.disabled ? { disabled: wireframe.disabled } : {}),\n 'data-rrweb-id': wireframe.id,\n }\n\n switch (wireframe.inputType) {\n case 'checkbox':\n return {\n ...attributes,\n style: null, // checkboxes are styled by being combined with a label\n ...(wireframe.checked ? { checked: wireframe.checked } : {}),\n }\n case 'toggle':\n return {\n ...attributes,\n style: null, // toggle are styled by being combined with a label\n ...(wireframe.checked ? { checked: wireframe.checked } : {}),\n }\n case 'radio':\n return {\n ...attributes,\n style: null, // radio buttons are styled by being combined with a label\n ...(wireframe.checked ? { checked: wireframe.checked } : {}),\n // radio value defaults to the string \"on\" if not specified\n // we're not really submitting the form, so it doesn't matter 🤞\n // radio name is used to correctly uncheck values when one is checked\n // mobile doesn't really have it, and we will be checking based on snapshots,\n // so we can ignore it for now\n }\n case 'button':\n return {\n ...attributes,\n }\n case 'text_area':\n return {\n ...attributes,\n value: wireframe.value || '',\n }\n case 'progress':\n return {\n ...attributes,\n // indeterminate when omitted\n value: wireframe.value || null,\n // defaults to 1 when omitted\n max: wireframe.max || null,\n type: null, // progress has no type attribute\n }\n default:\n return {\n ...attributes,\n value: wireframe.value || '',\n }\n }\n}\n\nfunction makeButtonElement(\n wireframe: wireframeButton,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const buttonText: textNode | null = wireframe.value\n ? {\n type: NodeType.Text,\n textContent: wireframe.value,\n }\n : null\n\n return {\n result: {\n type: NodeType.Element,\n tagName: 'button',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: buttonText ? [{ ...buttonText, id: context.idSequence.next().value }, ...children] : children,\n },\n context,\n }\n}\n\nfunction makeSelectOptionElement(\n option: string,\n selected: boolean,\n context: ConversionContext\n): ConversionResult {\n const optionId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'option',\n attributes: {\n ...(selected ? { selected: selected } : {}),\n 'data-rrweb-id': optionId,\n },\n id: optionId,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: option,\n id: context.idSequence.next().value,\n },\n ],\n },\n context,\n }\n}\n\nfunction makeSelectElement(\n wireframe: wireframeSelect,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const selectOptions: serializedNodeWithId[] = []\n if (wireframe.options) {\n let optionContext = context\n for (let i = 0; i < wireframe.options.length; i++) {\n const option = wireframe.options[i]\n const conversion = makeSelectOptionElement(option, wireframe.value === option, optionContext)\n selectOptions.push(conversion.result)\n optionContext = conversion.context\n }\n }\n return {\n result: {\n type: NodeType.Element,\n tagName: 'select',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: [...selectOptions, ...children],\n },\n context,\n }\n}\n\nfunction groupRadioButtons(children: serializedNodeWithId[], radioGroupName: string): serializedNodeWithId[] {\n return children.map((child) => {\n if (child.type === NodeType.Element && child.tagName === 'input' && child.attributes.type === 'radio') {\n return {\n ...child,\n attributes: {\n ...child.attributes,\n name: radioGroupName,\n 'data-rrweb-id': child.id,\n },\n }\n }\n return child\n })\n}\n\nfunction makeRadioGroupElement(\n wireframe: wireframeRadioGroup,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const radioGroupName = 'radio_group_' + wireframe.id\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: groupRadioButtons(children, radioGroupName),\n },\n context,\n }\n}\n\nfunction makeStar(title: string, path: string, context: ConversionContext): serializedNodeWithId {\n const svgId = context.idSequence.next().value\n const titleId = context.idSequence.next().value\n const pathId = context.idSequence.next().value\n return {\n type: NodeType.Element,\n tagName: 'svg',\n isSVG: true,\n attributes: {\n style: asStyleString(['height: 100%', 'overflow-clip-margin: content-box', 'overflow:hidden']),\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n 'data-rrweb-id': svgId,\n },\n id: svgId,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'title',\n isSVG: true,\n attributes: {\n 'data-rrweb-id': titleId,\n },\n id: titleId,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: title,\n id: context.idSequence.next().value,\n },\n ],\n },\n {\n type: NodeType.Element,\n tagName: 'path',\n isSVG: true,\n attributes: {\n d: path,\n 'data-rrweb-id': pathId,\n },\n id: pathId,\n childNodes: [],\n },\n ],\n }\n}\n\nfunction filledStar(context: ConversionContext): serializedNodeWithId {\n return makeStar(\n 'filled star',\n 'M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z',\n context\n )\n}\n\nfunction halfStar(context: ConversionContext): serializedNodeWithId {\n return makeStar(\n 'half-filled star',\n 'M12,15.4V6.1L13.71,10.13L18.09,10.5L14.77,13.39L15.76,17.67M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z',\n context\n )\n}\n\nfunction emptyStar(context: ConversionContext): serializedNodeWithId {\n return makeStar(\n 'empty star',\n 'M12,15.39L8.24,17.66L9.23,13.38L5.91,10.5L10.29,10.13L12,6.09L13.71,10.13L18.09,10.5L14.77,13.38L15.76,17.66M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z',\n context\n )\n}\n\nfunction makeRatingBar(\n wireframe: wireframeProgress,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n // max is the number of stars... and value is the number of stars to fill\n\n // deliberate double equals, because we want to allow null and undefined\n if (wireframe.value == null || wireframe.max == null) {\n return makePlaceholderElement(wireframe, children, context)\n }\n\n const numberOfFilledStars = Math.floor(wireframe.value)\n const numberOfHalfStars = wireframe.value - numberOfFilledStars > 0 ? 1 : 0\n const numberOfEmptyStars = wireframe.max - numberOfFilledStars - numberOfHalfStars\n\n const filledStars = Array(numberOfFilledStars)\n .fill(undefined)\n .map(() => filledStar(context))\n const halfStars = Array(numberOfHalfStars)\n .fill(undefined)\n .map(() => halfStar(context))\n const emptyStars = Array(numberOfEmptyStars)\n .fill(undefined)\n .map(() => emptyStar(context))\n\n const ratingBarId = context.idSequence.next().value\n const ratingBar = {\n type: NodeType.Element,\n tagName: 'div',\n id: ratingBarId,\n attributes: {\n style: asStyleString([\n makeColorStyles(wireframe),\n 'position: relative',\n 'display: flex',\n 'flex-direction: row',\n 'padding: 2px 4px',\n ]),\n 'data-rrweb-id': ratingBarId,\n },\n childNodes: [...filledStars, ...halfStars, ...emptyStars],\n } as serializedNodeWithId\n\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [ratingBar, ...children],\n },\n context,\n }\n}\n\nfunction makeProgressElement(\n wireframe: wireframeProgress,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (wireframe.style?.bar === 'circular') {\n // value needs to be expressed as a number between 0 and 100\n const max = wireframe.max || 1\n let value = wireframe.value || null\n if (_isPositiveInteger(value) && value <= max) {\n value = (value / max) * 100\n } else {\n value = null\n }\n\n const styleOverride = {\n color: wireframe.style?.color || FOREGROUND,\n backgroundColor: wireframe.style?.backgroundColor || BACKGROUND,\n }\n\n // if not _isPositiveInteger(value) then we render a spinner,\n // so we need to add a style element with the spin keyframe\n const stylingChildren: serializedNodeWithId[] = _isPositiveInteger(value)\n ? []\n : [\n {\n type: NodeType.Element,\n tagName: 'style',\n attributes: {\n type: 'text/css',\n },\n id: context.idSequence.next().value,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: `@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`,\n id: context.idSequence.next().value,\n },\n ],\n },\n ]\n\n const wrappingDivId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeMinimalStyles(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n // with no provided value we render a spinner\n style: _isPositiveInteger(value)\n ? makeDeterminateProgressStyles(wireframe, styleOverride)\n : makeIndeterminateProgressStyles(wireframe, styleOverride),\n 'data-rrweb-id': wrappingDivId,\n },\n id: wrappingDivId,\n childNodes: stylingChildren,\n },\n ...children,\n ],\n },\n context,\n }\n } else if (wireframe.style?.bar === 'rating') {\n return makeRatingBar(wireframe, children, context)\n }\n return {\n result: {\n type: NodeType.Element,\n tagName: 'progress',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction makeToggleParts(wireframe: wireframeToggle, context: ConversionContext): serializedNodeWithId[] {\n const togglePosition = wireframe.checked ? 'right' : 'left'\n const defaultColor = wireframe.checked ? '#1d4aff' : BACKGROUND\n const sliderPartId = context.idSequence.next().value\n const handlePartId = context.idSequence.next().value\n return [\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-toggle-part': 'slider',\n style: asStyleString([\n 'position:absolute',\n 'top:33%',\n 'left:5%',\n 'display:inline-block',\n 'width:75%',\n 'height:33%',\n 'opacity: 0.2',\n 'border-radius:7.5%',\n `background-color:${wireframe.style?.color || defaultColor}`,\n ]),\n 'data-rrweb-id': sliderPartId,\n },\n id: sliderPartId,\n childNodes: [],\n },\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-toggle-part': 'handle',\n style: asStyleString([\n 'position:absolute',\n 'top:1.5%',\n `${togglePosition}:5%`,\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'width:40%',\n 'height:75%',\n 'cursor:inherit',\n 'border-radius:50%',\n `background-color:${wireframe.style?.color || defaultColor}`,\n `border:2px solid ${wireframe.style?.borderColor || wireframe.style?.color || defaultColor}`,\n ]),\n 'data-rrweb-id': handlePartId,\n },\n id: handlePartId,\n childNodes: [],\n },\n ]\n}\n\nfunction makeToggleElement(\n wireframe: wireframeToggle,\n context: ConversionContext\n): ConversionResult<\n elementNode & {\n id: number\n }\n> | null {\n const isLabelled = 'label' in wireframe\n const wrappingDivId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n // if labelled take up available space, otherwise use provided positioning\n style: isLabelled ? asStyleString(['height:100%', 'flex:1']) : makePositionStyles(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n // relative position, fills parent\n style: asStyleString(['position:relative', 'width:100%', 'height:100%']),\n 'data-rrweb-id': wrappingDivId,\n },\n id: wrappingDivId,\n childNodes: makeToggleParts(wireframe, context),\n },\n ],\n },\n context,\n }\n}\n\nfunction makeLabelledInput(\n wireframe: wireframeCheckBox | wireframeRadio | wireframeToggle,\n theInputElement: serializedNodeWithId,\n context: ConversionContext\n): ConversionResult {\n const theLabel: serializedNodeWithId = {\n type: NodeType.Text,\n textContent: wireframe.label || '',\n id: context.idSequence.next().value,\n }\n\n const orderedChildren = wireframe.inputType === 'toggle' ? [theLabel, theInputElement] : [theInputElement, theLabel]\n\n const labelId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'label',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': labelId,\n },\n id: labelId,\n childNodes: orderedChildren,\n },\n context,\n }\n}\n\nfunction makeInputElement(\n wireframe: wireframeInputComponent,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (!wireframe.inputType) {\n return null\n }\n\n if (wireframe.inputType === 'button') {\n return makeButtonElement(wireframe, children, context)\n }\n\n if (wireframe.inputType === 'select') {\n return makeSelectElement(wireframe, children, context)\n }\n\n if (wireframe.inputType === 'progress') {\n return makeProgressElement(wireframe, children, context)\n }\n\n const theInputElement: ConversionResult | null =\n wireframe.inputType === 'toggle'\n ? makeToggleElement(wireframe, context)\n : {\n result: {\n type: NodeType.Element,\n tagName: 'input',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n\n if (!theInputElement) {\n return null\n }\n\n if ('label' in wireframe) {\n return makeLabelledInput(wireframe, theInputElement.result, theInputElement.context)\n }\n // when labelled no styles are needed, when un-labelled as here - we add the styling in.\n ;(theInputElement.result as elementNode).attributes.style = makeStylesString(wireframe)\n return theInputElement\n}\n\nfunction makeRectangleElement(\n wireframe: wireframeRectangle,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction chooseConverter(\n wireframe: T\n): (\n wireframe: T,\n children: serializedNodeWithId[],\n context: ConversionContext\n) => ConversionResult | null {\n // in theory type is always present\n // but since this is coming over the wire we can't really be sure,\n // and so we default to div\n const converterType: MobileNodeType = wireframe.type || 'div'\n const converterMapping: Record<\n MobileNodeType,\n (wireframe: T, children: serializedNodeWithId[]) => ConversionResult | null\n > = {\n // KLUDGE: TS can't tell that the wireframe type of each function is safe based on the converter type\n text: makeTextElement as any,\n image: makeImageElement as any,\n rectangle: makeRectangleElement as any,\n div: makeDivElement as any,\n input: makeInputElement as any,\n radio_group: makeRadioGroupElement as any,\n web_view: makeWebViewElement as any,\n placeholder: makePlaceholderElement as any,\n status_bar: makeStatusBar as any,\n navigation_bar: makeNavigationBar as any,\n screenshot: makeImageElement as any,\n }\n return converterMapping[converterType]\n}\n\nfunction convertWireframe(\n wireframe: wireframe,\n context: ConversionContext\n): ConversionResult | null {\n const children = convertWireframesFor(wireframe.childWireframes, context)\n const converted = chooseConverter(wireframe)?.(wireframe, children.result, children.context)\n return converted || null\n}\n\nfunction convertWireframesFor(\n wireframes: wireframe[] | undefined,\n context: ConversionContext\n): ConversionResult {\n if (!wireframes) {\n return { result: [], context }\n }\n\n const result: serializedNodeWithId[] = []\n for (const wireframe of wireframes) {\n const converted = convertWireframe(wireframe, context)\n if (converted) {\n result.push(converted.result)\n context = converted.context\n }\n }\n return { result, context }\n}\n\nfunction isMobileIncrementalSnapshotEvent(x: unknown): x is MobileIncrementalSnapshotEvent {\n const isIncrementalSnapshot = isObject(x) && 'type' in x && x.type === EventType.IncrementalSnapshot\n if (!isIncrementalSnapshot) {\n return false\n }\n const hasData = isObject(x) && 'data' in x\n const data = hasData ? x.data : null\n\n const hasMutationSource = isObject(data) && 'source' in data && data.source === IncrementalSource.Mutation\n\n const adds = isObject(data) && 'adds' in data && Array.isArray(data.adds) ? data.adds : null\n const updates = isObject(data) && 'updates' in data && Array.isArray(data.updates) ? data.updates : null\n\n const hasUpdatedWireframe = !!updates && updates.length > 0 && isObject(updates[0]) && 'wireframe' in updates[0]\n const hasAddedWireframe = !!adds && adds.length > 0 && isObject(adds[0]) && 'wireframe' in adds[0]\n\n return hasMutationSource && (hasAddedWireframe || hasUpdatedWireframe)\n}\n\nfunction chooseParentId(nodeType: MobileNodeType, providedParentId: number): number {\n return nodeType === 'screenshot' ? BODY_ID : providedParentId\n}\n\nfunction makeIncrementalAdd(add: MobileNodeMutation, context: ConversionContext): addedNodeMutation[] | null {\n const converted = convertWireframe(add.wireframe, context)\n\n if (!converted) {\n return null\n }\n\n const addition: addedNodeMutation = {\n parentId: chooseParentId(add.wireframe.type, add.parentId),\n nextId: null,\n node: converted.result,\n }\n const adds: addedNodeMutation[] = []\n if (addition) {\n const flattened = flattenMutationAdds(addition)\n flattened.forEach((x) => adds.push(x))\n return adds\n }\n return null\n}\n\n/**\n * When processing an update we remove the entire item, and then add it back in.\n */\nfunction makeIncrementalRemoveForUpdate(update: MobileNodeMutation): removedNodeMutation {\n return {\n parentId: chooseParentId(update.wireframe.type, update.parentId),\n id: update.wireframe.id,\n }\n}\n\nfunction isNode(x: unknown): x is serializedNodeWithId {\n // KLUDGE: really we should check that x.type is valid, but we're safe enough already\n return isObject(x) && 'type' in x && 'id' in x\n}\n\nfunction isNodeWithChildren(x: unknown): x is elementNode | documentNode {\n return isNode(x) && 'childNodes' in x && Array.isArray(x.childNodes)\n}\n\n/**\n * when creating incremental adds we have to flatten the node tree structure\n * there's no point, then keeping those child nodes in place\n */\nfunction cloneWithoutChildren(converted: addedNodeMutation): addedNodeMutation {\n const cloned = { ...converted }\n const clonedNode: serializedNodeWithId = { ...converted.node }\n if (isNodeWithChildren(clonedNode)) {\n clonedNode.childNodes = []\n }\n cloned.node = clonedNode\n return cloned\n}\n\nfunction flattenMutationAdds(converted: addedNodeMutation): addedNodeMutation[] {\n const flattened: addedNodeMutation[] = []\n\n flattened.push(cloneWithoutChildren(converted))\n\n const node: unknown = converted.node\n const newParentId = converted.node.id\n if (isNodeWithChildren(node)) {\n node.childNodes.forEach((child) => {\n flattened.push(\n cloneWithoutChildren({\n parentId: newParentId,\n nextId: null,\n node: child,\n })\n )\n if (isNodeWithChildren(child)) {\n flattened.push(...flattenMutationAdds({ parentId: newParentId, nextId: null, node: child }))\n }\n })\n }\n return flattened\n}\n\n/**\n * each update wireframe carries the entire tree because we don't want to diff on the client\n * that means that we might create multiple mutations for the same node\n * we only want to add it once, so we dedupe the mutations\n * the app guarantees that for a given ID that is present more than once in a single snapshot\n * every instance of that ID is identical\n * it might change in the next snapshot but for a single incremental snapshot there is one\n * and only one version of any given ID\n */\nfunction dedupeMutations(mutations: T[]): T[] {\n // KLUDGE: it's slightly yucky to stringify everything but since synthetic nodes\n // introduce a new id, we can't just compare the id\n const seen = new Set()\n\n // in case later mutations are the ones we want to keep, we reverse the array\n // this does help with the deduping, so, it's likely that the view for a single ID\n // is not consistent over a snapshot, but it's cheap to reverse so :YOLO:\n return mutations\n .reverse()\n .filter((mutation: addedNodeMutation | removedNodeMutation) => {\n let toCompare: string\n if (isRemovedNodeMutation(mutation)) {\n toCompare = JSON.stringify(mutation)\n } else {\n // if this is a synthetic addition, then we need to ignore the id,\n // since duplicates won't have duplicate ids\n toCompare = JSON.stringify({\n ...mutation.node,\n id: 0,\n })\n }\n\n if (seen.has(toCompare)) {\n return false\n }\n seen.add(toCompare)\n return true\n })\n .reverse()\n}\n\n/**\n * We want to ensure that any events don't use id = 0.\n * They must always represent a valid ID from the dom, so we swap in the body id when the id = 0.\n *\n * For \"removes\", we don't need to do anything, the id of the element to be removed remains valid. We won't try and remove other elements that we added during transformation in order to show that element.\n *\n * \"adds\" are converted from wireframes to nodes and converted to `incrementalSnapshotEvent.adds`\n *\n * \"updates\" are converted to a remove and an add.\n *\n */\nexport const makeIncrementalEvent = (\n mobileEvent: (MobileIncrementalSnapshotEvent | incrementalSnapshotEvent) & {\n timestamp: number\n delay?: number\n }\n): incrementalSnapshotEvent & {\n timestamp: number\n delay?: number\n} => {\n const converted = mobileEvent as unknown as incrementalSnapshotEvent & {\n timestamp: number\n delay?: number\n }\n if ('id' in converted.data && converted.data.id === 0) {\n converted.data.id = BODY_ID\n }\n\n if (isMobileIncrementalSnapshotEvent(mobileEvent)) {\n const adds: addedNodeMutation[] = []\n const removes: removedNodeMutation[] = mobileEvent.data.removes || []\n if ('adds' in mobileEvent.data && Array.isArray(mobileEvent.data.adds)) {\n const addsContext = {\n timestamp: mobileEvent.timestamp,\n idSequence: globalIdSequence,\n }\n\n mobileEvent.data.adds.forEach((add) => {\n makeIncrementalAdd(add, addsContext)?.forEach((x) => adds.push(x))\n })\n }\n if ('updates' in mobileEvent.data && Array.isArray(mobileEvent.data.updates)) {\n const updatesContext = {\n timestamp: mobileEvent.timestamp,\n idSequence: globalIdSequence,\n }\n const updateAdditions: addedNodeMutation[] = []\n mobileEvent.data.updates.forEach((update) => {\n const removal = makeIncrementalRemoveForUpdate(update)\n if (removal) {\n removes.push(removal)\n }\n makeIncrementalAdd(update, updatesContext)?.forEach((x) => updateAdditions.push(x))\n })\n dedupeMutations(updateAdditions).forEach((x) => adds.push(x))\n }\n\n converted.data = {\n source: IncrementalSource.Mutation,\n attributes: [],\n texts: [],\n adds: dedupeMutations(adds),\n // TODO: this assumes that removes are processed before adds 🤞\n removes: dedupeMutations(removes),\n }\n }\n\n return converted\n}\n\nfunction makeKeyboardParent(): serializedNodeWithId {\n return {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-render-reason': 'a fixed placeholder to contain the keyboard in the correct stacking position',\n 'data-rrweb-id': KEYBOARD_PARENT_ID,\n },\n id: KEYBOARD_PARENT_ID,\n childNodes: [],\n }\n}\n\nfunction makeStatusBarNode(\n statusBar: wireframeStatusBar | undefined,\n context: ConversionContext\n): serializedNodeWithId {\n const childNodes = statusBar ? convertWireframesFor([statusBar], context).result : []\n return {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-rrweb-id': STATUS_BAR_PARENT_ID,\n },\n id: STATUS_BAR_PARENT_ID,\n childNodes,\n }\n}\n\nfunction makeNavBarNode(\n navigationBar: wireframeNavigationBar | undefined,\n context: ConversionContext\n): serializedNodeWithId {\n const childNodes = navigationBar ? convertWireframesFor([navigationBar], context).result : []\n return {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-rrweb-id': NAVIGATION_BAR_PARENT_ID,\n },\n id: NAVIGATION_BAR_PARENT_ID,\n childNodes,\n }\n}\n\nfunction stripBarsFromWireframe(wireframe: wireframe): {\n wireframe: wireframe | undefined\n statusBar: wireframeStatusBar | undefined\n navBar: wireframeNavigationBar | undefined\n} {\n if (wireframe.type === 'status_bar') {\n return { wireframe: undefined, statusBar: wireframe, navBar: undefined }\n } else if (wireframe.type === 'navigation_bar') {\n return { wireframe: undefined, statusBar: undefined, navBar: wireframe }\n }\n let statusBar: wireframeStatusBar | undefined\n let navBar: wireframeNavigationBar | undefined\n const wireframeToReturn: wireframe | undefined = { ...wireframe }\n wireframeToReturn.childWireframes = []\n for (const child of wireframe.childWireframes || []) {\n const {\n wireframe: childWireframe,\n statusBar: childStatusBar,\n navBar: childNavBar,\n } = stripBarsFromWireframe(child)\n statusBar = statusBar || childStatusBar\n navBar = navBar || childNavBar\n if (childWireframe) {\n wireframeToReturn.childWireframes.push(childWireframe)\n }\n }\n return { wireframe: wireframeToReturn, statusBar, navBar }\n}\n\n/**\n * We want to be able to place the status bar and navigation bar in the correct stacking order.\n * So, we lift them out of the tree, and return them separately.\n */\nexport function stripBarsFromWireframes(wireframes: wireframe[]): {\n statusBar: wireframeStatusBar | undefined\n navigationBar: wireframeNavigationBar | undefined\n appNodes: wireframe[]\n} {\n let statusBar: wireframeStatusBar | undefined\n let navigationBar: wireframeNavigationBar | undefined\n const copiedNodes: wireframe[] = []\n\n wireframes.forEach((w) => {\n const matches = stripBarsFromWireframe(w)\n if (matches.statusBar) {\n statusBar = matches.statusBar\n }\n if (matches.navBar) {\n navigationBar = matches.navBar\n }\n if (matches.wireframe) {\n copiedNodes.push(matches.wireframe)\n }\n })\n return { statusBar, navigationBar, appNodes: copiedNodes }\n}\n\nexport const makeFullEvent = (\n mobileEvent: MobileFullSnapshotEvent & {\n timestamp: number\n delay?: number\n }\n): fullSnapshotEvent & {\n timestamp: number\n delay?: number\n} => {\n // we can restart the id sequence on each full snapshot\n globalIdSequence = ids()\n\n if (!('wireframes' in mobileEvent.data)) {\n return mobileEvent as unknown as fullSnapshotEvent & {\n timestamp: number\n delay?: number\n }\n }\n\n const conversionContext = {\n timestamp: mobileEvent.timestamp,\n idSequence: globalIdSequence,\n }\n\n const { statusBar, navigationBar, appNodes } = stripBarsFromWireframes(mobileEvent.data.wireframes)\n\n const nodeGroups = {\n appNodes: convertWireframesFor(appNodes, conversionContext).result || [],\n statusBarNode: makeStatusBarNode(statusBar, conversionContext),\n navBarNode: makeNavBarNode(navigationBar, conversionContext),\n }\n\n return {\n type: EventType.FullSnapshot,\n timestamp: mobileEvent.timestamp,\n data: {\n node: {\n type: NodeType.Document,\n childNodes: [\n {\n type: NodeType.DocumentType,\n name: 'html',\n publicId: '',\n systemId: '',\n id: HTML_DOC_TYPE_ID,\n },\n {\n type: NodeType.Element,\n tagName: 'html',\n attributes: { style: makeHTMLStyles(), 'data-rrweb-id': HTML_ELEMENT_ID },\n id: HTML_ELEMENT_ID,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'head',\n attributes: { 'data-rrweb-id': HEAD_ID },\n id: HEAD_ID,\n childNodes: [makeCSSReset(conversionContext)],\n },\n {\n type: NodeType.Element,\n tagName: 'body',\n attributes: { style: makeBodyStyles(), 'data-rrweb-id': BODY_ID },\n id: BODY_ID,\n childNodes: [\n // in the order they should stack if they ever clash\n // lower is higher in the stacking context\n ...nodeGroups.appNodes,\n makeKeyboardParent(),\n nodeGroups.navBarNode,\n nodeGroups.statusBarNode,\n ],\n },\n ],\n },\n ],\n id: DOCUMENT_ID,\n },\n initialOffset: {\n top: 0,\n left: 0,\n },\n },\n }\n}\n\nfunction makeCSSReset(context: ConversionContext): serializedNodeWithId {\n // we need to normalize CSS so browsers don't do unexpected things\n return {\n type: NodeType.Element,\n tagName: 'style',\n attributes: {\n type: 'text/css',\n },\n id: context.idSequence.next().value,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: `\n body {\n margin: unset;\n }\n input, button, select, textarea {\n font: inherit;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: transparent;\n padding-block: 0 !important;\n }\n .input:focus {\n outline: none;\n }\n img {\n border-style: none;\n }\n `,\n id: context.idSequence.next().value,\n },\n ],\n }\n}\n","import posthogEE from '@posthog/ee/exports'\nimport { customEvent, EventType, eventWithTime, fullSnapshotEvent, IncrementalSource } from '@rrweb/types'\nimport { captureException } from '@sentry/react'\nimport { gunzipSync, strFromU8, strToU8 } from 'fflate'\nimport {\n actions,\n afterMount,\n beforeUnmount,\n connect,\n defaults,\n kea,\n key,\n listeners,\n path,\n props,\n reducers,\n selectors,\n} from 'kea'\nimport { loaders } from 'kea-loaders'\nimport { subscriptions } from 'kea-subscriptions'\nimport api from 'lib/api'\nimport { FEATURE_FLAGS } from 'lib/constants'\nimport { Dayjs, dayjs } from 'lib/dayjs'\nimport { featureFlagLogic, FeatureFlagsSet } from 'lib/logic/featureFlagLogic'\nimport { isObject } from 'lib/utils'\nimport { chainToElements } from 'lib/utils/elements-chain'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\nimport posthog from 'posthog-js'\nimport { compressedEventWithTime } from 'posthog-js/lib/src/extensions/replay/sessionrecording'\nimport { RecordingComment } from 'scenes/session-recordings/player/inspector/playerInspectorLogic'\nimport { teamLogic } from 'scenes/teamLogic'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport {\n AnyPropertyFilter,\n EncodedRecordingSnapshot,\n PersonType,\n PropertyFilterType,\n PropertyOperator,\n RecordingEventsFilters,\n RecordingEventType,\n RecordingReportLoadTimes,\n RecordingSegment,\n RecordingSnapshot,\n SessionPlayerData,\n SessionRecordingId,\n SessionRecordingSnapshotParams,\n SessionRecordingSnapshotSource,\n SessionRecordingSnapshotSourceResponse,\n SessionRecordingType,\n SessionRecordingUsageType,\n SnapshotSourceType,\n} from '~/types'\n\nimport { PostHogEE } from '../../../../@posthog/ee/types'\nimport { ExportedSessionRecordingFileV2 } from '../file-playback/types'\nimport type { sessionRecordingDataLogicType } from './sessionRecordingDataLogicType'\nimport { createSegments, mapSnapshotsToWindowId } from './utils/segmenter'\n\nconst IS_TEST_MODE = process.env.NODE_ENV === 'test'\nconst BUFFER_MS = 60000 // +- before and after start and end of a recording to query for.\nconst DEFAULT_REALTIME_POLLING_MILLIS = 3000\n\nlet postHogEEModule: PostHogEE\n\nfunction isRecordingSnapshot(x: unknown): x is RecordingSnapshot {\n return typeof x === 'object' && x !== null && 'type' in x && 'timestamp' in x\n}\n\n/*\n there was a bug in mobile SDK that didn't consistently send a meta event with a full snapshot.\n rrweb player hides itself until it has seen the meta event 🤷\n but we can patch a meta event into the recording data to make it work\n*/\nfunction patchMetaEventIntoMobileData(parsedLines: RecordingSnapshot[]): RecordingSnapshot[] {\n let fullSnapshotIndex: number = -1\n let metaIndex: number = -1\n try {\n fullSnapshotIndex = parsedLines.findIndex((l) => l.type === EventType.FullSnapshot)\n metaIndex = parsedLines.findIndex((l) => l.type === EventType.Meta)\n\n // then we need to patch the meta event into the snapshot data\n if (fullSnapshotIndex > -1 && metaIndex === -1) {\n const fullSnapshot = parsedLines[fullSnapshotIndex] as RecordingSnapshot & fullSnapshotEvent & eventWithTime\n // a full snapshot (particularly from the mobile transformer) has a relatively fixed structure,\n // but the types exposed by rrweb don't quite cover what we need , so...\n const mainNode = fullSnapshot.data.node as any\n const targetNode = mainNode.childNodes[1].childNodes[1].childNodes[0]\n const { width, height } = targetNode.attributes\n const metaEvent: RecordingSnapshot = {\n windowId: fullSnapshot.windowId,\n type: EventType.Meta,\n timestamp: fullSnapshot.timestamp,\n data: {\n href: getHrefFromSnapshot(fullSnapshot) || '',\n width,\n height,\n },\n }\n parsedLines.splice(fullSnapshotIndex, 0, metaEvent)\n }\n } catch (e) {\n captureException(e, {\n tags: { feature: 'session-recording-missing-meta-patching' },\n extra: { fullSnapshotIndex, metaIndex },\n })\n }\n\n return parsedLines\n}\n\nfunction hasAnyWireframes(snapshotData: Record[]): boolean {\n return snapshotData.some((d) => {\n return isObject(d.data) && 'wireframes' in d.data\n })\n}\n\nfunction isCompressedEvent(ev: unknown): ev is compressedEventWithTime {\n return typeof ev === 'object' && ev !== null && 'cv' in ev\n}\n\nfunction unzip(compressedStr: string): any {\n return JSON.parse(strFromU8(gunzipSync(strToU8(compressedStr, true))))\n}\n\n/**\n *\n * takes an event that might be from web, might be from mobile,\n * and might be partially compressed,\n * and decompresses it when possible\n *\n * you can't return a union of `KnownType | unknown`\n * so even though this returns `eventWithTime | unknown`\n * it has to be typed as only unknown\n */\nfunction decompressEvent(ev: unknown): unknown {\n try {\n if (isCompressedEvent(ev)) {\n if (ev.cv === '2024-10') {\n if (ev.type === EventType.FullSnapshot) {\n return {\n ...ev,\n data: unzip(ev.data),\n }\n } else if (ev.type === EventType.IncrementalSnapshot) {\n if (ev.data.source === IncrementalSource.StyleSheetRule) {\n return {\n ...ev,\n data: {\n ...ev.data,\n source: IncrementalSource.StyleSheetRule,\n adds: unzip(ev.data.adds),\n removes: unzip(ev.data.removes),\n },\n }\n } else if (ev.data.source === IncrementalSource.Mutation) {\n return {\n ...ev,\n data: {\n ...ev.data,\n source: IncrementalSource.Mutation,\n adds: unzip(ev.data.adds),\n removes: unzip(ev.data.removes),\n texts: unzip(ev.data.texts),\n attributes: unzip(ev.data.attributes),\n },\n }\n }\n }\n } else {\n posthog.captureException(new Error('Unknown compressed event version'), {\n feature: 'session-recording-compressed-event-decompression',\n compressedEvent: ev,\n compressionVersion: ev.cv,\n })\n // probably unplayable but we don't know how to decompress it\n return ev\n }\n }\n return ev\n } catch (e) {\n posthog.captureException((e as Error) || new Error('Could not decompress event'), {\n feature: 'session-recording-compressed-event-decompression',\n compressedEvent: ev,\n })\n return ev\n }\n}\n\n/**\n * We can receive data in one of multiple formats, so we treat it as unknown\n * And if we can't process it force it into eventWithTime\n *\n * If it can't be case as eventWithTime by this point then it's probably not a valid event anyway\n */\nfunction coerceToEventWithTime(d: unknown, withMobileTransformer: boolean): eventWithTime {\n // we decompress first so that we could support partial compression on mobile in future\n const currentEvent = decompressEvent(d)\n return withMobileTransformer\n ? postHogEEModule?.mobileReplay?.transformEventToWeb(currentEvent) || (currentEvent as eventWithTime)\n : (currentEvent as eventWithTime)\n}\n\nexport const parseEncodedSnapshots = async (\n items: (RecordingSnapshot | EncodedRecordingSnapshot | string)[],\n sessionId: string,\n // this is only kept so that we can export the untransformed data for debugging\n withMobileTransformer: boolean = true\n): Promise => {\n if (!postHogEEModule) {\n postHogEEModule = await posthogEE()\n }\n\n const lineCount = items.length\n const unparseableLines: string[] = []\n let isMobileSnapshots = false\n\n const parsedLines: RecordingSnapshot[] = items.flatMap((l) => {\n if (!l) {\n // blob files have an empty line at the end\n return []\n }\n try {\n let snapshotLine: { windowId: string } | EncodedRecordingSnapshot\n if (typeof l === 'string') {\n // is loaded from blob or realtime storage\n snapshotLine = JSON.parse(l) as EncodedRecordingSnapshot\n } else {\n // is loaded from file export\n snapshotLine = l\n }\n let snapshotData: ({ windowId: string } | EncodedRecordingSnapshot)[]\n if (isRecordingSnapshot(snapshotLine)) {\n // is loaded from file export\n snapshotData = [snapshotLine]\n } else {\n // is loaded from blob or realtime storage\n snapshotData = snapshotLine['data']\n }\n\n if (!isMobileSnapshots) {\n isMobileSnapshots = hasAnyWireframes(snapshotData)\n }\n\n return snapshotData.map((d: unknown) => {\n const snap = coerceToEventWithTime(d, withMobileTransformer)\n\n return {\n // this handles parsing data that was loaded from blob storage \"window_id\"\n // and data that was exported from the front-end \"windowId\"\n // we have more than one format of data that we store/pass around\n // but only one that we play back\n windowId: snapshotLine['window_id'] || snapshotLine['windowId'],\n ...snap,\n }\n })\n } catch (e) {\n if (typeof l === 'string') {\n unparseableLines.push(l)\n }\n return []\n }\n })\n\n if (unparseableLines.length) {\n const extra = {\n playbackSessionId: sessionId,\n totalLineCount: lineCount,\n unparseableLinesCount: unparseableLines.length,\n exampleLines: unparseableLines.slice(0, 3),\n }\n posthog.capture('session recording had unparseable lines', {\n ...extra,\n feature: 'session-recording-snapshot-processing',\n })\n }\n\n return isMobileSnapshots ? patchMetaEventIntoMobileData(parsedLines) : parsedLines\n}\n\nconst getHrefFromSnapshot = (snapshot: unknown): string | undefined => {\n return isObject(snapshot) && 'data' in snapshot\n ? (snapshot.data as any)?.href || (snapshot.data as any)?.payload?.href\n : undefined\n}\n\n/*\n cyrb53 (c) 2018 bryc (github.com/bryc)\n License: Public domain. Attribution appreciated.\n A fast and simple 53-bit string hash function with decent collision resistance.\n Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity.\n*/\nconst cyrb53 = function (str: string, seed = 0): number {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i)\n h1 = Math.imul(h1 ^ ch, 2654435761)\n h2 = Math.imul(h2 ^ ch, 1597334677)\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507)\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507)\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n\nexport const deduplicateSnapshots = (snapshots: RecordingSnapshot[] | null): RecordingSnapshot[] => {\n const seenHashes: Set = new Set()\n\n return (snapshots ?? [])\n .filter((snapshot) => {\n // For a multitude of reasons, there can be duplicate snapshots in the same recording.\n // we have to stringify the snapshot to compare it to other snapshots.\n // so we can filter by storing them all in a set\n\n // we can see duplicates that only differ by delay - these still count as duplicates\n // even though the delay would hide that\n const { delay: _delay, ...delayFreeSnapshot } = snapshot\n // we check each item multiple times as new snapshots come in\n // so store the computer value on the object to save recalculating it so much\n const key = (snapshot as any).seen || cyrb53(JSON.stringify(delayFreeSnapshot))\n ;(snapshot as any).seen = key\n\n if (seenHashes.has(key)) {\n return false\n }\n seenHashes.add(key)\n return true\n })\n .sort((a, b) => a.timestamp - b.timestamp)\n}\n\nconst generateRecordingReportDurations = (cache: Record): RecordingReportLoadTimes => {\n return {\n metadata: cache.metadataLoadDuration || Math.round(performance.now() - cache.metaStartTime),\n snapshots: cache.snapshotsLoadDuration || Math.round(performance.now() - cache.snapshotsStartTime),\n events: cache.eventsLoadDuration || Math.round(performance.now() - cache.eventsStartTime),\n firstPaint: cache.firstPaintDuration,\n }\n}\n\nconst resetTimingsCache = (cache: Record): void => {\n cache.metaStartTime = null\n cache.metadataLoadDuration = null\n cache.snapshotsStartTime = null\n cache.snapshotsLoadDuration = null\n cache.eventsStartTime = null\n cache.eventsLoadDuration = null\n cache.firstPaintDuration = null\n}\n\nexport interface SessionRecordingDataLogicProps {\n sessionRecordingId: SessionRecordingId\n realTimePollingIntervalMilliseconds?: number\n}\n\nfunction makeEventsQuery(\n person: PersonType | null,\n distinctId: string | null,\n start: Dayjs,\n end: Dayjs,\n properties: AnyPropertyFilter[]\n): Promise {\n return api.query({\n kind: NodeKind.EventsQuery,\n // NOTE: Be careful adding fields here. We want to keep the payload as small as possible to load all events quickly\n select: [\n 'uuid',\n 'event',\n 'timestamp',\n 'elements_chain',\n 'properties.$window_id',\n 'properties.$current_url',\n 'properties.$event_type',\n ],\n orderBy: ['timestamp ASC'],\n limit: 1000000,\n personId: person ? String(person.id) : undefined,\n after: start.subtract(BUFFER_MS, 'ms').format(),\n before: end.add(BUFFER_MS, 'ms').format(),\n properties: properties,\n where: distinctId ? [`distinct_id = ('${distinctId}')`] : undefined,\n })\n}\n\nasync function processEncodedResponse(\n encodedResponse: (EncodedRecordingSnapshot | string)[],\n props: SessionRecordingDataLogicProps,\n featureFlags: FeatureFlagsSet\n): Promise<{ transformed: RecordingSnapshot[]; untransformed: RecordingSnapshot[] | null }> {\n let untransformed: RecordingSnapshot[] | null = null\n\n const transformed = await parseEncodedSnapshots(encodedResponse, props.sessionRecordingId)\n\n if (featureFlags[FEATURE_FLAGS.SESSION_REPLAY_EXPORT_MOBILE_DATA]) {\n untransformed = await parseEncodedSnapshots(\n encodedResponse,\n props.sessionRecordingId,\n false // don't transform mobile data\n )\n }\n\n return { transformed, untransformed }\n}\n\nconst getSourceKey = (source: SessionRecordingSnapshotSource): string => {\n // realtime sources vary so blob_key is not always present and is either null or undefined...\n // we only care about key when not realtime\n // and we'll always have a key when not realtime\n return `${source.source}-${source.blob_key || source.source}`\n}\n\nexport const sessionRecordingDataLogic = kea([\n path((key) => ['scenes', 'session-recordings', 'sessionRecordingDataLogic', key]),\n props({} as SessionRecordingDataLogicProps),\n key(({ sessionRecordingId }) => sessionRecordingId || 'no-session-recording-id'),\n connect({\n logic: [eventUsageLogic],\n values: [featureFlagLogic, ['featureFlags'], teamLogic, ['currentTeam']],\n }),\n defaults({\n sessionPlayerMetaData: null as SessionRecordingType | null,\n }),\n actions({\n setFilters: (filters: Partial) => ({ filters }),\n loadRecordingMeta: true,\n loadRecordingComments: true,\n maybeLoadRecordingMeta: true,\n loadSnapshots: true,\n loadSnapshotSources: true,\n loadNextSnapshotSource: true,\n loadSnapshotsForSource: (source: Pick) => ({ source }),\n loadEvents: true,\n loadFullEventData: (event: RecordingEventType | RecordingEventType[]) => ({ event }),\n markViewed: (delay?: number) => ({ delay }),\n reportUsageIfFullyLoaded: true,\n persistRecording: true,\n maybePersistRecording: true,\n pollRealtimeSnapshots: true,\n stopRealtimePolling: true,\n setTrackedWindow: (windowId: string | null) => ({ windowId }),\n setWasMarkedViewed: (wasMarkedViewed: boolean) => ({ wasMarkedViewed }),\n }),\n reducers(() => ({\n trackedWindow: [\n null as string | null,\n {\n setTrackedWindow: (_, { windowId }) => windowId,\n },\n ],\n filters: [\n {} as Partial,\n {\n setFilters: (state, { filters }) => ({ ...state, ...filters }),\n },\n ],\n isRealtimePolling: [\n false as boolean,\n {\n pollRealtimeSnapshots: () => true,\n stopRealtimePolling: () => false,\n },\n ],\n isNotFound: [\n false as boolean,\n {\n loadRecordingMeta: () => false,\n loadRecordingMetaSuccess: () => false,\n loadRecordingMetaFailure: () => true,\n },\n ],\n snapshotsBySource: [\n null as Record | null,\n {\n loadSnapshotsForSourceSuccess: (state, { snapshotsForSource }) => {\n const sourceKey = getSourceKey(snapshotsForSource.source)\n\n return {\n ...state,\n [sourceKey]: snapshotsForSource,\n }\n },\n },\n ],\n wasMarkedViewed: [\n false as boolean,\n {\n setWasMarkedViewed: (_, { wasMarkedViewed }) => wasMarkedViewed,\n },\n ],\n })),\n loaders(({ values, props, cache }) => ({\n sessionComments: {\n loadRecordingComments: async (_, breakpoint) => {\n const empty: RecordingComment[] = []\n if (!props.sessionRecordingId) {\n return empty\n }\n\n const response = await api.notebooks.recordingComments(props.sessionRecordingId)\n breakpoint()\n\n return response.results || empty\n },\n },\n sessionPlayerMetaData: {\n loadRecordingMeta: async (_, breakpoint) => {\n if (!props.sessionRecordingId) {\n return null\n }\n\n cache.metaStartTime = performance.now()\n\n const response = await api.recordings.get(props.sessionRecordingId)\n breakpoint()\n\n return response\n },\n\n persistRecording: async (_, breakpoint) => {\n if (!values.sessionPlayerMetaData) {\n return null\n }\n await breakpoint(100)\n await api.recordings.persist(props.sessionRecordingId)\n\n return {\n ...values.sessionPlayerMetaData,\n storage: 'object_storage_lts',\n }\n },\n },\n snapshotSources: [\n null as SessionRecordingSnapshotSource[] | null,\n {\n loadSnapshotSources: async () => {\n const response = await api.recordings.listSnapshotSources(props.sessionRecordingId)\n return response.sources ?? []\n },\n },\n ],\n snapshotsForSource: [\n null as SessionRecordingSnapshotSourceResponse | null,\n {\n loadSnapshotsForSource: async ({ source }, breakpoint) => {\n let params: SessionRecordingSnapshotParams\n\n if (source.source === SnapshotSourceType.blob) {\n if (!source.blob_key) {\n throw new Error('Missing key')\n }\n params = { blob_key: source.blob_key, source: 'blob' }\n } else if (source.source === SnapshotSourceType.realtime) {\n params = { source: 'realtime', version: '2024-04-30' }\n } else {\n throw new Error(`Unsupported source: ${source.source}`)\n }\n\n const snapshotLoadingStartTime = performance.now()\n\n if (!cache.snapshotsStartTime) {\n cache.snapshotsStartTime = snapshotLoadingStartTime\n }\n\n await breakpoint(1)\n\n const response = await api.recordings.getSnapshots(props.sessionRecordingId, params).catch((e) => {\n if (source.source === 'realtime' && e.status === 404) {\n // Realtime source is not always available so a 404 is expected\n return []\n }\n throw e\n })\n\n const { transformed, untransformed } = await processEncodedResponse(\n response,\n props,\n values.featureFlags\n )\n\n return { snapshots: transformed, untransformed_snapshots: untransformed ?? undefined, source }\n },\n },\n ],\n sessionEventsData: [\n null as null | RecordingEventType[],\n {\n loadEvents: async () => {\n if (!cache.eventsStartTime) {\n cache.eventsStartTime = performance.now()\n }\n\n const { start, end, person } = values.sessionPlayerData\n\n if (!person || !start || !end) {\n return null\n }\n\n const [sessionEvents, relatedEvents]: any[] = await Promise.all([\n // make one query for all events that are part of the session\n makeEventsQuery(null, null, start, end, [\n {\n key: '$session_id',\n value: [props.sessionRecordingId],\n operator: PropertyOperator.Exact,\n type: PropertyFilterType.Event,\n },\n ]),\n // make a second for all events from that person,\n // not marked as part of the session\n // but in the same time range\n // these are probably e.g. backend events for the session\n // but with no session id\n // since posthog-js must always add session id we can also\n // take advantage of lib being materialized and further filter\n makeEventsQuery(null, values.sessionPlayerMetaData?.distinct_id || null, start, end, [\n {\n key: '$session_id',\n value: '',\n operator: PropertyOperator.Exact,\n type: PropertyFilterType.Event,\n },\n {\n key: '$lib',\n value: ['web'],\n operator: PropertyOperator.IsNot,\n type: PropertyFilterType.Event,\n },\n ]),\n ])\n\n return [...sessionEvents.results, ...relatedEvents.results].map(\n (event: any): RecordingEventType => {\n const currentUrl = event[5]\n // We use the pathname to simplify the UI - we build it here instead of fetching it to keep data usage small\n let pathname: string | undefined\n try {\n pathname = event[5] ? new URL(event[5]).pathname : undefined\n } catch {\n pathname = undefined\n }\n\n return {\n id: event[0],\n event: event[1],\n timestamp: event[2],\n elements: chainToElements(event[3]),\n properties: {\n $window_id: event[4],\n $current_url: currentUrl,\n $event_type: event[6],\n $pathname: pathname,\n },\n playerTime: +dayjs(event[2]) - +start,\n fullyLoaded: false,\n }\n }\n )\n },\n\n loadFullEventData: async ({ event }) => {\n // box so we're always dealing with a list\n const events = Array.isArray(event) ? event : [event]\n\n let existingEvents = values.sessionEventsData?.filter((x) => events.some((e) => e.id === x.id))\n\n const allEventsAreFullyLoaded =\n existingEvents?.every((e) => e.fullyLoaded) && existingEvents.length === events.length\n if (!existingEvents || allEventsAreFullyLoaded) {\n return values.sessionEventsData\n }\n\n existingEvents = existingEvents.filter((e) => !e.fullyLoaded)\n const timestamps = existingEvents.map((ee) => dayjs(ee.timestamp).utc().valueOf())\n const eventNames = Array.from(new Set(existingEvents.map((ee) => ee.event)))\n const eventIds = existingEvents.map((ee) => ee.id)\n const earliestTimestamp = timestamps.reduce((a, b) => Math.min(a, b))\n const latestTimestamp = timestamps.reduce((a, b) => Math.max(a, b))\n\n try {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT properties, uuid\n FROM events\n WHERE timestamp > ${dayjs(earliestTimestamp - 1000)\n .utc()\n .format('YYYY-MM-DD HH:mm:ss.SSS')}\n AND timestamp < ${dayjs(latestTimestamp + 1000)\n .utc()\n .format('YYYY-MM-DD HH:mm:ss.SSS')}\n AND event in ${eventNames}\n AND uuid in ${eventIds}`,\n }\n const response = await api.query(query)\n if (response.error) {\n throw new Error(response.error)\n }\n\n for (const event of existingEvents) {\n const result = response.results.find((x: any) => {\n return x[1] === event.id\n })\n\n if (result) {\n event.properties = JSON.parse(result[0])\n event.fullyLoaded = true\n }\n }\n } catch (e) {\n // NOTE: This is not ideal but should happen so rarely that it is tolerable.\n existingEvents.forEach((e) => (e.fullyLoaded = true))\n captureException(e, {\n tags: { feature: 'session-recording-load-full-event-data' },\n })\n }\n\n // here we map the events list because we want the result to be a new instance to trigger downstream recalculation\n return !values.sessionEventsData\n ? values.sessionEventsData\n : values.sessionEventsData.map((x) => {\n const event = existingEvents?.find((ee) => ee.id === x.id)\n return event\n ? ({\n ...x,\n properties: event.properties,\n fullyLoaded: event.fullyLoaded,\n } as RecordingEventType)\n : x\n })\n },\n },\n ],\n })),\n listeners(({ values, actions, cache, props }) => ({\n loadSnapshots: () => {\n // This kicks off the loading chain\n if (!values.snapshotSourcesLoading) {\n actions.loadSnapshotSources()\n }\n },\n maybeLoadRecordingMeta: () => {\n if (!values.sessionPlayerMetaDataLoading) {\n actions.loadRecordingMeta()\n }\n if (!values.sessionCommentsLoading) {\n actions.loadRecordingComments()\n }\n },\n loadSnapshotSources: () => {\n // We only load events once we actually start loading the recording\n actions.loadEvents()\n },\n loadRecordingMetaSuccess: () => {\n cache.metadataLoadDuration = Math.round(performance.now() - cache.metaStartTime)\n actions.reportUsageIfFullyLoaded()\n },\n loadRecordingMetaFailure: () => {\n cache.metadataLoadDuration = Math.round(performance.now() - cache.metaStartTime)\n },\n\n loadSnapshotSourcesSuccess: () => {\n // When we receive the list of sources we can kick off the loading chain\n actions.loadNextSnapshotSource()\n },\n\n loadSnapshotsForSourceSuccess: ({ snapshotsForSource }) => {\n const sources = values.snapshotSources\n const snapshots = snapshotsForSource.snapshots\n\n // Cache the last response count to detect if we're getting the same data over and over\n const newSnapshotsCount = snapshots.length\n\n if ((cache.lastSnapshotsCount ?? newSnapshotsCount) === newSnapshotsCount) {\n // if we're getting no results from realtime polling we can increment faster\n // so that we stop polling sooner\n const increment = newSnapshotsCount === 0 ? 2 : 1\n cache.lastSnapshotsUnchangedCount = (cache.lastSnapshotsUnchangedCount ?? 0) + increment\n } else {\n cache.lastSnapshotsUnchangedCount = 0\n }\n cache.lastSnapshotsCount = newSnapshotsCount\n\n if (!snapshots.length && sources?.length === 1) {\n // We got only a single source to load, loaded it successfully, but it had no snapshots.\n posthog.capture('recording_snapshots_v2_empty_response', {\n source: sources[0],\n })\n } else if (!cache.firstPaintDuration) {\n cache.firstPaintDuration = Math.round(performance.now() - cache.snapshotsStartTime)\n }\n if (!values.wasMarkedViewed) {\n actions.markViewed()\n }\n\n actions.loadNextSnapshotSource()\n },\n\n loadNextSnapshotSource: () => {\n const nextSourceToLoad = values.snapshotSources?.find((s) => {\n const sourceKey = getSourceKey(s)\n return !values.snapshotsBySource?.[sourceKey]\n })\n\n if (nextSourceToLoad) {\n return actions.loadSnapshotsForSource(nextSourceToLoad)\n }\n\n // TODO: Move this to a one time check - only report once per recording\n cache.snapshotsLoadDuration = Math.round(performance.now() - cache.snapshotsStartTime)\n actions.reportUsageIfFullyLoaded()\n\n // If we have a realtime source, start polling it\n const realTimeSource = values.snapshotSources?.find((s) => s.source === SnapshotSourceType.realtime)\n if (realTimeSource) {\n actions.pollRealtimeSnapshots()\n }\n },\n loadSnapshotsForSourceFailure: () => {\n cache.snapshotsLoadDuration = Math.round(performance.now() - cache.snapshotsStartTime)\n },\n pollRealtimeSnapshots: () => {\n // always make sure we've cleared up the last timeout\n clearTimeout(cache.realTimePollingTimeoutID)\n cache.realTimePollingTimeoutID = null\n\n // ten is an arbitrary limit to try to avoid sending requests to our backend unnecessarily\n // we could change this or add to it e.g. only poll if browser is visible to user\n if ((cache.lastSnapshotsUnchangedCount ?? 0) <= 10) {\n cache.realTimePollingTimeoutID = setTimeout(() => {\n actions.loadSnapshotsForSource({ source: SnapshotSourceType.realtime })\n }, props.realTimePollingIntervalMilliseconds || DEFAULT_REALTIME_POLLING_MILLIS)\n } else {\n actions.stopRealtimePolling()\n }\n },\n loadEventsSuccess: () => {\n cache.eventsLoadDuration = Math.round(performance.now() - cache.eventsStartTime)\n actions.reportUsageIfFullyLoaded()\n },\n loadEventsFailure: () => {\n cache.eventsLoadDuration = Math.round(performance.now() - cache.eventsStartTime)\n },\n reportUsageIfFullyLoaded: (_, breakpoint) => {\n breakpoint()\n if (values.fullyLoaded) {\n eventUsageLogic.actions.reportRecording(\n values.sessionPlayerData,\n generateRecordingReportDurations(cache),\n SessionRecordingUsageType.LOADED,\n values.sessionPlayerMetaData,\n 0\n )\n // Reset cache now that final usage report has been sent\n resetTimingsCache(cache)\n }\n },\n markViewed: async ({ delay }, breakpoint) => {\n const durations = generateRecordingReportDurations(cache)\n // Triggered on first paint\n breakpoint()\n if (values.wasMarkedViewed) {\n return\n }\n actions.setWasMarkedViewed(true) // this prevents us from calling the function multiple times\n\n await breakpoint(IS_TEST_MODE ? 1 : delay ?? 3000)\n await api.recordings.update(props.sessionRecordingId, {\n viewed: true,\n player_metadata: values.sessionPlayerMetaData,\n durations,\n })\n await breakpoint(IS_TEST_MODE ? 1 : 10000)\n await api.recordings.update(props.sessionRecordingId, {\n analyzed: true,\n player_metadata: values.sessionPlayerMetaData,\n durations,\n })\n },\n\n maybePersistRecording: () => {\n if (values.sessionPlayerMetaDataLoading) {\n return\n }\n\n if (values.sessionPlayerMetaData?.storage === 'object_storage') {\n actions.persistRecording()\n }\n },\n })),\n selectors(({ cache }) => ({\n webVitalsEvents: [\n (s) => [s.sessionEventsData],\n (sessionEventsData): RecordingEventType[] =>\n (sessionEventsData || []).filter((e) => e.event === '$web_vitals'),\n ],\n\n windowIdForTimestamp: [\n (s) => [s.segments],\n (segments) =>\n (timestamp: number): string | undefined => {\n return segments.find(\n (segment) => segment.startTimestamp <= timestamp && segment.endTimestamp >= timestamp\n )?.windowId\n },\n ],\n\n sessionPlayerData: [\n (s, p) => [\n s.sessionPlayerMetaData,\n s.snapshotsByWindowId,\n s.segments,\n s.bufferedToTime,\n s.start,\n s.end,\n s.durationMs,\n s.fullyLoaded,\n p.sessionRecordingId,\n ],\n (\n meta,\n snapshotsByWindowId,\n segments,\n bufferedToTime,\n start,\n end,\n durationMs,\n fullyLoaded,\n sessionRecordingId\n ): SessionPlayerData => ({\n person: meta?.person ?? null,\n start,\n end,\n durationMs,\n snapshotsByWindowId,\n segments,\n bufferedToTime,\n fullyLoaded,\n sessionRecordingId,\n }),\n ],\n\n snapshotsLoading: [\n (s) => [s.snapshotSourcesLoading, s.snapshotsForSourceLoading],\n (snapshotSourcesLoading, snapshotsForSourceLoading): boolean => {\n // if there's a realTimePollingTimeoutID, don't signal that we're loading\n // we don't want the UI to flip to \"loading\" every time we poll\n return !cache.realTimePollingTimeoutID && (snapshotSourcesLoading || snapshotsForSourceLoading)\n },\n ],\n\n snapshotsLoaded: [(s) => [s.snapshotSources], (snapshotSources): boolean => !!snapshotSources],\n\n fullyLoaded: [\n (s) => [s.snapshots, s.sessionPlayerMetaDataLoading, s.snapshotsLoading, s.sessionEventsDataLoading],\n (snapshots, sessionPlayerMetaDataLoading, snapshotsLoading, sessionEventsDataLoading): boolean => {\n // TODO: Do a proper check for all sources having been loaded\n return (\n !!snapshots.length &&\n !sessionPlayerMetaDataLoading &&\n !snapshotsLoading &&\n !sessionEventsDataLoading\n )\n },\n ],\n\n firstSnapshot: [\n (s) => [s.snapshots],\n (snapshots): RecordingSnapshot | null => {\n return snapshots[0] || null\n },\n ],\n\n lastSnapshot: [\n (s) => [s.snapshots],\n (snapshots): RecordingSnapshot | null => {\n return snapshots[snapshots.length - 1] || null\n },\n ],\n\n start: [\n (s) => [s.firstSnapshot, s.sessionPlayerMetaData],\n (firstSnapshot, meta): Dayjs | null => {\n const eventStart = meta?.start_time ? dayjs(meta.start_time) : null\n const snapshotStart = firstSnapshot ? dayjs(firstSnapshot.timestamp) : null\n\n // whichever is earliest\n if (eventStart && snapshotStart) {\n return eventStart.isBefore(snapshotStart) ? eventStart : snapshotStart\n }\n return eventStart || snapshotStart\n },\n ],\n\n end: [\n (s) => [s.lastSnapshot, s.sessionPlayerMetaData],\n (lastSnapshot, meta): Dayjs | null => {\n const eventEnd = meta?.end_time ? dayjs(meta.end_time) : null\n const snapshotEnd = lastSnapshot ? dayjs(lastSnapshot.timestamp) : null\n\n // whichever is latest\n if (eventEnd && snapshotEnd) {\n return eventEnd.isAfter(snapshotEnd) ? eventEnd : snapshotEnd\n }\n return eventEnd || snapshotEnd\n },\n ],\n\n durationMs: [\n (s) => [s.start, s.end],\n (start, end): number => {\n return !!start && !!end ? end.diff(start) : 0\n },\n ],\n\n segments: [\n (s) => [s.snapshots, s.start, s.end, s.trackedWindow],\n (snapshots, start, end, trackedWindow): RecordingSegment[] => {\n return createSegments(snapshots || [], start, end, trackedWindow)\n },\n ],\n\n urls: [\n (s) => [s.snapshots],\n (snapshots): { url: string; timestamp: number }[] => {\n return (\n snapshots\n .filter((snapshot) => getHrefFromSnapshot(snapshot))\n .map((snapshot) => {\n return {\n url: getHrefFromSnapshot(snapshot) as string,\n timestamp: snapshot.timestamp,\n }\n }) ?? []\n )\n },\n ],\n\n snapshots: [\n (s) => [s.snapshotSources, s.snapshotsBySource],\n (sources, snapshotsBySource): RecordingSnapshot[] => {\n const allSnapshots =\n sources?.flatMap((source) => {\n const sourceKey = getSourceKey(source)\n return snapshotsBySource?.[sourceKey]?.snapshots || []\n }) ?? []\n\n return deduplicateSnapshots(allSnapshots)\n },\n ],\n\n untransformedSnapshots: [\n (s) => [s.snapshotSources, s.snapshotsBySource],\n (sources, snapshotsBySource): RecordingSnapshot[] => {\n const allSnapshots =\n sources?.flatMap((source) => {\n const sourceKey = getSourceKey(source)\n return snapshotsBySource?.[sourceKey]?.untransformed_snapshots || []\n }) ?? []\n\n return deduplicateSnapshots(allSnapshots)\n },\n ],\n\n snapshotsByWindowId: [\n (s) => [s.snapshots],\n (snapshots): Record => {\n return mapSnapshotsToWindowId(snapshots || [])\n },\n ],\n\n snapshotsInvalid: [\n (s, p) => [s.snapshotsByWindowId, s.fullyLoaded, s.start, p.sessionRecordingId, s.currentTeam],\n (snapshotsByWindowId, fullyLoaded, start, sessionRecordingId, currentTeam): boolean => {\n if (!fullyLoaded || !start) {\n return false\n }\n\n const windowsHaveFullSnapshot = Object.entries(snapshotsByWindowId).reduce(\n (acc, [windowId, events]) => {\n acc[`window-id-${windowId}-has-full-snapshot`] = events.some(\n (event) => event.type === EventType.FullSnapshot\n )\n return acc\n },\n {}\n )\n const anyWindowMissingFullSnapshot = !Object.values(windowsHaveFullSnapshot).some((x) => x)\n const everyWindowMissingFullSnapshot = !Object.values(windowsHaveFullSnapshot).every((x) => x)\n\n if (everyWindowMissingFullSnapshot) {\n // video is definitely unplayable\n posthog.capture('recording_has_no_full_snapshot', {\n watchedSession: sessionRecordingId,\n teamId: currentTeam?.id,\n teamName: currentTeam?.name,\n })\n } else if (anyWindowMissingFullSnapshot) {\n posthog.capture('recording_window_missing_full_snapshot', {\n watchedSession: sessionRecordingId,\n teamID: currentTeam?.id,\n teamName: currentTeam?.name,\n })\n }\n\n return everyWindowMissingFullSnapshot\n },\n ],\n\n isRecentAndInvalid: [\n (s) => [s.start, s.snapshotsInvalid],\n (start, snapshotsInvalid) => {\n const lessThanFiveMinutesOld = dayjs().diff(start, 'minute') <= 5\n return snapshotsInvalid && lessThanFiveMinutesOld\n },\n ],\n\n bufferedToTime: [\n (s) => [s.segments],\n (segments): number | null => {\n if (!segments.length) {\n return null\n }\n\n const startTime = segments[0].startTimestamp\n const lastSegment = segments[segments.length - 1]\n\n if (lastSegment.kind === 'buffer') {\n return lastSegment.startTimestamp - startTime\n }\n\n return lastSegment.endTimestamp - startTime\n },\n ],\n\n windowIds: [\n (s) => [s.snapshotsByWindowId],\n (snapshotsByWindowId) => {\n return Object.keys(snapshotsByWindowId)\n },\n ],\n\n createExportJSON: [\n (s) => [s.sessionPlayerMetaData, s.snapshots, s.untransformedSnapshots],\n (\n sessionPlayerMetaData,\n snapshots,\n untransformedSnapshots\n ): ((exportUntransformedMobileSnapshotData: boolean) => ExportedSessionRecordingFileV2) => {\n return (exportUntransformedMobileSnapshotData: boolean) => ({\n version: '2023-04-28',\n data: {\n id: sessionPlayerMetaData?.id ?? '',\n person: sessionPlayerMetaData?.person,\n snapshots: exportUntransformedMobileSnapshotData ? untransformedSnapshots : snapshots,\n },\n })\n },\n ],\n\n customRRWebEvents: [\n (s) => [s.snapshots],\n (snapshots): customEvent[] => {\n return snapshots.filter((snapshot) => snapshot.type === EventType.Custom).map((x) => x as customEvent)\n },\n ],\n })),\n subscriptions(({ actions, values }) => ({\n webVitalsEvents: (value: RecordingEventType[]) => {\n // we preload all web vitals data, so it can be used before user interaction\n if (!values.sessionEventsDataLoading) {\n actions.loadFullEventData(value)\n }\n },\n isRecentAndInvalid: (prev: boolean, next: boolean) => {\n if (!prev && next) {\n posthog.capture('recording cannot playback yet', {\n watchedSession: values.sessionPlayerData.sessionRecordingId,\n })\n }\n },\n })),\n afterMount(({ cache }) => {\n resetTimingsCache(cache)\n }),\n beforeUnmount(({ cache }) => {\n resetTimingsCache(cache)\n }),\n])\n","import { actions, connect, kea, listeners, path, reducers } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport api from 'lib/api'\nimport { dayjs } from 'lib/dayjs'\nimport { CORE_FILTER_DEFINITIONS_BY_GROUP } from 'lib/taxonomy'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport { SessionRecordingPropertiesType, SessionRecordingType } from '~/types'\n\nimport type { sessionRecordingsListPropertiesLogicType } from './sessionRecordingsListPropertiesLogicType'\n\n// This logic is used to fetch properties for a list of recordings\n// It is used in a global way as the cached values can be re-used\nexport const sessionRecordingsListPropertiesLogic = kea([\n path(() => ['scenes', 'session-recordings', 'playlist', 'sessionRecordingsListPropertiesLogic']),\n connect(() => ({\n actions: [eventUsageLogic, ['reportRecordingsListPropertiesFetched']],\n })),\n\n actions({\n loadPropertiesForSessions: (sessions: SessionRecordingType[]) => ({ sessions }),\n maybeLoadPropertiesForSessions: (sessions: SessionRecordingType[]) => ({ sessions }),\n }),\n\n loaders(({ actions }) => ({\n recordingProperties: [\n [] as SessionRecordingPropertiesType[],\n {\n loadPropertiesForSessions: async ({ sessions }, breakpoint) => {\n await breakpoint(100)\n\n const startTime = performance.now()\n const sessionIds = sessions.map((x) => x.id)\n\n const oldestTimestamp = sessions.map((x) => x.start_time).sort()[0]\n const newestTimestamp = sessions.map((x) => x.end_time).sort()[sessions.length - 1]\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT \n $session_id as session_id, \n any(properties.$geoip_country_code) as $geoip_country_code, \n any(properties.$browser) as $browser, \n any(properties.$device_type) as $device_type, \n any(properties.$os) as $os, \n any(properties.$os_name) as $os_name,\n argMin(properties.$referring_domain, timestamp) as $referring_domain,\n any(properties.$geoip_subdivision_1_name) as $geoip_subdivision_1_name,\n any(properties.$geoip_city_name) as $geoip_city_name\n FROM events\n WHERE event IN ${Object.keys(CORE_FILTER_DEFINITIONS_BY_GROUP['events'])}\n AND session_id IN ${sessionIds}\n -- the timestamp range here is only to avoid querying too much of the events table\n -- we don't really care about the absolute value, \n -- but we do care about whether timezones have an odd impact\n -- so, we extend the range by a day on each side so that timezones don't cause issues\n AND timestamp >= ${dayjs(oldestTimestamp).subtract(1, 'day')}\n AND timestamp <= ${dayjs(newestTimestamp).add(1, 'day')}\n GROUP BY session_id`,\n }\n\n const response = await api.query(query)\n const loadTimeMs = performance.now() - startTime\n\n actions.reportRecordingsListPropertiesFetched(loadTimeMs)\n\n breakpoint()\n return (response.results || []).map((x: any): SessionRecordingPropertiesType => {\n return {\n id: x[0],\n properties: {\n $geoip_country_code: x[1],\n $browser: x[2],\n $device_type: x[3],\n $os: x[4],\n $os_name: x[5],\n $referring_domain: x[6],\n $geoip_subdivision_1_name: x[7],\n $geoip_city_name: x[8],\n },\n }\n })\n },\n },\n ],\n })),\n\n listeners(({ actions, values }) => ({\n maybeLoadPropertiesForSessions: ({ sessions }) => {\n const newSessions = sessions.filter((session) => !values.recordingPropertiesById[session.id])\n\n if (newSessions.length > 0) {\n actions.loadPropertiesForSessions(newSessions)\n }\n },\n })),\n\n reducers({\n recordingPropertiesById: [\n {} as Record,\n {\n loadPropertiesForSessionsSuccess: (\n state,\n { recordingProperties }\n ): Record => {\n const newState = { ...state }\n recordingProperties.forEach((properties) => {\n newState[properties.id] = properties.properties\n })\n\n return newState\n },\n },\n ],\n }),\n])\n","import { Link } from '@posthog/lemon-ui'\nimport { useActions, useValues } from 'kea'\nimport { Form } from 'kea-forms'\nimport { CopyToClipboardInline } from 'lib/components/CopyToClipboard'\nimport { LemonBanner } from 'lib/lemon-ui/LemonBanner'\nimport { LemonButton } from 'lib/lemon-ui/LemonButton'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonInput } from 'lib/lemon-ui/LemonInput/LemonInput'\nimport { LemonModal } from 'lib/lemon-ui/LemonModal'\nimport { LemonTextArea } from 'lib/lemon-ui/LemonTextArea/LemonTextArea'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\n\nimport { verifiedDomainsLogic } from './verifiedDomainsLogic'\n\nexport function ConfigureSAMLModal(): JSX.Element {\n const { configureSAMLModalId, isSamlConfigSubmitting, samlConfig } = useValues(verifiedDomainsLogic)\n const { setConfigureSAMLModalId } = useActions(verifiedDomainsLogic)\n const { preflight } = useValues(preflightLogic)\n const siteUrl = preflight?.site_url ?? window.location.origin\n\n const samlReady = samlConfig.saml_acs_url && samlConfig.saml_entity_id && samlConfig.saml_x509_cert\n\n const handleClose = (): void => {\n setConfigureSAMLModalId(null)\n // clean()\n }\n\n return (\n \n
\n \n

Configure SAML authentication and provisioning

\n
\n \n

\n \n Read the docs\n \n

\n \n {`${siteUrl}/complete/saml/`}\n \n \n {configureSAMLModalId || 'unknown'}\n \n \n {siteUrl}\n \n \n \n \n \n \n \n \n \n \n {!samlReady && (\n \n SAML will not be enabled unless you enter all attributes above. However you can still\n settings as draft.\n \n )}\n
\n \n \n Save settings\n \n \n
\n
\n )\n}\n","import { IconEllipsis, IconInfo } from '@posthog/icons'\nimport {\n LemonBanner,\n LemonButton,\n LemonDialog,\n LemonInput,\n LemonMenu,\n LemonTable,\n LemonTableColumns,\n LemonTabs,\n Spinner,\n Tooltip,\n} from '@posthog/lemon-ui'\nimport clsx from 'clsx'\nimport { useActions, useValues } from 'kea'\nimport { Form } from 'kea-forms'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport { PayGateMini } from 'lib/components/PayGateMini/PayGateMini'\nimport { RestrictionScope, useRestrictedArea } from 'lib/components/RestrictedArea'\nimport { OrganizationMembershipLevel } from 'lib/constants'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonMarkdown } from 'lib/lemon-ui/LemonMarkdown'\n\nimport { AvailableFeature } from '~/types'\n\nimport { proxyLogic, ProxyRecord } from './proxyLogic'\n\nconst MAX_PROXY_RECORDS = 3\n\nconst statusText = {\n valid: 'live',\n timed_out: 'timed out',\n}\n\nexport function ManagedReverseProxy(): JSX.Element {\n const { formState, proxyRecords, proxyRecordsLoading } = useValues(proxyLogic)\n const { showForm, deleteRecord } = useActions(proxyLogic)\n\n const restrictionReason = useRestrictedArea({\n minimumAccessLevel: OrganizationMembershipLevel.Admin,\n scope: RestrictionScope.Organization,\n })\n\n const maxRecordsReached = proxyRecords.length >= MAX_PROXY_RECORDS\n\n const recordsWithMessages = proxyRecords.filter((record) => !!record.message)\n\n const columns: LemonTableColumns = [\n {\n title: 'Domain',\n dataIndex: 'domain',\n },\n {\n title: 'Status',\n dataIndex: 'status',\n render: function RenderStatus(status) {\n if (!status) {\n return Unknown\n }\n\n return (\n \n {status === 'issuing' && }\n {statusText[status] || status}\n {status === 'waiting' && (\n \n \n \n )}\n {status === 'timed_out' && (\n \n \n \n )}\n \n )\n },\n },\n {\n title: ,\n width: 20,\n className: 'flex justify-center',\n render: function Render(_, { id, status }) {\n return (\n status != 'deleting' &&\n !restrictionReason && (\n {\n LemonDialog.open({\n title: 'Delete managed proxy',\n width: '20rem',\n content:\n 'Are you sure you want to delete this managed proxy? This cannot be undone and if it is in use then events sent to the domain will not be processed.',\n primaryButton: {\n status: 'danger',\n onClick: () => deleteRecord(id),\n children: 'Delete',\n },\n secondaryButton: {\n children: 'Cancel',\n },\n })\n },\n },\n ]}\n >\n } />\n \n )\n )\n },\n },\n ]\n\n return (\n \n
\n {recordsWithMessages.map((r) => (\n \n {`**${r.domain}**\\n ${r.message}`}\n \n ))}\n ,\n }}\n />\n {formState === 'collapsed' ? (\n maxRecordsReached ? (\n \n There is a maximum of {MAX_PROXY_RECORDS} records allowed per organization\n \n ) : (\n
\n \n Add managed proxy\n \n
\n )\n ) : (\n \n )}\n
\n
\n )\n}\n\nconst ExpandedRow = ({ record }: { record: ProxyRecord }): JSX.Element => {\n return (\n
\n \n {record.target_cname}\n \n ),\n },\n ]}\n />\n
\n )\n}\n\nfunction CreateRecordForm(): JSX.Element {\n const { formState, proxyRecordsLoading, proxyRecords } = useValues(proxyLogic)\n const { collapseForm } = useActions(proxyLogic)\n\n const waitingRecords = proxyRecords.filter((r) => r.status === 'waiting')\n\n return (\n
\n {formState == 'active' ? (\n
\n \n \n \n
\n \n Cancel\n \n \n Add\n \n
\n
\n ) : (\n <>\n
Almost there
\n
\n You need to set the following CNAME records in your DNS provider:\n
\n {waitingRecords.map((r) => (\n
\n {r.domain}\n \n {r.target_cname}\n \n
\n ))}\n
\n \n Done\n \n
\n \n )}\n
\n )\n}\n","import { lemonToast } from '@posthog/lemon-ui'\nimport { actions, afterMount, connect, kea, key, listeners, path, props, reducers, selectors } from 'kea'\nimport { forms } from 'kea-forms'\nimport { loaders } from 'kea-loaders'\nimport { actionToUrl, router, urlToAction } from 'kea-router'\nimport api from 'lib/api'\nimport { dayjs } from 'lib/dayjs'\nimport { featureFlagLogic as enabledFlagLogic } from 'lib/logic/featureFlagLogic'\nimport { hasFormErrors, isObject } from 'lib/utils'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\nimport { Scene } from 'scenes/sceneTypes'\nimport { teamLogic } from 'scenes/teamLogic'\nimport { urls } from 'scenes/urls'\n\nimport { DataTableNode, HogQLQuery, InsightVizNode, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport {\n BaseMathType,\n Breadcrumb,\n FeatureFlagFilters,\n MultipleSurveyQuestion,\n PropertyFilterType,\n PropertyOperator,\n RatingSurveyQuestion,\n Survey,\n SurveyQuestionBase,\n SurveyQuestionBranchingType,\n SurveyQuestionType,\n SurveyUrlMatchType,\n} from '~/types'\n\nimport { defaultSurveyAppearance, defaultSurveyFieldValues, NEW_SURVEY, NewSurvey } from './constants'\nimport type { surveyLogicType } from './surveyLogicType'\nimport { surveysLogic } from './surveysLogic'\nimport { sanitizeHTML } from './utils'\n\nexport enum SurveyEditSection {\n Steps = 'steps',\n Widget = 'widget',\n Presentation = 'presentation',\n Appearance = 'appearance',\n Customization = 'customization',\n DisplayConditions = 'DisplayConditions',\n Scheduling = 'scheduling',\n CompletionConditions = 'CompletionConditions',\n}\nexport interface SurveyLogicProps {\n /** Either a UUID or 'new'. */\n id: string\n}\n\nexport interface SurveyMetricsQueries {\n surveysShown: DataTableNode\n surveysDismissed: DataTableNode\n}\n\nexport interface SurveyUserStats {\n seen: number\n dismissed: number\n sent: number\n}\n\nexport interface SurveyRatingResults {\n [key: number]: {\n data: number[]\n total: number\n }\n}\n\nexport interface SurveyRecurringNPSResults {\n [key: number]: {\n data: number[]\n total: number\n }\n}\n\ntype SurveyNPSResult = {\n Promoters: number\n Detractors: number\n Passives: number\n}\n\nexport interface SurveySingleChoiceResults {\n [key: number]: {\n labels: string[]\n data: number[]\n total: number\n }\n}\n\nexport interface SurveyMultipleChoiceResults {\n [key: number]: {\n labels: string[]\n data: number[]\n }\n}\n\nexport interface SurveyOpenTextResults {\n [key: number]: {\n events: { distinct_id: string; properties: Record; personProperties: Record }[]\n }\n}\n\nexport interface QuestionResultsReady {\n [key: string]: boolean\n}\n\nexport type DataCollectionType = 'until_stopped' | 'until_limit' | 'until_adaptive_limit'\nexport type ScheduleType = 'once' | 'recurring'\n\nconst getResponseField = (i: number): string => (i === 0 ? '$survey_response' : `$survey_response_${i}`)\n\nfunction duplicateExistingSurvey(survey: Survey | NewSurvey): Partial {\n return {\n ...survey,\n id: NEW_SURVEY.id,\n name: `${survey.name} (copy)`,\n archived: false,\n start_date: null,\n end_date: null,\n targeting_flag_filters: survey.targeting_flag?.filters ?? NEW_SURVEY.targeting_flag_filters,\n linked_flag_id: survey.linked_flag?.id ?? NEW_SURVEY.linked_flag_id,\n }\n}\n\nexport const surveyLogic = kea([\n props({} as SurveyLogicProps),\n key(({ id }) => id),\n path((key) => ['scenes', 'surveys', 'surveyLogic', key]),\n connect(() => ({\n actions: [\n surveysLogic,\n ['loadSurveys'],\n eventUsageLogic,\n [\n 'reportSurveyCreated',\n 'reportSurveyEdited',\n 'reportSurveyArchived',\n 'reportSurveyViewed',\n 'reportSurveyCycleDetected',\n ],\n ],\n values: [enabledFlagLogic, ['featureFlags as enabledFlags'], surveysLogic, ['surveys']],\n })),\n actions({\n setSurveyMissing: true,\n editingSurvey: (editing: boolean) => ({ editing }),\n setDefaultForQuestionType: (\n idx: number,\n type: SurveyQuestionType,\n isEditingQuestion: boolean,\n isEditingDescription: boolean,\n isEditingThankYouMessage: boolean\n ) => ({\n idx,\n type,\n isEditingQuestion,\n isEditingDescription,\n isEditingThankYouMessage,\n }),\n setQuestionBranchingType: (questionIndex, type, specificQuestionIndex) => ({\n questionIndex,\n type,\n specificQuestionIndex,\n }),\n setResponseBasedBranchingForQuestion: (questionIndex, responseValue, nextStep, specificQuestionIndex) => ({\n questionIndex,\n responseValue,\n nextStep,\n specificQuestionIndex,\n }),\n setDataCollectionType: (dataCollectionType: DataCollectionType) => ({\n dataCollectionType,\n }),\n resetBranchingForQuestion: (questionIndex) => ({ questionIndex }),\n deleteBranchingLogic: true,\n archiveSurvey: true,\n setWritingHTMLDescription: (writingHTML: boolean) => ({ writingHTML }),\n setSurveyTemplateValues: (template: any) => ({ template }),\n setSelectedPageIndex: (idx: number | null) => ({ idx }),\n setSelectedSection: (section: SurveyEditSection | null) => ({ section }),\n\n setSchedule: (schedule: ScheduleType) => ({ schedule }),\n resetTargeting: true,\n resetSurveyAdaptiveSampling: true,\n resetSurveyResponseLimits: true,\n setFlagPropertyErrors: (errors: any) => ({ errors }),\n }),\n loaders(({ props, actions, values }) => ({\n responseSummary: {\n summarize: async ({ questionIndex }: { questionIndex?: number }) => {\n return api.surveys.summarize_responses(props.id, questionIndex)\n },\n },\n survey: {\n loadSurvey: async () => {\n if (props.id && props.id !== 'new') {\n try {\n const survey = await api.surveys.get(props.id)\n actions.reportSurveyViewed(survey)\n return survey\n } catch (error: any) {\n if (error.status === 404) {\n actions.setSurveyMissing()\n return { ...NEW_SURVEY }\n }\n throw error\n }\n }\n if (props.id === 'new' && router.values.hashParams.fromTemplate) {\n const templatedSurvey = values.survey\n templatedSurvey.appearance = {\n ...defaultSurveyAppearance,\n ...teamLogic.values.currentTeam?.survey_config?.appearance,\n ...templatedSurvey.appearance,\n }\n return templatedSurvey\n }\n\n const newSurvey = NEW_SURVEY\n newSurvey.appearance = {\n ...defaultSurveyAppearance,\n ...teamLogic.values.currentTeam?.survey_config?.appearance,\n ...newSurvey.appearance,\n }\n\n return newSurvey\n },\n createSurvey: async (surveyPayload: Partial) => {\n return await api.surveys.create(sanitizeQuestions(surveyPayload))\n },\n updateSurvey: async (surveyPayload: Partial) => {\n return await api.surveys.update(props.id, sanitizeQuestions(surveyPayload))\n },\n launchSurvey: async () => {\n const startDate = dayjs()\n return await api.surveys.update(props.id, { start_date: startDate.toISOString() })\n },\n stopSurvey: async () => {\n return await api.surveys.update(props.id, { end_date: dayjs().toISOString() })\n },\n resumeSurvey: async () => {\n return await api.surveys.update(props.id, { end_date: null })\n },\n },\n duplicatedSurvey: {\n duplicateSurvey: async () => {\n const { survey } = values\n const payload = duplicateExistingSurvey(survey)\n const createdSurvey = await api.surveys.create(sanitizeQuestions(payload))\n\n lemonToast.success('Survey duplicated.', {\n toastId: `survey-duplicated-${createdSurvey.id}`,\n button: {\n label: 'View Survey',\n action: () => {\n router.actions.push(urls.survey(createdSurvey.id))\n },\n },\n })\n\n actions.reportSurveyCreated(createdSurvey, true)\n return survey\n },\n },\n surveyUserStats: {\n loadSurveyUserStats: async (): Promise => {\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`\n SELECT\n (SELECT COUNT(DISTINCT person_id)\n FROM events\n WHERE event = 'survey shown'\n AND properties.$survey_id = ${props.id}\n AND timestamp >= ${startDate}\n AND timestamp <= ${endDate}),\n (SELECT COUNT(DISTINCT person_id)\n FROM events\n WHERE event = 'survey dismissed'\n AND properties.$survey_id = ${props.id}\n AND timestamp >= ${startDate}\n AND timestamp <= ${endDate}),\n (SELECT COUNT(DISTINCT person_id)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = ${props.id}\n AND timestamp >= ${startDate}\n AND timestamp <= ${endDate})\n `,\n }\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n if (results && results[0]) {\n const [totalSeen, dismissed, sent] = results[0]\n const onlySeen = totalSeen - dismissed - sent\n return { seen: onlySeen < 0 ? 0 : onlySeen, dismissed, sent }\n }\n return { seen: 0, dismissed: 0, sent: 0 }\n },\n },\n surveyRatingResults: {\n loadSurveyRatingResults: async ({\n questionIndex,\n iteration,\n }: {\n questionIndex: number\n iteration?: number | null | undefined\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.Rating) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.Rating}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n let iterationCondition = ''\n if (iteration && iteration > 0) {\n iterationCondition = ` AND properties.$survey_iteration='${iteration}' `\n }\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n JSONExtractString(properties, '${getResponseField(questionIndex)}') AS survey_response,\n COUNT(survey_response)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = '${props.id}'\n ${iterationCondition}\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY survey_response\n `,\n }\n const responseJSON = await api.query(query)\n // TODO:Dylan - I don't like how we lose our types here\n // would be cool if we could parse this in a more type-safe way\n const { results } = responseJSON\n\n let total = 0\n const dataSize = question.scale === 10 ? 11 : question.scale\n const data = new Array(dataSize).fill(0)\n results?.forEach(([value, count]) => {\n total += count\n\n const index = question.scale === 10 ? value : value - 1\n data[index] = count\n })\n\n return { ...values.surveyRatingResults, [questionIndex]: { total, data } }\n },\n },\n surveyRecurringNPSResults: {\n loadSurveyRecurringNPSResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.Rating) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.Rating}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n JSONExtractString(properties, '$survey_iteration') AS survey_iteration,\n JSONExtractString(properties, '${getResponseField(questionIndex)}') AS survey_response,\n COUNT(survey_response)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = '${props.id}'\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY survey_response, survey_iteration\n `,\n }\n\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n let total = 100\n const data = new Array(survey.iteration_count).fill(0)\n\n const iterations = new Map()\n\n results?.forEach(([iteration, response, count]) => {\n let promoters = 0\n let passives = 0\n let detractors = 0\n\n if (parseInt(response) >= 9) {\n // a Promoter is someone who gives a survey response of 9 or 10\n promoters += parseInt(count)\n } else if (parseInt(response) > 6) {\n // a Passive is someone who gives a survey response of 7 or 8\n passives += parseInt(count)\n } else {\n // a Detractor is someone who gives a survey response of 0 - 6\n detractors += parseInt(count)\n }\n\n if (iterations.has(iteration)) {\n const currentValue = iterations.get(iteration)\n if (currentValue !== undefined) {\n currentValue.Detractors += detractors\n currentValue.Promoters += promoters\n currentValue.Passives += passives\n }\n } else {\n iterations.set(iteration, {\n Detractors: detractors,\n Passives: passives,\n Promoters: promoters,\n })\n }\n })\n\n iterations.forEach((value: SurveyNPSResult, key: string) => {\n // NPS score is calculated with this formula\n // (Promoters / (Promoters + Passives + Detractors) * 100) - (Detractors / (Promoters + Passives + Detractors)* 100)\n const totalResponses = value.Promoters + value.Passives + value.Detractors\n const npsScore =\n (value.Promoters / totalResponses) * 100 - (value.Detractors / totalResponses) * 100\n data[parseInt(key) - 1] = npsScore\n total += 100\n })\n\n return { ...values.surveyRecurringNPSResults, [questionIndex]: { total, data } }\n },\n },\n surveySingleChoiceResults: {\n loadSurveySingleChoiceResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n JSONExtractString(properties, '${getResponseField(questionIndex)}') AS survey_response,\n COUNT(survey_response)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = '${props.id}'\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY survey_response\n `,\n }\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n\n const labels = results?.map((r) => r[0])\n const data = results?.map((r) => r[1])\n const total = data?.reduce((a, b) => a + b, 0)\n\n return { ...values.surveySingleChoiceResults, [questionIndex]: { labels, data, total } }\n },\n },\n surveyMultipleChoiceResults: {\n loadSurveyMultipleChoiceResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.MultipleChoice) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.MultipleChoice}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n count(),\n arrayJoin(JSONExtractArrayRaw(properties, '${getResponseField(questionIndex)}')) AS choice\n FROM events\n WHERE event == 'survey sent'\n AND properties.$survey_id == '${survey.id}'\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY choice\n ORDER BY count() DESC\n `,\n }\n const responseJSON = await api.query(query)\n let { results } = responseJSON\n\n // Remove outside quotes\n results = results?.map((r) => {\n return [r[0], r[1].slice(1, r[1].length - 1)]\n })\n\n // Zero-fill choices that are not open-ended\n question.choices.forEach((choice, idx) => {\n const isOpenChoice = idx == question.choices.length - 1 && question?.hasOpenChoice\n if (results?.length && !isOpenChoice && !results.some((r) => r[1] === choice)) {\n results.push([0, choice])\n }\n })\n\n const data = results?.map((r) => r[0])\n const labels = results?.map((r) => r[1])\n\n return { ...values.surveyMultipleChoiceResults, [questionIndex]: { labels, data } }\n },\n },\n surveyOpenTextResults: {\n loadSurveyOpenTextResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.Open) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.Open}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT distinct_id, properties, person.properties\n FROM events\n WHERE event == 'survey sent'\n AND properties.$survey_id == '${survey.id}'\n AND trim(JSONExtractString(properties, '${getResponseField(questionIndex)}')) != ''\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n LIMIT 20\n `,\n }\n\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n\n const events =\n results?.map((r) => {\n const distinct_id = r[0]\n const properties = JSON.parse(r[1])\n const personProperties = JSON.parse(r[2])\n return { distinct_id, properties, personProperties }\n }) || []\n\n return { ...values.surveyOpenTextResults, [questionIndex]: { events } }\n },\n },\n })),\n listeners(({ actions, values }) => ({\n createSurveySuccess: ({ survey }) => {\n lemonToast.success(<>Survey {survey.name} created)\n actions.loadSurveys()\n router.actions.replace(urls.survey(survey.id))\n actions.reportSurveyCreated(survey)\n },\n updateSurveySuccess: ({ survey }) => {\n lemonToast.success(<>Survey {survey.name} updated)\n actions.editingSurvey(false)\n actions.reportSurveyEdited(survey)\n actions.loadSurveys()\n },\n duplicateSurveySuccess: () => {\n actions.loadSurveys()\n },\n launchSurveySuccess: ({ survey }) => {\n lemonToast.success(<>Survey {survey.name} launched)\n actions.loadSurveys()\n },\n stopSurveySuccess: () => {\n actions.loadSurveys()\n },\n resumeSurveySuccess: () => {\n actions.loadSurveys()\n },\n archiveSurvey: () => {\n actions.updateSurvey({ archived: true })\n },\n loadSurveySuccess: () => {\n actions.loadSurveyUserStats()\n },\n resetSurveyResponseLimits: () => {\n actions.setSurveyValue('responses_limit', null)\n },\n\n resetSurveyAdaptiveSampling: () => {\n actions.setSurveyValues({\n response_sampling_interval: null,\n response_sampling_interval_type: null,\n response_sampling_limit: null,\n response_sampling_start_date: null,\n response_sampling_daily_limits: null,\n })\n },\n resetTargeting: () => {\n actions.setSurveyValue('linked_flag_id', NEW_SURVEY.linked_flag_id)\n actions.setSurveyValue('targeting_flag_filters', NEW_SURVEY.targeting_flag_filters)\n actions.setSurveyValue('linked_flag', NEW_SURVEY.linked_flag)\n actions.setSurveyValue('targeting_flag', NEW_SURVEY.targeting_flag)\n actions.setSurveyValue('conditions', NEW_SURVEY.conditions)\n actions.setSurveyValue('remove_targeting_flag', true)\n actions.setSurveyValue('responses_limit', NEW_SURVEY.responses_limit)\n actions.setSurveyValues({\n iteration_count: NEW_SURVEY.iteration_count,\n iteration_frequency_days: NEW_SURVEY.iteration_frequency_days,\n })\n actions.setFlagPropertyErrors(NEW_SURVEY.targeting_flag_filters)\n },\n submitSurveyFailure: async () => {\n // When errors occur, scroll to the error, but wait for errors to be set in the DOM first\n if (hasFormErrors(values.flagPropertyErrors) || values.urlMatchTypeValidationError) {\n actions.setSelectedSection(SurveyEditSection.DisplayConditions)\n } else {\n actions.setSelectedSection(SurveyEditSection.Steps)\n }\n setTimeout(\n () => document.querySelector(`.Field--error`)?.scrollIntoView({ block: 'center', behavior: 'smooth' }),\n 5\n )\n },\n })),\n reducers({\n isEditingSurvey: [\n false,\n {\n editingSurvey: (_, { editing }) => editing,\n },\n ],\n surveyMissing: [\n false,\n {\n setSurveyMissing: () => true,\n },\n ],\n dataCollectionType: [\n 'until_stopped' as DataCollectionType,\n {\n setDataCollectionType: (_, { dataCollectionType }) => dataCollectionType,\n },\n ],\n\n survey: [\n { ...NEW_SURVEY } as NewSurvey | Survey,\n {\n setDefaultForQuestionType: (\n state,\n { idx, type, isEditingQuestion, isEditingDescription, isEditingThankYouMessage }\n ) => {\n const question = isEditingQuestion\n ? state.questions[idx].question\n : defaultSurveyFieldValues[type].questions[0].question\n const description = isEditingDescription\n ? state.questions[idx].description\n : defaultSurveyFieldValues[type].questions[0].description\n const thankYouMessageHeader = isEditingThankYouMessage\n ? state.appearance?.thankYouMessageHeader\n : defaultSurveyFieldValues[type].appearance.thankYouMessageHeader\n const newQuestions = [...state.questions]\n newQuestions[idx] = {\n ...state.questions[idx],\n ...(defaultSurveyFieldValues[type].questions[0] as SurveyQuestionBase),\n question,\n description,\n }\n return {\n ...state,\n questions: newQuestions,\n appearance: {\n ...state.appearance,\n ...defaultSurveyFieldValues[type].appearance,\n thankYouMessageHeader,\n },\n }\n },\n setSurveyTemplateValues: (_, { template }) => {\n const newTemplateSurvey = { ...NEW_SURVEY, ...template }\n return newTemplateSurvey\n },\n setQuestionBranchingType: (state, { questionIndex, type, specificQuestionIndex }) => {\n const newQuestions = [...state.questions]\n const question = newQuestions[questionIndex]\n\n if (type === SurveyQuestionBranchingType.NextQuestion) {\n delete question.branching\n } else if (type === SurveyQuestionBranchingType.End) {\n question.branching = {\n type: SurveyQuestionBranchingType.End,\n }\n } else if (type === SurveyQuestionBranchingType.ResponseBased) {\n if (\n question.type !== SurveyQuestionType.Rating &&\n question.type !== SurveyQuestionType.SingleChoice\n ) {\n throw new Error(\n `Survey question type must be ${SurveyQuestionType.Rating} or ${SurveyQuestionType.SingleChoice}`\n )\n }\n\n question.branching = {\n type: SurveyQuestionBranchingType.ResponseBased,\n responseValues: {},\n }\n } else if (type === SurveyQuestionBranchingType.SpecificQuestion) {\n question.branching = {\n type: SurveyQuestionBranchingType.SpecificQuestion,\n index: specificQuestionIndex,\n }\n }\n\n newQuestions[questionIndex] = question\n return {\n ...state,\n questions: newQuestions,\n }\n },\n setResponseBasedBranchingForQuestion: (\n state,\n { questionIndex, responseValue, nextStep, specificQuestionIndex }\n ) => {\n const newQuestions = [...state.questions]\n const question = newQuestions[questionIndex]\n\n if (\n question.type !== SurveyQuestionType.Rating &&\n question.type !== SurveyQuestionType.SingleChoice\n ) {\n throw new Error(\n `Survey question type must be ${SurveyQuestionType.Rating} or ${SurveyQuestionType.SingleChoice}`\n )\n }\n\n if (question.branching?.type !== SurveyQuestionBranchingType.ResponseBased) {\n throw new Error(\n `Survey question branching type must be ${SurveyQuestionBranchingType.ResponseBased}`\n )\n }\n\n if ('responseValues' in question.branching) {\n if (nextStep === SurveyQuestionBranchingType.NextQuestion) {\n delete question.branching.responseValues[responseValue]\n } else if (nextStep === SurveyQuestionBranchingType.End) {\n question.branching.responseValues[responseValue] = SurveyQuestionBranchingType.End\n } else if (nextStep === SurveyQuestionBranchingType.SpecificQuestion) {\n question.branching.responseValues[responseValue] = specificQuestionIndex\n }\n }\n\n newQuestions[questionIndex] = question\n return {\n ...state,\n questions: newQuestions,\n }\n },\n resetBranchingForQuestion: (state, { questionIndex }) => {\n const newQuestions = [...state.questions]\n const question = newQuestions[questionIndex]\n delete question.branching\n\n newQuestions[questionIndex] = question\n return {\n ...state,\n questions: newQuestions,\n }\n },\n deleteBranchingLogic: (state) => {\n const newQuestions = [...state.questions]\n newQuestions.forEach((question) => {\n delete question.branching\n })\n\n return {\n ...state,\n questions: newQuestions,\n }\n },\n },\n ],\n selectedPageIndex: [\n 0 as number | null,\n {\n setSelectedPageIndex: (_, { idx }) => idx,\n },\n ],\n selectedSection: [\n SurveyEditSection.Steps as SurveyEditSection | null,\n {\n setSelectedSection: (_, { section }) => section,\n },\n ],\n surveyRatingResultsReady: [\n {},\n {\n loadSurveyRatingResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveyRecurringNPSResultsReady: [\n {},\n {\n loadSurveyRecurringNPSResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveySingleChoiceResultsReady: [\n {},\n {\n loadSurveySingleChoiceResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveyMultipleChoiceResultsReady: [\n {},\n {\n loadSurveyMultipleChoiceResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveyOpenTextResultsReady: [\n {},\n {\n loadSurveyOpenTextResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n writingHTMLDescription: [\n false,\n {\n setWritingHTMLDescription: (_, { writingHTML }) => writingHTML,\n },\n ],\n schedule: [\n 'once',\n {\n setSchedule: (_, { schedule }) => schedule,\n },\n ],\n flagPropertyErrors: [\n null as any,\n {\n setFlagPropertyErrors: (_, { errors }) => errors,\n },\n ],\n }),\n selectors({\n isSurveyRunning: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return !!(survey.start_date && !survey.end_date)\n },\n ],\n surveyUsesLimit: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return !!(survey.responses_limit && survey.responses_limit > 0)\n },\n ],\n surveyUsesAdaptiveLimit: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return !!(\n survey.response_sampling_interval &&\n survey.response_sampling_interval > 0 &&\n survey.response_sampling_interval_type !== '' &&\n survey.response_sampling_limit &&\n survey.response_sampling_limit > 0\n )\n },\n ],\n surveyShufflingQuestionsAvailable: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return survey.questions.length > 1\n },\n ],\n showSurveyRepeatSchedule: [(s) => [s.schedule], (schedule: ScheduleType) => schedule == 'recurring'],\n descriptionContentType: [\n (s) => [s.survey],\n (survey: Survey) => (questionIndex: number) => {\n return survey.questions[questionIndex].descriptionContentType\n },\n ],\n surveyRepeatedActivationAvailable: [\n (s) => [s.survey],\n (survey: Survey): boolean =>\n survey.conditions?.events?.values != undefined && survey.conditions?.events?.values?.length > 0,\n ],\n hasTargetingSet: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n const hasLinkedFlag =\n !!survey.linked_flag_id || (survey.linked_flag && Object.keys(survey.linked_flag).length > 0)\n const hasTargetingFlag =\n (survey.targeting_flag && Object.keys(survey.targeting_flag).length > 0) ||\n (survey.targeting_flag_filters && Object.keys(survey.targeting_flag_filters).length > 0)\n const hasOtherConditions = survey.conditions && Object.keys(survey.conditions).length > 0\n return !!hasLinkedFlag || !!hasTargetingFlag || !!hasOtherConditions\n },\n ],\n breadcrumbs: [\n (s) => [s.survey],\n (survey: Survey): Breadcrumb[] => [\n {\n key: Scene.Surveys,\n name: 'Surveys',\n path: urls.surveys(),\n },\n { key: [Scene.Survey, survey?.id || 'new'], name: survey.name },\n ],\n ],\n dataTableQuery: [\n (s) => [s.survey],\n (survey): DataTableNode | null => {\n if (survey.id === 'new') {\n return null\n }\n const surveyWithResults = survey as Survey\n const startDate = surveyWithResults.start_date || surveyWithResults.created_at\n return {\n kind: NodeKind.DataTableNode,\n source: {\n kind: NodeKind.EventsQuery,\n select: [\n '*',\n ...survey.questions.map((q, i) => {\n if (q.type === SurveyQuestionType.MultipleChoice) {\n // Join array items into a string\n return `coalesce(arrayStringConcat(JSONExtractArrayRaw(properties, '${getResponseField(\n i\n )}'), ', ')) -- ${q.question}`\n }\n\n return `coalesce(JSONExtractString(properties, '${getResponseField(i)}')) -- ${\n q.question\n }`\n }),\n 'timestamp',\n 'person',\n `coalesce(JSONExtractString(properties, '$lib_version')) -- Library Version`,\n `coalesce(JSONExtractString(properties, '$lib')) -- Library`,\n `coalesce(JSONExtractString(properties, '$current_url')) -- URL`,\n ],\n orderBy: ['timestamp DESC'],\n where: [`event == 'survey sent'`],\n after: startDate,\n properties: [\n {\n type: PropertyFilterType.Event,\n key: '$survey_id',\n operator: PropertyOperator.Exact,\n value: survey.id,\n },\n ],\n },\n propertiesViaUrl: true,\n showExport: true,\n showReload: true,\n showEventFilter: false,\n showPropertyFilter: true,\n showTimings: false,\n }\n },\n ],\n targetingFlagFilters: [\n (s) => [s.survey],\n (survey): FeatureFlagFilters | undefined => {\n if (survey.targeting_flag_filters) {\n return {\n ...survey.targeting_flag_filters,\n groups: survey.targeting_flag_filters.groups,\n multivariate: null,\n payloads: {},\n super_groups: undefined,\n }\n }\n return survey.targeting_flag?.filters || undefined\n },\n ],\n urlMatchTypeValidationError: [\n (s) => [s.survey],\n (survey): string | null => {\n if (survey.conditions?.urlMatchType === SurveyUrlMatchType.Regex && survey.conditions.url) {\n try {\n new RegExp(survey.conditions.url)\n } catch (e: any) {\n return e.message\n }\n }\n return null\n },\n ],\n surveyNPSScore: [\n (s) => [s.surveyRatingResults],\n (surveyRatingResults) => {\n if (surveyRatingResults) {\n const questionIdx = Object.keys(surveyRatingResults)[0]\n const questionResults = surveyRatingResults[questionIdx]\n\n // If we don't have any results, return 'No data available' instead of NaN.\n if (questionResults.total === 0) {\n return 'No data available'\n }\n\n const data: number[] = questionResults.data\n if (data.length === 11) {\n const promoters = data.slice(9, 11).reduce((a, b) => a + b, 0)\n const passives = data.slice(7, 9).reduce((a, b) => a + b, 0)\n const detractors = data.slice(0, 7).reduce((a, b) => a + b, 0)\n const npsScore = ((promoters - detractors) / (promoters + passives + detractors)) * 100\n return npsScore.toFixed(1)\n }\n }\n },\n ],\n\n getBranchingDropdownValue: [\n (s) => [s.survey],\n (survey) => (questionIndex: number, question: RatingSurveyQuestion | MultipleSurveyQuestion) => {\n if (question.branching?.type) {\n const { type } = question.branching\n\n if (type === SurveyQuestionBranchingType.SpecificQuestion) {\n const nextQuestionIndex = question.branching.index\n return `${SurveyQuestionBranchingType.SpecificQuestion}:${nextQuestionIndex}`\n }\n\n return type\n }\n\n // No branching specified, default to Next question / Confirmation message\n if (questionIndex < survey.questions.length - 1) {\n return SurveyQuestionBranchingType.NextQuestion\n }\n\n return SurveyQuestionBranchingType.End\n },\n ],\n getResponseBasedBranchingDropdownValue: [\n (s) => [s.survey],\n (survey) => (questionIndex: number, question: RatingSurveyQuestion | MultipleSurveyQuestion, response) => {\n if (!question.branching || !('responseValues' in question.branching)) {\n return SurveyQuestionBranchingType.NextQuestion\n }\n\n // If a value is mapped onto an integer, we're redirecting to a specific question\n if (Number.isInteger(question.branching.responseValues[response])) {\n const nextQuestionIndex = question.branching.responseValues[response]\n return `${SurveyQuestionBranchingType.SpecificQuestion}:${nextQuestionIndex}`\n }\n\n // If any other value is present (practically only Confirmation message), return that value\n if (question.branching?.responseValues?.[response]) {\n return question.branching.responseValues[response]\n }\n\n // No branching specified, default to Next question / Confirmation message\n if (questionIndex < survey.questions.length - 1) {\n return SurveyQuestionBranchingType.NextQuestion\n }\n\n return SurveyQuestionBranchingType.End\n },\n ],\n hasCycle: [\n (s) => [s.survey],\n (survey) => {\n const graph = new Map()\n survey.questions.forEach((question, fromIndex: number) => {\n if (!graph.has(fromIndex)) {\n graph.set(fromIndex, new Set())\n }\n\n if (question.branching?.type === SurveyQuestionBranchingType.End) {\n return\n } else if (\n question.branching?.type === SurveyQuestionBranchingType.SpecificQuestion &&\n Number.isInteger(question.branching.index)\n ) {\n const toIndex = question.branching.index\n graph.get(fromIndex).add(toIndex)\n return\n } else if (\n question.branching?.type === SurveyQuestionBranchingType.ResponseBased &&\n isObject(question.branching?.responseValues)\n ) {\n for (const [_, toIndex] of Object.entries(question.branching?.responseValues)) {\n if (Number.isInteger(toIndex)) {\n graph.get(fromIndex).add(toIndex)\n }\n }\n }\n\n // No branching - still need to connect the next question\n if (fromIndex < survey.questions.length - 1) {\n const toIndex = fromIndex + 1\n graph.get(fromIndex).add(toIndex)\n }\n })\n\n let cycleDetected = false\n function dfs(node: number, seen: number[]): void {\n if (cycleDetected) {\n return\n }\n\n for (const neighbor of graph.get(node) || []) {\n if (seen.includes(neighbor)) {\n cycleDetected = true\n return\n }\n dfs(neighbor, seen.concat(neighbor))\n }\n }\n dfs(0, [0])\n\n return cycleDetected\n },\n ],\n hasBranchingLogic: [\n (s) => [s.survey],\n (survey) =>\n survey.questions.some((question) => question.branching && Object.keys(question.branching).length > 0),\n ],\n surveyAsInsightURL: [\n (s) => [s.survey],\n (survey) => {\n const query: InsightVizNode = {\n kind: NodeKind.InsightVizNode,\n source: {\n kind: NodeKind.TrendsQuery,\n properties: [\n {\n key: '$survey_id',\n value: survey.id,\n operator: PropertyOperator.Exact,\n type: PropertyFilterType.Event,\n },\n ],\n series: [\n {\n kind: NodeKind.EventsNode,\n event: 'survey sent',\n name: 'survey sent',\n math: BaseMathType.TotalCount,\n },\n {\n kind: NodeKind.EventsNode,\n event: 'survey shown',\n name: 'survey shown',\n math: BaseMathType.TotalCount,\n },\n {\n kind: NodeKind.EventsNode,\n event: 'survey dismissed',\n name: 'survey dismissed',\n math: BaseMathType.TotalCount,\n },\n ],\n },\n }\n\n return urls.insightNew(undefined, undefined, query)\n },\n ],\n }),\n forms(({ actions, props, values }) => ({\n survey: {\n defaults: { ...NEW_SURVEY } as NewSurvey | Survey,\n errors: ({ name, questions }) => ({\n // NOTE: When more validation errors are added, the submitSurveyFailure listener should be updated\n // to scroll to the right error section\n name: !name && 'Please enter a name.',\n questions: questions.map((question) => {\n const questionErrors = {\n question: !question.question && 'Please enter a question label.',\n }\n\n if (question.type === SurveyQuestionType.Rating) {\n return {\n ...questionErrors,\n display: !question.display && 'Please choose a display type.',\n scale: !question.scale && 'Please choose a scale.',\n lowerBoundLabel: !question.lowerBoundLabel && 'Please enter a lower bound label.',\n upperBoundLabel: !question.upperBoundLabel && 'Please enter an upper bound label.',\n }\n } else if (\n question.type === SurveyQuestionType.SingleChoice ||\n question.type === SurveyQuestionType.MultipleChoice\n ) {\n return {\n ...questionErrors,\n choices: question.choices.some((choice) => !choice.trim())\n ? 'Please ensure all choices are non-empty.'\n : undefined,\n }\n }\n\n return questionErrors\n }),\n // release conditions controlled using a PureField in the form\n targeting_flag_filters: values.flagPropertyErrors,\n // controlled using a PureField in the form\n urlMatchType: values.urlMatchTypeValidationError,\n }),\n submit: (surveyPayload) => {\n if (values.hasCycle) {\n actions.reportSurveyCycleDetected(values.survey)\n\n return lemonToast.error(\n 'Your survey contains an endless cycle. Please revisit your branching rules.'\n )\n }\n\n // when the survey is being submitted, we should turn off editing mode\n actions.editingSurvey(false)\n if (props.id && props.id !== 'new') {\n actions.updateSurvey(surveyPayload)\n } else {\n actions.createSurvey(surveyPayload)\n }\n },\n },\n })),\n urlToAction(({ actions, props }) => ({\n [urls.survey(props.id ?? 'new')]: (_, { edit }, __, { method }) => {\n // We always set the editingSurvey to true when we create a new survey\n if (props.id === 'new') {\n actions.editingSurvey(true)\n }\n // If the URL was pushed (user clicked on a link), reset the scene's data.\n // This avoids resetting form fields if you click back/forward.\n if (method === 'PUSH') {\n if (props.id) {\n actions.loadSurvey()\n } else {\n actions.resetSurvey()\n }\n }\n\n if (edit) {\n actions.editingSurvey(true)\n }\n },\n })),\n actionToUrl(({ values }) => ({\n setSurveyTemplateValues: () => {\n const hashParams = router.values.hashParams\n hashParams['fromTemplate'] = true\n\n return [urls.survey(values.survey.id), router.values.searchParams, hashParams]\n },\n editingSurvey: ({ editing }) => {\n const searchParams = router.values.searchParams\n if (editing) {\n searchParams['edit'] = true\n } else {\n delete searchParams['edit']\n }\n\n return [router.values.location.pathname, router.values.searchParams, router.values.hashParams]\n },\n })),\n afterMount(({ props, actions }) => {\n if (props.id !== 'new') {\n actions.loadSurvey()\n }\n if (props.id === 'new') {\n actions.resetSurvey()\n }\n }),\n])\n\nfunction sanitizeQuestions(surveyPayload: Partial): Partial {\n if (!surveyPayload.questions) {\n return surveyPayload\n }\n\n const sanitizedThankYouHeader = sanitizeHTML(surveyPayload.appearance?.thankYouMessageHeader || '')\n const sanitizedThankYouDescription = sanitizeHTML(surveyPayload.appearance?.thankYouMessageDescription || '')\n\n return {\n ...surveyPayload,\n questions: surveyPayload.questions?.map((rawQuestion) => {\n return {\n ...rawQuestion,\n description: sanitizeHTML(rawQuestion.description || ''),\n question: sanitizeHTML(rawQuestion.question || ''),\n }\n }),\n appearance: {\n ...surveyPayload.appearance,\n ...(sanitizedThankYouHeader && { thankYouMessageHeader: sanitizedThankYouHeader }),\n ...(sanitizedThankYouDescription && { thankYouMessageDescription: sanitizedThankYouDescription }),\n },\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/docs/main.237ccbc7.iframe.bundle.js b/docs/main.e36073f9.iframe.bundle.js similarity index 99% rename from docs/main.237ccbc7.iframe.bundle.js rename to docs/main.e36073f9.iframe.bundle.js index 4ca0b4908..624e85d13 100644 --- a/docs/main.237ccbc7.iframe.bundle.js +++ b/docs/main.e36073f9.iframe.bundle.js @@ -284,8 +284,12 @@ order by count() desc } `,id:context.idSequence.next().value}]}}(conversionContext)]},{type:NodeType.Element,tagName:"body",attributes:{style:"height: 100vh; width: 100vw;","data-rrweb-id":5},id:5,childNodes:[...nodeGroups.appNodes,{type:NodeType.Element,tagName:"div",attributes:{"data-render-reason":"a fixed placeholder to contain the keyboard in the correct stacking position","data-rrweb-id":9},id:9,childNodes:[]},nodeGroups.navBarNode,nodeGroups.statusBarNode]}]}],id:1},initialOffset:{top:0,left:0}}}},3:mobileEvent=>{if("id"in mobileEvent.data&&0===mobileEvent.data.id&&(mobileEvent.data.id=5),function(x){let isIncrementalSnapshot=(0,utils.Kn)(x)&&"type"in x&&x.type===types.tw.IncrementalSnapshot;if(!isIncrementalSnapshot)return!1;let hasData=(0,utils.Kn)(x)&&"data"in x,data=hasData?x.data:null,hasMutationSource=(0,utils.Kn)(data)&&"source"in data&&data.source===types.yh.Mutation,adds=(0,utils.Kn)(data)&&"adds"in data&&Array.isArray(data.adds)?data.adds:null,updates=(0,utils.Kn)(data)&&"updates"in data&&Array.isArray(data.updates)?data.updates:null,hasUpdatedWireframe=!!updates&&updates.length>0&&(0,utils.Kn)(updates[0])&&"wireframe"in updates[0],hasAddedWireframe=!!adds&&adds.length>0&&(0,utils.Kn)(adds[0])&&"wireframe"in adds[0];return hasMutationSource&&(hasAddedWireframe||hasUpdatedWireframe)}(mobileEvent)){let adds=[],removes=mobileEvent.data.removes||[];if("adds"in mobileEvent.data&&Array.isArray(mobileEvent.data.adds)){let addsContext={timestamp:mobileEvent.timestamp,idSequence:globalIdSequence};mobileEvent.data.adds.forEach(add=>{makeIncrementalAdd(add,addsContext)?.forEach(x=>adds.push(x))})}if("updates"in mobileEvent.data&&Array.isArray(mobileEvent.data.updates)){let updatesContext={timestamp:mobileEvent.timestamp,idSequence:globalIdSequence},updateAdditions=[];mobileEvent.data.updates.forEach(update=>{let removal=function(update){return{parentId:chooseParentId(update.wireframe.type,update.parentId),id:update.wireframe.id}}(update);removal&&removes.push(removal),makeIncrementalAdd(update,updatesContext)?.forEach(x=>updateAdditions.push(x))}),dedupeMutations(updateAdditions).forEach(x=>adds.push(x))}mobileEvent.data={source:types.yh.Mutation,attributes:[],texts:[],adds:dedupeMutations(adds),removes:dedupeMutations(removes)}}return mobileEvent},4:mobileMetaEvent=>({type:types.tw.Meta,data:{href:mobileMetaEvent.data.href||"",width:mobileMetaEvent.data.width,height:mobileMetaEvent.data.height},timestamp:mobileMetaEvent.timestamp}),5:mobileCustomEvent=>{if(function(x){return(0,utils.Kn)(x)&&"data"in x&&(0,utils.Kn)(x.data)&&"tag"in x.data&&"keyboard"===x.data.tag}(mobileCustomEvent)){let adds=[],removes=[];if(mobileCustomEvent.data.payload.open){let keyboardPlaceHolder=function(mobileCustomEvent,context){if(!mobileCustomEvent.data.payload.open)return null;let shouldAbsolutelyPosition=_isPositiveInteger(mobileCustomEvent.data.payload.x)||_isPositiveInteger(mobileCustomEvent.data.payload.y);return makePlaceholderElement({id:10,type:"placeholder",label:"keyboard",height:mobileCustomEvent.data.payload.height,width:_isPositiveInteger(mobileCustomEvent.data.payload.width)?mobileCustomEvent.data.payload.width:"100vw",style:{backgroundColor:navigationBackgroundColor,color:navigationBackgroundColor?navigationColor:void 0}},[],{timestamp:context.timestamp,idSequence:context.idSequence,styleOverride:{...shouldAbsolutelyPosition?{}:{bottom:!0}}})}(mobileCustomEvent,{timestamp:mobileCustomEvent.timestamp,idSequence:globalIdSequence});keyboardPlaceHolder?(adds.push({parentId:9,nextId:null,node:keyboardPlaceHolder.result}),adds.push({parentId:keyboardPlaceHolder.result.id,nextId:null,node:{type:NodeType.Text,id:globalIdSequence.next().value,textContent:"keyboard"}})):(0,esm_exports.uT)("Failed to create keyboard placeholder",{extra:{mobileCustomEvent}})}else removes.push({parentId:9,id:10});let mutation={adds,attributes:[],removes,source:types.yh.Mutation,texts:[]};return{type:types.tw.IncrementalSnapshot,data:mutation,timestamp:mobileCustomEvent.timestamp}}return mobileCustomEvent}},webSchemaValidator=(mobile_replay_ajv.compile(rr_mobile_schema_namespaceObject),mobile_replay_ajv.compile(rr_web_schema_namespaceObject));function transformEventToWeb(event,validateTransformation){let result=event;try{if("object"==typeof event&&null!==event&&"type"in event&&"timestamp"in event){let transformer=transformers[event.type];if(transformer){let transformed=transformer(event);validateTransformation&&function(data){let validationResult=webSchemaValidator(data);validationResult||(0,esm_exports.uT)("transformation did not match schema",{extra:{data,errors:webSchemaValidator.errors}})}(transformed),result=transformed}}else(0,esm_exports.uT)("No type in event",{extra:{event}})}catch(e){(0,esm_exports.Tb)(e,{extra:{event}})}return result}function transformToWeb(mobileData){return mobileData.reduce((acc,event)=>{let transformed=transformEventToWeb(event);return acc.push(transformed||event),acc},[])}let frontend_exports=async()=>Promise.resolve({enabled:!0,mobileReplay:{transformEventToWeb:transformEventToWeb,transformToWeb:transformToWeb}});var browser=__webpack_require__("./node_modules/.pnpm/fflate@0.7.4/node_modules/fflate/esm/browser.js"),index_esm=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),lib=__webpack_require__("./node_modules/.pnpm/kea-loaders@3.0.0_kea@3.1.5/node_modules/kea-loaders/lib/index.js"),kea_subscriptions_lib=__webpack_require__("./node_modules/.pnpm/kea-subscriptions@3.0.1_kea@3.1.5/node_modules/kea-subscriptions/lib/index.js"),api=__webpack_require__("./frontend/src/lib/api.ts"),constants=__webpack_require__("./frontend/src/lib/constants.tsx"),dayjs=__webpack_require__("./frontend/src/lib/dayjs.ts"),featureFlagLogic=__webpack_require__("./frontend/src/lib/logic/featureFlagLogic.ts"),eventUsageLogic=__webpack_require__("./frontend/src/lib/utils/eventUsageLogic.ts"),dist_module=__webpack_require__("./node_modules/.pnpm/posthog-js@1.205.0/node_modules/posthog-js/dist/module.js"),teamLogic=__webpack_require__("./frontend/src/scenes/teamLogic.tsx"),schema=__webpack_require__("./frontend/src/queries/schema.ts"),queries_utils=__webpack_require__("./frontend/src/queries/utils.ts"),src_types=__webpack_require__("./frontend/src/types.ts");let activeSources=[types.yh.MouseMove,types.yh.MouseInteraction,types.yh.Scroll,types.yh.ViewportResize,types.yh.Input,types.yh.TouchMove,types.yh.MediaInteraction,types.yh.Drag],isActiveEvent=event=>event.type===types.tw.FullSnapshot||event.type===types.tw.Meta||event.type===types.tw.IncrementalSnapshot&&activeSources.includes(event.data?.source),mapSnapshotsToWindowId=snapshots=>{let snapshotsByWindowId={};return snapshots.forEach(snapshot=>{snapshotsByWindowId[snapshot.windowId]||(snapshotsByWindowId[snapshot.windowId]=[]),snapshotsByWindowId[snapshot.windowId].push(snapshot)}),snapshotsByWindowId},createSegments=(snapshots,start,end,trackedWindow)=>{let activeSegment,segments=[],lastActiveEventTimestamp=0,snapshotsByWindowId=mapSnapshotsToWindowId(snapshots);snapshots.forEach((snapshot,index)=>{let eventIsActive=isActiveEvent(snapshot),previousSnapshot=snapshots[index-1],isPreviousSnapshotLastForWindow=snapshotsByWindowId[previousSnapshot?.windowId]?.slice(-1)[0]===previousSnapshot,isNewSegment=!activeSegment;eventIsActive&&!activeSegment?.isActive&&(isNewSegment=!0),activeSegment?.isActive&&lastActiveEventTimestamp+5e3{let windowIds=Object.keys(snapshotsByWindowId);for(let windowId of(preferredWindowId&&(windowIds=[preferredWindowId,...windowIds.filter(id=>id!==preferredWindowId)]),windowIds)){let snapshots=snapshotsByWindowId[windowId];if(snapshots[0].timestamp<=timestamp&&snapshots[snapshots.length-1].timestamp>=timestamp)return windowId}};if(trackedWindow&&(segments=segments.map(segment=>segment.windowId===trackedWindow?segment:{...segment,windowId:trackedWindow,isActive:!1,kind:"gap"})),segments=segments.reduce((acc,segment,index)=>{let previousSegment=segments[index-1],list=[...acc];if(previousSegment&&segment.startTimestamp!==previousSegment.endTimestamp){let startTimestamp=previousSegment.endTimestamp,endTimestamp=segment.startTimestamp,windowId=findWindowIdForTimestamp(startTimestamp+1,trackedWindow||previousSegment.windowId);list.push({kind:"gap",startTimestamp,endTimestamp,windowId,isActive:!1})}return list.push(segment),list},[]),start&&end){let latestTimestamp=segments[segments.length-1]?.endTimestamp,endTimestamp=end.valueOf();(!latestTimestamp||latestTimestampstart.valueOf()&&segments.unshift({kind:"gap",startTimestamp:start.valueOf(),endTimestamp:firstTimestamp,isActive:!1})}return segments=segments.map(segment=>(segment.durationMs=segment.endTimestamp-segment.startTimestamp,segment))};function unzip(compressedStr){return JSON.parse((0,browser.T8)((0,browser._Z)((0,browser.TD)(compressedStr,!0))))}let parseEncodedSnapshots=async function(items,sessionId){let withMobileTransformer=!(arguments.length>2)||void 0===arguments[2]||arguments[2];postHogEEModule||(postHogEEModule=await frontend_exports());let lineCount=items.length,unparseableLines=[],isMobileSnapshots=!1,parsedLines=items.flatMap(l=>{if(!l)return[];try{var x;let snapshotLine,snapshotData;return x=snapshotLine="string"==typeof l?JSON.parse(l):l,snapshotData="object"==typeof x&&null!==x&&"type"in x&&"timestamp"in x?[snapshotLine]:snapshotLine.data,isMobileSnapshots||(isMobileSnapshots=snapshotData.some(d=>(0,utils.Kn)(d.data)&&"wireframes"in d.data)),snapshotData.map(d=>{let snap=function(d,withMobileTransformer){let currentEvent=function(ev){try{if("object"==typeof ev&&null!==ev&&"cv"in ev){if("2024-10"===ev.cv){if(ev.type===types.tw.FullSnapshot)return{...ev,data:unzip(ev.data)};if(ev.type===types.tw.IncrementalSnapshot){if(ev.data.source===types.yh.StyleSheetRule)return{...ev,data:{...ev.data,source:types.yh.StyleSheetRule,adds:unzip(ev.data.adds),removes:unzip(ev.data.removes)}};if(ev.data.source===types.yh.Mutation)return{...ev,data:{...ev.data,source:types.yh.Mutation,adds:unzip(ev.data.adds),removes:unzip(ev.data.removes),texts:unzip(ev.data.texts),attributes:unzip(ev.data.attributes)}}}}else dist_module.ZP.captureException(Error("Unknown compressed event version"),{feature:"session-recording-compressed-event-decompression",compressedEvent:ev,compressionVersion:ev.cv})}return ev}catch(e){return dist_module.ZP.captureException(e||Error("Could not decompress event"),{feature:"session-recording-compressed-event-decompression",compressedEvent:ev}),ev}}(d);return withMobileTransformer&&postHogEEModule?.mobileReplay?.transformEventToWeb(currentEvent)||currentEvent}(d,withMobileTransformer);return{windowId:snapshotLine.window_id||snapshotLine.windowId,...snap}})}catch(e){return"string"==typeof l&&unparseableLines.push(l),[]}});if(unparseableLines.length){let extra={playbackSessionId:sessionId,totalLineCount:lineCount,unparseableLinesCount:unparseableLines.length,exampleLines:unparseableLines.slice(0,3)};dist_module.ZP.capture("session recording had unparseable lines",{...extra,feature:"session-recording-snapshot-processing"})}return isMobileSnapshots?function(parsedLines){let fullSnapshotIndex=-1,metaIndex=-1;try{if(fullSnapshotIndex=parsedLines.findIndex(l=>l.type===types.tw.FullSnapshot),metaIndex=parsedLines.findIndex(l=>l.type===types.tw.Meta),fullSnapshotIndex>-1&&-1===metaIndex){let fullSnapshot=parsedLines[fullSnapshotIndex],mainNode=fullSnapshot.data.node,targetNode=mainNode.childNodes[1].childNodes[1].childNodes[0],{width,height}=targetNode.attributes,metaEvent={windowId:fullSnapshot.windowId,type:types.tw.Meta,timestamp:fullSnapshot.timestamp,data:{href:getHrefFromSnapshot(fullSnapshot)||"",width,height}};parsedLines.splice(fullSnapshotIndex,0,metaEvent)}}catch(e){(0,esm_exports.Tb)(e,{tags:{feature:"session-recording-missing-meta-patching"},extra:{fullSnapshotIndex,metaIndex}})}return parsedLines}(parsedLines):parsedLines},getHrefFromSnapshot=snapshot=>(0,utils.Kn)(snapshot)&&"data"in snapshot?snapshot.data?.href||snapshot.data?.payload?.href:void 0,cyrb53=function(str){let seed=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,h1=3735928559^seed,h2=1103547991^seed;for(let i=0,ch;i>>16,2246822507)^Math.imul(h2^h2>>>13,3266489909),4294967296*(2097151&(h2=Math.imul(h2^h2>>>16,2246822507)^Math.imul(h1^h1>>>13,3266489909)))+(h1>>>0)},deduplicateSnapshots=snapshots=>{let seenHashes=new Set;return(null!=snapshots?snapshots:[]).filter(snapshot=>{let{delay:_delay,...delayFreeSnapshot}=snapshot,key=snapshot.seen||cyrb53(JSON.stringify(delayFreeSnapshot));return snapshot.seen=key,!seenHashes.has(key)&&(seenHashes.add(key),!0)}).sort((a,b)=>a.timestamp-b.timestamp)},generateRecordingReportDurations=cache=>({metadata:cache.metadataLoadDuration||Math.round(performance.now()-cache.metaStartTime),snapshots:cache.snapshotsLoadDuration||Math.round(performance.now()-cache.snapshotsStartTime),events:cache.eventsLoadDuration||Math.round(performance.now()-cache.eventsStartTime),firstPaint:cache.firstPaintDuration}),resetTimingsCache=cache=>{cache.metaStartTime=null,cache.metadataLoadDuration=null,cache.snapshotsStartTime=null,cache.snapshotsLoadDuration=null,cache.eventsStartTime=null,cache.eventsLoadDuration=null,cache.firstPaintDuration=null};function makeEventsQuery(person,distinctId,start,end,properties){return api.ZP.query({kind:schema.OH.EventsQuery,select:["uuid","event","timestamp","elements_chain","properties.$window_id","properties.$current_url","properties.$event_type"],orderBy:["timestamp ASC"],limit:1e6,personId:person?String(person.id):void 0,after:start.subtract(6e4,"ms").format(),before:end.add(6e4,"ms").format(),properties:properties,where:distinctId?[`distinct_id = ('${distinctId}')`]:void 0})}async function processEncodedResponse(encodedResponse,props,featureFlags){let untransformed=null,transformed=await parseEncodedSnapshots(encodedResponse,props.sessionRecordingId);return featureFlags[constants.y8.SESSION_REPLAY_EXPORT_MOBILE_DATA]&&(untransformed=await parseEncodedSnapshots(encodedResponse,props.sessionRecordingId,!1)),{transformed,untransformed}}let getSourceKey=source=>`${source.source}-${source.blob_key||source.source}`,sessionRecordingDataLogic=(0,index_esm.kea)([(0,index_esm.path)(key=>["scenes","session-recordings","sessionRecordingDataLogic",key]),(0,index_esm.props)({}),(0,index_esm.key)(_ref=>{let{sessionRecordingId}=_ref;return sessionRecordingId||"no-session-recording-id"}),(0,index_esm.connect)({logic:[eventUsageLogic.vx],values:[featureFlagLogic.h,["featureFlags"],teamLogic.H,["currentTeam"]]}),(0,index_esm.defaults)({sessionPlayerMetaData:null}),(0,index_esm.actions)({setFilters:filters=>({filters}),loadRecordingMeta:!0,loadRecordingComments:!0,maybeLoadRecordingMeta:!0,loadSnapshots:!0,loadSnapshotSources:!0,loadNextSnapshotSource:!0,loadSnapshotsForSource:source=>({source}),loadEvents:!0,loadFullEventData:event=>({event}),markViewed:delay=>({delay}),reportUsageIfFullyLoaded:!0,persistRecording:!0,maybePersistRecording:!0,pollRealtimeSnapshots:!0,stopRealtimePolling:!0,setTrackedWindow:windowId=>({windowId}),setWasMarkedViewed:wasMarkedViewed=>({wasMarkedViewed})}),(0,index_esm.reducers)(()=>({trackedWindow:[null,{setTrackedWindow:(_,_ref2)=>{let{windowId}=_ref2;return windowId}}],filters:[{},{setFilters:(state,_ref3)=>{let{filters}=_ref3;return{...state,...filters}}}],isRealtimePolling:[!1,{pollRealtimeSnapshots:()=>!0,stopRealtimePolling:()=>!1}],isNotFound:[!1,{loadRecordingMeta:()=>!1,loadRecordingMetaSuccess:()=>!1,loadRecordingMetaFailure:()=>!0}],snapshotsBySource:[null,{loadSnapshotsForSourceSuccess:(state,_ref4)=>{let{snapshotsForSource}=_ref4,sourceKey=getSourceKey(snapshotsForSource.source);return{...state,[sourceKey]:snapshotsForSource}}}],wasMarkedViewed:[!1,{setWasMarkedViewed:(_,_ref5)=>{let{wasMarkedViewed}=_ref5;return wasMarkedViewed}}]})),(0,lib.loaders)(_ref6=>{let{values,props,cache}=_ref6;return{sessionComments:{loadRecordingComments:async(_,breakpoint)=>{let empty=[];if(!props.sessionRecordingId)return empty;let response=await api.ZP.notebooks.recordingComments(props.sessionRecordingId);return breakpoint(),response.results||empty}},sessionPlayerMetaData:{loadRecordingMeta:async(_,breakpoint)=>{if(!props.sessionRecordingId)return null;cache.metaStartTime=performance.now();let response=await api.ZP.recordings.get(props.sessionRecordingId);return breakpoint(),response},persistRecording:async(_,breakpoint)=>values.sessionPlayerMetaData?(await breakpoint(100),await api.ZP.recordings.persist(props.sessionRecordingId),{...values.sessionPlayerMetaData,storage:"object_storage_lts"}):null},snapshotSources:[null,{loadSnapshotSources:async()=>{var _response$sources;let response=await api.ZP.recordings.listSnapshotSources(props.sessionRecordingId);return null!==(_response$sources=response.sources)&&void 0!==_response$sources?_response$sources:[]}}],snapshotsForSource:[null,{loadSnapshotsForSource:async(_ref7,breakpoint)=>{let params,{source}=_ref7;if(source.source===src_types.Qo.blob){if(!source.blob_key)throw Error("Missing key");params={blob_key:source.blob_key,source:"blob"}}else if(source.source===src_types.Qo.realtime)params={source:"realtime",version:"2024-04-30"};else throw Error(`Unsupported source: ${source.source}`);let snapshotLoadingStartTime=performance.now();cache.snapshotsStartTime||(cache.snapshotsStartTime=snapshotLoadingStartTime),await breakpoint(1);let response=await api.ZP.recordings.getSnapshots(props.sessionRecordingId,params).catch(e=>{if("realtime"===source.source&&404===e.status)return[];throw e}),{transformed,untransformed}=await processEncodedResponse(response,props,values.featureFlags);return{snapshots:transformed,untransformed_snapshots:null!=untransformed?untransformed:void 0,source}}}],sessionEventsData:[null,{loadEvents:async()=>{cache.eventsStartTime||(cache.eventsStartTime=performance.now());let{start,end,person}=values.sessionPlayerData;if(!person||!start||!end)return null;let[sessionEvents,relatedEvents]=await Promise.all([makeEventsQuery(null,null,start,end,[{key:"$session_id",value:[props.sessionRecordingId],operator:src_types.WV.Exact,type:src_types.FT.Event}]),makeEventsQuery(null,values.sessionPlayerMetaData?.distinct_id||null,start,end,[{key:"$session_id",value:"",operator:src_types.WV.Exact,type:src_types.FT.Event},{key:"$lib",value:["web"],operator:src_types.WV.IsNot,type:src_types.FT.Event}])]);return[...sessionEvents.results,...relatedEvents.results].map(event=>{let pathname;let currentUrl=event[5];try{pathname=event[5]?new URL(event[5]).pathname:void 0}catch{pathname=void 0}return{id:event[0],event:event[1],timestamp:event[2],elements:function(chain){let options=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},elements=[],splitClassAttributes=/(.*?)($|:([a-zA-Z\-_0-9]*=.*))/g,parseAttributesRegex=/((.*?)="(.*?[^\\])")/gm;chain=chain.replace(/\n/g,"");try{Array.from(chain.matchAll(/(?:[^\s;"]|"(?:\\.|[^"])*")+/g)).map(r=>r[0]).forEach((elString,index)=>{let elStringSplit=Array.from(elString.matchAll(splitClassAttributes))[0],attributes=elStringSplit.length>3&&elStringSplit[3]?Array.from(elStringSplit[3].matchAll(parseAttributesRegex)).map(a=>[a[2],a[3]]):[],element={attributes:{},order:index,tag_name:""};if(elStringSplit[1]){let tagAndClass=elStringSplit[1].split(".");element.tag_name=tagAndClass[0],tagAndClass.length>1&&(element.attr_class=tagAndClass.slice(1).filter(Boolean))}for(let[key,value]of attributes)"href"==key?element.href=value:"nth-child"==key?element.nth_child=parseInt(value):"nth-of-type"==key?element.nth_of_type=parseInt(value):"text"==key?element.text=value:"attr_id"==key?element.attr_id=value:key&&(element.attributes||(element.attributes={}),element.attributes[key]=value);elements.push(element)})}catch(error){if(options.throwOnError)throw error}return elements}(event[3]),properties:{$window_id:event[4],$current_url:currentUrl,$event_type:event[6],$pathname:pathname},playerTime:+(0,dayjs.Bv)(event[2])-+start,fullyLoaded:!1}})},loadFullEventData:async _ref8=>{let{event}=_ref8,events=Array.isArray(event)?event:[event],existingEvents=values.sessionEventsData?.filter(x=>events.some(e=>e.id===x.id)),allEventsAreFullyLoaded=existingEvents?.every(e=>e.fullyLoaded)&&existingEvents.length===events.length;if(!existingEvents||allEventsAreFullyLoaded)return values.sessionEventsData;existingEvents=existingEvents.filter(e=>!e.fullyLoaded);let timestamps=existingEvents.map(ee=>(0,dayjs.Bv)(ee.timestamp).utc().valueOf()),eventNames=Array.from(new Set(existingEvents.map(ee=>ee.event))),eventIds=existingEvents.map(ee=>ee.id),earliestTimestamp=timestamps.reduce((a,b)=>Math.min(a,b)),latestTimestamp=timestamps.reduce((a,b)=>Math.max(a,b));try{let query={kind:schema.OH.HogQLQuery,query:(0,queries_utils.zP)`SELECT properties, uuid FROM events - WHERE timestamp > ${(0,dayjs.Bv)(earliestTimestamp-1e3).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} - AND timestamp < ${(0,dayjs.Bv)(latestTimestamp+1e3).utc().format("YYYY-MM-DD HH:mm:ss.SSS")} + -- the timestamp range here is only to avoid querying too much of the events table + -- we don't really care about the absolute value, + -- but we do care about whether timezones have an odd impact + -- so, we extend the range by a day on each side so that timezones don't cause issues + WHERE timestamp > ${(0,dayjs.Bv)(earliestTimestamp).subtract(1,"day")} + AND timestamp < ${(0,dayjs.Bv)(latestTimestamp).add(1,"day")} AND event in ${eventNames} AND uuid in ${eventIds}`},response=await api.ZP.query(query);if(response.error)throw Error(response.error);for(let event of existingEvents){let result=response.results.find(x=>x[1]===event.id);result&&(event.properties=JSON.parse(result[0]),event.fullyLoaded=!0)}}catch(e){existingEvents.forEach(e=>e.fullyLoaded=!0),(0,esm_exports.Tb)(e,{tags:{feature:"session-recording-load-full-event-data"}})}return values.sessionEventsData?values.sessionEventsData.map(x=>{let event=existingEvents?.find(ee=>ee.id===x.id);return event?{...x,properties:event.properties,fullyLoaded:event.fullyLoaded}:x}):values.sessionEventsData}}]}}),(0,index_esm.listeners)(_ref9=>{let{values,actions,cache,props}=_ref9;return{loadSnapshots:()=>{values.snapshotSourcesLoading||actions.loadSnapshotSources()},maybeLoadRecordingMeta:()=>{values.sessionPlayerMetaDataLoading||actions.loadRecordingMeta(),values.sessionCommentsLoading||actions.loadRecordingComments()},loadSnapshotSources:()=>{actions.loadEvents()},loadRecordingMetaSuccess:()=>{cache.metadataLoadDuration=Math.round(performance.now()-cache.metaStartTime),actions.reportUsageIfFullyLoaded()},loadRecordingMetaFailure:()=>{cache.metadataLoadDuration=Math.round(performance.now()-cache.metaStartTime)},loadSnapshotSourcesSuccess:()=>{actions.loadNextSnapshotSource()},loadSnapshotsForSourceSuccess:_ref10=>{var _cache$lastSnapshotsC,_cache$lastSnapshotsU;let{snapshotsForSource}=_ref10,sources=values.snapshotSources,snapshots=snapshotsForSource.snapshots,newSnapshotsCount=snapshots.length;(null!==(_cache$lastSnapshotsC=cache.lastSnapshotsCount)&&void 0!==_cache$lastSnapshotsC?_cache$lastSnapshotsC:newSnapshotsCount)===newSnapshotsCount?cache.lastSnapshotsUnchangedCount=(null!==(_cache$lastSnapshotsU=cache.lastSnapshotsUnchangedCount)&&void 0!==_cache$lastSnapshotsU?_cache$lastSnapshotsU:0)+(0===newSnapshotsCount?2:1):cache.lastSnapshotsUnchangedCount=0,cache.lastSnapshotsCount=newSnapshotsCount,snapshots.length||sources?.length!==1?cache.firstPaintDuration||(cache.firstPaintDuration=Math.round(performance.now()-cache.snapshotsStartTime)):dist_module.ZP.capture("recording_snapshots_v2_empty_response",{source:sources[0]}),values.wasMarkedViewed||actions.markViewed(),actions.loadNextSnapshotSource()},loadNextSnapshotSource:()=>{let nextSourceToLoad=values.snapshotSources?.find(s=>{let sourceKey=getSourceKey(s);return!values.snapshotsBySource?.[sourceKey]});if(nextSourceToLoad)return actions.loadSnapshotsForSource(nextSourceToLoad);cache.snapshotsLoadDuration=Math.round(performance.now()-cache.snapshotsStartTime),actions.reportUsageIfFullyLoaded();let realTimeSource=values.snapshotSources?.find(s=>s.source===src_types.Qo.realtime);realTimeSource&&actions.pollRealtimeSnapshots()},loadSnapshotsForSourceFailure:()=>{cache.snapshotsLoadDuration=Math.round(performance.now()-cache.snapshotsStartTime)},pollRealtimeSnapshots:()=>{var _cache$lastSnapshotsU2;clearTimeout(cache.realTimePollingTimeoutID),cache.realTimePollingTimeoutID=null,(null!==(_cache$lastSnapshotsU2=cache.lastSnapshotsUnchangedCount)&&void 0!==_cache$lastSnapshotsU2?_cache$lastSnapshotsU2:0)<=10?cache.realTimePollingTimeoutID=setTimeout(()=>{actions.loadSnapshotsForSource({source:src_types.Qo.realtime})},props.realTimePollingIntervalMilliseconds||3e3):actions.stopRealtimePolling()},loadEventsSuccess:()=>{cache.eventsLoadDuration=Math.round(performance.now()-cache.eventsStartTime),actions.reportUsageIfFullyLoaded()},loadEventsFailure:()=>{cache.eventsLoadDuration=Math.round(performance.now()-cache.eventsStartTime)},reportUsageIfFullyLoaded:(_,breakpoint)=>{breakpoint(),values.fullyLoaded&&(eventUsageLogic.vx.actions.reportRecording(values.sessionPlayerData,generateRecordingReportDurations(cache),src_types.Sm.LOADED,values.sessionPlayerMetaData,0),resetTimingsCache(cache))},markViewed:async(_ref11,breakpoint)=>{let{delay}=_ref11,durations=generateRecordingReportDurations(cache);breakpoint(),values.wasMarkedViewed||(actions.setWasMarkedViewed(!0),await breakpoint(null!=delay?delay:3e3),await api.ZP.recordings.update(props.sessionRecordingId,{viewed:!0,player_metadata:values.sessionPlayerMetaData,durations}),await breakpoint(1e4),await api.ZP.recordings.update(props.sessionRecordingId,{analyzed:!0,player_metadata:values.sessionPlayerMetaData,durations}))},maybePersistRecording:()=>{values.sessionPlayerMetaDataLoading||values.sessionPlayerMetaData?.storage!=="object_storage"||actions.persistRecording()}}}),(0,index_esm.selectors)(_ref12=>{let{cache}=_ref12;return{webVitalsEvents:[s=>[s.sessionEventsData],sessionEventsData=>(sessionEventsData||[]).filter(e=>"$web_vitals"===e.event)],windowIdForTimestamp:[s=>[s.segments],segments=>timestamp=>segments.find(segment=>segment.startTimestamp<=timestamp&&segment.endTimestamp>=timestamp)?.windowId],sessionPlayerData:[(s,p)=>[s.sessionPlayerMetaData,s.snapshotsByWindowId,s.segments,s.bufferedToTime,s.start,s.end,s.durationMs,s.fullyLoaded,p.sessionRecordingId],(meta,snapshotsByWindowId,segments,bufferedToTime,start,end,durationMs,fullyLoaded,sessionRecordingId)=>{var _meta$person;return{person:null!==(_meta$person=meta?.person)&&void 0!==_meta$person?_meta$person:null,start,end,durationMs,snapshotsByWindowId,segments,bufferedToTime,fullyLoaded,sessionRecordingId}}],snapshotsLoading:[s=>[s.snapshotSourcesLoading,s.snapshotsForSourceLoading],(snapshotSourcesLoading,snapshotsForSourceLoading)=>!cache.realTimePollingTimeoutID&&(snapshotSourcesLoading||snapshotsForSourceLoading)],snapshotsLoaded:[s=>[s.snapshotSources],snapshotSources=>!!snapshotSources],fullyLoaded:[s=>[s.snapshots,s.sessionPlayerMetaDataLoading,s.snapshotsLoading,s.sessionEventsDataLoading],(snapshots,sessionPlayerMetaDataLoading,snapshotsLoading,sessionEventsDataLoading)=>!!snapshots.length&&!sessionPlayerMetaDataLoading&&!snapshotsLoading&&!sessionEventsDataLoading],firstSnapshot:[s=>[s.snapshots],snapshots=>snapshots[0]||null],lastSnapshot:[s=>[s.snapshots],snapshots=>snapshots[snapshots.length-1]||null],start:[s=>[s.firstSnapshot,s.sessionPlayerMetaData],(firstSnapshot,meta)=>{let eventStart=meta?.start_time?(0,dayjs.Bv)(meta.start_time):null,snapshotStart=firstSnapshot?(0,dayjs.Bv)(firstSnapshot.timestamp):null;return eventStart&&snapshotStart?eventStart.isBefore(snapshotStart)?eventStart:snapshotStart:eventStart||snapshotStart}],end:[s=>[s.lastSnapshot,s.sessionPlayerMetaData],(lastSnapshot,meta)=>{let eventEnd=meta?.end_time?(0,dayjs.Bv)(meta.end_time):null,snapshotEnd=lastSnapshot?(0,dayjs.Bv)(lastSnapshot.timestamp):null;return eventEnd&&snapshotEnd?eventEnd.isAfter(snapshotEnd)?eventEnd:snapshotEnd:eventEnd||snapshotEnd}],durationMs:[s=>[s.start,s.end],(start,end)=>start&&end?end.diff(start):0],segments:[s=>[s.snapshots,s.start,s.end,s.trackedWindow],(snapshots,start,end,trackedWindow)=>createSegments(snapshots||[],start,end,trackedWindow)],urls:[s=>[s.snapshots],snapshots=>{var _snapshots$filter$map;return null!==(_snapshots$filter$map=snapshots.filter(snapshot=>getHrefFromSnapshot(snapshot)).map(snapshot=>({url:getHrefFromSnapshot(snapshot),timestamp:snapshot.timestamp})))&&void 0!==_snapshots$filter$map?_snapshots$filter$map:[]}],snapshots:[s=>[s.snapshotSources,s.snapshotsBySource],(sources,snapshotsBySource)=>{var _sources$flatMap;let allSnapshots=null!==(_sources$flatMap=sources?.flatMap(source=>{let sourceKey=getSourceKey(source);return snapshotsBySource?.[sourceKey]?.snapshots||[]}))&&void 0!==_sources$flatMap?_sources$flatMap:[];return deduplicateSnapshots(allSnapshots)}],untransformedSnapshots:[s=>[s.snapshotSources,s.snapshotsBySource],(sources,snapshotsBySource)=>{var _sources$flatMap2;let allSnapshots=null!==(_sources$flatMap2=sources?.flatMap(source=>{let sourceKey=getSourceKey(source);return snapshotsBySource?.[sourceKey]?.untransformed_snapshots||[]}))&&void 0!==_sources$flatMap2?_sources$flatMap2:[];return deduplicateSnapshots(allSnapshots)}],snapshotsByWindowId:[s=>[s.snapshots],snapshots=>mapSnapshotsToWindowId(snapshots||[])],snapshotsInvalid:[(s,p)=>[s.snapshotsByWindowId,s.fullyLoaded,s.start,p.sessionRecordingId,s.currentTeam],(snapshotsByWindowId,fullyLoaded,start,sessionRecordingId,currentTeam)=>{if(!fullyLoaded||!start)return!1;let windowsHaveFullSnapshot=Object.entries(snapshotsByWindowId).reduce((acc,_ref13)=>{let[windowId,events]=_ref13;return acc[`window-id-${windowId}-has-full-snapshot`]=events.some(event=>event.type===types.tw.FullSnapshot),acc},{}),anyWindowMissingFullSnapshot=!Object.values(windowsHaveFullSnapshot).some(x=>x),everyWindowMissingFullSnapshot=!Object.values(windowsHaveFullSnapshot).every(x=>x);return everyWindowMissingFullSnapshot?dist_module.ZP.capture("recording_has_no_full_snapshot",{watchedSession:sessionRecordingId,teamId:currentTeam?.id,teamName:currentTeam?.name}):anyWindowMissingFullSnapshot&&dist_module.ZP.capture("recording_window_missing_full_snapshot",{watchedSession:sessionRecordingId,teamID:currentTeam?.id,teamName:currentTeam?.name}),everyWindowMissingFullSnapshot}],isRecentAndInvalid:[s=>[s.start,s.snapshotsInvalid],(start,snapshotsInvalid)=>{let lessThanFiveMinutesOld=5>=(0,dayjs.Bv)().diff(start,"minute");return snapshotsInvalid&&lessThanFiveMinutesOld}],bufferedToTime:[s=>[s.segments],segments=>{if(!segments.length)return null;let startTime=segments[0].startTimestamp,lastSegment=segments[segments.length-1];return"buffer"===lastSegment.kind?lastSegment.startTimestamp-startTime:lastSegment.endTimestamp-startTime}],windowIds:[s=>[s.snapshotsByWindowId],snapshotsByWindowId=>Object.keys(snapshotsByWindowId)],createExportJSON:[s=>[s.sessionPlayerMetaData,s.snapshots,s.untransformedSnapshots],(sessionPlayerMetaData,snapshots,untransformedSnapshots)=>exportUntransformedMobileSnapshotData=>{var _sessionPlayerMetaDat;return{version:"2023-04-28",data:{id:null!==(_sessionPlayerMetaDat=sessionPlayerMetaData?.id)&&void 0!==_sessionPlayerMetaDat?_sessionPlayerMetaDat:"",person:sessionPlayerMetaData?.person,snapshots:exportUntransformedMobileSnapshotData?untransformedSnapshots:snapshots}}}],customRRWebEvents:[s=>[s.snapshots],snapshots=>snapshots.filter(snapshot=>snapshot.type===types.tw.Custom).map(x=>x)]}}),(0,kea_subscriptions_lib.Vt)(_ref14=>{let{actions,values}=_ref14;return{webVitalsEvents:value=>{values.sessionEventsDataLoading||actions.loadFullEventData(value)},isRecentAndInvalid:(prev,next)=>{!prev&&next&&dist_module.ZP.capture("recording cannot playback yet",{watchedSession:values.sessionPlayerData.sessionRecordingId})}}}),(0,index_esm.afterMount)(_ref15=>{let{cache}=_ref15;resetTimingsCache(cache)}),(0,index_esm.beforeUnmount)(_ref16=>{let{cache}=_ref16;resetTimingsCache(cache)})])},"./frontend/src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{cB:()=>ONE_FRAME_MS,W1:()=>PLAYBACK_SPEEDS,X4:()=>SessionRecordingPlayerMode,qZ:()=>getCurrentPlayerTime,d$:()=>sessionRecordingPlayerLogic});var src=__webpack_require__("./frontend/@posthog/lemon-ui/src/index.ts"),types=__webpack_require__("./node_modules/.pnpm/@rrweb+types@2.0.0-alpha.13/node_modules/@rrweb/types/dist/types.js"),esm_exports=__webpack_require__("./node_modules/.pnpm/@sentry+core@7.112.1/node_modules/@sentry/core/esm/exports.js"),index_esm=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),lib=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),kea_subscriptions_lib=__webpack_require__("./node_modules/.pnpm/kea-subscriptions@3.0.1_kea@3.1.5/node_modules/kea-subscriptions/lib/index.js"),kea_test_utils_lib=__webpack_require__("./node_modules/.pnpm/kea-test-utils@0.2.4_kea@3.1.5/node_modules/kea-test-utils/lib/index.js"),dayjs=__webpack_require__("./frontend/src/lib/dayjs.ts"),featureFlagLogic=__webpack_require__("./frontend/src/lib/logic/featureFlagLogic.ts"),utils=__webpack_require__("./frontend/src/lib/utils.tsx"),eventUsageLogic=__webpack_require__("./frontend/src/lib/utils/eventUsageLogic.ts"),dist_module=__webpack_require__("./node_modules/.pnpm/posthog-js@1.205.0/node_modules/posthog-js/dist/module.js"),replay=__webpack_require__("./node_modules/.pnpm/rrweb@2.0.0-alpha.13_patch_hash=e2gmypqces37eklplr5o3rvywa/node_modules/rrweb/es/rrweb/packages/rrweb/src/replay/index.js"),BillingPopup=__webpack_require__("./frontend/src/scenes/billing/BillingPopup.tsx"),preflightLogic=__webpack_require__("./frontend/src/scenes/PreflightCheck/preflightLogic.tsx"),sessionRecordingDataLogic=__webpack_require__("./frontend/src/scenes/session-recordings/player/sessionRecordingDataLogic.ts"),urls=__webpack_require__("./frontend/src/scenes/urls.ts"),userLogic=__webpack_require__("./frontend/src/scenes/userLogic.ts"),src_types=__webpack_require__("./frontend/src/types.ts"),playerSettingsLogic=__webpack_require__("./frontend/src/scenes/session-recordings/player/playerSettingsLogic.ts"),rrweb=__webpack_require__("./frontend/src/scenes/session-recordings/player/rrweb/index.ts"),dist_types=__webpack_require__("./node_modules/.pnpm/rrweb@2.0.0-alpha.13_patch_hash=e2gmypqces37eklplr5o3rvywa/node_modules/rrweb/es/rrweb/packages/types/dist/types.js"),canvas=__webpack_require__("./node_modules/.pnpm/rrweb@2.0.0-alpha.13_patch_hash=e2gmypqces37eklplr5o3rvywa/node_modules/rrweb/es/rrweb/packages/rrweb/src/replay/canvas/index.js");let webGLVarMap=new Map,variableListFor=(ctx,ctor)=>{let contextMap=webGLVarMap.get(ctx);return contextMap||(contextMap=new Map,webGLVarMap.set(ctx,contextMap)),contextMap.has(ctor)||contextMap.set(ctor,[]),contextMap.get(ctor)},deserializeCanvasArg=(imageMap,ctx,preload)=>async arg=>{if(arg&&"object"==typeof arg&&"rr_type"in arg){if(preload&&(preload.isUnchanged=!1),"ImageBitmap"===arg.rr_type&&"args"in arg){let args=await deserializeCanvasArg(imageMap,ctx,preload)(arg.args);return await createImageBitmap.apply(null,args)}if("index"in arg){if(preload||null===ctx)return arg;let{rr_type:name,index}=arg;return variableListFor(ctx,name)[index]}if("args"in arg)return arg;if("base64"in arg)return(0,utils.q_)(arg.base64);if("src"in arg)return arg;if("data"in arg&&"Blob"===arg.rr_type){let blobContents=await Promise.all(arg.data.map(deserializeCanvasArg(imageMap,ctx,preload))),blob=new Blob(blobContents,{type:arg.type});return blob}}else if(Array.isArray(arg)){let result=await Promise.all(arg.map(deserializeCanvasArg(imageMap,ctx,preload)));return result}return arg};function isCanvasMutation(e){return e.type===dist_types.tw.IncrementalSnapshot&&e.data.source===dist_types.yh.CanvasMutation}let CanvasReplayerPlugin=events=>{let canvases=new Map([]),containers=new Map([]),imageMap=new Map,canvasEventMap=new Map,pruneQueue=[],nextPreloadIndex=null,canvasMutationEvents=events.filter(isCanvasMutation),handleQueue=new Map,processMutationSync=(e,_ref)=>{let{replayer}=_ref;handleQueue.set(e.data.id,[e,replayer]),debouncedProcessQueuedEvents()},debouncedProcessQueuedEvents=(0,utils.Ds)(()=>{Array.from(handleQueue.entries()).forEach(_ref2=>{let[id,[e,replayer]]=_ref2;(async()=>{try{await processMutation(e,replayer),handleQueue.delete(id)}catch(e){handleMutationError(e)}})()})},250),deserializeAndPreloadCanvasEvents=async(data,event)=>{if(!canvasEventMap.has(event)){let status={isUnchanged:!0};if("commands"in data){let commands=await Promise.all(data.commands.map(async c=>{let args=await Promise.all(c.args.map(deserializeCanvasArg(imageMap,null,status)));return{...c,args}}));!1===status.isUnchanged&&canvasEventMap.set(event,{...data,commands})}else{let args=await Promise.all(data.args.map(deserializeCanvasArg(imageMap,null,status)));!1===status.isUnchanged&&canvasEventMap.set(event,{...data,args})}}},cloneCanvas=(id,node)=>{let cloneNode=node.cloneNode();return canvases.set(id,cloneNode),document.adoptNode(cloneNode),cloneNode},pruneBuffer=event=>{for(;pruneQueue.length;){let difference=Math.abs(event.timestamp-pruneQueue[0].timestamp),eventToPrune=pruneQueue.shift();if(eventToPrune&&canvasEventMap.delete(eventToPrune),difference<=3e4&&pruneQueue.length<=20)break}},processMutation=async(e,replayer)=>{pruneBuffer(e),pruneQueue.push(e),preload(e);let data=e.data,source=replayer.getMirror().getNode(data.id),target=canvases.get(data.id)||source&&cloneCanvas(data.id,source);if(!target)return;source&&(target.width=source.clientWidth||source.width,target.height=source.clientHeight||source.height),await (0,canvas.Z)({event:e,mutation:data,target:target,imageMap,canvasEventMap,errorHandler:error=>{handleMutationError(error)}});let img=containers.get(data.id);img&&target.toBlob(blob=>{if(blob){img.style.width="initial",img.style.height="initial";let url=URL.createObjectURL(blob);img.onload=()=>URL.revokeObjectURL(url),img.src=url}},"image/webp",.4)},preload=async currentEvent=>{let currentIndex=nextPreloadIndex||(currentEvent?function quickFindClosestCanvasEventIndex(events,target,start,end){if(!target||!events||!events.length)return -1;if(start>end)return end;if(start<0||end>events.length-1)return -1;let mid=Math.floor((start+end)/2),middleEvent=events[mid];return middleEvent?target.timestamp<=middleEvent.timestamp?quickFindClosestCanvasEventIndex(events,target,start,mid-1):quickFindClosestCanvasEventIndex(events,target,mid+1,end):-1}(canvasMutationEvents,currentEvent,0,canvasMutationEvents.length):0),eventsToPreload=canvasMutationEvents.slice(currentIndex,currentIndex+20).filter(_ref3=>{let{timestamp}=_ref3;return!currentEvent||timestamp-currentEvent.timestamp<=3e4});for(let event of(nextPreloadIndex=currentIndex+1,eventsToPreload))await deserializeAndPreloadCanvasEvents(event.data,event)};return preload(),{onBuild:(node,_ref4)=>{let{id}=_ref4;if(node&&"CANVAS"===node.nodeName&&1===node.nodeType){let el=containers.get(id)||document.createElement("img");node.appendChild(el),containers.set(id,el)}},handler:async(e,isSync,_ref5)=>{let{replayer}=_ref5,isCanvas=isCanvasMutation(e);isSync?(nextPreloadIndex=null,canvasEventMap.clear(),isCanvas?processMutationSync(e,{replayer}):pruneBuffer(e),pruneBuffer(e)):isCanvas&&processMutation(e,replayer).catch(handleMutationError)}}},handleMutationError=error=>{(0,esm_exports.Tb)(error)};var playerUtils=__webpack_require__("./frontend/src/scenes/session-recordings/player/utils/playerUtils.ts");let PLAYBACK_SPEEDS=[.5,1,2,3,4,8,16],ONE_FRAME_MS=100,SessionRecordingPlayerMode=function(SessionRecordingPlayerMode){return SessionRecordingPlayerMode.Standard="standard",SessionRecordingPlayerMode.Sharing="sharing",SessionRecordingPlayerMode.Notebook="notebook",SessionRecordingPlayerMode.Preview="preview",SessionRecordingPlayerMode}({}),isMediaElementPlaying=element=>!!(element.currentTime>0&&!element.paused&&!element.ended&&element.readyState>2),sessionRecordingPlayerLogic=(0,index_esm.kea)([(0,index_esm.path)(key=>["scenes","session-recordings","player","sessionRecordingPlayerLogic",key]),(0,index_esm.props)({}),(0,index_esm.key)(props=>`${props.playerKey}-${props.sessionRecordingId}`),(0,index_esm.connect)(props=>({values:[(0,sessionRecordingDataLogic.KE)(props),["snapshotsLoaded","snapshotsLoading","isRealtimePolling","sessionPlayerData","sessionPlayerMetaData","sessionPlayerMetaDataLoading","createExportJSON","customRRWebEvents","fullyLoaded","wasMarkedViewed"],playerSettingsLogic.NX,["speed","skipInactivitySetting","showMouseTail"],userLogic.userLogic,["user","hasAvailableFeature"],preflightLogic.preflightLogic,["preflight"],featureFlagLogic.h,["featureFlags"]],actions:[(0,sessionRecordingDataLogic.KE)(props),["maybeLoadRecordingMeta","loadSnapshots","loadSnapshotsForSourceFailure","loadSnapshotSourcesFailure","loadRecordingMetaSuccess","maybePersistRecording","setWasMarkedViewed","markViewed"],playerSettingsLogic.NX,["setSpeed","setSkipInactivitySetting"],eventUsageLogic.vx,["reportNextRecordingTriggered","reportRecordingExportedToFile"]]})),(0,index_esm.actions)({tryInitReplayer:()=>!0,setPlayer:player=>({player}),setPlay:!0,setPause:!0,setEndReached:function(){let reached=!(arguments.length>0)||void 0===arguments[0]||arguments[0];return{reached}},startBuffer:!0,endBuffer:!0,startScrub:!0,endScrub:!0,setPlayerError:reason=>({reason}),clearPlayerError:!0,setSkippingInactivity:isSkippingInactivity=>({isSkippingInactivity}),syncPlayerSpeed:!0,setCurrentTimestamp:timestamp=>({timestamp}),setScale:scale=>({scale}),togglePlayPause:!0,seekToTimestamp:function(timestamp){let forcePlay=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{timestamp,forcePlay}},seekToTime:timeInMilliseconds=>({timeInMilliseconds}),seekForward:amount=>({amount}),seekBackward:amount=>({amount}),resolvePlayerState:!0,updateAnimation:!0,stopAnimation:!0,pauseIframePlayback:!0,restartIframePlayback:!0,setCurrentSegment:segment=>({segment}),setRootFrame:frame=>({frame}),checkBufferingCompleted:!0,initializePlayerFromStart:!0,incrementErrorCount:!0,incrementWarningCount:function(){let count=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return{count}},syncSnapshotsWithPlayer:!0,exportRecordingToFile:exportUntransformedMobileData=>({exportUntransformedMobileData}),deleteRecording:!0,openExplorer:!0,closeExplorer:!0,setExplorerProps:props=>({props}),setIsFullScreen:isFullScreen=>({isFullScreen}),skipPlayerForward:(rrWebPlayerTime,skip)=>({rrWebPlayerTime,skip}),incrementClickCount:!0,playerErrorSeen:error=>({error}),fingerprintReported:fingerprint=>({fingerprint}),setDebugSnapshotTypes:types=>({types}),setDebugSnapshotIncrementalSources:incrementalSources=>({incrementalSources}),setPlayNextAnimationInterrupted:interrupted=>({interrupted})}),(0,index_esm.reducers)(()=>({playNextAnimationInterrupted:[!1,{setPlayNextAnimationInterrupted:(_,_ref)=>{let{interrupted}=_ref;return interrupted}}],reportedReplayerErrors:[new Set,{fingerprintReported:(state,_ref2)=>{let{fingerprint}=_ref2,clonedSet=new Set(state);return clonedSet.add(fingerprint),clonedSet}}],clickCount:[0,{incrementClickCount:state=>state+1}],rootFrame:[null,{setRootFrame:(_,_ref3)=>{let{frame}=_ref3;return frame}}],player:[null,{setPlayer:(_,_ref4)=>{let{player}=_ref4;return player}}],currentTimestamp:[void 0,{setCurrentTimestamp:(_,_ref5)=>{let{timestamp}=_ref5;return timestamp}}],timestampChangeTracking:[{timestamp:null,timestampMatchesPrevious:0},{setCurrentTimestamp:(state,_ref6)=>{let{timestamp}=_ref6;return{timestamp,timestampMatchesPrevious:null!==state.timestamp&&state.timestamp===timestamp?state.timestampMatchesPrevious+1:0}},skipPlayerForward:()=>({timestamp:null,timestampMatchesPrevious:0})}],currentSegment:[null,{setCurrentSegment:(_,_ref7)=>{let{segment}=_ref7;return segment}}],isSkippingInactivity:[!1,{setSkippingInactivity:(_,_ref8)=>{let{isSkippingInactivity}=_ref8;return isSkippingInactivity}}],scale:[1,{setScale:(_,_ref9)=>{let{scale}=_ref9;return scale}}],playingState:[src_types.Yy.PLAY,{setPlay:()=>src_types.Yy.PLAY,setPause:()=>src_types.Yy.PAUSE}],playingTimeTracking:[{isPlaying:!1,isBuffering:!1,lastTimestamp:null,watchTime:0,bufferTime:0},{startBuffer:state=>({isPlaying:!1,isBuffering:!0,lastTimestamp:(state.isBuffering?state.lastTimestamp:performance.now())||performance.now(),watchTime:state.watchTime,bufferTime:state.bufferTime}),stopBuffer:state=>({isPlaying:state.isPlaying,isBuffering:!1,lastTimestamp:null,watchTime:state.watchTime,bufferTime:null!==state.lastTimestamp?state.bufferTime+(performance.now()-state.lastTimestamp):state.bufferTime}),setPlay:state=>({isPlaying:!0,isBuffering:!1,lastTimestamp:(state.isPlaying?state.lastTimestamp:performance.now())||performance.now(),watchTime:state.watchTime,bufferTime:state.bufferTime}),setPause:state=>({isPlaying:!1,isBuffering:state.isBuffering,lastTimestamp:null,watchTime:null!==state.lastTimestamp?state.watchTime+(performance.now()-state.lastTimestamp):state.watchTime,bufferTime:state.bufferTime}),setEndReached:(state,_ref10)=>{let{reached}=_ref10;return reached?{isPlaying:!1,isBuffering:state.isBuffering,lastTimestamp:null,watchTime:null!==state.lastTimestamp?state.watchTime+(performance.now()-state.lastTimestamp):state.watchTime,bufferTime:state.bufferTime}:state},setPlayerError:state=>({isPlaying:state.isPlaying,isBuffering:state.isBuffering,lastTimestamp:null,watchTime:null!==state.lastTimestamp?state.watchTime+(performance.now()-state.lastTimestamp):state.watchTime,bufferTime:state.bufferTime}),seekToTime:state=>({...state,lastTimestamp:state.isPlaying&&null===state.lastTimestamp?performance.now():state.lastTimestamp})}],isBuffering:[!0,{startBuffer:()=>!0,endBuffer:()=>!1}],playerError:[null,{setPlayerError:(_,_ref11)=>{let{reason}=_ref11;return reason.trim().length?reason:null},clearPlayerError:()=>null}],isScrubbing:[!1,{startScrub:()=>!0,endScrub:()=>!1}],errorCount:[0,{incrementErrorCount:prevErrorCount=>prevErrorCount+1}],warningCount:[0,{incrementWarningCount:(prevWarningCount,_ref12)=>{let{count}=_ref12;return prevWarningCount+count}}],endReached:[!1,{setEndReached:(_,_ref13)=>{let{reached}=_ref13;return reached},tryInitReplayer:()=>!1,setCurrentTimestamp:()=>!1}],explorerMode:[null,{setExplorerProps:(_,_ref14)=>{let{props}=_ref14;return props},closeExplorer:()=>null}],isFullScreen:[!1,{setIsFullScreen:(_,_ref15)=>{let{isFullScreen}=_ref15;return isFullScreen}}],debugSettings:[{types:[types.tw.FullSnapshot,types.tw.IncrementalSnapshot],incrementalSources:[types.yh.Mutation]},{setDebugSnapshotTypes:(s,_ref16)=>{let{types}=_ref16;return{...s,types}},setDebugSnapshotIncrementalSources:(s,_ref17)=>{let{incrementalSources}=_ref17;return{...s,incrementalSources}}}]})),(0,index_esm.selectors)({sessionRecordingId:[()=>[(_,props)=>props],props=>props.sessionRecordingId],logicProps:[()=>[(_,props)=>props],props=>props],playlistLogic:[()=>[(_,props)=>props],props=>props.playlistLogic],roughAnimationFPS:[s=>[s.playerSpeed],playerSpeed=>playerSpeed*(1e3/60)],currentPlayerState:[s=>[s.playingState,s.isBuffering,s.playerError,s.isScrubbing,s.isSkippingInactivity,s.snapshotsLoaded,s.snapshotsLoading],(playingState,isBuffering,playerError,isScrubbing,isSkippingInactivity,snapshotsLoaded,snapshotsLoading)=>{switch(!0){case isScrubbing:return playingState;case!snapshotsLoaded&&!snapshotsLoading:return src_types.Yy.READY;case!!playerError?.trim().length:return src_types.Yy.ERROR;case isSkippingInactivity&&playingState!==src_types.Yy.PAUSE:return src_types.Yy.SKIP;case isBuffering:return src_types.Yy.BUFFER;default:return playingState}}],currentPlayerTime:[s=>[s.currentTimestamp,s.sessionPlayerData],(currentTimestamp,sessionPlayerData)=>{var _sessionPlayerData$st;return Math.max(0,(null!=currentTimestamp?currentTimestamp:0)-(null!==(_sessionPlayerData$st=sessionPlayerData?.start?.valueOf())&&void 0!==_sessionPlayerData$st?_sessionPlayerData$st:0))}],toRRWebPlayerTime:[s=>[s.sessionPlayerData,s.currentSegment],(sessionPlayerData,currentSegment)=>timestamp=>{if(!currentSegment||!currentSegment.windowId)return;let snapshots=sessionPlayerData.snapshotsByWindowId[currentSegment.windowId];return Math.max(0,timestamp-snapshots[0].timestamp)}],fromRRWebPlayerTime:[s=>[s.sessionPlayerData,s.currentSegment],(sessionPlayerData,currentSegment)=>time=>{if(void 0===time||!currentSegment?.windowId)return;let snapshots=sessionPlayerData.snapshotsByWindowId[currentSegment.windowId];return snapshots[0].timestamp+time}],jumpTimeMs:[selectors=>[selectors.speed],speed=>1e4*speed],playerSpeed:[s=>[s.speed,s.isSkippingInactivity,s.currentSegment,s.currentTimestamp,(_,props)=>props.mode],(speed,isSkippingInactivity,currentSegment,currentTimestamp,mode)=>{if(mode===SessionRecordingPlayerMode.Preview)return 360;if(isSkippingInactivity){var _currentSegment$endTi;let secondsToSkip=((null!==(_currentSegment$endTi=currentSegment?.endTimestamp)&&void 0!==_currentSegment$endTi?_currentSegment$endTi:0)-(null!=currentTimestamp?currentTimestamp:0))/1e3;return Math.max(50,secondsToSkip)}return speed}],segmentForTimestamp:[s=>[s.sessionPlayerData],sessionPlayerData=>timestamp=>{if(void 0===timestamp)return null;if(sessionPlayerData.segments.length){for(let segment of sessionPlayerData.segments)if(segment.startTimestamp<=timestamp&×tamp<=segment.endTimestamp)return segment;return{kind:"buffer",startTimestamp:timestamp,endTimestamp:sessionPlayerData.segments[0].startTimestamp-1,isActive:!1}}return null}],debugSnapshots:[s=>[s.sessionPlayerData,s.debugSettings],(sessionPlayerData,debugSettings)=>{let allSnapshots=Object.values(sessionPlayerData.snapshotsByWindowId).flat(),visualSnapshots=allSnapshots.filter(s=>debugSettings.types.includes(s.type)&&(s.type!=types.tw.IncrementalSnapshot||debugSettings.incrementalSources.includes(s.data.source)));return visualSnapshots.sort((a,b)=>a.timestamp-b.timestamp)}]}),(0,index_esm.listeners)(_ref18=>{let{props,values,actions,cache}=_ref18;return{playerErrorSeen:_ref19=>{let{error}=_ref19,fingerprint=encodeURIComponent(error.message+error.filename+error.lineno+error.colno);if(values.reportedReplayerErrors.has(fingerprint))return;let extra={fingerprint,playbackSessionId:values.sessionRecordingId};(0,esm_exports.Tb)(error,{extra,tags:{feature:"replayer error swallowed"}}),dist_module.ZP.config.debug&&dist_module.ZP.capture("replayer error swallowed",extra),actions.fingerprintReported(fingerprint)},skipPlayerForward:_ref20=>{let{rrWebPlayerTime,skip}=_ref20;values.player?.replayer?.play(rrWebPlayerTime+skip),dist_module.ZP.capture("stuck session player skipped forward",{sessionId:values.sessionRecordingId,rrWebTime:rrWebPlayerTime})},setRootFrame:()=>{actions.tryInitReplayer()},tryInitReplayer:()=>{let windowId=values.segmentForTimestamp(values.currentTimestamp)?.windowId;if(actions.setPlayer(null),values.rootFrame&&(values.rootFrame.innerHTML=""),!values.rootFrame||void 0===windowId||!values.sessionPlayerData.snapshotsByWindowId[windowId]||values.sessionPlayerData.snapshotsByWindowId[windowId].length<2){actions.setPlayer(null);return}let plugins=[rrweb.Xi];(values.preflight?.cloud||"localhost"===window.location.hostname)&&plugins.push(rrweb.AZ),plugins.push(CanvasReplayerPlugin(values.sessionPlayerData.snapshotsByWindowId[windowId])),cache.debug?.("tryInitReplayer",{windowId,rootFrame:values.rootFrame,snapshots:values.sessionPlayerData.snapshotsByWindowId[windowId]});let config={root:values.rootFrame,...rrweb.sl,mouseTail:values.showMouseTail&&props.mode!==SessionRecordingPlayerMode.Preview,useVirtualDom:!1,plugins,onError:error=>{actions.playerErrorSeen(error)}},replayer=new replay.x(values.sessionPlayerData.snapshotsByWindowId[windowId],config);actions.setPlayer({replayer,windowId})},setPlayer:_ref21=>{let{player}=_ref21;player&&(void 0!==values.currentTimestamp&&actions.seekToTimestamp(values.currentTimestamp),actions.syncPlayerSpeed())},setCurrentSegment:_ref22=>{let{segment}=_ref22;!segment.isActive&&values.skipInactivitySetting&&"buffer"!==segment.kind?actions.setSkippingInactivity(!0):actions.setSkippingInactivity(!1),values.player&&values.player.windowId===segment.windowId||(values.player?.replayer?.pause(),actions.tryInitReplayer()),void 0!==values.currentTimestamp&&actions.seekToTimestamp(values.currentTimestamp)},setSkipInactivitySetting:_ref23=>{let{skipInactivitySetting}=_ref23;!values.currentSegment?.isActive&&skipInactivitySetting?actions.setSkippingInactivity(!0):actions.setSkippingInactivity(!1)},setSkippingInactivity:()=>{actions.syncPlayerSpeed()},syncPlayerSpeed:()=>{values.player?.replayer?.setConfig({speed:values.playerSpeed})},checkBufferingCompleted:()=>{if(void 0===values.currentTimestamp)return;let isBuffering=values.segmentForTimestamp(values.currentTimestamp)?.kind==="buffer";values.currentPlayerState!==src_types.Yy.BUFFER||isBuffering||(actions.endBuffer(),actions.seekToTimestamp(values.currentTimestamp))},initializePlayerFromStart:()=>{let initialSegment=values.sessionPlayerData?.segments[0];if(initialSegment){if(!cache.hasInitialized){cache.hasInitialized=!0;let searchParams=lib.router.values.searchParams;if(searchParams.timestamp){let desiredStartTime=Number(searchParams.timestamp);actions.seekToTimestamp(desiredStartTime,!0)}else if(searchParams.t){let desiredStartTime=1e3*Number(searchParams.t);actions.seekToTime(desiredStartTime)}}values.currentTimestamp||actions.setCurrentTimestamp(initialSegment.startTimestamp),actions.setCurrentSegment(initialSegment)}},syncSnapshotsWithPlayer:async(_,breakpoint)=>{var _values$player$replay,_values$sessionPlayer;let currentEvents=null!==(_values$player$replay=values.player?.replayer?.service.state.context.events)&&void 0!==_values$player$replay?_values$player$replay:[],eventsToAdd=[];if(values.currentSegment?.windowId!==void 0&&eventsToAdd.push(...(null!==(_values$sessionPlayer=values.sessionPlayerData.snapshotsByWindowId[values.currentSegment?.windowId])&&void 0!==_values$sessionPlayer?_values$sessionPlayer:[]).slice(currentEvents.length)),values.player?.replayer)for(let event of eventsToAdd)values.player?.replayer?.addEvent(event);values.currentTimestamp||actions.initializePlayerFromStart(),actions.checkBufferingCompleted(),breakpoint()},loadRecordingMetaSuccess:()=>{actions.syncSnapshotsWithPlayer(),props.autoPlay&&(actions.setPlay(),lib.router.values.searchParams.pause&&setTimeout(()=>{actions.setPause()},400))},loadSnapshotsForSourceFailure:()=>{0===Object.keys(values.sessionPlayerData.snapshotsByWindowId).length&&(console.error("PostHog Recording Playback Error: No snapshots loaded"),actions.setPlayerError("loadSnapshotsForSourceFailure"))},loadSnapshotSourcesFailure:()=>{0===Object.keys(values.sessionPlayerData.snapshotsByWindowId).length&&(console.error("PostHog Recording Playback Error: No snapshots loaded"),actions.setPlayerError("loadSnapshotSourcesFailure"))},setPlay:()=>{values.snapshotsLoaded||actions.loadSnapshots(),actions.stopAnimation(),actions.restartIframePlayback(),actions.syncPlayerSpeed();let nextTimestamp=values.currentTimestamp||values.currentSegment?.startTimestamp;values.endReached&&(nextTimestamp=values.sessionPlayerData.segments[0].startTimestamp),actions.setEndReached(!1),void 0!==nextTimestamp&&actions.seekToTimestamp(nextTimestamp,!0)},setPause:()=>{actions.stopAnimation(),actions.pauseIframePlayback(),actions.syncPlayerSpeed(),values.player?.replayer?.pause(),cache.debug?.("pause",{currentTimestamp:values.currentTimestamp,currentSegment:values.currentSegment})},setEndReached:_ref24=>{let{reached}=_ref24;reached&&(actions.setPause(),values.wasMarkedViewed||actions.markViewed(0))},startBuffer:()=>{actions.stopAnimation()},setPlayerError:()=>{actions.incrementErrorCount(),actions.stopAnimation()},startScrub:()=>{actions.stopAnimation()},setSpeed:()=>{props.mode!==SessionRecordingPlayerMode.Preview&&actions.syncPlayerSpeed()},seekToTimestamp:(_ref25,breakpoint)=>{let{timestamp,forcePlay}=_ref25;actions.stopAnimation(),cache.pausedMediaElements=[],actions.setCurrentTimestamp(timestamp);let segment=values.segmentForTimestamp(timestamp);if(segment&&!(0,utils.h0)(segment,values.currentSegment))actions.setCurrentSegment(segment);else if(segment?.kind==="buffer"){let isPastEnd=values.sessionPlayerData.end&×tamp>=values.sessionPlayerData.end.valueOf();isPastEnd?actions.setEndReached(!0):(values.player?.replayer?.pause(),actions.startBuffer(),actions.clearPlayerError())}else forcePlay||values.currentPlayerState!==src_types.Yy.PAUSE?(values.player?.replayer?.play(values.toRRWebPlayerTime(timestamp)),actions.updateAnimation()):values.player?.replayer?.pause(values.toRRWebPlayerTime(timestamp)),actions.endBuffer(),actions.clearPlayerError();breakpoint()},seekForward:_ref26=>{let{amount=values.jumpTimeMs}=_ref26;actions.seekToTime((values.currentPlayerTime||0)+amount)},seekBackward:_ref27=>{let{amount=values.jumpTimeMs}=_ref27;actions.seekToTime((values.currentPlayerTime||0)-amount)},seekToTime:_ref28=>{let{timeInMilliseconds}=_ref28;if(void 0===values.currentTimestamp||!values.sessionPlayerData.start||!values.sessionPlayerData.end)return;let newTimestamp=(0,utils.uZ)(values.sessionPlayerData.start.valueOf()+timeInMilliseconds,values.sessionPlayerData.start.valueOf(),values.sessionPlayerData.end.valueOf());actions.seekToTimestamp(newTimestamp)},togglePlayPause:()=>{values.playingState===src_types.Yy.PAUSE?actions.setPlay():actions.setPause()},updateAnimation:()=>{let rrwebPlayerTime=values.player?.replayer?.getCurrentTime(),newTimestamp=values.fromRRWebPlayerTime(rrwebPlayerTime);if(void 0==newTimestamp&&values.currentTimestamp&&values.currentSegment?.kind==="gap"&&(cache.debug?.("gap segment: skipping forward"),newTimestamp=values.currentTimestamp+values.roughAnimationFPS),values.currentSegment?.kind==="buffer"){values.player?.replayer?.pause(),actions.startBuffer(),actions.clearPlayerError(),cache.debug("buffering");return}if(void 0!=newTimestamp){if(values.currentSegment&&newTimestamp>values.currentSegment.endTimestamp){let nextSegment=values.segmentForTimestamp(newTimestamp);nextSegment?(actions.setCurrentTimestamp(Math.max(newTimestamp,nextSegment.startTimestamp)),actions.setCurrentSegment(nextSegment)):(cache.debug("end of recording reached",{newTimestamp,segments:values.sessionPlayerData.segments,currentSegment:values.currentSegment,nextSegment,segmentIndex:values.sessionPlayerData.segments.indexOf(values.currentSegment)}),actions.setEndReached());return}actions.setCurrentTimestamp(newTimestamp),cache.timer=requestAnimationFrame(actions.updateAnimation)}},stopAnimation:()=>{cache.timer&&cancelAnimationFrame(cache.timer)},pauseIframePlayback:()=>{let iframe=values.rootFrame?.querySelector("iframe"),iframeDocument=iframe?.contentWindow?.document;if(!iframeDocument)return;let audioElements=Array.from(iframeDocument.getElementsByTagName("audio")),videoElements=Array.from(iframeDocument.getElementsByTagName("video")),mediaElements=[...audioElements,...videoElements],playingElements=mediaElements.filter(isMediaElementPlaying);playingElements.forEach(el=>el.pause()),cache.pausedMediaElements=values.endReached?[]:playingElements},restartIframePlayback:()=>{cache.pausedMediaElements?.forEach(el=>el.play()),cache.pausedMediaElements=[]},exportRecordingToFile:async _ref29=>{let{exportUntransformedMobileData}=_ref29;if(!values.sessionPlayerData)return;if(!values.user?.is_impersonated&&!values.hasAvailableFeature(src_types.P$.RECORDINGS_FILE_EXPORT)){(0,BillingPopup.r)({title:"Unlock recording exports",description:"Export recordings to a file that can be stored wherever you like and loaded back into PostHog for playback at any time."});return}let doExport=async()=>{let maxWaitTime=3e4;for(;!values.sessionPlayerData.fullyLoaded;){if(maxWaitTime<=0)throw Error("Timeout waiting for recording to load");maxWaitTime-=1e3,await (0,kea_test_utils_lib.delay)(1e3)}let payload=values.createExportJSON(!!exportUntransformedMobileData),recordingFile=new File([JSON.stringify(payload,null,2)],`export-${props.sessionRecordingId}.${exportUntransformedMobileData?"mobile.":""}ph-recording.json`,{type:"application/json"});(0,utils.Sv)(recordingFile),actions.reportRecordingExportedToFile()};await src.UJ.promise(doExport(),{success:"Export complete!",error:"Export failed!",pending:"Exporting recording..."})},deleteRecording:async()=>{await (0,playerUtils.Mj)(props.sessionRecordingId),props.playlistLogic?(props.playlistLogic.actions.loadAllRecordings(),props.playlistLogic.actions.setSelectedRecordingId(null)):lib.router.values.location.pathname.includes("/replay")&&lib.router.actions.push(urls.j.replay())},openExplorer:()=>{actions.setPause();let iframe=values.rootFrame?.querySelector("iframe"),iframeHtml=iframe?.contentWindow?.document?.documentElement?.innerHTML;iframeHtml&&actions.setExplorerProps({html:iframeHtml,width:parseFloat(iframe.width),height:parseFloat(iframe.height)})},setIsFullScreen:async _ref30=>{let{isFullScreen}=_ref30;if(isFullScreen)try{await props.playerRef?.current?.requestFullscreen()}catch(e){console.warn("Failed to enable native full-screen mode:",e)}else document.fullscreenElement===props.playerRef?.current&&await document.exitFullscreen()}}}),(0,kea_subscriptions_lib.Vt)(_ref31=>{let{actions,values}=_ref31;return{sessionPlayerData:(next,prev)=>{let hasSnapshotChanges=next?.snapshotsByWindowId!==prev?.snapshotsByWindowId;hasSnapshotChanges&&actions.syncSnapshotsWithPlayer()},timestampChangeTracking:next=>{if(next.timestampMatchesPrevious<10)return;let rrwebPlayerTime=values.player?.replayer?.getCurrentTime();void 0!==rrwebPlayerTime&&values.currentPlayerState===src_types.Yy.PLAY&&actions.skipPlayerForward(rrwebPlayerTime,values.roughAnimationFPS)},playerError:next=>{next&&dist_module.ZP.capture("recording player error",{watchedSessionId:values.sessionRecordingId,currentTimestamp:values.currentTimestamp,currentSegment:values.currentSegment,currentPlayerTime:values.currentPlayerTime,error:next})}}}),(0,index_esm.beforeUnmount)(_ref32=>{var _now$diff;let{values,actions,cache,props}=_ref32;if(props.mode===SessionRecordingPlayerMode.Preview){values.player?.replayer?.destroy();return}delete window.__debug_player,actions.stopAnimation(),cache.hasInitialized=!1,document.removeEventListener("fullscreenchange",cache.fullScreenListener),cache.pausedMediaElements=[],values.player?.replayer?.destroy(),actions.setPlayer(null),cache.unmountConsoleWarns?.();let playTimeMs=values.playingTimeTracking.watchTime||0,summaryAnalytics={viewed_time_ms:void 0!==cache.openTime?performance.now()-cache.openTime:void 0,play_time_ms:playTimeMs,buffer_time_ms:values.playingTimeTracking.bufferTime||0,recording_duration_ms:values.sessionPlayerData?values.sessionPlayerData.durationMs:void 0,recording_age_ms:values.sessionPlayerData&&values.sessionPlayerData.segments.length>0?Math.floor(null!==(_now$diff=(0,dayjs.zO)().diff(values.sessionPlayerData.start,"millisecond"))&&void 0!==_now$diff?_now$diff:0):void 0,rrweb_warning_count:values.warningCount,error_count_during_recording_playback:values.errorCount,engagement_score:values.clickCount};dist_module.ZP.capture(0===playTimeMs?"recording viewed with no playtime summary":"recording viewed summary",summaryAnalytics)}),(0,index_esm.afterMount)(_ref33=>{let{props,actions,cache,values}=_ref33;cache.debugging="true"===localStorage.getItem("ph_debug_player"),cache.debug=function(){if(cache.debugging){for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];console.log("[⏯️ PostHog Replayer]",...args)}},window.__debug_player=()=>{cache.debugging=!cache.debugging,localStorage.setItem("ph_debug_player",JSON.stringify(cache.debugging)),cache.debug("player data",values.sessionPlayerData)},props.mode!==SessionRecordingPlayerMode.Preview&&(cache.pausedMediaElements=[],cache.fullScreenListener=()=>{actions.setIsFullScreen(null!==document.fullscreenElement)},document.addEventListener("fullscreenchange",cache.fullScreenListener),props.sessionRecordingId&&actions.maybeLoadRecordingMeta(),cache.openTime=performance.now(),cache.unmountConsoleWarns=manageConsoleWarns(cache,actions.incrementWarningCount))})]),getCurrentPlayerTime=logicProps=>{let playerTime=sessionRecordingPlayerLogic.findMounted(logicProps)?.values.currentPlayerTime||0;return Math.floor(playerTime/1e3)},manageConsoleWarns=(cache,onIncrement)=>{window.__posthog_player_warnings=[];let warnings=window.__posthog_player_warnings,counter=0,consoleWarnDebounceTimer=null,actualConsoleWarn=console.warn,debouncedCounter=args=>{warnings.push(args),counter+=1,consoleWarnDebounceTimer||(consoleWarnDebounceTimer=setTimeout(()=>{consoleWarnDebounceTimer=null,onIncrement(warnings.length),actualConsoleWarn(`[PostHog Replayer] ${counter} warnings (window.__posthog_player_warnings to safely log them)`),counter=0},1e3))},resetConsoleWarn=function(level,fn){let wrappedFn=console[level],inWrap=!1;return console[level]=function(){try{for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];if(inWrap){wrappedFn(...args);return}inWrap=!0,fn(args)&&wrappedFn(...args)}finally{inWrap=!1}},()=>{console[level]=wrappedFn}}("warn",args=>!("string"==typeof args[0]&&args[0].includes("[replayer]"))||(debouncedCounter(args),!1));return()=>{resetConsoleWarn(),clearTimeout(cache.consoleWarnDebounceTimer)}}},"./frontend/src/scenes/session-recordings/player/utils/playerUtils.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{DL:()=>THUMB_OFFSET,G2:()=>getXPos,Mj:()=>deleteRecording,Of:()=>addRecordingToPlaylist,ne:()=>removeRecordingFromPlaylist,x9:()=>THUMB_SIZE});var kea_router__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/api.ts"),lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/lemon-ui/LemonToast/LemonToast.tsx"),scenes_urls__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/scenes/urls.ts");let THUMB_SIZE=15,THUMB_OFFSET=THUMB_SIZE/2,getXPos=event=>{if("touches"in event){var _event$touches$0$page;return null!==(_event$touches$0$page=event?.touches?.[0]?.pageX)&&void 0!==_event$touches$0$page?_event$touches$0$page:event?.changedTouches?.[0]?.pageX}return"clientX"in event?event?.clientX:0};async function addRecordingToPlaylist(playlistId,sessionRecordingId){let silent=arguments.length>2&&void 0!==arguments[2]&&arguments[2];await lib_api__WEBPACK_IMPORTED_MODULE_1__.ZP.recordings.addRecordingToPlaylist(playlistId,sessionRecordingId),silent||lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_2__.UJ.success("Recording added to playlist",{button:{label:"View playlist",action:()=>kea_router__WEBPACK_IMPORTED_MODULE_0__.router.actions.push(scenes_urls__WEBPACK_IMPORTED_MODULE_3__.j.replayPlaylist(playlistId))}})}async function removeRecordingFromPlaylist(playlistId,sessionRecordingId){let silent=arguments.length>2&&void 0!==arguments[2]&&arguments[2];await lib_api__WEBPACK_IMPORTED_MODULE_1__.ZP.recordings.removeRecordingFromPlaylist(playlistId,sessionRecordingId),silent||lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_2__.UJ.success("Recording removed from playlist")}async function deleteRecording(recordingId){let silent=arguments.length>1&&void 0!==arguments[1]&&arguments[1];await lib_api__WEBPACK_IMPORTED_MODULE_1__.ZP.recordings.delete(recordingId),silent||lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_2__.UJ.success("Recording deleted")}},"./frontend/src/scenes/session-recordings/playlist/SessionRecordingPreview.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{D7:()=>PropertyIcons,FU:()=>SessionRecordingPreview,Sm:()=>SessionRecordingPreviewSkeleton});var _posthog_icons__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/@posthog+icons@0.9.2_react-dom@18.2.0_react@18.2.0/node_modules/@posthog/icons/dist/posthog-icons.es.js"),clsx__WEBPACK_IMPORTED_MODULE_18__=__webpack_require__("./node_modules/.pnpm/clsx@1.2.1/node_modules/clsx/dist/clsx.m.js"),kea__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),lib_components_PropertyIcon__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/components/PropertyIcon.tsx"),lib_components_TZLabel__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/lib/components/TZLabel/index.tsx"),lib_constants__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/constants.tsx"),lib_lemon_ui_LemonSkeleton__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/lib/lemon-ui/LemonSkeleton/index.ts"),lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/lib/lemon-ui/Tooltip/index.ts"),lib_logic_featureFlagLogic__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./frontend/src/lib/logic/featureFlagLogic.ts"),lib_utils__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./frontend/src/lib/utils.tsx"),scenes_notebooks_AddToNotebook_DraggableToNotebook__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__("./frontend/src/scenes/notebooks/AddToNotebook/DraggableToNotebook.tsx"),scenes_persons_person_utils__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__("./frontend/src/scenes/persons/person-utils.ts"),scenes_session_recordings_components_SimpleTimeLabel__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__("./frontend/src/scenes/session-recordings/components/SimpleTimeLabel.tsx"),scenes_session_recordings_player_playerMetaLogic__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__("./frontend/src/scenes/session-recordings/player/playerMetaLogic.tsx"),scenes_session_recordings_player_playerSettingsLogic__WEBPACK_IMPORTED_MODULE_13__=__webpack_require__("./frontend/src/scenes/session-recordings/player/playerSettingsLogic.ts"),scenes_urls__WEBPACK_IMPORTED_MODULE_14__=__webpack_require__("./frontend/src/scenes/urls.ts"),_sessionRecordingsListPropertiesLogic__WEBPACK_IMPORTED_MODULE_15__=__webpack_require__("./frontend/src/scenes/session-recordings/playlist/sessionRecordingsListPropertiesLogic.ts"),_sessionRecordingsPlaylistLogic__WEBPACK_IMPORTED_MODULE_16__=__webpack_require__("./frontend/src/scenes/session-recordings/playlist/sessionRecordingsPlaylistLogic.ts"),react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");function RecordingDuration(_ref){let{recordingDuration}=_ref;if(void 0===recordingDuration)return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("div",{className:"flex text-muted text-xs",children:"-"});let formattedDuration=(0,lib_utils__WEBPACK_IMPORTED_MODULE_8__.Dh)(recordingDuration),[hours,minutes,seconds]=formattedDuration.split(":");return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"flex text-muted text-xs",children:["00"!=hours&&(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("span",{children:[hours,":"]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("span",{children:[minutes,":",seconds]})]})}function ErrorCount(_ref2){let{iconClassNames,errorCount}=_ref2;return void 0===errorCount?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("div",{className:"flex items-center flex-1 justify-end font-semibold",children:"-"}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"flex items-center flex-1 space-x-1 justify-end font-semibold",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_posthog_icons__WEBPACK_IMPORTED_MODULE_0__.IconBug,{className:iconClassNames}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("span",{children:errorCount})]})}let browserIconPropertyKeys=["$geoip_country_code","$browser","$device_type","$os"],mobileIconPropertyKeys=["$geoip_country_code","$device_type","$os_name"];function PropertyIcons(_ref3){let{recordingProperties,loading,iconClassNames}=_ref3;return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("div",{className:"flex space-x-1 ph-no-capture",children:loading?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_LemonSkeleton__WEBPACK_IMPORTED_MODULE_5__.y,{className:"w-16 h-3"}):recordingProperties.map(_ref4=>{let{property,value,label}=_ref4;return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__.u,{title:label,children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_components_PropertyIcon__WEBPACK_IMPORTED_MODULE_2__.V,{className:iconClassNames,property:property,value:value})},property)})})}function FirstURL(props){let firstPath=props.startUrl?.replace(/https?:\/\//g,"").split(/[?|#]/)[0];return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("span",{className:"flex overflow-hidden text-muted text-xs",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("span",{title:`First URL: ${props.startUrl}`,className:"truncate",children:firstPath})})}function PinnedIndicator(){let{featureFlags}=(0,kea__WEBPACK_IMPORTED_MODULE_1__.useValues)(lib_logic_featureFlagLogic__WEBPACK_IMPORTED_MODULE_7__.h),isTestingSaved="test"===featureFlags[lib_constants__WEBPACK_IMPORTED_MODULE_4__.y8.SAVED_NOT_PINNED];return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__.u,{placement:"top-end",title:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.Fragment,{children:["This recording is ",isTestingSaved?"saved":"pinned"," to this list."]}),children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_posthog_icons__WEBPACK_IMPORTED_MODULE_0__.IconPinFilled,{className:"text-sm text-orange shrink-0"})})}function RecordingOngoingIndicator(){return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__.u,{title:"This recording is still ongoing - we received data within the last 5 minutes.",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_posthog_icons__WEBPACK_IMPORTED_MODULE_0__.IconLive,{className:"animate-[pulse_1s_ease-out_infinite] text-primary-3000"})})}function UnwatchedIndicator(){return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__.u,{title:"Indicates the recording has not been watched yet",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("div",{className:"w-2 h-2 rounded-full bg-primary-3000","aria-label":"unwatched-recording-label"})})}function SessionRecordingPreview(_ref5){var order;let{recording,isActive,onClick,pinned}=_ref5,{playlistTimestampFormat}=(0,kea__WEBPACK_IMPORTED_MODULE_1__.useValues)(scenes_session_recordings_player_playerSettingsLogic__WEBPACK_IMPORTED_MODULE_13__.NX),{filters}=(0,kea__WEBPACK_IMPORTED_MODULE_1__.useValues)(_sessionRecordingsPlaylistLogic__WEBPACK_IMPORTED_MODULE_16__.YV),{recordingPropertiesById,recordingPropertiesLoading}=(0,kea__WEBPACK_IMPORTED_MODULE_1__.useValues)(_sessionRecordingsListPropertiesLogic__WEBPACK_IMPORTED_MODULE_15__.o),recordingProperties=recordingPropertiesById[recording.id],loading=!recordingProperties&&recordingPropertiesLoading,iconProperties=function(recordingProperties,recording){let iconProperties=recordingProperties&&Object.keys(recordingProperties).length>0?recordingProperties:recording?.person?.properties||{},deviceType=iconProperties.$device_type||iconProperties.$initial_device_type;return("Mobile"===deviceType?mobileIconPropertyKeys:browserIconPropertyKeys).flatMap(property=>{let value="$device_type"===property?deviceType:iconProperties[property],label="$geoip_country_code"===property?(0,scenes_session_recordings_player_playerMetaLogic__WEBPACK_IMPORTED_MODULE_12__.Z)(iconProperties):value;return{property,value,label}}).filter(property=>!!property.value)}(recordingProperties,recording),iconClassNames="text-muted-alt shrink-0";return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(scenes_notebooks_AddToNotebook_DraggableToNotebook__WEBPACK_IMPORTED_MODULE_9__.m,{href:scenes_urls__WEBPACK_IMPORTED_MODULE_14__.j.replaySingle(recording.id),children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:(0,clsx__WEBPACK_IMPORTED_MODULE_18__.default)("SessionRecordingPreview flex overflow-hidden cursor-pointer py-0.5 px-1 text-xs",isActive&&"SessionRecordingPreview--active"),onClick:()=>onClick?.(),children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"grow overflow-hidden space-y-1",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"flex items-center justify-between space-x-0.5",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("div",{className:"flex overflow-hidden font-medium text-link ph-no-capture",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("span",{className:"truncate",children:(0,scenes_persons_person_utils__WEBPACK_IMPORTED_MODULE_10__.y)(recording.person)})}),playlistTimestampFormat===scenes_session_recordings_player_playerSettingsLogic__WEBPACK_IMPORTED_MODULE_13__.B_.Relative?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_components_TZLabel__WEBPACK_IMPORTED_MODULE_3__.w,{className:"overflow-hidden text-ellipsis text-xs text-muted shrink-0",time:recording.start_time,placement:"right"}):playlistTimestampFormat===scenes_session_recordings_player_playerSettingsLogic__WEBPACK_IMPORTED_MODULE_13__.B_.UTC?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(scenes_session_recordings_components_SimpleTimeLabel__WEBPACK_IMPORTED_MODULE_11__.V,{startTime:recording.start_time,isUTC:!0}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(scenes_session_recordings_components_SimpleTimeLabel__WEBPACK_IMPORTED_MODULE_11__.V,{startTime:recording.start_time,isUTC:!1})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"flex justify-between items-center space-x-0.5",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"flex space-x-2 text-muted text-sm",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(PropertyIcons,{recordingProperties:iconProperties,iconClassNames:iconClassNames,loading:loading}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"flex gap-1",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__.u,{className:"flex items-center",title:"Clicks",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("span",{className:"space-x-0.5",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_posthog_icons__WEBPACK_IMPORTED_MODULE_0__.IconCursorClick,{className:iconClassNames}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("span",{children:recording.click_count})]})}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_Tooltip__WEBPACK_IMPORTED_MODULE_6__.u,{className:"flex items-center",title:"Key presses",children:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("span",{className:"space-x-0.5",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(_posthog_icons__WEBPACK_IMPORTED_MODULE_0__.IconKeyboard,{className:iconClassNames}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)("span",{children:recording.keypress_count})]})})]})]}),"console_error_count"===filters.order?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(ErrorCount,{iconClassNames:iconClassNames,errorCount:recording.console_error_count}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(RecordingDuration,{recordingDuration:"active_seconds"===(order=filters.order||_sessionRecordingsPlaylistLogic__WEBPACK_IMPORTED_MODULE_16__.Rs)?recording.active_seconds:"inactive_seconds"===order?recording.inactive_seconds:recording.recording_duration})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(FirstURL,{startUrl:recording.start_url})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:(0,clsx__WEBPACK_IMPORTED_MODULE_18__.default)("min-w-6 flex flex-col space-x-0.5 items-center",recording.ongoing||pinned?"mt-1":"mt-2"),children:[recording.ongoing?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(RecordingOngoingIndicator,{}):null,pinned?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(PinnedIndicator,{}):null,recording.viewed?null:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(UnwatchedIndicator,{})]})]},recording.id)})}function SessionRecordingPreviewSkeleton(){return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsxs)("div",{className:"p-4 space-y-2",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_LemonSkeleton__WEBPACK_IMPORTED_MODULE_5__.y,{className:"w-1/2 h-4"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_17__.jsx)(lib_lemon_ui_LemonSkeleton__WEBPACK_IMPORTED_MODULE_5__.y,{className:"w-1/3 h-4"})]})}},"./frontend/src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{m:()=>SessionRecordingsPlaylist});var src=__webpack_require__("./frontend/@posthog/lemon-ui/src/index.ts"),index_esm=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),EmptyMessage=__webpack_require__("./frontend/src/lib/components/EmptyMessage/EmptyMessage.tsx"),Playlist=__webpack_require__("./frontend/src/lib/components/Playlist/Playlist.tsx"),PropertyKeyInfo=__webpack_require__("./frontend/src/lib/components/PropertyKeyInfo.tsx"),constants=__webpack_require__("./frontend/src/lib/constants.tsx"),LemonBanner=__webpack_require__("./frontend/src/lib/lemon-ui/LemonBanner/index.ts"),featureFlagLogic=__webpack_require__("./frontend/src/lib/logic/featureFlagLogic.ts"),NotebookNodeContext=__webpack_require__("./frontend/src/scenes/notebooks/Nodes/NotebookNodeContext.ts"),playerSettingsLogic=__webpack_require__("./frontend/src/scenes/session-recordings/player/playerSettingsLogic.ts"),urls=__webpack_require__("./frontend/src/scenes/urls.ts"),types=__webpack_require__("./frontend/src/types.ts"),RecordingsUniversalFilters=__webpack_require__("./frontend/src/scenes/session-recordings/filters/RecordingsUniversalFilters.tsx"),SessionRecordingPlayer=__webpack_require__("./frontend/src/scenes/session-recordings/player/SessionRecordingPlayer.tsx"),SessionRecordingPreview=__webpack_require__("./frontend/src/scenes/session-recordings/playlist/SessionRecordingPreview.tsx"),sessionRecordingsPlaylistLogic=__webpack_require__("./frontend/src/scenes/session-recordings/playlist/sessionRecordingsPlaylistLogic.ts"),posthog_icons_es=__webpack_require__("./node_modules/.pnpm/@posthog+icons@0.9.2_react-dom@18.2.0_react@18.2.0/node_modules/@posthog/icons/dist/posthog-icons.es.js"),PanelSettings=__webpack_require__("./frontend/src/scenes/session-recordings/components/PanelSettings.tsx"),utils=__webpack_require__("./frontend/src/scenes/session-recordings/utils.ts"),jsx_runtime=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");let SortingKeyToLabel={start_time:"Latest",activity_score:"Activity",console_error_count:"Errors",duration:"Total duration",active_seconds:"Activity",inactive_seconds:"Inactivity",click_count:"Clicks",keypress_count:"Keystrokes",mouse_activity_count:"Mouse activity"};function SortedBy(_ref){let{filters,setFilters}=_ref;return(0,jsx_runtime.jsx)(PanelSettings.Tx,{highlightWhenActive:!1,items:[{label:"Latest",onClick:()=>setFilters({order:"start_time"}),active:"start_time"===filters.order},{label:"Activity",onClick:()=>setFilters({order:"activity_score"}),active:"activity_score"===filters.order},{label:"Errors",onClick:()=>setFilters({order:"console_error_count"}),active:"console_error_count"===filters.order},{label:"Longest",items:[{label:"Total duration",onClick:()=>setFilters({order:"duration"}),active:"duration"===filters.order},{label:"Activity",onClick:()=>setFilters({order:"active_seconds"}),active:"active_seconds"===filters.order},{label:"Inactivity",onClick:()=>setFilters({order:"inactive_seconds"}),active:"inactive_seconds"===filters.order}]},{label:"Most active",items:[{label:"Clicks",onClick:()=>setFilters({order:"click_count"}),active:"click_count"===filters.order},{label:"Keystrokes",onClick:()=>setFilters({order:"keypress_count"}),active:"keypress_count"===filters.order},{label:"Mouse activity",onClick:()=>setFilters({order:"mouse_activity_count"}),active:"mouse_activity_count"===filters.order}]}],icon:(0,jsx_runtime.jsx)(posthog_icons_es.IconSort,{className:"text-lg"}),label:SortingKeyToLabel[filters.order||"start_time"]})}function SessionRecordingPlaylistBottomSettings(){let{hideViewedRecordings,playlistTimestampFormat}=(0,index_esm.useValues)(playerSettingsLogic.NX),{setHideViewedRecordings,setPlaylistTimestampFormat}=(0,index_esm.useActions)(playerSettingsLogic.NX);return(0,jsx_runtime.jsxs)(PanelSettings.h0,{border:"top",children:[(0,jsx_runtime.jsx)(PanelSettings.wy,{active:hideViewedRecordings,title:"Hide viewed recordings",label:"Hide viewed recordings",onClick:()=>setHideViewedRecordings(!hideViewedRecordings)}),(0,jsx_runtime.jsx)(PanelSettings.Tx,{highlightWhenActive:!1,items:[{label:"UTC",onClick:()=>setPlaylistTimestampFormat(playerSettingsLogic.B_.UTC),active:playlistTimestampFormat===playerSettingsLogic.B_.UTC},{label:"Device",onClick:()=>setPlaylistTimestampFormat(playerSettingsLogic.B_.Device),active:playlistTimestampFormat===playerSettingsLogic.B_.Device},{label:"Relative",onClick:()=>setPlaylistTimestampFormat(playerSettingsLogic.B_.Relative),active:playlistTimestampFormat===playerSettingsLogic.B_.Relative}],icon:(0,jsx_runtime.jsx)(posthog_icons_es.IconClock,{}),label:utils.BV[playlistTimestampFormat]})]})}function SessionRecordingsPlaylistTopSettings(_ref2){let{filters,setFilters}=_ref2,{autoplayDirection,playbackMode}=(0,index_esm.useValues)(playerSettingsLogic.NX),{setAutoplayDirection,setPlaybackMode}=(0,index_esm.useActions)(playerSettingsLogic.NX);return(0,jsx_runtime.jsxs)(PanelSettings.h0,{border:"none",className:"justify-end",children:[filters&&setFilters?(0,jsx_runtime.jsx)(SortedBy,{filters:filters,setFilters:setFilters}):null,(0,jsx_runtime.jsx)(PanelSettings.Tx,{items:[{label:"Autoplay",items:[{label:"Off",onClick:()=>setAutoplayDirection(null),active:!autoplayDirection},{label:"Newer recordings",onClick:()=>setAutoplayDirection("newer"),active:"newer"===autoplayDirection},{label:"Older recordings",onClick:()=>setAutoplayDirection("older"),active:"older"===autoplayDirection}]},{label:"Playback mode",items:[{label:"Recordings",onClick:()=>setPlaybackMode(playerSettingsLogic.dq.Recording),active:playbackMode===playerSettingsLogic.dq.Recording},{label:"Waterfall",onClick:()=>setPlaybackMode(playerSettingsLogic.dq.Waterfall),active:playbackMode===playerSettingsLogic.dq.Waterfall}]}],icon:(0,jsx_runtime.jsx)(posthog_icons_es.IconEllipsis,{className:"rotate-90"})})]})}let SessionRecordingsPlaylistTroubleshooting=()=>{let{hideViewedRecordings}=(0,index_esm.useValues)(playerSettingsLogic.NX),{setHideViewedRecordings}=(0,index_esm.useActions)(playerSettingsLogic.NX),{otherRecordings}=(0,index_esm.useValues)(sessionRecordingsPlaylistLogic.YV),{setShowSettings}=(0,index_esm.useActions)(sessionRecordingsPlaylistLogic.YV);return(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsx)("h3",{className:"title align-center text-muted mb-0",children:"No matching recordings"}),(0,jsx_runtime.jsxs)("div",{className:"flex flex-col space-y-2",children:[(0,jsx_runtime.jsx)("p",{className:"text-muted description m-0",children:"Recordings may not be found for a variety of reasons including:"}),(0,jsx_runtime.jsxs)("ul",{className:"space-y-1",children:[(0,jsx_runtime.jsx)("h5",{children:"All recording sources:"}),otherRecordings.length>0&&hideViewedRecordings&&(0,jsx_runtime.jsxs)("li",{children:["Viewed recordings hidden."," ",(0,jsx_runtime.jsx)(src.rU,{onClick:()=>{setShowSettings(!0),setHideViewedRecordings(!1)},children:"Toggle option"})]}),(0,jsx_runtime.jsx)("li",{children:(0,jsx_runtime.jsx)(src.rU,{to:"https://posthog.com/docs/session-replay/data-retention",target:"_blank",children:"They are outside the retention period"})}),(0,jsx_runtime.jsx)(src.p2,{dashed:!0}),(0,jsx_runtime.jsx)("h5",{children:"Web recordings"}),(0,jsx_runtime.jsx)("li",{children:(0,jsx_runtime.jsx)(src.rU,{to:"https://posthog.com/docs/session-replay/troubleshooting#4-adtracking-blockers",target:"_blank",children:"An ad blocker prevented recording"})}),(0,jsx_runtime.jsx)("li",{children:(0,jsx_runtime.jsx)(src.rU,{to:"https://posthog.com/docs/session-replay/troubleshooting#1-authorized-domains-for-recordings",target:"_blank",children:"Your domain is not authorized"})})]})]})]})};function SessionRecordingsPlaylist(_ref){var _props$autoPlay;let{showContent=!0,...props}=_ref,logicProps={...props,autoPlay:null===(_props$autoPlay=props.autoPlay)||void 0===_props$autoPlay||_props$autoPlay},logic=(0,sessionRecordingsPlaylistLogic.YV)(logicProps),{filters,pinnedRecordings,matchingEventsMatchType,sessionRecordingsResponseLoading,otherRecordings,activeSessionRecordingId,hasNext}=(0,index_esm.useValues)(logic),{maybeLoadSessionRecordings,setSelectedRecordingId,setFilters,setShowOtherRecordings}=(0,index_esm.useActions)(logic),{featureFlags}=(0,index_esm.useValues)(featureFlagLogic.h),isTestingSaved="test"===featureFlags[constants.y8.SAVED_NOT_PINNED],allowReplayHogQLFilters=!!featureFlags[constants.y8.REPLAY_HOGQL_FILTERS],allowReplayFlagsFilters=!!featureFlags[constants.y8.REPLAY_FLAGS_FILTERS],{playlistOpen}=(0,index_esm.useValues)(playerSettingsLogic.NX),notebookNode=(0,NotebookNodeContext.A)(),sections=[];return pinnedRecordings.length&§ions.push({key:"pinned",title:`${isTestingSaved?"Saved":"Pinned"} recordings`,items:pinnedRecordings,render:_ref2=>{let{item,isActive}=_ref2;return(0,jsx_runtime.jsx)(SessionRecordingPreview.FU,{recording:item,isActive:isActive,pinned:!0})},initiallyOpen:!0}),sections.push({key:"other",title:"Other recordings",items:otherRecordings,render:_ref3=>{let{item,isActive}=_ref3;return(0,jsx_runtime.jsx)(SessionRecordingPreview.FU,{recording:item,isActive:isActive,pinned:!1})},footer:(0,jsx_runtime.jsx)("div",{className:"p-4",children:(0,jsx_runtime.jsx)("div",{className:"h-10 flex items-center justify-center gap-2 text-muted-alt",children:sessionRecordingsResponseLoading?(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsx)(src.$j,{textColored:!0})," Loading older recordings"]}):hasNext?(0,jsx_runtime.jsx)(src.Jp,{onClick:()=>maybeLoadSessionRecordings("older"),children:"Load more"}):"No more results"})})}),(0,jsx_runtime.jsx)(index_esm.BindLogic,{logic:sessionRecordingsPlaylistLogic.YV,props:logicProps,children:(0,jsx_runtime.jsxs)("div",{className:"h-full space-y-2",children:[!notebookNode&&(0,jsx_runtime.jsx)(RecordingsUniversalFilters.t,{filters:filters,setFilters:setFilters,className:"border",allowReplayHogQLFilters:allowReplayHogQLFilters,allowReplayFlagsFilters:allowReplayFlagsFilters}),(0,jsx_runtime.jsx)(Playlist.g,{isCollapsed:!playlistOpen,"data-attr":"session-recordings-playlist",notebooksHref:urls.j.replay(types.yd.Home,filters),title:"Results",embedded:!!notebookNode,sections:sections,onChangeSections:activeSections=>setShowOtherRecordings(activeSections.includes("other")),headerActions:(0,jsx_runtime.jsx)(SessionRecordingsPlaylistTopSettings,{filters:filters,setFilters:setFilters}),footerActions:(0,jsx_runtime.jsx)(SessionRecordingPlaylistBottomSettings,{}),loading:sessionRecordingsResponseLoading,onScrollListEdge:edge=>{"top"===edge?maybeLoadSessionRecordings("newer"):maybeLoadSessionRecordings("older")},listEmptyState:(0,jsx_runtime.jsx)(ListEmptyState,{}),onSelect:item=>setSelectedRecordingId(item.id),activeItemId:activeSessionRecordingId,content:_ref4=>{var _props$logicKey;let{activeItem}=_ref4;return showContent&&activeItem?(0,jsx_runtime.jsx)(SessionRecordingPlayer.d,{playerKey:null!==(_props$logicKey=props.logicKey)&&void 0!==_props$logicKey?_props$logicKey:"playlist",sessionRecordingId:activeItem.id,matchingEventsMatchType:matchingEventsMatchType,playlistLogic:logic,noBorder:!0,pinned:!!pinnedRecordings.find(x=>x.id===activeItem.id),setPinned:props.onPinnedChange?pinned=>{activeItem.id&&props.onPinnedChange?.(activeItem,pinned)}:void 0}):(0,jsx_runtime.jsx)("div",{className:"mt-20",children:(0,jsx_runtime.jsx)(EmptyMessage.M,{title:"No recording selected",description:"Please select a recording from the list on the left",buttonText:"Learn more about recordings",buttonTo:"https://posthog.com/docs/user-guides/recordings"})})}})]})})}let ListEmptyState=()=>{let{filters,sessionRecordingsAPIErrored,unusableEventsInFilter}=(0,index_esm.useValues)(sessionRecordingsPlaylistLogic.YV),{setFilters}=(0,index_esm.useActions)(sessionRecordingsPlaylistLogic.YV);return(0,jsx_runtime.jsx)("div",{className:"p-3 text-sm text-muted-alt",children:sessionRecordingsAPIErrored?(0,jsx_runtime.jsx)(LemonBanner.V,{type:"error",children:"Error while trying to load recordings."}):unusableEventsInFilter.length?(0,jsx_runtime.jsx)(UnusableEventsWarning,{unusableEventsInFilter:unusableEventsInFilter}):(0,jsx_runtime.jsx)("div",{className:"flex flex-col items-center space-y-2",children:filters.date_from===sessionRecordingsPlaylistLogic.I4.date_from?(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsx)("span",{children:"No matching recordings found"}),(0,jsx_runtime.jsx)(src.Jp,{type:"secondary","data-attr":"expand-replay-listing-from-default-seven-days-to-twenty-one",onClick:()=>setFilters({date_from:"-30d"}),children:"Search over the last 30 days"})]}):(0,jsx_runtime.jsx)(SessionRecordingsPlaylistTroubleshooting,{})})})};function UnusableEventsWarning(props){return(0,jsx_runtime.jsxs)(LemonBanner.V,{type:"warning",children:[(0,jsx_runtime.jsx)("p",{children:"Cannot use these events to filter for session recordings:"}),(0,jsx_runtime.jsx)("li",{className:"my-1",children:props.unusableEventsInFilter.map(event=>(0,jsx_runtime.jsxs)("span",{children:['"',event,'"']},event))}),(0,jsx_runtime.jsxs)("p",{children:["Events have to have a ",(0,jsx_runtime.jsx)(PropertyKeyInfo.T,{value:"$session_id"})," to be used to filter recordings. This is added automatically by"," ",(0,jsx_runtime.jsx)(src.rU,{to:"https://posthog.com/docs/libraries/js",target:"_blank",children:"the Web SDK"}),","," ",(0,jsx_runtime.jsx)(src.rU,{to:"https://posthog.com/docs/libraries",target:"_blank",children:"and the Mobile SDKs (Android, iOS, React Native and Flutter)"})]})]})}},"./frontend/src/scenes/session-recordings/playlist/playlistUtils.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{A5:()=>getPlaylist,CE:()=>updatePlaylist,NR:()=>duplicatePlaylist,cg:()=>createPlaylist,l8:()=>deletePlaylist,rP:()=>summarizePlaylistFilters});var kea_router__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/api.ts"),lib_components_PropertyFilters_utils__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/components/PropertyFilters/utils.ts"),lib_components_TaxonomicFilter_types__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/lib/components/TaxonomicFilter/types.ts"),lib_components_UniversalFilters_utils__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/components/UniversalFilters/utils.ts"),lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/lib/lemon-ui/LemonToast/LemonToast.tsx"),lib_taxonomy__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/lib/taxonomy.tsx"),lib_utils__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./frontend/src/lib/utils.tsx"),lib_utils_deleteWithUndo__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./frontend/src/lib/utils/deleteWithUndo.tsx"),scenes_billing_BillingPopup__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__("./frontend/src/scenes/billing/BillingPopup.tsx"),scenes_insights_filters_ActionFilter_entityFilterLogic__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__("./frontend/src/scenes/insights/filters/ActionFilter/entityFilterLogic.ts"),scenes_insights_utils__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__("./frontend/src/scenes/insights/utils.tsx"),scenes_session_recordings_playlist_sessionRecordingsPlaylistLogic__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__("./frontend/src/scenes/session-recordings/playlist/sessionRecordingsPlaylistLogic.ts"),scenes_session_recordings_sessionReplaySceneLogic__WEBPACK_IMPORTED_MODULE_13__=__webpack_require__("./frontend/src/scenes/session-recordings/sessionReplaySceneLogic.ts"),scenes_urls__WEBPACK_IMPORTED_MODULE_14__=__webpack_require__("./frontend/src/scenes/urls.ts");function summarizePlaylistFilters(filters,cohortsById){var _properties$length;let summary;let eventFilters=filters.filter(lib_components_UniversalFilters_utils__WEBPACK_IMPORTED_MODULE_4__.Lu),actionFilters=filters.filter(lib_components_UniversalFilters_utils__WEBPACK_IMPORTED_MODULE_4__.$e),propertyFilters=filters.filter(lib_components_PropertyFilters_utils__WEBPACK_IMPORTED_MODULE_2__.RG),localFilters=(0,scenes_insights_filters_ActionFilter_entityFilterLogic__WEBPACK_IMPORTED_MODULE_10__.K$)({events:eventFilters,actions:actionFilters});summary=localFilters.map(localFilter=>(0,scenes_insights_utils__WEBPACK_IMPORTED_MODULE_11__.bo)(localFilter)).join(" & ");let properties=(0,lib_components_PropertyFilters_utils__WEBPACK_IMPORTED_MODULE_2__.Y4)(propertyFilters);if(properties&&(null!==(_properties$length=properties.length)&&void 0!==_properties$length?_properties$length:0)>0){let propertiesSummary=properties.map(property=>{if("person"===property.type){var operator;return`${lib_taxonomy__WEBPACK_IMPORTED_MODULE_6__.NV(property.key,lib_components_TaxonomicFilter_types__WEBPACK_IMPORTED_MODULE_3__.t.PersonProperties)?.label||property.key} ${(operator=property.operator)?lib_utils__WEBPACK_IMPORTED_MODULE_7__.mG?.[operator]?lib_utils__WEBPACK_IMPORTED_MODULE_7__.mG[operator].slice(0,1):String(operator):"?"} ${property.value}`}if("cohort"===property.type){let cohortId=Number(property.value);return`cohorts: ${cohortId in cohortsById?cohortsById[cohortId]?.name:`ID ${cohortId}`}`}}).filter(property=>!!property).join(" & ");summary+=`${summary?", on ":""}${propertiesSummary}`}return summary.trim()||null}async function getPlaylist(shortId){return lib_api__WEBPACK_IMPORTED_MODULE_1__.ZP.recordings.getPlaylist(shortId)}async function updatePlaylist(shortId,playlist){let silent=arguments.length>2&&void 0!==arguments[2]&&arguments[2],newPlaylist=await lib_api__WEBPACK_IMPORTED_MODULE_1__.ZP.recordings.updatePlaylist(shortId,playlist);return silent||lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.success("Playlist updated successfully"),newPlaylist}async function duplicatePlaylist(playlist){let redirect=arguments.length>1&&void 0!==arguments[1]&&arguments[1],{id,short_id,...partialPlaylist}=playlist;partialPlaylist.name=partialPlaylist.name?partialPlaylist.name+" (copy)":"";let newPlaylist=await createPlaylist(partialPlaylist,redirect);return newPlaylist?(lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.success("Playlist duplicated successfully"),newPlaylist):null}async function createPlaylist(playlist){let redirect=arguments.length>1&&void 0!==arguments[1]&&arguments[1];try{playlist.filters=playlist.filters||scenes_session_recordings_playlist_sessionRecordingsPlaylistLogic__WEBPACK_IMPORTED_MODULE_12__.I4;let res=await lib_api__WEBPACK_IMPORTED_MODULE_1__.ZP.recordings.createPlaylist(playlist);return redirect&&kea_router__WEBPACK_IMPORTED_MODULE_0__.router.actions.push(scenes_urls__WEBPACK_IMPORTED_MODULE_14__.j.replayPlaylist(res.short_id)),res}catch(e){if(403===e.status)(0,scenes_billing_BillingPopup__WEBPACK_IMPORTED_MODULE_9__.r)({title:"Upgrade now to unlock unlimited playlists",description:scenes_session_recordings_sessionReplaySceneLogic__WEBPACK_IMPORTED_MODULE_13__.XI});else throw e}return null}async function deletePlaylist(playlist,undoCallback){return await (0,lib_utils_deleteWithUndo__WEBPACK_IMPORTED_MODULE_8__.S)({object:playlist,idField:"short_id",endpoint:"projects/@current/session_recording_playlists",callback:undoCallback}),playlist}},"./frontend/src/scenes/session-recordings/playlist/sessionRecordingsListPropertiesLogic.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{o:()=>sessionRecordingsListPropertiesLogic});var kea__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),kea_loaders__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea-loaders@3.0.0_kea@3.1.5/node_modules/kea-loaders/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/api.ts"),lib_dayjs__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/lib/dayjs.ts"),lib_taxonomy__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/taxonomy.tsx"),lib_utils_eventUsageLogic__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/lib/utils/eventUsageLogic.ts"),_queries_schema__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/queries/schema.ts"),_queries_utils__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./frontend/src/queries/utils.ts");let sessionRecordingsListPropertiesLogic=(0,kea__WEBPACK_IMPORTED_MODULE_0__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_0__.path)(()=>["scenes","session-recordings","playlist","sessionRecordingsListPropertiesLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_0__.connect)(()=>({actions:[lib_utils_eventUsageLogic__WEBPACK_IMPORTED_MODULE_5__.vx,["reportRecordingsListPropertiesFetched"]]})),(0,kea__WEBPACK_IMPORTED_MODULE_0__.actions)({loadPropertiesForSessions:sessions=>({sessions}),maybeLoadPropertiesForSessions:sessions=>({sessions})}),(0,kea_loaders__WEBPACK_IMPORTED_MODULE_1__.loaders)(_ref=>{let{actions}=_ref;return{recordingProperties:[[],{loadPropertiesForSessions:async(_ref2,breakpoint)=>{let{sessions}=_ref2;await breakpoint(100);let startTime=performance.now(),sessionIds=sessions.map(x=>x.id),oldestTimestamp=sessions.map(x=>x.start_time).sort()[0],newestTimestamp=sessions.map(x=>x.end_time).sort()[sessions.length-1],query={kind:_queries_schema__WEBPACK_IMPORTED_MODULE_6__.OH.HogQLQuery,query:(0,_queries_utils__WEBPACK_IMPORTED_MODULE_7__.zP)`SELECT $session_id as session_id, @@ -383,4 +387,4 @@ MIICVjCCAb+gAwIBAgIBADANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQGEwJ1czEL AND timestamp <= '${endDate}' LIMIT 20 `},responseJSON=await api.ZP.query(query),{results}=responseJSON,events=results?.map(r=>{let distinct_id=r[0],properties=JSON.parse(r[1]),personProperties=JSON.parse(r[2]);return{distinct_id,properties,personProperties}})||[];return{...values.surveyOpenTextResults,[questionIndex]:{events}}}}}}),(0,index_esm.listeners)(_ref11=>{let{actions,values}=_ref11;return{createSurveySuccess:_ref12=>{let{survey}=_ref12;src.UJ.success((0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:["Survey ",survey.name," created"]})),actions.loadSurveys(),kea_router_lib.router.actions.replace(urls.j.survey(survey.id)),actions.reportSurveyCreated(survey)},updateSurveySuccess:_ref13=>{let{survey}=_ref13;src.UJ.success((0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:["Survey ",survey.name," updated"]})),actions.editingSurvey(!1),actions.reportSurveyEdited(survey),actions.loadSurveys()},duplicateSurveySuccess:()=>{actions.loadSurveys()},launchSurveySuccess:_ref14=>{let{survey}=_ref14;src.UJ.success((0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:["Survey ",survey.name," launched"]})),actions.loadSurveys()},stopSurveySuccess:()=>{actions.loadSurveys()},resumeSurveySuccess:()=>{actions.loadSurveys()},archiveSurvey:()=>{actions.updateSurvey({archived:!0})},loadSurveySuccess:()=>{actions.loadSurveyUserStats()},resetSurveyResponseLimits:()=>{actions.setSurveyValue("responses_limit",null)},resetSurveyAdaptiveSampling:()=>{actions.setSurveyValues({response_sampling_interval:null,response_sampling_interval_type:null,response_sampling_limit:null,response_sampling_start_date:null,response_sampling_daily_limits:null})},resetTargeting:()=>{actions.setSurveyValue("linked_flag_id",constants.Uo.linked_flag_id),actions.setSurveyValue("targeting_flag_filters",constants.Uo.targeting_flag_filters),actions.setSurveyValue("linked_flag",constants.Uo.linked_flag),actions.setSurveyValue("targeting_flag",constants.Uo.targeting_flag),actions.setSurveyValue("conditions",constants.Uo.conditions),actions.setSurveyValue("remove_targeting_flag",!0),actions.setSurveyValue("responses_limit",constants.Uo.responses_limit),actions.setSurveyValues({iteration_count:constants.Uo.iteration_count,iteration_frequency_days:constants.Uo.iteration_frequency_days}),actions.setFlagPropertyErrors(constants.Uo.targeting_flag_filters)},submitSurveyFailure:async()=>{(0,utils.bv)(values.flagPropertyErrors)||values.urlMatchTypeValidationError?actions.setSelectedSection(SurveyEditSection.DisplayConditions):actions.setSelectedSection(SurveyEditSection.Steps),setTimeout(()=>document.querySelector(".Field--error")?.scrollIntoView({block:"center",behavior:"smooth"}),5)}}}),(0,index_esm.reducers)({isEditingSurvey:[!1,{editingSurvey:(_,_ref15)=>{let{editing}=_ref15;return editing}}],surveyMissing:[!1,{setSurveyMissing:()=>!0}],dataCollectionType:["until_stopped",{setDataCollectionType:(_,_ref16)=>{let{dataCollectionType}=_ref16;return dataCollectionType}}],survey:[{...constants.Uo},{setDefaultForQuestionType:(state,_ref17)=>{let{idx,type,isEditingQuestion,isEditingDescription,isEditingThankYouMessage}=_ref17,question=isEditingQuestion?state.questions[idx].question:constants.Tc[type].questions[0].question,description=isEditingDescription?state.questions[idx].description:constants.Tc[type].questions[0].description,thankYouMessageHeader=isEditingThankYouMessage?state.appearance?.thankYouMessageHeader:constants.Tc[type].appearance.thankYouMessageHeader,newQuestions=[...state.questions];return newQuestions[idx]={...state.questions[idx],...constants.Tc[type].questions[0],question,description},{...state,questions:newQuestions,appearance:{...state.appearance,...constants.Tc[type].appearance,thankYouMessageHeader}}},setSurveyTemplateValues:(_,_ref18)=>{let{template}=_ref18,newTemplateSurvey={...constants.Uo,...template};return newTemplateSurvey},setQuestionBranchingType:(state,_ref19)=>{let{questionIndex,type,specificQuestionIndex}=_ref19,newQuestions=[...state.questions],question=newQuestions[questionIndex];if(type===types.kv.NextQuestion)delete question.branching;else if(type===types.kv.End)question.branching={type:types.kv.End};else if(type===types.kv.ResponseBased){if(question.type!==types.I9.Rating&&question.type!==types.I9.SingleChoice)throw Error(`Survey question type must be ${types.I9.Rating} or ${types.I9.SingleChoice}`);question.branching={type:types.kv.ResponseBased,responseValues:{}}}else type===types.kv.SpecificQuestion&&(question.branching={type:types.kv.SpecificQuestion,index:specificQuestionIndex});return newQuestions[questionIndex]=question,{...state,questions:newQuestions}},setResponseBasedBranchingForQuestion:(state,_ref20)=>{let{questionIndex,responseValue,nextStep,specificQuestionIndex}=_ref20,newQuestions=[...state.questions],question=newQuestions[questionIndex];if(question.type!==types.I9.Rating&&question.type!==types.I9.SingleChoice)throw Error(`Survey question type must be ${types.I9.Rating} or ${types.I9.SingleChoice}`);if(question.branching?.type!==types.kv.ResponseBased)throw Error(`Survey question branching type must be ${types.kv.ResponseBased}`);return"responseValues"in question.branching&&(nextStep===types.kv.NextQuestion?delete question.branching.responseValues[responseValue]:nextStep===types.kv.End?question.branching.responseValues[responseValue]=types.kv.End:nextStep===types.kv.SpecificQuestion&&(question.branching.responseValues[responseValue]=specificQuestionIndex)),newQuestions[questionIndex]=question,{...state,questions:newQuestions}},resetBranchingForQuestion:(state,_ref21)=>{let{questionIndex}=_ref21,newQuestions=[...state.questions],question=newQuestions[questionIndex];return delete question.branching,newQuestions[questionIndex]=question,{...state,questions:newQuestions}},deleteBranchingLogic:state=>{let newQuestions=[...state.questions];return newQuestions.forEach(question=>{delete question.branching}),{...state,questions:newQuestions}}}],selectedPageIndex:[0,{setSelectedPageIndex:(_,_ref22)=>{let{idx}=_ref22;return idx}}],selectedSection:[SurveyEditSection.Steps,{setSelectedSection:(_,_ref23)=>{let{section}=_ref23;return section}}],surveyRatingResultsReady:[{},{loadSurveyRatingResultsSuccess:(state,_ref24)=>{let{payload}=_ref24;return payload&&payload.hasOwnProperty("questionIndex")?{...state,[payload.questionIndex]:!0}:{...state}}}],surveyRecurringNPSResultsReady:[{},{loadSurveyRecurringNPSResultsSuccess:(state,_ref25)=>{let{payload}=_ref25;return payload&&payload.hasOwnProperty("questionIndex")?{...state,[payload.questionIndex]:!0}:{...state}}}],surveySingleChoiceResultsReady:[{},{loadSurveySingleChoiceResultsSuccess:(state,_ref26)=>{let{payload}=_ref26;return payload&&payload.hasOwnProperty("questionIndex")?{...state,[payload.questionIndex]:!0}:{...state}}}],surveyMultipleChoiceResultsReady:[{},{loadSurveyMultipleChoiceResultsSuccess:(state,_ref27)=>{let{payload}=_ref27;return payload&&payload.hasOwnProperty("questionIndex")?{...state,[payload.questionIndex]:!0}:{...state}}}],surveyOpenTextResultsReady:[{},{loadSurveyOpenTextResultsSuccess:(state,_ref28)=>{let{payload}=_ref28;return payload&&payload.hasOwnProperty("questionIndex")?{...state,[payload.questionIndex]:!0}:{...state}}}],writingHTMLDescription:[!1,{setWritingHTMLDescription:(_,_ref29)=>{let{writingHTML}=_ref29;return writingHTML}}],schedule:["once",{setSchedule:(_,_ref30)=>{let{schedule}=_ref30;return schedule}}],flagPropertyErrors:[null,{setFlagPropertyErrors:(_,_ref31)=>{let{errors}=_ref31;return errors}}]}),(0,index_esm.selectors)({isSurveyRunning:[s=>[s.survey],survey=>!!(survey.start_date&&!survey.end_date)],surveyUsesLimit:[s=>[s.survey],survey=>!!(survey.responses_limit&&survey.responses_limit>0)],surveyUsesAdaptiveLimit:[s=>[s.survey],survey=>!!(survey.response_sampling_interval&&survey.response_sampling_interval>0&&""!==survey.response_sampling_interval_type&&survey.response_sampling_limit&&survey.response_sampling_limit>0)],surveyShufflingQuestionsAvailable:[s=>[s.survey],survey=>survey.questions.length>1],showSurveyRepeatSchedule:[s=>[s.schedule],schedule=>"recurring"==schedule],descriptionContentType:[s=>[s.survey],survey=>questionIndex=>survey.questions[questionIndex].descriptionContentType],surveyRepeatedActivationAvailable:[s=>[s.survey],survey=>survey.conditions?.events?.values!=void 0&&survey.conditions?.events?.values?.length>0],hasTargetingSet:[s=>[s.survey],survey=>{let hasLinkedFlag=!!survey.linked_flag_id||survey.linked_flag&&Object.keys(survey.linked_flag).length>0,hasTargetingFlag=survey.targeting_flag&&Object.keys(survey.targeting_flag).length>0||survey.targeting_flag_filters&&Object.keys(survey.targeting_flag_filters).length>0,hasOtherConditions=survey.conditions&&Object.keys(survey.conditions).length>0;return!!hasLinkedFlag||!!hasTargetingFlag||!!hasOtherConditions}],breadcrumbs:[s=>[s.survey],survey=>[{key:sceneTypes.x.Surveys,name:"Surveys",path:urls.j.surveys()},{key:[sceneTypes.x.Survey,survey?.id||"new"],name:survey.name}]],dataTableQuery:[s=>[s.survey],survey=>{if("new"===survey.id)return null;let startDate=survey.start_date||survey.created_at;return{kind:schema.OH.DataTableNode,source:{kind:schema.OH.EventsQuery,select:["*",...survey.questions.map((q,i)=>q.type===types.I9.MultipleChoice?`coalesce(arrayStringConcat(JSONExtractArrayRaw(properties, '${getResponseField(i)}'), ', ')) -- ${q.question}`:`coalesce(JSONExtractString(properties, '${getResponseField(i)}')) -- ${q.question}`),"timestamp","person","coalesce(JSONExtractString(properties, '$lib_version')) -- Library Version","coalesce(JSONExtractString(properties, '$lib')) -- Library","coalesce(JSONExtractString(properties, '$current_url')) -- URL"],orderBy:["timestamp DESC"],where:["event == 'survey sent'"],after:startDate,properties:[{type:types.FT.Event,key:"$survey_id",operator:types.WV.Exact,value:survey.id}]},propertiesViaUrl:!0,showExport:!0,showReload:!0,showEventFilter:!1,showPropertyFilter:!0,showTimings:!1}}],targetingFlagFilters:[s=>[s.survey],survey=>survey.targeting_flag_filters?{...survey.targeting_flag_filters,groups:survey.targeting_flag_filters.groups,multivariate:null,payloads:{},super_groups:void 0}:survey.targeting_flag?.filters||void 0],urlMatchTypeValidationError:[s=>[s.survey],survey=>{if(survey.conditions?.urlMatchType===types.HI.Regex&&survey.conditions.url)try{new RegExp(survey.conditions.url)}catch(e){return e.message}return null}],surveyNPSScore:[s=>[s.surveyRatingResults],surveyRatingResults=>{if(surveyRatingResults){let questionIdx=Object.keys(surveyRatingResults)[0],questionResults=surveyRatingResults[questionIdx];if(0===questionResults.total)return"No data available";let data=questionResults.data;if(11===data.length){let promoters=data.slice(9,11).reduce((a,b)=>a+b,0),passives=data.slice(7,9).reduce((a,b)=>a+b,0),detractors=data.slice(0,7).reduce((a,b)=>a+b,0);return((promoters-detractors)/(promoters+passives+detractors)*100).toFixed(1)}}}],getBranchingDropdownValue:[s=>[s.survey],survey=>(questionIndex,question)=>{if(question.branching?.type){let{type}=question.branching;if(type===types.kv.SpecificQuestion){let nextQuestionIndex=question.branching.index;return`${types.kv.SpecificQuestion}:${nextQuestionIndex}`}return type}return questionIndex[s.survey],survey=>(questionIndex,question,response)=>{if(!question.branching||!("responseValues"in question.branching))return types.kv.NextQuestion;if(Number.isInteger(question.branching.responseValues[response])){let nextQuestionIndex=question.branching.responseValues[response];return`${types.kv.SpecificQuestion}:${nextQuestionIndex}`}return question.branching?.responseValues?.[response]?question.branching.responseValues[response]:questionIndex[s.survey],survey=>{let graph=new Map;survey.questions.forEach((question,fromIndex)=>{if(graph.has(fromIndex)||graph.set(fromIndex,new Set),question.branching?.type!==types.kv.End){if(question.branching?.type===types.kv.SpecificQuestion&&Number.isInteger(question.branching.index)){let toIndex=question.branching.index;graph.get(fromIndex).add(toIndex);return}if(question.branching?.type===types.kv.ResponseBased&&(0,utils.Kn)(question.branching?.responseValues))for(let[_,toIndex]of Object.entries(question.branching?.responseValues))Number.isInteger(toIndex)&&graph.get(fromIndex).add(toIndex);if(fromIndex[s.survey],survey=>survey.questions.some(question=>question.branching&&Object.keys(question.branching).length>0)],surveyAsInsightURL:[s=>[s.survey],survey=>{let query={kind:schema.OH.InsightVizNode,source:{kind:schema.OH.TrendsQuery,properties:[{key:"$survey_id",value:survey.id,operator:types.WV.Exact,type:types.FT.Event}],series:[{kind:schema.OH.EventsNode,event:"survey sent",name:"survey sent",math:types.vN.TotalCount},{kind:schema.OH.EventsNode,event:"survey shown",name:"survey shown",math:types.vN.TotalCount},{kind:schema.OH.EventsNode,event:"survey dismissed",name:"survey dismissed",math:types.vN.TotalCount}]}};return urls.j.insightNew(void 0,void 0,query)}]}),(0,lib.forms)(_ref32=>{let{actions,props,values}=_ref32;return{survey:{defaults:{...constants.Uo},errors:_ref33=>{let{name,questions}=_ref33;return{name:!name&&"Please enter a name.",questions:questions.map(question=>{let questionErrors={question:!question.question&&"Please enter a question label."};return question.type===types.I9.Rating?{...questionErrors,display:!question.display&&"Please choose a display type.",scale:!question.scale&&"Please choose a scale.",lowerBoundLabel:!question.lowerBoundLabel&&"Please enter a lower bound label.",upperBoundLabel:!question.upperBoundLabel&&"Please enter an upper bound label."}:question.type===types.I9.SingleChoice||question.type===types.I9.MultipleChoice?{...questionErrors,choices:question.choices.some(choice=>!choice.trim())?"Please ensure all choices are non-empty.":void 0}:questionErrors}),targeting_flag_filters:values.flagPropertyErrors,urlMatchType:values.urlMatchTypeValidationError}},submit:surveyPayload=>{if(values.hasCycle)return actions.reportSurveyCycleDetected(values.survey),src.UJ.error("Your survey contains an endless cycle. Please revisit your branching rules.");actions.editingSurvey(!1),props.id&&"new"!==props.id?actions.updateSurvey(surveyPayload):actions.createSurvey(surveyPayload)}}}}),(0,kea_router_lib.urlToAction)(_ref34=>{var _props$id;let{actions,props}=_ref34;return{[urls.j.survey(null!==(_props$id=props.id)&&void 0!==_props$id?_props$id:"new")]:(_,_ref35,__,_ref36)=>{let{edit}=_ref35,{method}=_ref36;"new"===props.id&&actions.editingSurvey(!0),"PUSH"===method&&(props.id?actions.loadSurvey():actions.resetSurvey()),edit&&actions.editingSurvey(!0)}}}),(0,kea_router_lib.actionToUrl)(_ref37=>{let{values}=_ref37;return{setSurveyTemplateValues:()=>{let hashParams=kea_router_lib.router.values.hashParams;return hashParams.fromTemplate=!0,[urls.j.survey(values.survey.id),kea_router_lib.router.values.searchParams,hashParams]},editingSurvey:_ref38=>{let{editing}=_ref38,searchParams=kea_router_lib.router.values.searchParams;return editing?searchParams.edit=!0:delete searchParams.edit,[kea_router_lib.router.values.location.pathname,kea_router_lib.router.values.searchParams,kea_router_lib.router.values.hashParams]}}}),(0,index_esm.afterMount)(_ref39=>{let{props,actions}=_ref39;"new"!==props.id&&actions.loadSurvey(),"new"===props.id&&actions.resetSurvey()})]);function sanitizeQuestions(surveyPayload){if(!surveyPayload.questions)return surveyPayload;let sanitizedThankYouHeader=sanitizeHTML(surveyPayload.appearance?.thankYouMessageHeader||""),sanitizedThankYouDescription=sanitizeHTML(surveyPayload.appearance?.thankYouMessageDescription||"");return{...surveyPayload,questions:surveyPayload.questions?.map(rawQuestion=>({...rawQuestion,description:sanitizeHTML(rawQuestion.description||""),question:sanitizeHTML(rawQuestion.question||"")})),appearance:{...surveyPayload.appearance,...sanitizedThankYouHeader&&{thankYouMessageHeader:sanitizedThankYouHeader},...sanitizedThankYouDescription&&{thankYouMessageDescription:sanitizedThankYouDescription}}}}},"./frontend/src/scenes/surveys/surveysLogic.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Iq:()=>SurveysTabs,kT:()=>surveysLogic,zs:()=>getSurveyStatus});var _posthog_lemon_ui__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./frontend/@posthog/lemon-ui/src/index.ts"),fuse_js__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__("./node_modules/.pnpm/fuse.js@6.6.2/node_modules/fuse.js/dist/fuse.esm.js"),kea__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),kea_loaders__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./node_modules/.pnpm/kea-loaders@3.0.0_kea@3.1.5/node_modules/kea-loaders/lib/index.js"),kea_router__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/api.ts"),scenes_sceneTypes__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/scenes/sceneTypes.ts"),scenes_teamLogic__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/scenes/teamLogic.tsx"),scenes_urls__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./frontend/src/scenes/urls.ts"),scenes_userLogic__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./frontend/src/scenes/userLogic.ts"),_types__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__("./frontend/src/types.ts");let SurveysTabs=function(SurveysTabs){return SurveysTabs.Active="active",SurveysTabs.Yours="yours",SurveysTabs.Archived="archived",SurveysTabs.Notifications="notifications",SurveysTabs.History="history",SurveysTabs.Settings="settings",SurveysTabs}({});function getSurveyStatus(survey){return survey.start_date?survey.end_date?_types__WEBPACK_IMPORTED_MODULE_9__.mN.Complete:_types__WEBPACK_IMPORTED_MODULE_9__.mN.Running:_types__WEBPACK_IMPORTED_MODULE_9__.mN.Draft}let surveysLogic=(0,kea__WEBPACK_IMPORTED_MODULE_1__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_1__.path)(["scenes","surveys","surveysLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_1__.connect)(()=>({values:[scenes_userLogic__WEBPACK_IMPORTED_MODULE_8__.userLogic,["hasAvailableFeature"],scenes_teamLogic__WEBPACK_IMPORTED_MODULE_6__.H,["currentTeam","currentTeamLoading"]],actions:[scenes_teamLogic__WEBPACK_IMPORTED_MODULE_6__.H,["loadCurrentTeam"]]})),(0,kea__WEBPACK_IMPORTED_MODULE_1__.actions)({setSearchTerm:searchTerm=>({searchTerm}),setSurveysFilters:(filters,replace)=>({filters,replace}),setTab:tab=>({tab})}),(0,kea_loaders__WEBPACK_IMPORTED_MODULE_2__.loaders)(_ref=>{let{values}=_ref;return{surveys:{__default:[],loadSurveys:async()=>{let responseSurveys=await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.surveys.list();return responseSurveys.results},deleteSurvey:async id=>(await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.surveys.delete(id),values.surveys.filter(survey=>survey.id!==id)),updateSurvey:async _ref2=>{let{id,updatePayload}=_ref2,updatedSurvey=await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.surveys.update(id,{...updatePayload});return values.surveys.map(survey=>survey.id===id?updatedSurvey:survey)}},surveysResponsesCount:{__default:{},loadResponsesCount:async()=>{let surveysResponsesCount=await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.surveys.getResponsesCount();return surveysResponsesCount}}}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.reducers)({tab:[SurveysTabs.Active,{setTab:(_,_ref3)=>{let{tab}=_ref3;return tab}}],searchTerm:{setSearchTerm:(_,_ref4)=>{let{searchTerm}=_ref4;return searchTerm}},filters:[{archived:!1,status:"any",created_by:null},{setSurveysFilters:(state,_ref5)=>{let{filters}=_ref5;return{...state,...filters}}}]}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.listeners)(_ref6=>{let{actions,values}=_ref6;return{deleteSurveySuccess:()=>{_posthog_lemon_ui__WEBPACK_IMPORTED_MODULE_0__.UJ.success("Survey deleted"),kea_router__WEBPACK_IMPORTED_MODULE_3__.router.actions.push(scenes_urls__WEBPACK_IMPORTED_MODULE_7__.j.surveys())},updateSurveySuccess:()=>{_posthog_lemon_ui__WEBPACK_IMPORTED_MODULE_0__.UJ.success("Survey updated"),actions.loadCurrentTeam()},setSurveysFilters:()=>{actions.loadSurveys(),actions.loadResponsesCount()},loadSurveysSuccess:()=>{actions.loadCurrentTeam()},setTab:_ref7=>{let{tab}=_ref7;actions.setSurveysFilters({...values.filters,archived:tab===SurveysTabs.Archived})}}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.selectors)({searchedSurveys:[selectors=>[selectors.surveys,selectors.searchTerm,selectors.filters],(surveys,searchTerm,filters)=>{let searchedSurveys=surveys;if(!searchTerm&&0===Object.keys(filters).length)return searchedSurveys;searchTerm&&(searchedSurveys=new fuse_js__WEBPACK_IMPORTED_MODULE_10__.Z(searchedSurveys,{keys:["key","name"],threshold:.3}).search(searchTerm).map(result=>result.item));let{status,created_by,archived}=filters;return"any"!==status&&(searchedSurveys=searchedSurveys.filter(survey=>getSurveyStatus(survey)===status)),created_by&&(searchedSurveys=searchedSurveys.filter(survey=>survey.created_by?.id===created_by)),searchedSurveys=archived?searchedSurveys.filter(survey=>survey.archived):searchedSurveys.filter(survey=>!survey.archived)}],breadcrumbs:[()=>[],()=>[{key:scenes_sceneTypes__WEBPACK_IMPORTED_MODULE_5__.x.Surveys,name:"Surveys",path:scenes_urls__WEBPACK_IMPORTED_MODULE_7__.j.surveys()}]],surveysStylingAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_STYLING)],globalSurveyAppearanceConfigAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_STYLING)],surveysHTMLAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_TEXT_HTML)],surveysMultipleQuestionsAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_MULTIPLE_QUESTIONS)],surveysRecurringScheduleAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_RECURRING)],surveysEventsAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_EVENTS)],surveysActionsAvailable:[s=>[s.hasAvailableFeature],hasAvailableFeature=>hasAvailableFeature(_types__WEBPACK_IMPORTED_MODULE_9__.P$.SURVEYS_ACTIONS)],showSurveysDisabledBanner:[s=>[s.currentTeam,s.currentTeamLoading,s.surveys],(currentTeam,currentTeamLoading,surveys)=>!currentTeamLoading&¤tTeam&&!currentTeam.surveys_opt_in&&surveys.some(s=>s.start_date&&!s.end_date&&s.type!==_types__WEBPACK_IMPORTED_MODULE_9__.d_.API)]}),(0,kea_router__WEBPACK_IMPORTED_MODULE_3__.actionToUrl)(_ref8=>{let{values}=_ref8;return{setTab:()=>[kea_router__WEBPACK_IMPORTED_MODULE_3__.router.values.location.pathname,{...kea_router__WEBPACK_IMPORTED_MODULE_3__.router.values.searchParams,tab:values.tab}]}}),(0,kea_router__WEBPACK_IMPORTED_MODULE_3__.urlToAction)(_ref9=>{let{actions}=_ref9;return{[scenes_urls__WEBPACK_IMPORTED_MODULE_7__.j.surveys()]:(_,_ref10)=>{let{tab}=_ref10;tab&&actions.setTab(tab)}}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.afterMount)(_ref11=>{let{actions}=_ref11;actions.loadSurveys(),actions.loadResponsesCount()})])},"./frontend/src/scenes/teamLogic.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{H:()=>teamLogic,R:()=>isAuthenticatedTeam});var kea__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),kea_loaders__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea-loaders@3.0.0_kea@3.1.5/node_modules/kea-loaders/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/api.ts"),lib_constants__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/lib/constants.tsx"),lib_lemon_ui_icons__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/lemon-ui/icons/index.ts"),lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/lib/lemon-ui/LemonToast/LemonToast.tsx"),lib_logic_featureFlagLogic__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/lib/logic/featureFlagLogic.ts"),lib_utils__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./frontend/src/lib/utils.tsx"),lib_utils_eventUsageLogic__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./frontend/src/lib/utils/eventUsageLogic.ts"),lib_utils_getAppContext__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__("./frontend/src/lib/utils/getAppContext.ts"),_organizationLogic__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__("./frontend/src/scenes/organizationLogic.tsx"),_projectLogic__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__("./frontend/src/scenes/projectLogic.ts"),_userLogic__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__("./frontend/src/scenes/userLogic.ts"),react_jsx_runtime__WEBPACK_IMPORTED_MODULE_13__=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");let parseUpdatedAttributeName=attr=>"slack_incoming_webhook"===attr?"Webhook":"app_urls"===attr?"Authorized URLs":attr?(0,lib_utils__WEBPACK_IMPORTED_MODULE_7__.UV)(attr):"Project";function isAuthenticatedTeam(team){return!!team&&"api_token"in team}let teamLogic=(0,kea__WEBPACK_IMPORTED_MODULE_0__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_0__.path)(["scenes","teamLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_0__.connect)(()=>({actions:[_userLogic__WEBPACK_IMPORTED_MODULE_12__.userLogic,["loadUser","switchTeam"],_organizationLogic__WEBPACK_IMPORTED_MODULE_10__.p,["loadCurrentOrganization"]],values:[_projectLogic__WEBPACK_IMPORTED_MODULE_11__.K,["currentProject"],lib_logic_featureFlagLogic__WEBPACK_IMPORTED_MODULE_6__.h,["featureFlags"]]})),(0,kea__WEBPACK_IMPORTED_MODULE_0__.actions)({deleteTeam:team=>({team}),deleteTeamSuccess:!0,deleteTeamFailure:!0}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.reducers)({teamBeingDeleted:[null,{deleteTeam:(_,_ref)=>{let{team}=_ref;return team},deleteTeamSuccess:()=>null,deleteTeamFailure:()=>null}]}),(0,kea_loaders__WEBPACK_IMPORTED_MODULE_1__.loaders)(_ref2=>{let{values,actions}=_ref2;return{currentTeam:[null,{loadCurrentTeam:async()=>{if(!(0,lib_utils__WEBPACK_IMPORTED_MODULE_7__.Pc)())return null;try{return await lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.get("api/environments/@current")}catch{return values.currentTeam}},updateCurrentTeam:async(payload,breakpoint)=>{let message;if(!values.currentTeam)throw Error("Current team has not been loaded yet, so it cannot be updated!");payload.session_replay_config&&(payload.session_replay_config={...values.currentTeam.session_replay_config,...payload.session_replay_config});let promises=[lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.update(`api/environments/${values.currentTeam.id}`,payload),void 0];1===Object.keys(payload).length&&payload.name&&values.currentProject&&!values.featureFlags[lib_constants__WEBPACK_IMPORTED_MODULE_3__.y8.ENVIRONMENTS]&&(promises[0]=lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.update(`api/projects/${values.currentProject.id}`,{name:payload.name}));let[patchedTeam]=await Promise.all(promises);breakpoint(),actions.loadCurrentOrganization(),actions.loadUser();let updatedAttribute=1===Object.keys(payload).length?Object.keys(payload)[0]:null;return message="slack_incoming_webhook"===updatedAttribute?payload.slack_incoming_webhook?`Webhook integration enabled – you should be seeing a message on ${(0,lib_utils__WEBPACK_IMPORTED_MODULE_7__.rt)(payload.slack_incoming_webhook)}`:"Webhook integration disabled":"completed_snippet_onboarding"===updatedAttribute||"has_completed_onboarding_for"===updatedAttribute?"Congrats! You're now ready to use PostHog.":`${parseUpdatedAttributeName(updatedAttribute)} updated successfully!`,Object.keys(payload).map(property=>{lib_utils_eventUsageLogic__WEBPACK_IMPORTED_MODULE_8__.vx.findMounted()?.actions?.reportTeamSettingChange(property,payload[property])}),window.location.pathname.match(/\/(onboarding|products)/)||lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.success(message),patchedTeam},createTeam:async _ref3=>{let{name,is_demo}=_ref3;if(!values.currentProject)throw Error("Environment could not be created, because the parent project has not been loaded yet!");return await lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.create(`api/projects/${values.currentProject.id}/environments/`,{name,is_demo})},resetToken:async()=>await lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.update(`api/environments/${values.currentTeamId}/reset_token`,{}),addProductIntent:async _ref4=>{let{product_type,intent_context}=_ref4;return await lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.update(`api/environments/${values.currentTeamId}/add_product_intent`,{product_type,intent_context:null!=intent_context?intent_context:void 0})},recordProductIntentOnboardingComplete:async _ref5=>{let{product_type}=_ref5;return await lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.update(`api/environments/${values.currentTeamId}/complete_product_onboarding`,{product_type})}}]}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.selectors)(()=>({hasOnboardedAnyProduct:[selectors=>[selectors.currentTeam],currentTeam=>!currentTeam||!!currentTeam.completed_snippet_onboarding||!!Object.keys(currentTeam.has_completed_onboarding_for||{}).length],currentTeamId:[selectors=>[selectors.currentTeam],currentTeam=>currentTeam?currentTeam.id:null],isCurrentTeamUnavailable:[selectors=>[selectors.currentTeam,selectors.currentTeamLoading],(currentTeam,currentTeamLoading)=>(!currentTeam?.effective_membership_level||"none"===currentTeam.user_access_level)&&!currentTeamLoading],demoOnlyProject:[selectors=>[selectors.currentTeam,_organizationLogic__WEBPACK_IMPORTED_MODULE_10__.p.selectors.currentOrganization],(currentTeam,currentOrganization)=>currentTeam?.is_demo&¤tOrganization?.teams&&1==currentOrganization.teams.length||!1],funnelCorrelationConfig:[selectors=>[selectors.currentTeam],currentTeam=>currentTeam?.correlation_config||{}],timezone:[selectors=>[selectors.currentTeam],currentTeam=>currentTeam?.timezone||"UTC"],weekStartDay:[selectors=>[selectors.currentTeam],currentTeam=>currentTeam?.week_start_day||0],isTeamTokenResetAvailable:[selectors=>[selectors.currentTeam],currentTeam=>!!currentTeam?.effective_membership_level&¤tTeam.effective_membership_level>=lib_constants__WEBPACK_IMPORTED_MODULE_3__.Dk.Admin||currentTeam?.user_access_level==="admin"],testAccountFilterFrequentMistakes:[selectors=>[selectors.currentTeam],currentTeam=>{if(!currentTeam)return[];let frequentMistakes=[];for(let filter of currentTeam.test_account_filters||[])"email"===filter.key&&"event"===filter.type&&frequentMistakes.push({key:"email",type:"event",fix:"it is more common to filter email by person properties, not event properties"});return frequentMistakes}]})),(0,kea__WEBPACK_IMPORTED_MODULE_0__.listeners)(_ref6=>{let{actions}=_ref6;return{loadCurrentTeamSuccess:_ref7=>{let{currentTeam}=_ref7;currentTeam&&lib_api__WEBPACK_IMPORTED_MODULE_2__.x7.setCurrentTeamId(currentTeam.id)},createTeamSuccess:_ref8=>{let{currentTeam}=_ref8;currentTeam&&actions.switchTeam(currentTeam.id)},deleteTeam:async _ref9=>{let{team}=_ref9;try{await lib_api__WEBPACK_IMPORTED_MODULE_2__.ZP.delete(`api/environments/${team.id}`),location.reload(),actions.deleteTeamSuccess()}catch{actions.deleteTeamFailure()}},deleteTeamSuccess:()=>{lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.success("Project has been deleted")}}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.afterMount)(_ref10=>{let{actions,values}=_ref10,appContext=(0,lib_utils_getAppContext__WEBPACK_IMPORTED_MODULE_9__.Fj)(),currentTeam=appContext?.current_team,currentProject=appContext?.current_project,switchedTeam=appContext?.switched_team;switchedTeam&&lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.info((0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_13__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_13__.Fragment,{children:["You've switched to\xa0project"," ",values.featureFlags[lib_constants__WEBPACK_IMPORTED_MODULE_3__.y8.ENVIRONMENTS]?`${currentProject?.name}, environment ${currentTeam?.name}`:currentTeam?.name]}),{button:{label:"Switch back",action:()=>actions.switchTeam(switchedTeam)},icon:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_13__.jsx)(lib_lemon_ui_icons__WEBPACK_IMPORTED_MODULE_4__._S,{})}),currentTeam?actions.loadCurrentTeamSuccess(currentTeam):actions.loadCurrentTeam()})])},"./frontend/src/scenes/trends/mathsLogic.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{J$:()=>apiValueToMathType,X1:()=>PROPERTY_MATH_DEFINITIONS,YG:()=>BASE_MATH_DEFINITIONS,Yw:()=>mathTypeToApiValues,Z$:()=>MathCategory,fx:()=>mathsLogic,xo:()=>COUNT_PER_ACTOR_MATH_DEFINITIONS});var kea__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),lib_constants__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/constants.tsx"),lib_introductions_groupsAccessLogic__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/introductions/groupsAccessLogic.ts"),lib_logic_featureFlagLogic__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/lib/logic/featureFlagLogic.ts"),_models_groupsModel__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/models/groupsModel.ts"),_types__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/types.ts"),react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");let MathCategory=function(MathCategory){return MathCategory[MathCategory.EventCount=0]="EventCount",MathCategory[MathCategory.SessionCount=1]="SessionCount",MathCategory[MathCategory.ActorCount=2]="ActorCount",MathCategory[MathCategory.EventCountPerActor=3]="EventCountPerActor",MathCategory[MathCategory.PropertyValue=4]="PropertyValue",MathCategory[MathCategory.HogQLExpression=5]="HogQLExpression",MathCategory}({}),FUNNEL_MATH_DEFINITIONS={[_types__WEBPACK_IMPORTED_MODULE_5__.S7.AnyMatch]:{name:"Any events match",shortName:"any event",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Any event of this type that matches the filter will count towards the funnel"}),category:MathCategory.EventCount},[_types__WEBPACK_IMPORTED_MODULE_5__.S7.FirstTimeForUser]:{name:"First event for user",shortName:"first event",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Only the first time the user performed this event will count towards the funnel, and only if it matches the event filters.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If the we are looking for pageview events to posthog.com/about, but the user's first pageview was on posthog.com, it will not match, even if they went to posthog.com/about afterwards."})]}),category:MathCategory.EventCount},[_types__WEBPACK_IMPORTED_MODULE_5__.S7.FirstTimeForUserWithFilters]:{name:"First matching event for user",shortName:"first matching event",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["The first time the user performed this event that matches the event filters will count towards the funnel.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If the we are looking for pageview events to posthog.com/about, and the user's first pageview was on posthog.com but then they navigated to posthog.com/about, it will match the pageview event from posthog.com/about"})]}),category:MathCategory.EventCount}},BASE_MATH_DEFINITIONS={[_types__WEBPACK_IMPORTED_MODULE_5__.vN.TotalCount]:{name:"Total count",shortName:"count",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Total event count. Total number of times the event was performed by any user.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If a user performs an event 3 times in the given period, it counts as 3."})]}),category:MathCategory.EventCount},[_types__WEBPACK_IMPORTED_MODULE_5__.vN.UniqueUsers]:{name:"Unique users",shortName:"unique users",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Number of unique users who performed the event in the specified period.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If a single user performs an event 3 times in a given day/week/month, it counts only as 1."})]}),category:MathCategory.ActorCount},[_types__WEBPACK_IMPORTED_MODULE_5__.vN.WeeklyActiveUsers]:{name:"Weekly active users",shortName:"WAUs",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Users active in the past week (7 days).",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"This is a trailing count that aggregates distinct users in the past 7 days for each day in the time series"]}),category:MathCategory.ActorCount},[_types__WEBPACK_IMPORTED_MODULE_5__.vN.MonthlyActiveUsers]:{name:"Monthly active users",shortName:"MAUs",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Users active in the past month (30 days).",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"This is a trailing count that aggregates distinct users in the past 30 days for each day in the time series"]}),category:MathCategory.ActorCount},[_types__WEBPACK_IMPORTED_MODULE_5__.vN.UniqueSessions]:{name:"Unique sessions",shortName:"unique sessions",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Number of unique sessions where the event was performed in the specified period.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If a single user performs an event 3 times in two separate sessions, it counts as two sessions."})]}),category:MathCategory.SessionCount},[_types__WEBPACK_IMPORTED_MODULE_5__.vN.FirstTimeForUser]:{name:"First time for user",shortName:"first time",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Only the first time the user performed this event will count, and only if it matches the event filters.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If the we are looking for pageview events to posthog.com/about, but the user's first pageview was on posthog.com, it will not match, even if they went to posthog.com/about afterwards."})]}),category:MathCategory.EventCount},[_types__WEBPACK_IMPORTED_MODULE_5__.vN.FirstMatchingEventForUser]:{name:"First matching event for user",shortName:"first matching event",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["The first time the user performed this event that matches the event filters will count.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("i",{children:"Example: If the we are looking for pageview events to posthog.com/about, and the user's first pageview was on posthog.com but then they navigated to posthog.com/about, it will match the pageview event from posthog.com/about"})]}),category:MathCategory.EventCount}},PROPERTY_MATH_DEFINITIONS={[_types__WEBPACK_IMPORTED_MODULE_5__.O4.Average]:{name:"Average",shortName:"average",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Average of a property value within an event or action.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 3 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 10, 12 and 20, result in 14."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.Sum]:{name:"Sum",shortName:"sum",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Sum of property values within an event or action.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 3 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 10, 12 and 20, result in 42."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.Minimum]:{name:"Minimum",shortName:"minimum",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property minimum.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 3 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 10, 12 and 20, result in 10."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.Maximum]:{name:"Maximum",shortName:"maximum",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property maximum.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 3 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 10, 12 and 20, result in 20."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.Median]:{name:"Median",shortName:"median",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property median (50th percentile).",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 100 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 101..200, result in 150."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.P75]:{name:"75th percentile",shortName:"75th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property 75th percentile.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 100 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 101..200, result in 175."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.P90]:{name:"90th percentile",shortName:"90th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property 90th percentile.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 100 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 101..200, result in 190."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.P95]:{name:"95th percentile",shortName:"95th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property 95th percentile.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 100 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 101..200, result in 195."]}),category:MathCategory.PropertyValue},[_types__WEBPACK_IMPORTED_MODULE_5__.O4.P99]:{name:"99th percentile",shortName:"99th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Event property 99th percentile.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),"For example 100 events captured with property ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("code",{children:"amount"})," equal to 101..200, result in 199."]}),category:MathCategory.PropertyValue}},HOGQL_MATH_DEFINITIONS={[_types__WEBPACK_IMPORTED_MODULE_5__.mY.HogQL]:{name:"HogQL expression",shortName:"HogQL expression",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Aggregate with a custom HogQL expression."}),category:MathCategory.HogQLExpression}},COUNT_PER_ACTOR_MATH_DEFINITIONS={[_types__WEBPACK_IMPORTED_MODULE_5__.D7.Average]:{name:"Average",shortName:"average",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor average."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.Minimum]:{name:"Minimum",shortName:"minimum",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor minimum."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.Maximum]:{name:"Maximum",shortName:"maximum",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor maximum."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.Median]:{name:"Median",shortName:"median",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor 50th percentile."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.P75]:{name:"75th percentile",shortName:"75th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor 75th percentile."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.P90]:{name:"90th percentile",shortName:"90th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor 90th percentile."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.P95]:{name:"95th percentile",shortName:"95th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor 95th percentile."}),category:MathCategory.EventCountPerActor},[_types__WEBPACK_IMPORTED_MODULE_5__.D7.P99]:{name:"99th percentile",shortName:"99th percentile",description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:"Event count per actor 99th percentile."}),category:MathCategory.EventCountPerActor}};function mathTypeToApiValues(mathType){let[math,mathGroupTypeIndexRaw]=mathType.split("::"),mathGroupTypeIndex=void 0!==mathGroupTypeIndexRaw?parseInt(mathGroupTypeIndexRaw):NaN;return isNaN(mathGroupTypeIndex)?{math}:{math,math_group_type_index:mathGroupTypeIndex}}function apiValueToMathType(math,groupTypeIndex){let assembledMath=math||_types__WEBPACK_IMPORTED_MODULE_5__.vN.TotalCount;return"unique_group"===math&&(assembledMath+=`::${groupTypeIndex}`),assembledMath}let mathsLogic=(0,kea__WEBPACK_IMPORTED_MODULE_0__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_0__.path)(["scenes","trends","mathsLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_0__.connect)({values:[_models_groupsModel__WEBPACK_IMPORTED_MODULE_4__.$,["groupTypes","aggregationLabel"],lib_introductions_groupsAccessLogic__WEBPACK_IMPORTED_MODULE_2__.e,["needsUpgradeForGroups","canStartUsingGroups"],lib_logic_featureFlagLogic__WEBPACK_IMPORTED_MODULE_3__.h,["featureFlags"]]}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.selectors)({mathDefinitions:[s=>[s.groupsMathDefinitions,s.featureFlags],(groupsMathDefinitions,featureFlags)=>{let allMathDefinitions={...BASE_MATH_DEFINITIONS,...groupsMathDefinitions,...PROPERTY_MATH_DEFINITIONS,...COUNT_PER_ACTOR_MATH_DEFINITIONS,...HOGQL_MATH_DEFINITIONS};return filterMathTypesUnderFeatureFlags(allMathDefinitions,featureFlags)}],funnelMathDefinitions:[s=>[s.featureFlags],featureFlags=>{let funnelMathDefinitions={...FUNNEL_MATH_DEFINITIONS};return filterMathTypesUnderFeatureFlags(funnelMathDefinitions,featureFlags)}],staticMathDefinitions:[s=>[s.groupsMathDefinitions,s.needsUpgradeForGroups,s.featureFlags],(groupsMathDefinitions,needsUpgradeForGroups,featureFlags)=>{let staticMathDefinitions={...BASE_MATH_DEFINITIONS,...needsUpgradeForGroups?{}:groupsMathDefinitions};return filterMathTypesUnderFeatureFlags(staticMathDefinitions,featureFlags)}],staticActorsOnlyMathDefinitions:[s=>[s.staticMathDefinitions],staticMathDefinitions=>Object.fromEntries(Object.entries(staticMathDefinitions).filter(_ref=>{let[,mathDefinition]=_ref;return mathDefinition.category===MathCategory.ActorCount}))],groupsMathDefinitions:[s=>[s.groupTypes,s.aggregationLabel],(groupTypes,aggregationLabel)=>Object.fromEntries(Array.from(groupTypes.values()).map(groupType=>[apiValueToMathType("unique_group",groupType.group_type_index),{name:`Unique ${aggregationLabel(groupType.group_type_index).plural}`,shortName:`unique ${aggregationLabel(groupType.group_type_index).plural}`,description:(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Number of unique ",aggregationLabel(groupType.group_type_index).plural," who performed the event in the specified period.",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)("br",{}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)("i",{children:["Example: If 7 users in a single $",aggregationLabel(groupType.group_type_index).singular," perform an event 9 times in the given period, it counts only as 1."]})]}),category:MathCategory.ActorCount}]).filter(Boolean))]})]);function filterMathTypesUnderFeatureFlags(mathDefinitions,featureFlags){let copy={...mathDefinitions};return featureFlags[lib_constants__WEBPACK_IMPORTED_MODULE_1__.y8.FIRST_TIME_FOR_USER_MATH]||delete copy[_types__WEBPACK_IMPORTED_MODULE_5__.vN.FirstTimeForUser],copy}},"./frontend/src/scenes/trends/persons-modal/PersonsModal.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{JY:()=>MissingPersonsAlert,AP:()=>PersonsModal_PersonsModal,Yp:()=>openPersonsModal});var injectStylesIntoStyleTag=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),injectStylesIntoStyleTag_default=__webpack_require__.n(injectStylesIntoStyleTag),PersonsModal=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/trends/persons-modal/PersonsModal.scss"),PersonsModal_default=__webpack_require__.n(PersonsModal),options={};options.insert="head",options.singleton=!1,injectStylesIntoStyleTag_default()(PersonsModal_default(),options),PersonsModal_default().locals;var posthog_icons_es=__webpack_require__("./node_modules/.pnpm/@posthog+icons@0.9.2_react-dom@18.2.0_react@18.2.0/node_modules/@posthog/icons/dist/posthog-icons.es.js"),src=__webpack_require__("./frontend/@posthog/lemon-ui/src/index.ts"),index_esm=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),CopyToClipboard=__webpack_require__("./frontend/src/lib/components/CopyToClipboard.tsx"),exportsLogic=__webpack_require__("./frontend/src/lib/components/ExportButton/exportsLogic.ts"),PropertiesTable=__webpack_require__("./frontend/src/lib/components/PropertiesTable/index.ts"),PropertiesTimeline=__webpack_require__("./frontend/src/lib/components/PropertiesTimeline/index.ts"),icons=__webpack_require__("./frontend/src/lib/lemon-ui/icons/index.ts"),LemonTabs=__webpack_require__("./frontend/src/lib/lemon-ui/LemonTabs/index.ts"),ProfilePicture=__webpack_require__("./frontend/src/lib/lemon-ui/ProfilePicture/index.ts"),Spinner=__webpack_require__("./frontend/src/lib/lemon-ui/Spinner/Spinner.tsx"),Tooltip=__webpack_require__("./frontend/src/lib/lemon-ui/Tooltip/index.ts"),utils=__webpack_require__("./frontend/src/lib/utils.tsx"),react=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/index.js"),client=__webpack_require__("./node_modules/.pnpm/react-dom@18.2.0_react@18.2.0/node_modules/react-dom/client.js"),EmptyStates=__webpack_require__("./frontend/src/scenes/insights/EmptyStates/index.ts"),insights_utils=__webpack_require__("./frontend/src/scenes/insights/utils.tsx"),GroupActorDisplay=__webpack_require__("./frontend/src/scenes/persons/GroupActorDisplay.tsx"),person_utils=__webpack_require__("./frontend/src/scenes/persons/person-utils.ts"),PersonDisplay=__webpack_require__("./frontend/src/scenes/persons/PersonDisplay.tsx"),sessionPlayerModalLogic=__webpack_require__("./frontend/src/scenes/session-recordings/player/modal/sessionPlayerModalLogic.ts"),teamLogic=__webpack_require__("./frontend/src/scenes/teamLogic.tsx"),DataTableExport=__webpack_require__("./frontend/src/queries/nodes/DataTable/DataTableExport.tsx"),types=__webpack_require__("./frontend/src/types.ts"),persons_modal_utils=__webpack_require__("./frontend/src/scenes/trends/persons-modal/persons-modal-utils.tsx"),personsModalLogic=__webpack_require__("./frontend/src/scenes/trends/persons-modal/personsModalLogic.ts"),jsx_runtime=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");function SaveCohortModal(_ref){let{onSave,onCancel,isOpen}=_ref,[cohortTitle,setCohortTitle]=(0,react.useState)("");return(0,jsx_runtime.jsx)(src.fQ,{title:"New cohort",footer:(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsx)(src.Jp,{type:"secondary",onClick:onCancel,children:"Cancel"}),(0,jsx_runtime.jsx)(src.Jp,{type:"primary",disabledReason:!cohortTitle&&"Please add a title to your cohort",onClick:()=>{onSave(cohortTitle),setCohortTitle("")},children:"Save"})]}),onClose:onCancel,isOpen:isOpen,children:(0,jsx_runtime.jsx)("div",{className:"mb-4",children:(0,jsx_runtime.jsx)(src.DF,{autoFocus:!0,placeholder:"Cohort name...",value:cohortTitle,"data-attr":"cohort-name",onChange:setCohortTitle})})})}function PersonsModal_PersonsModal(_ref){let{url:_url,urlsIndex,urls,query:_query,title,onAfterClose,inline,additionalSelect,orderBy}=_ref,[selectedUrlIndex,setSelectedUrlIndex]=(0,react.useState)(urlsIndex||0),originalUrl=(urls||[])[selectedUrlIndex]?.value||_url||"",logic=(0,personsModalLogic.D)({url:originalUrl,query:_query,additionalSelect,orderBy}),{query,actors,actorsResponseLoading,actorsResponse,errorObject,validationError,insightActorsQueryOptions,searchTerm,actorLabel,isCohortModalOpen,isModalOpen,missingActorsCount,propertiesTimelineFilterFromUrl,exploreUrl,actorsQuery}=(0,index_esm.useValues)(logic),{updateActorsQuery,setSearchTerm,saveAsCohort,setIsCohortModalOpen,closeModal,loadNextActors}=(0,index_esm.useActions)(logic),{openSessionPlayer}=(0,index_esm.useActions)(sessionPlayerModalLogic.A),{currentTeam}=(0,index_esm.useValues)(teamLogic.H),{startExport}=(0,index_esm.useActions)(exportsLogic.exportsLogic),totalActorsCount=missingActorsCount+actors.length,getTitle=(0,react.useCallback)(()=>"function"==typeof title?title((0,utils.fm)(actorLabel.plural)):(0,insights_utils.sc)(title)?"Other":title,[title,actorLabel.plural]);return(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsxs)(src.fQ,{title:null,isOpen:isModalOpen,onClose:closeModal,onAfterClose:onAfterClose,simple:!0,width:560,inline:inline,children:[(0,jsx_runtime.jsx)(src.fQ.Header,{children:(0,jsx_runtime.jsx)("h3",{children:getTitle()})}),(0,jsx_runtime.jsxs)("div",{className:"px-4 py-2",children:[actorsResponse&&!!missingActorsCount&&(0,jsx_runtime.jsx)(MissingPersonsAlert,{actorLabel:actorLabel,missingActorsCount:missingActorsCount}),(0,jsx_runtime.jsx)(src.DF,{type:"search",placeholder:"Search for persons by email, name, or ID",fullWidth:!0,value:searchTerm,onChange:setSearchTerm,className:"my-2"}),urls?(0,jsx_runtime.jsx)(src.Yv,{fullWidth:!0,className:"mb-2",value:selectedUrlIndex,onChange:v=>{null!==v&&v>=0&&setSelectedUrlIndex(v)},options:(urls||[]).map((url,index)=>({value:index,label:url.label}))}):null,query&&(0,persons_modal_utils.Nc)(insightActorsQueryOptions,query).map(_ref2=>{var _query$key;let[key,options]=_ref2;return"breakdowns"===key?options.map((_ref3,index)=>{var _query$breakdown$inde;let{values}=_ref3;return(0,jsx_runtime.jsx)("div",{children:(0,jsx_runtime.jsx)(src.Yv,{fullWidth:!0,className:"mb-2",value:null!==(_query$breakdown$inde=query?.breakdown?.[index])&&void 0!==_query$breakdown$inde?_query$breakdown$inde:null,onChange:v=>{let breakdown=Array.isArray(query.breakdown)?[...query.breakdown]:[];breakdown[index]=v,updateActorsQuery({breakdown})},options:values})},`${key}_${index}`)}):(0,jsx_runtime.jsx)("div",{children:(0,jsx_runtime.jsx)(src.Yv,{fullWidth:!0,className:"mb-2",value:null!==(_query$key=query?.[key])&&void 0!==_query$key?_query$key:null,onChange:v=>updateActorsQuery({[key]:v}),options:options})},key)}),(0,jsx_runtime.jsx)("div",{className:"flex items-center gap-2 text-muted",children:actorsResponseLoading?(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsx)(Spinner.$,{}),(0,jsx_runtime.jsxs)("span",{children:["Loading ",actorLabel.plural,"..."]})]}):(0,jsx_runtime.jsxs)("span",{children:[actorsResponse?.next||actorsResponse?.offset?"More than ":"",(0,jsx_runtime.jsxs)("b",{children:[totalActorsCount||"No"," unique"," ",(0,utils.Zi)(totalActorsCount,actorLabel.singular,actorLabel.plural,!1)]})]})})]}),(0,jsx_runtime.jsx)("div",{className:"px-4 overflow-hidden flex flex-col",children:(0,jsx_runtime.jsxs)("div",{className:"relative min-h-20 p-2 space-y-2 rounded bg-border-light overflow-y-auto mb-2",children:[errorObject?validationError?(0,jsx_runtime.jsx)(EmptyStates._f,{query:query,detail:validationError}):(0,jsx_runtime.jsx)(EmptyStates.jC,{query:query}):actors&&actors.length>0?(0,jsx_runtime.jsx)(jsx_runtime.Fragment,{children:actors.map(actor=>(0,jsx_runtime.jsx)(ActorRow,{actor:actor,onOpenRecording:sessionRecording=>{openSessionPlayer(sessionRecording)},propertiesTimelineFilter:"person"==actor.type&¤tTeam?.person_on_events_querying_enabled?propertiesTimelineFilterFromUrl:void 0},actor.id))}):actorsResponseLoading?(0,jsx_runtime.jsxs)("div",{className:"space-y-3",children:[(0,jsx_runtime.jsx)(src.yW,{active:!1,className:"h-4 w-full"}),(0,jsx_runtime.jsx)(src.yW,{active:!1,className:"h-4 w-3/5"})]}):(0,jsx_runtime.jsxs)("div",{className:"text-center p-5",children:["We couldn't find any matching ",actorLabel.plural," for this data point."]}),(actorsResponse?.next||actorsResponse?.offset)&&(0,jsx_runtime.jsx)("div",{className:"m-4 flex justify-center",children:(0,jsx_runtime.jsxs)(src.Jp,{type:"primary",onClick:loadNextActors,loading:actorsResponseLoading,children:["Load more ",actorLabel.plural]})})]})}),(0,jsx_runtime.jsx)(src.fQ.Footer,{children:(0,jsx_runtime.jsxs)("div",{className:"flex justify-between gap-2 w-full",children:[(0,jsx_runtime.jsxs)("div",{className:"flex gap-2",children:[actors.length>0&&(0,jsx_runtime.jsx)(src.Jp,{type:"secondary",onClick:()=>{startExport({export_format:types.P5.CSV,export_context:query?{source:{...actorsQuery,select:actorsQuery.select?.filter(c=>"matched_recordings"!==c),source:{...actorsQuery.source,includeRecordings:!1}}}:{path:originalUrl}})},tooltip:`Up to ${DataTableExport.yP} persons will be exported`,"data-attr":"person-modal-download-csv",children:"Download CSV"}),actors.length>0&&!(0,utils.tK)(actors[0])&&(0,jsx_runtime.jsx)(src.Jp,{onClick:()=>setIsCohortModalOpen(!0),type:"secondary","data-attr":"person-modal-save-as-cohort",disabled:!actors.length,children:"Save as cohort"})]}),exploreUrl&&(0,jsx_runtime.jsx)(src.Jp,{type:"primary",to:exploreUrl,"data-attr":"person-modal-new-insight",onClick:()=>{closeModal()},children:"Explore"})]})})]}),(0,jsx_runtime.jsx)(SaveCohortModal,{onSave:title=>saveAsCohort(title),onCancel:()=>setIsCohortModalOpen(!1),isOpen:isCohortModalOpen})]})}function ActorRow(_ref4){let{actor,onOpenRecording,propertiesTimelineFilter}=_ref4,[expanded,setExpanded]=(0,react.useState)(!1),[tab,setTab]=(0,react.useState)("properties"),name=(0,utils.tK)(actor)?(0,GroupActorDisplay.O)(actor.group_key,actor.properties):(0,person_utils.y)(actor),matchedRecordings=actor.matched_recordings||[];return(0,jsx_runtime.jsxs)("div",{className:"relative border rounded bg-bg-light",children:[(0,jsx_runtime.jsxs)("div",{className:"flex items-center gap-2 p-2",children:[(0,jsx_runtime.jsx)(src.Jp,{noPadding:!0,active:expanded,onClick:()=>setExpanded(!expanded),icon:expanded?(0,jsx_runtime.jsx)(posthog_icons_es.IconCollapse,{}):(0,jsx_runtime.jsx)(posthog_icons_es.IconExpand,{}),title:expanded?"Show less":"Show more","data-attr":`persons-modal-expand-${actor.id}`}),(0,jsx_runtime.jsx)(ProfilePicture.Y,{name:name,size:"md"}),(0,jsx_runtime.jsx)("div",{className:"flex-1 overflow-hidden",children:(0,utils.tK)(actor)?(0,jsx_runtime.jsx)("div",{className:"font-bold",children:(0,jsx_runtime.jsx)(GroupActorDisplay.k,{actor:actor})}):(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[(0,jsx_runtime.jsx)("div",{className:"font-bold flex items-start",children:(0,jsx_runtime.jsx)(PersonDisplay.I,{person:actor,withIcon:!1})}),actor.distinct_ids?.[0]&&(0,jsx_runtime.jsx)(CopyToClipboard.D,{explicitValue:actor.distinct_ids[0],iconStyle:{color:"var(--primary)"},iconPosition:"end",className:"text-xs text-muted-alt",children:(0,utils.mq)(actor.distinct_ids[0],32)})]})}),matchedRecordings.length&&matchedRecordings.length>0?(0,jsx_runtime.jsx)("div",{className:"shrink-0",children:(0,jsx_runtime.jsx)(src.Jp,{onClick:()=>{actor.matched_recordings&&(actor.matched_recordings?.length>1?(setExpanded(!0),setTab("recordings")):actor.matched_recordings[0].session_id&&onOpenRecording({id:actor.matched_recordings[0].session_id,matching_events:actor.matched_recordings}))},sideIcon:1===matchedRecordings.length?(0,jsx_runtime.jsx)(icons.Ud,{}):null,type:"secondary",status:matchedRecordings.length>1?"alt":void 0,size:"small",children:matchedRecordings.length>1?`${matchedRecordings.length} recordings`:"View recording"})}):null]}),expanded?(0,jsx_runtime.jsx)("div",{className:"PersonsModal__tabs bg-bg-3000 border-t rounded-b",children:(0,jsx_runtime.jsx)(LemonTabs.T,{activeKey:tab,onChange:setTab,tabs:[{key:"properties",label:"Properties",content:propertiesTimelineFilter?(0,jsx_runtime.jsx)(PropertiesTimeline.v,{actor:actor,filter:propertiesTimelineFilter}):(0,jsx_runtime.jsx)(PropertiesTable.V,{type:actor.type,properties:actor.properties})},{key:"recordings",label:"Recordings",content:(0,jsx_runtime.jsxs)("div",{className:"p-2 space-y-2 font-medium mt-1",children:[(0,jsx_runtime.jsx)("div",{className:"flex justify-between items-center px-2",children:(0,jsx_runtime.jsx)("span",{children:(0,utils.Zi)(matchedRecordings.length,"matched recording")})}),(0,jsx_runtime.jsx)("ul",{className:"space-y-px",children:matchedRecordings?.length?matchedRecordings.map((recording,i)=>(0,jsx_runtime.jsxs)(react.Fragment,{children:[(0,jsx_runtime.jsx)(src.p2,{className:"my-0"}),(0,jsx_runtime.jsx)("li",{children:(0,jsx_runtime.jsx)(src.Jp,{fullWidth:!0,onClick:()=>{recording.session_id&&onOpenRecording({id:recording.session_id,matching_events:[{events:recording.events,session_id:recording.session_id}]})},children:(0,jsx_runtime.jsxs)("div",{className:"flex flex-1 justify-between gap-2 items-center",children:[(0,jsx_runtime.jsxs)("span",{children:["View recording ",i+1]}),(0,jsx_runtime.jsx)(icons.Ud,{className:"text-xl text-muted"})]})})})]},i)):null})]})}]})}):null,null!==actor.value_at_data_point&&(0,jsx_runtime.jsx)(Tooltip.u,{title:`${name}'s value for this data point.`,children:(0,jsx_runtime.jsx)(src.Mo.Number,{count:actor.value_at_data_point,maxDigits:1/0,position:"top-right",style:{pointerEvents:"auto"}})})]})}function MissingPersonsAlert(_ref5){let{actorLabel,missingActorsCount}=_ref5;return(0,jsx_runtime.jsxs)(src.Vp,{type:"info",className:"mb-2",children:[missingActorsCount," ",missingActorsCount>1?`${actorLabel.plural} are`:`${actorLabel.singular} is`," not shown because they've been merged with those listed, or\xa0deleted."," ",(0,jsx_runtime.jsx)(src.rU,{to:"https://posthog.com/docs/how-posthog-works/queries#insights-counting-unique-persons",children:"Learn more."})]})}let openPersonsModal=props=>{let div=document.createElement("div"),root=(0,client.createRoot)(div);document.body.appendChild(div),root.render((0,jsx_runtime.jsx)(PersonsModal_PersonsModal,{...props,onAfterClose:function(){root.unmount(),div.parentNode&&div.parentNode.removeChild(div)}}))}},"./frontend/src/scenes/trends/persons-modal/persons-modal-utils.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Nc:()=>cleanedInsightActorsQueryOptions,Vx:()=>pathsTitle,un:()=>funnelTitle});var lib_components_PropertyKeyInfo__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./frontend/src/lib/components/PropertyKeyInfo.tsx"),lib_components_TaxonomicFilter_types__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/components/TaxonomicFilter/types.ts"),lib_taxonomy__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/taxonomy.tsx"),lib_utils__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/lib/utils.tsx"),_queries_utils__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/queries/utils.ts"),_types__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/types.ts"),react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");let funnelTitle=props=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:[props.order_type===_types__WEBPACK_IMPORTED_MODULE_5__.kO.UNORDERED?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:props.converted?(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Completed ",(0,lib_utils__WEBPACK_IMPORTED_MODULE_3__.Zi)(props.step,"step","steps")," "]}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:["Completed ",(0,lib_utils__WEBPACK_IMPORTED_MODULE_3__.Zi)(props.step-1,"step","steps"),", did not complete"," ",(0,lib_utils__WEBPACK_IMPORTED_MODULE_3__.Zi)(props.step,"step","steps")," "]})}):(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:[props.converted?"Completed":"Dropped off at"," step ",props.step," •"," ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(lib_components_PropertyKeyInfo__WEBPACK_IMPORTED_MODULE_0__.T,{value:props.label||"",disablePopover:!0,type:lib_components_TaxonomicFilter_types__WEBPACK_IMPORTED_MODULE_1__.t.Events})," "]}),props?.breakdown_value?`• ${props.breakdown_value}`:""]}),pathsTitle=props=>(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.Fragment,{children:[{completion:"Completed",dropOff:"Dropped off after",continue:"Continued after"}[props.mode]," step"," ",(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(lib_components_PropertyKeyInfo__WEBPACK_IMPORTED_MODULE_0__.T,{value:props.label.replace(/(^[0-9]+_)/,"")||"",disablePopover:!0})]}),cleanedInsightActorsQueryOptions=(insightActorsQueryOptions,query)=>{let cleanedOptions=Object.entries(null!=insightActorsQueryOptions?insightActorsQueryOptions:{}).filter(_ref=>{let[,value]=_ref;return Array.isArray(value)&&!!value.length}),source=query?.source,seriesNames=(0,_queries_utils__WEBPACK_IMPORTED_MODULE_4__.kX)(source)?source.series.map(s=>s.custom_name):[],cleanedOptionsWithAdjustedSeriesNames=cleanedOptions.map(_ref2=>{let[key,value]=_ref2;return"series"===key?[key,value.map((v,index)=>{var _ref3,_seriesNames$index;return{...v,label:null!==(_ref3=null!==(_seriesNames$index=seriesNames[index])&&void 0!==_seriesNames$index?_seriesNames$index:lib_taxonomy__WEBPACK_IMPORTED_MODULE_2__.NV(v.label,lib_components_TaxonomicFilter_types__WEBPACK_IMPORTED_MODULE_1__.t.Events)?.label)&&void 0!==_ref3?_ref3:v.label}})]:[key,value]});return cleanedOptionsWithAdjustedSeriesNames}},"./frontend/src/scenes/trends/persons-modal/personsModalLogic.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{D:()=>personsModalLogic});var _posthog_lemon_ui__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./frontend/@posthog/lemon-ui/src/index.ts"),kea__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),kea_loaders__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./node_modules/.pnpm/kea-loaders@3.0.0_kea@3.1.5/node_modules/kea-loaders/lib/index.js"),kea_router__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/api.ts"),lib_utils__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/lib/utils.tsx"),lib_utils_eventUsageLogic__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/lib/utils/eventUsageLogic.ts"),scenes_insights_utils_cleanFilters__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./frontend/src/scenes/insights/utils/cleanFilters.ts"),scenes_urls__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./frontend/src/scenes/urls.ts"),_models_cohortsModel__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__("./frontend/src/models/cohortsModel.ts"),_models_groupsModel__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__("./frontend/src/models/groupsModel.ts"),_queries_query__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__("./frontend/src/queries/query.ts"),_queries_schema__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__("./frontend/src/queries/schema.ts");let personsModalLogic=(0,kea__WEBPACK_IMPORTED_MODULE_1__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_1__.path)(["scenes","trends","personsModalLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_1__.props)({}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.actions)({setSearchTerm:search=>({search}),saveAsCohort:cohortName=>({cohortName}),resetActors:()=>!0,closeModal:()=>!0,setIsCohortModalOpen:isOpen=>({isOpen}),loadActors:_ref=>{let{url,clear,offset}=_ref;return{url,clear,offset}},loadNextActors:!0,updateQuery:query=>({query}),updateActorsQuery:query=>({query}),loadActorsQueryOptions:query=>({query})}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.connect)({values:[_models_groupsModel__WEBPACK_IMPORTED_MODULE_10__.$,["groupTypes","aggregationLabel"]],actions:[lib_utils_eventUsageLogic__WEBPACK_IMPORTED_MODULE_6__.vx,["reportPersonsModalViewed"]]}),(0,kea_loaders__WEBPACK_IMPORTED_MODULE_2__.loaders)(_ref2=>{let{values,actions,props}=_ref2;return{actorsResponse:[null,{loadActors:async(_ref3,breakpoint)=>{let{url,clear,offset}=_ref3;if(url&&(url+="&include_recordings=true",values.searchTerm&&(url+=`&search=${values.searchTerm}`)),url&&!values.actorsQuery){let res=await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.get(url);return breakpoint(),clear&&actions.resetActors(),res}if(values.actorsQuery){let response=await (0,_queries_query__WEBPACK_IMPORTED_MODULE_11__.jr)({...values.actorsQuery,limit:offset?2*offset:100,offset});breakpoint();let assembledSelectFields=values.selectFields,additionalFieldIndices=Object.values(props.additionalSelect||{}).map(field=>assembledSelectFields.indexOf(field)),newResponse={results:[{count:response.results.length,people:response.results.map(result=>{if(void 0!==result[0].group_type_index){let group={type:"group",id:result[0].id,group_key:result[0].group_key,group_type_index:result[0].group_type_index,properties:result[0].group_properties,created_at:result[0].created_at,matched_recordings:[],value_at_data_point:null};return Object.keys(props.additionalSelect||{}).forEach((field,index)=>{group[field]=result[additionalFieldIndices[index]]}),group}let person={type:"person",id:result[0].id,uuid:result[0].id,distinct_ids:result[0].distinct_ids,is_identified:result[0].is_identified,properties:result[0].properties,created_at:result[0].created_at,matched_recordings:[],value_at_data_point:null};return Object.keys(props.additionalSelect||{}).forEach((field,index)=>{person[field]=result[additionalFieldIndices[index]]}),person})}]};return newResponse.offset=response.hasMore?response.offset+response.limit:void 0,newResponse.missing_persons=response.missing_actors_count,clear&&actions.resetActors(),newResponse}return null}}],insightActorsQueryOptions:[null,{loadActorsQueryOptions:async _ref4=>{let{query}=_ref4;if(!query)return values.insightActorsQueryOptions||null;let optionsQuery={kind:_queries_schema__WEBPACK_IMPORTED_MODULE_12__.OH.InsightActorsQueryOptions,source:query},response=await (0,_queries_query__WEBPACK_IMPORTED_MODULE_11__.jr)(optionsQuery,{async:!1});return Object.fromEntries(Object.entries(response).filter(_ref5=>{let[key,_]=_ref5;return _queries_schema__WEBPACK_IMPORTED_MODULE_12__.$V.includes(key)}))}}]}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.reducers)(_ref6=>{let{props}=_ref6;return{query:[props.query,{updateQuery:(_,_ref7)=>{let{query}=_ref7;return query}}],actors:[[],{loadActorsSuccess:(state,_ref8)=>{let{actorsResponse}=_ref8;return[...state,...actorsResponse?.results?.[0]?.people||[]]},resetActors:()=>[]}],errorObject:[null,{loadActors:()=>null,loadActorsFailure:(_,_ref9)=>{let{errorObject}=_ref9;return errorObject},loadActorsSuccess:()=>null}],missingActorsCount:[0,{loadActorsSuccess:(state,_ref10)=>{let{actorsResponse}=_ref10;return state+(actorsResponse?.missing_persons||0)},resetActors:()=>0}],searchTerm:["",{setSearchTerm:(_,_ref11)=>{let{search}=_ref11;return search}}],isModalOpen:[!0,{closeModal:()=>!1}],isCohortModalOpen:[!1,{setIsCohortModalOpen:(_,_ref12)=>{let{isOpen}=_ref12;return isOpen},closeModal:()=>!1}]}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.listeners)(_ref13=>{let{actions,values,props}=_ref13;return{setSearchTerm:async(_,breakpoint)=>{await breakpoint(500),actions.loadActors({url:props.url,clear:!0})},saveAsCohort:async _ref14=>{let{cohortName}=_ref14,cohort=await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.create("api/cohort",{is_static:!0,name:cohortName,query:values.actorsQuery});_models_cohortsModel__WEBPACK_IMPORTED_MODULE_9__.Q.actions.cohortCreated(cohort),_posthog_lemon_ui__WEBPACK_IMPORTED_MODULE_0__.UJ.success("Cohort saved",{toastId:`cohort-saved-${cohort.id}`,button:{label:"View cohort",action:()=>kea_router__WEBPACK_IMPORTED_MODULE_3__.router.actions.push(scenes_urls__WEBPACK_IMPORTED_MODULE_8__.j.cohort(cohort.id))}}),actions.setIsCohortModalOpen(!1)},loadNextActors:()=>{values.actorsResponse?.next&&actions.loadActors({url:values.actorsResponse.next}),values.actorsResponse?.offset&&actions.loadActors({offset:values.actorsResponse.offset})},loadActors:()=>{values.query&&!values.insightActorsQueryOptions&&actions.loadActorsQueryOptions(values.query)},updateActorsQuery:_ref15=>{let{query:q}=_ref15;q&&values.query&&(actions.updateQuery({...values.query,...q}),actions.loadActors({offset:0,clear:!0}))}}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.selectors)({actorLabel:[s=>[s.actors,s.aggregationLabel],(actors,aggregationLabel)=>{let firstResult=actors[0];return firstResult?aggregationLabel((0,lib_utils__WEBPACK_IMPORTED_MODULE_5__.tK)(firstResult)?firstResult.group_type_index:void 0):{singular:"result",plural:"results"}}],validationError:[s=>[s.errorObject],errorObject=>errorObject?.status===400||errorObject?.status===512?errorObject.detail:null],propertiesTimelineFilterFromUrl:[()=>[(_,p)=>p.url],url=>{let params=new URLSearchParams(url.split("?")[1]),eventsString=params.get("events"),actionsString=params.get("actions"),propertiesString=params.get("properties"),aggregationGroupTypeIndexString=params.get("aggregation_group_type_index"),filter={date_from:params.get("date_from")||void 0,date_to:params.get("date_to")||void 0,interval:params.get("interval")||void 0,events:eventsString?JSON.parse(eventsString):void 0,actions:actionsString?JSON.parse(actionsString):void 0,properties:propertiesString?JSON.parse(propertiesString):void 0,aggregation_group_type_index:aggregationGroupTypeIndexString?parseInt(aggregationGroupTypeIndexString):void 0,display:params.get("display")||void 0,breakdown:params.get("breakdown")||void 0,breakdown_type:params.get("breakdown_type")||void 0};return(0,scenes_insights_utils_cleanFilters__WEBPACK_IMPORTED_MODULE_7__.Ow)(filter)}],selectFields:[()=>[(_,p)=>p.additionalSelect],additionalSelect=>{let extra=Object.values(additionalSelect||{});return["actor",...extra]}],actorsQuery:[s=>[(_,p)=>p.orderBy,s.query,s.searchTerm,s.selectFields],(orderBy,query,searchTerm,selectFields)=>query?{kind:_queries_schema__WEBPACK_IMPORTED_MODULE_12__.OH.ActorsQuery,source:query,select:selectFields,orderBy:orderBy||[],search:searchTerm}:null],exploreUrl:[s=>[s.actorsQuery],actorsQuery=>{if(!actorsQuery)return null;let{select:_select,...source}=actorsQuery,query={kind:_queries_schema__WEBPACK_IMPORTED_MODULE_12__.OH.DataTableNode,source,full:!0};return scenes_urls__WEBPACK_IMPORTED_MODULE_8__.j.insightNew(void 0,void 0,query)}]}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.afterMount)(_ref16=>{let{actions,props}=_ref16;actions.loadActors({url:props.url}),actions.reportPersonsModalViewed({url:props.url,query:props.query})}),(0,kea_router__WEBPACK_IMPORTED_MODULE_3__.urlToAction)(_ref17=>{let{cache,actions}=_ref17;return{"*":(_a,_b,_c,_ref18)=>{let{pathname}=_ref18;if(!cache.lastPathname){cache.lastPathname=pathname;return}cache.lastPathname!==pathname&&actions.closeModal()}}}),(0,kea__WEBPACK_IMPORTED_MODULE_1__.propsChanged)((_ref19,oldProps)=>{let{props,actions}=_ref19;props.url!==oldProps.url&&actions.loadActors({url:props.url,clear:!0})})])},"./frontend/src/scenes/trends/trendsDataLogic.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{i:()=>trendsDataLogic});var kea__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),lib_dayjs__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/dayjs.ts"),scenes_insights_insightVizDataLogic__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/scenes/insights/insightVizDataLogic.ts"),scenes_insights_sharedUtils__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/scenes/insights/sharedUtils.ts"),scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/scenes/insights/utils.tsx"),_queries_utils__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/queries/utils.ts"),_types__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/types.ts");let POSSIBLY_FRACTIONAL_MATH_TYPES=new Set([_types__WEBPACK_IMPORTED_MODULE_6__.D7.Average].concat(Object.values(_types__WEBPACK_IMPORTED_MODULE_6__.mY)).concat(Object.values(_types__WEBPACK_IMPORTED_MODULE_6__.O4))),trendsDataLogic=(0,kea__WEBPACK_IMPORTED_MODULE_0__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_0__.props)({}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.key)((0,scenes_insights_sharedUtils__WEBPACK_IMPORTED_MODULE_3__.bk)("all_trends")),(0,kea__WEBPACK_IMPORTED_MODULE_0__.path)(key=>["scenes","trends","trendsDataLogic",key]),(0,kea__WEBPACK_IMPORTED_MODULE_0__.connect)(props=>({values:[(0,scenes_insights_insightVizDataLogic__WEBPACK_IMPORTED_MODULE_2__.Z)(props),["querySource","insightData","insightDataLoading","series","formula","display","compareFilter","interval","enabledIntervals","breakdownFilter","showValuesOnSeries","showLabelOnSeries","showPercentStackView","supportsPercentStackView","insightFilter","trendsFilter","lifecycleFilter","stickinessFilter","isTrends","isDataWarehouseSeries","isLifecycle","isStickiness","isNonTimeSeriesDisplay","isSingleSeries","hasLegend","showLegend","vizSpecificOptions","yAxisScaleType","resultCustomizationBy","theme"]],actions:[(0,scenes_insights_insightVizDataLogic__WEBPACK_IMPORTED_MODULE_2__.Z)(props),["setInsightData","updateInsightFilter","updateBreakdownFilter","updateHiddenLegendIndexes"]]})),(0,kea__WEBPACK_IMPORTED_MODULE_0__.actions)({loadMoreBreakdownValues:!0,setBreakdownValuesLoading:loading=>({loading}),toggleHiddenLegendIndex:index=>({index})}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.reducers)({breakdownValuesLoading:[!1,{setBreakdownValuesLoading:(_,_ref)=>{let{loading}=_ref;return loading}}]}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.selectors)(_ref2=>{let{values}=_ref2;return{alertSeries:[s=>[s.querySource],queryNode=>null===queryNode?[]:queryNode.series],results:[s=>[s.insightData],insightData=>insightData?.result&&Array.isArray(insightData.result)?insightData.result:[]],hasBreakdownMore:[s=>[s.insightData,s.isTrends],(insightData,isTrends)=>!!isTrends&&!!insightData.hasMore],isBreakdownValid:[s=>[s.breakdownFilter],breakdownFilter=>(0,_queries_utils__WEBPACK_IMPORTED_MODULE_5__.AV)(breakdownFilter)],indexedResults:[s=>[s.results,s.display,s.lifecycleFilter],(results,display,lifecycleFilter)=>{let defaultLifecyclesOrder=["new","resurrecting","returning","dormant"],indexedResults=results.map((result,index)=>({...result,seriesIndex:index}));display&&(display===_types__WEBPACK_IMPORTED_MODULE_6__.Qb.ActionsBarValue||display===_types__WEBPACK_IMPORTED_MODULE_6__.Qb.ActionsPie)?indexedResults.sort((a,b)=>{let aValue=a.breakdown_value===scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.T8?-scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.Oq:a.breakdown_value===scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.ZA?-scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.Tu:a.aggregated_value,bValue=b.breakdown_value===scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.T8?-scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.Oq:b.breakdown_value===scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.ZA?-scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.Tu:b.aggregated_value;return bValue-aValue}):lifecycleFilter&&(lifecycleFilter.toggledLifecycles&&(indexedResults=indexedResults.filter(result=>lifecycleFilter.toggledLifecycles.includes(String(result.status)))),indexedResults=indexedResults.sort((a,b)=>defaultLifecyclesOrder.indexOf(String(b.status))-defaultLifecyclesOrder.indexOf(String(a.status))));let uniqSeries=Array.from(new Set(indexedResults.map(item=>`${item.label}_${item.action?.order}_${item?.breakdown_value}`)));return indexedResults.map((item,index)=>{let colorIndex=uniqSeries.findIndex(identifier=>identifier===`${item.label}_${item.action?.order}_${item?.breakdown_value}`);return{...item,colorIndex:colorIndex,id:index}})}],labelGroupType:[s=>[s.series,s.querySource,s.isLifecycle],(series,querySource,isLifecycle)=>{var _firstAggregationGrou;let firstAggregationGroupTypeIndex;if(isLifecycle)firstAggregationGroupTypeIndex=querySource?.aggregation_group_type_index;else if(firstAggregationGroupTypeIndex=series?.[0]?.math_group_type_index,!series?.every(eOrA=>eOrA?.math_group_type_index===firstAggregationGroupTypeIndex))return"none";return null!==(_firstAggregationGrou=firstAggregationGroupTypeIndex)&&void 0!==_firstAggregationGrou?_firstAggregationGrou:"people"}],incompletenessOffsetFromEnd:[s=>[s.results,s.interval],(results,interval)=>{if(results[0]?.days===void 0)return 0;let startDate=(0,lib_dayjs__WEBPACK_IMPORTED_MODULE_1__.Bv)().tz("utc",!0).startOf(null!=interval?interval:"d"),startIndex=results[0].days.findIndex(day=>(0,lib_dayjs__WEBPACK_IMPORTED_MODULE_1__.Bv)(day).tz("utc",!0)>=startDate);return void 0!==startIndex&&-1!==startIndex?startIndex-results[0].days.length:0}],pieChartVizOptions:[()=>[()=>values.vizSpecificOptions],vizSpecificOptions=>vizSpecificOptions?.[_types__WEBPACK_IMPORTED_MODULE_6__.Qb.ActionsPie]],mightContainFractionalNumbers:[s=>[s.formula,s.series],(formula,series)=>!!formula||!!series&&series.some(s=>s.math&&POSSIBLY_FRACTIONAL_MATH_TYPES.has(s.math))],hiddenLegendIndexes:[s=>[s.trendsFilter,s.stickinessFilter],(trendsFilter,stickinessFilter)=>trendsFilter?.hiddenLegendIndexes||stickinessFilter?.hiddenLegendIndexes||[]],resultCustomizations:[s=>[s.trendsFilter],trendsFilter=>trendsFilter?.resultCustomizations],getTrendsColorToken:[s=>[s.resultCustomizationBy,s.resultCustomizations,s.theme],(resultCustomizationBy,resultCustomizations,theme)=>dataset=>null==theme?null:(0,scenes_insights_utils__WEBPACK_IMPORTED_MODULE_4__.BD)(resultCustomizationBy,resultCustomizations,theme,dataset)],getTrendsColor:[s=>[s.theme,s.getTrendsColorToken],(theme,getTrendsColorToken)=>dataset=>null==theme?"#000000":theme[getTrendsColorToken(dataset)]]}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.listeners)(_ref3=>{let{actions,values}=_ref3;return{toggleHiddenLegendIndex:_ref4=>{let{index}=_ref4;values.insightFilter?.hiddenLegendIndexes?.includes(index)?actions.updateHiddenLegendIndexes(values.insightFilter.hiddenLegendIndexes?.filter(idx=>idx!==index)):actions.updateHiddenLegendIndexes([...values.insightFilter?.hiddenLegendIndexes||[],index])}}})])},"./frontend/src/scenes/urls.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{j:()=>urls});var kea_router__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_utils_getAppContext__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/utils/getAppContext.ts"),_types__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/types.ts");let urls={absolute:function(){let path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return window.location.origin+path},default:()=>"/",project:function(id){let path=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return`/project/${id}`+path},currentProject:function(){let path=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return urls.project((0,lib_utils_getAppContext__WEBPACK_IMPORTED_MODULE_1__.ev)(),path)},dashboards:()=>"/dashboard",dashboard:(id,highlightInsightId)=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)(`/dashboard/${id}`,highlightInsightId?{highlightInsightId}:{}).url,dashboardTextTile:(id,textTileId)=>`${urls.dashboard(id)}/text-tiles/${textTileId}`,dashboardSharing:id=>`/dashboard/${id}/sharing`,dashboardSubcriptions:id=>`/dashboard/${id}/subscriptions`,dashboardSubcription:(id,subscriptionId)=>`/dashboard/${id}/subscriptions/${subscriptionId}`,sharedDashboard:shareToken=>`/shared_dashboard/${shareToken}`,createAction:()=>"/data-management/actions/new",duplicateAction:action=>{let queryParams=action?`?copy=${encodeURIComponent(JSON.stringify(action))}`:"";return`/data-management/actions/new/${queryParams}`},action:id=>`/data-management/actions/${id}`,actions:()=>"/data-management/actions",eventDefinitions:()=>"/data-management/events",eventDefinition:id=>`/data-management/events/${id}`,eventDefinitionEdit:id=>`/data-management/events/${id}/edit`,propertyDefinitions:type=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)("/data-management/properties",type?{type}:{}).url,propertyDefinition:id=>`/data-management/properties/${id}`,propertyDefinitionEdit:id=>`/data-management/properties/${id}/edit`,dataManagementHistory:()=>"/data-management/history",database:()=>"/data-management/database",activity:function(){let tab=arguments.length>0&&void 0!==arguments[0]?arguments[0]:_types__WEBPACK_IMPORTED_MODULE_2__.ZO.ExploreEvents;return`/activity/${tab}`},event:(id,timestamp)=>`/events/${encodeURIComponent(id)}/${encodeURIComponent(timestamp)}`,ingestionWarnings:()=>"/data-management/ingestion-warnings",insights:()=>"/insights",insightNew:(type,dashboardId,query)=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)("/insights/new",dashboardId?{dashboard:dashboardId}:{},{...type?{insight:type}:{},...query?{q:"string"==typeof query?query:JSON.stringify(query)}:{}}).url,insightNewHogQL:(query,filters)=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)("/data-warehouse",{},{q:JSON.stringify({kind:"DataTableNode",full:!0,source:{kind:"HogQLQuery",query,filters}})}).url,insightEdit:id=>`/insights/${id}/edit`,insightView:(id,dashboardId,variablesOverride)=>{let params=[{param:"dashboard",value:dashboardId},{param:"variables_override",value:variablesOverride}].filter(n=>!!n.value).map(n=>`${n.param}=${encodeURIComponent(JSON.stringify(n.value))}`).join("&");return`/insights/${id}${params.length?`?${params}`:""}`},insightSubcriptions:id=>`/insights/${id}/subscriptions`,insightSubcription:(id,subscriptionId)=>`/insights/${id}/subscriptions/${subscriptionId}`,insightSharing:id=>`/insights/${id}/sharing`,savedInsights:tab=>`/insights${tab?`?tab=${tab}`:""}`,webAnalytics:()=>"/web",webAnalyticsCoreWebVitals:()=>"/web/core-web-vitals",replay:(tab,filters,sessionRecordingId,order)=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)(tab?`/replay/${tab}`:"/replay/home",{...filters?{filters}:{},...sessionRecordingId?{sessionRecordingId}:{},...order?{order}:{}}).url,replayPlaylist:id=>`/replay/playlists/${id}`,replaySingle:id=>`/replay/${id}`,replayFilePlayback:()=>"/replay/file-playback",personByDistinctId:function(id){let encode=!(arguments.length>1)||void 0===arguments[1]||arguments[1];return encode?`/person/${encodeURIComponent(id)}`:`/person/${id}`},personByUUID:function(uuid){let encode=!(arguments.length>1)||void 0===arguments[1]||arguments[1];return encode?`/persons/${encodeURIComponent(uuid)}`:`/persons/${uuid}`},persons:()=>"/persons",pipelineNodeNew:(stage,id)=>`/pipeline/new/${stage}${id?`/${id}`:""}`,pipeline:tab=>`/pipeline/${tab||_types__WEBPACK_IMPORTED_MODULE_2__.J9.Overview}`,pipelineNode:(stage,id,nodeTab)=>`/pipeline/${stage.startsWith(":")||stage?.endsWith("s")?stage:`${stage}s`}/${id}${nodeTab?`/${nodeTab}`:""}`,messagingBroadcasts:()=>"/messaging/broadcasts",messagingBroadcast:id=>`/messaging/broadcasts/${id}`,messagingBroadcastNew:()=>"/messaging/broadcasts/new",messagingProviders:()=>"/messaging/providers",messagingProvider:id=>`/messaging/providers/${id}`,messagingProviderNew:template=>"/messaging/providers/new"+(template?`/${template}`:""),groups:groupTypeIndex=>`/groups/${groupTypeIndex}`,group:function(groupTypeIndex,groupKey){let encode=!(arguments.length>2)||void 0===arguments[2]||arguments[2],tab=arguments.length>3?arguments[3]:void 0;return`/groups/${groupTypeIndex}/${encode?encodeURIComponent(groupKey):groupKey}${tab?`/${tab}`:""}`},cohort:id=>`/cohorts/${id}`,cohorts:()=>"/cohorts",experiment:id=>`/experiments/${id}`,experiments:()=>"/experiments",experimentsSharedMetrics:()=>"/experiments/shared-metrics",experimentsSharedMetric:id=>`/experiments/shared-metrics/${id}`,featureFlags:tab=>`/feature_flags${tab?`?tab=${tab}`:""}`,featureFlag:id=>`/feature_flags/${id}`,featureManagement:id=>`/features${id?`/${id}`:""}`,earlyAccessFeatures:()=>"/early_access_features",earlyAccessFeature:id=>`/early_access_features/${id}`,errorTracking:()=>"/error_tracking",errorTrackingConfiguration:()=>"/error_tracking/configuration",errorTrackingIssue:id=>`/error_tracking/${id}`,surveys:tab=>`/surveys${tab?`?tab=${tab}`:""}`,survey:id=>`/surveys/${id}`,surveyTemplates:()=>"/survey_templates",customCss:()=>"/themes/custom-css",dataWarehouse:query=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)("/data-warehouse",{},query?{q:"string"==typeof query?query:JSON.stringify(query)}:{}).url,sqlEditor:()=>"/sql",dataWarehouseView:id=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)(`/data-warehouse/view/${id}`).url,dataWarehouseTable:()=>"/data-warehouse/new",dataWarehouseRedirect:kind=>`/data-warehouse/${kind}/redirect`,annotations:()=>"/data-management/annotations",annotation:id=>`/data-management/annotations/${id}`,organizationCreateFirst:()=>"/create-organization",projectCreateFirst:()=>"/organization/create-project",projectHomepage:()=>"/",max:()=>"/max",settings:function(){let section=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"project",setting=arguments.length>1?arguments[1]:void 0;return(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)(`/settings/${section}`,void 0,setting).url},organizationCreationConfirm:()=>"/organization/confirm-creation",toolbarLaunch:()=>"/toolbar",site:url=>`/site/${":url"===url?url:encodeURIComponent(url)}`,login:()=>"/login",login2FA:()=>"/login/2fa",login2FASetup:()=>"/login/2fa_setup",passwordReset:()=>"/reset",passwordResetComplete:(userUuid,token)=>`/reset/${userUuid}/${token}`,preflight:()=>"/preflight",signup:()=>"/signup",verifyEmail:function(){let userUuid=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",token=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return`/verify_email${userUuid?`/${userUuid}`:""}${token?`/${token}`:""}`},inviteSignup:id=>`/signup/${id}`,products:()=>"/products",onboarding:(productKey,stepKey,sdk)=>`/onboarding/${productKey}${stepKey?"?step="+stepKey:""}${sdk&&stepKey?"&sdk="+sdk:sdk?"?sdk="+sdk:""}`,organizationBilling:products=>`/organization/billing${products&&products.length?`?products=${products.join(",")}`:""}`,organizationBillingSection:function(){let section=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"overview";return(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)(`/organization/billing/${section}`).url},billingAuthorizationStatus:()=>"/billing/authorization_status",instanceStatus:()=>"/instance/status",instanceStaffUsers:()=>"/instance/staff_users",instanceKafkaInspector:()=>"/instance/kafka_inspector",instanceSettings:()=>"/instance/settings",instanceMetrics:()=>"/instance/metrics",asyncMigrations:()=>"/instance/async_migrations",asyncMigrationsFuture:()=>"/instance/async_migrations/future",asyncMigrationsSettings:()=>"/instance/async_migrations/settings",deadLetterQueue:()=>"/instance/dead_letter_queue",unsubscribe:()=>"/unsubscribe",integrationsRedirect:kind=>`/integrations/${kind}/callback`,shared:function(token){let exportOptions=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)(`/shared/${token}`,Object.entries(exportOptions).filter(x=>x[1]).reduce((acc,_ref)=>{let[key,val]=_ref;return{...acc,[key]:!0===val?null:val}},{})).url},embedded:(token,exportOptions)=>urls.shared(token,exportOptions).replace("/shared/","/embedded/"),debugQuery:query=>(0,kea_router__WEBPACK_IMPORTED_MODULE_0__.combineUrl)("/debug",{},query?{q:"string"==typeof query?query:JSON.stringify(query)}:{}).url,debugHog:()=>"/debug/hog",feedback:()=>"/feedback",issues:()=>"/issues",notebooks:()=>"/notebooks",notebook:shortId=>`/notebooks/${shortId}`,canvas:()=>"/canvas",moveToPostHogCloud:()=>"/move-to-cloud",heatmaps:params=>`/heatmaps${params?`?${params.startsWith("?")?params.slice(1):params}`:""}`,alert:alertId=>`/insights?tab=alerts&alert_id=${alertId}`,alerts:()=>"/insights?tab=alerts",insightAlerts:insightShortId=>`/insights/${insightShortId}/alerts`,insightAlert:(insightShortId,alertId)=>`/insights/${insightShortId}/alerts?alert_id=${alertId}`,sessionAttributionExplorer:()=>"/web/session-attribution-explorer"}},"./frontend/src/scenes/userLogic.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{userLogic:()=>userLogic});var kea__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),kea_forms__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea-forms@3.2.0_kea@3.1.5/node_modules/kea-forms/lib/index.js"),kea_loaders__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./node_modules/.pnpm/kea-loaders@3.0.0_kea@3.1.5/node_modules/kea-loaders/lib/index.js"),kea_router__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_api__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/lib/api.ts"),lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__("./frontend/src/lib/lemon-ui/LemonToast/LemonToast.tsx"),lib_utils_getAppContext__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__("./frontend/src/lib/utils/getAppContext.ts"),posthog_js__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__("./node_modules/.pnpm/posthog-js@1.205.0/node_modules/posthog-js/dist/module.js"),_urls__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__("./frontend/src/scenes/urls.ts");let userLogic=(0,kea__WEBPACK_IMPORTED_MODULE_0__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_0__.path)(["scenes","userLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_0__.actions)(()=>({loadUser:resetOnFailure=>({resetOnFailure}),updateCurrentOrganization:(organizationId,destination)=>({organizationId,destination}),logout:!0,updateUser:(user,successCallback)=>({user,successCallback}),setUserScenePersonalisation:(scene,dashboard)=>({scene,dashboard}),updateHasSeenProductIntroFor:(productKey,value)=>({productKey,value}),switchTeam:teamId=>({teamId})})),(0,kea_forms__WEBPACK_IMPORTED_MODULE_1__.forms)(_ref=>{let{actions}=_ref;return{userDetails:{errors:_ref2=>{let{first_name,email}=_ref2;return{first_name:first_name?first_name.length>150?"This name is too long. Please keep it under 151 characters.":null:"You need to have a name.",email:email?email.length>254?"This email is too long. Please keep it under 255 characters.":null:"You need to have an email."}},submit:user=>{actions.updateUser(user)}}}}),(0,kea_loaders__WEBPACK_IMPORTED_MODULE_2__.loaders)(_ref3=>{let{values,actions}=_ref3;return{user:[null,{loadUser:async()=>{try{return await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.get("api/users/@me/")}catch(error){console.error(error),actions.loadUserFailure(error.message)}return null},updateUser:async _ref4=>{let{user,successCallback}=_ref4;if(!values.user)throw Error("Current user has not been loaded yet, so it cannot be updated!");try{let response=await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.update("api/users/@me/",user);return successCallback&&successCallback(),response}catch(error){return console.error(error),actions.updateUserFailure(error.message),values.user}},setUserScenePersonalisation:async _ref5=>{let{scene,dashboard}=_ref5;if(!values.user)throw Error("Current user has not been loaded yet, so it cannot be updated!");try{return await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.create("api/users/@me/scene_personalisation",{scene,dashboard})}catch(error){return console.error(error),actions.updateUserFailure(error.message),values.user}}}]}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.reducers)({userDetails:[{},{loadUserSuccess:(_,_ref6)=>{let{user}=_ref6;return{first_name:user?.first_name||"",last_name:user?.last_name||"",email:user?.email||""}},updateUserSuccess:(_,_ref7)=>{let{user}=_ref7;return{first_name:user?.first_name||"",last_name:user?.last_name||"",email:user?.email||""}}}]}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.listeners)(_ref8=>{let{actions,values}=_ref8;return{logout:()=>{posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.reset(),window.location.href="/logout"},loadUserSuccess:_ref9=>{let{user}=_ref9;if(user&&user.uuid){let Sentry=window.Sentry;Sentry?.setUser({email:user.email,id:user.uuid}),posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP&&(posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.identify(user.distinct_id),posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.people.set({email:user.anonymize_data?null:user.email,realm:user.realm}),posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.register({is_demo_project:user.team?.is_demo}),user.team&&posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.group("project",user.team.uuid,{id:user.team.id,uuid:user.team.uuid,name:user.team.name,ingested_event:user.team.ingested_event,is_demo:user.team.is_demo,timezone:user.team.timezone,instance_tag:user.organization?.metadata?.instance_tag}),user.organization&&(posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.group("organization",user.organization.id,{id:user.organization.id,name:user.organization.name,slug:user.organization.slug,created_at:user.organization.created_at,available_product_features:user.organization.available_product_features,...user.organization.metadata}),user.organization.customer_id&&posthog_js__WEBPACK_IMPORTED_MODULE_7__.ZP.group("customer",user.organization.customer_id)))}},updateUserSuccess:()=>{lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.dismiss("updateUser"),lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.success("Preferences saved",{toastId:"updateUser"})},updateUserFailure:()=>{lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_5__.UJ.error("Error saving preferences",{toastId:"updateUser"})},updateCurrentOrganization:async(_ref10,breakpoint)=>{let{organizationId,destination}=_ref10;values.user?.organization?.id!==organizationId&&(await breakpoint(10),await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.update("api/users/@me/",{set_current_organization:organizationId}),window.location.href=destination||"/")},updateHasSeenProductIntroFor:async(_ref11,breakpoint)=>{let{productKey,value}=_ref11;await breakpoint(10),await lib_api__WEBPACK_IMPORTED_MODULE_4__.ZP.update("api/users/@me/",{has_seen_product_intro_for:{...values.user?.has_seen_product_intro_for,[productKey]:value}}).then(()=>{actions.loadUser()})},switchTeam:_ref12=>{let{teamId}=_ref12;window.location.href=_urls__WEBPACK_IMPORTED_MODULE_8__.j.project(teamId)}}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.selectors)({hasAvailableFeature:[s=>[s.user],user=>(feature,currentUsage)=>{let availableProductFeatures=user?.organization?.available_product_features;if(availableProductFeatures&&availableProductFeatures.length>0){let availableFeature=availableProductFeatures.find(obj=>obj.key===feature);return!!availableFeature&&(!currentUsage||!availableFeature?.limit||availableFeature?.limit>currentUsage)}return!1}],availableFeature:[s=>[s.user],user=>feature=>{let availableProductFeatures=user?.organization?.available_product_features;return availableProductFeatures&&availableProductFeatures.length>0?availableProductFeatures.find(obj=>obj.key===feature):null}],otherOrganizations:[s=>[s.user],user=>user&&user.organizations?.filter(organization=>organization.id!==user.organization?.id).sort((orgA,orgB)=>orgA.id===user?.organization?.id?-2:orgA.name.localeCompare(orgB.name))||[]],themeMode:[s=>[s.user],user=>user?.theme_mode||"light"]}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.afterMount)(_ref13=>{let{actions}=_ref13,preloadedUser=lib_utils_getAppContext__WEBPACK_IMPORTED_MODULE_6__.Fj()?.current_user;preloadedUser?actions.loadUserSuccess(preloadedUser):null===preloadedUser?actions.loadUserFailure("Logged out"):actions.loadUser()}),(0,kea_router__WEBPACK_IMPORTED_MODULE_3__.urlToAction)(_ref14=>{let{values}=_ref14;return{"/year_in_posthog/2023":()=>{window.POSTHOG_APP_CONTEXT?.year_in_hog_url&&(window.location.href=`${window.location.origin}${window.POSTHOG_APP_CONTEXT.year_in_hog_url}`),values.user?.uuid&&(window.location.href=`${window.location.origin}/year_in_posthog/2023/${values.user?.uuid}`)}}})])},"./frontend/src/styles/index.tsx":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__("./frontend/src/styles/global.scss")},"./frontend/src/toolbar/assets/Logo.tsx":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{T:()=>Logo});var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/jsx-runtime.js");function Logo(_ref){let{style}=_ref;return(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("svg",{style:style,fill:"none",width:"8.125em",height:"2em",viewBox:"0 0 130 32",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("g",{children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m12.3708 17.2868c-.2868.5737-1.1056.5737-1.3925 0l-.6861-1.3722c-.1095-.2192-.1095-.4771 0-.6963l.6861-1.3722c.2869-.5737 1.1057-.5737 1.3925 0l.6861 1.3722c.1096.2192.1096.4771 0 .6963z",fill:"var(--brand-blue)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m12.3708 25.069c-.2868.5737-1.1056.5737-1.3925 0l-.6861-1.3722c-.1095-.2191-.1095-.4771 0-.6963l.6861-1.3721c.2869-.5738 1.1057-.5738 1.3925 0l.6861 1.3721c.1096.2192.1096.4772 0 .6963z",fill:"var(--brand-blue)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m3.89258 22.1149c0-.6935.83849-1.0408 1.32888-.5504l3.56791 3.5679c.49039.4904.14308 1.3289-.55044 1.3289h-3.56791c-.42992 0-.77844-.3486-.77844-.7785zm0-3.7582c0 .2065.08201.4045.228.5505l7.32612 7.3261c.146.1459.344.228.5504.228h4.0239c.6935 0 1.0409-.8385.5505-1.3289l-11.35004-11.35c-.49039-.4904-1.32888-.1431-1.32888.5504zm0-7.7821c0 .2065.08201.4045.228.5505l15.10822 15.1082c.146.1459.344.228.5504.228h4.0239c.6935 0 1.0409-.8385.5505-1.3289l-19.13214-19.13213c-.49039-.49039-1.32888-.14307-1.32888.55044zm7.78212 0c0 .2065.082.4045.228.5505l14.0073 14.0073c.4904.4904 1.3289.143 1.3289-.5505v-4.0239c0-.2064-.082-.4044-.228-.5504l-14.0073-14.00733c-.4904-.49039-1.3289-.14307-1.3289.55044zm9.111-4.57433c-.4904-.49039-1.3289-.14307-1.3289.55044v4.02389c0 .2065.082.4045.228.5505l6.2252 6.2252c.4904.4904 1.3289.1431 1.3289-.5505v-4.0239c0-.2064-.082-.4044-.228-.5504z",fill:"var(--brand-yellow)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m36.9955 22.2104-7.3273-7.3273c-.4904-.4904-1.3288-.1431-1.3288.5504v10.2493c0 .43.3485.7785.7784.7785h11.3502c.4299 0 .7784-.3485.7784-.7785v-.9334c0-.4299-.35-.7732-.7763-.8287-1.3084-.1703-2.5321-.7679-3.4746-1.7103zm-4.9207 1.7606c-.6874 0-1.2452-.5578-1.2452-1.2451s.5578-1.2452 1.2452-1.2452c.6873 0 1.2451.5579 1.2451 1.2452s-.5578 1.2451-1.2451 1.2451z",fill:"var(--brand-key)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("g",{fill:"var(--brand-blue)",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m3.89258 25.6831c0 .4299.34852.7784.77844.7784h3.56791c.69352 0 1.04083-.8385.55044-1.3289l-3.56791-3.5679c-.49039-.4904-1.32888-.1431-1.32888.5505z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m11.6747 12.4535-6.45324-6.45323c-.49039-.49039-1.32888-.14307-1.32888.55044v4.02389c0 .2065.08201.4045.228.5505l7.55412 7.5541z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m5.22146 13.7825c-.49039-.4904-1.32888-.1431-1.32888.5504v4.0239c0 .2065.08201.4045.228.5505l7.55412 7.5541v-6.2257z"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m19.4569 12.7759c0-.2064-.082-.4044-.228-.5504l-6.2252-6.22523c-.4904-.49039-1.3289-.14307-1.3289.55044v4.02389c0 .2065.082.4045.228.5505l7.5541 7.5541z",fill:"var(--brand-red)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m11.6748 26.4615h4.3464c.6935 0 1.0408-.8385.5504-1.3289l-4.8968-4.8968z",fill:"var(--brand-red)"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m11.6748 12.4536v5.9032c0 .2065.082.4045.228.5505l7.5541 7.5541v-5.9032c0-.2065-.082-.4045-.228-.5505z",fill:"var(--brand-red)"})]}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)("g",{fill:"var(--brand-key)",children:[(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m50.3259 23.3537h3.1979v-5.3028h2.6716c2.9347 0 4.817-1.7406 4.817-4.4324 0-2.6919-1.8823-4.43246-4.817-4.43246h-5.8695zm3.1979-8.0351v-3.4002h2.3478c1.2143 0 1.943.6476 1.943 1.7001 0 1.0524-.7287 1.7001-1.943 1.7001z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m66.7977 23.5156c3.1169 0 5.3837-2.2263 5.3837-5.2623 0-3.0359-2.2668-5.2622-5.3837-5.2622-3.1573 0-5.3837 2.2263-5.3837 5.2622 0 3.036 2.2264 5.2623 5.3837 5.2623zm-2.4287-5.2623c0-1.6191.9715-2.7323 2.4287-2.7323 1.437 0 2.4085 1.1132 2.4085 2.7323 0 1.6192-.9715 2.7324-2.4085 2.7324-1.4572 0-2.4287-1.1132-2.4287-2.7324z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m77.2989 23.5156c2.3882 0 4.0074-1.4977 4.0074-3.2585 0-4.1289-5.4849-2.7931-5.4849-4.4123 0-.4452.4655-.7286 1.1334-.7286.6882 0 1.518.425 1.7811 1.3561l2.3883-.9918c-.4656-1.4775-2.1859-2.4894-4.2706-2.4894-2.2466 0-3.6431 1.3358-3.6431 2.9347 0 3.8657 5.404 2.7931 5.404 4.392 0 .5667-.5263.9512-1.3156.9512-1.1334 0-1.9228-.7893-2.1656-1.7406l-2.3883.931c.5262 1.5383 2.0644 3.0562 4.5539 3.0562z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m88.9994 23.2525-.2024-2.5704c-.3441.1821-.7894.2429-1.1537.2429-.7286 0-1.2143-.5263-1.2143-1.437v-3.8658h2.4692v-2.4692h-2.4692v-2.955h-2.9752v2.955h-1.6192v2.4692h1.6192v4.2503c0 2.4692 1.6798 3.6431 3.8859 3.6431.6072 0 1.1739-.1012 1.6597-.2631z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m99.3728 9.18604v5.50516h-5.6266v-5.50516h-3.1979v14.16766h3.1979v-5.9302h5.6266v5.9302h3.2182v-14.16766z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m109.689 23.5156c3.117 0 5.384-2.2263 5.384-5.2623 0-3.0359-2.267-5.2622-5.384-5.2622-3.157 0-5.384 2.2263-5.384 5.2622 0 3.036 2.227 5.2623 5.384 5.2623zm-2.429-5.2623c0-1.6191.972-2.7323 2.429-2.7323 1.437 0 2.408 1.1132 2.408 2.7323 0 1.6192-.971 2.7324-2.408 2.7324-1.457 0-2.429-1.1132-2.429-2.7324z"}),(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)("path",{d:"m120.815 23.0299c1.113 0 2.105-.3846 2.631-1.0525v.9715c0 1.1334-.911 1.9228-2.307 1.9228-.992 0-1.862-.4858-2.004-1.3156l-2.712.425c.364 1.9228 2.328 3.2181 4.716 3.2181 3.137 0 5.222-1.8418 5.222-4.5741v-9.4721h-2.935v.8703c-.546-.6274-1.477-1.0322-2.672-1.0322-2.833 0-4.614 1.943-4.614 5.0194s1.781 5.0194 4.675 5.0194zm-1.781-5.0194c0-1.518.891-2.4895 2.267-2.4895 1.396 0 2.287.9715 2.287 2.4895 0 1.5179-.891 2.4894-2.287 2.4894-1.376 0-2.267-.9715-2.267-2.4894z"})]})]})}},"./frontend/src/toolbar/toolbarConfigLogic.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{O:()=>toolbarFetch,W:()=>toolbarConfigLogic});var kea__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/kea@3.1.5_react@18.2.0/node_modules/kea/lib/index.esm.js"),kea_router__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/kea-router@3.2.0_kea@3.1.5/node_modules/kea-router/lib/index.js"),lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./frontend/src/lib/lemon-ui/LemonToast/LemonToast.tsx"),_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./frontend/src/toolbar/toolbarPosthogJS.ts"),_utils__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__("./frontend/src/toolbar/utils.ts");let toolbarConfigLogic=(0,kea__WEBPACK_IMPORTED_MODULE_0__.kea)([(0,kea__WEBPACK_IMPORTED_MODULE_0__.path)(["toolbar","toolbarConfigLogic"]),(0,kea__WEBPACK_IMPORTED_MODULE_0__.props)({}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.actions)({authenticate:!0,logout:!0,tokenExpired:!0,clearUserIntent:!0,showButton:!0,hideButton:!0,persistConfig:!0}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.reducers)(_ref=>{let{props}=_ref;return{props:[props],temporaryToken:[props.temporaryToken||null,{logout:()=>null,tokenExpired:()=>null,authenticate:()=>null}],actionId:[props.actionId||null,{logout:()=>null,clearUserIntent:()=>null}],experimentId:[props.experimentId||null,{logout:()=>null,clearUserIntent:()=>null}],userIntent:[props.userIntent||null,{logout:()=>null,clearUserIntent:()=>null}],buttonVisible:[!0,{showButton:()=>!0,hideButton:()=>!1,logout:()=>!1}]}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.selectors)({posthog:[s=>[s.props],props=>{var _props$posthog;return null!==(_props$posthog=props.posthog)&&void 0!==_props$posthog?_props$posthog:null}],apiURL:[s=>[s.props],props=>`${props.apiURL?.endsWith("/")?props.apiURL.replace(/\/+$/,""):props.apiURL}`],dataAttributes:[s=>[s.props],props=>{var _props$dataAttributes;return null!==(_props$dataAttributes=props.dataAttributes)&&void 0!==_props$dataAttributes?_props$dataAttributes:[]}],isAuthenticated:[s=>[s.temporaryToken],temporaryToken=>!!temporaryToken]}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.listeners)(_ref2=>{let{values,actions}=_ref2;return{authenticate:()=>{_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__.T.capture("toolbar authenticate",{is_authenticated:values.isAuthenticated});let encodedUrl=encodeURIComponent(window.location.href);actions.persistConfig(),window.location.href=`${values.apiURL}/authorize_and_redirect/?redirect=${encodedUrl}`},logout:()=>{_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__.T.capture("toolbar logout"),localStorage.removeItem(_utils__WEBPACK_IMPORTED_MODULE_4__.k2)},tokenExpired:()=>{_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__.T.capture("toolbar token expired"),console.warn("PostHog Toolbar API token expired. Clearing session."),"localstorage"!==values.props.source&&lib_lemon_ui_LemonToast_LemonToast__WEBPACK_IMPORTED_MODULE_2__.UJ.error("PostHog Toolbar API token expired."),actions.persistConfig()},persistConfig:()=>{var _values$temporaryToke,_values$actionId,_values$experimentId,_values$userIntent;let toolbarParams={...values.props,temporaryToken:null!==(_values$temporaryToke=values.temporaryToken)&&void 0!==_values$temporaryToke?_values$temporaryToke:void 0,actionId:null!==(_values$actionId=values.actionId)&&void 0!==_values$actionId?_values$actionId:void 0,experimentId:null!==(_values$experimentId=values.experimentId)&&void 0!==_values$experimentId?_values$experimentId:void 0,userIntent:null!==(_values$userIntent=values.userIntent)&&void 0!==_values$userIntent?_values$userIntent:void 0,posthog:void 0,featureFlags:void 0};localStorage.setItem(_utils__WEBPACK_IMPORTED_MODULE_4__.k2,JSON.stringify(toolbarParams))}}}),(0,kea__WEBPACK_IMPORTED_MODULE_0__.afterMount)(_ref3=>{let{props,values}=_ref3;if(props.instrument){let distinctId=props.distinctId;_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__.T.optIn(),distinctId&&_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__.T.identify(distinctId,props.userEmail?{email:props.userEmail}:{})}_toolbar_toolbarPosthogJS__WEBPACK_IMPORTED_MODULE_3__.T.capture("toolbar loaded",{is_authenticated:values.isAuthenticated})})]);async function toolbarFetch(url){let fullUrl,method=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"GET",payload=arguments.length>2?arguments[2]:void 0,urlConstruction=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"full",temporaryToken=toolbarConfigLogic.findMounted()?.values.temporaryToken,apiURL=toolbarConfigLogic.findMounted()?.values.apiURL;if("use-as-provided"===urlConstruction)fullUrl=url;else{let{pathname,searchParams}=(0,kea_router__WEBPACK_IMPORTED_MODULE_1__.combineUrl)(url),params={...searchParams,temporary_token:temporaryToken};fullUrl=`${apiURL}${pathname}${(0,kea_router__WEBPACK_IMPORTED_MODULE_1__.encodeParams)(params,"?")}`}let payloadData=payload?{body:JSON.stringify(payload),headers:{"Content-Type":"application/json"}}:{},response=await fetch(fullUrl,{method,...payloadData});if(403===response.status){let responseData=await response.json();"You don't have access to the project."===responseData.detail&&toolbarConfigLogic.actions.authenticate()}return 401==response.status&&toolbarConfigLogic.actions.tokenExpired(),response}},"./frontend/src/toolbar/toolbarPosthogJS.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{O:()=>useToolbarFeatureFlag,T:()=>toolbarPosthogJS});var posthog_js_lite__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/posthog-js-lite@3.0.0/node_modules/posthog-js-lite/lib/index.esm.js"),react__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/react@18.2.0/node_modules/react/index.js");let DEFAULT_API_KEY="sTMFPsFhdP1Ssg",runningOnPosthog=!!window.POSTHOG_APP_CONTEXT,apiKey=runningOnPosthog?window.JS_POSTHOG_API_KEY:DEFAULT_API_KEY,apiHost=runningOnPosthog?window.JS_POSTHOG_HOST:"https://internal-t.posthog.com",toolbarPosthogJS=new posthog_js_lite__WEBPACK_IMPORTED_MODULE_0__.Z(apiKey||DEFAULT_API_KEY,{host:apiHost,defaultOptIn:!1,persistence:"memory",persistence_name:apiKey+"_toolbar",preloadFeatureFlags:!1});runningOnPosthog&&window.JS_POSTHOG_SELF_CAPTURE&&toolbarPosthogJS.debug();let useToolbarFeatureFlag=(flag,match)=>{let[flagValue,setFlagValue]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(toolbarPosthogJS.getFeatureFlag(flag));return((0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>toolbarPosthogJS.onFeatureFlag(flag,value=>setFlagValue(value)),[flag,match]),match)?flagValue===match:!!flagValue}},"./frontend/src/toolbar/utils.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{KC:()=>getHeatMapHue,Nb:()=>TOOLBAR_ID,OS:()=>trimElement,R6:()=>function getAllClickTargets(){let startNode=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,selector=arguments.length>1?arguments[1]:void 0,targetSelector=selector||lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__.cR,elements=startNode.querySelectorAll(targetSelector),allElements=[...startNode.querySelectorAll("*")],pointerElements=allElements.filter(el=>{if(lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__.OK.indexOf(el.tagName.toLowerCase())>=0)return!1;let compStyles=window.getComputedStyle(el);return"pointer"===compStyles.getPropertyValue("cursor")}),shadowElements=allElements.filter(el=>el.shadowRoot&&el.getAttribute("id")!==TOOLBAR_ID).map(el=>el.shadowRoot?getAllClickTargets(el.shadowRoot,targetSelector):[]).reduce((a,b)=>[...a,...b],[]),selectedElements=[...elements,...pointerElements,...shadowElements].map(e=>trimElement(e,targetSelector)).filter(e=>e),uniqueElements=Array.from(new Set(selectedElements));return uniqueElements},bE:()=>elementToActionStep,dZ:()=>elementToQuery,gj:()=>actionStepToActionStepFormItem,k2:()=>LOCALSTORAGE_KEY,lz:()=>getBoxColors,nL:()=>inBounds,o:()=>getElementForStep,sV:()=>stepToDatabaseFormat,vf:()=>getRectForElement,wu:()=>TOOLBAR_CONTAINER_CLASS});var _medv_finder__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("./node_modules/.pnpm/@medv+finder@3.1.0/node_modules/@medv/finder/finder.js"),lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./frontend/src/lib/actionUtils.ts"),lib_utils_cssEscape__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./frontend/src/lib/utils/cssEscape.ts"),query_selector_shadow_dom__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("./node_modules/.pnpm/query-selector-shadow-dom@1.0.0/node_modules/query-selector-shadow-dom/src/querySelectorDeep.js");let TOOLBAR_ID="__POSTHOG_TOOLBAR__",TOOLBAR_CONTAINER_CLASS="toolbar-global-fade-container",LOCALSTORAGE_KEY="_postHogToolbarParams";function elementToQuery(element,dataAttributes){if(element){for(let{name,value}of Array.from(element.attributes)){if(!dataAttributes.includes(name))continue;let selector=`[${(0,lib_utils_cssEscape__WEBPACK_IMPORTED_MODULE_1__.Q)(name)}="${(0,lib_utils_cssEscape__WEBPACK_IMPORTED_MODULE_1__.Q)(value)}"]`;if(1==(0,query_selector_shadow_dom__WEBPACK_IMPORTED_MODULE_2__.Jp)(selector).length)return selector}try{return(0,_medv_finder__WEBPACK_IMPORTED_MODULE_3__.w)(element,{tagName:name=>!lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__.Kr.includes(name),seedMinLength:5,attr:name=>name.startsWith("data-")})}catch(error){console.warn("Error while trying to find a selector for element",element,error);return}}}function elementToActionStep(element,dataAttributes){let query=elementToQuery(element,dataAttributes);return{event:"$autocapture",href:element.getAttribute("href")||"",text:function(el){if(!el.childNodes||!el.childNodes.length)return"";let elText="";return el.childNodes.forEach(child=>{3===child.nodeType&&child.textContent&&(elText+=child.textContent.trim().replace(/[\r\n]/g," ").replace(/[ ]+/g," ").substring(0,255))}),elText}(element)||"",selector:query||"",url:window.location.protocol+"//"+window.location.host+window.location.pathname,url_matching:"exact"}}function getParent(element){let parent=element.parentNode;return parent?.nodeType===window.Node.DOCUMENT_FRAGMENT_NODE?parent.host:parent?.nodeType===window.Node.ELEMENT_NODE?parent:null}function trimElement(element,selector){let target_selector=selector||lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__.cR;if(!element)return null;let rootElement=window.document.getElementById(TOOLBAR_ID)||null;if(rootElement&&isParentOf(element,rootElement))return null;let loopElement=element;for(;;)if(1===loopElement.children.length)loopElement=loopElement.children[0];else break;for(;loopElement;){let parent=getParent(loopElement);if(!parent)break;if(loopElement.matches?.(target_selector))return loopElement;let compStyles=window.getComputedStyle(loopElement);if("pointer"===compStyles.getPropertyValue("cursor")){let parentStyles=parent?window.getComputedStyle(parent):null;if(!parentStyles||"pointer"!==parentStyles.getPropertyValue("cursor"))return loopElement}loopElement=parent}return null}function inBounds(min,value,max){return Math.max(min,Math.min(max,value))}function isParentOf(element,possibleParent){let loopElement=element;for(;loopElement;){if(loopElement!==element&&loopElement===possibleParent)return!0;loopElement=getParent(loopElement)}return!1}function getElementForStep(step,allElements){if(!step)return null;let selector="";step.selector&&(step.selector_selected||void 0===step.selector_selected)&&(selector=step.selector),step.href&&(step.href_selected||void 0===step.href_selected)&&(selector+=`[href="${(0,lib_utils_cssEscape__WEBPACK_IMPORTED_MODULE_1__.Q)(step.href)}"]`);let hasText=step.text&&step.text.trim()&&(step.text_selected||void 0===step.text_selected);if(!selector&&!hasText)return null;let elements=[];try{elements=[...(0,query_selector_shadow_dom__WEBPACK_IMPORTED_MODULE_2__.Jp)(selector||"*",document,allElements)]}catch(e){return console.error("Cannot use selector:",selector,". with exception: ",e),null}if(hasText&&step?.text){let textToSearch=step.text.toString().trim();elements=(elements=elements.filter(e=>-1===lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__.Kr.indexOf(e.tagName.toLowerCase())&&e.innerText?.trim()===textToSearch&&(e.matches(lib_actionUtils__WEBPACK_IMPORTED_MODULE_0__.cR)||window.getComputedStyle(e)?.getPropertyValue("cursor")==="pointer"))).filter(e=>!elements.find(e2=>isParentOf(e2,e)))}return 1===elements.length?elements[0]:null}function getBoxColors(color){let hover=arguments.length>1&&void 0!==arguments[1]&&arguments[1],opacity=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.2;return"blue"===color?{backgroundBlendMode:"multiply",background:`hsla(240, 90%, 58%, ${opacity})`,boxShadow:`hsla(240, 90%, 27%, 0.2) 0px 3px 10px ${hover?4:0}px`,outline:"hsla(240, 90%, 58%, 0.5) solid 1px"}:"red"===color?{backgroundBlendMode:"multiply",background:`hsla(4, 90%, 58%, ${opacity})`,boxShadow:`hsla(4, 90%, 27%, 0.2) 0px 3px 10px ${hover?5:0}px`,outline:"hsla(4, 90%, 58%, 0.5) solid 1px"}:void 0}function actionStepToActionStepFormItem(step){let isNew=arguments.length>1&&void 0!==arguments[1]&&arguments[1],includedPropertyKeys=arguments.length>2?arguments[2]:void 0;if(!step)return{};if(void 0!==step.selector_selected)return step;if(isNew){let hasSelector=!!step.selector;return"a"===step.tag_name?{...step,href_selected:!0,selector_selected:hasSelector,text_selected:includedPropertyKeys?.includes("text")||!1,url_selected:includedPropertyKeys?.includes("url")||!1}:"button"===step.tag_name?{...step,text_selected:!0,selector_selected:hasSelector,href_selected:includedPropertyKeys?.includes("href")||!1,url_selected:includedPropertyKeys?.includes("url")||!1}:{...step,selector_selected:hasSelector,text_selected:includedPropertyKeys?.includes("text")||!1,url_selected:includedPropertyKeys?.includes("url")||!1,href_selected:includedPropertyKeys?.includes("href")||!1}}return{...step,url_matching:step.url_matching||"exact",href_selected:void 0!==step.href&&null!==step.href,text_selected:void 0!==step.text&&null!==step.text,selector_selected:void 0!==step.selector&&null!==step.selector,url_selected:void 0!==step.url&&null!==step.url}}function stepToDatabaseFormat(step){let{href_selected,text_selected,selector_selected,url_selected,...rest}=step;return{...rest,href:href_selected&&rest.href||null,text:text_selected&&rest.text||null,selector:selector_selected&&rest.selector||null,url:url_selected&&rest.url||null}}function getRectForElement(element){let elements=[elementToAreaRect(element)],loopElement=element;for(;1===loopElement.children.length;)elements.push(elementToAreaRect(loopElement=loopElement.children[0]));let maxArea=0,maxRect=elements[0].rect;for(let{rect,area}of elements)area>=maxArea&&(maxArea=area,maxRect=rect);return maxRect}let getZoomLevel=el=>{let zooms=[],getZoom=el=>{let zoom=window.getComputedStyle(el).getPropertyValue("zoom"),rzoom=zoom?parseFloat(zoom):1;1!==rzoom&&zooms.push(rzoom),el.parentElement?.parentElement&&getZoom(el.parentElement)};return getZoom(el),zooms.reverse(),zooms},getRect=el=>{if(!el)return{x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0};let rect=el?.getBoundingClientRect(),zooms=getZoomLevel(el),rectWithZoom={bottom:zooms.reduce((a,b)=>a*b,rect.bottom),height:zooms.reduce((a,b)=>a*b,rect.height),left:zooms.reduce((a,b)=>a*b,rect.left),right:zooms.reduce((a,b)=>a*b,rect.right),top:zooms.reduce((a,b)=>a*b,rect.top),width:zooms.reduce((a,b)=>a*b,rect.width),x:zooms.reduce((a,b)=>a*b,rect.x),y:zooms.reduce((a,b)=>a*b,rect.y)};return rectWithZoom};function elementToAreaRect(element){var _rect$width,_rect$height;let rect=getRect(element);return{element,rect,area:(null!==(_rect$width=rect.width)&&void 0!==_rect$width?_rect$width:0)*(null!==(_rect$height=rect.height)&&void 0!==_rect$height?_rect$height:0)}}function getHeatMapHue(count,maxCount){return 0===maxCount?60:60-count/maxCount*40}},"./frontend/src/types.ts":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{B_:()=>Realm,Bs:()=>FeatureFlagStatus,Cz:()=>NotebookNodeType,D7:()=>CountPerActorMathType,DC:()=>EntityTypes,EF:()=>SessionRecordingSidebarStacking,F4:()=>DashboardPlacement,F7:()=>ExperimentsTabs,FB:()=>TemplateAvailabilityContext,FT:()=>PropertyFilterType,G2:()=>BehavioralEventType,H$:()=>SidePanelTab,HI:()=>SurveyUrlMatchType,Hh:()=>SingleFieldDateType,I9:()=>SurveyQuestionType,Iz:()=>ChartDisplayCategory,J2:()=>FilterLogicalOperator,J9:()=>PipelineTab,KU:()=>GraphType,LO:()=>ItemMode,MK:()=>ActorGroupType,ML:()=>EarlyAccessFeatureTabs,MN:()=>DashboardMode,Md:()=>ProductKey,NE:()=>BehavioralLifecycleType,O4:()=>PropertyMathType,OU:()=>GroupMathType,P$:()=>AvailableFeature,P5:()=>ExporterFormat,P6:()=>InsightColor,Qb:()=>ChartDisplayType,Qo:()=>SnapshotSourceType,S7:()=>FunnelMathType,SR:()=>RolloutConditionType,Sm:()=>SessionRecordingUsageType,Ts:()=>LayoutView,U6:()=>isDataWarehouseFilter,Ui:()=>FunnelVizType,VI:()=>FunnelCorrelationType,Vb:()=>BehavioralCohortType,W:()=>CookielessServerHashMode,WV:()=>PropertyOperator,We:()=>PipelineStage,XF:()=>FunnelStepReference,Xy:()=>TimeUnitType,Yy:()=>SessionPlayerState,ZO:()=>ActivityTab,_L:()=>SDKTag,_z:()=>Resource,aI:()=>FeatureFlagReleaseType,ak:()=>PluginInstallationType,bZ:()=>NotebookTarget,cB:()=>PathType,cr:()=>SessionRecordingSidebarTab,d_:()=>SurveyType,dc:()=>AnnotationScope,dw:()=>InsightType,e2:()=>BATCH_EXPORT_SERVICE_NAMES,fL:()=>ScheduledChangeOperationType,fS:()=>FunnelCorrelationResultsType,hP:()=>FunnelPathType,ih:()=>FunnelConversionWindowTimeUnit,il:()=>PipelineNodeTab,j3:()=>PersonsTabType,jc:()=>ActivityScope,kO:()=>StepOrderValue,kR:()=>DateOperatorType,kv:()=>SurveyQuestionBranchingType,l4:()=>SavedInsightsTabs,lh:()=>SDKKey,ll:()=>PropertyDefinitionType,mN:()=>ProgressStatus,mY:()=>HogQLMathType,nE:()=>EarlyAccessFeatureStage,q9:()=>BreakdownAttributionType,si:()=>HogWatcherState,uJ:()=>ValueOptionType,uS:()=>PropertyType,uW:()=>EventDefinitionType,uv:()=>AccessLevel,vN:()=>BaseMathType,w7:()=>FilterableInspectorListItemTypes,wz:()=>PropertyDefinitionState,xW:()=>RetentionPeriod,yd:()=>ReplayTabs,yp:()=>Region,zD:()=>manualLinkSources});let AvailableFeature=function(AvailableFeature){return AvailableFeature.APPS="apps",AvailableFeature.SLACK_INTEGRATION="slack_integration",AvailableFeature.MICROSOFT_TEAMS_INTEGRATION="microsoft_teams_integration",AvailableFeature.DISCORD_INTEGRATION="discord_integration",AvailableFeature.ZAPIER="zapier",AvailableFeature.APP_METRICS="app_metrics",AvailableFeature.DATA_PIPELINES="data_pipelines",AvailableFeature.RECORDINGS_PLAYLISTS="recordings_playlists",AvailableFeature.SESSION_REPLAY_DATA_RETENTION="session_replay_data_retention",AvailableFeature.CONSOLE_LOGS="console_logs",AvailableFeature.RECORDINGS_PERFORMANCE="recordings_performance",AvailableFeature.SESSION_REPLAY_NETWORK_PAYLOADS="session_replay_network_payloads",AvailableFeature.RECORDINGS_FILE_EXPORT="recordings_file_export",AvailableFeature.SESSION_REPLAY_SAMPLING="session_replay_sampling",AvailableFeature.REPLAY_RECORDING_DURATION_MINIMUM="replay_recording_duration_minimum",AvailableFeature.REPLAY_FEATURE_FLAG_BASED_RECORDING="replay_feature_flag_based_recording",AvailableFeature.REPLAY_MASK_SENSITIVE_DATA="replay_mask_sensitive_data",AvailableFeature.REPLAY_SHARING_EMBEDDING="replay_sharing_embedding",AvailableFeature.REPLAY_PRODUCT_ANALYTICS_INTEGRATION="replay_product_analytics_integration",AvailableFeature.REPLAY_FILTER_PERSON_PROPERTIES="replay_filter_person_properties",AvailableFeature.REPLAY_FILTER_EVENTS="replay_filter_events",AvailableFeature.REPLAY_DOM_EXPLORER="replay_dom_explorer",AvailableFeature.WORKS_WITH_POSTHOG_JS="works_with_posthog_js",AvailableFeature.REPLAY_AUTOMATIC_PLAYLISTS="replay_automatic_playlists",AvailableFeature.GROUP_ANALYTICS="group_analytics",AvailableFeature.SURVEYS_UNLIMITED_SURVEYS="surveys_unlimited_surveys",AvailableFeature.SURVEYS_ALL_QUESTION_TYPES="surveys_all_question_types",AvailableFeature.SURVEYS_MULTIPLE_QUESTIONS="surveys_multiple_questions",AvailableFeature.SURVEYS_USER_TARGETING="surveys_user_targeting",AvailableFeature.SURVEYS_USER_SAMPLING="surveys_user_sampling",AvailableFeature.SURVEYS_STYLING="surveys_styling",AvailableFeature.SURVEYS_TEXT_HTML="surveys_text_html",AvailableFeature.SURVEYS_API_MODE="surveys_api_mode",AvailableFeature.SURVEYS_RESULTS_ANALYSIS="surveys_results_analysis",AvailableFeature.SURVEYS_TEMPLATES="surveys_templates",AvailableFeature.SURVEYS_DATA_RETENTION="surveys_data_retention",AvailableFeature.SURVEYS_LINK_QUESTION_TYPE="surveys_link_question_type",AvailableFeature.SURVEYS_SLACK_NOTIFICATIONS="surveys_slack_notifications",AvailableFeature.SURVEYS_WAIT_PERIODS="surveys_wait_periods",AvailableFeature.SURVEYS_RECURRING="surveys_recurring",AvailableFeature.SURVEYS_EVENTS="surveys_events",AvailableFeature.SURVEYS_ACTIONS="surveys_actions",AvailableFeature.TRACKED_USERS="tracked_users",AvailableFeature.TEAM_MEMBERS="team_members",AvailableFeature.API_ACCESS="api_access",AvailableFeature.ORGANIZATIONS_PROJECTS="organizations_projects",AvailableFeature.ROLE_BASED_ACCESS="role_based_access",AvailableFeature.SOCIAL_SSO="social_sso",AvailableFeature.PROJECT_BASED_PERMISSIONING="project_based_permissioning",AvailableFeature.SAML="saml",AvailableFeature.SSO_ENFORCEMENT="sso_enforcement",AvailableFeature.WHITE_LABELLING="white_labelling",AvailableFeature.COMMUNITY_SUPPORT="community_support",AvailableFeature.DEDICATED_SUPPORT="dedicated_support",AvailableFeature.EMAIL_SUPPORT="email_support",AvailableFeature.ACCOUNT_MANAGER="account_manager",AvailableFeature.TRAINING="training",AvailableFeature.CONFIGURATION_SUPPORT="configuration_support",AvailableFeature.TERMS_AND_CONDITIONS="terms_and_conditions",AvailableFeature.SECURITY_ASSESSMENT="security_assessment",AvailableFeature.BESPOKE_PRICING="bespoke_pricing",AvailableFeature.INVOICE_PAYMENTS="invoice_payments",AvailableFeature.BOOLEAN_FLAGS="boolean_flags",AvailableFeature.FEATURE_FLAGS_DATA_RETENTION="feature_flags_data_retention",AvailableFeature.MULTIVARIATE_FLAGS="multivariate_flags",AvailableFeature.PERSIST_FLAGS_CROSS_AUTHENTICATION="persist_flags_cross_authentication",AvailableFeature.FEATURE_FLAG_PAYLOADS="feature_flag_payloads",AvailableFeature.MULTIPLE_RELEASE_CONDITIONS="multiple_release_conditions",AvailableFeature.RELEASE_CONDITION_OVERRIDES="release_condition_overrides",AvailableFeature.TARGETING_BY_GROUP="targeting_by_group",AvailableFeature.LOCAL_EVALUATION_AND_BOOTSTRAPPING="local_evaluation_and_bootstrapping",AvailableFeature.FLAG_USAGE_STATS="flag_usage_stats",AvailableFeature.MULTIPLE_ENVIRONMENTS="multiple_environments",AvailableFeature.USER_OPT_IN="user_opt_in",AvailableFeature.INSTANT_ROLLBACKS="instant_rollbacks",AvailableFeature.EXPERIMENTATION="experimentation",AvailableFeature.GROUP_EXPERIMENTS="group_experiments",AvailableFeature.FUNNEL_EXPERIMENTS="funnel_experiments",AvailableFeature.SECONDARY_METRICS="secondary_metrics",AvailableFeature.STATISTICAL_ANALYSIS="statistical_analysis",AvailableFeature.PRODUCT_ANALYTICS_DATA_RETENTION="product_analytics_data_retention",AvailableFeature.DASHBOARDS="dashboards",AvailableFeature.FUNNELS="funnels",AvailableFeature.GRAPHS_TRENDS="graphs_trends",AvailableFeature.PATHS="paths",AvailableFeature.INSIGHTS="insights",AvailableFeature.SUBSCRIPTIONS="subscriptions",AvailableFeature.ADVANCED_PERMISSIONS="advanced_permissions",AvailableFeature.INGESTION_TAXONOMY="ingestion_taxonomy",AvailableFeature.PATHS_ADVANCED="paths_advanced",AvailableFeature.CORRELATION_ANALYSIS="correlation_analysis",AvailableFeature.TAGGING="tagging",AvailableFeature.BEHAVIORAL_COHORT_FILTERING="behavioral_cohort_filtering",AvailableFeature.PRODUCT_ANALYTICS_RETENTION="product_analytics_retention",AvailableFeature.PRODUCT_ANALYTICS_STICKINESS="product_analytics_stickiness",AvailableFeature.AUTOCAPTURE="autocapture",AvailableFeature.DATA_VISUALIZATION="data_visualization",AvailableFeature.PRODUCT_ANALYTICS_SQL_QUERIES="product_analytics_sql_queries",AvailableFeature.TWOFA_ENFORCEMENT="2fa_enforcement",AvailableFeature.AUDIT_LOGS="audit_logs",AvailableFeature.HIPAA_BAA="hipaa_baa",AvailableFeature.CUSTOM_MSA="custom_msa",AvailableFeature.TWOFA="2fa",AvailableFeature.PRIORITY_SUPPORT="priority_support",AvailableFeature.SUPPORT_RESPONSE_TIME="support_response_time",AvailableFeature.DATA_PIPELINES_TRANSFORMATIONS="data_pipelines_transformations",AvailableFeature.AUTOMATIC_PROVISIONING="automatic_provisioning",AvailableFeature.MANAGED_REVERSE_PROXY="managed_reverse_proxy",AvailableFeature.ALERTS="alerts",AvailableFeature}({}),ProductKey=function(ProductKey){return ProductKey.COHORTS="cohorts",ProductKey.ACTIONS="actions",ProductKey.ALERTS="alerts",ProductKey.EXPERIMENTS="experiments",ProductKey.FEATURE_FLAGS="feature_flags",ProductKey.ANNOTATIONS="annotations",ProductKey.HISTORY="history",ProductKey.HEATMAPS="heatmaps",ProductKey.INGESTION_WARNINGS="ingestion_warnings",ProductKey.PERSONS="persons",ProductKey.SURVEYS="surveys",ProductKey.SESSION_REPLAY="session_replay",ProductKey.DATA_WAREHOUSE="data_warehouse",ProductKey.DATA_WAREHOUSE_SAVED_QUERY="data_warehouse_saved_queries",ProductKey.EARLY_ACCESS_FEATURES="early_access_features",ProductKey.PRODUCT_ANALYTICS="product_analytics",ProductKey.PIPELINE_TRANSFORMATIONS="pipeline_transformations",ProductKey.PIPELINE_DESTINATIONS="pipeline_destinations",ProductKey.SITE_APPS="site_apps",ProductKey.DATA_PIPELINES="data_pipelines",ProductKey.GROUP_ANALYTICS="group_analytics",ProductKey.INTEGRATIONS="integrations",ProductKey.PLATFORM_AND_SUPPORT="platform_and_support",ProductKey.TEAMS="teams",ProductKey.WEB_ANALYTICS="web_analytics",ProductKey.ERROR_TRACKING="error_tracking",ProductKey}({}),Realm=function(Realm){return Realm.Cloud="cloud",Realm.Demo="demo",Realm.SelfHostedPostgres="hosted",Realm.SelfHostedClickHouse="hosted-clickhouse",Realm}({}),Region=function(Region){return Region.US="US",Region.EU="EU",Region}({}),PropertyOperator=function(PropertyOperator){return PropertyOperator.Exact="exact",PropertyOperator.IsNot="is_not",PropertyOperator.IContains="icontains",PropertyOperator.NotIContains="not_icontains",PropertyOperator.Regex="regex",PropertyOperator.NotRegex="not_regex",PropertyOperator.GreaterThan="gt",PropertyOperator.GreaterThanOrEqual="gte",PropertyOperator.LessThan="lt",PropertyOperator.LessThanOrEqual="lte",PropertyOperator.IsSet="is_set",PropertyOperator.IsNotSet="is_not_set",PropertyOperator.IsDateExact="is_date_exact",PropertyOperator.IsDateBefore="is_date_before",PropertyOperator.IsDateAfter="is_date_after",PropertyOperator.Between="between",PropertyOperator.NotBetween="not_between",PropertyOperator.Minimum="min",PropertyOperator.Maximum="max",PropertyOperator.In="in",PropertyOperator.NotIn="not_in",PropertyOperator}({}),SavedInsightsTabs=function(SavedInsightsTabs){return SavedInsightsTabs.All="all",SavedInsightsTabs.Yours="yours",SavedInsightsTabs.Favorites="favorites",SavedInsightsTabs.History="history",SavedInsightsTabs.Alerts="alerts",SavedInsightsTabs}({}),ReplayTabs=function(ReplayTabs){return ReplayTabs.Templates="templates",ReplayTabs.Home="home",ReplayTabs.Playlists="playlists",ReplayTabs}({}),ExperimentsTabs=function(ExperimentsTabs){return ExperimentsTabs.All="all",ExperimentsTabs.Yours="yours",ExperimentsTabs.Archived="archived",ExperimentsTabs.Holdouts="holdouts",ExperimentsTabs.SharedMetrics="shared-metrics",ExperimentsTabs}({}),ActivityTab=function(ActivityTab){return ActivityTab.ExploreEvents="explore",ActivityTab.LiveEvents="live",ActivityTab}({}),PipelineTab=function(PipelineTab){return PipelineTab.Overview="overview",PipelineTab.Transformations="transformations",PipelineTab.Destinations="destinations",PipelineTab.SiteApps="site-apps",PipelineTab.Sources="sources",PipelineTab.ImportApps="legacy-sources",PipelineTab.AppsManagement="apps-management",PipelineTab.History="history",PipelineTab}({}),PipelineStage=function(PipelineStage){return PipelineStage.Transformation="transformation",PipelineStage.Destination="destination",PipelineStage.Source="source",PipelineStage.SiteApp="site-app",PipelineStage.ImportApp="legacy-source",PipelineStage}({}),PipelineNodeTab=function(PipelineNodeTab){return PipelineNodeTab.Configuration="configuration",PipelineNodeTab.Runs="runs",PipelineNodeTab.Logs="logs",PipelineNodeTab.Metrics="metrics",PipelineNodeTab.History="history",PipelineNodeTab.Schemas="schemas",PipelineNodeTab.Syncs="syncs",PipelineNodeTab.SourceConfiguration="source configuration",PipelineNodeTab}({}),ProgressStatus=function(ProgressStatus){return ProgressStatus.Draft="draft",ProgressStatus.Running="running",ProgressStatus.Complete="complete",ProgressStatus}({}),PropertyFilterType=function(PropertyFilterType){return PropertyFilterType.Meta="meta",PropertyFilterType.Event="event",PropertyFilterType.Person="person",PropertyFilterType.Element="element",PropertyFilterType.Feature="feature",PropertyFilterType.Session="session",PropertyFilterType.Cohort="cohort",PropertyFilterType.Recording="recording",PropertyFilterType.LogEntry="log_entry",PropertyFilterType.Group="group",PropertyFilterType.HogQL="hogql",PropertyFilterType.DataWarehouse="data_warehouse",PropertyFilterType.DataWarehousePersonProperty="data_warehouse_person_property",PropertyFilterType}({}),SnapshotSourceType={blob:"blob",realtime:"realtime",file:"file"},SessionRecordingUsageType=function(SessionRecordingUsageType){return SessionRecordingUsageType.VIEWED="viewed",SessionRecordingUsageType.ANALYZED="analyzed",SessionRecordingUsageType.LOADED="loaded",SessionRecordingUsageType}({}),SessionRecordingSidebarTab=function(SessionRecordingSidebarTab){return SessionRecordingSidebarTab.OVERVIEW="overview",SessionRecordingSidebarTab.INSPECTOR="inspector",SessionRecordingSidebarTab.DEBUGGER="debugger",SessionRecordingSidebarTab}({}),SessionRecordingSidebarStacking=function(SessionRecordingSidebarStacking){return SessionRecordingSidebarStacking.Vertical="vertical",SessionRecordingSidebarStacking.Horizontal="horizontal",SessionRecordingSidebarStacking}({}),FilterableInspectorListItemTypes=function(FilterableInspectorListItemTypes){return FilterableInspectorListItemTypes.EVENTS="events",FilterableInspectorListItemTypes.CONSOLE="console",FilterableInspectorListItemTypes.NETWORK="network",FilterableInspectorListItemTypes.DOCTOR="doctor",FilterableInspectorListItemTypes}({}),SessionPlayerState=function(SessionPlayerState){return SessionPlayerState.READY="ready",SessionPlayerState.BUFFER="buffer",SessionPlayerState.PLAY="play",SessionPlayerState.PAUSE="pause",SessionPlayerState.SCRUB="scrub",SessionPlayerState.SKIP="skip",SessionPlayerState.ERROR="error",SessionPlayerState}({}),EntityTypes=function(EntityTypes){return EntityTypes.ACTIONS="actions",EntityTypes.EVENTS="events",EntityTypes.DATA_WAREHOUSE="data_warehouse",EntityTypes}({}),isDataWarehouseFilter=filter=>filter.type===EntityTypes.DATA_WAREHOUSE,StepOrderValue=function(StepOrderValue){return StepOrderValue.STRICT="strict",StepOrderValue.UNORDERED="unordered",StepOrderValue.ORDERED="ordered",StepOrderValue}({}),PersonsTabType=function(PersonsTabType){return PersonsTabType.FEED="feed",PersonsTabType.EVENTS="events",PersonsTabType.SESSION_RECORDINGS="sessionRecordings",PersonsTabType.PROPERTIES="properties",PersonsTabType.COHORTS="cohorts",PersonsTabType.RELATED="related",PersonsTabType.HISTORY="history",PersonsTabType.FEATURE_FLAGS="featureFlags",PersonsTabType.DASHBOARD="dashboard",PersonsTabType}({}),LayoutView=function(LayoutView){return LayoutView.Card="card",LayoutView.List="list",LayoutView}({}),InsightColor=function(InsightColor){return InsightColor.White="white",InsightColor.Black="black",InsightColor.Blue="blue",InsightColor.Green="green",InsightColor.Purple="purple",InsightColor}({}),TemplateAvailabilityContext=function(TemplateAvailabilityContext){return TemplateAvailabilityContext.GENERAL="general",TemplateAvailabilityContext.ONBOARDING="onboarding",TemplateAvailabilityContext}({}),PluginInstallationType=function(PluginInstallationType){return PluginInstallationType.Local="local",PluginInstallationType.Custom="custom",PluginInstallationType.Repository="repository",PluginInstallationType.Source="source",PluginInstallationType.Inline="inline",PluginInstallationType}({}),AnnotationScope=function(AnnotationScope){return AnnotationScope.Insight="dashboard_item",AnnotationScope.Dashboard="dashboard",AnnotationScope.Project="project",AnnotationScope.Organization="organization",AnnotationScope}({}),ChartDisplayType=function(ChartDisplayType){return ChartDisplayType.ActionsLineGraph="ActionsLineGraph",ChartDisplayType.ActionsBar="ActionsBar",ChartDisplayType.ActionsStackedBar="ActionsStackedBar",ChartDisplayType.ActionsAreaGraph="ActionsAreaGraph",ChartDisplayType.ActionsLineGraphCumulative="ActionsLineGraphCumulative",ChartDisplayType.BoldNumber="BoldNumber",ChartDisplayType.ActionsPie="ActionsPie",ChartDisplayType.ActionsBarValue="ActionsBarValue",ChartDisplayType.ActionsTable="ActionsTable",ChartDisplayType.WorldMap="WorldMap",ChartDisplayType}({}),ChartDisplayCategory=function(ChartDisplayCategory){return ChartDisplayCategory.TimeSeries="TimeSeries",ChartDisplayCategory.CumulativeTimeSeries="CumulativeTimeSeries",ChartDisplayCategory.TotalValue="TotalValue",ChartDisplayCategory}({}),InsightType=function(InsightType){return InsightType.TRENDS="TRENDS",InsightType.STICKINESS="STICKINESS",InsightType.LIFECYCLE="LIFECYCLE",InsightType.FUNNELS="FUNNELS",InsightType.RETENTION="RETENTION",InsightType.PATHS="PATHS",InsightType.JSON="JSON",InsightType.SQL="SQL",InsightType.HOG="HOG",InsightType}({}),PathType=function(PathType){return PathType.PageView="$pageview",PathType.Screen="$screen",PathType.CustomEvent="custom_event",PathType.HogQL="hogql",PathType}({}),FunnelPathType=function(FunnelPathType){return FunnelPathType.before="funnel_path_before_step",FunnelPathType.between="funnel_path_between_steps",FunnelPathType.after="funnel_path_after_step",FunnelPathType}({}),FunnelVizType=function(FunnelVizType){return FunnelVizType.Steps="steps",FunnelVizType.TimeToConvert="time_to_convert",FunnelVizType.Trends="trends",FunnelVizType}({}),RetentionPeriod=function(RetentionPeriod){return RetentionPeriod.Hour="Hour",RetentionPeriod.Day="Day",RetentionPeriod.Week="Week",RetentionPeriod.Month="Month",RetentionPeriod}({}),FunnelConversionWindowTimeUnit=function(FunnelConversionWindowTimeUnit){return FunnelConversionWindowTimeUnit.Second="second",FunnelConversionWindowTimeUnit.Minute="minute",FunnelConversionWindowTimeUnit.Hour="hour",FunnelConversionWindowTimeUnit.Day="day",FunnelConversionWindowTimeUnit.Week="week",FunnelConversionWindowTimeUnit.Month="month",FunnelConversionWindowTimeUnit}({}),FunnelStepReference=function(FunnelStepReference){return FunnelStepReference.total="total",FunnelStepReference.previous="previous",FunnelStepReference}({}),FunnelCorrelationType=function(FunnelCorrelationType){return FunnelCorrelationType.Success="success",FunnelCorrelationType.Failure="failure",FunnelCorrelationType}({}),FunnelCorrelationResultsType=function(FunnelCorrelationResultsType){return FunnelCorrelationResultsType.Events="events",FunnelCorrelationResultsType.Properties="properties",FunnelCorrelationResultsType.EventWithProperties="event_with_properties",FunnelCorrelationResultsType}({}),BreakdownAttributionType=function(BreakdownAttributionType){return BreakdownAttributionType.FirstTouch="first_touch",BreakdownAttributionType.LastTouch="last_touch",BreakdownAttributionType.AllSteps="all_events",BreakdownAttributionType.Step="step",BreakdownAttributionType}({}),SurveyUrlMatchType=function(SurveyUrlMatchType){return SurveyUrlMatchType.Exact="exact",SurveyUrlMatchType.IsNot="is_not",SurveyUrlMatchType.Contains="icontains",SurveyUrlMatchType.NotIContains="not_icontains",SurveyUrlMatchType.Regex="regex",SurveyUrlMatchType.NotRegex="not_regex",SurveyUrlMatchType}({}),SurveyType=function(SurveyType){return SurveyType.Popover="popover",SurveyType.Widget="widget",SurveyType.FullScreen="full_screen",SurveyType.Email="email",SurveyType.API="api",SurveyType}({}),SurveyQuestionType=function(SurveyQuestionType){return SurveyQuestionType.Open="open",SurveyQuestionType.MultipleChoice="multiple_choice",SurveyQuestionType.SingleChoice="single_choice",SurveyQuestionType.Rating="rating",SurveyQuestionType.Link="link",SurveyQuestionType}({}),SurveyQuestionBranchingType=function(SurveyQuestionBranchingType){return SurveyQuestionBranchingType.NextQuestion="next_question",SurveyQuestionBranchingType.End="end",SurveyQuestionBranchingType.ResponseBased="response_based",SurveyQuestionBranchingType.SpecificQuestion="specific_question",SurveyQuestionBranchingType}({}),FeatureFlagStatus=function(FeatureFlagStatus){return FeatureFlagStatus.ACTIVE="active",FeatureFlagStatus.INACTIVE="inactive",FeatureFlagStatus.STALE="stale",FeatureFlagStatus.DELETED="deleted",FeatureFlagStatus.UNKNOWN="unknown",FeatureFlagStatus}({}),EarlyAccessFeatureStage=function(EarlyAccessFeatureStage){return EarlyAccessFeatureStage.Draft="draft",EarlyAccessFeatureStage.Concept="concept",EarlyAccessFeatureStage.Alpha="alpha",EarlyAccessFeatureStage.Beta="beta",EarlyAccessFeatureStage.GeneralAvailability="general-availability",EarlyAccessFeatureStage.Archived="archived",EarlyAccessFeatureStage}({}),EarlyAccessFeatureTabs=function(EarlyAccessFeatureTabs){return EarlyAccessFeatureTabs.OptedIn="opted-in",EarlyAccessFeatureTabs.OptedOut="opted-out",EarlyAccessFeatureTabs}({}),ScheduledChangeOperationType=function(ScheduledChangeOperationType){return ScheduledChangeOperationType.UpdateStatus="update_status",ScheduledChangeOperationType.AddReleaseCondition="add_release_condition",ScheduledChangeOperationType}({}),ItemMode=function(ItemMode){return ItemMode.Edit="edit",ItemMode.View="view",ItemMode.Subscriptions="subscriptions",ItemMode.Sharing="sharing",ItemMode.Alerts="alerts",ItemMode}({}),DashboardPlacement=function(DashboardPlacement){return DashboardPlacement.Dashboard="dashboard",DashboardPlacement.ProjectHomepage="project-homepage",DashboardPlacement.FeatureFlag="feature-flag",DashboardPlacement.Public="public",DashboardPlacement.Export="export",DashboardPlacement.Person="person",DashboardPlacement.Group="group",DashboardPlacement}({}),DashboardMode=function(DashboardMode){return DashboardMode.Edit="edit",DashboardMode.Fullscreen="fullscreen",DashboardMode.Sharing="sharing",DashboardMode}({}),PropertyType=function(PropertyType){return PropertyType.DateTime="DateTime",PropertyType.String="String",PropertyType.Numeric="Numeric",PropertyType.Boolean="Boolean",PropertyType.Duration="Duration",PropertyType.Selector="Selector",PropertyType.Cohort="Cohort",PropertyType}({}),PropertyDefinitionType=function(PropertyDefinitionType){return PropertyDefinitionType.Event="event",PropertyDefinitionType.Person="person",PropertyDefinitionType.Group="group",PropertyDefinitionType.Session="session",PropertyDefinitionType.LogEntry="log_entry",PropertyDefinitionType.Meta="meta",PropertyDefinitionType}({}),PropertyDefinitionState=function(PropertyDefinitionState){return PropertyDefinitionState.Pending="pending",PropertyDefinitionState.Loading="loading",PropertyDefinitionState.Missing="missing",PropertyDefinitionState.Error="error",PropertyDefinitionState}({}),FilterLogicalOperator=function(FilterLogicalOperator){return FilterLogicalOperator.And="AND",FilterLogicalOperator.Or="OR",FilterLogicalOperator}({}),GraphType=function(GraphType){return GraphType.Bar="bar",GraphType.HorizontalBar="horizontalBar",GraphType.Line="line",GraphType.Histogram="histogram",GraphType.Pie="doughnut",GraphType}({}),FunnelMathType=function(FunnelMathType){return FunnelMathType.AnyMatch="total",FunnelMathType.FirstTimeForUser="first_time_for_user",FunnelMathType.FirstTimeForUserWithFilters="first_time_for_user_with_filters",FunnelMathType}({}),BaseMathType=function(BaseMathType){return BaseMathType.TotalCount="total",BaseMathType.UniqueUsers="dau",BaseMathType.WeeklyActiveUsers="weekly_active",BaseMathType.MonthlyActiveUsers="monthly_active",BaseMathType.UniqueSessions="unique_session",BaseMathType.FirstTimeForUser="first_time_for_user",BaseMathType.FirstMatchingEventForUser="first_matching_event_for_user",BaseMathType}({}),PropertyMathType=function(PropertyMathType){return PropertyMathType.Average="avg",PropertyMathType.Sum="sum",PropertyMathType.Minimum="min",PropertyMathType.Maximum="max",PropertyMathType.Median="median",PropertyMathType.P75="p75",PropertyMathType.P90="p90",PropertyMathType.P95="p95",PropertyMathType.P99="p99",PropertyMathType}({}),CountPerActorMathType=function(CountPerActorMathType){return CountPerActorMathType.Average="avg_count_per_actor",CountPerActorMathType.Minimum="min_count_per_actor",CountPerActorMathType.Maximum="max_count_per_actor",CountPerActorMathType.Median="median_count_per_actor",CountPerActorMathType.P75="p75_count_per_actor",CountPerActorMathType.P90="p90_count_per_actor",CountPerActorMathType.P95="p95_count_per_actor",CountPerActorMathType.P99="p99_count_per_actor",CountPerActorMathType}({}),HogQLMathType=function(HogQLMathType){return HogQLMathType.HogQL="hogql",HogQLMathType}({}),GroupMathType=function(GroupMathType){return GroupMathType.UniqueGroup="unique_group",GroupMathType}({}),ActorGroupType=function(ActorGroupType){return ActorGroupType.Person="person",ActorGroupType.GroupPrefix="group",ActorGroupType}({}),BehavioralEventType=function(BehavioralEventType){return BehavioralEventType.PerformEvent="performed_event",BehavioralEventType.PerformMultipleEvents="performed_event_multiple",BehavioralEventType.PerformSequenceEvents="performed_event_sequence",BehavioralEventType.NotPerformedEvent="not_performed_event",BehavioralEventType.NotPerformSequenceEvents="not_performed_event_sequence",BehavioralEventType.HaveProperty="have_property",BehavioralEventType.NotHaveProperty="not_have_property",BehavioralEventType}({}),BehavioralCohortType=function(BehavioralCohortType){return BehavioralCohortType.InCohort="in_cohort",BehavioralCohortType.NotInCohort="not_in_cohort",BehavioralCohortType}({}),BehavioralLifecycleType=function(BehavioralLifecycleType){return BehavioralLifecycleType.PerformEventFirstTime="performed_event_first_time",BehavioralLifecycleType.PerformEventRegularly="performed_event_regularly",BehavioralLifecycleType.StopPerformEvent="stopped_performing_event",BehavioralLifecycleType.StartPerformEventAgain="restarted_performing_event",BehavioralLifecycleType}({}),TimeUnitType=function(TimeUnitType){return TimeUnitType.Day="day",TimeUnitType.Week="week",TimeUnitType.Month="month",TimeUnitType.Year="year",TimeUnitType}({}),DateOperatorType=function(DateOperatorType){return DateOperatorType.BeforeTheLast="before_the_last",DateOperatorType.Between="between",DateOperatorType.NotBetween="not_between",DateOperatorType.OnTheDate="on_the_date",DateOperatorType.NotOnTheDate="not_on_the_date",DateOperatorType.Since="since",DateOperatorType.Before="before",DateOperatorType.IsSet="is_set",DateOperatorType.IsNotSet="is_not_set",DateOperatorType}({}),SingleFieldDateType=function(SingleFieldDateType){return SingleFieldDateType.IsDateExact="is_date_exact",SingleFieldDateType.IsDateBefore="is_date_before",SingleFieldDateType.IsDateAfter="is_date_after",SingleFieldDateType}({}),ValueOptionType=function(ValueOptionType){return ValueOptionType.MostRecent="most_recent",ValueOptionType.Previous="previous",ValueOptionType.OnDate="on_date",ValueOptionType}({}),EventDefinitionType=function(EventDefinitionType){return EventDefinitionType.Event="event",EventDefinitionType.EventCustom="event_custom",EventDefinitionType.EventPostHog="event_posthog",EventDefinitionType}({}),ExporterFormat=function(ExporterFormat){return ExporterFormat.PNG="image/png",ExporterFormat.CSV="text/csv",ExporterFormat.PDF="application/pdf",ExporterFormat.JSON="application/json",ExporterFormat.XLSX="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",ExporterFormat}({}),FeatureFlagReleaseType=function(FeatureFlagReleaseType){return FeatureFlagReleaseType.ReleaseToggle="Release toggle",FeatureFlagReleaseType.Variants="Multiple variants",FeatureFlagReleaseType}({}),RolloutConditionType=function(RolloutConditionType){return RolloutConditionType.Insight="insight",RolloutConditionType.Sentry="sentry",RolloutConditionType}({}),Resource=function(Resource){return Resource.FEATURE_FLAGS="feature flags",Resource}({}),AccessLevel=function(AccessLevel){return AccessLevel[AccessLevel.READ=21]="READ",AccessLevel[AccessLevel.WRITE=37]="WRITE",AccessLevel}({}),ActivityScope=function(ActivityScope){return ActivityScope.ACTION="Action",ActivityScope.FEATURE_FLAG="FeatureFlag",ActivityScope.PERSON="Person",ActivityScope.INSIGHT="Insight",ActivityScope.PLUGIN="Plugin",ActivityScope.PLUGIN_CONFIG="PluginConfig",ActivityScope.HOG_FUNCTION="HogFunction",ActivityScope.DATA_MANAGEMENT="DataManagement",ActivityScope.EVENT_DEFINITION="EventDefinition",ActivityScope.PROPERTY_DEFINITION="PropertyDefinition",ActivityScope.NOTEBOOK="Notebook",ActivityScope.DASHBOARD="Dashboard",ActivityScope.REPLAY="Replay",ActivityScope.EXPERIMENT="Experiment",ActivityScope.SURVEY="Survey",ActivityScope.EARLY_ACCESS_FEATURE="EarlyAccessFeature",ActivityScope.COMMENT="Comment",ActivityScope.COHORT="Cohort",ActivityScope.TEAM="Team",ActivityScope}({}),NotebookNodeType=function(NotebookNodeType){return NotebookNodeType.Mention="ph-mention",NotebookNodeType.Query="ph-query",NotebookNodeType.Recording="ph-recording",NotebookNodeType.RecordingPlaylist="ph-recording-playlist",NotebookNodeType.FeatureFlag="ph-feature-flag",NotebookNodeType.FeatureFlagCodeExample="ph-feature-flag-code-example",NotebookNodeType.Experiment="ph-experiment",NotebookNodeType.EarlyAccessFeature="ph-early-access-feature",NotebookNodeType.Survey="ph-survey",NotebookNodeType.Person="ph-person",NotebookNodeType.Group="ph-group",NotebookNodeType.Cohort="ph-cohort",NotebookNodeType.Backlink="ph-backlink",NotebookNodeType.ReplayTimestamp="ph-replay-timestamp",NotebookNodeType.Image="ph-image",NotebookNodeType.PersonFeed="ph-person-feed",NotebookNodeType.Properties="ph-properties",NotebookNodeType.Map="ph-map",NotebookNodeType.Embed="ph-embed",NotebookNodeType}({}),NotebookTarget=function(NotebookTarget){return NotebookTarget.Popover="popover",NotebookTarget.Scene="scene",NotebookTarget}({}),manualLinkSources=["aws","google-cloud","cloudflare-r2","azure"],BATCH_EXPORT_SERVICE_NAMES=["S3","Snowflake","Postgres","BigQuery","Redshift","HTTP"],SDKKey=function(SDKKey){return SDKKey.ANDROID="android",SDKKey.ANGULAR="angular",SDKKey.ASTRO="astro",SDKKey.API="api",SDKKey.BUBBLE="bubble",SDKKey.DJANGO="django",SDKKey.DOCUSAURUS="docusaurus",SDKKey.ELIXIR="elixir",SDKKey.FRAMER="framer",SDKKey.FLUTTER="flutter",SDKKey.GATSBY="gatsby",SDKKey.GO="go",SDKKey.GOOGLE_TAG_MANAGER="google_tag_manager",SDKKey.HELICONE="helicone",SDKKey.HTML_SNIPPET="html",SDKKey.IOS="ios",SDKKey.JAVA="java",SDKKey.JS_WEB="javascript_web",SDKKey.LARAVEL="laravel",SDKKey.LANGFUSE="langfuse",SDKKey.NEXT_JS="nextjs",SDKKey.NODE_JS="nodejs",SDKKey.NUXT_JS="nuxtjs",SDKKey.PHP="php",SDKKey.PYTHON="python",SDKKey.REACT="react",SDKKey.REACT_NATIVE="react_native",SDKKey.REMIX="remix",SDKKey.RETOOL="retool",SDKKey.RUBY="ruby",SDKKey.RUDDERSTACK="rudderstack",SDKKey.RUST="rust",SDKKey.SEGMENT="segment",SDKKey.SENTRY="sentry",SDKKey.SHOPIFY="shopify",SDKKey.SVELTE="svelte",SDKKey.TRACELOOP="traceloop",SDKKey.VUE_JS="vuejs",SDKKey.WEBFLOW="webflow",SDKKey.WORDPRESS="wordpress",SDKKey}({}),SDKTag=function(SDKTag){return SDKTag.WEB="Web",SDKTag.MOBILE="Mobile",SDKTag.SERVER="Server",SDKTag.INTEGRATION="Integration",SDKTag.RECOMMENDED="Recommended",SDKTag.LLM="LLM",SDKTag.OTHER="Other",SDKTag}({}),SidePanelTab=function(SidePanelTab){return SidePanelTab.Notebooks="notebook",SidePanelTab.Support="support",SidePanelTab.Docs="docs",SidePanelTab.Activation="activation",SidePanelTab.Settings="settings",SidePanelTab.FeaturePreviews="feature-previews",SidePanelTab.Activity="activity",SidePanelTab.Discussion="discussion",SidePanelTab.Status="status",SidePanelTab.Exports="exports",SidePanelTab.AccessControl="access-control",SidePanelTab}({}),HogWatcherState=function(HogWatcherState){return HogWatcherState[HogWatcherState.healthy=1]="healthy",HogWatcherState[HogWatcherState.overflowed=2]="overflowed",HogWatcherState[HogWatcherState.disabledForPeriod=3]="disabledForPeriod",HogWatcherState[HogWatcherState.disabledIndefinitely=4]="disabledIndefinitely",HogWatcherState}({}),CookielessServerHashMode=function(CookielessServerHashMode){return CookielessServerHashMode[CookielessServerHashMode.Disabled=0]="Disabled",CookielessServerHashMode[CookielessServerHashMode.Stateless=1]="Stateless",CookielessServerHashMode[CookielessServerHashMode.Stateful=2]="Stateful",CookielessServerHashMode}({})},"./storybook-config-entry.js":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var external_STORYBOOK_MODULE_GLOBAL_=__webpack_require__("@storybook/global"),external_STORYBOOK_MODULE_PREVIEW_API_=__webpack_require__("@storybook/preview-api"),external_STORYBOOK_MODULE_CHANNELS_=__webpack_require__("@storybook/channels");let pipeline=x=>x(),importers=[async path=>{if(!/^\.[\\/](?:frontend\/src(?:\/(?!\.)(?:(?:(?!(?:^|\/)\.).)*?)\/|\/|$)(?!\.)(?=.)[^/]*?\.stories\.(js|jsx|ts|tsx|mdx))$/.exec(path))return;let pathRemainder=path.substring(15);return __webpack_require__("./frontend/src lazy recursive ^\\.\\/.*$ include: (?:\\/frontend\\/src(?:\\/(?%21\\.)(?:(?:(?%21(?:^%7C\\/)\\.).)*?)\\/%7C\\/%7C$)(?%21\\.)(?=.)[^/]*?\\.stories\\.(js%7Cjsx%7Cts%7Ctsx%7Cmdx))$")("./"+pathRemainder)}];async function importFn(path){for(let i=0;iimporters[i](path));if(moduleExports)return moduleExports}}let channel=(0,external_STORYBOOK_MODULE_CHANNELS_.createBrowserChannel)({page:"preview"});external_STORYBOOK_MODULE_PREVIEW_API_.addons.setChannel(channel),"DEVELOPMENT"===external_STORYBOOK_MODULE_GLOBAL_.global.CONFIG_TYPE&&(window.__STORYBOOK_SERVER_CHANNEL__=channel);let preview=new external_STORYBOOK_MODULE_PREVIEW_API_.PreviewWeb;window.__STORYBOOK_PREVIEW__=preview,window.__STORYBOOK_STORY_STORE__=preview.storyStore,window.__STORYBOOK_ADDONS_CHANNEL__=channel,window.__STORYBOOK_CLIENT_API__=new external_STORYBOOK_MODULE_PREVIEW_API_.ClientApi({storyStore:preview.storyStore}),preview.initialize({importFn:importFn,getProjectAnnotations:()=>(0,external_STORYBOOK_MODULE_PREVIEW_API_.composeConfigs)([__webpack_require__("./node_modules/.pnpm/@storybook+react@7.6.4_react-dom@18.2.0_react@18.2.0_typescript@4.9.5/node_modules/@storybook/react/dist/entry-preview.mjs"),__webpack_require__("./node_modules/.pnpm/@storybook+react@7.6.4_react-dom@18.2.0_react@18.2.0_typescript@4.9.5/node_modules/@storybook/react/dist/entry-preview-docs.mjs"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-docs@7.6.4_@types+react-dom@18.2.14_@types+react@17.0.52_react-dom@18.2.0_react@18.2.0/node_modules/@storybook/addon-docs/dist/preview.mjs"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-links@7.6.4_react@18.2.0/node_modules/@storybook/addon-links/dist/preview.js"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-essentials@7.6.4_@types+react-dom@18.2.14_@types+react@17.0.52_react-dom@18.2.0_react@18.2.0/node_modules/@storybook/addon-essentials/dist/actions/preview.js"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-essentials@7.6.4_@types+react-dom@18.2.14_@types+react@17.0.52_react-dom@18.2.0_react@18.2.0/node_modules/@storybook/addon-essentials/dist/backgrounds/preview.js"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-essentials@7.6.4_@types+react-dom@18.2.14_@types+react@17.0.52_react-dom@18.2.0_react@18.2.0/node_modules/@storybook/addon-essentials/dist/measure/preview.js"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-essentials@7.6.4_@types+react-dom@18.2.14_@types+react@17.0.52_react-dom@18.2.0_react@18.2.0/node_modules/@storybook/addon-essentials/dist/outline/preview.js"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-essentials@7.6.4_@types+react-dom@18.2.14_@types+react@17.0.52_react-dom@18.2.0_react@18.2.0/node_modules/@storybook/addon-essentials/dist/highlight/preview.js"),__webpack_require__("./node_modules/.pnpm/@storybook+addon-a11y@7.6.4/node_modules/@storybook/addon-a11y/dist/preview.js"),__webpack_require__("./node_modules/.pnpm/storybook-addon-pseudo-states@2.1.2_@storybook+components@7.6.4_@storybook+core-events@7.6.4__ryvooa6ckff6nihvuhqddxt4ke/node_modules/storybook-addon-pseudo-states/dist/preview.mjs"),__webpack_require__("./.storybook/preview.tsx")])})},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/layout/ErrorBoundary/ErrorBoundary.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ErrorBoundary{background:var(--danger-highlight);border-radius:var(--radius);height:-moz-fit-content;height:fit-content;margin:1.5rem;min-width:0;padding:.75rem 1rem 1rem}.ErrorBoundary h2{color:var(--danger);font-weight:600;margin-bottom:.75rem}.ErrorBoundary pre{background:var(--border-light);border-radius:var(--radius);margin-bottom:.75rem;padding:.75rem 1rem}.ErrorBoundary .help-button{margin-top:.75rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/layout/navigation-3000/Navigation.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.Navigation3000{--breadcrumbs-height-full:3.75rem;--breadcrumbs-height-compact:2.75rem;--scene-padding:1rem;--scene-padding-bottom:var(--scene-padding);background:var(--bg-3000);display:flex;height:100vh;overflow:hidden;width:100%}.storybook-test-runner .Navigation3000{height:auto}.Navigation3000>main{flex:1;min-width:0;overflow:auto}.Navigation3000 .BridgePage{background:none;height:100%;overflow:visible}@media screen and (max-width:576px){.Navigation3000{--scene-padding-bottom:calc(var(--scene-padding) + max(env(safe-area-inset-bottom), 80px))}}@media screen and (max-width:992px){.Navigation3000{--scene-padding:0.5rem}}.Navigation3000__scene{margin:var(--scene-padding);margin-bottom:var(--scene-padding-bottom);min-height:calc(100vh - var(--breadcrumbs-height-full) - var(--scene-padding) - var(--scene-padding-bottom));position:relative}.Navigation3000__scene.Navigation3000__scene--raw,.Navigation3000__scene.Navigation3000__scene--raw-no-header{--scene-padding:0px;--scene-padding-bottom:0px;display:flex;flex-direction:column}.Navigation3000__scene.Navigation3000__scene--raw-no-header{height:100vh}.Navigation3000__scene.Navigation3000__scene--canvas{--scene-padding:0px;display:flex;flex-direction:column;overflow:hidden}.Navbar3000{border-right-width:1px;display:flex;flex-direction:column;max-height:100vh;opacity:.99999;position:relative;transition:transform .1s ease-out}.Navigation3000--mobile .Navbar3000{bottom:0;left:0;position:fixed;top:0;z-index:var(--z-lemon-sidebar)}.Navbar3000.Navbar3000--hidden{transform:translateX(-100%)}.Navbar3000 .Navbar3000__content{background:var(--accent-3000);display:flex;flex:1;flex-direction:column;justify-content:space-between;overflow-y:auto;z-index:var(--z-main-nav)}.Navbar3000 .Navbar3000__content .LemonButton__chrome{--lemon-button-padding-horizontal:0.25rem!important}.Navbar3000 .Navbar3000__content .Navbar3000__bottom,.Navbar3000 .Navbar3000__content .Navbar3000__top{padding:0 .375rem}.Navbar3000 .Navbar3000__content ul{padding:.5rem 0}.Navbar3000 .Navbar3000__content ul+ul{border-top-width:1px}.Navbar3000__top{overflow:auto}.Navbar3000__overlay{-webkit-backdrop-filter:blur(var(--modal-backdrop-blur));backdrop-filter:blur(var(--modal-backdrop-blur));background-color:var(--modal-backdrop-color);height:100%;opacity:1;position:fixed;transition:opacity .1s ease-out,-webkit-backdrop-filter .1s ease-out;transition:opacity .1s ease-out,backdrop-filter .1s ease-out;transition:opacity .1s ease-out,backdrop-filter .1s ease-out,-webkit-backdrop-filter .1s ease-out;width:100%;z-index:var(--z-mobile-nav-overlay)}.Navbar3000__overlay.Navbar3000--hidden{-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);opacity:0;pointer-events:none}.NavbarButton{position:relative}.NavbarButton.NavbarButton--here:after{bottom:.25rem;color:var(--text-3000);content:"•";font-size:1.25rem;left:0;line-height:.5625rem;position:absolute;right:0;text-align:center}.NavbarButton.NavbarButton--here .LemonButton__icon{color:var(--text-3000);transform:translateY(-.25rem)}.Sidebar3000{--sidebar-slider-padding:0.125rem;--sidebar-horizontal-padding:0.5rem;--sidebar-row-height:3rem;--sidebar-background:var(--bg-3000);border-right:min(1px,var(--sidebar-width)) solid transparent;box-sizing:initial;flex:0 0 var(--sidebar-width);height:100vh;position:relative}[theme=dark] .Sidebar3000{--sidebar-background:var(--accent-3000)}.Sidebar3000.Sidebar3000--resizing{will-change:flex-basis}.Sidebar3000 h3,.Sidebar3000 h4,.Sidebar3000 h5{color:var(--text-3000);line-height:inherit;margin:0;overflow:hidden;text-overflow:ellipsis}.Sidebar3000 h3{font-size:.75rem;font-weight:600;line-height:2rem}.Sidebar3000 h4{flex-grow:1;font-size:.6875rem;font-weight:600;line-height:1.75rem}.Sidebar3000 h5{font-size:.75rem;font-weight:400;letter-spacing:normal;text-transform:none}.Sidebar3000 b{font-weight:700}.Sidebar3000 .LemonInput--type-search{border-color:transparent;border-radius:0;max-width:none;transition:none}.Sidebar3000__content{align-items:stretch;background:var(--sidebar-background);border-right:min(1px,var(--sidebar-width)) solid var(--border);box-sizing:initial;display:flex;flex-direction:column;font-size:.6875rem;height:100vh;overflow:hidden;white-space:nowrap;width:var(--sidebar-width)}.Sidebar3000--resizing .Sidebar3000__content{will-change:width}.Sidebar3000__content>div:not(:first-child){border-top-width:1px}.Sidebar3000__lists{align-items:stretch;display:flex;flex-direction:column;flex-grow:1;overflow:hidden auto;position:relative}.Sidebar3000__hint{align-items:center;background:var(--bg-3000);border-top-width:1px;display:flex;flex:0 0 var(--sidebar-row-height);font-weight:500;justify-content:space-between;padding:0 var(--sidebar-horizontal-padding);z-index:1}.Sidebar3000__hint,.Sidebar3000__slider{-webkit-user-select:none;-moz-user-select:none;user-select:none}.Sidebar3000__slider{bottom:0;cursor:col-resize;position:absolute;right:calc(var(--sidebar-slider-padding)*-1 - min(1px,var(--sidebar-width)));top:0;width:calc(var(--sidebar-slider-padding)*2 + 1px);z-index:var(--z-notifications-popover)}.Sidebar3000__slider:after,.Sidebar3000__slider:before{bottom:0;content:"";left:var(--sidebar-slider-padding);pointer-events:none;position:absolute;top:0;width:1px}.Sidebar3000__slider:before{background:var(--border);transition:transform .1s ease}.Sidebar3000__slider:after{background:var(--text-3000);opacity:0;transition:transform .1s ease}.Sidebar3000--resizing .Sidebar3000__slider:after,.Sidebar3000__slider:hover:after{opacity:.25}.Sidebar3000--resizing .Sidebar3000__slider:after,.Sidebar3000--resizing .Sidebar3000__slider:before{transform:scaleX(3)}.Sidebar3000[aria-hidden=true] .Sidebar3000__slider{cursor:e-resize}.Sidebar3000__header{align-items:center;display:flex;flex:0 0 var(--sidebar-row-height);gap:.25rem;padding:0 var(--sidebar-horizontal-padding)}.Accordion{--accordion-arrow-size:1rem;--accordion-row-height:32px;--accordion-inset-expandable:1.25rem;--accordion-header-background:var(--accent-3000);--accordion-inset:0rem;display:flex;flex-basis:0;flex-direction:column;flex-shrink:0;min-height:var(--accordion-row-height)}[theme=dark] .Accordion{--accordion-header-background:var(--bg-3000)}.Accordion[aria-expanded]{--accordion-inset:var(--accordion-inset-expandable)}.Accordion:not([aria-expanded=false]){flex-grow:1}.Accordion:not([aria-expanded=false]):not(:last-child){border-bottom-width:1px}.Accordion[aria-disabled=true] .Accordion__header{cursor:default}.Accordion[aria-disabled=true] .Accordion__header:hover{background:var(--accordion-header-background)}.Accordion[aria-disabled=true]:not([aria-busy=true]) .Accordion__header .LemonIcon{visibility:hidden}.Accordion__header{align-items:center;background:var(--accordion-header-background);border-bottom-width:1px;cursor:pointer;display:flex;height:var(--accordion-row-height);padding:0 var(--sidebar-horizontal-padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.Accordion__header:hover{background:var(--border-3000)}.Accordion__header>.LemonIcon{flex-shrink:0;font-size:var(--accordion-arrow-size);margin-right:calc(var(--accordion-inset-expandable) - var(--accordion-arrow-size));transition:transform 50ms ease}.Accordion[aria-expanded=true] .Accordion__header>.LemonIcon{transform:rotate(90deg)}.SidebarListItemAccordion{--accordion-arrow-size:1rem;--accordion-inset-expandable:1.25rem;--accordion-header-background:var(--accent-3000);--accordion-inset:0rem;display:flex;flex-basis:0;flex-direction:column;flex-shrink:0;height:100%}[theme=dark] .SidebarListItemAccordion{--accordion-header-background:var(--bg-3000)}.SidebarListItemAccordion[role=region]{--accordion-inset:var(--accordion-inset-expandable)}.SidebarListItemAccordion:not([aria-expanded=false]){flex-grow:1}.SidebarListItemAccordion:not([aria-expanded=false]):not(:last-child){border-bottom-width:1px}.SidebarListItemAccordion__header{align-items:center;background:var(--accordion-header-background);border-bottom-width:1px;cursor:pointer;display:flex;height:100%;padding:0 var(--sidebar-horizontal-padding) 0 calc(var(--sidebar-horizontal-padding) + 1rem*var(--depth, 0));-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.SidebarListItemAccordion__header:hover{background:var(--border-3000)}.SidebarListItemAccordion__header>.LemonIcon{flex-shrink:0;font-size:var(--accordion-arrow-size);margin-right:calc(var(--accordion-inset-expandable) - var(--accordion-arrow-size));transition:transform 50ms ease}.SidebarListItemAccordion[aria-expanded=true] .SidebarListItemAccordion__header>.LemonIcon{transform:rotate(90deg)}.SidebarListItem{--sidebar-list-item-status-color:var(--muted);--sidebar-list-item-fold-size:0.5rem;--sidebar-list-item-ribbon-width:0.1875rem;--sidebar-list-item-background:var(--sidebar-background);background:var(--sidebar-list-item-background);border-bottom-width:1px;color:var(--muted);line-height:1.125rem;list-style:none;opacity:.9;position:relative}.SidebarListItem.SidebarListItem--is-renaming,.SidebarListItem:hover:not([aria-disabled=true]),.SidebarListItem[aria-current=page]{--sidebar-list-item-background:var(--border-3000);opacity:1}.SidebarListItem.SidebarListItem--is-menu-open .SidebarListItem__actions,.SidebarListItem.SidebarListItem--is-renaming .SidebarListItem__actions,.SidebarListItem:focus-within .SidebarListItem__actions,.SidebarListItem:hover .SidebarListItem__actions,.SidebarListItem[aria-current=page] .SidebarListItem__actions{display:flex}.SidebarListItem.SidebarListItem--is-menu-open.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__button,.SidebarListItem.SidebarListItem--is-menu-open.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__link,.SidebarListItem.SidebarListItem--is-renaming.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__button,.SidebarListItem.SidebarListItem--is-renaming.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__link,.SidebarListItem:focus-within.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__button,.SidebarListItem:focus-within.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__link,.SidebarListItem:hover.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__button,.SidebarListItem:hover.SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__link,.SidebarListItem[aria-current=page].SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__button,.SidebarListItem[aria-current=page].SidebarListItem--has-menu:not(.SidebarListItem--extended) .SidebarListItem__link{padding-right:calc(var(--sidebar-horizontal-padding) + 1.25rem)}.SidebarListItem.SidebarListItem--is-menu-open.SidebarListItem--has-menu.SidebarListItem--extended:after,.SidebarListItem.SidebarListItem--is-renaming.SidebarListItem--has-menu.SidebarListItem--extended:after,.SidebarListItem:focus-within.SidebarListItem--has-menu.SidebarListItem--extended:after,.SidebarListItem:hover.SidebarListItem--has-menu.SidebarListItem--extended:after,.SidebarListItem[aria-current=page].SidebarListItem--has-menu.SidebarListItem--extended:after{background:linear-gradient(to left,var(--sidebar-list-item-background) 0,var(--sidebar-list-item-background) 50%,transparent 100%);bottom:1px;content:"";position:absolute;right:1px;top:1px;width:3.5rem}.SidebarListItem.SidebarListItem--marker-fold:before,.SidebarListItem.SidebarListItem--marker-ribbon:before{content:"";display:block;left:0;position:absolute;top:0;z-index:1}.SidebarListItem.SidebarListItem--marker-fold:before{border-bottom:var(--sidebar-list-item-fold-size) solid transparent;border-left:var(--sidebar-list-item-fold-size) solid var(--sidebar-list-item-status-color);height:0;width:0}.SidebarListItem.SidebarListItem--marker-ribbon{--sidebar-list-item-marker-offset:var(--sidebar-list-item-ribbon-width)}.SidebarListItem.SidebarListItem--marker-ribbon:before{background:var(--sidebar-list-item-status-color);height:100%;width:var(--sidebar-list-item-ribbon-width)}.SidebarListItem.SidebarListItem--marker-status-success{--sidebar-list-item-status-color:var(--success)}.SidebarListItem.SidebarListItem--marker-status-warning{--sidebar-list-item-status-color:var(--warning)}.SidebarListItem.SidebarListItem--marker-status-danger{--sidebar-list-item-status-color:var(--danger)}.SidebarListItem.SidebarListItem--marker-status-completion{--sidebar-list-item-status-color:var(--purple)}.SidebarListItem__button,.SidebarListItem__link,.SidebarListItem__rename{--sidebar-list-item-inset:calc(var(--accordion-inset, 0px) + var(--sidebar-horizontal-padding) + var(--sidebar-list-item-marker-offset, 0px));color:inherit;display:flex;height:100%;position:relative;width:100%}.SidebarListItem__button:focus-visible:after,.SidebarListItem__link:focus-visible:after,.SidebarListItem__rename:focus-visible:after{border:1px solid var(--border-3000);content:"";inset:0 0 -1px;pointer-events:none;position:absolute}.SidebarListItem__link{color:inherit!important;flex-direction:column;justify-content:center;padding:0 var(--sidebar-horizontal-padding) 0 var(--sidebar-list-item-inset);row-gap:1px}.SidebarListItem[aria-disabled=true] .SidebarListItem__link{cursor:default}.SidebarListItem__button{align-items:center;color:inherit!important;cursor:pointer;flex-direction:row;font-size:1.125rem;gap:.25rem;padding:0 var(--sidebar-horizontal-padding) 0 calc(.25rem + var(--sidebar-horizontal-padding) + 1rem*var(--depth, 0));row-gap:1px}.SidebarListItem__button:hover{background:var(--border-3000)}.SidebarListItem__button .SidebarListItem__icon{flex-shrink:0}.SidebarListItem__button .SidebarListItem__name{overflow:hidden;text-overflow:ellipsis}.SidebarListItem__rename{background:var(--bg-light);flex-direction:column;justify-content:center}.SidebarListItem__rename input{background:none;color:var(--text-3000);font-size:.75rem;height:100%;outline:none;padding:0 calc(var(--sidebar-horizontal-padding) + 2.5rem) 0 var(--sidebar-list-item-inset);width:100%}.SidebarListItem__rename:after{border:1px solid var(--border);content:"";inset:0 0 -1px;pointer-events:none;position:absolute}.SidebarListItem[aria-invalid=true] .SidebarListItem__rename:after{border-color:var(--danger)}.SidebarListItem__error{background:var(--danger);color:#fff;left:0;line-height:1.25rem;padding:0 .25rem;position:absolute;top:2rem;white-space:normal;z-index:1}.SidebarListItem__error:before{border-bottom:.25rem solid transparent;border-bottom-color:var(--danger);border-left:.25rem solid transparent;border-left-color:var(--danger);border-right:.25rem solid transparent;border-top:.25rem solid transparent;content:"";display:block;left:0;position:absolute;top:-.5rem}.SidebarListItem__actions{display:none;position:absolute;right:var(--sidebar-horizontal-padding);top:50%;transform:translateY(-50%);z-index:1}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/layout/navigation-3000/components/KeyboardShortcut.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".KeyboardShortcut{align-items:center;background:var(--accent-3000);border-color:var(--secondary-3000-button-border-hover);border-radius:.25rem;border-width:1px 1px 2px;color:var(--text-3000);display:inline-flex;font-size:.75rem;height:1.25rem;justify-content:center;min-width:1.25rem;padding:.125rem .25rem;text-transform:capitalize;-webkit-user-select:none;-moz-user-select:none;user-select:none}.KeyboardShortcut--muted>.KeyboardShortcut{background:none;color:var(--muted)}.KeyboardShortcut+.KeyboardShortcut__key{margin-left:.25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/layout/navigation-3000/components/TopBar.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.TopBar3000{--breadcrumbs-compaction-rate:0;align-items:start;display:flex;height:var(--breadcrumbs-height-full);pointer-events:none;position:sticky;top:0;white-space:nowrap;z-index:var(--z-top-navigation)}.TopBar3000 .EditableField__display{text-overflow:ellipsis;white-space:nowrap}.TopBar3000__content{align-items:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--glass-bg-3000);border-bottom:1px solid var(--glass-border-3000);display:flex;font-size:calc(.75rem + .0625rem*var(--breadcrumbs-compaction-rate));font-weight:600;gap:.5rem;height:calc(var(--breadcrumbs-height-full) - (var(--breadcrumbs-height-full) - var(--breadcrumbs-height-compact))*var(--breadcrumbs-compaction-rate));line-height:1rem;padding:0 1rem;pointer-events:auto;width:100%}.TopBar3000__hamburger{margin-left:-.5rem}.TopBar3000__breadcrumbs{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden}.TopBar3000__trail{align-items:center;display:flex;margin-top:calc(.25rem*(1 - var(--breadcrumbs-compaction-rate)));overflow:visible}.TopBar3000:not(.TopBar3000--compact) .TopBar3000__trail{height:1rem}.TopBar3000__here{box-sizing:initial;font-family:var(--font-sans)!important;font-size:1rem;font-weight:700;height:calc(1.2em*(1 - var(--breadcrumbs-compaction-rate)));line-height:1.2;margin:0;overflow:hidden;padding:calc(.5rem*(1 - var(--breadcrumbs-compaction-rate))) 0 0;position:relative}.TopBar3000--compact .TopBar3000__here{visibility:hidden}.TopBar3000__here>*{bottom:.25rem;height:1.2em;position:absolute}.TopBar3000__breadcrumb{align-items:center;color:var(--muted);cursor:default;display:flex;flex-shrink:0;overflow:hidden;white-space:pre}.TopBar3000__breadcrumb.Link:hover{color:inherit}.TopBar3000__breadcrumb .LemonIcon{font-size:1rem;margin-left:.125rem}.TopBar3000__breadcrumb .LemonTag--default{border-color:var(--muted);font-weight:600;opacity:.5;text-transform:uppercase}.TopBar3000__breadcrumb.TopBar3000__breadcrumb--here{color:var(--text-3000);cursor:default;flex-shrink:1}.TopBar3000--full .TopBar3000__breadcrumb.TopBar3000__breadcrumb--here{visibility:hidden}.TopBar3000__breadcrumb.TopBar3000__breadcrumb--here>*{transform:translateY(calc(100%*(1 - var(--breadcrumbs-compaction-rate))))}.TopBar3000__breadcrumb.TopBar3000__breadcrumb--actionable{cursor:pointer}.TopBar3000__breadcrumb.TopBar3000__breadcrumb--actionable.TopBar3000__breadcrumb--open,.TopBar3000__breadcrumb.TopBar3000__breadcrumb--actionable:hover{color:var(--text-3000)}.TopBar3000__breadcrumb.TopBar3000__breadcrumb--actionable.TopBar3000__breadcrumb--open .LemonTag--default,.TopBar3000__breadcrumb.TopBar3000__breadcrumb--actionable:hover .LemonTag--default{opacity:1}.TopBar3000__separator{flex-shrink:0;margin:0 .5rem;opacity:.5}.TopBar3000__separator:after{content:"/"}.TopBar3000__more{margin-left:.5rem}.TopBar3000__actions{align-items:center;display:flex;gap:.5rem;justify-content:flex-end}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/layout/navigation-3000/sidepanel/SidePanel.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".SidePanel3000{--side-panel-bar-width:3rem;background:var(--accent-3000);box-sizing:initial;display:flex;flex-shrink:0;position:relative;width:3rem;z-index:var(--z-main-nav)}.SidePanel3000--open{max-width:60%;min-width:28rem;position:relative;width:min(30%,40rem)}@media(max-width:1200px){.SidePanel3000--open{box-shadow:0 0 30px rgba(0,0,0,.2);max-width:calc(100vw - var(--side-panel-bar-width));position:fixed;right:0;top:0}[theme=dark] .SidePanel3000--open{box-shadow:none}}.SidePanel3000--resizing{pointer-events:none}.SidePanel3000__bar{align-items:center;border-left-width:1px;display:flex;flex-direction:column;height:100vh;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--side-panel-bar-width)}.SidePanel3000__bar .LemonButton__icon{transform:rotate(-90deg)}.SidePanel3000__tabs{flex:1;overflow:hidden auto;width:var(--side-panel-bar-width)}.SidePanel3000__tabs::-webkit-scrollbar{display:none}.SidePanel3000__tabs-content{align-items:center;display:flex;gap:.25rem;height:var(--side-panel-bar-width);margin-top:calc((var(--side-panel-bar-width) - .25rem)*-1);transform:rotate(90deg);transform-origin:bottom left}.SidePanel3000__tabs-content .LemonButton{padding-bottom:0!important;padding-right:1px!important}.SidePanel3000__tabs-content .LemonButton .LemonButton__chrome{padding:.25rem calc(var(--lemon-button-padding-right, var(--lemon-button-padding-horizontal)) + var(--lemon-button-chrome-depth)*.5) .25rem calc(var(--lemon-button-padding-left, var(--lemon-button-padding-horizontal)) - var(--lemon-button-chrome-depth)*.5)!important}.SidePanel3000__tabs-content .LemonButton .LemonButton__chrome:after{box-shadow:var(--lemon-button-chrome-depth) 0 0 -1px var(--lemon-button-frame-bg-color)!important;inset:-1px calc(var(--lemon-button-chrome-depth) - 1px) -1px -1px!important}.SidePanel3000__tabs-content .LemonButton:hover:not([aria-disabled=true]) .LemonButton__chrome,.SidePanel3000__tabs-content .LemonButton:not([aria-disabled=true]):active .LemonButton__chrome{transform:translateX(var(--lemon-button-depth))!important}.SidePanel3000__tabs-content .LemonButton:hover:not([aria-disabled=true]) .LemonButton__chrome:after,.SidePanel3000__tabs-content .LemonButton:not([aria-disabled=true]):active .LemonButton__chrome:after{box-shadow:calc(var(--lemon-button-chrome-depth) - var(--lemon-button-depth)) 0 0 -1px var(--lemon-button-frame-bg-color)!important}.SidePanel3000__tabs-content .LemonButton:hover:not([aria-disabled=true]) .LemonButton__chrome:before,.SidePanel3000__tabs-content .LemonButton:not([aria-disabled=true]):active .LemonButton__chrome:before{bottom:-1px!important;right:calc(var(--lemon-button-depth) - 1px)!important}.SidePanel3000__content{border-left-width:1px;display:flex;flex:1;flex-direction:column;height:100vh;overflow-y:auto}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/layout/navigation/TopBar/AccountPopover.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".AccountPopover{max-width:22rem;min-width:16rem}.AccountPopover__side-link{color:var(--primary-3000);flex-grow:1;font-size:.8125rem;font-weight:600;margin-left:.5rem;text-align:right}.AccountPopover__section{border-bottom:1px solid var(--border);padding:.5rem 0;width:100%}.AccountPopover__section:first-child{padding-top:0}.AccountPopover__section:last-child{border-bottom:none;padding-bottom:0}.AccountInfo{align-items:center;display:flex}.AccountInfo__identification{margin-left:.5rem;overflow:hidden;width:100%}.AccessLevelIndicator{font-size:.625rem;margin-left:.5rem;text-transform:uppercase}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/ActivityLog/ActivityLog.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ActivityLog.notifications-menu{max-width:25rem}.ActivityLog .ActivityDescription{background:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);padding:1rem}.ActivityLog .ActivityDescription .taxonomic-breakdown-filter.tag-pill{background:none;border:none;border-radius:0;font-size:.8125rem;padding:0;vertical-align:unset}.ActivityLog .ActivityDescription section:not(:last-child){margin-bottom:.5rem}.ActivityLog .page-caption{max-width:50rem}.ActivityLogRow{display:flex;gap:.5rem;line-height:24px;max-width:50rem;overflow-wrap:anywhere;padding:.5rem}.ActivityLogRow--unread{background-color:var(--primary-highlight);border-radius:var(--radius)}.ActivityLogRow .ProfilePicture{flex-grow:0}.ActivityLogRow .ActivityLogRow__details{flex-grow:1}.ActivityLogRow .ActivityLogRow__details .highlighted-activity{background-color:var(--mark);display:inline}.ActivityLogRow .ActivityLogRow__details .highlighted-activity>.PersonDisplay{min-width:5.5rem}.ActivityLogRow .ActivityLogRow__description ul.bullet-list{list-style-type:disc;padding-left:20px}.ActivityLogRow .ActivityLogRow__description ul.bullet-list li{display:list-item}.ActivityLogRow .ActivityLogRow__description__extended{margin-bottom:.5rem;margin-top:.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/ActivityLog/SentenceList.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".sentence-list,.sentence-list .sentence-part{display:inline}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Animation/Animation.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Animation{align-items:center;aspect-ratio:1/1;display:inline-flex;justify-content:center;max-width:300px;opacity:1;overflow:hidden;transition:opacity .4s ease}.Animation.Animation--hidden{opacity:0}.Animation .Animation__player{display:block;height:100%;width:100%}.Animation .Animation__player svg{display:block}.Animation.Animation--large{width:100%}.Animation.Animation--small{overflow:visible}.Animation.Animation--small svg{height:45px!important;width:45px!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/AnnotationsOverlay/AnnotationsOverlay.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".AnnotationsOverlay{left:var(--annotations-overlay-chart-area-left);position:absolute;top:var(--annotations-overlay-chart-area-height)}.AnnotationsBadge{align-items:center;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;background:none;border:none;cursor:pointer;display:flex;height:3rem;justify-content:center;margin-left:calc(var(--annotations-overlay-tick-interval)*var(--annotations-badge-index) - var(--annotations-overlay-chart-area-left) + var(--annotations-overlay-first-tick-left));position:absolute;transform:translate(-50%,-50%);width:var(--annotations-overlay-tick-interval)}.AnnotationsBadge>.LemonBadge{border-color:var(--bg-light);transform:scale(var(--annotations-badge-scale));transform-origin:center;transition:transform .2s ease}.AnnotationsPopover{--annotations-popover-width:30rem;transition:left .2s ease,opacity .1s ease,transform .1s ease;z-index:var(--z-annotation-popover)!important}.AnnotationsPopover .LemonModal{border:none;box-shadow:none;margin:0;max-width:var(--annotations-popover-width);min-height:100%;min-width:var(--annotations-popover-width)}.AnnotationCard .profile-package{vertical-align:bottom}.AnnotationCard h5{margin:0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Cards/CardMeta.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".InsightCard .handle,.TextCard .handle{align-items:flex-end;display:flex;height:100%;justify-content:center;pointer-events:none;position:absolute;width:100%;z-index:var(--z-raised)}.InsightCard .handle.horizontal svg,.TextCard .handle.horizontal svg{transform:rotate(90deg) translateX(.75rem)}.InsightCard .handle.vertical,.TextCard .handle.vertical{flex-direction:column}.InsightCard .handle.vertical svg,.TextCard .handle.vertical svg{transform:translateX(.5rem)}.InsightCard .handle.corner,.TextCard .handle.corner{justify-content:flex-end}.InsightCard .handle.corner svg,.TextCard .handle.corner svg{transform:translate(.5rem,.5rem)}.CardMeta{background:var(--bg-light);border-radius:var(--radius);display:flex;flex-direction:column;flex-shrink:0;max-height:calc(100% - 2rem);position:relative;width:100%;z-index:var(--z-raised)}.CardMeta--with-details .CardMeta__top{height:1.5rem}.CardMeta h5{color:var(--muted);line-height:1rem;margin-bottom:0}.CardMeta h4,.CardMeta h5{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.CardMeta h4{font-size:1rem;font-weight:600;height:1.5em;margin-bottom:.125rem}.CardMeta .CardMeta__primary{display:flex;padding:1rem;width:100%}.CardMeta .CardMeta__divider{background:var(--border);height:1px;margin:0 1rem;opacity:0;transition:opacity .2s ease}.CardMeta .CardMeta__details{background:var(--bg-light);border-bottom-width:1px;left:0;margin-top:-1px;max-height:24rem;overflow-y:auto;position:absolute;right:0;top:100%;transition:box-shadow .2s ease,height .2s ease,margin .2s ease}.CardMeta .CardMeta__details .CardMeta__details__content{overflow-y:auto;pointer-events:none}.CardMeta.CardMeta--details-shown .CardMeta__details{box-shadow:var(--shadow-elevation-3000);margin-top:0}.CardMeta.CardMeta--details-shown .CardMeta__details .CardMeta__details__content{opacity:1;pointer-events:all}.CardMeta.CardMeta--details-shown .CardMeta__divider{opacity:1}.CardMeta__ribbon{align-self:stretch;background:var(--muted);border-radius:var(--radius);flex-shrink:0;margin:0 .75rem 0 -.25rem;width:.375rem}.CardMeta__ribbon.blue{background:var(--blue)}.CardMeta__ribbon.purple{background:var(--purple)}.CardMeta__ribbon.green{background:var(--green)}.CardMeta__ribbon.black{background:var(--black)}.CardMeta__main{align-items:flex-start;display:flex;flex-direction:column;height:-moz-fit-content;height:fit-content;min-height:2rem;width:100%}.CardMeta__main>*{max-width:100%}.CardMeta__top{align-items:center;align-self:stretch;display:flex;height:2rem;justify-content:space-between}.CardMeta__top .LemonButton{height:1.75rem}.CardMeta__controls{align-items:center;display:flex;gap:.25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Cards/InsightCard/InsightCard.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.InsightCard{background:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);display:flex;flex-direction:column;height:30rem;max-width:100%;min-width:0;position:relative;transition:border .2s ease;z-index:3}.InsightCard--highlighted{border-color:var(--primary-3000);outline:1px solid var(--primary-3000)}.InsightCard .ErrorBoundary{height:100%;margin:auto;width:100%}.InsightCard__viz{border-radius:0 0 var(--radius) var(--radius);display:flex;flex:1;flex-direction:column;overflow:auto;position:relative;width:100%}.InsightCard__viz .AnnotationsOverlay,.InsightCard__viz .LineGraph{padding:.5rem}.InsightCard__viz .insight-empty-state{font-size:.875rem;height:100%;padding-bottom:0;padding-top:0}.InsightCard__viz .LemonTable{background:none;border:none;border-radius:0}.WebAnalyticsDashboard .InsightVizDisplay .InsightCard__viz{min-height:var(--insight-viz-min-height)}.CardMeta .InsightDetails,.InsightDetails{font-size:.8125rem;line-height:1.5rem}.CardMeta .InsightDetails h5,.InsightDetails h5{line-height:1.5rem;margin-bottom:.125rem}.CardMeta .InsightDetails section:not(:last-child),.InsightDetails section:not(:last-child){margin-bottom:.5rem}.CardMeta .InsightDetails .LemonRow,.InsightDetails .LemonRow{font-size:inherit;min-height:2rem}.InsightDetails__query{border-radius:var(--radius);border-width:1px;margin-top:.25rem;padding:.375rem .5rem}.InsightDetails__query .LemonRow{padding-left:0;padding-right:0}.InsightDetails__formula code{font-weight:600;margin-left:.375rem}.InsightDetails__series{margin:-.125rem 0}.InsightDetails__series:not(:first-child){margin-top:.5rem}.InsightDetails__series .LemonDivider{margin-left:1.5rem;width:calc(100% - 1.5rem)}.InsightDetails__footer{display:flex;flex-wrap:wrap;gap:.5rem 2rem}.InsightDetails__footer .profile-package{vertical-align:middle}.InsightDetails__footer .taxonomic-breakdown-filter.tag-pill{background:none;border:none;border-radius:0;font-size:.8125rem;padding:0;vertical-align:unset}.SeriesDisplay{line-height:1.5rem}.SeriesDisplay__raw-name{align-items:center;background:var(--primary-highlight);border-radius:var(--radius);color:var(--text-3000);display:inline-flex;font-size:.6875rem;font-weight:600;line-height:1rem;margin:0 .25rem;padding:.125rem .25rem;vertical-align:middle}.SeriesDisplay__raw-name.SeriesDisplay__raw-name--action,.SeriesDisplay__raw-name.SeriesDisplay__raw-name--event{padding:.25rem}.SeriesDisplay__raw-name.SeriesDisplay__raw-name--action:before,.SeriesDisplay__raw-name.SeriesDisplay__raw-name--event:before{background:var(--primary-3000);border-radius:var(--radius);color:var(--bg-light);display:inline-block;flex-shrink:0;font-size:.625rem;font-weight:700;line-height:1rem;margin-right:.25rem;text-align:center;width:1rem}.SeriesDisplay__raw-name.SeriesDisplay__raw-name--action:before{content:"A"}.SeriesDisplay__raw-name.SeriesDisplay__raw-name--event:before{content:"E"}.SeriesDisplay__condition{display:flex}.SeriesDisplay__arrow{color:var(--border-bold);flex-shrink:0;font-size:1.25rem;margin-right:.25rem}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Cards/TextCard/TextCard.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".TextCard__body{flex:1;overflow-y:auto}.TextCard__body ul{list-style-position:inside;list-style-type:disc}.TextCard__body ol{list-style-position:inside;list-style-type:numeric}.TextCard__body img{max-width:100%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/CodeSnippet/CodeSnippet.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".CodeSnippet{font-size:.875rem;position:relative}.CodeSnippet.CodeSnippet--compact{font-size:.8125rem}.CodeSnippet.CodeSnippet--compact .CodeSnippet__actions{right:.375rem;top:.375rem}.CodeSnippet.CodeSnippet--compact pre{padding-top:.375rem}.CodeSnippet .CodeSnippet__actions{background:var(--accent-3000)!important;display:flex;gap:.5rem;position:absolute;right:.5rem;top:.75rem}.CodeSnippet pre{background:var(--accent-3000)!important;border:1px solid var(--border-3000)!important;border-radius:var(--radius)!important;padding:.75rem 1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/CommandBar/index.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonInput.CommandBar__input{border-color:transparent!important;border-radius:0;height:3rem;padding-left:1rem;padding-right:.5rem}.SearchBarTab:hover{border-left:2px solid var(--border-3000)}.SearchBarTab.SearchBarTab__active{border-color:var(--primary-3000)}.CommandBar__overlay{align-items:center;-webkit-backdrop-filter:blur(var(--modal-backdrop-blur));backdrop-filter:blur(var(--modal-backdrop-blur));background-color:var(--modal-backdrop-color);display:flex;flex-direction:column;height:100%;justify-content:center;left:0;padding:.75rem;position:fixed;top:0;width:100%;z-index:var(--z-command-palette)}.CommandBar__overlay-content{height:100%;max-height:40rem;max-width:62rem;overflow:hidden;width:100%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/DateDisplay/DateDisplay.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".dated-highlight{background-color:var(--bg-light);border:1px solid var(--border-light);border-radius:var(--radius);color:var(--muted);margin-right:4px;padding:.125rem .25rem}.date-display-dates,.dated-highlight{white-space:nowrap}.date-display-dates .secondary-date{color:var(--muted-alt);font-weight:400;margin-left:2px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/DateFilter/RollingDateRangeFilter.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".RollingDateRangeFilter{align-items:center;color:var(--text-3000);cursor:pointer;display:flex;font-size:.875rem;font-weight:400;height:1.6875rem;line-height:1.375em;min-height:2rem;padding:1.25rem 0;transition:background .3s ease}.RollingDateRangeFilter:hover{background-color:var(--bg-3000)}.RollingDateRangeFilter input::-webkit-inner-spin-button,.RollingDateRangeFilter input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}.RollingDateRangeFilter input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.RollingDateRangeFilter__label{flex-shrink:0;margin:0 auto}.RollingDateRangeFilter__counter{align-items:center;background-color:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);box-sizing:border-box;display:flex;height:1.6875rem;line-height:1.5rem;margin:0 .25rem}.RollingDateRangeFilter__counter .LemonInput{border:none;height:unset;min-height:0;padding:0;width:3rem}.RollingDateRangeFilter__counter .LemonInput input{text-align:center}.RollingDateRangeFilter__counter .RollingDateRangeFilter__counter__step{border-radius:calc(var(--radius) - 1px);height:100%;margin:0;padding:0;text-align:center;width:1.25rem}.RollingDateRangeFilter__counter .RollingDateRangeFilter__counter__step:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.RollingDateRangeFilter__counter .RollingDateRangeFilter__counter__step:last-child{border-bottom-left-radius:0;border-top-left-radius:0}.RollingDateRangeFilter__counter .RollingDateRangeFilter__counter__step:hover{background-color:var(--accent-3000)}.RollingDateRangeFilter__select{width:6rem}.RollingDateRangeFilter__popover{z-index:9999}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/DefinitionPopover/DefinitionPopover.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".definition-popover{max-width:20rem;min-width:17rem;padding:.5rem .75rem .75rem}.definition-popover .definition-popover-header{display:flex;flex-direction:column}.definition-popover .definition-popover-header .definition-popover-header-row{display:flex;flex-direction:row;justify-content:space-between;line-height:2rem;margin-bottom:.25rem}.definition-popover .definition-popover-header .definition-popover-header-row .definition-popover-header-row-title{color:var(--muted);font-size:.6875rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.definition-popover .definition-popover-header .definition-popover-header-row .definition-popover-header-row-buttons{display:flex;flex-direction:row;font-size:.8125rem}.definition-popover .definition-popover-header .definition-popover-header-row .definition-popover-header-row-buttons a{margin-left:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.definition-popover .definition-popover-header .definition-popover-header-row .definition-popover-header-row-buttons .definition-popover-disabled-button{color:var(--muted);cursor:not-allowed}.definition-popover .definition-popover-header .definition-popover-title{align-items:center;display:flex;font-size:1.25rem;font-weight:600;line-height:1.2;margin-bottom:.25rem;min-height:1.5rem;white-space:normal}.definition-popover .definition-popover-header .definition-popover-title svg.taxonomy-icon{flex-shrink:0;font-size:1.5rem;margin-right:.75rem}.definition-popover .definition-popover-header .definition-popover-title svg.taxonomy-icon.taxonomy-icon-muted{color:var(--muted-alt)}.definition-popover .definition-popover-header .definition-popover-title svg.taxonomy-icon.taxonomy-icon-verified{color:var(--success)}.definition-popover .definition-popover-header .definition-popover-title svg.taxonomy-icon.taxonomy-icon-built-in{color:var(--primary-3000)}.definition-popover .definition-popover-tags{margin:0!important}.definition-popover .definition-popover-description{font-weight:400;margin:.5rem 0;overflow-wrap:break-word}.definition-popover .definition-popover-description.empty{color:var(--muted);font-style:italic}.definition-popover .definition-popover-examples{font-style:italic;margin-bottom:.25rem}.definition-popover .definition-popover-timemeta{margin:.5rem 0}.definition-popover .definition-popover-timemeta .definition-popover-timemeta-user{display:inline-flex}.definition-popover .definition-popover-timemeta .definition-popover-timemeta-spacer{margin-right:.5rem}.definition-popover .DefinitionPopover{background-color:var(--bg-3000)}.definition-popover .DefinitionPopover .DefinitionPopover__label{align-items:flex-start;font-size:.6875rem;margin-bottom:1rem;margin-top:1rem;text-transform:uppercase}.definition-popover .definition-popover-grid{display:grid;grid-gap:.5rem}.definition-popover .definition-popover-grid .definition-popover-grid-card{display:flex;flex-direction:column}.definition-popover .definition-popover-grid .definition-popover-grid-card .definition-popover-grid-card-title{color:var(--muted);font-size:.6875rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase}.definition-popover .definition-popover-grid .definition-popover-grid-card .definition-popover-grid-card-content{margin-top:.25rem}.definition-popover .definition-popover-edit-form{display:flex;flex-direction:column}.definition-popover .definition-popover-edit-form .label-text{font-weight:600;margin-right:.25rem}.definition-popover .definition-popover-edit-form .definition-popover-edit-form-label{margin-bottom:.5rem}.definition-popover .definition-popover-edit-form .definition-popover-edit-form-value{margin-bottom:1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/EditableField/EditableField.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".EditableField{align-items:center;display:flex;max-width:100%}.EditableField:not(.EditableField--multiline){line-height:1.15em}.EditableField i{color:var(--muted)}.EditableField .EditableField__notice{color:var(--muted);font-size:1.5rem;margin-left:.5rem}.EditableField .EditableField__highlight{align-items:center;display:flex;flex-direction:row;margin:-.25rem;max-width:calc(100% + .5rem);overflow:auto;padding:.25rem;width:-moz-fit-content;width:fit-content}.EditableField .EditableField__display{overflow:hidden;white-space:pre-wrap}.EditableField.EditableField--editing .EditableField__highlight{align-items:flex-end;border-radius:var(--radius);flex-grow:1;max-width:calc(100% + .5rem);outline:1px solid var(--border);width:auto}.EditableField.EditableField--underlined .EditableField__highlight{margin-bottom:0;margin-top:0;padding-bottom:0;padding-top:0}.EditableField.EditableField--underlined.EditableField--editing .EditableField__highlight{outline:none}.EditableField.EditableField--underlined.EditableField--editing .EditableField__highlight input{border-bottom:1px dashed var(--muted);margin-bottom:-1px}.EditableField .EditableField__actions{align-items:center;display:flex;flex-shrink:0;gap:.5rem;margin-left:.5rem;overflow:hidden}.EditableField input,.EditableField textarea{background:transparent;border:none;color:var(--text-3000);font:inherit;max-width:100%;outline:none;padding:0}.EditableField textarea{align-self:center;width:100%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/EmptyMessage/EmptyMessage.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".empty-message{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center}.empty-message .description,.empty-message .title{text-align:center}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Errors/StackTraces.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".StackTrace .LemonCollapse.LemonCollapse--embedded{border-bottom:1px solid var(--border);border-top:1px solid var(--border)}.StackTrace .LemonCollapse .LemonCollapsePanel__header{background-color:var(--accent-3000);min-height:1.875rem!important;padding:0!important}.StackTrace .LemonCollapse .LemonCollapsePanel__header--disabled:hover{background-color:var(--accent-3000)!important}.StackTrace--embedded .StackTrace__type,.StackTrace--embedded .StackTrace__value{margin:0 8px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Fade/Fade.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,"@keyframes Fade__fade-in{0%{opacity:0}to{opacity:1}}@keyframes Fade__fade-out{0%{opacity:1}to{opacity:0}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/HTMLElementsDisplay/SelectableElement.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".SelectableElement{border:1px solid transparent;border-radius:var(--radius);transition:background-color .2s ease,color .2s ease,border .2s ease}.SelectableElement.SelectableElement--selected{background:var(--primary-3000)}.SelectableElement:hover{background:var(--primary-3000-hover)}.SelectableElement:active{background:var(--primary-3000-active)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/HedgehogBuddy/HedgehogBuddy.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".HedgehogBuddy{cursor:pointer;margin:0;z-index:var(--z-hedgehog-buddy)}.HedgehogBuddy:after{content:attr(data-content);height:0;overflow:hidden;position:absolute;width:0;z-index:-1}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/InsightLabel/InsightLabel.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".insights-label{max-width:100%}.insights-label .value{font-size:1.176em;font-weight:700;margin-left:.3rem;padding-right:4px}.insights-label .graph-series-glyph{margin-left:2px;margin-right:4px;padding:0 6px}.insights-label .color-icon{border:2px solid #fff;border-radius:50%;box-sizing:border-box;margin-left:2px;margin-right:6px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/InsightLegend/InsightLegend.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".InsightLegendMenu{background-color:var(--bg-light);box-shadow:none!important;max-height:100%}.InsightLegendMenu.InsightLegendMenu--in-card-view{max-width:40%}.InsightLegendMenu.InsightLegendMenu--horizontal{max-width:100%}.InsightLegendMenu.InsightLegendMenu--horizontal .InsightLegendMenu-scroll{display:flex;flex-wrap:wrap}.InsightLegendMenu.InsightLegendMenu--horizontal .InsightLegendMenu-scroll .InsightLegendMenu-item{width:auto}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Map/Maplibre.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px var(--primary-3000)}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{background-color:var(--bg-light);color:var(--muted-3000)}.maplibregl-ctrl-attrib .maplibregl-ctrl-attrib-button{background-color:var(--bg-3000)}[theme=dark] .maplibregl-ctrl-attrib .maplibregl-ctrl-attrib-button{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%23fff' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\")}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:var(--bg-3000)}[theme=dark] .maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-image:url(\"data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%23fff' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E\")}.maplibregl-ctrl-attrib a{color:var(--text-3000)}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/NotFound/NotFound.scss":(module,exports,__webpack_require__)=>{var ___CSS_LOADER_API_IMPORT___=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js"),___CSS_LOADER_GET_URL_IMPORT___=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/getUrl.js"),___CSS_LOADER_URL_IMPORT_0___=__webpack_require__("./frontend/public/not-found-astrohog.png");exports=___CSS_LOADER_API_IMPORT___(!1);var ___CSS_LOADER_URL_REPLACEMENT_0___=___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);exports.push([module.id,".NotFoundComponent{align-items:center;display:flex;flex-direction:column;margin:6rem auto;max-width:50rem;padding:0 1rem;text-align:center}.NotFoundComponent .NotFoundComponent__graphic{background:url("+___CSS_LOADER_URL_REPLACEMENT_0___+") no-repeat 50%;height:270px;width:100%}.NotebookNode .NotFoundComponent{align-items:center;background-color:var(--danger-highlight);display:flex;flex:1;flex-direction:column;justify-content:center;margin:0;max-width:100%;padding:2rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Playlist/Playlist.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Playlist{align-items:flex-start;border:1px solid var(--border);border-radius:var(--radius);flex-direction:row;justify-content:flex-start}.Playlist,.Playlist .Playlist__list{display:flex;height:100%;overflow:hidden}.Playlist .Playlist__list{flex-direction:column;flex-shrink:0;position:relative}.Playlist .Playlist__list:not(.Playlist__list--collapsed){max-width:320px;min-width:285px;width:25%}.Playlist .Playlist__list .text-link{color:var(--text-3000)!important}.Playlist .Playlist__main{flex:1;height:100%;overflow:hidden;width:100%}.Playlist--embedded{border:none}.Playlist--wide .Playlist__main{flex:1;height:100%}.SessionRecordingPlaylistHeightWrapper{height:calc(100vh - 15rem);min-height:25rem}.SessionRecordingPreview{border-left:3px solid transparent}.SessionRecordingPreview--active{border-left-color:var(--primary-3000)}.SessionRecordingPreview:hover{background-color:var(--primary-highlight)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/PropertiesTable/PropertiesTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".properties-table-key{display:flex;max-width:24rem;min-width:8rem}.properties-table-value{align-items:center;display:flex;max-width:-moz-fit-content;max-width:fit-content;min-width:12rem}.properties-table-value .value-link>*{vertical-align:middle}.properties-table-value .value-link>svg{font-size:1rem;margin-left:.25rem}.properties-table-value .editable{border:1px solid transparent;border-radius:calc(var(--radius)*.75);cursor:pointer;margin-left:-.25rem;padding:.125rem .25rem}.properties-table-value .editable:hover{background:var(--bg-light);border:1px solid var(--border-light)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/PropertyFilters/PropertyFilters.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PropertyFilters{display:flex;gap:.5rem}.PropertyFilters .PropertyFilters__content{display:flex;flex:1;flex-wrap:wrap;gap:.5rem}.PropertyFilters .PropertyFilters__prefix{color:var(--border-bold-3000);font-size:18px;padding:0 5px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.PropertyFilters .logical-row-divider{align-items:flex-start;font-size:12px;font-weight:600;margin-bottom:0;margin-top:.5rem;text-transform:uppercase}.PropertyFilters .logical-row-divider:after,.PropertyFilters .logical-row-divider:before{border-top:1px solid var(--border)}.PropertyFilters .logical-row-divider:before{width:1.5%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/PropertyFilters/components/FilterRow.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".property-filter-row{flex-basis:100%}.property-filter-row.wrap-filters{flex-basis:auto}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/PropertyFilters/components/PropertyFilterButton.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PropertyFilterButton{align-items:center;background:var(--border);border:1px solid var(--secondary-3000-button-border);border-radius:99rem;color:var(--text-3000);cursor:default;display:inline-flex;gap:.375rem;height:2rem;outline:0;overflow:hidden;padding:.25rem .625rem;white-space:nowrap}.PropertyFilterButton[aria-disabled=true]:not(.LemonButton--loading){cursor:not-allowed;opacity:var(--opacity-disabled)}.PropertyFilterButton:focus,.PropertyFilterButton:hover:not([aria-disabled=true]){border-color:var(--secondary-3000-button-border-hover)}.PropertyFilterButton:not(.PropertyFilterButton--clickable){border-color:transparent}.PropertyFilterButton.PropertyFilterButton--clickable{cursor:pointer;touch-action:manipulation}.PropertyFilterButton.PropertyFilterButton--closable{padding-right:.5rem}.PropertyFilterButton>:not(.PropertyFilterButton-content){flex-shrink:0}.PropertyFilterButton .PropertyFilterButton-content{flex:1;overflow:hidden;text-align:left;text-overflow:ellipsis}.PropertyFilterButton>.LemonIcon{font-size:1rem}.PropertyFilterButton .LemonButton{border-radius:99rem;margin:0 -.375rem 0 -.125rem}.PropertyFilterButton .LemonButton__chrome{min-height:auto;padding:.1875rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/PropertyFilters/components/TaxonomicPropertyFilter.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".TaxonomicPropertyFilter{overflow:hidden;width:100%}.TaxonomicPropertyFilter--in-dropdown{background:var(--bg-light);max-width:100%;min-width:300px;width:900px}.TaxonomicPropertyFilter--in-dropdown .TaxonomicPropertyFilter__row-items>:first-child{width:10rem}.TaxonomicPropertyFilter__row{display:flex;gap:.5rem;overflow:hidden}.TaxonomicPropertyFilter__row-operator{align-items:center;display:flex;flex-shrink:0;height:40px;justify-content:flex-end;width:4.5rem}.TaxonomicPropertyFilter__row--or-filtering .TaxonomicPropertyFilter__row-operator{width:2rem}.TaxonomicPropertyFilter__row-arrow{color:var(--border-bold-3000);font-size:18px;font-weight:700;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.TaxonomicPropertyFilter__row-items{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:.5rem;overflow:hidden}.TaxonomicPropertyFilter__row-items>*{max-width:100%;overflow:hidden}.TaxonomicPropertyFilter__row--showing-operators .TaxonomicPropertyFilter__row-items>:first-child{flex-grow:1;min-width:10rem;width:30%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/PropertyKeyInfo.scss":(module,exports,__webpack_require__)=>{var ___CSS_LOADER_API_IMPORT___=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js"),___CSS_LOADER_GET_URL_IMPORT___=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/getUrl.js"),___CSS_LOADER_URL_IMPORT_0___=__webpack_require__("./frontend/public/posthog-icon.svg"),___CSS_LOADER_URL_IMPORT_1___=__webpack_require__("./frontend/public/langfuse-icon.svg");exports=___CSS_LOADER_API_IMPORT___(!1);var ___CSS_LOADER_URL_REPLACEMENT_0___=___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___),___CSS_LOADER_URL_REPLACEMENT_1___=___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);exports.push([module.id,".PropertyKeyInfo,.PropertyKeyInfo__header{align-items:center;display:inline-flex;gap:.25rem;max-width:100%;overflow:hidden;vertical-align:bottom}.PropertyKeyInfo__header{font-weight:600}.PropertyKeyInfo__text.PropertyKeyInfo__text--ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PropertyKeyInfo__logo{background-size:cover;display:inline-block;flex-shrink:0;height:1rem;width:1rem}.PropertyKeyInfo__logo--posthog{background-image:url("+___CSS_LOADER_URL_REPLACEMENT_0___+")}.PropertyKeyInfo__logo--langfuse{background-image:url("+___CSS_LOADER_URL_REPLACEMENT_1___+")}.PropertyKeyInfo__overlay{padding:.25rem}.PropertyKeyInfo__overlay p{margin-bottom:.25rem}.PropertyKeyInfo__overlay p:last-child{margin-bottom:0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Resizer/Resizer.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.Resizer{--resizer-thickness:8px;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:var(--z-notifications-popover)}.Resizer--left,.Resizer--right{--scale:scaleX(3);bottom:0;cursor:col-resize;top:0;width:var(--resizer-thickness)}.Resizer--left .Resizer__handle,.Resizer--right .Resizer__handle{bottom:0;left:calc(var(--resizer-thickness)/2);top:0;width:1px}.Resizer--left .Resizer__handle:after,.Resizer--left .Resizer__handle:before,.Resizer--right .Resizer__handle:after,.Resizer--right .Resizer__handle:before{bottom:0;top:0;width:1px}.Resizer--bottom,.Resizer--top{--scale:scaleY(3);cursor:row-resize;height:var(--resizer-thickness);left:0;right:0}.Resizer--bottom .Resizer__handle,.Resizer--top .Resizer__handle{height:1px;left:0;right:0;top:calc(var(--resizer-thickness)/2)}.Resizer--bottom .Resizer__handle:after,.Resizer--bottom .Resizer__handle:before,.Resizer--top .Resizer__handle:after,.Resizer--top .Resizer__handle:before{height:1px;left:0;right:0}.Resizer[aria-hidden=true] .Resizer{cursor:e-resize}.Resizer .Resizer__handle{position:absolute}.Resizer .Resizer__handle:after,.Resizer .Resizer__handle:before{box-sizing:initial;content:"";position:absolute}.Resizer .Resizer__handle:before{background:var(--border);transition:transform .1s ease}.Resizer .Resizer__handle:after{background:var(--text-3000);opacity:0;transition:transform .1s ease}.Resizer--left{left:0;transform:translateX(calc(var(--resizer-thickness)/2*-1))}.Resizer--right{right:0;transform:translateX(calc(var(--resizer-thickness)/2*1))}.Resizer--top{top:0;transform:translateY(calc(var(--resizer-thickness)/2*-1))}.Resizer--bottom{bottom:0;transform:translateY(calc(var(--resizer-thickness)/2*1))}.Resizer--resizing .Resizer__handle:after,.Resizer:hover .Resizer__handle:after{opacity:.25}.Resizer--resizing .Resizer__handle:after,.Resizer--resizing .Resizer__handle:before{transform:var(--scale)}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/ScrollableShadows/ScrollableShadows.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.ScrollableShadows{display:flex;overflow:hidden;position:relative}.ScrollableShadows:after,.ScrollableShadows:before{content:"";height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.ScrollableShadows .ScrollableShadows__inner{flex:1}.ScrollableShadows.ScrollableShadows--horizontal{height:100%}.ScrollableShadows.ScrollableShadows--horizontal .ScrollableShadows__inner{overflow-x:auto}.ScrollableShadows.ScrollableShadows--horizontal:before{box-shadow:inset 16px 0 16px -16px rgba(0,0,0,.25)}.ScrollableShadows.ScrollableShadows--horizontal:after{box-shadow:inset -16px 0 16px -16px rgba(0,0,0,.25)}.ScrollableShadows.ScrollableShadows--vertical{width:100%}.ScrollableShadows.ScrollableShadows--vertical .ScrollableShadows__inner{overflow-y:auto}.ScrollableShadows.ScrollableShadows--vertical:before{box-shadow:inset 0 16px 16px -16px rgba(0,0,0,.25)}.ScrollableShadows.ScrollableShadows--vertical:after{box-shadow:inset 0 -16px 16px -16px rgba(0,0,0,.25)}.ScrollableShadows.ScrollableShadows--bottom:after,.ScrollableShadows.ScrollableShadows--left:before,.ScrollableShadows.ScrollableShadows--right:after,.ScrollableShadows.ScrollableShadows--top:before{opacity:1}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Sharing/SharingModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".SharingPreview{background-color:var(--bg-3000);padding:.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/TZLabel/index.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".TZLabelPopover .TZLabelPopover__row{display:flex;margin-top:.5rem}.TZLabelPopover .TZLabelPopover__row>:first-child{color:var(--primary-alt);font-weight:700;margin-right:8px}.TZLabelPopover .TZLabelPopover__row>:nth-child(2):not(:empty){color:var(--primary-alt);font-weight:700;margin-right:6px}.TZLabelPopover .TZLabelPopover__row>:nth-child(3){color:var(--muted);flex-grow:1;margin-right:16px}.TZLabelPopover .TZLabelPopover__row>:nth-child(4){min-width:10rem;text-align:right}.TZLabelPopover--seconds .TZLabelPopover .TZLabelPopover__row>:nth-child(4){min-width:12rem}.TZLabelPopover .TZLabelPopover__row--muted,.TZLabelPopover .TZLabelPopover__row--muted>:first-child,.TZLabelPopover .TZLabelPopover__row--muted>:nth-child(2):not(:empty){color:var(--muted)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/TaxonomicFilter/InfiniteList.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".taxonomic-infinite-list{flex-grow:1;min-height:200px}.taxonomic-infinite-list.empty-infinite-list{align-items:center;display:flex;justify-content:center;width:100%}.taxonomic-infinite-list.empty-infinite-list .no-infinite-results{color:#666}.taxonomic-infinite-list .taxonomic-list-row{align-items:center;border:none;color:var(--text-3000);cursor:pointer;display:flex;justify-content:space-between;padding:4px 12px}.taxonomic-infinite-list .taxonomic-list-row .taxonomic-list-row-contents{align-items:center;display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none}.taxonomic-infinite-list .taxonomic-list-row .taxonomic-list-row-contents .taxonomic-list-row-contents-icon{display:flex;font-size:1.25rem;justify-content:center;margin-left:-4px;margin-right:4px;min-width:30px}.taxonomic-infinite-list .taxonomic-list-row .taxonomic-list-row-contents .taxonomic-list-row-contents-icon svg.taxonomy-icon{flex-shrink:0;vertical-align:middle}.taxonomic-infinite-list .taxonomic-list-row .taxonomic-list-row-contents .taxonomic-list-row-contents-icon svg.taxonomy-icon.taxonomy-icon-muted{color:var(--muted-alt)}.taxonomic-infinite-list .taxonomic-list-row .taxonomic-list-row-contents .taxonomic-list-row-contents-icon svg.taxonomy-icon.taxonomy-icon-verified{color:var(--success)}.taxonomic-infinite-list .taxonomic-list-row .taxonomic-list-row-contents .taxonomic-list-row-contents-icon svg.taxonomy-icon.taxonomy-icon-built-in{color:var(--primary-3000)}.taxonomic-infinite-list .taxonomic-list-row>div{max-width:100%}.taxonomic-infinite-list .taxonomic-list-row>div>span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.taxonomic-infinite-list .taxonomic-list-row.hover{background-color:var(--bg-3000);border-radius:var(--radius)}.taxonomic-infinite-list .taxonomic-list-row.selected{font-weight:700}.taxonomic-infinite-list .taxonomic-list-row.expand-row{color:var(--primary-3000)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/TaxonomicFilter/TaxonomicFilter.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".taxonomic-filter{background:var(--bg-light);display:flex;flex-direction:column;max-width:calc(100vw - 40px);width:550px}.taxonomic-filter.force-minimum-width{min-width:300px}.taxonomic-filter.one-taxonomic-tab .taxonomic-infinite-list{margin-top:10px}.taxonomic-filter .taxonomic-group-title{align-items:stretch;color:var(--muted);display:flex;font-size:12px;font-weight:600;line-height:12px;padding-left:10px;padding-top:10px;text-transform:uppercase;width:100%}.taxonomic-filter .taxonomic-pills{margin-bottom:8px;margin-top:8px;padding-left:10px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/TimelineSeekbar/TimelineSeekbar.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.TimelineSeekbar{--timeline-seekbar-thickness:0.125rem;--timeline-seekbar-arrow-width:0.5rem;--timeline-seekbar-arrow-height:0.75rem;margin:.75rem .5rem}.TimelineSeekbar__meta{display:flex;gap:.5rem;justify-content:space-between}.TimelineSeekbar__note{align-items:center;display:flex;font-size:.8125rem;line-height:1.25rem}.TimelineSeekbar__current{background:var(--primary-3000);border-radius:var(--radius);color:var(--bg-light);font-size:.75rem;font-weight:500;line-height:1.25rem;padding:0 .25rem;width:-moz-fit-content;width:fit-content}.TimelineSeekbar__current::-moz-selection{background:var(--primary-3000-hover)}.TimelineSeekbar__current::selection{background:var(--primary-3000-hover)}.TimelineSeekbar__current .Spinner{margin-right:.25rem}.TimelineSeekbar__seekbar{height:1.25rem;margin-top:.5rem;position:relative}.TimelineSeekbar__points{display:flex;height:100%;left:calc(var(--timeline-seekbar-thickness)*2);position:relative;top:0;width:calc(100% - var(--timeline-seekbar-arrow-width) - var(--timeline-seekbar-thickness)*3 - 1.25rem)}.TimelineSeekbar__points .LemonBadge:not(.LemonBadge--active){background-clip:padding-box;border-right-color:transparent}.TimelineSeekbar__section{border-left:var(--timeline-seekbar-thickness) solid var(--bg-light);cursor:pointer;left:calc(var(--timeline-seekbar-section-progress-current) - var(--timeline-seekbar-thickness));position:absolute;width:var(--timeline-seekbar-section-progress-next)}.TimelineSeekbar__section:last-child{width:calc(var(--timeline-seekbar-section-progress-next) + 1.25rem)}.TimelineSeekbar__line{background:var(--primary-3000);height:var(--timeline-seekbar-thickness);left:0;position:absolute;top:calc(50% - var(--timeline-seekbar-thickness)/2);width:calc(100% - var(--timeline-seekbar-arrow-width))}.TimelineSeekbar__line-end,.TimelineSeekbar__line-start{height:1.25rem;position:absolute;top:calc(var(--timeline-seekbar-thickness)/2 - .625rem)}.TimelineSeekbar__line-end:before,.TimelineSeekbar__line-start:before{background:var(--primary-3000);content:"";display:block;height:var(--timeline-seekbar-arrow-height);margin:calc(var(--timeline-seekbar-thickness) + .125rem) 0}.TimelineSeekbar__line-start{left:0;width:var(--timeline-seekbar-thickness)}.TimelineSeekbar__line-end{cursor:pointer;left:100%;width:var(--timeline-seekbar-arrow-width)}.TimelineSeekbar__line-end:before{clip-path:polygon(0 0,100% 50%,0 100%)}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/UniversalFilters/UniversalFilterButton.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".UniversalFilterButton{align-items:center;background:var(--border);border:1px solid var(--secondary-3000-button-border);border-radius:99rem;color:var(--text-3000);cursor:default;display:inline-flex;gap:.375rem;height:2rem;outline:0;overflow:hidden;padding:.25rem .625rem;white-space:nowrap}.UniversalFilterButton[aria-disabled=true]:not(.LemonButton--loading){cursor:not-allowed;opacity:var(--opacity-disabled)}.UniversalFilterButton:focus,.UniversalFilterButton:hover:not([aria-disabled=true]){border-color:var(--secondary-3000-button-border-hover)}.UniversalFilterButton:not(.UniversalFilterButton--clickable){border-color:transparent}.UniversalFilterButton.UniversalFilterButton--clickable{cursor:pointer;touch-action:manipulation}.UniversalFilterButton.UniversalFilterButton--closable{padding-right:.5rem}.UniversalFilterButton>:not(.UniversalFilterButton-content){flex-shrink:0}.UniversalFilterButton .UniversalFilterButton-content{flex:1;overflow:hidden;text-overflow:ellipsis}.UniversalFilterButton>.LemonIcon{font-size:1rem}.UniversalFilterButton .LemonButton{border-radius:99rem;margin:0 -.375rem 0 -.125rem}.UniversalFilterButton .LemonButton__chrome{min-height:auto;padding:.1875rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/UserActivityIndicator/UserActivityIndicator.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".UserActivityIndicator{align-items:center;display:flex;font-size:.8125rem;overflow-x:auto;white-space:nowrap}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonActionableTooltip/LemonActionableTooltip.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonActionableTooltip{max-width:var(--in-app-prompts-width);padding:.5rem}.LemonActionableTooltip>*+*{margin-top:.5rem}.LemonActionableTooltip .LemonActionableTooltip__header{display:flex;justify-content:space-between}.LemonActionableTooltip .LemonActionableTooltip__header>*+*{margin-left:.5rem}.LemonActionableTooltip .LemonActionableTooltip__title{font-size:1.125rem;font-weight:500;line-height:1.75rem}.LemonActionableTooltip .LemonActionableTooltip__icon{align-items:center;color:var(--primary-3000);display:flex;height:1.5rem;width:1.5rem}.LemonActionableTooltip .LemonActionableTooltip__icon>svg{height:100%;width:100%}.LemonActionableTooltip .LemonActionableTooltip__body>*+*{margin-top:.5rem}.LemonActionableTooltip .LemonActionableTooltip__footer{display:flex;justify-content:space-between;margin-top:1rem}.LemonActionableTooltip .LemonActionableTooltip__url-buttons{display:flex;flex-direction:column;width:100%}.LemonActionableTooltip .LemonActionableTooltip__url-buttons>*+*{margin-top:.25rem}.LemonActionableTooltip .LemonActionableTooltip__action-buttons{display:flex;flex-direction:column;width:100%}.LemonActionableTooltip .LemonActionableTooltip__action-buttons>*+*{margin-top:.25rem}.LemonActionableTooltip .LemonActionableTooltip__navigation{align-items:center;color:var(--muted);display:flex}.LemonActionableTooltip .LemonActionableTooltip__navigation>*+*{margin-left:.25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonBadge/LemonBadge.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonBadge{--lemon-badge-color:var(--primary-3000);--lemon-badge-size:1.5rem;--lemon-badge-font-size:0.75rem;--lemon-badge-position-offset:0.5rem;--lemon-badge-border-width:0.125rem;align-items:center;background:var(--lemon-badge-color);border:var(--lemon-badge-border-width) solid var(--accent-3000);border-radius:calc(var(--lemon-badge-size)/2);color:var(--bg-light);display:flex;flex-shrink:0;font-size:var(--lemon-badge-font-size);font-weight:700;height:var(--lemon-badge-size);justify-content:center;line-height:var(--lemon-badge-size);min-width:var(--lemon-badge-size);padding:calc(var(--lemon-badge-size)/8);pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-fit-content;width:fit-content;z-index:1}.LemonBadge>*{height:calc(var(--lemon-badge-size) - var(--lemon-badge-border-width)*2);margin:calc(var(--lemon-badge-size)*-1/8);width:calc(var(--lemon-badge-size) - var(--lemon-badge-border-width)*2)}.LemonBadge.LemonBadge--success{--lemon-badge-color:var(--success)}.LemonBadge.LemonBadge--warning{--lemon-badge-color:var(--warning)}.LemonBadge.LemonBadge--danger{--lemon-badge-color:var(--danger)}.LemonBadge.LemonBadge--muted{--lemon-badge-color:var(--muted)}.LemonBadge.LemonBadge--data{--lemon-badge-color:var(--data-color-1)}.LemonBadge.LemonBadge--position-none{position:relative}.LemonBadge.LemonBadge--position-top-left{left:calc(var(--lemon-badge-position-offset)*-1);top:calc(var(--lemon-badge-position-offset)*-1)}.LemonBadge.LemonBadge--position-top-right{right:calc(var(--lemon-badge-position-offset)*-1);top:calc(var(--lemon-badge-position-offset)*-1)}.LemonBadge.LemonBadge--position-bottom-left{bottom:calc(var(--lemon-badge-position-offset)*-1);left:calc(var(--lemon-badge-position-offset)*-1)}.LemonBadge.LemonBadge--position-bottom-right{bottom:calc(var(--lemon-badge-position-offset)*-1);right:calc(var(--lemon-badge-position-offset)*-1)}.LemonBadge.LemonBadge--small{--lemon-badge-size:1.125rem;--lemon-badge-font-size:0.625rem}.LemonBadge.LemonBadge--large{--lemon-badge-size:1.75rem;--lemon-badge-font-size:0.875rem}.LemonBadge.LemonBadge--dot{height:calc(var(--lemon-badge-size)*.5 + var(--lemon-badge-border-width));min-width:0;width:calc(var(--lemon-badge-size)*.5 + var(--lemon-badge-border-width))}.LemonBadge.LemonBadge--active{outline:calc(var(--lemon-badge-font-size)/5) solid var(--lemon-badge-color);z-index:var(--z-raised)}.LemonBadge.LemonBadge--enter{opacity:0;transform:scale(.5)}.LemonBadge.LemonBadge--enter-active{opacity:1;transform:scale(1);transition:all .2s ease-out}.LemonBadge.LemonBadge--exit{opacity:1;transform:scale(1)}.LemonBadge.LemonBadge--exit-active{opacity:0;transform:scale(.5);transition:all .2s ease-in}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonBanner/LemonBanner.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonBanner{border:1px solid var(--border-tertiary);border-radius:var(--radius);color:var(--content-primary);display:flex;flex-direction:column;font-weight:500;gap:.5rem;min-height:3rem;padding:.5rem;text-align:left}.LemonBanner.LemonBanner--square{border-radius:0}.LemonBanner.LemonBanner--info{background-color:var(--background-secondary)}.LemonBanner.LemonBanner--warning{background-color:var(--background-warning-subtle);color:var(--content-warning-bold)}.LemonBanner.LemonBanner--error{background-color:var(--background-danger-subtle);color:var(--content-danger-bold)}.LemonBanner.LemonBanner--success{background-color:var(--background-success-subtle);color:var(--content-success-bold)}.LemonBanner .LemonBanner__icon{flex-shrink:0;font-size:1.5rem;line-height:0}.LemonBanner p{margin-bottom:.25em}.LemonBanner p:last-child{margin-bottom:0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonButton/LemonButton.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonButton,.Link.LemonButton{--lemon-button-hover-depth:-0.03125rem;--lemon-button-press-depth:0.03125rem;--lemon-button-padding-adjacent-icon:0.375rem;--lemon-button-transition:opacity 200ms ease,transform 200ms ease;--lemon-button-border-width:0;--lemon-button-bg-color:transparent;--button-border-color:none;--lemon-button-border-color-hover:none;--lemon-button-frame-bg-color:none;--lemon-button-font-size:0.875rem;--lemon-button-icon-size:1.5rem;--lemon-button-height:2.3125rem;--lemon-button-gap:0.5rem;--lemon-button-icon-opacity:0.8;--lemon-button-color:var(--text-3000);align-items:center;-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;background:none;border-radius:var(--radius);cursor:pointer;display:flex;flex-shrink:0;font-family:var(--font-title);padding:0;position:relative;transition:var(--lemon-button-transition);-webkit-user-select:none;-moz-user-select:none;user-select:none;--lemon-button-chrome-depth:0.1875rem;--lemon-button-padding-horizontal:0.75rem;--lemon-button-side-action-width:2rem}.LemonButton .font-normal,.LemonButton.font-normal,.Link.LemonButton .font-normal,.Link.LemonButton.font-normal{font-family:var(--font-sans)}.LemonButton .LemonButton__chrome,.Link.LemonButton .LemonButton__chrome{align-items:center;background:none;border-color:transparent;border-style:solid;border-width:var(--lemon-button-border-width);color:var(--lemon-button-color);display:flex;flex:1;flex-direction:row;flex-shrink:0;font-size:var(--lemon-button-font-size);font-weight:500;gap:var(--lemon-button-gap);height:100%;justify-content:flex-start;line-height:1.5rem;min-height:var(--lemon-button-height);padding:.25rem var(--lemon-button-padding-horizontal);position:relative;text-align:left;width:100%}.LemonButton .LemonButton__chrome .LemonButton__content,.Link.LemonButton .LemonButton__chrome .LemonButton__content{align-items:center;display:flex;flex:1;line-height:normal;overflow:hidden}.LemonButton .LemonButton__chrome .LemonButton__icon,.Link.LemonButton .LemonButton__chrome .LemonButton__icon{display:flex;flex-shrink:0;font-size:var(--lemon-button-icon-size);place-items:center center;transition:color .2s ease}.LemonButton .LemonButton__chrome .LemonButton__icon .LemonIcon,.Link.LemonButton .LemonButton__chrome .LemonButton__icon .LemonIcon{opacity:var(--lemon-button-icon-opacity)}.LemonButton[aria-disabled=true]:not(.LemonButton--loading),.Link.LemonButton[aria-disabled=true]:not(.LemonButton--loading){cursor:not-allowed;opacity:var(--opacity-disabled)}.LemonButton.LemonButton--active,.LemonButton:hover:not([aria-disabled=true]),.LemonButton:not([aria-disabled=true]):active,.Link.LemonButton.LemonButton--active,.Link.LemonButton:hover:not([aria-disabled=true]),.Link.LemonButton:not([aria-disabled=true]):active{--lemon-button-icon-opacity:0.75}.LemonButton.LemonButton--full-width,.Link.LemonButton.LemonButton--full-width{--lemon-button-padding-horizontal:0.5rem;width:100%}.LemonButton.LemonButton--loading,.Link.LemonButton.LemonButton--loading{cursor:default}.LemonButton.LemonButton--no-padding,.Link.LemonButton.LemonButton--no-padding{height:auto;min-height:0;padding:0;width:auto}.LemonButton.LemonButton--no-padding .LemonButton__chrome,.Link.LemonButton.LemonButton--no-padding .LemonButton__chrome{min-height:0;padding:0}.LemonButton.LemonButton--no-padding.LemonButton--full-width,.Link.LemonButton.LemonButton--no-padding.LemonButton--full-width{width:100%}.LemonButton.LemonButton--truncate,.Link.LemonButton.LemonButton--truncate{flex-shrink:1;min-width:0;white-space:nowrap}.LemonButton.LemonButton--truncate .LemonButton__content,.Link.LemonButton.LemonButton--truncate .LemonButton__content{display:initial;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.LemonButton.LemonButton--centered .LemonButton__chrome,.Link.LemonButton.LemonButton--centered .LemonButton__chrome{justify-content:center!important}.LemonButton.LemonButton--centered .LemonButton__content,.Link.LemonButton.LemonButton--centered .LemonButton__content{flex:initial!important;text-align:center!important}.LemonButton.LemonButton--primary,.Link.LemonButton.LemonButton--primary{--lemon-button-bg-color:var(--primary-3000-button-bg);--lemon-button-bg-color-active:var(--primary-3000-button-bg);--button-border-color:var(--primary-3000-button-border);--lemon-button-border-color-hover:var(--primary-3000-button-border-hover);--lemon-button-frame-bg-color:var(--primary-3000-frame-bg);--lemon-button-color:var(--text-3000-light)}.LemonButton.LemonButton--primary.LemonButton--status-alt,.Link.LemonButton.LemonButton--primary.LemonButton--status-alt{--lemon-button-bg-color:var(--primary-3000-frame-bg-light);--lemon-button-bg-color-active:var(--lemon-button-bg-color);--button-border-color:var(--primary-3000-button-border);--lemon-button-border-color-hover:var(--primary-3000-button-border-hover);--lemon-button-frame-bg-color:var(--primary-3000-button-bg-dark);--lemon-button-color:var(--text-3000-light)}.LemonButton.LemonButton--secondary.LemonButton--status-alt.LemonButton--active,.LemonButton.LemonButton--secondary.LemonButton--status-alt:hover,.LemonButton.LemonButton--secondary:not(.LemonButton--status-alt):not(.LemonButton--status-danger),.Link.LemonButton.LemonButton--secondary.LemonButton--status-alt.LemonButton--active,.Link.LemonButton.LemonButton--secondary.LemonButton--status-alt:hover,.Link.LemonButton.LemonButton--secondary:not(.LemonButton--status-alt):not(.LemonButton--status-danger){--button-border-color:var(--secondary-3000-button-border);--lemon-button-bg-color-active:var(--bg-light);--lemon-button-border-color-hover:var(--secondary-3000-button-border-hover);--lemon-button-frame-bg-color:var(--secondary-3000-frame-bg)}.LemonButton.LemonButton--primary.LemonButton--status-danger,.LemonButton.LemonButton--secondary.LemonButton--status-danger,.LemonButton.LemonButton--status-danger,.Link.LemonButton.LemonButton--primary.LemonButton--status-danger,.Link.LemonButton.LemonButton--secondary.LemonButton--status-danger,.Link.LemonButton.LemonButton--status-danger{--lemon-button-color:var(--danger-3000-button-border-hover);--button-border-color:var(--danger-3000-button-border);--lemon-button-border-color-hover:var(--danger-3000-button-border-hover);--lemon-button-frame-bg-color:var(--danger-3000-frame-bg);--lemon-button-icon-opacity:1}.LemonButton.LemonButton--primary.LemonButton--status-danger,.Link.LemonButton.LemonButton--primary.LemonButton--status-danger{--lemon-button-bg-color:var(--red-100);--lemon-button-color:var(--text-3000)}[theme=dark] .LemonButton.LemonButton--primary.LemonButton--status-danger,[theme=dark] .Link.LemonButton.LemonButton--primary.LemonButton--status-danger{--lemon-button-bg-color:#312101;--lemon-button-color:var(--red-200)}.LemonButton.LemonButton--secondary.LemonButton--status-alt,.Link.LemonButton.LemonButton--secondary.LemonButton--status-alt{--lemon-button-color:var(--muted)}.LemonButton.LemonButton--secondary.LemonButton--status-alt.LemonButton--active,.LemonButton.LemonButton--secondary.LemonButton--status-alt:hover:not([aria-disabled=true]),.Link.LemonButton.LemonButton--secondary.LemonButton--status-alt.LemonButton--active,.Link.LemonButton.LemonButton--secondary.LemonButton--status-alt:hover:not([aria-disabled=true]){--lemon-button-color:var(--text-3000)}.LemonButton.LemonButton--primary,.LemonButton.LemonButton--secondary,.Link.LemonButton.LemonButton--primary,.Link.LemonButton.LemonButton--secondary{--lemon-button-border-width:1px}.LemonButton.LemonButton--primary:not([aria-disabled=true]):hover .LemonButton__chrome:after,.LemonButton.LemonButton--secondary:not([aria-disabled=true]):hover .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary:not([aria-disabled=true]):hover .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary:not([aria-disabled=true]):hover .LemonButton__chrome:after{border-color:var(--lemon-button-border-color-hover)}.LemonButton.LemonButton--primary.LemonButton--has-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding),.LemonButton.LemonButton--secondary.LemonButton--has-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding),.Link.LemonButton.LemonButton--primary.LemonButton--has-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding),.Link.LemonButton.LemonButton--secondary.LemonButton--has-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding){--lemon-button-padding-left:var(--lemon-button-padding-adjacent-icon)}.LemonButton.LemonButton--primary.LemonButton--has-side-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding),.LemonButton.LemonButton--secondary.LemonButton--has-side-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding),.Link.LemonButton.LemonButton--primary.LemonButton--has-side-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding),.Link.LemonButton.LemonButton--secondary.LemonButton--has-side-icon:not(.LemonButton--no-content):not(.LemonButton--no-padding){--lemon-button-padding-right:var(--lemon-button-padding-adjacent-icon)}.LemonButton.LemonButton--primary .LemonButton__chrome,.LemonButton.LemonButton--secondary .LemonButton__chrome,.Link.LemonButton.LemonButton--primary .LemonButton__chrome,.Link.LemonButton.LemonButton--secondary .LemonButton__chrome{background:transparent;padding:calc(.25rem - var(--lemon-button-chrome-depth)*.5) var(--lemon-button-padding-right,var(--lemon-button-padding-horizontal)) calc(.25rem + var(--lemon-button-chrome-depth)*.5) var(--lemon-button-padding-left,var(--lemon-button-padding-horizontal))}.LemonButton.LemonButton--primary .LemonButton__chrome>*,.LemonButton.LemonButton--secondary .LemonButton__chrome>*,.Link.LemonButton.LemonButton--primary .LemonButton__chrome>*,.Link.LemonButton.LemonButton--secondary .LemonButton__chrome>*{z-index:1}.LemonButton.LemonButton--primary .LemonButton__chrome:before,.LemonButton.LemonButton--secondary .LemonButton__chrome:before,.Link.LemonButton.LemonButton--primary .LemonButton__chrome:before,.Link.LemonButton.LemonButton--secondary .LemonButton__chrome:before{border:1px solid var(--button-border-color);border-radius:var(--radius);content:"";inset:-1px;position:absolute;z-index:0}.LemonButton.LemonButton--primary .LemonButton__chrome:after,.LemonButton.LemonButton--secondary .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary .LemonButton__chrome:after{background:var(--lemon-button-bg-color);border:1px solid var(--button-border-color);border-radius:var(--radius);box-shadow:0 var(--lemon-button-chrome-depth) 0 -1px var(--lemon-button-frame-bg-color);content:"";inset:-1px -1px calc(var(--lemon-button-chrome-depth) - 1px) -1px;position:absolute;transition:opacity .2s ease;z-index:0}.LemonButton.LemonButton--primary.LemonButton--active .LemonButton__chrome:after,.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome:after,.LemonButton.LemonButton--secondary.LemonButton--active .LemonButton__chrome:after,.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary.LemonButton--active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary.LemonButton--active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome:after{border:1px solid var(--lemon-button-border-color-hover)}.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]),.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]),.Link.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]),.Link.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]){--lemon-button-depth:var(--lemon-button-hover-depth)}.LemonButton.LemonButton--primary:not([aria-disabled=true]):active,.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active,.Link.LemonButton.LemonButton--primary:not([aria-disabled=true]):active,.Link.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active{--lemon-button-depth:var(--lemon-button-press-depth)}.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]) .LemonButton__chrome,.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome,.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]) .LemonButton__chrome,.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome,.Link.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]) .LemonButton__chrome,.Link.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome,.Link.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]) .LemonButton__chrome,.Link.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome{transform:translateY(var(--lemon-button-depth))}.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]) .LemonButton__chrome:after,.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome:after,.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]) .LemonButton__chrome:after,.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]) .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]) .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome:after{box-shadow:0 calc(var(--lemon-button-chrome-depth) - var(--lemon-button-depth)) 0 -1px var(--lemon-button-frame-bg-color)}.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]) .LemonButton__chrome:before,.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome:before,.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]) .LemonButton__chrome:before,.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome:before,.Link.LemonButton.LemonButton--primary:hover:not([aria-disabled=true]) .LemonButton__chrome:before,.Link.LemonButton.LemonButton--primary:not([aria-disabled=true]):active .LemonButton__chrome:before,.Link.LemonButton.LemonButton--secondary:hover:not([aria-disabled=true]) .LemonButton__chrome:before,.Link.LemonButton.LemonButton--secondary:not([aria-disabled=true]):active .LemonButton__chrome:before{bottom:calc(var(--lemon-button-depth) - 1px)}.LemonButton.LemonButton--primary.LemonButton--active .LemonButton__chrome:after,.LemonButton.LemonButton--secondary.LemonButton--active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--primary.LemonButton--active .LemonButton__chrome:after,.Link.LemonButton.LemonButton--secondary.LemonButton--active .LemonButton__chrome:after{background:var(--lemon-button-bg-color-active)}.LemonButton.LemonButton--tertiary.LemonButton--active,.LemonButton.LemonButton--tertiary:not([aria-disabled=true]):hover,.Link.LemonButton.LemonButton--tertiary.LemonButton--active,.Link.LemonButton.LemonButton--tertiary:not([aria-disabled=true]):hover{background-color:var(--glass-border-3000)}.LemonButton.LemonButton--tertiary.LemonButton--status-danger.LemonButton--active,.LemonButton.LemonButton--tertiary.LemonButton--status-danger:not([aria-disabled=true]):hover,.Link.LemonButton.LemonButton--tertiary.LemonButton--status-danger.LemonButton--active,.Link.LemonButton.LemonButton--tertiary.LemonButton--status-danger:not([aria-disabled=true]):hover{background-color:var(--danger-highlight)}.LemonButton--xsmall,.Link.LemonButton--xsmall{--lemon-button-padding-horizontal:0.375rem;--lemon-button-padding-adjacent-icon:0.25rem;--lemon-button-font-size:0.75rem;--lemon-button-icon-size:0.875rem;--lemon-button-height:1.625rem;--lemon-button-gap:0.25rem;--lemon-button-side-action-width:1.5rem}.LemonButton--small,.Link.LemonButton--small{--lemon-button-padding-horizontal:0.5rem;--lemon-button-height:2.0625rem;--lemon-button-gap:0.25rem;--lemon-button-side-action-width:1.75rem;--lemon-button-icon-size:1.25rem}.LemonButton--large,.Link.LemonButton--large{--lemon-button-font-size:1rem;--lemon-button-icon-size:1.75rem;--lemon-button-padding-adjacent-icon:0.75rem;--lemon-button-height:3.0625rem;--lemon-button-gap:0.75rem}.LemonButtonWithSideAction{position:relative;width:-moz-fit-content;width:fit-content;--lemon-button-chrome-depth:0.1875rem;--lemon-button-padding-horizontal:0.75rem;--lemon-button-side-action-width:2rem}.LemonButtonWithSideAction--full-width{width:100%}.LemonButtonWithSideAction--tertiary .LemonButtonWithSideAction__side-button{--lemon-button-chrome-depth:0px}.LemonButtonWithSideAction:hover>.LemonButton--secondary.LemonButton--status-alt{--button-border-color:var(--secondary-3000-button-border);--lemon-button-bg-color-active:var(--bg-light);--lemon-button-border-color-hover:var(--secondary-3000-button-border-hover);--lemon-button-frame-bg-color:var(--secondary-3000-frame-bg)}.LemonButtonWithSideAction .LemonButtonWithSideAction__spacer{box-sizing:initial;color:var(--muted);height:calc(var(--lemon-button-height) - 1.0625rem);width:calc(var(--lemon-button-side-action-width) - var(--lemon-button-padding-right, var(--lemon-button-padding-horizontal)))}.LemonButtonWithSideAction .LemonButtonWithSideAction__spacer--divider{border-left:1px solid;margin-left:calc(var(--lemon-button-padding-horizontal)/2);padding:0}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button{background:none;border-bottom-right-radius:calc(var(--radius) - 1px);border-top-right-radius:calc(var(--radius) - 1px);bottom:calc(var(--lemon-button-chrome-depth) + 1px);position:absolute;right:1px;top:1px;transform:none;z-index:1}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button .LemonButton{--lemon-button-depth:0px;border-bottom-left-radius:0;border-top-left-radius:0;height:100%;width:var(--lemon-button-side-action-width)}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button .LemonButton__chrome{border:none!important;justify-content:center!important;padding:0!important}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button .LemonButton__chrome:after,.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button .LemonButton__chrome:before{content:none!important}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button:not([aria-disabled=true]):active .LemonButton__chrome{transform:none!important}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button .LemonButton__icon{color:currentColor}.LemonButtonWithSideAction .LemonButtonWithSideAction__side-button:not([aria-disabled=true]):hover{background:rgba(0,0,0,.1)}.LemonButtonWithSideAction--xsmall{--lemon-button-padding-horizontal:0.375rem;--lemon-button-padding-adjacent-icon:0.25rem;--lemon-button-font-size:0.75rem;--lemon-button-icon-size:0.875rem;--lemon-button-height:1.625rem;--lemon-button-gap:0.25rem;--lemon-button-side-action-width:1.5rem}.LemonButtonWithSideAction--small{--lemon-button-padding-horizontal:0.5rem;--lemon-button-height:2.0625rem;--lemon-button-gap:0.25rem;--lemon-button-side-action-width:1.75rem;--lemon-button-icon-size:1.25rem}.LemonButtonWithSideAction--large{--lemon-button-font-size:1rem;--lemon-button-icon-size:1.75rem;--lemon-button-padding-adjacent-icon:0.75rem;--lemon-button-height:3.0625rem;--lemon-button-gap:0.75rem}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonCalendar/LemonCalendar.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonCalendar{--lemon-calendar-month-height:305px;--lemon-calendar-row-gap:2px;--lemon-calendar-day-width:40px;--lemon-calendar-today-radius:2px;--lemon-calendar-time-column-width:50px;--lemon-calendar-time-button-height:2.3125rem;height:var(--lemon-calendar-month-height)}.LemonCalendar .LemonCalendar__month{width:100%}.LemonCalendar .LemonCalendar__month>tbody>tr>td,.LemonCalendar .LemonCalendar__month>thead>tr:first-child>th{padding:calc(var(--lemon-calendar-row-gap)/2) 0}.LemonCalendar .LemonCalendar__month>tbody>tr>td,.LemonCalendar .LemonCalendar__month>thead>tr:first-child>th:first-child,.LemonCalendar .LemonCalendar__month>thead>tr:first-child>th:last-child{width:var(--lemon-calendar-day-width)}.LemonCalendar .LemonCalendar__month tr.LemonCalendar__month-header{height:var(--lemon-calendar-time-button-height)}.LemonCalendar .LemonCalendar__month tr .LemonButton.rounded-none{border-radius:0}.LemonCalendar .LemonCalendar__month tr .LemonButton.rounded-r-none{border-bottom-right-radius:0;border-top-right-radius:0}.LemonCalendar .LemonCalendar__month tr .LemonButton.rounded-l-none{border-bottom-left-radius:0;border-top-left-radius:0}.LemonCalendar .LemonCalendar__month tr .LemonCalendar__today{position:relative}.LemonCalendar .LemonCalendar__month tr .LemonCalendar__today:after{background:currentColor;border-radius:100%;bottom:5px;content:"";height:calc(var(--lemon-calendar-today-radius)*2);left:calc(50% - var(--lemon-calendar-today-radius));position:absolute;width:calc(var(--lemon-calendar-today-radius)*2)}.LemonCalendar .LemonCalendar__range--boundary{background-color:var(--glass-border-3000)}.LemonCalendar--hour{--lemon-calendar-time-columns:2}.LemonCalendar--minute{--lemon-calendar-time-columns:3}.LemonCalendar--hour,.LemonCalendar--minute{padding-right:calc(var(--lemon-calendar-time-columns)*var(--lemon-calendar-time-column-width) + 2px)}.LemonCalendar--hour .LemonCalendar__time>div,.LemonCalendar--minute .LemonCalendar__time>div{width:var(--lemon-calendar-time-column-width)}.LemonCalendar--hour .LemonCalendar__time>div.ScrollableShadows .ScrollableShadows__inner,.LemonCalendar--minute .LemonCalendar__time>div.ScrollableShadows .ScrollableShadows__inner{scroll-behavior:smooth;scrollbar-width:none}.LemonCalendar--hour .LemonCalendar__time--scroll-spacer,.LemonCalendar--minute .LemonCalendar__time--scroll-spacer{height:calc(100% - var(--lemon-calendar-time-button-height))}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonCard/LemonCard.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonCard{transition:.2s ease}.LemonCard.LemonCard--hoverEffect:hover{box-shadow:var(--shadow-elevation-3000);transform:scale(1.01)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonCheckbox/LemonCheckbox.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonCheckbox{--lemon-checkbox-height:calc(2.125rem + 3px);align-items:center;display:flex;font-weight:500;line-height:1.5rem;width:-moz-fit-content;width:fit-content}.LemonCheckbox:has(:focus-visible) .LemonCheckbox__box{outline:1px auto -webkit-focus-ring-color}.LemonCheckbox .LemonCheckbox__input{-webkit-appearance:none!important;-moz-appearance:none!important;appearance:none!important;height:0!important;width:0!important}.LemonCheckbox label{--tick-length:12.73;--box-color:var(--primary-3000);align-items:center;cursor:pointer;display:flex;gap:.5rem;min-height:1.5rem}.LemonCheckbox label>.LemonCheckbox__box{background:var(--bg-light);border:1.5px solid var(--border-bold);border-radius:.25rem;flex-shrink:0;height:1rem;transition:border .2s ease,background .2s ease;width:1rem}.LemonCheckbox label>.LemonCheckbox__box path{stroke:var(--bg-light);stroke-dasharray:var(--tick-length);stroke-dashoffset:var(--tick-length);transition:stroke-dashoffset .2s ease}.LemonCheckbox.LemonCheckbox--disabled label{color:var(--muted);cursor:not-allowed}.LemonCheckbox.LemonCheckbox--full-width,.LemonCheckbox.LemonCheckbox--full-width label{width:100%}.LemonCheckbox.LemonCheckbox--indeterminate label{--tick-length:9}.LemonCheckbox.LemonCheckbox:not(.LemonCheckbox--disabled):active label,.LemonCheckbox.LemonCheckbox:not(.LemonCheckbox--disabled):hover label{--box-color:var(--primary-3000-hover)}.LemonCheckbox.LemonCheckbox:not(.LemonCheckbox--disabled):active label .LemonCheckbox__box,.LemonCheckbox.LemonCheckbox:not(.LemonCheckbox--disabled):hover label .LemonCheckbox__box{border-color:var(--box-color)}.LemonCheckbox.LemonCheckbox:not(.LemonCheckbox--disabled):active label{--box-color:var(--primary-3000-active)}.LemonCheckbox.LemonCheckbox--checked label .LemonCheckbox__box{background:var(--box-color);border-color:transparent}.LemonCheckbox.LemonCheckbox--checked label .LemonCheckbox__box path{stroke-dashoffset:0}.LemonCheckbox.LemonCheckbox--bordered{line-height:1.4}.LemonCheckbox.LemonCheckbox--bordered label{background:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);min-height:var(--lemon-checkbox-height);padding:0 .75rem}.LemonCheckbox.LemonCheckbox--bordered.LemonCheckbox--small label{min-height:2rem;padding:0 .5rem}.LemonCheckbox.LemonCheckbox--bordered.LemonCheckbox--xsmall label{min-height:1.625rem;padding:0 .375rem}.Field--error .LemonCheckbox.LemonCheckbox--bordered label{border:1px solid var(--danger)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonCollapse/LemonCollapse.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonCollapse{align-items:stretch;border:1px solid var(--border);border-radius:var(--radius);display:flex;flex-direction:column;overflow:hidden}.LemonCollapse--embedded{border:none;border-radius:0}.LemonCollapsePanel{align-items:stretch;display:flex;flex-direction:column}.LemonCollapsePanel:not(:last-child){border-bottom-width:1px}.LemonCollapsePanel__header{background:var(--bg-light);border-radius:0!important;font-weight:500!important;min-height:2.875rem!important;padding:.5rem .75rem!important}.LemonCollapsePanel__header.LemonButton:active{transform:inherit}.LemonCollapsePanel__header--disabled:hover{background-color:var(--bg-light)!important;cursor:default}.LemonCollapsePanel__body{border-top-width:1px;box-sizing:initial;height:0;overflow:hidden;transition:height .2s ease}.storybook-test-runner .LemonCollapsePanel__body{height:-moz-fit-content!important;height:fit-content!important}.LemonCollapsePanel__content{padding:1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonDivider/LemonDivider.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonDivider{background:var(--border);flex-shrink:0;height:1px;width:100%}.LemonDivider--dashed{background:repeating-linear-gradient(to right,var(--border),var(--border) 4px,transparent 4px,transparent 8px)}.LemonDivider--thick{height:3px}.LemonDivider--vertical{align-self:stretch;height:auto;width:1px}.LemonDivider--vertical.LemonDivider--thick{width:3px}.LemonDivider--vertical.LemonDivider--dashed{background:repeating-linear-gradient(to bottom,var(--border),var(--border) 4px,transparent 4px,transparent 8px)}.LemonDivider--with-label{background:none;display:flex;height:unset}.LemonDivider--with-label:after,.LemonDivider--with-label:before{border-top:1px solid var(--border);content:"";display:block;position:relative;top:50%;transform:translateY(50%);width:50%}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonFileInput/LemonFileInput.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.FileDropTarget{position:relative}.FileDropTarget--active:after{--file-drop-target-padding:0.5rem;border:3px dashed var(--primary-3000);border-radius:var(--radius);content:"";height:calc(100% + var(--file-drop-target-padding)*2);left:calc(var(--file-drop-target-padding)*-1);position:absolute;top:calc(var(--file-drop-target-padding)*-1);width:calc(100% + var(--file-drop-target-padding)*2)}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonInput/LemonInput.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonInput{--lemon-input-height:calc(2.125rem + 3px);align-items:center;background:none;background-color:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-3000);cursor:text;display:flex;font-size:.875rem;gap:.375rem;height:var(--lemon-input-height);justify-content:left;line-height:1.25rem;min-height:var(--lemon-input-height);padding:.25rem .5rem;text-align:left}.LemonInput[aria-disabled=true]{cursor:not-allowed}.LemonInput.LemonInput--focused:not([aria-disabled=true]),.LemonInput:hover:not([aria-disabled=true]){border-color:var(--border-bold)}.LemonInput.LemonInput--transparent-background{background-color:inherit}.Field--error .LemonInput,.LemonInput.LemonInput--status-danger{border-color:var(--danger)!important}.LemonInput .LemonInput__input{align-self:stretch;background:none;border:none;cursor:inherit;flex:1;outline:none;padding:0;width:100%}.LemonInput .LemonInput__input:disabled{opacity:var(--opacity-disabled)}.LemonInput .LemonIcon{color:var(--muted-alt);flex-shrink:0;font-size:1.25rem;height:1em;transition:color .2s ease;width:1em}.LemonInput.LemonInput--xsmall{--lemon-input-height:1.5rem;padding:.125rem .25rem}.LemonInput.LemonInput--xsmall .LemonIcon{font-size:1rem}.LemonInput.LemonInput--small{--lemon-input-height:2rem;padding:.125rem .25rem}.LemonInput.LemonInput--small .LemonIcon{font-size:1.25rem}.LemonInput.LemonInput--large{--lemon-input-height:3rem}.LemonInput.LemonInput--large .LemonIcon{font-size:1.5rem}.LemonInput.LemonInput--has-content>.LemonIcon{color:var(--primary-3000)}.LemonInput.LemonInput--type-search{max-width:240px}.LemonInput.LemonInput--type-number .LemonInput__input{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;text-overflow:clip}.LemonInput.LemonInput--full-width{max-width:100%;width:100%}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonLabel/LemonLabel.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonLabel{align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;display:inline-flex;flex-wrap:wrap;font-weight:600;line-height:1.5rem}.LemonLabel .LemonLabel__extra{font-weight:400}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonMarkdown/LemonMarkdown.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonMarkdown>*{margin:0 0 .5em}.LemonMarkdown>:last-child{margin-bottom:0}.LemonMarkdown dl,.LemonMarkdown ol,.LemonMarkdown ul{padding-left:1.5em}.LemonMarkdown ol{list-style-type:decimal}.LemonMarkdown ul{list-style-type:disc}.LemonMarkdown strong[level]{display:block}.LemonMarkdown hr{margin:1em 0}.LemonMarkdown h1{font-weight:600;margin-bottom:.25em}.LemonMarkdown img{max-width:100%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonModal/LemonModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonModal__overlay{align-items:center;display:flex;inset:0;justify-content:center;position:fixed;transition:background-color var(--modal-transition-time) ease-out,-webkit-backdrop-filter var(--modal-transition-time) ease-out;transition:background-color var(--modal-transition-time) ease-out,backdrop-filter var(--modal-transition-time) ease-out;transition:background-color var(--modal-transition-time) ease-out,backdrop-filter var(--modal-transition-time) ease-out,-webkit-backdrop-filter var(--modal-transition-time) ease-out;z-index:var(--z-modal)}.LemonModal__overlay.LemonModal__overlay--force-modal-above-popovers{z-index:var(--z-force-modal-above-popovers)}.LemonModal__overlay.ReactModal__Overlay--after-open{-webkit-backdrop-filter:blur(var(--modal-backdrop-blur));backdrop-filter:blur(var(--modal-backdrop-blur));background-color:var(--modal-backdrop-color)}.LemonModal__overlay.ReactModal__Overlay--before-close{-webkit-backdrop-filter:blur(0);backdrop-filter:blur(0);background-color:transparent}.LemonModal__overlay.LemonModal__overlay--z-1061{z-index:1061}.LemonModal__overlay.LemonModal__overlay--z-1062{z-index:1062}.LemonModal__overlay.LemonModal__overlay--z-1066{z-index:1066}.LemonModal__overlay.LemonModal__overlay--z-1067{z-index:1067}.LemonModal__overlay.LemonModal__overlay--z-1068{z-index:1068}.LemonModal__overlay.LemonModal__overlay--z-1069{z-index:1069}.LemonModal{background-color:var(--bg-light);border:1px solid var(--border-bold);border-radius:var(--radius);box-shadow:var(--modal-shadow-elevation);display:flex;flex-direction:column;margin:1rem auto;max-height:90%;max-width:90%;min-width:min(28rem,100%);opacity:0;position:relative;transform:scale(.85);transition:opacity var(--modal-transition-time) ease-out,transform var(--modal-transition-time) ease-out;width:-moz-fit-content;width:fit-content;will-change:transform}.LemonModal.LemonModal--fullscreen{border:none;border-radius:0;height:100%;margin:0;max-height:100%;max-width:100%;width:100%}.LemonModal.ReactModal__Content--after-open:not(.ReactModal__Content--before-close){opacity:1;transform:scale(1)}.LemonModal .LemonModal__close{position:absolute;right:1rem;top:.75rem;z-index:1}.LemonModal .LemonModal__close.LemonModal__close--highlighted{animation:LemonModal__tilt-shake .4s}.LemonModal .LemonModal__layout{display:flex;flex:1;flex-direction:column;overflow-y:hidden}.LemonModal .LemonModal__content{overflow-y:auto;padding:1rem}.LemonModal .LemonModal__content.LemonModal__content--embedded{padding:0}.LemonModal .LemonModal__container{display:flex;height:100%;overflow:hidden}.LemonModal__header{border-bottom:1px solid var(--border);margin:1rem 1rem 0;padding-bottom:1rem}.LemonModal__header h3{font-size:1.125rem;font-weight:700;line-height:1.5rem;margin-bottom:0;margin-right:2.5rem}.LemonModal__header p{margin:.5rem 0 -.25rem}.LemonModal__footer{align-items:center;border-top:1px solid var(--border);display:flex;flex-wrap:wrap;gap:.5rem;justify-content:flex-end;margin:0 1rem 1rem;padding-top:1rem;white-space:nowrap}.LemonModal__header+.LemonModal__footer{border-top:none}@keyframes LemonModal__tilt-shake{0%{transform:rotate(0deg)}16.666%{transform:rotate(12deg)}50%{transform:rotate(-10deg)}83.333%{transform:rotate(8deg)}to{transform:rotate(0deg)}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonProgressCircle/LemonProgressCircle.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonProgressCircle{display:inline-block;position:relative;vertical-align:text-bottom}.LemonProgressCircle circle{transform:rotate(-90deg);transform-origin:50% 50%;transition:stroke-dashoffset .35s}.LemonProgressCircle .LemonProgressCircle__content{align-items:center;display:flex;inset:0;justify-content:center;position:absolute}.LemonButton__icon .LemonProgressCircle{display:inline-flex}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonRow/LemonRow.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonRow{align-items:flex-start;background:none;border:none;border-radius:var(--radius);display:flex;flex-direction:column;flex-shrink:0;font-size:.875rem;justify-content:center;line-height:1.25rem;min-height:2.5rem;padding:.25rem 1rem;text-align:left;transition:background-color .2s ease,color .2s ease,border .2s ease,opacity .2s ease}.LemonRow.LemonRow--status-highlighted{background:var(--primary-highlight);color:var(--text-3000);font-weight:600}.LemonRow.LemonRow--status-highlighted .LemonRow__icon{color:var(--primary-3000)}.LemonRow.LemonRow--status-danger .LemonRow__icon{color:var(--danger)}.LemonRow.LemonRow--status-warning .LemonRow__icon{color:var(--warning)}.LemonRow.LemonRow--status-success .LemonRow__icon{color:var(--success)}.LemonRow.LemonRow--status-muted{background:var(--bg-3000)}.LemonRow.LemonRow--disabled{opacity:var(--opacity-disabled)}.LemonRow__main-area{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.LemonRow__extended-area{display:flex;flex-direction:column;font-size:.8125rem;margin-left:1.875rem;padding-bottom:.125rem}.LemonRow--outlined{border:1px solid var(--border)}.LemonRow--full-width{padding-left:.5rem;padding-right:.5rem;width:100%}.LemonRow--full-width .LemonRow__icon:not(:first-child):last-child{margin-right:0}.LemonRow--full-width>.LemonRow__main-area{justify-content:flex-start}.LemonRow--center .LemonRow__main-area{justify-content:center!important}.LemonRow--center .LemonRow__content{flex-grow:0}.LemonRow--symbolic{display:block;height:1.5rem;min-height:0;padding:0;width:1.5rem}.LemonRow--large,.LemonRow--tall{min-height:3.5rem;padding:.5rem 1rem}.LemonRow--symbolic.LemonRow--large,.LemonRow--tall.LemonRow--symbolic{height:1.75rem;min-height:0;padding:0;width:1.75rem}.LemonRow--large{font-size:1rem}.LemonRow--large .LemonRow__icon{font-size:1.75rem}.LemonRow--small{min-height:2rem;padding:.125rem .5rem}.LemonRow--small.LemonRow--symbolic{height:1.25rem;min-height:0;padding:0;width:1.25rem}.LemonRow--small .LemonRow__icon{font-size:1.25rem}.LemonRow__icon{color:var(--muted-alt);display:flex;flex-shrink:0;font-size:1.5rem;transition:background-color .2s ease,color .2s ease}.LemonRow__content{align-items:center;display:flex;flex-grow:1;min-width:0}.LemonRow__content:not(:first-child),.LemonRow__icon:not(:first-child){margin-left:.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonSegmentedButton/LemonSegmentedButton.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonSegmentedButton{border-radius:var(--radius);flex-shrink:0;position:relative;width:-moz-fit-content;width:fit-content}.LemonSegmentedButton>ul{align-items:stretch;display:flex;list-style:none;z-index:1}.LemonSegmentedButton.LemonSegmentedButton--full-width{width:100%}.LemonSegmentedButton .LemonSegmentedButton__option{display:flex;flex:1}.LemonSegmentedButton .LemonSegmentedButton__option .LemonButton__content{white-space:nowrap}.LemonSegmentedButton .LemonSegmentedButton__option .LemonButton,.LemonSegmentedButton .LemonSegmentedButton__option .LemonButton>.LemonButton__chrome:after,.LemonSegmentedButton .LemonSegmentedButton__option .LemonButton>.LemonButton__chrome:before{border-radius:0!important}.LemonSegmentedButton .LemonSegmentedButton__option .LemonButton:not(:hover) .LemonButton__content{opacity:var(--lemon-button-icon-opacity)}.LemonSegmentedButton .LemonSegmentedButton__option .LemonButton.LemonButton--secondary:not([aria-disabled=true]):hover>.LemonButton__chrome:after{border-color:var(--secondary-3000-button-border)}.LemonSegmentedButton .LemonSegmentedButton__option:first-child,.LemonSegmentedButton .LemonSegmentedButton__option:first-child .LemonButton,.LemonSegmentedButton .LemonSegmentedButton__option:first-child .LemonButton>.LemonButton__chrome:after,.LemonSegmentedButton .LemonSegmentedButton__option:first-child .LemonButton>.LemonButton__chrome:before{border-bottom-left-radius:var(--radius)!important;border-top-left-radius:var(--radius)!important}.LemonSegmentedButton .LemonSegmentedButton__option:last-child,.LemonSegmentedButton .LemonSegmentedButton__option:last-child .LemonButton,.LemonSegmentedButton .LemonSegmentedButton__option:last-child .LemonButton>.LemonButton__chrome:after,.LemonSegmentedButton .LemonSegmentedButton__option:last-child .LemonButton>.LemonButton__chrome:before{border-bottom-right-radius:var(--radius)!important;border-top-right-radius:var(--radius)!important}.LemonSegmentedButton .LemonSegmentedButton__option:not(:first-child) .LemonButton__chrome{margin-left:-1px}.LemonSegmentedButton .LemonSegmentedButton__option.LemonSegmentedButton__option--selected{z-index:2}.LemonSegmentedButton .LemonSegmentedButton__option.LemonSegmentedButton__option--selected .LemonButton{--lemon-button-icon-opacity:1}.LemonSegmentedButton .LemonSegmentedButton__option--disabled>div{width:100%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonSkeleton/LemonSkeleton.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonSkeleton{animation:LemonSkeleton__shimmer 2s ease infinite;background:linear-gradient(90deg,hsla(0,0%,75%,.2) 25%,hsla(0,0%,51%,.24) 45%,hsla(0,0%,75%,.2) 65%);background-size:400% 100%}.LemonSkeleton.LemonSkeleton--static{animation:none}.LemonSkeleton>span{display:block;height:1px;overflow:hidden;white-space:nowrap;width:1px}@media(prefers-reduced-motion){.LemonSkeleton{animation:none}}@keyframes LemonSkeleton__shimmer{0%{background-position:100% 50%}to{background-position:0 50%}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonSwitch/LemonSwitch.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonSwitch{--lemon-switch-height:1.125rem;--lemon-switch-width:calc(var(--lemon-switch-height)*1.83333);align-items:center;display:flex;font-weight:500;gap:.5rem;line-height:1.5rem;width:-moz-fit-content;width:fit-content}.LemonSwitch label[for]{cursor:pointer}.LemonSwitch label{cursor:inherit;flex:1}.LemonSwitch.LemonSwitch--full-width{padding-left:.5rem;padding-right:.5rem;width:100%}.LemonSwitch.LemonSwitch--bordered{background:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);line-height:1.4;min-height:calc(2.125rem + 3px);padding:0 .75rem}.LemonSwitch.LemonSwitch--bordered.LemonSwitch--small{gap:.5rem;min-height:calc(1.875rem + 3px);padding:0 .5rem}.LemonSwitch>.LemonIcon{color:var(--muted-alt);font-size:1.5rem}.LemonSwitch.LemonSwitch--disabled{cursor:not-allowed;opacity:var(--opacity-disabled)}.LemonSwitch.LemonSwitch--disabled label[for]{cursor:not-allowed}.LemonSwitch__button{background:none;border:none;cursor:pointer;display:inline-block;flex-shrink:0;height:var(--lemon-switch-height);padding:0;position:relative;width:var(--lemon-switch-width)}.LemonSwitch--disabled .LemonSwitch__button{cursor:not-allowed}.LemonSwitch__slider{background-color:var(--border-bold);border-radius:var(--lemon-switch-height);display:inline-block;height:100%;left:0;pointer-events:none;position:absolute;top:0;transition:background-color .1s ease;width:100%}.LemonSwitch--checked .LemonSwitch__slider{background-color:var(--primary-3000)}.LemonSwitch__handle{--lemon-switch-handle-ratio:0.75;--lemon-switch-handle-gutter:calc(var(--lemon-switch-height)*(1 - var(--lemon-switch-handle-ratio))/2);--lemon-switch-handle-width:calc(var(--lemon-switch-height)*var(--lemon-switch-handle-ratio));--lemon-switch-active-translate:translateX(calc(var(--lemon-switch-width) - var(--lemon-switch-handle-width) - var(--lemon-switch-handle-gutter)*2));align-items:center;background-color:#fff;border:none;border-radius:.625rem;cursor:inherit;display:flex;height:calc(var(--lemon-switch-height)*var(--lemon-switch-handle-ratio));justify-content:center;left:var(--lemon-switch-handle-gutter);pointer-events:none;position:absolute;top:var(--lemon-switch-handle-gutter);transition:background-color .1s ease,transform .1s ease,width .1s ease,border-color .1s ease;width:var(--lemon-switch-handle-width)}.LemonSwitch--checked .LemonSwitch__handle{background-color:#fff;border-color:var(--primary-3000);transform:var(--lemon-switch-active-translate)}.LemonSwitch--active .LemonSwitch__handle{--lemon-switch-handle-width:calc(var(--lemon-switch-height)*var(--lemon-switch-handle-ratio)*1.2);transform:none}.LemonSwitch--active.LemonSwitch--checked .LemonSwitch__handle{transform:var(--lemon-switch-active-translate)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonTable/LemonTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonTable{--row-base-height:auto;--row-horizontal-padding:1rem;--lemon-table-background-color:var(--bg-table);background:var(--lemon-table-background-color);border:1px solid var(--border);border-radius:var(--radius);flex:1;font-size:13px;overflow:hidden;position:relative;width:100%}.Insight .LemonTable,.InsightCard__viz .LemonTable,.WebAnalyticsDashboard .LemonTable{--lemon-table-background-color:var(--bg-light)}.WebAnalyticsDashboard .LemonTable,.WebAnalyticsModal .LemonTable{border:none}.LemonTable.LemonTable--with-ribbon{--row-ribbon-width:0.25rem}.LemonTable.LemonTable--with-ribbon .LemonTable__content>table>tbody>tr>:first-child{position:relative}.LemonTable.LemonTable--with-ribbon .LemonTable__content>table>tbody>tr>:first-child:after{background:var(--row-ribbon-color);content:"";height:100%;left:0;position:absolute;top:0;width:var(--row-ribbon-width)}.LemonTable--xs .LemonTable__content>table>tbody>tr>td{padding-bottom:.25rem;padding-top:.25rem}.LemonTable--embedded{background:none;border:none;border-radius:0}.LemonTable--stealth{background:none}.LemonTable--stealth .LemonTable__content>table>thead{background:none;border-bottom:none}.LemonTable--stealth .LemonTable__content>table>tbody>tr:not(:first-child),.LemonTable--stealth .LemonTable__content>table>thead>tr:not(:first-child){border-top:none}.LemonTable--lowercase-header .LemonTable__content>table>thead{letter-spacing:normal;text-transform:none}.LemonTable.LemonTable--inset{--row-horizontal-padding:0.5rem}.LemonTable .PaginationControl{border-top:1px solid var(--border);height:var(--row-base-height);padding:.5rem}.LemonTable a.Link{color:var(--text-3000)}.LemonTable a.Link:not(:disabled):hover{color:var(--primary-3000-hover)}.LemonTable__content>table{border-collapse:collapse;border-spacing:0;width:100%}.LemonTable__content>table>thead{background:var(--lemon-table-background-color);font-size:.75rem;letter-spacing:.03125rem;position:relative;text-transform:uppercase}.LemonTable__content>table>thead>tr>th{box-shadow:inset 0 -1px var(--border);font-weight:700;padding-bottom:.5rem;padding-top:.5rem;text-align:left}.LemonTable__content>table>thead>tr>th .LemonButton{margin:-.5rem 0}.LemonTable__content>table>thead>tr.LemonTable__row--grouping{--row-base-height:2.5rem}.LemonTable__content>table>tbody>tr:not(:first-child){border-top:1px solid var(--border)}.LemonTable__content>table>tbody>tr.LemonTable__expansion{background:var(--bg-3000);position:relative}.LemonTable__content>table>tbody>tr.LemonTable__expansion>td{padding:0!important}.LemonTable__content>table>tbody>tr.LemonTable__row--status-highlighted{color:var(--text-3000);font-weight:600}.LemonTable__content>table>tbody>tr.LemonTable__row--status-highlighted>td:not(.LemonTable__cell--sticky){background:var(--primary-highlight)}.LemonTable__content>table>tbody>tr:not(.LemonTable__expansion)>td .LemonButton{margin-bottom:-.25rem;margin-top:-.25rem}.LemonTable__content>table>tbody>tr>td{color:var(--text-secondary-3000);padding-bottom:.3125rem;padding-top:.3125rem}.LemonTable__content>table>tbody>tr>td .CodeSnippet__actions>.LemonButton,.LemonTable__content>table>tbody>tr>td .LemonButtonWithSideAction__side-button>.LemonButton{margin-bottom:0;margin-top:0}.LemonTable__content>table>tbody>tr,.LemonTable__content>table>thead>tr{height:var(--row-base-height)}.LemonTable__content>table>tbody>tr>td,.LemonTable__content>table>tbody>tr>th,.LemonTable__content>table>thead>tr>td,.LemonTable__content>table>thead>tr>th{overflow:hidden;padding-right:var(--row-horizontal-padding);text-overflow:ellipsis}.LemonTable__content>table>tbody>tr>td:first-child,.LemonTable__content>table>tbody>tr>th:first-child,.LemonTable__content>table>thead>tr>td:first-child,.LemonTable__content>table>thead>tr>th:first-child{padding-left:calc(var(--row-horizontal-padding) + var(--row-ribbon-width, 0px))}.LemonTable__content>table>tbody>tr>td.LemonTable__boundary:not(:first-child),.LemonTable__content>table>tbody>tr>th.LemonTable__boundary:not(:first-child),.LemonTable__content>table>thead>tr>td.LemonTable__boundary:not(:first-child),.LemonTable__content>table>thead>tr>th.LemonTable__boundary:not(:first-child){padding-left:var(--row-horizontal-padding)}.LemonTable__content>table>tbody>tr>td.LemonTable__boundary:not(:first-of-type),.LemonTable__content>table>tbody>tr>th.LemonTable__boundary:not(:first-of-type),.LemonTable__content>table>thead>tr>td.LemonTable__boundary:not(:first-of-type),.LemonTable__content>table>thead>tr>th.LemonTable__boundary:not(:first-of-type){border-left:1px solid var(--border)}.LemonTable__content>table>tbody>tr>td.LemonTable__toggle,.LemonTable__content>table>tbody>tr>th.LemonTable__toggle,.LemonTable__content>table>thead>tr>td.LemonTable__toggle,.LemonTable__content>table>thead>tr>th.LemonTable__toggle{padding-right:0}.LemonTable__content>table>tbody>tr>td.LemonTable__toggle+*,.LemonTable__content>table>tbody>tr>th.LemonTable__toggle+*,.LemonTable__content>table>thead>tr>td.LemonTable__toggle+*,.LemonTable__content>table>thead>tr>th.LemonTable__toggle+*{border-left:none!important}.LemonTable__content>table>tbody>tr>td[colspan="0"],.LemonTable__content>table>tbody>tr>th[colspan="0"],.LemonTable__content>table>thead>tr>td[colspan="0"],.LemonTable__content>table>thead>tr>th[colspan="0"]{padding-left:0!important;padding-right:0!important}.LemonTable__empty-state{color:var(--muted-alt)}.LemonTable__overlay{background:var(--lemon-table-background-color);height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:2}.LemonTable--loading .LemonTable__overlay{opacity:.5;pointer-events:auto}.LemonTable__header{cursor:default}.LemonTable__header .LemonTable__header-content{color:var(--text-secondary-3000)}.LemonTable__header.LemonTable__header--actionable{cursor:pointer}.LemonTable__header.LemonTable__header--actionable:hover:not(:has(.LemonTable__header--no-hover:hover)) .LemonTable__header-content{color:var(--text-3000)}.LemonTable__header.LemonTable__header--actionable:active .LemonTable__header-content{color:var(--text-3000)}.LemonTable__header-content{align-items:center;display:flex;justify-content:space-between;line-height:1.5}.LemonTable__header-content div{white-space:nowrap}.LemonTable__footer{border-top:1px solid var(--border);cursor:default}.LemonTable__cell--sticky{background:var(--lemon-table-background-color)}.LemonTable__row--status-highlighted .LemonTable__cell--sticky:before{background:var(--primary-highlight)}.LemonTable__header--sticky{background:var(--lemon-table-background-color)}body:not(.storybook-test-runner) .LemonTable__cell--sticky,body:not(.storybook-test-runner) .LemonTable__header--sticky{left:0;overflow:visible!important;position:sticky!important;z-index:1}body:not(.storybook-test-runner) .LemonTable__cell--sticky:before,body:not(.storybook-test-runner) .LemonTable__header--sticky:before{box-shadow:-16px 0 16px 16px transparent;clip-path:inset(0 -16px 0 0);content:"";inset:0;position:absolute;transition:box-shadow .2s ease;z-index:-1}body:not(.storybook-test-runner) .ScrollableShadows--left .LemonTable__cell--sticky:before,body:not(.storybook-test-runner) .ScrollableShadows--left .LemonTable__header--sticky:before{box-shadow:-16px 0 16px 16px rgba(0,0,0,.25)}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonTable/LemonTableLoader.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonTableLoader{background:var(--primary-highlight);border:none!important;height:0;left:0;overflow:hidden;padding:.05rem!important;position:absolute;transition:height .2s ease,top .2s ease;width:100%;z-index:10}.LemonTableLoader:after{animation:LemonTableLoader__swooping 1.5s linear infinite;background:var(--primary-3000);content:"";height:100%;left:0;position:absolute;top:0;width:50%}.LemonTableLoader.LemonTableLoader--enter-active,.LemonTableLoader.LemonTableLoader--enter-done{height:.125rem}@keyframes LemonTableLoader__swooping{0%{left:0;transform:translateX(-100%);width:33.333%}50%{width:50%}to{left:100%;transform:translateX(100%);width:33.333%}}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonTabs/LemonTabs.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.LemonTabs{--lemon-tabs-gap:2rem;--lemon-tabs-margin-bottom:1rem;--lemon-tabs-content-padding:0.75rem 0;align-self:stretch;display:flex;flex-direction:column;position:relative}.LemonTabs--small{--lemon-tabs-gap:1rem;--lemon-tabs-margin-bottom:0.5rem;--lemon-tabs-content-padding:0.375rem 0}.Navigation3000__scene>.LemonTabs:first-child,.Navigation3000__scene>:first-child>.LemonTabs:first-child{margin-top:-.75rem}.LemonTabs__bar{align-items:stretch;display:flex;flex-direction:row;flex-shrink:0;gap:var(--lemon-tabs-gap);list-style:none;margin-bottom:var(--lemon-tabs-margin-bottom);overflow-x:auto;position:relative}.LemonTabs__bar:before{background:var(--border);bottom:0;content:"";height:1px;left:0;position:absolute;width:100%}.LemonTabs__bar:after{background:var(--link);bottom:0;content:"";height:.125rem;left:0;position:absolute;transform:translateX(var(--lemon-tabs-slider-offset));width:var(--lemon-tabs-slider-width)}.LemonTabs--transitioning .LemonTabs__bar:after{transition:width .15s ease,transform .15s ease}.LemonTabs--transitioning .LemonTabs__bar .LemonTabs__tab{transition:color .15s ease}.LemonTabs__bar .LemonTabs__tab:hover{color:var(--link)}.LemonTabs__bar .LemonTabs__tab:active{color:var(--primary-3000-active)}.LemonTabs__bar .LemonTabs__tab.LemonTabs__tab--active{color:var(--link);text-shadow:0 0 .25px currentColor}.LemonTabs__bar .LemonTabs__tab a{color:inherit;-webkit-text-decoration:none;text-decoration:none;transition:none}.LemonTabs__bar .LemonTabs__tab .LemonTabs__tab-content{align-items:center;cursor:pointer;display:flex;padding:var(--lemon-tabs-content-padding);white-space:nowrap}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonTag/LemonTag.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonTag{align-items:center;background:var(--border);border-radius:var(--radius-sm);color:var(--text-3000);display:inline-flex;font-size:.75rem;font-weight:var(--font-medium);gap:.125rem;line-height:1rem;padding:.125rem .25rem;white-space:nowrap}.LemonTag.LemonTag--normal{font-weight:400}.LemonTag:not(.LemonTag--breakdown){background:none;border-radius:var(--radius-sm);border-style:solid;border-width:1px;font-size:.6875rem;padding:.075rem .25rem}.LemonTag.LemonTag--primary{background:none;border-color:var(--primary-3000);color:var(--primary-3000)}.LemonTag.LemonTag--option{background-color:var(--accent-3000);color:var(--primary-3000)}.LemonTag.LemonTag--highlight{background:none;border-color:var(--highlight);color:var(--highlight)}.LemonTag.LemonTag--warning{background-color:none;border-color:var(--warning);color:var(--warning)}.LemonTag.LemonTag--danger{background:none;border-color:var(--danger);color:var(--danger)}.LemonTag.LemonTag--success{background:none;border-color:var(--success);color:var(--success)}.LemonTag.LemonTag--completion{background:none;border-color:var(--purple);color:var(--purple)}.LemonTag.LemonTag--caution{background:none;border-color:var(--danger-lighter);color:var(--danger-lighter)}.LemonTag.LemonTag--muted{background-color:var(--accent-3000);color:var(--muted)}.LemonTag.LemonTag--none{background:none}.LemonTag.LemonTag--breakdown{background-color:var(--primary-highlight);border-radius:40px;color:var(--primary-alt);font-size:14px;font-weight:400;line-height:16px;padding:8px 12px;vertical-align:bottom}.LemonTag.LemonTag--size-small{font-size:.625rem;line-height:.875rem;padding:0 .1875rem}.LemonTag .LemonTag__icon{display:flex;font-size:.875rem;margin-right:.125rem}.LemonTag .LemonTag__right-button{margin-left:.25rem;min-height:1.5rem!important;padding:.125rem!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonTextArea/LemonTextArea.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonTextArea{background:none;background-color:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-3000);cursor:text;display:block;font-size:.875rem;line-height:1.25rem;min-height:2.5rem;outline:none;padding:.5rem;text-align:left;text-overflow:ellipsis;width:100%}.LemonTextArea:focus:not(:disabled),.LemonTextArea:not(:disabled):hover{border:1px solid var(--border-bold)}.LemonTextArea:disabled{cursor:not-allowed;opacity:var(--opacity-disabled)}.Field--error .LemonTextArea{border:1px solid var(--danger)}.LemonTextArea--preview ul{list-style-position:inside;list-style-type:disc}.LemonTextArea--preview ol{list-style-position:inside;list-style-type:decimal}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LemonWidget/LemonWidget.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonWidget{background:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius)}.LemonWidget .LemonWidget__header{align-items:center;color:var(--muted-alt-3000,var(--primary));display:flex;font-size:.875rem;font-weight:500;justify-content:space-between;padding:.25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Lettermark/Lettermark.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Lettermark{align-items:center;background:var(--lettermark-bg,var(--lettermark-1-bg));border-radius:var(--radius-sm);color:var(--lettermark-text,var(--lettermark-1-text));display:inline-flex;flex-shrink:0;font-size:.75rem;font-weight:600;height:2em;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:2em}.Lettermark.Lettermark--rounded{border-radius:1.5rem}.Lettermark.Lettermark--outlined{background:none;border:1.5px dashed var(--lettermark-bg);color:var(--lettermark-bg)}.Lettermark.Lettermark--variant-gray{background:var(--border);color:var(--text-3000)}.Lettermark.Lettermark--xsmall{font-size:.5rem}.Lettermark.Lettermark--xlarge{border-radius:var(--radius);font-size:2rem}.Lettermark.Lettermark--variant-1{--lettermark-text:var(--lettermark-1-text);--lettermark-bg:var(--lettermark-1-bg)}.Lettermark.Lettermark--variant-2{--lettermark-text:var(--lettermark-2-text);--lettermark-bg:var(--lettermark-2-bg)}.Lettermark.Lettermark--variant-3{--lettermark-text:var(--lettermark-3-text);--lettermark-bg:var(--lettermark-3-bg)}.Lettermark.Lettermark--variant-4{--lettermark-text:var(--lettermark-4-text);--lettermark-bg:var(--lettermark-4-bg)}.Lettermark.Lettermark--variant-5{--lettermark-text:var(--lettermark-5-text);--lettermark-bg:var(--lettermark-5-bg)}.Lettermark.Lettermark--variant-6{--lettermark-text:var(--lettermark-6-text);--lettermark-bg:var(--lettermark-6-bg)}.Lettermark.Lettermark--variant-7{--lettermark-text:var(--lettermark-7-text);--lettermark-bg:var(--lettermark-7-bg)}.Lettermark.Lettermark--variant-8{--lettermark-text:var(--lettermark-8-text);--lettermark-bg:var(--lettermark-8-bg)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Link/Link.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Link{background:none;border:none;color:var(--link);cursor:pointer;line-height:inherit;padding:0;text-align:left;transition:none}.Link:not(:disabled):hover{color:var(--primary-3000-hover)}.Link:not(:disabled):active{color:var(--primary-3000-active)}.Link:disabled{cursor:not-allowed;opacity:var(--opacity-disabled)}.Link>.LemonIcon:last-child{margin-left:.15em}.Link--subtle{color:var(--text-3000)}.Link--subtle:not(:disabled):hover{color:var(--primary-3000-hover)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/LoadingBar/LoadingBar.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".progress-outer{align-items:center;display:flex}.progress{background:#eee;border-radius:var(--radius-sm);height:10px;min-height:1px;overflow:hidden;position:relative;width:100%}.progress-bar{background:var(--primary-3000-active);height:100%;left:0;position:absolute}.storybook-test-runner .progress-bar{width:50%!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/PaginationControl/PaginationControl.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PaginationControl{align-items:center;align-self:flex-end;display:flex;justify-content:flex-end}.PaginationControl>span{margin-right:.5rem}.PaginationControl--bordered{border:1px solid var(--border);border-radius:var(--radius);padding:.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Popover/Popover.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Popover{display:flex;flex-direction:row;perspective:80rem;perspective-origin:top;z-index:var(--z-popover)}.Popover h5{margin:.25rem .5rem}.Popover p:last-child{margin-bottom:0}.Popover[data-floating-placement^=top]{perspective-origin:bottom}.Popover.Popover--top-centered{left:50%;top:1rem;transform:translate(-50%)}.Popover__box{background:var(--bg-light);border:1px solid var(--secondary-3000-button-border);border-radius:var(--radius);box-shadow:var(--shadow-elevation-3000);flex-grow:1;max-width:100%;opacity:0;overflow:visible;position:relative;transform-origin:top;transition:opacity 50ms ease,transform 50ms ease}.Popover[data-placement^=bottom] .Popover__box{margin-top:.25rem;transform:rotateX(-6deg);transform-origin:top}.Popover[data-placement^=bottom].Popover--with-arrow .Popover__box{margin-top:.5rem}.Popover[data-placement^=top] .Popover__box{margin-bottom:.25rem;transform:rotateX(6deg);transform-origin:bottom}.Popover[data-placement^=top].Popover--with-arrow .Popover__box{margin-bottom:.5rem}.Popover[data-placement^=left] .Popover__box{margin-right:.25rem;transform:rotateY(-6deg);transform-origin:right}.Popover[data-placement^=left].Popover--with-arrow .Popover__box{margin-right:.5rem}.Popover[data-placement^=right] .Popover__box{margin-left:.25rem;transform:rotateY(6deg);transform-origin:left}.Popover[data-placement^=right].Popover--with-arrow .Popover__box{margin-left:.5rem}.Popover.Popover--enter-active .Popover__box,.Popover.Popover--enter-done .Popover__box{opacity:1;transform:none}.Popover--max-content-width .Popover__box{width:-moz-max-content;width:max-content}.Popover__arrow{background:var(--bg-light);height:.5rem;position:absolute;transform:rotate(45deg);width:.5rem}[data-placement^=bottom] .Popover__arrow{border-left:1px solid var(--border);border-top:1px solid var(--border);top:-.3125rem}[data-placement^=top] .Popover__arrow{border-bottom:1px solid var(--border);border-right:1px solid var(--border);bottom:-.3125rem}[data-placement^=left] .Popover__arrow{border-right:1px solid var(--border);border-top:1px solid var(--border);right:-.3125rem}[data-placement^=right] .Popover__arrow{border-bottom:1px solid var(--border);border-left:1px solid var(--border);left:-.3125rem}.Popover__content{border-radius:calc(var(--radius) - 1px);max-height:100%}.Popover--padded .Popover__content>.ScrollableShadows__inner{padding:.25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/ProfilePicture/ProfilePicture.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".profile-package{align-items:center;display:inline-flex}.profile-name,.profile-package:not(:first-child){margin-left:.375rem}.profile-name{font-weight:500}.ProfilePicture{align-items:center;border-radius:50%;display:inline-flex;flex-shrink:0;font-weight:600;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ProfilePicture.xxl{font-size:20px;height:48px;line-height:48px;width:48px}.ProfilePicture.xl{font-size:20px;height:40px;line-height:40px;width:40px}.ProfilePicture.lg{font-size:18px;height:32px;line-height:32px;width:32px}.ProfilePicture.md{font-size:14px;height:24px;line-height:24px;width:24px}.ProfilePicture.sm{font-size:12px;height:18px;line-height:18px;width:18px}.ProfilePicture.xs{font-size:11px;height:16px;line-height:16px;width:16px}.ProfilePicture .Lettermark{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.ProfileBubbles{align-items:center;display:flex}.ProfileBubbles>*{outline:.125rem solid var(--bg-light)}.ProfileBubbles>:not(:first-child){margin-left:-.125rem}.ProfileBubbles__more{align-items:center;background:var(--primary-3000);border-radius:50%;color:#fff;display:flex;font-size:.625rem;font-weight:600;height:1.5rem;justify-content:center;letter-spacing:-.05em;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:1.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Spinner/Spinner.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.Spinner{--spinner-color:var(--primary-3000);display:inline-block;flex-shrink:0;height:1em;vertical-align:-.15em;width:1em}.Spinner.Spinner--textColored{--spinner-color:currentColor}.Spinner__layer,.Spinner__layer>circle{transform-origin:center}.Spinner__layer>circle{display:block;fill:transparent;stroke:var(--spinner-color);stroke-linecap:round;stroke-width:8px}.Spinner__layer:first-child{opacity:.333}.Spinner__layer:nth-child(2){animation:spin 1s linear infinite}.Spinner__layer:nth-child(2)>circle{animation:Spinner__writhe 1.5s ease infinite both}@keyframes Spinner__writhe{0%,to{stroke-dasharray:70;stroke-dashoffset:-60}50%{stroke-dasharray:70;stroke-dashoffset:-30}}.SpinnerOverlay{align-items:center;display:flex;inset:0;justify-content:center;min-height:min(100%,6rem);position:absolute;text-align:center;transition:opacity .2s ease;z-index:var(--z-content-overlay)}.SpinnerOverlay[aria-hidden=true]{opacity:0;pointer-events:none}.SpinnerOverlay:before{background:var(--bg-light);content:"";inset:0;opacity:.5;position:absolute}.SpinnerOverlay .Spinner{position:relative}.SpinnerOverlay.SpinnerOverlay--scene-level:before{background:var(--bg-3000)}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Splotch/Splotch.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Splotch{height:1.5rem;padding:.25rem;width:1.5rem}.Splotch__paint{border-radius:var(--radius);height:1rem;width:1rem}.Splotch--blue .Splotch__paint{background:var(--blue)}.Splotch--purple .Splotch__paint{background:var(--purple)}.Splotch--green .Splotch__paint{background:var(--green)}.Splotch--black .Splotch__paint{background:var(--black)}.Splotch--white .Splotch__paint{background:#fff;border:1px solid var(--border)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Tooltip/Tooltip.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Tooltip{box-shadow:var(--modal-shadow-elevation);z-index:var(--z-tooltip)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/icons/icons.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonIcon{display:inline-block;vertical-align:-.15em;width:1em}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/monaco/CodeEditor.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{display:block!important}.editor-wrapper .monaco-editor,.editor-wrapper .overflow-guard{border-radius:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{text-align:right;width:100%}.CodeEditorInline .monaco-editor,.CodeEditorResizeable .monaco-editor{--vscode-textLink-foreground:transparent;--vscode-focusBorder:transparent;border-radius:var(--radius)}.CodeEditorInline .monaco-editor .overflow-guard,.CodeEditorResizeable .monaco-editor .overflow-guard{border-radius:var(--radius)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataTable/ColumnConfigurator/ColumnConfigurator.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ColumnConfiguratorModal .Columns{background-color:var(--bg-3000);border-radius:var(--radius);-moz-column-gap:1rem;column-gap:1rem;display:flex;padding:.5rem;width:700px}@media(max-width:960px){.ColumnConfiguratorModal .Columns{display:block;width:auto}}.ColumnConfiguratorModal .HalfColumn{width:50%}@media(max-width:960px){.ColumnConfiguratorModal .HalfColumn{width:100%}}.ColumnConfiguratorModal .SelectedColumn{align-items:center;background-color:var(--primary-highlight);border-radius:var(--radius);display:flex;justify-content:flex-start;margin:calc(var(--radius)/2) 0;overflow:hidden;padding:0 .5rem}.ColumnConfiguratorModal .selected-column-col{display:flex;flex-direction:column}.ColumnConfiguratorModal .drag-handle{color:var(--text-3000);cursor:move;font-size:1.2em;padding-right:.25rem}.ColumnConfiguratorModal .drag-handle svg{transform:rotate(90deg)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataTable/DataTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DataTable td{max-width:20rem}.DataTable .DataTable__row--highlight_once{animation:DataTable__highlight 2s ease-out}.DataTable .DataTable__row--category_row{background-color:var(--bg-3000);color:var(--muted);font-size:.75rem;font-weight:600;height:2rem;text-align:center}@keyframes DataTable__highlight{0%{background-color:var(--mark)}to{background-color:initial}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataVisualization/Components/Chart.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DataVisualization{--viz-min-height:calc(80vh - 6rem)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataVisualization/Components/Charts/LineGraph.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DataVisualization__LineGraph{min-height:var(--viz-min-height)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataVisualization/Components/ConditionalFormatting/ConditionalFormattingTab.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ConditionalFormattingTab__ColorPicker .LemonButton__chrome{gap:0;padding-left:6px!important}.ConditionalFormattingTab .LemonCollapsePanel__header{padding-left:0!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataVisualization/Components/SideBar.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DataVisualization .LemonTabs .LemonTabs__bar{margin-bottom:0}.DataVisualization .SideBar{border-radius:var(--radius);max-width:18rem;min-height:var(--viz-min-height);min-width:18rem}.DataVisualization .SideBar .LemonInput.LemonInput--medium{display:flex}.DataVisualization .SideBar .LemonInput.LemonInput--medium .LemonInput__input{flex:1;width:0}.DataVisualization .SideBar .grow-2{flex-grow:2}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/DataVisualization/Components/Variables/Variables.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DataVizVariable_Button .LemonButton__chrome{justify-content:flex-end!important}.DataVizVariable_Popover .ScrollableShadows__inner{padding:0!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/InsightViz/EditorFilterGroup.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".EditorFilterGroup .EditorFilterGroup__title{display:none}.EditorFilterGroup .EditorFilterGroup__content>*+*{margin-top:1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/InsightViz/EditorFilters.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".EditorFiltersWrapper{--editor-panel-group-min-width:24rem;background:var(--bg-light);flex-shrink:0}.EditorFiltersWrapper:not(.EditorFiltersWrapper--embedded){border:1px solid var(--border);border-radius:var(--radius);padding:1rem}.EditorFiltersWrapper .EditorFilters{display:flex;flex-flow:row wrap;gap:1rem}.EditorFiltersWrapper .EditorFilters .EditorFilterGroup{flex:1;max-width:100%;min-width:var(--editor-panel-group-min-width)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/InsightViz/InsightViz.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".InsightViz{container-type:inline-size;display:flex;flex:1;flex-direction:column;gap:1rem;overflow:hidden}.InsightViz.InsightViz--horizontal{align-items:start;flex-flow:row wrap}.InsightViz.InsightViz--horizontal .EditorFiltersWrapper{width:100%}@container (min-width: 768px){.InsightViz.InsightViz--horizontal .EditorFiltersWrapper{max-width:30rem;min-width:26rem;width:30%}}.InsightVizDisplay{--insight-viz-min-height:min(calc(80vh - 6rem),32rem);display:flex;flex:1;flex-direction:column;min-height:0}.ErrorTracking__breakdowns .InsightVizDisplay,.ExportedInsight .InsightVizDisplay,.InsightCard .InsightVizDisplay,.NotebookNode .InsightVizDisplay,.WebAnalyticsDashboard .InsightVizDisplay{flex:1;height:100%}.ErrorTracking__breakdowns .InsightVizDisplay .LineGraph,.ExportedInsight .InsightVizDisplay .LineGraph,.InsightCard .InsightVizDisplay .LineGraph,.NotebookNode .InsightVizDisplay .LineGraph,.WebAnalyticsDashboard .InsightVizDisplay .LineGraph{padding:.5rem}.InsightVizDisplay .InsightVizDisplay__content{display:flex;flex:1;flex-direction:column;height:100%;position:relative}.InsightVizDisplay .InsightVizDisplay__content--with-legend{flex-direction:row}.InsightVizDisplay .InsightVizDisplay__content .InsightVizDisplay__content__left{display:flex;flex:1;flex-direction:column;position:relative;width:100%}.InsightVizDisplay .InsightVizDisplay__content .InsightVizDisplay__content__right{align-items:center;display:flex;flex-shrink:1;margin:1rem;max-height:var(--insight-viz-min-height);max-width:45%;width:-moz-fit-content;width:fit-content}.InsightVizDisplay .InsightDisplayConfig{border-bottom-width:1px;padding:.5rem}.WebAnalyticsDashboard .InsightVizDisplay{--insight-viz-min-height:25rem}.RetentionContainer{display:flex;flex:1;flex-direction:column;width:100%}.RetentionContainer .RetentionContainer__graph{flex:1;margin:.5rem}.RetentionContainer .RetentionContainer__table{flex-shrink:0}.RetentionContainer .LineGraph{min-height:30vh;position:relative!important;width:100%!important}.ExportedInsight .RetentionContainer .LineGraph,.InsightCard .RetentionContainer .LineGraph,.NotebookNode .RetentionContainer .LineGraph,.WebAnalyticsDashboard .RetentionContainer .LineGraph{min-height:100px;position:relative}.TrendsInsight{display:flex;flex:1;flex-direction:column;margin:.5rem;min-height:var(--insight-viz-min-height);position:relative}.ExportedInsight .TrendsInsight,.InsightCard .TrendsInsight,.NotebookNode .TrendsInsight,.WebAnalyticsDashboard .TrendsInsight{min-height:auto}.TrendsInsight--ActionsTable,.TrendsInsight--BoldNumber,.TrendsInsight--WorldMap{margin:0;min-height:auto}.TrendsInsight--BoldNumber{align-items:center;display:flex;justify-content:center}.FunnelInsight{display:flex;flex:1;flex-direction:column;width:100%}.FunnelInsight--type-steps-vertical,.FunnelInsight--type-time_to_convert,.FunnelInsight--type-trends{min-height:var(--insight-viz-min-height)}.ExportedInsight .FunnelInsight--type-steps-vertical,.ExportedInsight .FunnelInsight--type-time_to_convert,.ExportedInsight .FunnelInsight--type-trends,.InsightCard .FunnelInsight--type-steps-vertical,.InsightCard .FunnelInsight--type-time_to_convert,.InsightCard .FunnelInsight--type-trends,.NotebookNode .FunnelInsight--type-steps-vertical,.NotebookNode .FunnelInsight--type-time_to_convert,.NotebookNode .FunnelInsight--type-trends,.WebAnalyticsDashboard .FunnelInsight--type-steps-vertical,.WebAnalyticsDashboard .FunnelInsight--type-time_to_convert,.WebAnalyticsDashboard .FunnelInsight--type-trends{min-height:auto}.funnel-significance-highlight{background:var(--primary);color:var(--bg-light);display:inline-flex}.funnel-significance-highlight .LemonIcon{color:var(--bg-light)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/InsightViz/PropertyGroupFilters/PropertyGroupFilters.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.PropertyGroupFilters .property-group{background-color:var(--bg-3000);border-radius:var(--radius);border-width:1px;padding:.5rem}.PropertyGroupFilters .property-group-and-or-separator{color:var(--primary-alt);font-size:12px;font-weight:600;padding:.5rem 0;position:relative}.PropertyGroupFilters .property-group-and-or-separator:before{background-color:var(--border-light);content:" ";height:100%;left:17px;position:absolute;top:0;width:2px}.PropertyGroupFilters .property-group-and-or-separator>span{background-color:var(--bg-light);display:inline-block;padding:.25rem;position:relative;text-align:center;width:35px;z-index:1}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/queries/nodes/InsightViz/ResultCustomizationsModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ResultCustomizationsModal__ColorGlyphButton .LemonButton__chrome{gap:4px;padding-left:6px!important;padding-right:6px!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/activity/explore/EventDetails.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".LemonTabs[data-attr=event-details] ul{padding:0 .75rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/authentication/Setup2FA.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Setup2FA__image{margin:0 auto;min-height:215px;min-width:215px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/billing/Billing.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".BillingPlan{flex-grow:1;max-width:500px}.BillingPlan .BillingPlan__description ol,.BillingPlan .BillingPlan__description ul{list-style:none;margin-top:1rem;padding-left:0;text-align:center}.BillingPlan .BillingPlan__description ol li,.BillingPlan .BillingPlan__description ul li{line-height:1.2rem;margin-bottom:1rem}.BillingPlan .BillingPlan__description ol .disclaimer,.BillingPlan .BillingPlan__description ul .disclaimer{font-size:10px;font-weight:700;padding-left:1px;vertical-align:top}.BillingPlan .BillingPlan__description .disclaimer-details{color:var(--muted);font-size:.75rem;margin-top:1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/billing/BillingGauge.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".BillingGaugeItem{animation:BillingGaugeItem__expand .8s cubic-bezier(.15,.15,.2,1) forwards}.BillingGaugeItem .BillingGaugeItem__info{background:var(--bg-light);border-left:1px solid var(--border);bottom:100%;font-size:.8rem;left:100%;line-height:1rem;margin-left:-1px;padding:0 .25rem .5rem;position:absolute;white-space:nowrap}.BillingGaugeItem .BillingGaugeItem__info--bottom{bottom:auto;padding:.5rem .25rem 0;top:100%}.BillingGaugeItem .BillingGaugeItem__info:hover{z-index:100}.BillingGaugeItem.BillingGaugeItem--billing_limit,.BillingGaugeItem.BillingGaugeItem--free_tier{background-color:var(--border-light-opaque)}.BillingGaugeItem.BillingGaugeItem--current_usage{background:var(--danger)}.BillingGaugeItem.BillingGaugeItem--current_usage.BillingGaugeItem--within-usage-limit{background:var(--brand-blue)}.BillingGaugeItem.BillingGaugeItem--projected_usage{background:repeating-linear-gradient(-45deg,var(--danger-3000-button-border-dark),var(--danger-3000-button-border-dark) .5rem,var(--danger-3000-button-border-hover-dark) .5rem,var(--danger-3000-button-border-hover-dark) 1rem);opacity:.5}.BillingGaugeItem.BillingGaugeItem--projected_usage.BillingGaugeItem--within-usage-limit{background:repeating-linear-gradient(-45deg,var(--data-color-1),var(--data-color-1) .5rem,var(--data-color-1-hover) .5rem,var(--data-color-1-hover) 1rem)}@keyframes BillingGaugeItem__expand{0%{width:0}to{width:var(--billing-gauge-item-width)}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/billing/PlanComparison.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PlanComparisonModal{max-width:900px}table.PlanComparison{table-layout:fixed}table.PlanComparison td{padding:.75rem 1rem;vertical-align:top}table.PlanComparison td.PlanTable__td__upgradeButton{padding-bottom:1rem;padding-top:1rem}table.PlanComparison th{font-weight:600;padding:.75rem 1rem;text-align:left;vertical-align:top}table.PlanComparison th.PlanTable__th__section{font-weight:500;padding:.25rem 1rem}table.PlanComparison th.PlanTable__th__feature{font-weight:600;padding:.75rem 1rem .75rem 3.25rem}table.PlanComparison th.PlanTable__th__feature.PlanTable__th__feature--reduced_padding{padding:.75rem 1rem}table.PlanComparison th.PlanTable__th__last-feature{padding-bottom:2rem}table.PlanComparison th p{font-weight:400}.PlanTable__tr__border{border-bottom:3px dotted rgba(0,0,0,.07)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/billing/UnsubscribeSurveyModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".UnsubscribeSurveyCostControl .LemonCollapsePanel__header{background:var(--bg-3000);padding:0!important}.UnsubscribeSurveyCostControl .LemonButton__chrome{padding:0!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/cohorts/CohortFilters/CohortCriteriaRowBuilder.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".CohortCriteriaRow{padding:0 .5rem}.CohortCriteriaRow .CohortCriteriaRow__Criteria{border:1px solid transparent;border-radius:var(--radius);padding:.25rem .5rem}.CohortCriteriaRow .CohortCriteriaRow__Criteria.CohortCriteriaRow__Criteria--error{border:1px solid var(--danger)}.CohortCriteriaRow .CohortCriteriaRow__Criteria .CohortCriteriaRow__Criteria__error-row{margin:.25rem 0}.CohortCriteriaRow .CohortCriteriaRow__Criteria .CohortCriteriaRow__Criteria__Field{margin:.25rem 0;min-width:0}.CohortCriteriaRow .CohortCriteriaRow__Criteria .CohortCriteriaRow__Criteria__Field.CohortCriteriaRow__Criteria__Field--error .CohortField{border:1px solid var(--danger)}.CohortCriteriaRow .CohortCriteriaRow__Criteria .CohortCriteriaRow__Criteria__Field:not(:last-child){margin-right:.5rem}.CohortCriteriaRow .logical-row-divider{color:var(--primary-alt);font-size:12px;font-weight:600;text-transform:uppercase}.CohortCriteriaRow .logical-row-divider:after,.CohortCriteriaRow .logical-row-divider:before{border-top:1px solid var(--border)}.CohortCriteriaRow .logical-row-divider:before{width:1.5%}.CohortCriteriaRow .logical-row-divider:after{width:95%}.CohortCriteriaRow .CohortCriteriaRow__inline-divider{background-color:var(--border);flex:1;height:1px;margin:0 .5rem}.CohortCriteriaRow .CohortCriteriaRow__Criteria__arrow{color:var(--muted);flex-shrink:0;font-size:18px;font-weight:700;padding-left:6px;padding-right:8px;position:relative;top:6px;-webkit-user-select:none;-moz-user-select:none;user-select:none}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/cohorts/CohortFilters/CohortField.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Popover__CohortField .Popover__box{max-height:30rem}.CohortField__dropdown{max-width:calc(100vw - 14rem);min-width:14rem}.CohortField__CohortTextField{font-weight:500}.CohortField__CohortNumberField{max-width:4rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/dashboard/DashboardItems.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".dashboard-items-wrapper{margin-top:1rem;width:100%}.react-grid-layout{margin-bottom:2rem;position:relative;transition:height .1s ease}.react-grid-layout.dashboard-view-mode .react-grid-item{transition:border-color .1s ease}.react-grid-item.cssTransforms{transition-property:transform}.react-grid-item.resizing{will-change:width,height;z-index:1}.react-grid-item.react-draggable .CardMeta,.react-grid-item.react-draggable .TextCard__body{cursor:move;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-grid-item.react-draggable-dragging{transition:none;will-change:transform;z-index:105}.react-grid-item.dropping{visibility:hidden}.react-grid-item.react-grid-placeholder{border:1px solid var(--primary-3000);border-radius:var(--radius);max-width:100%;outline:1px solid var(--primary-3000);position:relative;transition:.1s ease;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.react-resizable-hide>.react-resizable-handle{display:none}.react-grid-item{transition:all .1s ease;transition-property:left,top}.react-grid-item>.react-resizable-handle{bottom:-.5rem;cursor:se-resize;height:2rem;position:absolute;right:-.5rem;width:2rem;z-index:10}.react-grid-item>.react-resizable-handle.react-resizable-handle-se{cursor:se-resize}.react-grid-item>.react-resizable-handle.react-resizable-handle-e{bottom:2rem;cursor:ew-resize;height:auto;top:0}.react-grid-item>.react-resizable-handle.react-resizable-handle-s{cursor:ns-resize;left:0;right:2rem;width:auto}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/dashboard/DashboardTemplateChooser.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DashboardTemplateChooser{display:grid;gap:.5em .5em;grid-template-columns:repeat(3,1fr);max-width:780px}.DashboardTemplateChooser .TemplateItem{height:210px;width:240px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/dashboard/EmptyDashboardComponent.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.EmptyDashboard .EmptyDashboard__fade:after{background:linear-gradient(to top,var(--bg-light),transparent);bottom:0;content:"";height:3rem;pointer-events:none;position:absolute}.EmptyDashboard{margin-top:1rem;position:relative}.EmptyDashboard .EmptyDashboard__fade{height:150px;margin-top:1rem;overflow:hidden;position:relative}.EmptyDashboard .EmptyDashboard__fade:after{--bg-light:var(--bg-3000);height:150px;width:100%}.EmptyDashboard .EmptyDashboard__cta{background:var(--bg-light);border-radius:var(--radius);border-width:1px;box-shadow:var(--shadow-elevation-3000);left:50%;max-width:calc(100% - 32px);padding:1.5rem;position:absolute;top:16px;transform:translateX(-50%);width:360px;z-index:var(--z-content-overlay)}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/data-management/properties/PropertyDefinitionsTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-icon{padding-right:.5rem;width:36px}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-icon .definition-column-name-icon{align-items:center;display:flex;font-size:1.2rem;justify-content:center;width:30px}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-icon .definition-column-name-icon svg.taxonomy-icon{flex-shrink:0}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-icon .definition-column-name-icon svg.taxonomy-icon.taxonomy-icon-muted{color:var(--muted-alt)}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-icon .definition-column-name-icon svg.taxonomy-icon.taxonomy-icon-verified{color:var(--success)}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-name .definition-column-name-content{display:flex;flex-direction:column;justify-content:center;min-height:32px;position:relative}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-name .definition-column-name-content .definition-column-name-content-title{align-items:center;cursor:pointer;display:flex;font-weight:600;gap:.25rem}.event-properties-definition-table .LemonTable__content>table>tbody td.definition-column-name .definition-column-name-content .definition-column-name-content-title svg{color:var(--success)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/data-warehouse/ViewLinkModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".form-error{color:var(--danger)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/feature-flags/FeatureFlag.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".VariantFormList{border:1px solid var(--border);border-radius:var(--radius);font-size:13px;margin-top:16px;padding:16px}.VariantFormList .label-row{font-weight:700}.VariantFormList .VariantFormList__row{grid-template-columns:repeat(24,minmax(0,1fr))}.feature-flag-property-display{align-items:center;display:flex;flex-flow:row wrap;gap:.5rem;margin-top:.5rem}.feature-flag-property-display .arrow-right{margin-right:-8px;margin-top:.25rem}.feature-flag-property-display .display-value{word-break:break-all}.condition-set-separator{color:var(--primary-alt);font-size:12px;font-weight:var(--font-semibold);margin-bottom:.5rem;margin-left:.5rem}.feature-flag-form-row{align-items:center;display:flex;flex-wrap:wrap;width:100%}.feature-flag-form-row .centered{align-items:center;display:flex;white-space:pre-wrap}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/feature-flags/FeatureFlagInstructions.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".FeatureFlagInstructionsHeader{flex-wrap:nowrap}.FeatureFlagInstructionsHeader .FeatureFlagInstructionsHeader__header-title{display:flex;justify-items:center}.FeatureFlagInstructionsHeader .FeatureFlagInstructionsHeader__header-title .FeatureFlagInstructionsHeader__header-title__icon{color:var(--text-muted-alt);font-size:1.6em;margin-right:12px}.FeatureFlagInstructionsHeader__option{display:flex;justify-items:center}.FeatureFlagInstructionsHeader__option .FeatureFlagInstructionsHeader__option__icon{margin-right:8px;margin-top:2px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/funnels/Funnel.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".funnel-bin-filter-dropdown .funnel-bins-custom-picker{margin:5px 0 5px 13px;width:43px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/funnels/FunnelBarHorizontal/FunnelBarHorizontal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".FunnelBarHorizontal .funnel-step header .funnel-step-title{max-width:calc(100% - 8px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.FunnelBarHorizontal{min-height:100%;padding:1rem}.InsightCard .FunnelBarHorizontal{padding-left:1rem;padding-right:1rem}.FunnelBarHorizontal .funnel-step{padding-left:2rem;position:relative}.FunnelBarHorizontal .funnel-step:not(:first-child),.FunnelBarHorizontal .funnel-step:not(:first-child) .funnel-series-container{padding-top:.75rem}.FunnelBarHorizontal .funnel-step .graph-series-glyph{z-index:2}.FunnelBarHorizontal .funnel-step .funnel-conversion-metadata{align-items:center;display:flex;justify-content:space-between}.FunnelBarHorizontal .funnel-step .funnel-conversion-metadata .funnel-inspect-button{line-height:1.5rem}.FunnelBarHorizontal .funnel-step .funnel-conversion-metadata .funnel-inspect-button .value-inspector-button-icon{font-size:1.5rem;margin-right:.25rem;vertical-align:bottom}.FunnelBarHorizontal .funnel-step .funnel-series-container{align-items:center;display:flex;flex-direction:column;height:100%;left:0;position:absolute;top:0;width:1.5rem}.FunnelBarHorizontal .funnel-step .funnel-series-container .graph-series-glyph{-webkit-user-select:none;-moz-user-select:none;user-select:none}.FunnelBarHorizontal .funnel-step .funnel-series-container .funnel-series-linebox{border-right:2px solid var(--border);box-sizing:border-box;left:0;opacity:.5;position:absolute;width:calc(.75rem + 1px)}.FunnelBarHorizontal .funnel-step .funnel-series-container .funnel-series-linebox.before{height:11.5px;top:0}.FunnelBarHorizontal .funnel-step .funnel-series-container .funnel-series-linebox.after{bottom:0;height:calc(100% - 11.5px);top:11.5px}.FunnelBarHorizontal .funnel-step .funnel-step-metadata{display:flex;flex-wrap:wrap}.FunnelBarHorizontal .funnel-step footer,.FunnelBarHorizontal .funnel-step header{align-items:center;display:flex;line-height:23px}.FunnelBarHorizontal .funnel-step header{display:flex;flex-wrap:wrap;justify-content:space-between;position:relative}.FunnelBarHorizontal .funnel-step header .funnel-step-title{font-weight:700}.FunnelBarHorizontal .funnel-step header button{margin-left:.375rem}.FunnelBarHorizontal .funnel-bar-wrapper{background-color:var(--border-3000);border-radius:var(--radius);display:flex;flex-direction:row;height:32px;margin:4px 0}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar{background:var(--primary-3000);height:100%;position:relative;transition:width .2s ease,height .2s ease}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar.first{border-radius:var(--radius) 0 0 4px}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar.last{border-radius:0 4px 4px 0}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar.only{border-radius:var(--radius)}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar .funnel-bar-percentage{color:#fff;font-weight:700;line-height:16px;position:absolute;top:8px}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar .funnel-bar-percentage.inside{right:8px}.FunnelBarHorizontal .funnel-bar-wrapper .funnel-bar .funnel-bar-percentage.outside{color:var(--text-3000);left:calc(100% + 8px)}.storybook-test-runner .InsightCard .funnel-bar{display:none}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/funnels/FunnelBarVertical/FunnelBarVertical.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".FunnelBarVertical{flex:1;height:100%;overflow:hidden;position:relative;width:100%}.FunnelBarVertical table{--bar-width:0.5rem;--bar-row-height:18rem;--bar-padding-top:1rem;--bar-padding-bottom:1.5rem;height:100%;width:100%}.FunnelBarVertical table>tbody>tr:first-child{border-bottom:1px solid var(--border)}.FunnelBarVertical table>tbody>tr:first-child>td{padding-bottom:var(--bar-padding-bottom);padding-top:var(--bar-padding-top)}.FunnelBarVertical table>tbody>tr>td{padding:.75rem 0}.StepBars{align-items:flex-end;border-bottom:1px solid var(--border);display:flex;gap:.125rem;height:calc(var(--bar-row-height) - var(--bar-padding-top) - var(--bar-padding-bottom));padding:0 1rem;position:relative}.StepBars:not(.StepBars--first){border-left:1px dashed var(--border)}.StepBars__grid{align-items:stretch;bottom:0;display:flex;flex-direction:column;height:100%;left:0;position:absolute;width:100%}.StepBars__gridline{flex-grow:1}.StepBars__gridline.StepBars__gridline--horizontal{border-top:1px dashed var(--border)}.StepBar{--series-color:#000;--conversion-rate:100%;border-radius:var(--radius);flex-shrink:0;height:100%;position:relative;width:calc(var(--bar-width)/2)}.InsightCard .StepBar{width:calc(var(--bar-width)/2)!important}@media screen and (min-width:992px){.StepBar{width:var(--bar-width)}}.StepBar__backdrop,.StepBar__fill{border-radius:var(--radius);bottom:0;cursor:pointer;left:0;position:absolute;width:100%}.InsightCard .StepBar__backdrop,.InsightCard .StepBar__fill,.StepBar__unclickable .StepBar__backdrop,.StepBar__unclickable .StepBar__fill{cursor:default}.StepBar__backdrop{background:repeating-linear-gradient(-22.5deg,transparent,transparent .5rem,hsla(0,0%,100%,.5) .5rem,hsla(0,0%,100%,.5) 1rem),var(--series-color);height:100%;opacity:.125;transition:opacity .2s ease}.StepBar__backdrop:hover{opacity:.2}.StepBar__backdrop:active{opacity:.25}.StepBar__fill{background:var(--series-color);height:var(--conversion-rate);transition:filter .2s ease}.StepBar__fill:hover{filter:brightness(.9)}.StepBar__fill:active{filter:brightness(.85)}.StepBarLabels{align-items:flex-end;display:flex;flex-direction:column-reverse;height:calc(var(--bar-row-height) - var(--bar-padding-top) - var(--bar-padding-bottom))}.StepBarLabels__segment{flex-grow:1;padding:0 .5rem}.StepBarLabels__segment:first-child{flex-grow:0;height:0}.StepBarLabels__label{font-size:.75rem;font-weight:500;transform:translateY(-50%)}.StepLegend{border-left:1px solid var(--border);height:100%;white-space:nowrap}.StepLegend>.LemonRow{font-weight:500;margin-top:.25rem;min-height:1.5rem;padding:0 .5rem}.StepLegend>.LemonRow:first-child{font-weight:600;margin-top:0;width:-moz-fit-content;width:fit-content}.StepLegend .funnel-inspect-button{font-weight:inherit;line-height:1.5rem}.FunnelTooltip{width:20rem}.FunnelTooltip table{border-collapse:collapse;border-spacing:0;width:100%}.FunnelTooltip tr{height:1.75rem}.FunnelTooltip td:first-child{font-weight:500;padding:0 .5rem}.FunnelTooltip td:last-child{font-weight:600;padding-right:.5rem;text-align:right}.FunnelTooltip .table-subtext{padding-bottom:.25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/funnels/FunnelHistogram.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".FunnelHistogram{flex:1}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/EmptyStates/EmptyStates.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".insight-empty-state{align-items:center;color:var(--muted);display:flex;flex-direction:column;flex-grow:1;font-size:1.1em;justify-content:center;padding:1rem}.insight-empty-state.error h2{color:var(--danger)}.insight-empty-state.warning h2{color:var(--warning)}.insight-empty-state h2{color:var(--primary-alt);font-size:1.5rem;font-weight:600;line-height:1.6rem}.insight-empty-state .empty-state-inner{align-items:center;display:flex;flex-direction:column;max-width:600px}.insight-empty-state .empty-state-inner .illustration-main{font-size:2.5rem}.insight-empty-state .empty-state-inner h2{text-align:center;width:100%;word-wrap:break-word}.insight-empty-state .empty-state-inner ol{margin:.5rem 0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/InsightTooltip/InsightTooltip.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".InsightTooltipWrapper{pointer-events:none;position:absolute;transition:all .4s;z-index:var(--z-graph-tooltip)}.InsightTooltip{background:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-elevation-3000);font-size:.8125rem;max-width:30rem;overflow:hidden;pointer-events:none}.InsightTooltip--embedded{border:none;border-radius:0;box-shadow:none}.InsightTooltip .LemonRow{font-size:.8125rem}.InsightTooltip .LemonTable{border:none;border-bottom-left-radius:0;border-bottom-right-radius:0;font-size:.75rem}.InsightTooltip .LemonTable:not(:last-child){border-bottom:1px solid var(--border)}.InsightTooltip .LemonTable .insights-label{margin:0}.InsightTooltip .LemonTable .datum-column{overflow-wrap:anywhere;padding-left:.5rem}.InsightTooltip .LemonTable .LemonTable__content>table>thead{letter-spacing:0}.InsightTooltip .LemonTable .LemonTable__content>table>thead .datum-column .LemonTable__header-content{white-space:nowrap}.InsightTooltip .LemonTable .LemonTable__content>table .datum-label-column{align-items:center;display:flex;font-weight:600}.InsightTooltip .LemonTable .LemonTable__content>table .series-data-cell{font-weight:600}.InsightTooltip .LemonTable .LemonTable__content>table .tag-pill{background-color:var(--border-3000);border:0;color:var(--primary-alt);margin-right:0;overflow:hidden;vertical-align:middle}.InsightTooltip .table-subtext{background-color:var(--bg-light);color:var(--muted);font-size:.75rem;padding:.5rem 1rem;text-align:center}.InsightTooltip .table-subtext .table-subtext-truncated{margin-bottom:4px}.InsightTooltip .table-subtext .table-subtext-click-to-inspect{align-items:center;color:var(--text-3000);display:flex;font-weight:600;justify-content:center;white-space:nowrap}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/filters/ActionFilter/ActionFilter.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ActionFilter ul>li+li,.ActionFilter>*+*{margin-top:.5rem}.ActionFilter .ActionFilterRow-filters{padding:.5rem 0}.ActionFilter.ActionFilter--bordered{border:1px solid var(--border);border-radius:var(--radius)}.ActionFilter.ActionFilter--bordered .ActionFilterRow{margin-top:0}.ActionFilter.ActionFilter--bordered .ActionFilterRow .ActionFilterRow-content{border-bottom:1px solid var(--border);margin-bottom:0;padding:1rem}.ActionFilter.ActionFilter--bordered .ActionFilter-footer{margin-top:0;padding:.5rem}.ActionFilter.ActionFilter--bordered .ActionFilterRow-filters{background-color:var(--bg-3000);border-bottom:1px solid var(--border);padding:.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/filters/ActionFilter/ActionFilterRow/ActionFilterRow.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ActionFilterRow .ActionFilterRow-content{align-items:flex-start;display:flex}.ActionFilterRow .ActionFilterRow-content>*+*{margin-left:.5rem}.ActionFilterRow .ActionFilterRow__center,.ActionFilterRow .ActionFilterRow__end,.ActionFilterRow .ActionFilterRow__start{align-items:center;display:flex}.ActionFilterRow .ActionFilterRow__end,.ActionFilterRow .ActionFilterRow__start{align-items:center;display:flex;flex:0;gap:.25rem;height:40px}.ActionFilterRow .ActionFilterRow__center{flex:1;flex-wrap:wrap;gap:.5rem;overflow:hidden}.ActionFilterRowDragHandle{color:var(--text-3000);cursor:move;font-size:1.2em;transform:rotate(90deg)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/filters/BreakdownFilter/BreakdownTagMenu.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".histogram-bin-input{background-color:var(--bg-light);margin:0 .5rem;padding:.25rem;width:60px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/BoldNumber/BoldNumber.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".BoldNumber{align-items:center;display:flex;flex:1;flex-direction:column;justify-content:center;padding:2rem 3rem 3rem;width:100%}.InsightCard .BoldNumber{padding:1rem}.BoldNumber.HogQL{padding:5rem}.BoldNumber .BoldNumber__value{font-weight:700;letter-spacing:-.025em;width:100%}@media screen and (min-width:768px){.BoldNumber{padding:3rem 5rem 5rem}.InsightCard .BoldNumber{padding:2rem}}.BoldNumber__comparison{color:var(--muted-alt);cursor:default;font-weight:500;margin-bottom:-1.5rem;margin-top:.5rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/Funnels/CorrelationMatrix.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".correlation-table-wrapper table{border:1px solid var(--border);border-collapse:initial;border-radius:var(--radius);border-spacing:0;margin:0 auto}.correlation-table-wrapper table td{border-left:1px solid var(--border);border-top:1px solid var(--border);padding:.5rem 1rem;text-align:center}.correlation-table-wrapper table td .percentage{font-weight:700;padding-bottom:.25rem}.correlation-table-wrapper table td:first-child{border-left:none}.correlation-table-wrapper table .table-title{color:var(--muted-alt)}.correlation-table-wrapper table .table-title td{border-top:none}.correlation-table-wrapper table .horizontal-header,.correlation-table-wrapper table thead{background-color:var(--bg-3000);color:var(--muted);font-weight:700;text-transform:uppercase}.correlation-table-wrapper table tbody td:not(.horizontal-header){text-align:right}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/Funnels/FunnelCorrelation.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".funnel-correlation{margin-bottom:3rem}.funnel-correlation .skew-warning{background-color:var(--bg-light);border:1px solid var(--warning);border-radius:var(--radius);line-height:2em;margin-top:1rem}.funnel-correlation .skew-warning h4{align-items:center;border-bottom:1px solid var(--border);display:flex;font-size:1.1em;justify-content:space-between;padding:.5rem;position:relative}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/Funnels/FunnelCorrelationTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".FunnelCorrelationTable .table-options .LemonCheckbox:not(:last-child) label{border-radius:var(--radius) 0 0 var(--radius);border-right:none}.FunnelCorrelationTable .table-options .LemonCheckbox:last-child label{border-radius:0 var(--radius) var(--radius) 0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/Histogram/Histogram.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".dashboard-wrapper{height:calc(100% - 2rem);width:100%}.histogram-container{display:flex}.histogram-container svg{margin-left:1rem;margin-right:1rem}.histogram-container svg g#x-axis .domain,.histogram-container svg g#y-axis .domain{stroke:var(--funnel-axis)}.histogram-container svg g#x-axis .tick{color:var(--funnel-axis)}.histogram-container svg g#x-axis text,.histogram-container svg g#y-axis text{font-family:var(--font-sans);font-size:.75rem;font-weight:500;fill:var(--text-3000)}.histogram-container svg g#y-gridlines{stroke-dasharray:4,2}.histogram-container svg g#y-gridlines g.tick:not(:first-child){color:var(--funnel-grid)}.histogram-container svg g#y-gridlines .domain,.histogram-container svg g#y-gridlines g.tick:first-of-type{display:none}.histogram-container svg g#bars{fill:var(--primary-3000)}.histogram-container svg g#labels text.bar-label{font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;fill:var(--white)}.histogram-container svg g#labels text.bar-label.outside{fill:#0f0f0f}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/InsightsTable/InsightsTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".series-name-wrapper-col{align-items:center;display:flex}.series-name-wrapper-col .edit-icon{color:var(--primary-3000);cursor:pointer;font-size:1rem}.series-name-wrapper-col .insights-label.editable{cursor:pointer}.series-name-wrapper-col .insights-label.editable .EntityFilterInfo:not(.text-muted){color:var(--primary-3000);font-weight:500}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/InsightsTable/columns/AggregationColumn.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".AggregationColumn__title{color:var(--text-secondary-3000)}.AggregationColumn__title:hover{color:var(--text-3000)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/WorldMap/WorldMap.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".WorldMap{color:var(--border);padding:1rem 0;width:100%}.WorldMap .landxx{fill:currentColor;fill-rule:evenodd;stroke:var(--bg-light);stroke-width:.125rem}.WorldMap .landxx:hover{color:var(--data-color-1-hover)!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/AddToNotebook/DraggableToNotebook.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".DraggableToNotebook{position:relative}.DraggableToNotebook--dragging{background-color:var(--bg-light);outline:1px solid var(--primary-3000);transform:translateZ(0)}.DraggableToNotebook[draggable=true]{cursor:grab}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/Nodes/NodeWrapper.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".NotebookNode{--notebook-node-meta-height:2.5rem;--notebook-node-meta-padding:0.25rem;--border-color:var(--border);transform:translateZ(0)}.NotebookNode .NotebookNode__box{background-color:var(--bg-light);border:1px solid var(--border-color);border-radius:var(--radius);overflow:hidden;transform:translateZ(0);transition:border .15s linear,margin-bottom .15s linear}.NotebookNode .NotebookNode__box .NotebookNode__meta{align-items:center;border-bottom:1px solid var(--border);color:var(--primary-alt);display:flex;font-size:.875rem;font-weight:500;height:var(--notebook-node-meta-height);justify-content:space-between;overflow:hidden;padding:var(--notebook-node-meta-padding)}.NotebookNode .NotebookNode__box .NotebookNode__settings{border-bottom:1px solid var(--border)}.NotebookNode .NotebookNode__box .NotebookNode__content{transition:box-shadow .15s ease-out;z-index:1}.NotebookNode .NotebookNode__gap{align-items:center;display:flex;gap:.2rem;height:1.375rem;opacity:0;overflow:hidden;transition:all .15s linear 1s}.NotebookNode--editable:hover .NotebookNode__gap,.NotebookNode--selected .NotebookNode__gap{height:1.875rem;opacity:1;transition:all .15s linear}.NotebookNode--selected{--border-color:var(--border-bold)}.NotebookNode--auto-hide-metadata{--border-color:transparent}.NotebookNode--auto-hide-metadata .NotebookNode__meta{background-color:var(--bg-light);left:0;pointer-events:none;position:absolute;right:0;top:0;visibility:hidden;z-index:var(--z-popover)}.Notebook--editable .NotebookNode--auto-hide-metadata.NotebookNode--selected,.Notebook--editable .NotebookNode--auto-hide-metadata:hover{border-color:var(--border-color)}.Notebook--editable .NotebookNode--auto-hide-metadata.NotebookNode--selected .NotebookNode__meta,.Notebook--editable .NotebookNode--auto-hide-metadata:hover .NotebookNode__meta{pointer-events:all;visibility:visible}.NotebookNode--auto-hide-metadata:hover{--border-color:var(--border)}.NotebookNode.ph-image img{flex:1;height:100%;object-fit:contain;width:100%}.NotebookNodeTitle{overflow:hidden;padding:.25rem;text-overflow:ellipsis;white-space:nowrap}.NotebookNodeTitle--editable{border-radius:var(--radius);transition:background-color .15s linear}.NotebookNodeTitle--editable:hover{background-color:var(--border)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/Notebook/Notebook.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.Notebook{display:flex;flex:1;flex-direction:column;width:100%}.Notebook .NotebookEditor{flex:1;overflow:hidden;position:relative;width:100%}.Notebook .NotebookEditor .ProseMirror-focused{outline:none}.Notebook .NotebookEditor .ProseMirror>h1,.Notebook .NotebookEditor .ProseMirror>h2,.Notebook .NotebookEditor .ProseMirror>h3,.Notebook .NotebookEditor .ProseMirror>h4,.Notebook .NotebookEditor .ProseMirror>h5{margin-top:.5rem}.Notebook .NotebookEditor .ProseMirror>p{margin-bottom:.2rem}.Notebook .NotebookEditor .ProseMirror>.is-empty:before{color:rgba(0,0,0,.2);content:attr(data-placeholder);float:left;height:0;pointer-events:none}[theme=dark] .Notebook .NotebookEditor .ProseMirror>.is-empty:before{color:hsla(0,0%,100%,.2)}.Notebook .NotebookEditor .ProseMirror>ol{list-style-type:decimal}.Notebook .NotebookEditor .ProseMirror>ol ol{list-style-type:lower-alpha}.Notebook .NotebookEditor .ProseMirror>ul{list-style-type:disc}.Notebook .NotebookEditor .ProseMirror>ul ul{list-style-type:circle}.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList]{list-style-type:none;padding-left:0}.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList] li{display:flex}.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList] li>label{flex:0 0 auto;margin-right:.5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList] li>div{flex:1 1 auto}.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList] li ol li,.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList] li ul li{display:list-item}.Notebook .NotebookEditor .ProseMirror>ul[data-type=taskList] li ul[data-type=taskList]>li{display:flex}.Notebook .NotebookEditor .ProseMirror>ol,.Notebook .NotebookEditor .ProseMirror>ol ol,.Notebook .NotebookEditor .ProseMirror>ol ul,.Notebook .NotebookEditor .ProseMirror>ul,.Notebook .NotebookEditor .ProseMirror>ul ol,.Notebook .NotebookEditor .ProseMirror>ul ul{padding-left:2rem}.Notebook .NotebookEditor .ProseMirror>ol li p,.Notebook .NotebookEditor .ProseMirror>ul li p{margin-bottom:.2rem}.Notebook .NotebookEditor .ProseMirror>pre{background-color:rgba(0,0,0,.05);border-radius:var(--radius);margin-bottom:.5rem;overflow-x:auto;padding:.5rem}.Notebook .NotebookEditor .ProseMirror>code,.Notebook .NotebookEditor .ProseMirror>p code{background-color:rgba(0,0,0,.05);border-radius:var(--radius);padding:.2rem}.Notebook .NotebookEditor .Backlink{background-color:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);padding:.125rem .25rem}.Notebook .NotebookEditor .Backlink:hover{background-color:var(--bg-3000)}.Notebook .NotebookEditor .Backlink svg{color:var(--text-3000)}.Notebook .NotebookEditor .Backlink.Backlink--selected{border-color:var(--primary-3000)}.Notebook .NotebookEditor .Backlink.Backlink--active{background:var(--primary-3000);border:1px solid var(--primary-3000);color:var(--white)}.Notebook .NotebookEditor .Backlink.Backlink--active .Backlink__label,.Notebook .NotebookEditor .Backlink.Backlink--active svg{color:var(--white)}.Notebook .NotebookEditor .Backlink.Backlink--active span::-moz-selection{color:var(--white)}.Notebook .NotebookEditor .Backlink.Backlink--active span::selection{color:var(--white)}.Notebook .NotebookEditor[contenteditable=true] a{cursor:text}.Notebook--compact:not(.Notebook--canvas) .NotebookEditor{max-width:800px}.Notebook .NotebookColumn{--notebook-sidebar-height:calc(100vh - 9rem);position:relative;transition:width var(--notebook-popover-transition-properties);width:0}.Notebook .NotebookColumn .NotebookColumn__content{align-self:flex-start;position:sticky;top:0;transform:translateX(-100%);transition:transform var(--notebook-popover-transition-properties)}.NotebookScene .Notebook .NotebookColumn{--notebook-sidebar-height:calc(100vh - 11rem)}.NotebookScene .Notebook .NotebookColumn .NotebookColumn__padding{height:4rem}.NotebookScene .Notebook .NotebookColumn .NotebookColumn__content{top:4rem}.Notebook .NotebookColumn--left .NotebookColumn__content{transform:translateX(-100%);width:var(--notebook-column-left-width)}.Notebook .NotebookColumn--left .NotebookColumn__content>.LemonWidget .LemonWidget__content{max-height:var(--notebook-sidebar-height);overflow:auto}.Notebook .NotebookColumn--right .NotebookColumn__content{transform:translateX(100%);width:var(--notebook-column-right-width)}.Notebook .NotebookColumn--showing.NotebookColumn--left{margin-right:1rem;width:var(--notebook-column-left-width)}.Notebook .NotebookColumn--showing.NotebookColumn--right{margin-left:1rem;width:var(--notebook-column-right-width)}.Notebook .NotebookColumn--showing .NotebookColumn__content{transform:translateX(0)}.Notebook--editable .NotebookEditor .ProseMirror{flex:1;padding-bottom:10rem}.Notebook--editable .NotebookColumn--left.NotebookColumn--showing+.NotebookEditor .ProseMirror{padding-bottom:100vh}.Notebook .NotebookHistory{display:flex;flex:1;flex-direction:column}.Notebook .NotebookInlineMenu{box-shadow:0 4px 10px 0 rgba(0,0,0,.1);margin-bottom:-.2rem}.Notebook .NotebookInlineMenu .LemonInput{border:0;min-height:0}.Notebook .LemonTable__content>table>thead{position:sticky;top:0;z-index:1}.Notebook .NotebookMention,.Notebook .NotebookRecordingTimestamp{display:inline-flex;max-height:22px}.Notebook .NotebookComment{--notebook-comment-background-opacity:0.25;position:relative;transform-style:preserve-3d}.Notebook .NotebookComment:hover{--notebook-comment-background-opacity:0.5}.Notebook .NotebookComment:after{background:var(--primary-3000);content:"";inset:0;opacity:var(--notebook-comment-background-opacity);position:absolute;z-index:-1}.Notebook .InsightVizDisplay .InsightDisplayConfig{border-bottom-width:0;padding:0}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/NotebookPanel/NotebookPanel.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".NotebookPanel{background-color:var(--accent-3000);display:flex;flex:1;flex-direction:column;overflow:hidden}.NotebookPanel .NotebookPanelDropzone{border:2px dashed var(--border-3000);border-radius:var(--radius);display:flex;height:4rem;margin:.5rem;transition:all .15s}.NotebookPanel .NotebookPanelDropzone .NotebookPanelDropzone__message{align-items:center;background-color:var(--bg-light);color:var(--muted-alt);display:flex;flex:1;flex-direction:column;font-size:1rem;font-weight:700;justify-content:center;opacity:.75;padding:1rem;pointer-events:none;text-align:center;transition:all .15s}.NotebookPanel .NotebookPanelDropzone .NotebookPanelDropzone__dropped{display:flex;flex:1;flex-direction:column;overflow:hidden}.NotebookPanel .NotebookPanelDropzone--active{border-color:var(--primary-3000);height:8rem}.NotebookPanel .NotebookPanelDropzone--active .NotebookPanelDropzone__message{opacity:1}.NotebookPanel .NotebookPanelDropzone--dropped{align-items:normal;border:none;height:100%;justify-content:flex-start;margin:1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/NotebookScene.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Navigation3000 .NotebookScene{inset:0;overflow-y:auto;padding:0 1rem;position:absolute}.NotebookScene .ProseMirror>.react-renderer{scroll-margin-top:65px}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/Suggestions/FloatingSuggestions.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".FloatingSuggestion{height:1.375rem;position:absolute}.NotebookFloatingButton{left:0;position:absolute;z-index:var(--z-popover)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/paths/Paths.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Paths{height:720px;max-height:100%;overflow-y:hidden;position:relative;width:100%}.Paths .Paths__canvas{height:100%!important;width:100%}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/persons/PersonDisplay.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PersonDisplay{display:inline}.PersonDisplay .ProfilePicture{margin-right:.5rem;transition:opacity .2s ease}.PersonDisplay a:hover .ProfilePicture{opacity:.75}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/retention/RetentionTable.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".RetentionTable{--retention-table-color:var(--primary-3000);font-weight:500;width:100%}.RetentionTable th{border-bottom:10px solid transparent;border-left:1px solid var(--border);border-top:10px solid transparent;font-weight:500;padding:0 .5rem;text-align:left;white-space:nowrap}.RetentionTable th:first-of-type{border-left:none}.RetentionTable tr{border-left:.25rem solid transparent}.RetentionTable tr:not(:nth-of-type(-n+2)){cursor:pointer}.RetentionTable tr:not(:nth-of-type(-n+2)):hover{border-left-color:var(--retention-table-color)}.RetentionTable .RetentionTable__TextTab{padding:0 1rem 0 .5rem;white-space:nowrap}.RetentionTable .RetentionTable__Tab{background-color:var(--retention-table-color);border-radius:var(--radius);margin:2px;min-height:2rem;padding:.5rem;text-align:right}.RetentionTable .RetentionTable__Tab.RetentionTable__Tab--clickable{transition:transform .2s ease-out}.RetentionTable .RetentionTable__Tab.RetentionTable__Tab--clickable:hover{transform:scale(1.05)}.RetentionTable .RetentionTable__Tab.RetentionTable__Tab--period{background-color:var(--bg-light);border-style:solid;border:1px dashed var(--border);color:var(--muted)}.RetentionTable.RetentionTable--non-interactive tr:hover{border-left-color:transparent}.RetentionTable.RetentionTable--non-interactive .RetentionTable__Tab{cursor:auto}.RetentionTable.RetentionTable--non-interactive .RetentionTable__Tab:hover{transform:none}.RetentionTable.RetentionTable--small-layout{font-size:.75rem;line-height:1rem}.RetentionTable.RetentionTable--small-layout .RetentionTable__TextTab,.RetentionTable.RetentionTable--small-layout th{padding-left:.25rem;padding-right:.25rem}.RetentionTable.RetentionTable--small-layout .RetentionTable__Tab{margin:0;padding:.5rem .25rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/saved-insights/SavedInsights.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".saved-insights .new-insight-dropdown-btn{background-color:var(--primary-3000);border:1px solid var(--border);border-radius:var(--radius);color:#fff;cursor:pointer;height:40px;padding:8px 12px 8px 16px}.saved-insights .saved-insight-empty-state{align-items:center;display:flex;justify-content:center;text-align:center}.saved-insights .saved-insight-empty-state .insight-empty-state__wrapper{margin-bottom:17rem;margin-top:5rem;max-width:600px}.saved-insights .saved-insight-empty-state .insight-empty-state__wrapper .illustration-main{color:var(--border);font-size:5rem;line-height:1em;margin-bottom:1rem;text-align:center}.saved-insights .saved-insight-empty-state .insight-empty-state__wrapper .empty-state__title{font-size:1.5rem;font-weight:600;line-height:1.6rem}.saved-insights .saved-insight-empty-state .insight-empty-state__wrapper .empty-state__description{color:var(--muted);font-size:1rem;font-weight:500;line-height:1.7rem}.new-insight-overlay{width:21rem}.insight-type-icon-wrapper{align-items:center;display:flex}.insight-type-icon-wrapper .icon-container{height:22px;margin-right:8px;position:relative;width:22px}.insight-type-icon-wrapper .icon-container .icon-container-inner{font-size:22px;margin-left:-2px}.saved-insights-grid{display:grid;position:relative;grid-gap:1rem}@media screen and (min-width:1200px){.saved-insights-grid{grid-template-columns:repeat(2,1fr)}}@media screen and (min-width:1600px){.saved-insights-grid{grid-template-columns:repeat(3,1fr)}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/apm/NetworkView.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".NetworkView .NetworkView__table table{table-layout:fixed}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/PlayerFrame.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.PlayerFrame{align-items:center;background-color:var(--bg-3000-dark);display:flex;height:100%;justify-content:center;overflow:hidden;position:relative;width:100%}.PlayerFrame .PlayerFrame__content{position:absolute}.PlayerFrame .PlayerFrame__content iframe{background-color:#fff;border:0}.PlayerFrame .PlayerFrame__content .replayer-wrapper{position:relative}.PlayerFrame .PlayerFrame__content .replayer-mouse{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIiBkYXRhLW5hbWU9IkxheWVyIDEiIHZpZXdCb3g9IjAgMCA1MCA1MCI+PHBhdGggZD0iTTQ4LjcxIDQyLjkxIDM0LjA4IDI4LjI5IDQ0LjMzIDE4YTEgMSAwIDAgMC0uMzMtMS42MUwyLjM1IDEuMDZhMSAxIDAgMCAwLTEuMjkgMS4yOUwxNi4zOSA0NGExIDEgMCAwIDAgMS42NS4zNmwxMC4yNS0xMC4yOCAxNC42MiAxNC42M2ExIDEgMCAwIDAgMS40MSAwbDQuMzgtNC4zOGExIDEgMCAwIDAgLjAxLTEuNDJtLTUuMDkgMy42N0wyOSAzMmExIDEgMCAwIDAtMS40MSAwbC05Ljg1IDkuODVMMy42OSAzLjY5bDM4LjEyIDE0TDMyIDI3LjU4QTEgMSAwIDAgMCAzMiAyOWwxNC41OSAxNC42MloiLz48L3N2Zz4=");background-position:50%;background-repeat:no-repeat;background-size:contain;border-color:transparent;height:20px;position:absolute;transition:left .05s linear,top .05s linear;width:20px}.PlayerFrame .PlayerFrame__content .replayer-mouse:after{background:#4950f6;border-radius:100%;content:"";display:inline-block;height:20px;opacity:.3;transform:translate(-50%,-50%);width:20px}.PlayerFrame .PlayerFrame__content .replayer-mouse.active:after{animation:PlayerFrame__click .2s ease-in-out 1}.PlayerFrame .PlayerFrame__content .replayer-mouse.touch-device{background-image:none;border:4px solid rgba(73,80,246,0);border-radius:100%;height:70px;margin-left:-37px;margin-top:-37px;transition:left 0s linear,top 0s linear,border-color .2s ease-in-out;width:70px}.PlayerFrame .PlayerFrame__content .replayer-mouse.touch-device.touch-active{border-color:#4950f6;transition:left .25s linear,top .25s linear,border-color .2s ease-in-out}.PlayerFrame .PlayerFrame__content .replayer-mouse.touch-device:after{opacity:0}.PlayerFrame .PlayerFrame__content .replayer-mouse.touch-device.active:after{animation:PlayerFrame__touch-click .2s ease-in-out 1}.PlayerFrame .PlayerFrame__content .replayer-mouse-tail{pointer-events:none;position:absolute}@keyframes PlayerFrame__click{0%{height:20px;opacity:.3;width:20px}50%{height:10px;opacity:.5;width:10px}}@keyframes PlayerFrame__touch-click{0%{height:20px;opacity:0;width:20px}50%{height:10px;opacity:.5;width:10px}}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/PlayerFrameOverlay.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PlayerFrameOverlay{inset:0;position:absolute;z-index:10}.PlayerFrameOverlay .PlayerFrameOverlay__content{align-items:center;background-color:rgba(0,0,0,.15);display:flex;inset:0;justify-content:center;opacity:.8;position:absolute;transition:opacity .1s;z-index:1}.PlayerFrameOverlay .PlayerFrameOverlay__content:hover{opacity:1}.PlayerFrameOverlay .PlayerFrameOverlay__content--only-hover{opacity:0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/PlayerMeta.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PlayerMeta{display:flex;flex-direction:column;flex-shrink:0;overflow:hidden;position:relative}.PlayerMeta .PlayerMetaPersonProperties{background:var(--bg-3000);border-bottom:1px solid transparent;overflow:auto;padding:.5rem}.PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMetaPersonProperties{transition:height .2s ease-out,border-bottom-color .2s ease-out}.PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMetaPersonProperties--enter{height:0}.PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMetaPersonProperties--enter-active,.PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMetaPersonProperties--enter-done,.PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMetaPersonProperties--exit{border-bottom-color:var(--border);height:14rem}.PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMetaPersonProperties--exit-active{height:0}.LemonModal .PlayerMeta:not(.PlayerMeta--fullscreen) .PlayerMeta__top{padding-right:3.5rem!important}.PlayerMeta--fullscreen{align-items:center;flex-direction:row;justify-content:space-between}.PlayerMeta--fullscreen .PlayerMetaPersonProperties{border-right:1px solid var(--border);bottom:97px;left:0;max-width:40rem;position:fixed;top:48px;transition:transform .2s ease-out;width:100%;z-index:1}.PlayerMeta--fullscreen .PlayerMetaPersonProperties--enter{transform:translateX(-100%)}.PlayerMeta--fullscreen .PlayerMetaPersonProperties--enter-active,.PlayerMeta--fullscreen .PlayerMetaPersonProperties--enter-done,.PlayerMeta--fullscreen .PlayerMetaPersonProperties--exit{transform:translateX(0)}.PlayerMeta--fullscreen .PlayerMetaPersonProperties--exit-active{transform:translateX(-100%)}.PlayerMeta .Link{color:var(--text-3000)}.PlayerMeta .Link:hover{color:var(--primary-3000)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/PlayerUpNext.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PlayerUpNext{transition:transform .25s ease-out;z-index:11}.PlayerUpNextButton{align-items:center;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);cursor:pointer;display:flex;overflow:hidden}.PlayerUpNextButton .PlayerUpNextButtonBackground{background-color:var(--border-3000);bottom:0;color:var(--primary-alt);left:0;position:absolute;top:0;width:0}.PlayerUpNextButton.PlayerUpNextButton--animating .PlayerUpNextButtonBackground{animation:PlayerUpNextButtonBackground__expand 3s linear forwards}.PlayerUpNextButton:hover .PlayerUpNextButtonBackground{animation:none;width:100%}@keyframes PlayerUpNextButtonBackground__expand{0%{width:0}to{width:100%}}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/SessionRecordingPlayer.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".SessionRecordingPlayer{background-color:var(--bg-light);border:1px solid var(--border);border-radius:var(--radius);display:flex;flex-direction:row;height:100%;overflow:hidden;position:relative;width:100%}.SessionRecordingPlayer--no-border{border:none;border-radius:0}.SessionRecordingPlayer .SessionRecordingPlayer__body{background-color:var(--bg-light);height:100%;min-width:1px;overflow:hidden;position:relative;z-index:0}.SessionRecordingPlayer .SessionRecordingPlayer__main{flex:1}.SessionRecordingPlayer--fullscreen{background-color:var(--bg-light);border:none;border-radius:0;inset:0;overflow-y:auto;position:fixed;z-index:var(--z-modal)}.SessionRecordingPlayer--fullscreen .SessionRecordingPlayer__body{border-radius:0;height:100%;margin:0}.SessionRecordingPlayer .SessionRecordingPlayer__main,.SessionRecordingPlayer .SessionRecordingPlayer__sidebar{display:flex;flex-direction:column;overflow:hidden}.LemonModal .SessionRecordingPlayer .SessionRecordingPlayer__body{height:calc(90vh - 15rem)}.SessionRecordingPlayer .SessionRecordingPlayer__sidebar{flex-shrink:0;max-width:50%;min-width:20rem;position:relative}.SessionRecordingPlayer .SessionRecordingPlayer__sidebar--collapsed{min-width:0}.SessionRecordingPlayer .SessionRecordingPlayer__sidebar__tabs .LemonTabs__tab-content{padding:10px 0}.SessionRecordingPlayer--stacked-vertically{flex-direction:column}.SessionRecordingPlayer--stacked-vertically .SessionRecordingPlayer__sidebar{max-height:60%;max-width:100%;min-width:100%}.PlayerControlSeekIcon{display:flex;position:relative}.PlayerControlSeekIcon .PlayerControlSeekIcon__seconds{align-items:center;display:flex;font-size:6px;font-weight:700;inset:0;justify-content:center;position:absolute;text-align:center}.PlayerControlSeekIcon .PlayerControlSeekIcon__icon{font-size:1.3rem}.PlayerControlSeekIcon .PlayerControlSeekIcon__icon--forward{transform:rotateY(180deg)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/controller/Seekbar.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PlayerSeekbar{--bar-height:4px;--slider-height:20px;--thumb-size:15px;display:flex;height:var(--slider-height);position:relative;width:100%}.PlayerSeekbar--scrubbing,.PlayerSeekbar:hover{--bar-height:8px}.PlayerSeekbar--scrubbing .PlayerSeekBarPreview,.PlayerSeekbar:hover .PlayerSeekBarPreview{opacity:1}.PlayerSeekbar .PlayerSeekbar__slider{background-color:var(--border-light);border-radius:var(--bar-height);cursor:pointer;height:var(--bar-height);left:0;position:absolute;right:0;top:calc((var(--slider-height) - var(--bar-height))/2);transition:height .15s ease-in-out,top .15s ease-in-out;z-index:2}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__bufferbar,.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__currentbar,.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__segments{height:100%;left:0;position:absolute;top:0;width:0}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__bufferbar{background-color:var(--border);border-radius:var(--bar-height);z-index:2}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__currentbar{background-color:var(--primary-3000);border-radius:var(--bar-height) 0 0 var(--bar-height);z-index:3}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__segments{height:100%;white-space:nowrap;width:100%;z-index:4}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__segments .PlayerSeekbar__segments__item{background-color:var(--bg-light);float:left;height:100%;opacity:.5}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__segments .PlayerSeekbar__segments__item--active{opacity:0}.PlayerSeekbar .PlayerSeekbar__slider .PlayerSeekbar__thumb{backface-visibility:hidden;background-color:var(--primary-3000);border:2px solid var(--bg-light);border-radius:50%;height:var(--thumb-size);margin-top:calc(var(--thumb-size)/2*-1);position:absolute;top:calc(var(--bar-height)/2);transition:top .15s ease-in-out;width:var(--thumb-size);z-index:5}.PlayerSeekbar .PlayerSeekBarPreview{bottom:100%;opacity:0;pointer-events:none;position:absolute;transition:opacity .15s ease-in-out;width:100%;z-index:6}.PlayerSeekbar .PlayerSeekBarPreview .PlayerSeekBarPreview__tooltip{width:100%}.PlayerSeekbar .PlayerSeekBarPreview .PlayerSeekBarPreview__tooltip .PlayerSeekBarPreview__tooltip__content{background-color:var(--tooltip-bg);border-radius:var(--radius);color:#fff;display:inline-block;font-size:.8rem;font-weight:600;margin-bottom:.5rem;padding:.1rem;transform:translateX(-50%)}.PlayerSeekbarTicks{height:.75rem;position:relative;width:100%;z-index:1}.PlayerSeekbarTicks .PlayerSeekbarTick{--tick-color:var(--muted-alt);--tick-width:3px;cursor:pointer;height:100%;position:absolute;top:0;transition:transform .15s ease-in-out}.PlayerSeekbarTicks .PlayerSeekbarTick--warning{--tick-color:var(--warning)}.PlayerSeekbarTicks .PlayerSeekbarTick--danger{--tick-color:var(--danger)}.PlayerSeekbarTicks .PlayerSeekbarTick--primary{--tick-color:var(--primary-3000)}.PlayerSeekbarTicks .PlayerSeekbarTick .PlayerSeekbarTick__line{background-color:var(--tick-color);border-radius:2px;height:100%;margin-left:calc(var(--tick-width)/2*-1);opacity:.5;position:absolute;width:var(--tick-width)}.PlayerSeekbarTicks .PlayerSeekbarTick .PlayerSeekbarTick__info{background-color:var(--tick-color);border-radius:var(--radius);bottom:100%;color:#fff;font-size:.8rem;margin-bottom:.25rem;max-width:20rem;opacity:0;padding:.25rem .5rem;position:absolute;transform:translateX(-50%);transition:opacity .15s ease-in-out;visibility:hidden;white-space:nowrap}.PlayerSeekbarTicks .PlayerSeekbarTick:hover{--tick-width:5px}.PlayerSeekbarTicks .PlayerSeekbarTick:hover .PlayerSeekbarTick__info{opacity:1;visibility:visible}.PlayerSeekbarTicks .PlayerSeekbarTick:hover .PlayerSeekbarTick__line{opacity:1}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/inspector/PlayerInspectorList.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,"#PlayerInspectorListMarker{background-color:var(--primary-3000);border-radius:0 var(--radius) var(--radius) 0;height:.5rem;left:0;margin-top:.25rem;pointer-events:none;position:absolute;top:0;transition:transform .2s linear;width:1rem;will-change:transform;z-index:1}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/inspector/components/ImagePreview.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,'.ImagePreview__background{background:#eee url(\'data:image/svg+xml;charset=utf-8,\');background-size:30px 30px}',""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/settings/Settings.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".Settings{align-items:start;display:flex;gap:2rem;margin-top:0}.Settings .Settings__sections{flex-shrink:0;max-width:20rem;min-width:14rem;position:sticky;top:4rem;width:20%}.SidePanel3000 .Settings .Settings__sections{top:0}.Settings--compact{flex-direction:column;gap:0}.Settings--compact .Settings__sections{max-width:100%;min-width:100%;position:relative;width:100%}.LemonModal .Settings{margin-top:0}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/settings/organization/InviteModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".InviteModal__share_link{display:flex;overflow:scroll;white-space:nowrap;width:175px;-ms-overflow-style:none;scrollbar-width:none}.InviteModal__share_link::-webkit-scrollbar{display:none}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/surveys/EditSurvey.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".presentation-preview .CodeSnippet__actions{display:none}.SurveyForm .LemonCollapsePanel__header{background:var(--border-light)}.question-choice-open-ended-footer{background-color:var(--bg-3000);bottom:-5px;font-size:10px;left:6px;padding:0 5px;position:absolute}.SurveyQuestionDragHandle{color:var(--text-3000);cursor:move;font-size:1.2em;transform:rotate(90deg)}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/surveys/SurveyView.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".masonry-container{-moz-column-count:4;column-count:4;-moz-column-gap:10px;column-gap:10px}@media screen and (max-width:1024px){.masonry-container{-moz-column-count:2;column-count:2}}.masonry-item{box-sizing:border-box;display:grid;grid-template-rows:1fr auto;margin:0 0 10px;page-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}.survey-view .survey-form{z-index:0!important}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/trends/persons-modal/PersonsModal.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".PersonsModal__tabs [role=tablist]{margin-bottom:0;padding:0 1rem}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/trends/viz/ActionsPie.scss":(module,exports,__webpack_require__)=>{(exports=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js")(!1)).push([module.id,".ActionsPie{display:flex;flex:1;flex-direction:row;gap:.5rem;height:100%;width:100%}.ActionsPie .ActionsPie__component{flex:1;min-width:33%;padding:1rem}.ActionsPie .ActionsPie__component .ActionsPie__chart{height:calc(100% - 4.5rem);position:relative;transition:height .5s;width:100%}.ActionsPie .ActionsPie__component h3{letter-spacing:-.025em}",""]),module.exports=exports},"./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/styles/global.scss":(module,exports,__webpack_require__)=>{var ___CSS_LOADER_API_IMPORT___=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/api.js"),___CSS_LOADER_GET_URL_IMPORT___=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/runtime/getUrl.js"),___CSS_LOADER_URL_IMPORT_0___=__webpack_require__("./frontend/public/Inter.woff2"),___CSS_LOADER_URL_IMPORT_1___=__webpack_require__("./frontend/public/Inter.woff");exports=___CSS_LOADER_API_IMPORT___(!1);var ___CSS_LOADER_URL_REPLACEMENT_0___=___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___),___CSS_LOADER_URL_REPLACEMENT_1___=___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_1___);exports.push([module.id,":root{--toastify-color-light:#fff;--toastify-color-dark:#121212;--toastify-color-info:#3498db;--toastify-color-success:#07bc0c;--toastify-color-warning:#f1c40f;--toastify-color-error:#e74c3c;--toastify-color-transparent:hsla(0,0%,100%,.7);--toastify-icon-color-info:var(--toastify-color-info);--toastify-icon-color-success:var(--toastify-color-success);--toastify-icon-color-warning:var(--toastify-color-warning);--toastify-icon-color-error:var(--toastify-color-error);--toastify-toast-width:320px;--toastify-toast-background:#fff;--toastify-toast-min-height:64px;--toastify-toast-max-height:800px;--toastify-font-family:sans-serif;--toastify-z-index:9999;--toastify-text-color-dark:#fff;--toastify-text-color-info:#fff;--toastify-text-color-success:#fff;--toastify-text-color-warning:#fff;--toastify-text-color-error:#fff;--toastify-spinner-color:#616161;--toastify-spinner-color-empty-area:#e0e0e0;--toastify-color-progress-light:linear-gradient(90deg,#4cd964,#5ac8fa,#007aff,#34aadc,#5856d6,#ff2d55);--toastify-color-progress-dark:#bb86fc}.Toastify__toast-container{box-sizing:border-box;color:#fff;padding:4px;position:fixed;-webkit-transform:translate3d(0,0,var(--toastify-z-index) px);width:var(--toastify-toast-width);z-index:var(--toastify-z-index)}.Toastify__toast-container--top-left{left:1em;top:1em}.Toastify__toast-container--top-center{left:50%;top:1em;transform:translateX(-50%)}.Toastify__toast-container--top-right{right:1em;top:1em}.Toastify__toast-container--bottom-left{bottom:1em;left:1em}.Toastify__toast-container--bottom-center{bottom:1em;left:50%;transform:translateX(-50%)}.Toastify__toast-container--bottom-right{bottom:1em;right:1em}@media only screen and (max-width:480px){.Toastify__toast-container{left:0;margin:0;padding:0;width:100vw}.Toastify__toast-container--top-center,.Toastify__toast-container--top-left,.Toastify__toast-container--top-right{top:0;transform:translateX(0)}.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-right{bottom:0;transform:translateX(0)}.Toastify__toast-container--rtl{left:auto;right:0}}.Toastify__toast{border-radius:4px;box-shadow:0 1px 10px 0 rgba(0,0,0,.1),0 2px 15px 0 rgba(0,0,0,.05);box-sizing:border-box;cursor:pointer;direction:ltr;display:flex;font-family:var(--toastify-font-family);justify-content:space-between;margin-bottom:1rem;max-height:var(--toastify-toast-max-height);min-height:var(--toastify-toast-min-height);overflow:hidden;padding:8px;position:relative}.Toastify__toast--rtl{direction:rtl}.Toastify__toast-body{align-items:center;display:flex;flex:1 1 auto;margin:auto 0;padding:6px}.Toastify__toast-body>div:last-child{flex:1}.Toastify__toast-icon{display:flex;flex-shrink:0;margin-inline-end:10px;width:20px}.Toastify--animate{animation-duration:.7s;animation-fill-mode:both}.Toastify--animate-icon{animation-duration:.3s;animation-fill-mode:both}@media only screen and (max-width:480px){.Toastify__toast{border-radius:0;margin-bottom:0}}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--colored.Toastify__toast--default,.Toastify__toast-theme--light{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{background:var(--toastify-color-info);color:var(--toastify-text-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{background:var(--toastify-color-success);color:var(--toastify-text-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{background:var(--toastify-color-warning);color:var(--toastify-text-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{background:var(--toastify-color-error);color:var(--toastify-text-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning{background:var(--toastify-color-transparent)}.Toastify__close-button{align-self:flex-start;background:transparent;border:none;color:#fff;cursor:pointer;opacity:.7;outline:none;padding:0;transition:.3s ease}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:focus,.Toastify__close-button:hover{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{bottom:0;height:5px;left:0;opacity:.7;position:absolute;transform-origin:left;width:100%;z-index:var(--toastify-z-index)}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{left:auto;right:0;transform-origin:right}.Toastify__spinner{animation:Toastify__spin .65s linear infinite;border:2px solid;border-color:var(--toastify-spinner-color-empty-area);border-radius:100%;border-right-color:var(--toastify-spinner-color);box-sizing:border-box;height:20px;width:20px}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--bottom-left,.Toastify__bounce-enter--top-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--bottom-right,.Toastify__bounce-enter--top-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--bottom-left,.Toastify__bounce-exit--top-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--bottom-right,.Toastify__bounce-exit--top-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{animation-timing-function:ease-in;opacity:0;transform:perspective(400px) rotateX(90deg)}40%{animation-timing-function:ease-in;transform:perspective(400px) rotateX(-20deg)}60%{opacity:1;transform:perspective(400px) rotateX(10deg)}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotateX(-20deg)}to{opacity:0;transform:perspective(400px) rotateX(90deg)}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translateZ(0)}}@keyframes Toastify__slideOutRight{0%{transform:translateZ(0)}to{transform:translate3d(110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutLeft{0%{transform:translateZ(0)}to{transform:translate3d(-110%,0,0);visibility:hidden}}@keyframes Toastify__slideOutDown{0%{transform:translateZ(0)}to{transform:translate3d(0,500px,0);visibility:hidden}}@keyframes Toastify__slideOutUp{0%{transform:translateZ(0)}to{transform:translate3d(0,-500px,0);visibility:hidden}}.Toastify__slide-enter--bottom-left,.Toastify__slide-enter--top-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--bottom-right,.Toastify__slide-enter--top-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--bottom-left,.Toastify__slide-exit--top-left{animation-name:Toastify__slideOutLeft}.Toastify__slide-exit--bottom-right,.Toastify__slide-exit--top-right{animation-name:Toastify__slideOutRight}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown}@keyframes Toastify__spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:700;src:url("+___CSS_LOADER_URL_REPLACEMENT_0___+') format("woff2"),url('+___CSS_LOADER_URL_REPLACEMENT_1___+') format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:500;src:url('+___CSS_LOADER_URL_REPLACEMENT_0___+') format("woff2"),url('+___CSS_LOADER_URL_REPLACEMENT_1___+') format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Inter;font-style:normal;font-weight:400;src:url('+___CSS_LOADER_URL_REPLACEMENT_0___+') format("woff2"),url('+___CSS_LOADER_URL_REPLACEMENT_1___+') format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:MatterSQ;font-style:normal;font-weight:800;src:url(https://d1sdjtjk6xzm7.cloudfront.net/MatterSQ-Bold.woff2) format("woff2"),url(https://d1sdjtjk6xzm7.cloudfront.net/MatterSQ-Bold.woff) format("woff")}@font-face{font-display:swap;font-family:MatterSQ;font-style:normal;font-weight:700;src:url(https://d1sdjtjk6xzm7.cloudfront.net/MatterSQ-SemiBold.woff2) format("woff2"),url(https://d1sdjtjk6xzm7.cloudfront.net/MatterSQ-SemiBold.woff) format("woff")}@font-face{font-display:swap;font-family:MatterSQ;font-style:normal;font-weight:500;src:url(https://d1sdjtjk6xzm7.cloudfront.net/MatterSQ-Medium.woff2) format("woff2"),url(https://d1sdjtjk6xzm7.cloudfront.net/MatterSQ-Medium.woff) format("woff")}.\\!container{width:100%!important}.container{width:100%}@media (min-width:576px){.\\!container{max-width:576px!important}.container{max-width:576px}}@media (min-width:768px){.\\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:992px){.\\!container{max-width:992px!important}.container{max-width:992px}}@media (min-width:1200px){.\\!container{max-width:1200px!important}.container{max-width:1200px}}@media (min-width:1600px){.\\!container{max-width:1600px!important}.container{max-width:1600px}}/*! tailwindcss v3.4.0 | MIT License | https://tailwindcss.com*/*,:after,:before{border:0 solid;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:-apple-system,BlinkMacSystemFont,Inter,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.pointer-events-none{pointer-events:none!important}.pointer-events-auto{pointer-events:auto!important}.\\!visible,.visible{visibility:visible!important}.invisible{visibility:hidden!important}.collapse{visibility:collapse!important}.static{position:static!important}.fixed{position:fixed!important}.absolute{position:absolute!important}.relative{position:relative!important}.sticky{position:sticky!important}.-inset-2{inset:-.5rem!important}.inset-0{inset:0!important}.-bottom-px{bottom:-1px!important}.-left-4{left:-1rem!important}.-left-5{left:-1.25rem!important}.-top-10{top:-2.5rem!important}.-top-4{top:-1rem!important}.-top-px{top:-1px!important}.bottom-0{bottom:0!important}.bottom-0\\.5{bottom:.125rem!important}.bottom-3{bottom:.75rem!important}.left-0{left:0!important}.left-1\\/2{left:50%!important}.left-2{left:.5rem!important}.left-4{left:1rem!important}.right-0{right:0!important}.right-2{right:.5rem!important}.right-3{right:.75rem!important}.right-4{right:1rem!important}.top-0{top:0!important}.top-0\\.5{top:.125rem!important}.top-1\\/2{top:50%!important}.top-16{top:4rem!important}.top-2{top:.5rem!important}.top-4{top:1rem!important}.top-\\[var\\(--breadcrumbs-height-compact\\)\\]{top:var(--breadcrumbs-height-compact)!important}.top-\\[var\\(--breadcrumbs-height-full\\)\\]{top:var(--breadcrumbs-height-full)!important}.isolate{isolation:isolate!important}.z-0{z-index:0!important}.z-10{z-index:10!important}.z-20{z-index:20!important}.z-50{z-index:50!important}.z-\\[1000\\]{z-index:1000!important}.z-\\[1\\]{z-index:1!important}.z-\\[2147483010\\]{z-index:2147483010!important}.z-\\[2147483021\\]{z-index:2147483021!important}.z-\\[7\\]{z-index:7!important}.z-\\[var\\(--z-popover\\)\\]{z-index:var(--z-popover)!important}.col-span-1{grid-column:span 1/span 1!important}.col-span-2{grid-column:span 2/span 2!important}.col-span-3{grid-column:span 3/span 3!important}.col-span-4{grid-column:span 4/span 4!important}.col-span-6{grid-column:span 6/span 6!important}.col-span-8{grid-column:span 8/span 8!important}.col-span-full{grid-column:1/-1!important}.col-start-2{grid-column-start:2!important}.row-span-1{grid-row:span 1/span 1!important}.row-start-2{grid-row-start:2!important}.float-right{float:right!important}.-m-1{margin:-.25rem!important}.-m-1\\.5{margin:-.375rem!important}.-m-4{margin:-1rem!important}.-m-scene-padding{margin:calc(var(--scene-padding)*-1)!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-1\\.5{margin:.375rem!important}.m-10{margin:2.5rem!important}.m-2{margin:.5rem!important}.m-3{margin:.75rem!important}.m-4{margin:1rem!important}.m-5{margin:1.25rem!important}.m-6{margin:1.5rem!important}.m-\\[-2px\\]{margin:-2px!important}.m-auto{margin:auto!important}.-mx-1{margin-left:-.25rem!important;margin-right:-.25rem!important}.-mx-2{margin-left:-.5rem!important;margin-right:-.5rem!important}.-my-1{margin-bottom:-.25rem!important;margin-top:-.25rem!important}.-my-5{margin-bottom:-1.25rem!important;margin-top:-1.25rem!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-1\\.5{margin-left:.375rem!important;margin-right:.375rem!important}.mx-10{margin-left:2.5rem!important;margin-right:2.5rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:.75rem!important;margin-right:.75rem!important}.mx-4{margin-left:1rem!important;margin-right:1rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-bottom:0!important;margin-top:0!important}.my-0\\.5{margin-bottom:.125rem!important;margin-top:.125rem!important}.my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-10{margin-bottom:2.5rem!important;margin-top:2.5rem!important}.my-16{margin-bottom:4rem!important;margin-top:4rem!important}.my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-2\\.5{margin-bottom:.625rem!important;margin-top:.625rem!important}.my-20{margin-bottom:5rem!important;margin-top:5rem!important}.my-3{margin-bottom:.75rem!important;margin-top:.75rem!important}.my-4{margin-bottom:1rem!important;margin-top:1rem!important}.my-6{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-8{margin-bottom:2rem!important;margin-top:2rem!important}.my-auto{margin-bottom:auto!important;margin-top:auto!important}.-mb-12{margin-bottom:-3rem!important}.-mb-14{margin-bottom:-3.5rem!important}.-mb-6{margin-bottom:-1.5rem!important}.-mr-0{margin-right:0!important}.-mr-0\\.5{margin-right:-.125rem!important}.-mr-1{margin-right:-.25rem!important}.-mr-2{margin-right:-.5rem!important}.-mt-1{margin-top:-.25rem!important}.-mt-2{margin-top:-.5rem!important}.-mt-3{margin-top:-.75rem!important}.-mt-8{margin-top:-2rem!important}.mb-0{margin-bottom:0!important}.mb-0\\.5{margin-bottom:.125rem!important}.mb-1{margin-bottom:.25rem!important}.mb-1\\.5{margin-bottom:.375rem!important}.mb-10{margin-bottom:2.5rem!important}.mb-12{margin-bottom:3rem!important}.mb-16{margin-bottom:4rem!important}.mb-2{margin-bottom:.5rem!important}.mb-2\\.5{margin-bottom:.625rem!important}.mb-3{margin-bottom:.75rem!important}.mb-4{margin-bottom:1rem!important}.mb-5{margin-bottom:1.25rem!important}.mb-6{margin-bottom:1.5rem!important}.mb-8{margin-bottom:2rem!important}.ml-0{margin-left:0!important}.ml-0\\.5{margin-left:.125rem!important}.ml-1{margin-left:.25rem!important}.ml-1\\.5{margin-left:.375rem!important}.ml-10{margin-left:2.5rem!important}.ml-11{margin-left:2.75rem!important}.ml-12{margin-left:3rem!important}.ml-16{margin-left:4rem!important}.ml-2{margin-left:.5rem!important}.ml-3{margin-left:.75rem!important}.ml-4{margin-left:1rem!important}.ml-5{margin-left:1.25rem!important}.ml-8{margin-left:2rem!important}.ml-9{margin-left:2.25rem!important}.ml-auto{margin-left:auto!important}.mr-0{margin-right:0!important}.mr-1{margin-right:.25rem!important}.mr-1\\.5{margin-right:.375rem!important}.mr-10{margin-right:2.5rem!important}.mr-2{margin-right:.5rem!important}.mr-20{margin-right:5rem!important}.mr-3{margin-right:.75rem!important}.mr-4{margin-right:1rem!important}.mr-5{margin-right:1.25rem!important}.mr-6{margin-right:1.5rem!important}.mr-8{margin-right:2rem!important}.mr-auto{margin-right:auto!important}.mt-0{margin-top:0!important}.mt-0\\.5{margin-top:.125rem!important}.mt-1{margin-top:.25rem!important}.mt-1\\.5{margin-top:.375rem!important}.mt-10{margin-top:2.5rem!important}.mt-12{margin-top:3rem!important}.mt-16{margin-top:4rem!important}.mt-2{margin-top:.5rem!important}.mt-2\\.5{margin-top:.625rem!important}.mt-20{margin-top:5rem!important}.mt-3{margin-top:.75rem!important}.mt-4{margin-top:1rem!important}.mt-5{margin-top:1.25rem!important}.mt-6{margin-top:1.5rem!important}.mt-8{margin-top:2rem!important}.mt-auto{margin-top:auto!important}.box-content{box-sizing:initial!important}.line-clamp-1{-webkit-line-clamp:1!important}.line-clamp-1,.line-clamp-2{display:-webkit-box!important;overflow:hidden!important;-webkit-box-orient:vertical!important}.line-clamp-2{-webkit-line-clamp:2!important}.line-clamp-3{display:-webkit-box!important;overflow:hidden!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:3!important}.block{display:block!important}.inline-block{display:inline-block!important}.inline{display:inline!important}.flex{display:flex!important}.inline-flex{display:inline-flex!important}.\\!table,.table{display:table!important}.grid{display:grid!important}.inline-grid{display:inline-grid!important}.\\!contents,.contents{display:contents!important}.hidden{display:none!important}.size-16{height:4rem!important;width:4rem!important}.size-3{height:.75rem!important;width:.75rem!important}.size-4{height:1rem!important;width:1rem!important}.size-5{height:1.25rem!important;width:1.25rem!important}.size-6{height:1.5rem!important;width:1.5rem!important}.size-\\[18px\\]{height:18px!important;width:18px!important}.size-\\[400\\%\\]{height:400%!important;width:400%!important}.size-full{height:100%!important;width:100%!important}.h-0{height:0!important}.h-1{height:.25rem!important}.h-1\\.5{height:.375rem!important}.h-10{height:2.5rem!important}.h-100{height:25rem!important}.h-12{height:3rem!important}.h-120{height:30rem!important}.h-14{height:3.5rem!important}.h-15{height:3.75rem!important}.h-16{height:4rem!important}.h-18{height:4.5rem!important}.h-2{height:.5rem!important}.h-2\\.5{height:.625rem!important}.h-20{height:5rem!important}.h-24{height:6rem!important}.h-3{height:.75rem!important}.h-3\\.5{height:.875rem!important}.h-30{height:7.5rem!important}.h-32{height:8rem!important}.h-4{height:1rem!important}.h-40{height:10rem!important}.h-5{height:1.25rem!important}.h-50{height:12.5rem!important}.h-52{height:13rem!important}.h-6{height:1.5rem!important}.h-60{height:15rem!important}.h-7{height:1.75rem!important}.h-8{height:2rem!important}.h-80{height:20rem!important}.h-9{height:2.25rem!important}.h-96{height:24rem!important}.h-\\[180px\\]{height:180px!important}.h-\\[1em\\]{height:1em!important}.h-\\[200px\\]{height:200px!important}.h-\\[222px\\]{height:222px!important}.h-\\[300px\\]{height:300px!important}.h-\\[30rem\\]{height:30rem!important}.h-\\[33px\\]{height:33px!important}.h-\\[360px\\]{height:360px!important}.h-\\[50vh\\]{height:50vh!important}.h-\\[55px\\]{height:55px!important}.h-\\[80\\%\\]{height:80%!important}.h-\\[80vh\\]{height:80vh!important}.h-\\[90vh\\]{height:90vh!important}.h-auto{height:auto!important}.h-fit{height:-moz-fit-content!important;height:fit-content!important}.h-full{height:100%!important}.h-screen{height:100vh!important}.max-h-10{max-height:2.5rem!important}.max-h-100{max-height:25rem!important}.max-h-140{max-height:35rem!important}.max-h-16{max-height:4rem!important}.max-h-200{max-height:50rem!important}.max-h-60{max-height:15rem!important}.max-h-64{max-height:16rem!important}.max-h-80{max-height:20rem!important}.max-h-\\[100vh\\]{max-height:100vh!important}.max-h-\\[16rem\\]{max-height:16rem!important}.max-h-\\[80vh\\]{max-height:80vh!important}.max-h-full{max-height:100%!important}.min-h-10{min-height:2.5rem!important}.min-h-100{min-height:25rem!important}.min-h-120{min-height:30rem!important}.min-h-16{min-height:4rem!important}.min-h-20{min-height:5rem!important}.min-h-24{min-height:6rem!important}.min-h-30{min-height:7.5rem!important}.min-h-4{min-height:1rem!important}.min-h-50{min-height:12.5rem!important}.min-h-56{min-height:14rem!important}.min-h-6{min-height:1.5rem!important}.min-h-60{min-height:15rem!important}.min-h-8{min-height:2rem!important}.min-h-80{min-height:20rem!important}.min-h-\\[30rem\\]{min-height:30rem!important}.min-h-\\[32rem\\]{min-height:32rem!important}.min-h-\\[420px\\]{min-height:420px!important}.min-h-\\[80vh\\]{min-height:80vh!important}.w-0{width:0!important}.w-1\\/2{width:50%!important}.w-1\\/3{width:33.333333%!important}.w-1\\/4{width:25%!important}.w-1\\/5{width:20%!important}.w-1\\/6{width:16.666667%!important}.w-10{width:2.5rem!important}.w-100{width:25rem!important}.w-12{width:3rem!important}.w-120{width:30rem!important}.w-14{width:3.5rem!important}.w-140{width:35rem!important}.w-15{width:3.75rem!important}.w-16{width:4rem!important}.w-160{width:40rem!important}.w-18{width:4.5rem!important}.w-192{width:48rem!important}.w-2{width:.5rem!important}.w-2\\.5{width:.625rem!important}.w-2\\/3{width:66.666667%!important}.w-2\\/5{width:40%!important}.w-20{width:5rem!important}.w-200{width:50rem!important}.w-24{width:6rem!important}.w-28{width:7rem!important}.w-3{width:.75rem!important}.w-3\\.5{width:.875rem!important}.w-3\\/4{width:75%!important}.w-3\\/5{width:60%!important}.w-30{width:7.5rem!important}.w-32{width:8rem!important}.w-4{width:1rem!important}.w-40{width:10rem!important}.w-44{width:11rem!important}.w-48{width:12rem!important}.w-5{width:1.25rem!important}.w-5\\/6{width:83.333333%!important}.w-50{width:12.5rem!important}.w-52{width:13rem!important}.w-6{width:1.5rem!important}.w-60{width:15rem!important}.w-64{width:16rem!important}.w-7{width:1.75rem!important}.w-8{width:2rem!important}.w-80{width:20rem!important}.w-\\[12\\.5\\%\\]{width:12.5%!important}.w-\\[12rem\\]{width:12rem!important}.w-\\[15\\%\\]{width:15%!important}.w-\\[1em\\]{width:1em!important}.w-\\[200px\\]{width:200px!important}.w-\\[20px\\]{width:20px!important}.w-\\[24rem\\]{width:24rem!important}.w-\\[350px\\]{width:350px!important}.w-\\[50vw\\]{width:50vw!important}.w-\\[min\\(44rem\\2c 100\\%\\)\\]{width:min(44rem,100%)!important}.w-\\[min\\(48rem\\2c 100\\%\\)\\]{width:min(48rem,100%)!important}.w-auto{width:auto!important}.w-fit{width:-moz-fit-content!important;width:fit-content!important}.w-full{width:100%!important}.w-max{width:-moz-max-content!important;width:max-content!important}.w-px{width:1px!important}.min-w-0{min-width:0!important}.min-w-1{min-width:.25rem!important}.min-w-1\\.5{min-width:.375rem!important}.min-w-1\\/3{min-width:33.333333%!important}.min-w-100{min-width:25rem!important}.min-w-120{min-width:30rem!important}.min-w-16{min-width:4rem!important}.min-w-18{min-width:4.5rem!important}.min-w-30{min-width:7.5rem!important}.min-w-32{min-width:8rem!important}.min-w-4{min-width:1rem!important}.min-w-40{min-width:10rem!important}.min-w-44{min-width:11rem!important}.min-w-5{min-width:1.25rem!important}.min-w-50{min-width:12.5rem!important}.min-w-56{min-width:14rem!important}.min-w-6{min-width:1.5rem!important}.min-w-60{min-width:15rem!important}.min-w-64{min-width:16rem!important}.min-w-80{min-width:20rem!important}.min-w-96{min-width:24rem!important}.min-w-\\[0\\.5rem\\]{min-width:.5rem!important}.min-w-\\[1000px\\]{min-width:1000px!important}.min-w-\\[10rem\\]{min-width:10rem!important}.min-w-\\[12\\.5rem\\]{min-width:12.5rem!important}.min-w-\\[15rem\\]{min-width:15rem!important}.min-w-\\[16rem\\]{min-width:16rem!important}.min-w-\\[1rem\\]{min-width:1rem!important}.min-w-\\[200px\\]{min-width:200px!important}.min-w-\\[20rem\\]{min-width:20rem!important}.min-w-\\[25rem\\]{min-width:25rem!important}.min-w-\\[2rem\\]{min-width:2rem!important}.min-w-\\[300px\\]{min-width:300px!important}.min-w-\\[34rem\\]{min-width:34rem!important}.min-w-\\[40rem\\]{min-width:40rem!important}.min-w-\\[50rem\\]{min-width:50rem!important}.min-w-\\[5rem\\]{min-width:5rem!important}.min-w-\\[7\\.5rem\\]{min-width:7.5rem!important}.min-w-full{min-width:100%!important}.max-w-1\\/2{max-width:50%!important}.max-w-100{max-width:25rem!important}.max-w-120{max-width:30rem!important}.max-w-140{max-width:35rem!important}.max-w-160{max-width:40rem!important}.max-w-192{max-width:48rem!important}.max-w-20{max-width:5rem!important}.max-w-200{max-width:50rem!important}.max-w-24{max-width:6rem!important}.max-w-248{max-width:62rem!important}.max-w-28{max-width:7rem!important}.max-w-2xl{max-width:42rem!important}.max-w-30{max-width:7.5rem!important}.max-w-300{max-width:75rem!important}.max-w-40{max-width:10rem!important}.max-w-44{max-width:11rem!important}.max-w-48{max-width:12rem!important}.max-w-4xl{max-width:56rem!important}.max-w-52{max-width:13rem!important}.max-w-56{max-width:14rem!important}.max-w-60{max-width:15rem!important}.max-w-64{max-width:16rem!important}.max-w-6xl{max-width:72rem!important}.max-w-72{max-width:18rem!important}.max-w-80{max-width:20rem!important}.max-w-96{max-width:24rem!important}.max-w-\\[30rem\\]{max-width:30rem!important}.max-w-\\[43rem\\]{max-width:43rem!important}.max-w-\\[50rem\\]{max-width:50rem!important}.max-w-\\[60vw\\]{max-width:60vw!important}.max-w-\\[800px\\]{max-width:800px!important}.max-w-\\[90\\%\\]{max-width:90%!important}.max-w-\\[920px\\]{max-width:920px!important}.max-w-full{max-width:100%!important}.max-w-lg{max-width:32rem!important}.max-w-max{max-width:-moz-max-content!important;max-width:max-content!important}.max-w-md{max-width:28rem!important}.max-w-none{max-width:none!important}.max-w-screen-md{max-width:768px!important}.max-w-screen-xl{max-width:1200px!important}.max-w-sm{max-width:24rem!important}.max-w-xl{max-width:36rem!important}.max-w-xs{max-width:20rem!important}.flex-1{flex:1 1 0%!important}.flex-2{flex:2 2 0%!important}.flex-auto{flex:1 1 auto!important}.flex-none{flex:none!important}.flex-shrink{flex-shrink:1!important}.flex-shrink-0{flex-shrink:0!important}.shrink{flex-shrink:1!important}.shrink-0{flex-shrink:0!important}.flex-grow,.grow{flex-grow:1!important}.grow-0{flex-grow:0!important}.grow-\\[1000\\]{flex-grow:1000!important}.basis-full{flex-basis:100%!important}.table-auto{table-layout:auto!important}.table-fixed{table-layout:fixed!important}.border-collapse{border-collapse:collapse!important}.border-spacing-2{--tw-border-spacing-x:0.5rem!important;--tw-border-spacing-y:0.5rem!important;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y)!important}.origin-top-left{transform-origin:top left!important}.-translate-x-1\\/2{--tw-translate-x:-50%!important}.-translate-x-1\\/2,.-translate-y-1\\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-translate-y-1\\/2{--tw-translate-y:-50%!important}.-translate-y-2{--tw-translate-y:-0.5rem!important}.-translate-y-2,.translate-x-\\[-3\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-x-\\[-3\\%\\]{--tw-translate-x:-3%!important}.translate-y-10{--tw-translate-y:2.5rem!important}.translate-y-10,.translate-y-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.translate-y-2{--tw-translate-y:0.5rem!important}.translate-y-\\[10\\%\\]{--tw-translate-y:10%!important}.-rotate-90,.translate-y-\\[10\\%\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.-rotate-90{--tw-rotate:-90deg!important}.rotate-270{--tw-rotate:270deg!important}.rotate-270,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.rotate-90{--tw-rotate:90deg!important}.scale-90{--tw-scale-x:.9!important;--tw-scale-y:.9!important}.scale-90,.scale-\\[0\\.8\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-\\[0\\.8\\]{--tw-scale-x:0.8!important;--tw-scale-y:0.8!important}.scale-\\[1\\.8\\]{--tw-scale-x:1.8!important;--tw-scale-y:1.8!important}.scale-\\[1\\.8\\],.scale-x-\\[-1\\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.scale-x-\\[-1\\]{--tw-scale-x:-1!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}@keyframes pulse{50%{opacity:.5}}.animate-\\[pulse_1s_ease-out_infinite\\]{animation:pulse 1s ease-out infinite!important}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite!important}.animate-spin{animation:spin 1s linear infinite!important}.cursor-auto{cursor:auto!important}.cursor-default{cursor:default!important}.cursor-grab{cursor:grab!important}.cursor-grabbing{cursor:grabbing!important}.cursor-help{cursor:help!important}.cursor-move{cursor:move!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-pointer{cursor:pointer!important}.cursor-s-resize{cursor:s-resize!important}.cursor-text{cursor:text!important}.cursor-zoom-in{cursor:zoom-in!important}.select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.select-text{-webkit-user-select:text!important;-moz-user-select:text!important;user-select:text!important}.resize-none{resize:none!important}.resize-y{resize:vertical!important}.resize{resize:both!important}.list-inside{list-style-position:inside!important}.list-disc{list-style-type:disc!important}.list-none{list-style-type:none!important}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))!important}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))!important}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))!important}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))!important}.grid-cols-\\[8\\.5rem_1fr\\]{grid-template-columns:8.5rem 1fr!important}.grid-cols-\\[auto_1fr\\]{grid-template-columns:auto 1fr!important}.grid-cols-\\[min-content_auto\\]{grid-template-columns:min-content auto!important}.grid-cols-\\[repeat\\(2\\2c _minmax\\(min-content\\2c _160px\\)\\)\\]{grid-template-columns:repeat(2,minmax(min-content,160px))!important}.grid-rows-\\[160px\\]{grid-template-rows:160px!important}.grid-rows-\\[49px_calc\\(40rem-49px\\)\\]{grid-template-rows:49px calc(40rem - 49px)!important}.grid-rows-\\[repeat\\(2\\2c _48px\\)\\]{grid-template-rows:repeat(2,48px)!important}.flex-row{flex-direction:row!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-col{flex-direction:column!important}.flex-wrap{flex-wrap:wrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-nowrap{flex-wrap:nowrap!important}.place-items-center{place-items:center!important}.items-start{align-items:flex-start!important}.items-end{align-items:flex-end!important}.items-center{align-items:center!important}.items-baseline{align-items:baseline!important}.items-stretch{align-items:stretch!important}.justify-start{justify-content:flex-start!important}.justify-end{justify-content:flex-end!important}.justify-center{justify-content:center!important}.justify-between{justify-content:space-between!important}.justify-around{justify-content:space-around!important}.justify-items-center{justify-items:center!important}.gap-0{gap:0!important}.gap-0\\.5{gap:.125rem!important}.gap-1{gap:.25rem!important}.gap-1\\.5{gap:.375rem!important}.gap-10{gap:2.5rem!important}.gap-16{gap:4rem!important}.gap-2{gap:.5rem!important}.gap-2\\.5{gap:.625rem!important}.gap-3{gap:.75rem!important}.gap-3\\.5{gap:.875rem!important}.gap-4{gap:1rem!important}.gap-5{gap:1.25rem!important}.gap-6{gap:1.5rem!important}.gap-8{gap:2rem!important}.gap-\\[10\\%\\]{gap:10%!important}.gap-x-1{-moz-column-gap:.25rem!important;column-gap:.25rem!important}.gap-x-12{-moz-column-gap:3rem!important;column-gap:3rem!important}.gap-x-2{-moz-column-gap:.5rem!important;column-gap:.5rem!important}.gap-x-3{-moz-column-gap:.75rem!important;column-gap:.75rem!important}.gap-x-4{-moz-column-gap:1rem!important;column-gap:1rem!important}.gap-x-8{-moz-column-gap:2rem!important;column-gap:2rem!important}.gap-y-1{row-gap:.25rem!important}.gap-y-1\\.5{row-gap:.375rem!important}.gap-y-12{row-gap:3rem!important}.gap-y-2{row-gap:.5rem!important}.gap-y-4{row-gap:1rem!important}.gap-y-px{row-gap:1px!important}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(0px*var(--tw-space-x-reverse))!important}.space-x-0\\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.125rem*var(--tw-space-x-reverse))!important}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.25rem*var(--tw-space-x-reverse))!important}.space-x-1\\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.375rem*var(--tw-space-x-reverse))!important}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(3rem*var(--tw-space-x-reverse))!important}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.5rem*var(--tw-space-x-reverse))!important}.space-x-2\\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.625rem*var(--tw-space-x-reverse))!important}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(.75rem*var(--tw-space-x-reverse))!important}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(1rem*var(--tw-space-x-reverse))!important}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(1.5rem*var(--tw-space-x-reverse))!important}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0!important;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))!important;margin-right:calc(2rem*var(--tw-space-x-reverse))!important}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(0px*var(--tw-space-y-reverse))!important;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))!important}.space-y-0\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.125rem*var(--tw-space-y-reverse))!important;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.375rem*var(--tw-space-y-reverse))!important;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(3rem*var(--tw-space-y-reverse))!important;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.75rem*var(--tw-space-y-reverse))!important;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1rem*var(--tw-space-y-reverse))!important;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))!important;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(2rem*var(--tw-space-y-reverse))!important;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))!important}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(1px*var(--tw-space-y-reverse))!important;margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))!important}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0!important;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))!important;border-right-width:calc(1px*var(--tw-divide-x-reverse))!important}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0!important;border-bottom-width:calc(1px*var(--tw-divide-y-reverse))!important;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))!important}.self-start{align-self:flex-start!important}.self-center{align-self:center!important}.self-stretch{align-self:stretch!important}.justify-self-center{justify-self:center!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-clip{overflow:clip!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-scroll{overflow-y:scroll!important}.overscroll-contain{overscroll-behavior:contain!important}.overscroll-none{overscroll-behavior:none!important}.truncate{overflow:hidden!important;white-space:nowrap!important}.overflow-ellipsis,.text-ellipsis,.truncate{text-overflow:ellipsis!important}.whitespace-nowrap{white-space:nowrap!important}.whitespace-pre{white-space:pre!important}.whitespace-pre-wrap{white-space:pre-wrap!important}.text-wrap{text-wrap:wrap!important}.text-nowrap{text-wrap:nowrap!important}.text-balance{text-wrap:balance!important}.text-pretty{text-wrap:pretty!important}.break-words{overflow-wrap:break-word!important}.break-all{word-break:break-all!important}.break-keep{word-break:keep-all!important}.rounded{border-radius:var(--radius)!important}.rounded-\\[0px\\]{border-radius:0!important}.rounded-\\[var\\(--radius\\)\\]{border-radius:var(--radius)!important}.rounded-full{border-radius:9999px!important}.rounded-lg{border-radius:var(--radius-lg)!important}.rounded-none{border-radius:0!important}.rounded-sm{border-radius:var(--radius-sm)!important}.rounded-b{border-bottom-right-radius:var(--radius)!important}.rounded-b,.rounded-l{border-bottom-left-radius:var(--radius)!important}.rounded-l{border-top-left-radius:var(--radius)!important}.rounded-l-none{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-r{border-bottom-right-radius:var(--radius)!important;border-top-right-radius:var(--radius)!important}.rounded-r-none{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.rounded-t{border-top-left-radius:var(--radius)!important;border-top-right-radius:var(--radius)!important}.rounded-t-none{border-top-left-radius:0!important;border-top-right-radius:0!important}.border{border-width:1px!important}.border-0{border-width:0!important}.border-2{border-width:2px!important}.border-y{border-top-width:1px!important}.border-b,.border-y{border-bottom-width:1px!important}.border-b-2{border-bottom-width:2px!important}.border-l{border-left-width:1px!important}.border-l-2{border-left-width:2px!important}.border-l-4{border-left-width:4px!important}.border-l-\\[5px\\]{border-left-width:5px!important}.border-r{border-right-width:1px!important}.border-t{border-top-width:1px!important}.border-t-0{border-top-width:0!important}.border-dashed{border-style:dashed!important}.border-dotted{border-style:dotted!important}.border-none{border-style:none!important}.border-\\[var\\(--glass-border-3000\\)\\]{border-color:var(--glass-border-3000)!important}.border-l-\\[\\#8F98FF\\]{--tw-border-opacity:1!important;border-left-color:rgb(143 152 255/var(--tw-border-opacity))!important}.border-l-\\[\\#94D674\\]{--tw-border-opacity:1!important;border-left-color:rgb(148 214 116/var(--tw-border-opacity))!important}.border-l-\\[\\#FF9870\\]{--tw-border-opacity:1!important;border-left-color:rgb(255 152 112/var(--tw-border-opacity))!important}.bg-\\[\\#000\\]{--tw-bg-opacity:1!important;background-color:rgb(0 0 0/var(--tw-bg-opacity))!important}.bg-\\[hsla\\(100\\2c 74\\%\\2c 98\\%\\2c 1\\)\\]{background-color:#f9fef6!important}.bg-\\[hsla\\(19\\2c 99\\%\\2c 99\\%\\2c 1\\)\\]{background-color:#fffcfa!important}.bg-\\[hsla\\(235\\2c 100\\%\\2c 99\\%\\2c 1\\)\\]{background-color:#fafaff!important}.bg-\\[var\\(--bg-light\\)\\]{background-color:var(--bg-light)!important}.bg-\\[var\\(--bg-table\\)\\]{background-color:var(--bg-table)!important}.bg-\\[var\\(--glass-bg-3000\\)\\]{background-color:var(--glass-bg-3000)!important}.bg-\\[var\\(--tooltip-bg\\)\\]{background-color:var(--tooltip-bg)!important}.bg-\\[white\\]{--tw-bg-opacity:1!important;background-color:rgb(255 255 255/var(--tw-bg-opacity))!important}.bg-contain{background-size:contain!important}.bg-cover{background-size:cover!important}.bg-no-repeat{background-repeat:no-repeat!important}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.p-0{padding:0!important}.p-0\\.5{padding:.125rem!important}.p-1{padding:.25rem!important}.p-1\\.5{padding:.375rem!important}.p-10{padding:2.5rem!important}.p-16{padding:4rem!important}.p-2{padding:.5rem!important}.p-20{padding:5rem!important}.p-3{padding:.75rem!important}.p-4{padding:1rem!important}.p-5{padding:1.25rem!important}.p-6{padding:1.5rem!important}.p-8{padding:2rem!important}.p-\\[calc\\(0\\.5rem-1px\\)\\]{padding:calc(.5rem - 1px)!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-1\\.5{padding-left:.375rem!important;padding-right:.375rem!important}.px-12{padding-left:3rem!important;padding-right:3rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-4{padding-left:1rem!important;padding-right:1rem!important}.px-5{padding-left:1.25rem!important;padding-right:1.25rem!important}.px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-8{padding-left:2rem!important;padding-right:2rem!important}.px-\\[calc\\(1\\.5rem\\+1px\\)\\]{padding-left:calc(1.5rem + 1px)!important;padding-right:calc(1.5rem + 1px)!important}.px-px{padding-left:1px!important;padding-right:1px!important}.py-0{padding-bottom:0!important;padding-top:0!important}.py-0\\.5{padding-bottom:.125rem!important;padding-top:.125rem!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-1\\.5{padding-bottom:.375rem!important;padding-top:.375rem!important}.py-10{padding-bottom:2.5rem!important;padding-top:2.5rem!important}.py-12{padding-bottom:3rem!important;padding-top:3rem!important}.py-15{padding-bottom:3.75rem!important;padding-top:3.75rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-20{padding-bottom:5rem!important;padding-top:5rem!important}.py-3{padding-bottom:.75rem!important;padding-top:.75rem!important}.py-4{padding-bottom:1rem!important;padding-top:1rem!important}.py-5{padding-bottom:1.25rem!important;padding-top:1.25rem!important}.py-6{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-8{padding-bottom:2rem!important;padding-top:2rem!important}.py-px{padding-bottom:1px!important;padding-top:1px!important}.pb-1{padding-bottom:.25rem!important}.pb-1\\.5{padding-bottom:.375rem!important}.pb-2{padding-bottom:.5rem!important}.pb-2\\.5{padding-bottom:.625rem!important}.pb-3{padding-bottom:.75rem!important}.pb-4{padding-bottom:1rem!important}.pb-6{padding-bottom:1.5rem!important}.pb-8{padding-bottom:2rem!important}.pb-\\[30rem\\]{padding-bottom:30rem!important}.pl-0{padding-left:0!important}.pl-0\\.5{padding-left:.125rem!important}.pl-1{padding-left:.25rem!important}.pl-1\\.5{padding-left:.375rem!important}.pl-10{padding-left:2.5rem!important}.pl-16{padding-left:4rem!important}.pl-2{padding-left:.5rem!important}.pl-3{padding-left:.75rem!important}.pl-4{padding-left:1rem!important}.pl-6{padding-left:1.5rem!important}.pl-7{padding-left:1.75rem!important}.pl-8{padding-left:2rem!important}.pr-1{padding-right:.25rem!important}.pr-1\\.5{padding-right:.375rem!important}.pr-10{padding-right:2.5rem!important}.pr-14{padding-right:3.5rem!important}.pr-2{padding-right:.5rem!important}.pr-3{padding-right:.75rem!important}.pr-4{padding-right:1rem!important}.pr-5{padding-right:1.25rem!important}.pr-7{padding-right:1.75rem!important}.pr-9{padding-right:2.25rem!important}.pt-1{padding-top:.25rem!important}.pt-1\\.5{padding-top:.375rem!important}.pt-12{padding-top:3rem!important}.pt-16{padding-top:4rem!important}.pt-2{padding-top:.5rem!important}.pt-4{padding-top:1rem!important}.pt-5{padding-top:1.25rem!important}.pt-6{padding-top:1.5rem!important}.pt-8{padding-top:2rem!important}.pt-px{padding-top:1px!important}.text-left{text-align:left!important}.text-center{text-align:center!important}.text-right{text-align:right!important}.text-start{text-align:start!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-\\[-0\\.25em\\]{vertical-align:-.25em!important}.font-mono{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace!important}.font-sans{font-family:-apple-system,BlinkMacSystemFont,Inter,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol!important}.font-title{font-family:MatterSQ,-apple-system,BlinkMacSystemFont,Inter,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol!important}.text-2xl{font-size:1.5rem!important;line-height:2rem!important}.text-3xl{font-size:1.875rem!important;line-height:2.25rem!important}.text-4xl{font-size:2.25rem!important;line-height:2.5rem!important}.text-5xl{font-size:3rem!important;line-height:1!important}.text-6xl{font-size:3.75rem!important;line-height:1!important}.text-7xl{font-size:4.5rem!important;line-height:1!important}.text-\\[0\\.6875rem\\]{font-size:.6875rem!important}.text-\\[0\\.8125rem\\]{font-size:.8125rem!important}.text-\\[11px\\]{font-size:11px!important}.text-\\[13px\\]{font-size:13px!important}.text-\\[15px\\]{font-size:15px!important}.text-\\[17px\\]{font-size:17px!important}.text-base{font-size:1rem!important;line-height:1.5rem!important}.text-lg{font-size:1.125rem!important;line-height:1.75rem!important}.text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-xl{font-size:1.25rem!important;line-height:1.75rem!important}.text-xs{font-size:.75rem!important;line-height:1rem!important}.text-xxs{font-size:.625rem!important;line-height:.75rem!important}.font-bold{font-weight:700!important}.font-light{font-weight:300!important}.font-medium{font-weight:500!important}.font-normal{font-weight:400!important}.font-semibold{font-weight:600!important}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.capitalize{text-transform:capitalize!important}.italic{font-style:italic!important}.not-italic{font-style:normal!important}.tabular-nums{--tw-numeric-spacing:tabular-nums!important;font-feature-settings:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)!important;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)!important}.leading-10{line-height:2.5rem!important}.leading-4{line-height:1rem!important}.leading-5{line-height:1.25rem!important}.leading-6{line-height:1.5rem!important}.leading-7{line-height:1.75rem!important}.leading-8{line-height:2rem!important}.leading-\\[0px\\]{line-height:0px!important}.leading-\\[normal\\]{line-height:normal!important}.leading-none{line-height:1!important}.leading-relaxed{line-height:1.625!important}.leading-tight{line-height:1.25!important}.tracking-normal{letter-spacing:0!important}.tracking-tight{letter-spacing:-.025em!important}.tracking-wide{letter-spacing:.025em!important}.tracking-wider{letter-spacing:.05em!important}.text-\\[\\#2EA2D3\\]{--tw-text-opacity:1!important;color:rgb(46 162 211/var(--tw-text-opacity))!important}.text-\\[\\#2F80FA\\]{--tw-text-opacity:1!important;color:rgb(47 128 250/var(--tw-text-opacity))!important}.text-\\[\\#30ABC6\\]{--tw-text-opacity:1!important;color:rgb(48 171 198/var(--tw-text-opacity))!important}.text-\\[\\#36C46F\\]{--tw-text-opacity:1!important;color:rgb(54 196 111/var(--tw-text-opacity))!important}.text-\\[\\#681291\\]{--tw-text-opacity:1!important;color:rgb(104 18 145/var(--tw-text-opacity))!important}.text-\\[\\#8567FF\\]{--tw-text-opacity:1!important;color:rgb(133 103 255/var(--tw-text-opacity))!important}.text-\\[\\#B62AD9\\]{--tw-text-opacity:1!important;color:rgb(182 42 217/var(--tw-text-opacity))!important}.text-\\[var\\(--text-secondary-3000\\)\\]{color:var(--text-secondary-3000)!important}.text-\\[var\\(--trace-3000\\)\\]{color:var(--trace-3000)!important}.underline{text-decoration-line:underline!important}.line-through{text-decoration-line:line-through!important}.opacity-0{opacity:0!important}.opacity-100{opacity:1!important}.opacity-20{opacity:.2!important}.opacity-25{opacity:.25!important}.opacity-40{opacity:.4!important}.opacity-50{opacity:.5!important}.opacity-60{opacity:.6!important}.opacity-75{opacity:.75!important}.opacity-80{opacity:.8!important}.opacity-\\[var\\(--opacity-disabled\\)\\]{opacity:var(--opacity-disabled)!important}.bg-blend-overlay{background-blend-mode:overlay!important}.shadow{--tw-shadow:var(--shadow-elevation-3000)!important;--tw-shadow-colored:var(--shadow-elevation-3000)!important}.shadow,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1)!important;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)!important}.shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.shadow-none,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1)!important;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)!important}.outline{outline-style:solid!important}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important}.blur{--tw-blur:blur(8px)!important}.blur,.drop-shadow-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,.03)) drop-shadow(0 8px 5px rgba(0,0,0,.08))!important}.invert{--tw-invert:invert(100%)!important}.invert,.sepia{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.sepia{--tw-sepia:sepia(100%)!important}.\\!filter,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px)!important}.backdrop-blur,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important;backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)!important}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important;backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)!important}.transition{transition-duration:.15s!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.transition-all{transition-duration:.15s!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.transition-colors{transition-duration:.15s!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.transition-opacity{transition-duration:.15s!important;transition-property:opacity!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.transition-shadow{transition-duration:.15s!important;transition-property:box-shadow!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.duration-100{transition-duration:.1s!important}.duration-200{transition-duration:.2s!important}.duration-300{transition-duration:.3s!important}.duration-75{transition-duration:75ms!important}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}.\\@container,.\\@container\\/og{container-type:inline-size!important}.\\@container\\/og{container-name:og!important}.rendering-pixelated{image-rendering:pixelated!important}.\\[abi\\:v15000\\]{abi:v15000}.\\[localhost\\:9000\\]{localhost:9000}.text-primary{color:var(--primary)!important}.bg-primary{background-color:var(--primary)!important}.border-primary{border-color:var(--primary)!important}.border-l-primary{border-left-color:var(--primary)!important}.border-r-primary{border-right-color:var(--primary)!important}.border-t-primary{border-top-color:var(--primary)!important}.border-b-primary{border-bottom-color:var(--primary)!important}.border-x-primary{border-left-color:var(--primary)!important;border-right-color:var(--primary)!important}.border-y-primary{border-bottom-color:var(--primary)!important;border-top-color:var(--primary)!important}.decoration-primary{text-decoration-color:var(--primary)!important}.text-danger-highlight{color:var(--danger-highlight)!important}.bg-danger-highlight{background-color:var(--danger-highlight)!important}.border-danger-highlight{border-color:var(--danger-highlight)!important}.border-l-danger-highlight{border-left-color:var(--danger-highlight)!important}.border-r-danger-highlight{border-right-color:var(--danger-highlight)!important}.border-t-danger-highlight{border-top-color:var(--danger-highlight)!important}.border-b-danger-highlight{border-bottom-color:var(--danger-highlight)!important}.border-x-danger-highlight{border-left-color:var(--danger-highlight)!important;border-right-color:var(--danger-highlight)!important}.border-y-danger-highlight{border-bottom-color:var(--danger-highlight)!important;border-top-color:var(--danger-highlight)!important}.decoration-danger-highlight{text-decoration-color:var(--danger-highlight)!important}.text-danger-lighter{color:var(--danger-lighter)!important}.bg-danger-lighter{background-color:var(--danger-lighter)!important}.border-danger-lighter{border-color:var(--danger-lighter)!important}.border-l-danger-lighter{border-left-color:var(--danger-lighter)!important}.border-r-danger-lighter{border-right-color:var(--danger-lighter)!important}.border-t-danger-lighter{border-top-color:var(--danger-lighter)!important}.border-b-danger-lighter{border-bottom-color:var(--danger-lighter)!important}.border-x-danger-lighter{border-left-color:var(--danger-lighter)!important;border-right-color:var(--danger-lighter)!important}.border-y-danger-lighter{border-bottom-color:var(--danger-lighter)!important;border-top-color:var(--danger-lighter)!important}.decoration-danger-lighter{text-decoration-color:var(--danger-lighter)!important}.text-danger-light{color:var(--danger-light)!important}.bg-danger-light{background-color:var(--danger-light)!important}.border-danger-light{border-color:var(--danger-light)!important}.border-l-danger-light{border-left-color:var(--danger-light)!important}.border-r-danger-light{border-right-color:var(--danger-light)!important}.border-t-danger-light{border-top-color:var(--danger-light)!important}.border-b-danger-light{border-bottom-color:var(--danger-light)!important}.border-x-danger-light{border-left-color:var(--danger-light)!important;border-right-color:var(--danger-light)!important}.border-y-danger-light{border-bottom-color:var(--danger-light)!important;border-top-color:var(--danger-light)!important}.decoration-danger-light{text-decoration-color:var(--danger-light)!important}.text-danger{color:var(--danger)!important}.bg-danger{background-color:var(--danger)!important}.border-danger{border-color:var(--danger)!important}.border-l-danger{border-left-color:var(--danger)!important}.border-r-danger{border-right-color:var(--danger)!important}.border-t-danger{border-top-color:var(--danger)!important}.border-b-danger{border-bottom-color:var(--danger)!important}.border-x-danger{border-left-color:var(--danger)!important;border-right-color:var(--danger)!important}.border-y-danger{border-bottom-color:var(--danger)!important;border-top-color:var(--danger)!important}.decoration-danger{text-decoration-color:var(--danger)!important}.text-danger-dark{color:var(--danger-dark)!important}.bg-danger-dark{background-color:var(--danger-dark)!important}.border-danger-dark{border-color:var(--danger-dark)!important}.border-l-danger-dark{border-left-color:var(--danger-dark)!important}.border-r-danger-dark{border-right-color:var(--danger-dark)!important}.border-t-danger-dark{border-top-color:var(--danger-dark)!important}.border-b-danger-dark{border-bottom-color:var(--danger-dark)!important}.border-x-danger-dark{border-left-color:var(--danger-dark)!important;border-right-color:var(--danger-dark)!important}.border-y-danger-dark{border-bottom-color:var(--danger-dark)!important;border-top-color:var(--danger-dark)!important}.decoration-danger-dark{text-decoration-color:var(--danger-dark)!important}.text-warning-highlight{color:var(--warning-highlight)!important}.bg-warning-highlight{background-color:var(--warning-highlight)!important}.border-warning-highlight{border-color:var(--warning-highlight)!important}.border-l-warning-highlight{border-left-color:var(--warning-highlight)!important}.border-r-warning-highlight{border-right-color:var(--warning-highlight)!important}.border-t-warning-highlight{border-top-color:var(--warning-highlight)!important}.border-b-warning-highlight{border-bottom-color:var(--warning-highlight)!important}.border-x-warning-highlight{border-left-color:var(--warning-highlight)!important;border-right-color:var(--warning-highlight)!important}.border-y-warning-highlight{border-bottom-color:var(--warning-highlight)!important;border-top-color:var(--warning-highlight)!important}.decoration-warning-highlight{text-decoration-color:var(--warning-highlight)!important}.text-warning{color:var(--warning)!important}.bg-warning{background-color:var(--warning)!important}.border-warning{border-color:var(--warning)!important}.border-l-warning{border-left-color:var(--warning)!important}.border-r-warning{border-right-color:var(--warning)!important}.border-t-warning{border-top-color:var(--warning)!important}.border-b-warning{border-bottom-color:var(--warning)!important}.border-x-warning{border-left-color:var(--warning)!important;border-right-color:var(--warning)!important}.border-y-warning{border-bottom-color:var(--warning)!important;border-top-color:var(--warning)!important}.decoration-warning{text-decoration-color:var(--warning)!important}.text-warning-dark{color:var(--warning-dark)!important}.bg-warning-dark{background-color:var(--warning-dark)!important}.border-warning-dark{border-color:var(--warning-dark)!important}.border-l-warning-dark{border-left-color:var(--warning-dark)!important}.border-r-warning-dark{border-right-color:var(--warning-dark)!important}.border-t-warning-dark{border-top-color:var(--warning-dark)!important}.border-b-warning-dark{border-bottom-color:var(--warning-dark)!important}.border-x-warning-dark{border-left-color:var(--warning-dark)!important;border-right-color:var(--warning-dark)!important}.border-y-warning-dark{border-bottom-color:var(--warning-dark)!important;border-top-color:var(--warning-dark)!important}.decoration-warning-dark{text-decoration-color:var(--warning-dark)!important}.text-highlight{color:var(--highlight)!important}.bg-highlight{background-color:var(--highlight)!important}.border-highlight{border-color:var(--highlight)!important}.border-l-highlight{border-left-color:var(--highlight)!important}.border-r-highlight{border-right-color:var(--highlight)!important}.border-t-highlight{border-top-color:var(--highlight)!important}.border-b-highlight{border-bottom-color:var(--highlight)!important}.border-x-highlight{border-left-color:var(--highlight)!important;border-right-color:var(--highlight)!important}.border-y-highlight{border-bottom-color:var(--highlight)!important;border-top-color:var(--highlight)!important}.decoration-highlight{text-decoration-color:var(--highlight)!important}.text-success-highlight{color:var(--success-highlight)!important}.bg-success-highlight{background-color:var(--success-highlight)!important}.border-success-highlight{border-color:var(--success-highlight)!important}.border-l-success-highlight{border-left-color:var(--success-highlight)!important}.border-r-success-highlight{border-right-color:var(--success-highlight)!important}.border-t-success-highlight{border-top-color:var(--success-highlight)!important}.border-b-success-highlight{border-bottom-color:var(--success-highlight)!important}.border-x-success-highlight{border-left-color:var(--success-highlight)!important;border-right-color:var(--success-highlight)!important}.border-y-success-highlight{border-bottom-color:var(--success-highlight)!important;border-top-color:var(--success-highlight)!important}.decoration-success-highlight{text-decoration-color:var(--success-highlight)!important}.text-success-light{color:var(--success-light)!important}.bg-success-light{background-color:var(--success-light)!important}.border-success-light{border-color:var(--success-light)!important}.border-l-success-light{border-left-color:var(--success-light)!important}.border-r-success-light{border-right-color:var(--success-light)!important}.border-t-success-light{border-top-color:var(--success-light)!important}.border-b-success-light{border-bottom-color:var(--success-light)!important}.border-x-success-light{border-left-color:var(--success-light)!important;border-right-color:var(--success-light)!important}.border-y-success-light{border-bottom-color:var(--success-light)!important;border-top-color:var(--success-light)!important}.decoration-success-light{text-decoration-color:var(--success-light)!important}.text-success{color:var(--success)!important}.bg-success{background-color:var(--success)!important}.border-success{border-color:var(--success)!important}.border-l-success{border-left-color:var(--success)!important}.border-r-success{border-right-color:var(--success)!important}.border-t-success{border-top-color:var(--success)!important}.border-b-success{border-bottom-color:var(--success)!important}.border-x-success{border-left-color:var(--success)!important;border-right-color:var(--success)!important}.border-y-success{border-bottom-color:var(--success)!important;border-top-color:var(--success)!important}.decoration-success{text-decoration-color:var(--success)!important}.text-success-dark{color:var(--success-dark)!important}.bg-success-dark{background-color:var(--success-dark)!important}.border-success-dark{border-color:var(--success-dark)!important}.border-l-success-dark{border-left-color:var(--success-dark)!important}.border-r-success-dark{border-right-color:var(--success-dark)!important}.border-t-success-dark{border-top-color:var(--success-dark)!important}.border-b-success-dark{border-bottom-color:var(--success-dark)!important}.border-x-success-dark{border-left-color:var(--success-dark)!important;border-right-color:var(--success-dark)!important}.border-y-success-dark{border-bottom-color:var(--success-dark)!important;border-top-color:var(--success-dark)!important}.decoration-success-dark{text-decoration-color:var(--success-dark)!important}.text-muted{color:var(--muted)!important}.bg-muted{background-color:var(--muted)!important}.border-muted{border-color:var(--muted)!important}.border-l-muted{border-left-color:var(--muted)!important}.border-r-muted{border-right-color:var(--muted)!important}.border-t-muted{border-top-color:var(--muted)!important}.border-b-muted{border-bottom-color:var(--muted)!important}.border-x-muted{border-left-color:var(--muted)!important;border-right-color:var(--muted)!important}.border-y-muted{border-bottom-color:var(--muted)!important;border-top-color:var(--muted)!important}.decoration-muted{text-decoration-color:var(--muted)!important}.text-muted-alt{color:var(--muted-alt)!important}.bg-muted-alt{background-color:var(--muted-alt)!important}.border-muted-alt{border-color:var(--muted-alt)!important}.border-l-muted-alt{border-left-color:var(--muted-alt)!important}.border-r-muted-alt{border-right-color:var(--muted-alt)!important}.border-t-muted-alt{border-top-color:var(--muted-alt)!important}.border-b-muted-alt{border-bottom-color:var(--muted-alt)!important}.border-x-muted-alt{border-left-color:var(--muted-alt)!important;border-right-color:var(--muted-alt)!important}.border-y-muted-alt{border-bottom-color:var(--muted-alt)!important;border-top-color:var(--muted-alt)!important}.decoration-muted-alt{text-decoration-color:var(--muted-alt)!important}.text-mark{color:var(--mark)!important}.bg-mark{background-color:var(--mark)!important}.border-mark{border-color:var(--mark)!important}.border-l-mark{border-left-color:var(--mark)!important}.border-r-mark{border-right-color:var(--mark)!important}.border-t-mark{border-top-color:var(--mark)!important}.border-b-mark{border-bottom-color:var(--mark)!important}.border-x-mark{border-left-color:var(--mark)!important;border-right-color:var(--mark)!important}.border-y-mark{border-bottom-color:var(--mark)!important;border-top-color:var(--mark)!important}.decoration-mark{text-decoration-color:var(--mark)!important}.text-white{color:var(--white)!important}.bg-white{background-color:var(--white)!important}.border-white{border-color:var(--white)!important}.border-l-white{border-left-color:var(--white)!important}.border-r-white{border-right-color:var(--white)!important}.border-t-white{border-top-color:var(--white)!important}.border-b-white{border-bottom-color:var(--white)!important}.border-x-white{border-left-color:var(--white)!important;border-right-color:var(--white)!important}.border-y-white{border-bottom-color:var(--white)!important;border-top-color:var(--white)!important}.decoration-white{text-decoration-color:var(--white)!important}.text-bg-light{color:var(--bg-light)!important}.bg-bg-light{background-color:var(--bg-light)!important}.border-bg-light{border-color:var(--bg-light)!important}.border-l-bg-light{border-left-color:var(--bg-light)!important}.border-r-bg-light{border-right-color:var(--bg-light)!important}.border-t-bg-light{border-top-color:var(--bg-light)!important}.border-b-bg-light{border-bottom-color:var(--bg-light)!important}.border-x-bg-light{border-left-color:var(--bg-light)!important;border-right-color:var(--bg-light)!important}.border-y-bg-light{border-bottom-color:var(--bg-light)!important;border-top-color:var(--bg-light)!important}.decoration-bg-light{text-decoration-color:var(--bg-light)!important}.text-side{color:var(--side)!important}.bg-side{background-color:var(--side)!important}.border-side{border-color:var(--side)!important}.border-l-side{border-left-color:var(--side)!important}.border-r-side{border-right-color:var(--side)!important}.border-t-side{border-top-color:var(--side)!important}.border-b-side{border-bottom-color:var(--side)!important}.border-x-side{border-left-color:var(--side)!important;border-right-color:var(--side)!important}.border-y-side{border-bottom-color:var(--side)!important;border-top-color:var(--side)!important}.decoration-side{text-decoration-color:var(--side)!important}.text-mid{color:var(--mid)!important}.bg-mid{background-color:var(--mid)!important}.border-mid{border-color:var(--mid)!important}.border-l-mid{border-left-color:var(--mid)!important}.border-r-mid{border-right-color:var(--mid)!important}.border-t-mid{border-top-color:var(--mid)!important}.border-b-mid{border-bottom-color:var(--mid)!important}.border-x-mid{border-left-color:var(--mid)!important;border-right-color:var(--mid)!important}.border-y-mid{border-bottom-color:var(--mid)!important;border-top-color:var(--mid)!important}.decoration-mid{text-decoration-color:var(--mid)!important}.text-border{color:var(--border)!important}.bg-border{background-color:var(--border)!important}.border-border{border-color:var(--border)!important}.border-l-border{border-left-color:var(--border)!important}.border-r-border{border-right-color:var(--border)!important}.border-t-border{border-top-color:var(--border)!important}.border-b-border{border-bottom-color:var(--border)!important}.border-x-border{border-left-color:var(--border)!important;border-right-color:var(--border)!important}.border-y-border{border-bottom-color:var(--border)!important;border-top-color:var(--border)!important}.decoration-border{text-decoration-color:var(--border)!important}.text-border-light{color:var(--border-light)!important}.bg-border-light{background-color:var(--border-light)!important}.border-border-light{border-color:var(--border-light)!important}.border-l-border-light{border-left-color:var(--border-light)!important}.border-r-border-light{border-right-color:var(--border-light)!important}.border-t-border-light{border-top-color:var(--border-light)!important}.border-b-border-light{border-bottom-color:var(--border-light)!important}.border-x-border-light{border-left-color:var(--border-light)!important;border-right-color:var(--border-light)!important}.border-y-border-light{border-bottom-color:var(--border-light)!important;border-top-color:var(--border-light)!important}.decoration-border-light{text-decoration-color:var(--border-light)!important}.text-border-bold{color:var(--border-bold)!important}.bg-border-bold{background-color:var(--border-bold)!important}.border-border-bold{border-color:var(--border-bold)!important}.border-l-border-bold{border-left-color:var(--border-bold)!important}.border-r-border-bold{border-right-color:var(--border-bold)!important}.border-t-border-bold{border-top-color:var(--border-bold)!important}.border-b-border-bold{border-bottom-color:var(--border-bold)!important}.border-x-border-bold{border-left-color:var(--border-bold)!important;border-right-color:var(--border-bold)!important}.border-y-border-bold{border-bottom-color:var(--border-bold)!important;border-top-color:var(--border-bold)!important}.decoration-border-bold{text-decoration-color:var(--border-bold)!important}.text-transparent{color:var(--transparent)!important}.bg-transparent{background-color:var(--transparent)!important}.border-transparent{border-color:var(--transparent)!important}.border-l-transparent{border-left-color:var(--transparent)!important}.border-r-transparent{border-right-color:var(--transparent)!important}.border-t-transparent{border-top-color:var(--transparent)!important}.border-b-transparent{border-bottom-color:var(--transparent)!important}.border-x-transparent{border-left-color:var(--transparent)!important;border-right-color:var(--transparent)!important}.border-y-transparent{border-bottom-color:var(--transparent)!important;border-top-color:var(--transparent)!important}.decoration-transparent{text-decoration-color:var(--transparent)!important}.text-link{color:var(--link)!important}.bg-link{background-color:var(--link)!important}.border-link{border-color:var(--link)!important}.border-l-link{border-left-color:var(--link)!important}.border-r-link{border-right-color:var(--link)!important}.border-t-link{border-top-color:var(--link)!important}.border-b-link{border-bottom-color:var(--link)!important}.border-x-link{border-left-color:var(--link)!important;border-right-color:var(--link)!important}.border-y-link{border-bottom-color:var(--link)!important;border-top-color:var(--link)!important}.decoration-link{text-decoration-color:var(--link)!important}.text-brand-blue{color:var(--brand-blue)!important}.bg-brand-blue{background-color:var(--brand-blue)!important}.border-brand-blue{border-color:var(--brand-blue)!important}.border-l-brand-blue{border-left-color:var(--brand-blue)!important}.border-r-brand-blue{border-right-color:var(--brand-blue)!important}.border-t-brand-blue{border-top-color:var(--brand-blue)!important}.border-b-brand-blue{border-bottom-color:var(--brand-blue)!important}.border-x-brand-blue{border-left-color:var(--brand-blue)!important;border-right-color:var(--brand-blue)!important}.border-y-brand-blue{border-bottom-color:var(--brand-blue)!important;border-top-color:var(--brand-blue)!important}.decoration-brand-blue{text-decoration-color:var(--brand-blue)!important}.text-brand-red{color:var(--brand-red)!important}.bg-brand-red{background-color:var(--brand-red)!important}.border-brand-red{border-color:var(--brand-red)!important}.border-l-brand-red{border-left-color:var(--brand-red)!important}.border-r-brand-red{border-right-color:var(--brand-red)!important}.border-t-brand-red{border-top-color:var(--brand-red)!important}.border-b-brand-red{border-bottom-color:var(--brand-red)!important}.border-x-brand-red{border-left-color:var(--brand-red)!important;border-right-color:var(--brand-red)!important}.border-y-brand-red{border-bottom-color:var(--brand-red)!important;border-top-color:var(--brand-red)!important}.decoration-brand-red{text-decoration-color:var(--brand-red)!important}.text-brand-yellow{color:var(--brand-yellow)!important}.bg-brand-yellow{background-color:var(--brand-yellow)!important}.border-brand-yellow{border-color:var(--brand-yellow)!important}.border-l-brand-yellow{border-left-color:var(--brand-yellow)!important}.border-r-brand-yellow{border-right-color:var(--brand-yellow)!important}.border-t-brand-yellow{border-top-color:var(--brand-yellow)!important}.border-b-brand-yellow{border-bottom-color:var(--brand-yellow)!important}.border-x-brand-yellow{border-left-color:var(--brand-yellow)!important;border-right-color:var(--brand-yellow)!important}.border-y-brand-yellow{border-bottom-color:var(--brand-yellow)!important;border-top-color:var(--brand-yellow)!important}.decoration-brand-yellow{text-decoration-color:var(--brand-yellow)!important}.text-brand-key{color:var(--brand-key)!important}.bg-brand-key{background-color:var(--brand-key)!important}.border-brand-key{border-color:var(--brand-key)!important}.border-l-brand-key{border-left-color:var(--brand-key)!important}.border-r-brand-key{border-right-color:var(--brand-key)!important}.border-t-brand-key{border-top-color:var(--brand-key)!important}.border-b-brand-key{border-bottom-color:var(--brand-key)!important}.border-x-brand-key{border-left-color:var(--brand-key)!important;border-right-color:var(--brand-key)!important}.border-y-brand-key{border-bottom-color:var(--brand-key)!important;border-top-color:var(--brand-key)!important}.decoration-brand-key{text-decoration-color:var(--brand-key)!important}.text-text-3000-light{color:var(--text-3000-light)!important}.bg-text-3000-light{background-color:var(--text-3000-light)!important}.border-text-3000-light{border-color:var(--text-3000-light)!important}.border-l-text-3000-light{border-left-color:var(--text-3000-light)!important}.border-r-text-3000-light{border-right-color:var(--text-3000-light)!important}.border-t-text-3000-light{border-top-color:var(--text-3000-light)!important}.border-b-text-3000-light{border-bottom-color:var(--text-3000-light)!important}.border-x-text-3000-light{border-left-color:var(--text-3000-light)!important;border-right-color:var(--text-3000-light)!important}.border-y-text-3000-light{border-bottom-color:var(--text-3000-light)!important;border-top-color:var(--text-3000-light)!important}.decoration-text-3000-light{text-decoration-color:var(--text-3000-light)!important}.text-text-secondary-3000-light{color:var(--text-secondary-3000-light)!important}.bg-text-secondary-3000-light{background-color:var(--text-secondary-3000-light)!important}.border-text-secondary-3000-light{border-color:var(--text-secondary-3000-light)!important}.border-l-text-secondary-3000-light{border-left-color:var(--text-secondary-3000-light)!important}.border-r-text-secondary-3000-light{border-right-color:var(--text-secondary-3000-light)!important}.border-t-text-secondary-3000-light{border-top-color:var(--text-secondary-3000-light)!important}.border-b-text-secondary-3000-light{border-bottom-color:var(--text-secondary-3000-light)!important}.border-x-text-secondary-3000-light{border-left-color:var(--text-secondary-3000-light)!important;border-right-color:var(--text-secondary-3000-light)!important}.border-y-text-secondary-3000-light{border-bottom-color:var(--text-secondary-3000-light)!important;border-top-color:var(--text-secondary-3000-light)!important}.decoration-text-secondary-3000-light{text-decoration-color:var(--text-secondary-3000-light)!important}.text-muted-3000-light{color:var(--muted-3000-light)!important}.bg-muted-3000-light{background-color:var(--muted-3000-light)!important}.border-muted-3000-light{border-color:var(--muted-3000-light)!important}.border-l-muted-3000-light{border-left-color:var(--muted-3000-light)!important}.border-r-muted-3000-light{border-right-color:var(--muted-3000-light)!important}.border-t-muted-3000-light{border-top-color:var(--muted-3000-light)!important}.border-b-muted-3000-light{border-bottom-color:var(--muted-3000-light)!important}.border-x-muted-3000-light{border-left-color:var(--muted-3000-light)!important;border-right-color:var(--muted-3000-light)!important}.border-y-muted-3000-light{border-bottom-color:var(--muted-3000-light)!important;border-top-color:var(--muted-3000-light)!important}.decoration-muted-3000-light{text-decoration-color:var(--muted-3000-light)!important}.text-trace-3000-light{color:var(--trace-3000-light)!important}.bg-trace-3000-light{background-color:var(--trace-3000-light)!important}.border-trace-3000-light{border-color:var(--trace-3000-light)!important}.border-l-trace-3000-light{border-left-color:var(--trace-3000-light)!important}.border-r-trace-3000-light{border-right-color:var(--trace-3000-light)!important}.border-t-trace-3000-light{border-top-color:var(--trace-3000-light)!important}.border-b-trace-3000-light{border-bottom-color:var(--trace-3000-light)!important}.border-x-trace-3000-light{border-left-color:var(--trace-3000-light)!important;border-right-color:var(--trace-3000-light)!important}.border-y-trace-3000-light{border-bottom-color:var(--trace-3000-light)!important;border-top-color:var(--trace-3000-light)!important}.decoration-trace-3000-light{text-decoration-color:var(--trace-3000-light)!important}.text-primary-3000-light{color:var(--primary-3000-light)!important}.bg-primary-3000-light{background-color:var(--primary-3000-light)!important}.border-primary-3000-light{border-color:var(--primary-3000-light)!important}.border-l-primary-3000-light{border-left-color:var(--primary-3000-light)!important}.border-r-primary-3000-light{border-right-color:var(--primary-3000-light)!important}.border-t-primary-3000-light{border-top-color:var(--primary-3000-light)!important}.border-b-primary-3000-light{border-bottom-color:var(--primary-3000-light)!important}.border-x-primary-3000-light{border-left-color:var(--primary-3000-light)!important;border-right-color:var(--primary-3000-light)!important}.border-y-primary-3000-light{border-bottom-color:var(--primary-3000-light)!important;border-top-color:var(--primary-3000-light)!important}.decoration-primary-3000-light{text-decoration-color:var(--primary-3000-light)!important}.text-primary-highlight-light{color:var(--primary-highlight-light)!important}.bg-primary-highlight-light{background-color:var(--primary-highlight-light)!important}.border-primary-highlight-light{border-color:var(--primary-highlight-light)!important}.border-l-primary-highlight-light{border-left-color:var(--primary-highlight-light)!important}.border-r-primary-highlight-light{border-right-color:var(--primary-highlight-light)!important}.border-t-primary-highlight-light{border-top-color:var(--primary-highlight-light)!important}.border-b-primary-highlight-light{border-bottom-color:var(--primary-highlight-light)!important}.border-x-primary-highlight-light{border-left-color:var(--primary-highlight-light)!important;border-right-color:var(--primary-highlight-light)!important}.border-y-primary-highlight-light{border-bottom-color:var(--primary-highlight-light)!important;border-top-color:var(--primary-highlight-light)!important}.decoration-primary-highlight-light{text-decoration-color:var(--primary-highlight-light)!important}.text-primary-3000-hover-light{color:var(--primary-3000-hover-light)!important}.bg-primary-3000-hover-light{background-color:var(--primary-3000-hover-light)!important}.border-primary-3000-hover-light{border-color:var(--primary-3000-hover-light)!important}.border-l-primary-3000-hover-light{border-left-color:var(--primary-3000-hover-light)!important}.border-r-primary-3000-hover-light{border-right-color:var(--primary-3000-hover-light)!important}.border-t-primary-3000-hover-light{border-top-color:var(--primary-3000-hover-light)!important}.border-b-primary-3000-hover-light{border-bottom-color:var(--primary-3000-hover-light)!important}.border-x-primary-3000-hover-light{border-left-color:var(--primary-3000-hover-light)!important;border-right-color:var(--primary-3000-hover-light)!important}.border-y-primary-3000-hover-light{border-bottom-color:var(--primary-3000-hover-light)!important;border-top-color:var(--primary-3000-hover-light)!important}.decoration-primary-3000-hover-light{text-decoration-color:var(--primary-3000-hover-light)!important}.text-primary-3000-active-light{color:var(--primary-3000-active-light)!important}.bg-primary-3000-active-light{background-color:var(--primary-3000-active-light)!important}.border-primary-3000-active-light{border-color:var(--primary-3000-active-light)!important}.border-l-primary-3000-active-light{border-left-color:var(--primary-3000-active-light)!important}.border-r-primary-3000-active-light{border-right-color:var(--primary-3000-active-light)!important}.border-t-primary-3000-active-light{border-top-color:var(--primary-3000-active-light)!important}.border-b-primary-3000-active-light{border-bottom-color:var(--primary-3000-active-light)!important}.border-x-primary-3000-active-light{border-left-color:var(--primary-3000-active-light)!important;border-right-color:var(--primary-3000-active-light)!important}.border-y-primary-3000-active-light{border-bottom-color:var(--primary-3000-active-light)!important;border-top-color:var(--primary-3000-active-light)!important}.decoration-primary-3000-active-light{text-decoration-color:var(--primary-3000-active-light)!important}.text-secondary-3000-light{color:var(--secondary-3000-light)!important}.bg-secondary-3000-light{background-color:var(--secondary-3000-light)!important}.border-secondary-3000-light{border-color:var(--secondary-3000-light)!important}.border-l-secondary-3000-light{border-left-color:var(--secondary-3000-light)!important}.border-r-secondary-3000-light{border-right-color:var(--secondary-3000-light)!important}.border-t-secondary-3000-light{border-top-color:var(--secondary-3000-light)!important}.border-b-secondary-3000-light{border-bottom-color:var(--secondary-3000-light)!important}.border-x-secondary-3000-light{border-left-color:var(--secondary-3000-light)!important;border-right-color:var(--secondary-3000-light)!important}.border-y-secondary-3000-light{border-bottom-color:var(--secondary-3000-light)!important;border-top-color:var(--secondary-3000-light)!important}.decoration-secondary-3000-light{text-decoration-color:var(--secondary-3000-light)!important}.text-secondary-3000-hover-light{color:var(--secondary-3000-hover-light)!important}.bg-secondary-3000-hover-light{background-color:var(--secondary-3000-hover-light)!important}.border-secondary-3000-hover-light{border-color:var(--secondary-3000-hover-light)!important}.border-l-secondary-3000-hover-light{border-left-color:var(--secondary-3000-hover-light)!important}.border-r-secondary-3000-hover-light{border-right-color:var(--secondary-3000-hover-light)!important}.border-t-secondary-3000-hover-light{border-top-color:var(--secondary-3000-hover-light)!important}.border-b-secondary-3000-hover-light{border-bottom-color:var(--secondary-3000-hover-light)!important}.border-x-secondary-3000-hover-light{border-left-color:var(--secondary-3000-hover-light)!important;border-right-color:var(--secondary-3000-hover-light)!important}.border-y-secondary-3000-hover-light{border-bottom-color:var(--secondary-3000-hover-light)!important;border-top-color:var(--secondary-3000-hover-light)!important}.decoration-secondary-3000-hover-light{text-decoration-color:var(--secondary-3000-hover-light)!important}.text-accent-3000-light{color:var(--accent-3000-light)!important}.bg-accent-3000-light{background-color:var(--accent-3000-light)!important}.border-accent-3000-light{border-color:var(--accent-3000-light)!important}.border-l-accent-3000-light{border-left-color:var(--accent-3000-light)!important}.border-r-accent-3000-light{border-right-color:var(--accent-3000-light)!important}.border-t-accent-3000-light{border-top-color:var(--accent-3000-light)!important}.border-b-accent-3000-light{border-bottom-color:var(--accent-3000-light)!important}.border-x-accent-3000-light{border-left-color:var(--accent-3000-light)!important;border-right-color:var(--accent-3000-light)!important}.border-y-accent-3000-light{border-bottom-color:var(--accent-3000-light)!important;border-top-color:var(--accent-3000-light)!important}.decoration-accent-3000-light{text-decoration-color:var(--accent-3000-light)!important}.text-bg-3000-light{color:var(--bg-3000-light)!important}.bg-bg-3000-light{background-color:var(--bg-3000-light)!important}.border-bg-3000-light{border-color:var(--bg-3000-light)!important}.border-l-bg-3000-light{border-left-color:var(--bg-3000-light)!important}.border-r-bg-3000-light{border-right-color:var(--bg-3000-light)!important}.border-t-bg-3000-light{border-top-color:var(--bg-3000-light)!important}.border-b-bg-3000-light{border-bottom-color:var(--bg-3000-light)!important}.border-x-bg-3000-light{border-left-color:var(--bg-3000-light)!important;border-right-color:var(--bg-3000-light)!important}.border-y-bg-3000-light{border-bottom-color:var(--bg-3000-light)!important;border-top-color:var(--bg-3000-light)!important}.decoration-bg-3000-light{text-decoration-color:var(--bg-3000-light)!important}.text-border-3000-light{color:var(--border-3000-light)!important}.bg-border-3000-light{background-color:var(--border-3000-light)!important}.border-border-3000-light{border-color:var(--border-3000-light)!important}.border-l-border-3000-light{border-left-color:var(--border-3000-light)!important}.border-r-border-3000-light{border-right-color:var(--border-3000-light)!important}.border-t-border-3000-light{border-top-color:var(--border-3000-light)!important}.border-b-border-3000-light{border-bottom-color:var(--border-3000-light)!important}.border-x-border-3000-light{border-left-color:var(--border-3000-light)!important;border-right-color:var(--border-3000-light)!important}.border-y-border-3000-light{border-bottom-color:var(--border-3000-light)!important;border-top-color:var(--border-3000-light)!important}.decoration-border-3000-light{text-decoration-color:var(--border-3000-light)!important}.text-border-bold-3000-light{color:var(--border-bold-3000-light)!important}.bg-border-bold-3000-light{background-color:var(--border-bold-3000-light)!important}.border-border-bold-3000-light{border-color:var(--border-bold-3000-light)!important}.border-l-border-bold-3000-light{border-left-color:var(--border-bold-3000-light)!important}.border-r-border-bold-3000-light{border-right-color:var(--border-bold-3000-light)!important}.border-t-border-bold-3000-light{border-top-color:var(--border-bold-3000-light)!important}.border-b-border-bold-3000-light{border-bottom-color:var(--border-bold-3000-light)!important}.border-x-border-bold-3000-light{border-left-color:var(--border-bold-3000-light)!important;border-right-color:var(--border-bold-3000-light)!important}.border-y-border-bold-3000-light{border-bottom-color:var(--border-bold-3000-light)!important;border-top-color:var(--border-bold-3000-light)!important}.decoration-border-bold-3000-light{text-decoration-color:var(--border-bold-3000-light)!important}.text-glass-bg-3000-light{color:var(--glass-bg-3000-light)!important}.bg-glass-bg-3000-light{background-color:var(--glass-bg-3000-light)!important}.border-glass-bg-3000-light{border-color:var(--glass-bg-3000-light)!important}.border-l-glass-bg-3000-light{border-left-color:var(--glass-bg-3000-light)!important}.border-r-glass-bg-3000-light{border-right-color:var(--glass-bg-3000-light)!important}.border-t-glass-bg-3000-light{border-top-color:var(--glass-bg-3000-light)!important}.border-b-glass-bg-3000-light{border-bottom-color:var(--glass-bg-3000-light)!important}.border-x-glass-bg-3000-light{border-left-color:var(--glass-bg-3000-light)!important;border-right-color:var(--glass-bg-3000-light)!important}.border-y-glass-bg-3000-light{border-bottom-color:var(--glass-bg-3000-light)!important;border-top-color:var(--glass-bg-3000-light)!important}.decoration-glass-bg-3000-light{text-decoration-color:var(--glass-bg-3000-light)!important}.text-glass-border-3000-light{color:var(--glass-border-3000-light)!important}.bg-glass-border-3000-light{background-color:var(--glass-border-3000-light)!important}.border-glass-border-3000-light{border-color:var(--glass-border-3000-light)!important}.border-l-glass-border-3000-light{border-left-color:var(--glass-border-3000-light)!important}.border-r-glass-border-3000-light{border-right-color:var(--glass-border-3000-light)!important}.border-t-glass-border-3000-light{border-top-color:var(--glass-border-3000-light)!important}.border-b-glass-border-3000-light{border-bottom-color:var(--glass-border-3000-light)!important}.border-x-glass-border-3000-light{border-left-color:var(--glass-border-3000-light)!important;border-right-color:var(--glass-border-3000-light)!important}.border-y-glass-border-3000-light{border-bottom-color:var(--glass-border-3000-light)!important;border-top-color:var(--glass-border-3000-light)!important}.decoration-glass-border-3000-light{text-decoration-color:var(--glass-border-3000-light)!important}.text-link-3000-light{color:var(--link-3000-light)!important}.bg-link-3000-light{background-color:var(--link-3000-light)!important}.border-link-3000-light{border-color:var(--link-3000-light)!important}.border-l-link-3000-light{border-left-color:var(--link-3000-light)!important}.border-r-link-3000-light{border-right-color:var(--link-3000-light)!important}.border-t-link-3000-light{border-top-color:var(--link-3000-light)!important}.border-b-link-3000-light{border-bottom-color:var(--link-3000-light)!important}.border-x-link-3000-light{border-left-color:var(--link-3000-light)!important;border-right-color:var(--link-3000-light)!important}.border-y-link-3000-light{border-bottom-color:var(--link-3000-light)!important;border-top-color:var(--link-3000-light)!important}.decoration-link-3000-light{text-decoration-color:var(--link-3000-light)!important}.text-primary-3000-frame-bg-light{color:var(--primary-3000-frame-bg-light)!important}.bg-primary-3000-frame-bg-light{background-color:var(--primary-3000-frame-bg-light)!important}.border-primary-3000-frame-bg-light{border-color:var(--primary-3000-frame-bg-light)!important}.border-l-primary-3000-frame-bg-light{border-left-color:var(--primary-3000-frame-bg-light)!important}.border-r-primary-3000-frame-bg-light{border-right-color:var(--primary-3000-frame-bg-light)!important}.border-t-primary-3000-frame-bg-light{border-top-color:var(--primary-3000-frame-bg-light)!important}.border-b-primary-3000-frame-bg-light{border-bottom-color:var(--primary-3000-frame-bg-light)!important}.border-x-primary-3000-frame-bg-light{border-left-color:var(--primary-3000-frame-bg-light)!important;border-right-color:var(--primary-3000-frame-bg-light)!important}.border-y-primary-3000-frame-bg-light{border-bottom-color:var(--primary-3000-frame-bg-light)!important;border-top-color:var(--primary-3000-frame-bg-light)!important}.decoration-primary-3000-frame-bg-light{text-decoration-color:var(--primary-3000-frame-bg-light)!important}.text-primary-3000-button-bg-light{color:var(--primary-3000-button-bg-light)!important}.bg-primary-3000-button-bg-light{background-color:var(--primary-3000-button-bg-light)!important}.border-primary-3000-button-bg-light{border-color:var(--primary-3000-button-bg-light)!important}.border-l-primary-3000-button-bg-light{border-left-color:var(--primary-3000-button-bg-light)!important}.border-r-primary-3000-button-bg-light{border-right-color:var(--primary-3000-button-bg-light)!important}.border-t-primary-3000-button-bg-light{border-top-color:var(--primary-3000-button-bg-light)!important}.border-b-primary-3000-button-bg-light{border-bottom-color:var(--primary-3000-button-bg-light)!important}.border-x-primary-3000-button-bg-light{border-left-color:var(--primary-3000-button-bg-light)!important;border-right-color:var(--primary-3000-button-bg-light)!important}.border-y-primary-3000-button-bg-light{border-bottom-color:var(--primary-3000-button-bg-light)!important;border-top-color:var(--primary-3000-button-bg-light)!important}.decoration-primary-3000-button-bg-light{text-decoration-color:var(--primary-3000-button-bg-light)!important}.text-primary-3000-button-border-light{color:var(--primary-3000-button-border-light)!important}.bg-primary-3000-button-border-light{background-color:var(--primary-3000-button-border-light)!important}.border-primary-3000-button-border-light{border-color:var(--primary-3000-button-border-light)!important}.border-l-primary-3000-button-border-light{border-left-color:var(--primary-3000-button-border-light)!important}.border-r-primary-3000-button-border-light{border-right-color:var(--primary-3000-button-border-light)!important}.border-t-primary-3000-button-border-light{border-top-color:var(--primary-3000-button-border-light)!important}.border-b-primary-3000-button-border-light{border-bottom-color:var(--primary-3000-button-border-light)!important}.border-x-primary-3000-button-border-light{border-left-color:var(--primary-3000-button-border-light)!important;border-right-color:var(--primary-3000-button-border-light)!important}.border-y-primary-3000-button-border-light{border-bottom-color:var(--primary-3000-button-border-light)!important;border-top-color:var(--primary-3000-button-border-light)!important}.decoration-primary-3000-button-border-light{text-decoration-color:var(--primary-3000-button-border-light)!important}.text-primary-3000-button-border-hover-light{color:var(--primary-3000-button-border-hover-light)!important}.bg-primary-3000-button-border-hover-light{background-color:var(--primary-3000-button-border-hover-light)!important}.border-primary-3000-button-border-hover-light{border-color:var(--primary-3000-button-border-hover-light)!important}.border-l-primary-3000-button-border-hover-light{border-left-color:var(--primary-3000-button-border-hover-light)!important}.border-r-primary-3000-button-border-hover-light{border-right-color:var(--primary-3000-button-border-hover-light)!important}.border-t-primary-3000-button-border-hover-light{border-top-color:var(--primary-3000-button-border-hover-light)!important}.border-b-primary-3000-button-border-hover-light{border-bottom-color:var(--primary-3000-button-border-hover-light)!important}.border-x-primary-3000-button-border-hover-light{border-left-color:var(--primary-3000-button-border-hover-light)!important;border-right-color:var(--primary-3000-button-border-hover-light)!important}.border-y-primary-3000-button-border-hover-light{border-bottom-color:var(--primary-3000-button-border-hover-light)!important;border-top-color:var(--primary-3000-button-border-hover-light)!important}.decoration-primary-3000-button-border-hover-light{text-decoration-color:var(--primary-3000-button-border-hover-light)!important}.text-secondary-3000-frame-bg-light{color:var(--secondary-3000-frame-bg-light)!important}.bg-secondary-3000-frame-bg-light{background-color:var(--secondary-3000-frame-bg-light)!important}.border-secondary-3000-frame-bg-light{border-color:var(--secondary-3000-frame-bg-light)!important}.border-l-secondary-3000-frame-bg-light{border-left-color:var(--secondary-3000-frame-bg-light)!important}.border-r-secondary-3000-frame-bg-light{border-right-color:var(--secondary-3000-frame-bg-light)!important}.border-t-secondary-3000-frame-bg-light{border-top-color:var(--secondary-3000-frame-bg-light)!important}.border-b-secondary-3000-frame-bg-light{border-bottom-color:var(--secondary-3000-frame-bg-light)!important}.border-x-secondary-3000-frame-bg-light{border-left-color:var(--secondary-3000-frame-bg-light)!important;border-right-color:var(--secondary-3000-frame-bg-light)!important}.border-y-secondary-3000-frame-bg-light{border-bottom-color:var(--secondary-3000-frame-bg-light)!important;border-top-color:var(--secondary-3000-frame-bg-light)!important}.decoration-secondary-3000-frame-bg-light{text-decoration-color:var(--secondary-3000-frame-bg-light)!important}.text-secondary-3000-button-bg-light{color:var(--secondary-3000-button-bg-light)!important}.bg-secondary-3000-button-bg-light{background-color:var(--secondary-3000-button-bg-light)!important}.border-secondary-3000-button-bg-light{border-color:var(--secondary-3000-button-bg-light)!important}.border-l-secondary-3000-button-bg-light{border-left-color:var(--secondary-3000-button-bg-light)!important}.border-r-secondary-3000-button-bg-light{border-right-color:var(--secondary-3000-button-bg-light)!important}.border-t-secondary-3000-button-bg-light{border-top-color:var(--secondary-3000-button-bg-light)!important}.border-b-secondary-3000-button-bg-light{border-bottom-color:var(--secondary-3000-button-bg-light)!important}.border-x-secondary-3000-button-bg-light{border-left-color:var(--secondary-3000-button-bg-light)!important;border-right-color:var(--secondary-3000-button-bg-light)!important}.border-y-secondary-3000-button-bg-light{border-bottom-color:var(--secondary-3000-button-bg-light)!important;border-top-color:var(--secondary-3000-button-bg-light)!important}.decoration-secondary-3000-button-bg-light{text-decoration-color:var(--secondary-3000-button-bg-light)!important}.text-secondary-3000-button-border-light{color:var(--secondary-3000-button-border-light)!important}.bg-secondary-3000-button-border-light{background-color:var(--secondary-3000-button-border-light)!important}.border-secondary-3000-button-border-light{border-color:var(--secondary-3000-button-border-light)!important}.border-l-secondary-3000-button-border-light{border-left-color:var(--secondary-3000-button-border-light)!important}.border-r-secondary-3000-button-border-light{border-right-color:var(--secondary-3000-button-border-light)!important}.border-t-secondary-3000-button-border-light{border-top-color:var(--secondary-3000-button-border-light)!important}.border-b-secondary-3000-button-border-light{border-bottom-color:var(--secondary-3000-button-border-light)!important}.border-x-secondary-3000-button-border-light{border-left-color:var(--secondary-3000-button-border-light)!important;border-right-color:var(--secondary-3000-button-border-light)!important}.border-y-secondary-3000-button-border-light{border-bottom-color:var(--secondary-3000-button-border-light)!important;border-top-color:var(--secondary-3000-button-border-light)!important}.decoration-secondary-3000-button-border-light{text-decoration-color:var(--secondary-3000-button-border-light)!important}.text-secondary-3000-button-border-hover-light{color:var(--secondary-3000-button-border-hover-light)!important}.bg-secondary-3000-button-border-hover-light{background-color:var(--secondary-3000-button-border-hover-light)!important}.border-secondary-3000-button-border-hover-light{border-color:var(--secondary-3000-button-border-hover-light)!important}.border-l-secondary-3000-button-border-hover-light{border-left-color:var(--secondary-3000-button-border-hover-light)!important}.border-r-secondary-3000-button-border-hover-light{border-right-color:var(--secondary-3000-button-border-hover-light)!important}.border-t-secondary-3000-button-border-hover-light{border-top-color:var(--secondary-3000-button-border-hover-light)!important}.border-b-secondary-3000-button-border-hover-light{border-bottom-color:var(--secondary-3000-button-border-hover-light)!important}.border-x-secondary-3000-button-border-hover-light{border-left-color:var(--secondary-3000-button-border-hover-light)!important;border-right-color:var(--secondary-3000-button-border-hover-light)!important}.border-y-secondary-3000-button-border-hover-light{border-bottom-color:var(--secondary-3000-button-border-hover-light)!important;border-top-color:var(--secondary-3000-button-border-hover-light)!important}.decoration-secondary-3000-button-border-hover-light{text-decoration-color:var(--secondary-3000-button-border-hover-light)!important}.text-danger-3000-frame-bg-light{color:var(--danger-3000-frame-bg-light)!important}.bg-danger-3000-frame-bg-light{background-color:var(--danger-3000-frame-bg-light)!important}.border-danger-3000-frame-bg-light{border-color:var(--danger-3000-frame-bg-light)!important}.border-l-danger-3000-frame-bg-light{border-left-color:var(--danger-3000-frame-bg-light)!important}.border-r-danger-3000-frame-bg-light{border-right-color:var(--danger-3000-frame-bg-light)!important}.border-t-danger-3000-frame-bg-light{border-top-color:var(--danger-3000-frame-bg-light)!important}.border-b-danger-3000-frame-bg-light{border-bottom-color:var(--danger-3000-frame-bg-light)!important}.border-x-danger-3000-frame-bg-light{border-left-color:var(--danger-3000-frame-bg-light)!important;border-right-color:var(--danger-3000-frame-bg-light)!important}.border-y-danger-3000-frame-bg-light{border-bottom-color:var(--danger-3000-frame-bg-light)!important;border-top-color:var(--danger-3000-frame-bg-light)!important}.decoration-danger-3000-frame-bg-light{text-decoration-color:var(--danger-3000-frame-bg-light)!important}.text-danger-3000-button-border-light{color:var(--danger-3000-button-border-light)!important}.bg-danger-3000-button-border-light{background-color:var(--danger-3000-button-border-light)!important}.border-danger-3000-button-border-light{border-color:var(--danger-3000-button-border-light)!important}.border-l-danger-3000-button-border-light{border-left-color:var(--danger-3000-button-border-light)!important}.border-r-danger-3000-button-border-light{border-right-color:var(--danger-3000-button-border-light)!important}.border-t-danger-3000-button-border-light{border-top-color:var(--danger-3000-button-border-light)!important}.border-b-danger-3000-button-border-light{border-bottom-color:var(--danger-3000-button-border-light)!important}.border-x-danger-3000-button-border-light{border-left-color:var(--danger-3000-button-border-light)!important;border-right-color:var(--danger-3000-button-border-light)!important}.border-y-danger-3000-button-border-light{border-bottom-color:var(--danger-3000-button-border-light)!important;border-top-color:var(--danger-3000-button-border-light)!important}.decoration-danger-3000-button-border-light{text-decoration-color:var(--danger-3000-button-border-light)!important}.text-danger-3000-button-border-hover-light{color:var(--danger-3000-button-border-hover-light)!important}.bg-danger-3000-button-border-hover-light{background-color:var(--danger-3000-button-border-hover-light)!important}.border-danger-3000-button-border-hover-light{border-color:var(--danger-3000-button-border-hover-light)!important}.border-l-danger-3000-button-border-hover-light{border-left-color:var(--danger-3000-button-border-hover-light)!important}.border-r-danger-3000-button-border-hover-light{border-right-color:var(--danger-3000-button-border-hover-light)!important}.border-t-danger-3000-button-border-hover-light{border-top-color:var(--danger-3000-button-border-hover-light)!important}.border-b-danger-3000-button-border-hover-light{border-bottom-color:var(--danger-3000-button-border-hover-light)!important}.border-x-danger-3000-button-border-hover-light{border-left-color:var(--danger-3000-button-border-hover-light)!important;border-right-color:var(--danger-3000-button-border-hover-light)!important}.border-y-danger-3000-button-border-hover-light{border-bottom-color:var(--danger-3000-button-border-hover-light)!important;border-top-color:var(--danger-3000-button-border-hover-light)!important}.decoration-danger-3000-button-border-hover-light{text-decoration-color:var(--danger-3000-button-border-hover-light)!important}.text-shadow-elevation-3000-light{color:var(--shadow-elevation-3000-light)!important}.bg-shadow-elevation-3000-light{background-color:var(--shadow-elevation-3000-light)!important}.border-shadow-elevation-3000-light{border-color:var(--shadow-elevation-3000-light)!important}.border-l-shadow-elevation-3000-light{border-left-color:var(--shadow-elevation-3000-light)!important}.border-r-shadow-elevation-3000-light{border-right-color:var(--shadow-elevation-3000-light)!important}.border-t-shadow-elevation-3000-light{border-top-color:var(--shadow-elevation-3000-light)!important}.border-b-shadow-elevation-3000-light{border-bottom-color:var(--shadow-elevation-3000-light)!important}.border-x-shadow-elevation-3000-light{border-left-color:var(--shadow-elevation-3000-light)!important;border-right-color:var(--shadow-elevation-3000-light)!important}.border-y-shadow-elevation-3000-light{border-bottom-color:var(--shadow-elevation-3000-light)!important;border-top-color:var(--shadow-elevation-3000-light)!important}.decoration-shadow-elevation-3000-light{text-decoration-color:var(--shadow-elevation-3000-light)!important}.text-shadow-elevation-3000-dark{color:var(--shadow-elevation-3000-dark)!important}.bg-shadow-elevation-3000-dark{background-color:var(--shadow-elevation-3000-dark)!important}.border-shadow-elevation-3000-dark{border-color:var(--shadow-elevation-3000-dark)!important}.border-l-shadow-elevation-3000-dark{border-left-color:var(--shadow-elevation-3000-dark)!important}.border-r-shadow-elevation-3000-dark{border-right-color:var(--shadow-elevation-3000-dark)!important}.border-t-shadow-elevation-3000-dark{border-top-color:var(--shadow-elevation-3000-dark)!important}.border-b-shadow-elevation-3000-dark{border-bottom-color:var(--shadow-elevation-3000-dark)!important}.border-x-shadow-elevation-3000-dark{border-left-color:var(--shadow-elevation-3000-dark)!important;border-right-color:var(--shadow-elevation-3000-dark)!important}.border-y-shadow-elevation-3000-dark{border-bottom-color:var(--shadow-elevation-3000-dark)!important;border-top-color:var(--shadow-elevation-3000-dark)!important}.decoration-shadow-elevation-3000-dark{text-decoration-color:var(--shadow-elevation-3000-dark)!important}.text-text-3000-dark{color:var(--text-3000-dark)!important}.bg-text-3000-dark{background-color:var(--text-3000-dark)!important}.border-text-3000-dark{border-color:var(--text-3000-dark)!important}.border-l-text-3000-dark{border-left-color:var(--text-3000-dark)!important}.border-r-text-3000-dark{border-right-color:var(--text-3000-dark)!important}.border-t-text-3000-dark{border-top-color:var(--text-3000-dark)!important}.border-b-text-3000-dark{border-bottom-color:var(--text-3000-dark)!important}.border-x-text-3000-dark{border-left-color:var(--text-3000-dark)!important;border-right-color:var(--text-3000-dark)!important}.border-y-text-3000-dark{border-bottom-color:var(--text-3000-dark)!important;border-top-color:var(--text-3000-dark)!important}.decoration-text-3000-dark{text-decoration-color:var(--text-3000-dark)!important}.text-text-secondary-3000-dark{color:var(--text-secondary-3000-dark)!important}.bg-text-secondary-3000-dark{background-color:var(--text-secondary-3000-dark)!important}.border-text-secondary-3000-dark{border-color:var(--text-secondary-3000-dark)!important}.border-l-text-secondary-3000-dark{border-left-color:var(--text-secondary-3000-dark)!important}.border-r-text-secondary-3000-dark{border-right-color:var(--text-secondary-3000-dark)!important}.border-t-text-secondary-3000-dark{border-top-color:var(--text-secondary-3000-dark)!important}.border-b-text-secondary-3000-dark{border-bottom-color:var(--text-secondary-3000-dark)!important}.border-x-text-secondary-3000-dark{border-left-color:var(--text-secondary-3000-dark)!important;border-right-color:var(--text-secondary-3000-dark)!important}.border-y-text-secondary-3000-dark{border-bottom-color:var(--text-secondary-3000-dark)!important;border-top-color:var(--text-secondary-3000-dark)!important}.decoration-text-secondary-3000-dark{text-decoration-color:var(--text-secondary-3000-dark)!important}.text-muted-3000-dark{color:var(--muted-3000-dark)!important}.bg-muted-3000-dark{background-color:var(--muted-3000-dark)!important}.border-muted-3000-dark{border-color:var(--muted-3000-dark)!important}.border-l-muted-3000-dark{border-left-color:var(--muted-3000-dark)!important}.border-r-muted-3000-dark{border-right-color:var(--muted-3000-dark)!important}.border-t-muted-3000-dark{border-top-color:var(--muted-3000-dark)!important}.border-b-muted-3000-dark{border-bottom-color:var(--muted-3000-dark)!important}.border-x-muted-3000-dark{border-left-color:var(--muted-3000-dark)!important;border-right-color:var(--muted-3000-dark)!important}.border-y-muted-3000-dark{border-bottom-color:var(--muted-3000-dark)!important;border-top-color:var(--muted-3000-dark)!important}.decoration-muted-3000-dark{text-decoration-color:var(--muted-3000-dark)!important}.text-trace-3000-dark{color:var(--trace-3000-dark)!important}.bg-trace-3000-dark{background-color:var(--trace-3000-dark)!important}.border-trace-3000-dark{border-color:var(--trace-3000-dark)!important}.border-l-trace-3000-dark{border-left-color:var(--trace-3000-dark)!important}.border-r-trace-3000-dark{border-right-color:var(--trace-3000-dark)!important}.border-t-trace-3000-dark{border-top-color:var(--trace-3000-dark)!important}.border-b-trace-3000-dark{border-bottom-color:var(--trace-3000-dark)!important}.border-x-trace-3000-dark{border-left-color:var(--trace-3000-dark)!important;border-right-color:var(--trace-3000-dark)!important}.border-y-trace-3000-dark{border-bottom-color:var(--trace-3000-dark)!important;border-top-color:var(--trace-3000-dark)!important}.decoration-trace-3000-dark{text-decoration-color:var(--trace-3000-dark)!important}.text-primary-3000-dark{color:var(--primary-3000-dark)!important}.bg-primary-3000-dark{background-color:var(--primary-3000-dark)!important}.border-primary-3000-dark{border-color:var(--primary-3000-dark)!important}.border-l-primary-3000-dark{border-left-color:var(--primary-3000-dark)!important}.border-r-primary-3000-dark{border-right-color:var(--primary-3000-dark)!important}.border-t-primary-3000-dark{border-top-color:var(--primary-3000-dark)!important}.border-b-primary-3000-dark{border-bottom-color:var(--primary-3000-dark)!important}.border-x-primary-3000-dark{border-left-color:var(--primary-3000-dark)!important;border-right-color:var(--primary-3000-dark)!important}.border-y-primary-3000-dark{border-bottom-color:var(--primary-3000-dark)!important;border-top-color:var(--primary-3000-dark)!important}.decoration-primary-3000-dark{text-decoration-color:var(--primary-3000-dark)!important}.text-primary-highlight-dark{color:var(--primary-highlight-dark)!important}.bg-primary-highlight-dark{background-color:var(--primary-highlight-dark)!important}.border-primary-highlight-dark{border-color:var(--primary-highlight-dark)!important}.border-l-primary-highlight-dark{border-left-color:var(--primary-highlight-dark)!important}.border-r-primary-highlight-dark{border-right-color:var(--primary-highlight-dark)!important}.border-t-primary-highlight-dark{border-top-color:var(--primary-highlight-dark)!important}.border-b-primary-highlight-dark{border-bottom-color:var(--primary-highlight-dark)!important}.border-x-primary-highlight-dark{border-left-color:var(--primary-highlight-dark)!important;border-right-color:var(--primary-highlight-dark)!important}.border-y-primary-highlight-dark{border-bottom-color:var(--primary-highlight-dark)!important;border-top-color:var(--primary-highlight-dark)!important}.decoration-primary-highlight-dark{text-decoration-color:var(--primary-highlight-dark)!important}.text-primary-3000-hover-dark{color:var(--primary-3000-hover-dark)!important}.bg-primary-3000-hover-dark{background-color:var(--primary-3000-hover-dark)!important}.border-primary-3000-hover-dark{border-color:var(--primary-3000-hover-dark)!important}.border-l-primary-3000-hover-dark{border-left-color:var(--primary-3000-hover-dark)!important}.border-r-primary-3000-hover-dark{border-right-color:var(--primary-3000-hover-dark)!important}.border-t-primary-3000-hover-dark{border-top-color:var(--primary-3000-hover-dark)!important}.border-b-primary-3000-hover-dark{border-bottom-color:var(--primary-3000-hover-dark)!important}.border-x-primary-3000-hover-dark{border-left-color:var(--primary-3000-hover-dark)!important;border-right-color:var(--primary-3000-hover-dark)!important}.border-y-primary-3000-hover-dark{border-bottom-color:var(--primary-3000-hover-dark)!important;border-top-color:var(--primary-3000-hover-dark)!important}.decoration-primary-3000-hover-dark{text-decoration-color:var(--primary-3000-hover-dark)!important}.text-primary-3000-active-dark{color:var(--primary-3000-active-dark)!important}.bg-primary-3000-active-dark{background-color:var(--primary-3000-active-dark)!important}.border-primary-3000-active-dark{border-color:var(--primary-3000-active-dark)!important}.border-l-primary-3000-active-dark{border-left-color:var(--primary-3000-active-dark)!important}.border-r-primary-3000-active-dark{border-right-color:var(--primary-3000-active-dark)!important}.border-t-primary-3000-active-dark{border-top-color:var(--primary-3000-active-dark)!important}.border-b-primary-3000-active-dark{border-bottom-color:var(--primary-3000-active-dark)!important}.border-x-primary-3000-active-dark{border-left-color:var(--primary-3000-active-dark)!important;border-right-color:var(--primary-3000-active-dark)!important}.border-y-primary-3000-active-dark{border-bottom-color:var(--primary-3000-active-dark)!important;border-top-color:var(--primary-3000-active-dark)!important}.decoration-primary-3000-active-dark{text-decoration-color:var(--primary-3000-active-dark)!important}.text-primary-alt-highlight-light{color:var(--primary-alt-highlight-light)!important}.bg-primary-alt-highlight-light{background-color:var(--primary-alt-highlight-light)!important}.border-primary-alt-highlight-light{border-color:var(--primary-alt-highlight-light)!important}.border-l-primary-alt-highlight-light{border-left-color:var(--primary-alt-highlight-light)!important}.border-r-primary-alt-highlight-light{border-right-color:var(--primary-alt-highlight-light)!important}.border-t-primary-alt-highlight-light{border-top-color:var(--primary-alt-highlight-light)!important}.border-b-primary-alt-highlight-light{border-bottom-color:var(--primary-alt-highlight-light)!important}.border-x-primary-alt-highlight-light{border-left-color:var(--primary-alt-highlight-light)!important;border-right-color:var(--primary-alt-highlight-light)!important}.border-y-primary-alt-highlight-light{border-bottom-color:var(--primary-alt-highlight-light)!important;border-top-color:var(--primary-alt-highlight-light)!important}.decoration-primary-alt-highlight-light{text-decoration-color:var(--primary-alt-highlight-light)!important}.text-secondary-3000-dark{color:var(--secondary-3000-dark)!important}.bg-secondary-3000-dark{background-color:var(--secondary-3000-dark)!important}.border-secondary-3000-dark{border-color:var(--secondary-3000-dark)!important}.border-l-secondary-3000-dark{border-left-color:var(--secondary-3000-dark)!important}.border-r-secondary-3000-dark{border-right-color:var(--secondary-3000-dark)!important}.border-t-secondary-3000-dark{border-top-color:var(--secondary-3000-dark)!important}.border-b-secondary-3000-dark{border-bottom-color:var(--secondary-3000-dark)!important}.border-x-secondary-3000-dark{border-left-color:var(--secondary-3000-dark)!important;border-right-color:var(--secondary-3000-dark)!important}.border-y-secondary-3000-dark{border-bottom-color:var(--secondary-3000-dark)!important;border-top-color:var(--secondary-3000-dark)!important}.decoration-secondary-3000-dark{text-decoration-color:var(--secondary-3000-dark)!important}.text-secondary-3000-hover-dark{color:var(--secondary-3000-hover-dark)!important}.bg-secondary-3000-hover-dark{background-color:var(--secondary-3000-hover-dark)!important}.border-secondary-3000-hover-dark{border-color:var(--secondary-3000-hover-dark)!important}.border-l-secondary-3000-hover-dark{border-left-color:var(--secondary-3000-hover-dark)!important}.border-r-secondary-3000-hover-dark{border-right-color:var(--secondary-3000-hover-dark)!important}.border-t-secondary-3000-hover-dark{border-top-color:var(--secondary-3000-hover-dark)!important}.border-b-secondary-3000-hover-dark{border-bottom-color:var(--secondary-3000-hover-dark)!important}.border-x-secondary-3000-hover-dark{border-left-color:var(--secondary-3000-hover-dark)!important;border-right-color:var(--secondary-3000-hover-dark)!important}.border-y-secondary-3000-hover-dark{border-bottom-color:var(--secondary-3000-hover-dark)!important;border-top-color:var(--secondary-3000-hover-dark)!important}.decoration-secondary-3000-hover-dark{text-decoration-color:var(--secondary-3000-hover-dark)!important}.text-accent-3000-dark{color:var(--accent-3000-dark)!important}.bg-accent-3000-dark{background-color:var(--accent-3000-dark)!important}.border-accent-3000-dark{border-color:var(--accent-3000-dark)!important}.border-l-accent-3000-dark{border-left-color:var(--accent-3000-dark)!important}.border-r-accent-3000-dark{border-right-color:var(--accent-3000-dark)!important}.border-t-accent-3000-dark{border-top-color:var(--accent-3000-dark)!important}.border-b-accent-3000-dark{border-bottom-color:var(--accent-3000-dark)!important}.border-x-accent-3000-dark{border-left-color:var(--accent-3000-dark)!important;border-right-color:var(--accent-3000-dark)!important}.border-y-accent-3000-dark{border-bottom-color:var(--accent-3000-dark)!important;border-top-color:var(--accent-3000-dark)!important}.decoration-accent-3000-dark{text-decoration-color:var(--accent-3000-dark)!important}.text-bg-3000-dark{color:var(--bg-3000-dark)!important}.bg-bg-3000-dark{background-color:var(--bg-3000-dark)!important}.border-bg-3000-dark{border-color:var(--bg-3000-dark)!important}.border-l-bg-3000-dark{border-left-color:var(--bg-3000-dark)!important}.border-r-bg-3000-dark{border-right-color:var(--bg-3000-dark)!important}.border-t-bg-3000-dark{border-top-color:var(--bg-3000-dark)!important}.border-b-bg-3000-dark{border-bottom-color:var(--bg-3000-dark)!important}.border-x-bg-3000-dark{border-left-color:var(--bg-3000-dark)!important;border-right-color:var(--bg-3000-dark)!important}.border-y-bg-3000-dark{border-bottom-color:var(--bg-3000-dark)!important;border-top-color:var(--bg-3000-dark)!important}.decoration-bg-3000-dark{text-decoration-color:var(--bg-3000-dark)!important}.text-border-3000-dark{color:var(--border-3000-dark)!important}.bg-border-3000-dark{background-color:var(--border-3000-dark)!important}.border-border-3000-dark{border-color:var(--border-3000-dark)!important}.border-l-border-3000-dark{border-left-color:var(--border-3000-dark)!important}.border-r-border-3000-dark{border-right-color:var(--border-3000-dark)!important}.border-t-border-3000-dark{border-top-color:var(--border-3000-dark)!important}.border-b-border-3000-dark{border-bottom-color:var(--border-3000-dark)!important}.border-x-border-3000-dark{border-left-color:var(--border-3000-dark)!important;border-right-color:var(--border-3000-dark)!important}.border-y-border-3000-dark{border-bottom-color:var(--border-3000-dark)!important;border-top-color:var(--border-3000-dark)!important}.decoration-border-3000-dark{text-decoration-color:var(--border-3000-dark)!important}.text-border-bold-3000-dark{color:var(--border-bold-3000-dark)!important}.bg-border-bold-3000-dark{background-color:var(--border-bold-3000-dark)!important}.border-border-bold-3000-dark{border-color:var(--border-bold-3000-dark)!important}.border-l-border-bold-3000-dark{border-left-color:var(--border-bold-3000-dark)!important}.border-r-border-bold-3000-dark{border-right-color:var(--border-bold-3000-dark)!important}.border-t-border-bold-3000-dark{border-top-color:var(--border-bold-3000-dark)!important}.border-b-border-bold-3000-dark{border-bottom-color:var(--border-bold-3000-dark)!important}.border-x-border-bold-3000-dark{border-left-color:var(--border-bold-3000-dark)!important;border-right-color:var(--border-bold-3000-dark)!important}.border-y-border-bold-3000-dark{border-bottom-color:var(--border-bold-3000-dark)!important;border-top-color:var(--border-bold-3000-dark)!important}.decoration-border-bold-3000-dark{text-decoration-color:var(--border-bold-3000-dark)!important}.text-glass-bg-3000-dark{color:var(--glass-bg-3000-dark)!important}.bg-glass-bg-3000-dark{background-color:var(--glass-bg-3000-dark)!important}.border-glass-bg-3000-dark{border-color:var(--glass-bg-3000-dark)!important}.border-l-glass-bg-3000-dark{border-left-color:var(--glass-bg-3000-dark)!important}.border-r-glass-bg-3000-dark{border-right-color:var(--glass-bg-3000-dark)!important}.border-t-glass-bg-3000-dark{border-top-color:var(--glass-bg-3000-dark)!important}.border-b-glass-bg-3000-dark{border-bottom-color:var(--glass-bg-3000-dark)!important}.border-x-glass-bg-3000-dark{border-left-color:var(--glass-bg-3000-dark)!important;border-right-color:var(--glass-bg-3000-dark)!important}.border-y-glass-bg-3000-dark{border-bottom-color:var(--glass-bg-3000-dark)!important;border-top-color:var(--glass-bg-3000-dark)!important}.decoration-glass-bg-3000-dark{text-decoration-color:var(--glass-bg-3000-dark)!important}.text-glass-border-3000-dark{color:var(--glass-border-3000-dark)!important}.bg-glass-border-3000-dark{background-color:var(--glass-border-3000-dark)!important}.border-glass-border-3000-dark{border-color:var(--glass-border-3000-dark)!important}.border-l-glass-border-3000-dark{border-left-color:var(--glass-border-3000-dark)!important}.border-r-glass-border-3000-dark{border-right-color:var(--glass-border-3000-dark)!important}.border-t-glass-border-3000-dark{border-top-color:var(--glass-border-3000-dark)!important}.border-b-glass-border-3000-dark{border-bottom-color:var(--glass-border-3000-dark)!important}.border-x-glass-border-3000-dark{border-left-color:var(--glass-border-3000-dark)!important;border-right-color:var(--glass-border-3000-dark)!important}.border-y-glass-border-3000-dark{border-bottom-color:var(--glass-border-3000-dark)!important;border-top-color:var(--glass-border-3000-dark)!important}.decoration-glass-border-3000-dark{text-decoration-color:var(--glass-border-3000-dark)!important}.text-link-3000-dark{color:var(--link-3000-dark)!important}.bg-link-3000-dark{background-color:var(--link-3000-dark)!important}.border-link-3000-dark{border-color:var(--link-3000-dark)!important}.border-l-link-3000-dark{border-left-color:var(--link-3000-dark)!important}.border-r-link-3000-dark{border-right-color:var(--link-3000-dark)!important}.border-t-link-3000-dark{border-top-color:var(--link-3000-dark)!important}.border-b-link-3000-dark{border-bottom-color:var(--link-3000-dark)!important}.border-x-link-3000-dark{border-left-color:var(--link-3000-dark)!important;border-right-color:var(--link-3000-dark)!important}.border-y-link-3000-dark{border-bottom-color:var(--link-3000-dark)!important;border-top-color:var(--link-3000-dark)!important}.decoration-link-3000-dark{text-decoration-color:var(--link-3000-dark)!important}.text-primary-3000-frame-bg-dark{color:var(--primary-3000-frame-bg-dark)!important}.bg-primary-3000-frame-bg-dark{background-color:var(--primary-3000-frame-bg-dark)!important}.border-primary-3000-frame-bg-dark{border-color:var(--primary-3000-frame-bg-dark)!important}.border-l-primary-3000-frame-bg-dark{border-left-color:var(--primary-3000-frame-bg-dark)!important}.border-r-primary-3000-frame-bg-dark{border-right-color:var(--primary-3000-frame-bg-dark)!important}.border-t-primary-3000-frame-bg-dark{border-top-color:var(--primary-3000-frame-bg-dark)!important}.border-b-primary-3000-frame-bg-dark{border-bottom-color:var(--primary-3000-frame-bg-dark)!important}.border-x-primary-3000-frame-bg-dark{border-left-color:var(--primary-3000-frame-bg-dark)!important;border-right-color:var(--primary-3000-frame-bg-dark)!important}.border-y-primary-3000-frame-bg-dark{border-bottom-color:var(--primary-3000-frame-bg-dark)!important;border-top-color:var(--primary-3000-frame-bg-dark)!important}.decoration-primary-3000-frame-bg-dark{text-decoration-color:var(--primary-3000-frame-bg-dark)!important}.text-primary-3000-button-bg-dark{color:var(--primary-3000-button-bg-dark)!important}.bg-primary-3000-button-bg-dark{background-color:var(--primary-3000-button-bg-dark)!important}.border-primary-3000-button-bg-dark{border-color:var(--primary-3000-button-bg-dark)!important}.border-l-primary-3000-button-bg-dark{border-left-color:var(--primary-3000-button-bg-dark)!important}.border-r-primary-3000-button-bg-dark{border-right-color:var(--primary-3000-button-bg-dark)!important}.border-t-primary-3000-button-bg-dark{border-top-color:var(--primary-3000-button-bg-dark)!important}.border-b-primary-3000-button-bg-dark{border-bottom-color:var(--primary-3000-button-bg-dark)!important}.border-x-primary-3000-button-bg-dark{border-left-color:var(--primary-3000-button-bg-dark)!important;border-right-color:var(--primary-3000-button-bg-dark)!important}.border-y-primary-3000-button-bg-dark{border-bottom-color:var(--primary-3000-button-bg-dark)!important;border-top-color:var(--primary-3000-button-bg-dark)!important}.decoration-primary-3000-button-bg-dark{text-decoration-color:var(--primary-3000-button-bg-dark)!important}.text-primary-3000-button-border-dark{color:var(--primary-3000-button-border-dark)!important}.bg-primary-3000-button-border-dark{background-color:var(--primary-3000-button-border-dark)!important}.border-primary-3000-button-border-dark{border-color:var(--primary-3000-button-border-dark)!important}.border-l-primary-3000-button-border-dark{border-left-color:var(--primary-3000-button-border-dark)!important}.border-r-primary-3000-button-border-dark{border-right-color:var(--primary-3000-button-border-dark)!important}.border-t-primary-3000-button-border-dark{border-top-color:var(--primary-3000-button-border-dark)!important}.border-b-primary-3000-button-border-dark{border-bottom-color:var(--primary-3000-button-border-dark)!important}.border-x-primary-3000-button-border-dark{border-left-color:var(--primary-3000-button-border-dark)!important;border-right-color:var(--primary-3000-button-border-dark)!important}.border-y-primary-3000-button-border-dark{border-bottom-color:var(--primary-3000-button-border-dark)!important;border-top-color:var(--primary-3000-button-border-dark)!important}.decoration-primary-3000-button-border-dark{text-decoration-color:var(--primary-3000-button-border-dark)!important}.text-primary-3000-button-border-hover-dark{color:var(--primary-3000-button-border-hover-dark)!important}.bg-primary-3000-button-border-hover-dark{background-color:var(--primary-3000-button-border-hover-dark)!important}.border-primary-3000-button-border-hover-dark{border-color:var(--primary-3000-button-border-hover-dark)!important}.border-l-primary-3000-button-border-hover-dark{border-left-color:var(--primary-3000-button-border-hover-dark)!important}.border-r-primary-3000-button-border-hover-dark{border-right-color:var(--primary-3000-button-border-hover-dark)!important}.border-t-primary-3000-button-border-hover-dark{border-top-color:var(--primary-3000-button-border-hover-dark)!important}.border-b-primary-3000-button-border-hover-dark{border-bottom-color:var(--primary-3000-button-border-hover-dark)!important}.border-x-primary-3000-button-border-hover-dark{border-left-color:var(--primary-3000-button-border-hover-dark)!important;border-right-color:var(--primary-3000-button-border-hover-dark)!important}.border-y-primary-3000-button-border-hover-dark{border-bottom-color:var(--primary-3000-button-border-hover-dark)!important;border-top-color:var(--primary-3000-button-border-hover-dark)!important}.decoration-primary-3000-button-border-hover-dark{text-decoration-color:var(--primary-3000-button-border-hover-dark)!important}.text-primary-alt-highlight-dark{color:var(--primary-alt-highlight-dark)!important}.bg-primary-alt-highlight-dark{background-color:var(--primary-alt-highlight-dark)!important}.border-primary-alt-highlight-dark{border-color:var(--primary-alt-highlight-dark)!important}.border-l-primary-alt-highlight-dark{border-left-color:var(--primary-alt-highlight-dark)!important}.border-r-primary-alt-highlight-dark{border-right-color:var(--primary-alt-highlight-dark)!important}.border-t-primary-alt-highlight-dark{border-top-color:var(--primary-alt-highlight-dark)!important}.border-b-primary-alt-highlight-dark{border-bottom-color:var(--primary-alt-highlight-dark)!important}.border-x-primary-alt-highlight-dark{border-left-color:var(--primary-alt-highlight-dark)!important;border-right-color:var(--primary-alt-highlight-dark)!important}.border-y-primary-alt-highlight-dark{border-bottom-color:var(--primary-alt-highlight-dark)!important;border-top-color:var(--primary-alt-highlight-dark)!important}.decoration-primary-alt-highlight-dark{text-decoration-color:var(--primary-alt-highlight-dark)!important}.text-secondary-3000-frame-bg-dark{color:var(--secondary-3000-frame-bg-dark)!important}.bg-secondary-3000-frame-bg-dark{background-color:var(--secondary-3000-frame-bg-dark)!important}.border-secondary-3000-frame-bg-dark{border-color:var(--secondary-3000-frame-bg-dark)!important}.border-l-secondary-3000-frame-bg-dark{border-left-color:var(--secondary-3000-frame-bg-dark)!important}.border-r-secondary-3000-frame-bg-dark{border-right-color:var(--secondary-3000-frame-bg-dark)!important}.border-t-secondary-3000-frame-bg-dark{border-top-color:var(--secondary-3000-frame-bg-dark)!important}.border-b-secondary-3000-frame-bg-dark{border-bottom-color:var(--secondary-3000-frame-bg-dark)!important}.border-x-secondary-3000-frame-bg-dark{border-left-color:var(--secondary-3000-frame-bg-dark)!important;border-right-color:var(--secondary-3000-frame-bg-dark)!important}.border-y-secondary-3000-frame-bg-dark{border-bottom-color:var(--secondary-3000-frame-bg-dark)!important;border-top-color:var(--secondary-3000-frame-bg-dark)!important}.decoration-secondary-3000-frame-bg-dark{text-decoration-color:var(--secondary-3000-frame-bg-dark)!important}.text-secondary-3000-button-bg-dark{color:var(--secondary-3000-button-bg-dark)!important}.bg-secondary-3000-button-bg-dark{background-color:var(--secondary-3000-button-bg-dark)!important}.border-secondary-3000-button-bg-dark{border-color:var(--secondary-3000-button-bg-dark)!important}.border-l-secondary-3000-button-bg-dark{border-left-color:var(--secondary-3000-button-bg-dark)!important}.border-r-secondary-3000-button-bg-dark{border-right-color:var(--secondary-3000-button-bg-dark)!important}.border-t-secondary-3000-button-bg-dark{border-top-color:var(--secondary-3000-button-bg-dark)!important}.border-b-secondary-3000-button-bg-dark{border-bottom-color:var(--secondary-3000-button-bg-dark)!important}.border-x-secondary-3000-button-bg-dark{border-left-color:var(--secondary-3000-button-bg-dark)!important;border-right-color:var(--secondary-3000-button-bg-dark)!important}.border-y-secondary-3000-button-bg-dark{border-bottom-color:var(--secondary-3000-button-bg-dark)!important;border-top-color:var(--secondary-3000-button-bg-dark)!important}.decoration-secondary-3000-button-bg-dark{text-decoration-color:var(--secondary-3000-button-bg-dark)!important}.text-secondary-3000-button-border-dark{color:var(--secondary-3000-button-border-dark)!important}.bg-secondary-3000-button-border-dark{background-color:var(--secondary-3000-button-border-dark)!important}.border-secondary-3000-button-border-dark{border-color:var(--secondary-3000-button-border-dark)!important}.border-l-secondary-3000-button-border-dark{border-left-color:var(--secondary-3000-button-border-dark)!important}.border-r-secondary-3000-button-border-dark{border-right-color:var(--secondary-3000-button-border-dark)!important}.border-t-secondary-3000-button-border-dark{border-top-color:var(--secondary-3000-button-border-dark)!important}.border-b-secondary-3000-button-border-dark{border-bottom-color:var(--secondary-3000-button-border-dark)!important}.border-x-secondary-3000-button-border-dark{border-left-color:var(--secondary-3000-button-border-dark)!important;border-right-color:var(--secondary-3000-button-border-dark)!important}.border-y-secondary-3000-button-border-dark{border-bottom-color:var(--secondary-3000-button-border-dark)!important;border-top-color:var(--secondary-3000-button-border-dark)!important}.decoration-secondary-3000-button-border-dark{text-decoration-color:var(--secondary-3000-button-border-dark)!important}.text-secondary-3000-button-border-hover-dark{color:var(--secondary-3000-button-border-hover-dark)!important}.bg-secondary-3000-button-border-hover-dark{background-color:var(--secondary-3000-button-border-hover-dark)!important}.border-secondary-3000-button-border-hover-dark{border-color:var(--secondary-3000-button-border-hover-dark)!important}.border-l-secondary-3000-button-border-hover-dark{border-left-color:var(--secondary-3000-button-border-hover-dark)!important}.border-r-secondary-3000-button-border-hover-dark{border-right-color:var(--secondary-3000-button-border-hover-dark)!important}.border-t-secondary-3000-button-border-hover-dark{border-top-color:var(--secondary-3000-button-border-hover-dark)!important}.border-b-secondary-3000-button-border-hover-dark{border-bottom-color:var(--secondary-3000-button-border-hover-dark)!important}.border-x-secondary-3000-button-border-hover-dark{border-left-color:var(--secondary-3000-button-border-hover-dark)!important;border-right-color:var(--secondary-3000-button-border-hover-dark)!important}.border-y-secondary-3000-button-border-hover-dark{border-bottom-color:var(--secondary-3000-button-border-hover-dark)!important;border-top-color:var(--secondary-3000-button-border-hover-dark)!important}.decoration-secondary-3000-button-border-hover-dark{text-decoration-color:var(--secondary-3000-button-border-hover-dark)!important}.text-danger-3000-frame-bg-dark{color:var(--danger-3000-frame-bg-dark)!important}.bg-danger-3000-frame-bg-dark{background-color:var(--danger-3000-frame-bg-dark)!important}.border-danger-3000-frame-bg-dark{border-color:var(--danger-3000-frame-bg-dark)!important}.border-l-danger-3000-frame-bg-dark{border-left-color:var(--danger-3000-frame-bg-dark)!important}.border-r-danger-3000-frame-bg-dark{border-right-color:var(--danger-3000-frame-bg-dark)!important}.border-t-danger-3000-frame-bg-dark{border-top-color:var(--danger-3000-frame-bg-dark)!important}.border-b-danger-3000-frame-bg-dark{border-bottom-color:var(--danger-3000-frame-bg-dark)!important}.border-x-danger-3000-frame-bg-dark{border-left-color:var(--danger-3000-frame-bg-dark)!important;border-right-color:var(--danger-3000-frame-bg-dark)!important}.border-y-danger-3000-frame-bg-dark{border-bottom-color:var(--danger-3000-frame-bg-dark)!important;border-top-color:var(--danger-3000-frame-bg-dark)!important}.decoration-danger-3000-frame-bg-dark{text-decoration-color:var(--danger-3000-frame-bg-dark)!important}.text-danger-3000-button-border-dark{color:var(--danger-3000-button-border-dark)!important}.bg-danger-3000-button-border-dark{background-color:var(--danger-3000-button-border-dark)!important}.border-danger-3000-button-border-dark{border-color:var(--danger-3000-button-border-dark)!important}.border-l-danger-3000-button-border-dark{border-left-color:var(--danger-3000-button-border-dark)!important}.border-r-danger-3000-button-border-dark{border-right-color:var(--danger-3000-button-border-dark)!important}.border-t-danger-3000-button-border-dark{border-top-color:var(--danger-3000-button-border-dark)!important}.border-b-danger-3000-button-border-dark{border-bottom-color:var(--danger-3000-button-border-dark)!important}.border-x-danger-3000-button-border-dark{border-left-color:var(--danger-3000-button-border-dark)!important;border-right-color:var(--danger-3000-button-border-dark)!important}.border-y-danger-3000-button-border-dark{border-bottom-color:var(--danger-3000-button-border-dark)!important;border-top-color:var(--danger-3000-button-border-dark)!important}.decoration-danger-3000-button-border-dark{text-decoration-color:var(--danger-3000-button-border-dark)!important}.text-danger-3000-button-border-hover-dark{color:var(--danger-3000-button-border-hover-dark)!important}.bg-danger-3000-button-border-hover-dark{background-color:var(--danger-3000-button-border-hover-dark)!important}.border-danger-3000-button-border-hover-dark{border-color:var(--danger-3000-button-border-hover-dark)!important}.border-l-danger-3000-button-border-hover-dark{border-left-color:var(--danger-3000-button-border-hover-dark)!important}.border-r-danger-3000-button-border-hover-dark{border-right-color:var(--danger-3000-button-border-hover-dark)!important}.border-t-danger-3000-button-border-hover-dark{border-top-color:var(--danger-3000-button-border-hover-dark)!important}.border-b-danger-3000-button-border-hover-dark{border-bottom-color:var(--danger-3000-button-border-hover-dark)!important}.border-x-danger-3000-button-border-hover-dark{border-left-color:var(--danger-3000-button-border-hover-dark)!important;border-right-color:var(--danger-3000-button-border-hover-dark)!important}.border-y-danger-3000-button-border-hover-dark{border-bottom-color:var(--danger-3000-button-border-hover-dark)!important;border-top-color:var(--danger-3000-button-border-hover-dark)!important}.decoration-danger-3000-button-border-hover-dark{text-decoration-color:var(--danger-3000-button-border-hover-dark)!important}.text-default{color:var(--default)!important}.bg-default{background-color:var(--default)!important}.border-default{border-color:var(--default)!important}.border-l-default{border-left-color:var(--default)!important}.border-r-default{border-right-color:var(--default)!important}.border-t-default{border-top-color:var(--default)!important}.border-b-default{border-bottom-color:var(--default)!important}.border-x-default{border-left-color:var(--default)!important;border-right-color:var(--default)!important}.border-y-default{border-bottom-color:var(--default)!important;border-top-color:var(--default)!important}.decoration-default{text-decoration-color:var(--default)!important}.text-text-3000{color:var(--text-3000)!important}.bg-text-3000{background-color:var(--text-3000)!important}.border-text-3000{border-color:var(--text-3000)!important}.border-l-text-3000{border-left-color:var(--text-3000)!important}.border-r-text-3000{border-right-color:var(--text-3000)!important}.border-t-text-3000{border-top-color:var(--text-3000)!important}.border-b-text-3000{border-bottom-color:var(--text-3000)!important}.border-x-text-3000{border-left-color:var(--text-3000)!important;border-right-color:var(--text-3000)!important}.border-y-text-3000{border-bottom-color:var(--text-3000)!important;border-top-color:var(--text-3000)!important}.decoration-text-3000{text-decoration-color:var(--text-3000)!important}.text-text-secondary-3000{color:var(--text-secondary-3000)!important}.bg-text-secondary-3000{background-color:var(--text-secondary-3000)!important}.border-text-secondary-3000{border-color:var(--text-secondary-3000)!important}.border-l-text-secondary-3000{border-left-color:var(--text-secondary-3000)!important}.border-r-text-secondary-3000{border-right-color:var(--text-secondary-3000)!important}.border-t-text-secondary-3000{border-top-color:var(--text-secondary-3000)!important}.border-b-text-secondary-3000{border-bottom-color:var(--text-secondary-3000)!important}.border-x-text-secondary-3000{border-left-color:var(--text-secondary-3000)!important;border-right-color:var(--text-secondary-3000)!important}.border-y-text-secondary-3000{border-bottom-color:var(--text-secondary-3000)!important;border-top-color:var(--text-secondary-3000)!important}.decoration-text-secondary-3000{text-decoration-color:var(--text-secondary-3000)!important}.text-muted-3000{color:var(--muted-3000)!important}.bg-muted-3000{background-color:var(--muted-3000)!important}.border-muted-3000{border-color:var(--muted-3000)!important}.border-l-muted-3000{border-left-color:var(--muted-3000)!important}.border-r-muted-3000{border-right-color:var(--muted-3000)!important}.border-t-muted-3000{border-top-color:var(--muted-3000)!important}.border-b-muted-3000{border-bottom-color:var(--muted-3000)!important}.border-x-muted-3000{border-left-color:var(--muted-3000)!important;border-right-color:var(--muted-3000)!important}.border-y-muted-3000{border-bottom-color:var(--muted-3000)!important;border-top-color:var(--muted-3000)!important}.decoration-muted-3000{text-decoration-color:var(--muted-3000)!important}.text-primary-3000{color:var(--primary-3000)!important}.bg-primary-3000{background-color:var(--primary-3000)!important}.border-primary-3000{border-color:var(--primary-3000)!important}.border-l-primary-3000{border-left-color:var(--primary-3000)!important}.border-r-primary-3000{border-right-color:var(--primary-3000)!important}.border-t-primary-3000{border-top-color:var(--primary-3000)!important}.border-b-primary-3000{border-bottom-color:var(--primary-3000)!important}.border-x-primary-3000{border-left-color:var(--primary-3000)!important;border-right-color:var(--primary-3000)!important}.border-y-primary-3000{border-bottom-color:var(--primary-3000)!important;border-top-color:var(--primary-3000)!important}.decoration-primary-3000{text-decoration-color:var(--primary-3000)!important}.text-secondary-3000{color:var(--secondary-3000)!important}.bg-secondary-3000{background-color:var(--secondary-3000)!important}.border-secondary-3000{border-color:var(--secondary-3000)!important}.border-l-secondary-3000{border-left-color:var(--secondary-3000)!important}.border-r-secondary-3000{border-right-color:var(--secondary-3000)!important}.border-t-secondary-3000{border-top-color:var(--secondary-3000)!important}.border-b-secondary-3000{border-bottom-color:var(--secondary-3000)!important}.border-x-secondary-3000{border-left-color:var(--secondary-3000)!important;border-right-color:var(--secondary-3000)!important}.border-y-secondary-3000{border-bottom-color:var(--secondary-3000)!important;border-top-color:var(--secondary-3000)!important}.decoration-secondary-3000{text-decoration-color:var(--secondary-3000)!important}.text-secondary-3000-hover{color:var(--secondary-3000-hover)!important}.bg-secondary-3000-hover{background-color:var(--secondary-3000-hover)!important}.border-secondary-3000-hover{border-color:var(--secondary-3000-hover)!important}.border-l-secondary-3000-hover{border-left-color:var(--secondary-3000-hover)!important}.border-r-secondary-3000-hover{border-right-color:var(--secondary-3000-hover)!important}.border-t-secondary-3000-hover{border-top-color:var(--secondary-3000-hover)!important}.border-b-secondary-3000-hover{border-bottom-color:var(--secondary-3000-hover)!important}.border-x-secondary-3000-hover{border-left-color:var(--secondary-3000-hover)!important;border-right-color:var(--secondary-3000-hover)!important}.border-y-secondary-3000-hover{border-bottom-color:var(--secondary-3000-hover)!important;border-top-color:var(--secondary-3000-hover)!important}.decoration-secondary-3000-hover{text-decoration-color:var(--secondary-3000-hover)!important}.text-accent-3000{color:var(--accent-3000)!important}.bg-accent-3000{background-color:var(--accent-3000)!important}.border-accent-3000{border-color:var(--accent-3000)!important}.border-l-accent-3000{border-left-color:var(--accent-3000)!important}.border-r-accent-3000{border-right-color:var(--accent-3000)!important}.border-t-accent-3000{border-top-color:var(--accent-3000)!important}.border-b-accent-3000{border-bottom-color:var(--accent-3000)!important}.border-x-accent-3000{border-left-color:var(--accent-3000)!important;border-right-color:var(--accent-3000)!important}.border-y-accent-3000{border-bottom-color:var(--accent-3000)!important;border-top-color:var(--accent-3000)!important}.decoration-accent-3000{text-decoration-color:var(--accent-3000)!important}.text-bg-3000{color:var(--bg-3000)!important}.bg-bg-3000{background-color:var(--bg-3000)!important}.border-bg-3000{border-color:var(--bg-3000)!important}.border-l-bg-3000{border-left-color:var(--bg-3000)!important}.border-r-bg-3000{border-right-color:var(--bg-3000)!important}.border-t-bg-3000{border-top-color:var(--bg-3000)!important}.border-b-bg-3000{border-bottom-color:var(--bg-3000)!important}.border-x-bg-3000{border-left-color:var(--bg-3000)!important;border-right-color:var(--bg-3000)!important}.border-y-bg-3000{border-bottom-color:var(--bg-3000)!important;border-top-color:var(--bg-3000)!important}.decoration-bg-3000{text-decoration-color:var(--bg-3000)!important}.text-primary-highlight{color:var(--primary-highlight)!important}.bg-primary-highlight{background-color:var(--primary-highlight)!important}.border-primary-highlight{border-color:var(--primary-highlight)!important}.border-l-primary-highlight{border-left-color:var(--primary-highlight)!important}.border-r-primary-highlight{border-right-color:var(--primary-highlight)!important}.border-t-primary-highlight{border-top-color:var(--primary-highlight)!important}.border-b-primary-highlight{border-bottom-color:var(--primary-highlight)!important}.border-x-primary-highlight{border-left-color:var(--primary-highlight)!important;border-right-color:var(--primary-highlight)!important}.border-y-primary-highlight{border-bottom-color:var(--primary-highlight)!important;border-top-color:var(--primary-highlight)!important}.decoration-primary-highlight{text-decoration-color:var(--primary-highlight)!important}.text-primary-alt-highlight{color:var(--primary-alt-highlight)!important}.bg-primary-alt-highlight{background-color:var(--primary-alt-highlight)!important}.border-primary-alt-highlight{border-color:var(--primary-alt-highlight)!important}.border-l-primary-alt-highlight{border-left-color:var(--primary-alt-highlight)!important}.border-r-primary-alt-highlight{border-right-color:var(--primary-alt-highlight)!important}.border-t-primary-alt-highlight{border-top-color:var(--primary-alt-highlight)!important}.border-b-primary-alt-highlight{border-bottom-color:var(--primary-alt-highlight)!important}.border-x-primary-alt-highlight{border-left-color:var(--primary-alt-highlight)!important;border-right-color:var(--primary-alt-highlight)!important}.border-y-primary-alt-highlight{border-bottom-color:var(--primary-alt-highlight)!important;border-top-color:var(--primary-alt-highlight)!important}.decoration-primary-alt-highlight{text-decoration-color:var(--primary-alt-highlight)!important}.text-primary-alt{color:var(--primary-alt)!important}.bg-primary-alt{background-color:var(--primary-alt)!important}.border-primary-alt{border-color:var(--primary-alt)!important}.border-l-primary-alt{border-left-color:var(--primary-alt)!important}.border-r-primary-alt{border-right-color:var(--primary-alt)!important}.border-t-primary-alt{border-top-color:var(--primary-alt)!important}.border-b-primary-alt{border-bottom-color:var(--primary-alt)!important}.border-x-primary-alt{border-left-color:var(--primary-alt)!important;border-right-color:var(--primary-alt)!important}.border-y-primary-alt{border-bottom-color:var(--primary-alt)!important;border-top-color:var(--primary-alt)!important}.decoration-primary-alt{text-decoration-color:var(--primary-alt)!important}.hover\\:text-primary:hover{color:#1d4aff!important}.hover\\:bg-primary:hover{background-color:#1d4aff!important}.hover\\:border-primary:hover{border-color:#1d4aff!important}.hover\\:text-danger-highlight:hover{color:rgba(219,55,7,.1)!important}.hover\\:bg-danger-highlight:hover{background-color:rgba(219,55,7,.1)!important}.hover\\:border-danger-highlight:hover{border-color:rgba(219,55,7,.1)!important}.hover\\:text-danger-lighter:hover{color:#ffa599!important}.hover\\:bg-danger-lighter:hover{background-color:#ffa599!important}.hover\\:border-danger-lighter:hover{border-color:#ffa599!important}.hover\\:text-danger-light:hover{color:#df4b20!important}.hover\\:bg-danger-light:hover{background-color:#df4b20!important}.hover\\:border-danger-light:hover{border-color:#df4b20!important}.hover\\:text-danger:hover{color:#db3707!important}.hover\\:bg-danger:hover{background-color:#db3707!important}.hover\\:border-danger:hover{border-color:#db3707!important}.hover\\:text-danger-dark:hover{color:#992705!important}.hover\\:bg-danger-dark:hover{background-color:#992705!important}.hover\\:border-danger-dark:hover{border-color:#992705!important}.hover\\:text-warning-highlight:hover{color:rgba(247,165,1,.1)!important}.hover\\:bg-warning-highlight:hover{background-color:rgba(247,165,1,.1)!important}.hover\\:border-warning-highlight:hover{border-color:rgba(247,165,1,.1)!important}.hover\\:text-warning:hover{color:#f7a501!important}.hover\\:bg-warning:hover{background-color:#f7a501!important}.hover\\:border-warning:hover{border-color:#f7a501!important}.hover\\:text-warning-dark:hover{color:#e09423!important}.hover\\:bg-warning-dark:hover{background-color:#e09423!important}.hover\\:border-warning-dark:hover{border-color:#e09423!important}.hover\\:text-highlight:hover{color:#e49f2c!important}.hover\\:bg-highlight:hover{background-color:#e49f2c!important}.hover\\:border-highlight:hover{border-color:#e49f2c!important}.hover\\:text-success-highlight:hover{color:rgba(56,134,0,.1)!important}.hover\\:bg-success-highlight:hover{background-color:rgba(56,134,0,.1)!important}.hover\\:border-success-highlight:hover{border-color:rgba(56,134,0,.1)!important}.hover\\:text-success-light:hover{color:#5f9d32!important}.hover\\:bg-success-light:hover{background-color:#5f9d32!important}.hover\\:border-success-light:hover{border-color:#5f9d32!important}.hover\\:text-success:hover{color:#388600!important}.hover\\:bg-success:hover{background-color:#388600!important}.hover\\:border-success:hover{border-color:#388600!important}.hover\\:text-success-dark:hover{color:#245700!important}.hover\\:bg-success-dark:hover{background-color:#245700!important}.hover\\:border-success-dark:hover{border-color:#245700!important}.hover\\:text-muted:hover{color:#5f5f5f!important}.hover\\:bg-muted:hover{background-color:#5f5f5f!important}.hover\\:border-muted:hover{border-color:#5f5f5f!important}.hover\\:text-muted-alt:hover{color:#747ea1!important}.hover\\:bg-muted-alt:hover{background-color:#747ea1!important}.hover\\:border-muted-alt:hover{border-color:#747ea1!important}.hover\\:text-mark:hover{color:hsla(42,94%,86%,.8)!important}.hover\\:bg-mark:hover{background-color:hsla(42,94%,86%,.8)!important}.hover\\:border-mark:hover{border-color:hsla(42,94%,86%,.8)!important}.hover\\:text-white:hover{color:#fff!important}.hover\\:bg-white:hover{background-color:#fff!important}.hover\\:border-white:hover{border-color:#fff!important}.hover\\:text-bg-light:hover{color:#fff!important}.hover\\:bg-bg-light:hover{background-color:#fff!important}.hover\\:border-bg-light:hover{border-color:#fff!important}.hover\\:text-side:hover{color:#fafaf9!important}.hover\\:bg-side:hover{background-color:#fafaf9!important}.hover\\:border-side:hover{border-color:#fafaf9!important}.hover\\:text-mid:hover{color:#f2f2f2!important}.hover\\:bg-mid:hover{background-color:#f2f2f2!important}.hover\\:border-mid:hover{border-color:#f2f2f2!important}.hover\\:text-border:hover{color:rgba(0,0,0,.15)!important}.hover\\:bg-border:hover{background-color:rgba(0,0,0,.15)!important}.hover\\:border-border:hover{border-color:rgba(0,0,0,.15)!important}.hover\\:text-border-light:hover{color:rgba(0,0,0,.08)!important}.hover\\:bg-border-light:hover{background-color:rgba(0,0,0,.08)!important}.hover\\:border-border-light:hover{border-color:rgba(0,0,0,.08)!important}.hover\\:text-border-bold:hover{color:rgba(0,0,0,.24)!important}.hover\\:bg-border-bold:hover{background-color:rgba(0,0,0,.24)!important}.hover\\:border-border-bold:hover{border-color:rgba(0,0,0,.24)!important}.hover\\:text-transparent:hover{color:transparent!important}.hover\\:bg-transparent:hover{background-color:transparent!important}.hover\\:border-transparent:hover{border-color:transparent!important}.hover\\:text-link:hover{color:var(--primary-3000)!important}.hover\\:bg-link:hover{background-color:var(--primary-3000)!important}.hover\\:border-link:hover{border-color:var(--primary-3000)!important}.hover\\:text-brand-blue:hover{color:#1d4aff!important}.hover\\:bg-brand-blue:hover{background-color:#1d4aff!important}.hover\\:border-brand-blue:hover{border-color:#1d4aff!important}.hover\\:text-brand-red:hover{color:#f54e00!important}.hover\\:bg-brand-red:hover{background-color:#f54e00!important}.hover\\:border-brand-red:hover{border-color:#f54e00!important}.hover\\:text-brand-yellow:hover{color:#f9bd2b!important}.hover\\:bg-brand-yellow:hover{background-color:#f9bd2b!important}.hover\\:border-brand-yellow:hover{border-color:#f9bd2b!important}.hover\\:text-brand-key:hover{color:#000!important}.hover\\:bg-brand-key:hover{background-color:#000!important}.hover\\:border-brand-key:hover{border-color:#000!important}.hover\\:text-text-3000-light:hover{color:#111!important}.hover\\:bg-text-3000-light:hover{background-color:#111!important}.hover\\:border-text-3000-light:hover{border-color:#111!important}.hover\\:text-text-secondary-3000-light:hover{color:hsla(0,0%,7%,.7)!important}.hover\\:bg-text-secondary-3000-light:hover{background-color:hsla(0,0%,7%,.7)!important}.hover\\:border-text-secondary-3000-light:hover{border-color:hsla(0,0%,7%,.7)!important}.hover\\:text-muted-3000-light:hover{color:hsla(0,0%,7%,.6)!important}.hover\\:bg-muted-3000-light:hover{background-color:hsla(0,0%,7%,.6)!important}.hover\\:border-muted-3000-light:hover{border-color:hsla(0,0%,7%,.6)!important}.hover\\:text-trace-3000-light:hover{color:hsla(0,0%,7%,.25)!important}.hover\\:bg-trace-3000-light:hover{background-color:hsla(0,0%,7%,.25)!important}.hover\\:border-trace-3000-light:hover{border-color:hsla(0,0%,7%,.25)!important}.hover\\:text-primary-3000-light:hover{color:#f54e01!important}.hover\\:bg-primary-3000-light:hover{background-color:#f54e01!important}.hover\\:border-primary-3000-light:hover{border-color:#f54e01!important}.hover\\:text-primary-highlight-light:hover{color:rgba(245,78,1,.1)!important}.hover\\:bg-primary-highlight-light:hover{background-color:rgba(245,78,1,.1)!important}.hover\\:border-primary-highlight-light:hover{border-color:rgba(245,78,1,.1)!important}.hover\\:text-primary-3000-hover-light:hover{color:#f54e01!important}.hover\\:bg-primary-3000-hover-light:hover{background-color:#f54e01!important}.hover\\:border-primary-3000-hover-light:hover{border-color:#f54e01!important}.hover\\:text-primary-3000-active-light:hover{color:#f54e01!important}.hover\\:bg-primary-3000-active-light:hover{background-color:#f54e01!important}.hover\\:border-primary-3000-active-light:hover{border-color:#f54e01!important}.hover\\:text-secondary-3000-light:hover{color:hsla(68,14%,79%,.6)!important}.hover\\:bg-secondary-3000-light:hover{background-color:hsla(68,14%,79%,.6)!important}.hover\\:border-secondary-3000-light:hover{border-color:hsla(68,14%,79%,.6)!important}.hover\\:text-secondary-3000-hover-light:hover{color:#cfd1c2!important}.hover\\:bg-secondary-3000-hover-light:hover{background-color:#cfd1c2!important}.hover\\:border-secondary-3000-hover-light:hover{border-color:#cfd1c2!important}.hover\\:text-accent-3000-light:hover{color:#eeefe9!important}.hover\\:bg-accent-3000-light:hover{background-color:#eeefe9!important}.hover\\:border-accent-3000-light:hover{border-color:#eeefe9!important}.hover\\:text-bg-3000-light:hover{color:#f3f4ef!important}.hover\\:bg-bg-3000-light:hover{background-color:#f3f4ef!important}.hover\\:border-bg-3000-light:hover{border-color:#f3f4ef!important}.hover\\:text-border-3000-light:hover{color:#dadbd2!important}.hover\\:bg-border-3000-light:hover{background-color:#dadbd2!important}.hover\\:border-border-3000-light:hover{border-color:#dadbd2!important}.hover\\:text-border-bold-3000-light:hover{color:#c1c2b9!important}.hover\\:bg-border-bold-3000-light:hover{background-color:#c1c2b9!important}.hover\\:border-border-bold-3000-light:hover{border-color:#c1c2b9!important}.hover\\:text-glass-bg-3000-light:hover{color:hsla(69,12%,88%,.702)!important}.hover\\:bg-glass-bg-3000-light:hover{background-color:hsla(69,12%,88%,.702)!important}.hover\\:border-glass-bg-3000-light:hover{border-color:hsla(69,12%,88%,.702)!important}.hover\\:text-glass-border-3000-light:hover{color:#e4e5de!important}.hover\\:bg-glass-border-3000-light:hover{background-color:#e4e5de!important}.hover\\:border-glass-border-3000-light:hover{border-color:#e4e5de!important}.hover\\:text-link-3000-light:hover{color:#f54e00!important}.hover\\:bg-link-3000-light:hover{background-color:#f54e00!important}.hover\\:border-link-3000-light:hover{border-color:#f54e00!important}.hover\\:text-primary-3000-frame-bg-light:hover{color:#eb9d2a!important}.hover\\:bg-primary-3000-frame-bg-light:hover{background-color:#eb9d2a!important}.hover\\:border-primary-3000-frame-bg-light:hover{border-color:#eb9d2a!important}.hover\\:text-primary-3000-button-bg-light:hover{color:#fff!important}.hover\\:bg-primary-3000-button-bg-light:hover{background-color:#fff!important}.hover\\:border-primary-3000-button-bg-light:hover{border-color:#fff!important}.hover\\:text-primary-3000-button-border-light:hover{color:#b17816!important}.hover\\:bg-primary-3000-button-border-light:hover{background-color:#b17816!important}.hover\\:border-primary-3000-button-border-light:hover{border-color:#b17816!important}.hover\\:text-primary-3000-button-border-hover-light:hover{color:#8e5b03!important}.hover\\:bg-primary-3000-button-border-hover-light:hover{background-color:#8e5b03!important}.hover\\:border-primary-3000-button-border-hover-light:hover{border-color:#8e5b03!important}.hover\\:text-secondary-3000-frame-bg-light:hover{color:#e1dddd!important}.hover\\:bg-secondary-3000-frame-bg-light:hover{background-color:#e1dddd!important}.hover\\:border-secondary-3000-frame-bg-light:hover{border-color:#e1dddd!important}.hover\\:text-secondary-3000-button-bg-light:hover{color:#f3f4ef!important}.hover\\:bg-secondary-3000-button-bg-light:hover{background-color:#f3f4ef!important}.hover\\:border-secondary-3000-button-bg-light:hover{border-color:#f3f4ef!important}.hover\\:text-secondary-3000-button-border-light:hover{color:#ccc!important}.hover\\:bg-secondary-3000-button-border-light:hover{background-color:#ccc!important}.hover\\:border-secondary-3000-button-border-light:hover{border-color:#ccc!important}.hover\\:text-secondary-3000-button-border-hover-light:hover{color:#aaa!important}.hover\\:bg-secondary-3000-button-border-hover-light:hover{background-color:#aaa!important}.hover\\:border-secondary-3000-button-border-hover-light:hover{border-color:#aaa!important}.hover\\:text-danger-3000-frame-bg-light:hover{color:rgba(245,78,0,.502)!important}.hover\\:bg-danger-3000-frame-bg-light:hover{background-color:rgba(245,78,0,.502)!important}.hover\\:border-danger-3000-frame-bg-light:hover{border-color:rgba(245,78,0,.502)!important}.hover\\:text-danger-3000-button-border-light:hover{color:#e96b30!important}.hover\\:bg-danger-3000-button-border-light:hover{background-color:#e96b30!important}.hover\\:border-danger-3000-button-border-light:hover{border-color:#e96b30!important}.hover\\:text-danger-3000-button-border-hover-light:hover{color:#f54e00!important}.hover\\:bg-danger-3000-button-border-hover-light:hover{background-color:#f54e00!important}.hover\\:border-danger-3000-button-border-hover-light:hover{border-color:#f54e00!important}.hover\\:text-shadow-elevation-3000-light:hover{color:0 3px 0 var(--border-3000-light)!important}.hover\\:bg-shadow-elevation-3000-light:hover{background-color:0 3px 0 var(--border-3000-light)!important}.hover\\:border-shadow-elevation-3000-light:hover{border-color:0 3px 0 var(--border-3000-light)!important}.hover\\:text-shadow-elevation-3000-dark:hover{color:0 3px 0 var(--border-3000-dark)!important}.hover\\:bg-shadow-elevation-3000-dark:hover{background-color:0 3px 0 var(--border-3000-dark)!important}.hover\\:border-shadow-elevation-3000-dark:hover{border-color:0 3px 0 var(--border-3000-dark)!important}.hover\\:text-text-3000-dark:hover{color:#fff!important}.hover\\:bg-text-3000-dark:hover{background-color:#fff!important}.hover\\:border-text-3000-dark:hover{border-color:#fff!important}.hover\\:text-text-secondary-3000-dark:hover{color:hsla(0,0%,100%,.7)!important}.hover\\:bg-text-secondary-3000-dark:hover{background-color:hsla(0,0%,100%,.7)!important}.hover\\:border-text-secondary-3000-dark:hover{border-color:hsla(0,0%,100%,.7)!important}.hover\\:text-muted-3000-dark:hover{color:hsla(0,0%,100%,.5)!important}.hover\\:bg-muted-3000-dark:hover{background-color:hsla(0,0%,100%,.5)!important}.hover\\:border-muted-3000-dark:hover{border-color:hsla(0,0%,100%,.5)!important}.hover\\:text-trace-3000-dark:hover{color:hsla(0,0%,100%,.25)!important}.hover\\:bg-trace-3000-dark:hover{background-color:hsla(0,0%,100%,.25)!important}.hover\\:border-trace-3000-dark:hover{border-color:hsla(0,0%,100%,.25)!important}.hover\\:text-primary-3000-dark:hover{color:#f7a503!important}.hover\\:bg-primary-3000-dark:hover{background-color:#f7a503!important}.hover\\:border-primary-3000-dark:hover{border-color:#f7a503!important}.hover\\:text-primary-highlight-dark:hover{color:rgba(247,165,3,.1)!important}.hover\\:bg-primary-highlight-dark:hover{background-color:rgba(247,165,3,.1)!important}.hover\\:border-primary-highlight-dark:hover{border-color:rgba(247,165,3,.1)!important}.hover\\:text-primary-3000-hover-dark:hover{color:#f7a503!important}.hover\\:bg-primary-3000-hover-dark:hover{background-color:#f7a503!important}.hover\\:border-primary-3000-hover-dark:hover{border-color:#f7a503!important}.hover\\:text-primary-3000-active-dark:hover{color:#f7a503!important}.hover\\:bg-primary-3000-active-dark:hover{background-color:#f7a503!important}.hover\\:border-primary-3000-active-dark:hover{border-color:#f7a503!important}.hover\\:text-primary-alt-highlight-light:hover{color:#e5e7e0!important}.hover\\:bg-primary-alt-highlight-light:hover{background-color:#e5e7e0!important}.hover\\:border-primary-alt-highlight-light:hover{border-color:#e5e7e0!important}.hover\\:text-secondary-3000-dark:hover{color:#1d1f27!important}.hover\\:bg-secondary-3000-dark:hover{background-color:#1d1f27!important}.hover\\:border-secondary-3000-dark:hover{border-color:#1d1f27!important}.hover\\:text-secondary-3000-hover-dark:hover{color:#575d77!important}.hover\\:bg-secondary-3000-hover-dark:hover{background-color:#575d77!important}.hover\\:border-secondary-3000-hover-dark:hover{border-color:#575d77!important}.hover\\:text-accent-3000-dark:hover{color:#21242b!important}.hover\\:bg-accent-3000-dark:hover{background-color:#21242b!important}.hover\\:border-accent-3000-dark:hover{border-color:#21242b!important}.hover\\:text-bg-3000-dark:hover{color:#1d1f27!important}.hover\\:bg-bg-3000-dark:hover{background-color:#1d1f27!important}.hover\\:border-bg-3000-dark:hover{border-color:#1d1f27!important}.hover\\:text-border-3000-dark:hover{color:#35373e!important}.hover\\:bg-border-3000-dark:hover{background-color:#35373e!important}.hover\\:border-border-3000-dark:hover{border-color:#35373e!important}.hover\\:text-border-bold-3000-dark:hover{color:#3f4046!important}.hover\\:bg-border-bold-3000-dark:hover{background-color:#3f4046!important}.hover\\:border-border-bold-3000-dark:hover{border-color:#3f4046!important}.hover\\:text-glass-bg-3000-dark:hover{color:rgba(36,38,42,.6)!important}.hover\\:bg-glass-bg-3000-dark:hover{background-color:rgba(36,38,42,.6)!important}.hover\\:border-glass-bg-3000-dark:hover{border-color:rgba(36,38,42,.6)!important}.hover\\:text-glass-border-3000-dark:hover{color:var(--border-3000-dark)!important}.hover\\:bg-glass-border-3000-dark:hover{background-color:var(--border-3000-dark)!important}.hover\\:border-glass-border-3000-dark:hover{border-color:var(--border-3000-dark)!important}.hover\\:text-link-3000-dark:hover{color:#f1a82c!important}.hover\\:bg-link-3000-dark:hover{background-color:#f1a82c!important}.hover\\:border-link-3000-dark:hover{border-color:#f1a82c!important}.hover\\:text-primary-3000-frame-bg-dark:hover{color:#926826!important}.hover\\:bg-primary-3000-frame-bg-dark:hover{background-color:#926826!important}.hover\\:border-primary-3000-frame-bg-dark:hover{border-color:#926826!important}.hover\\:text-primary-3000-button-bg-dark:hover{color:#e0a045!important}.hover\\:bg-primary-3000-button-bg-dark:hover{background-color:#e0a045!important}.hover\\:border-primary-3000-button-bg-dark:hover{border-color:#e0a045!important}.hover\\:text-primary-3000-button-border-dark:hover{color:#b17816!important}.hover\\:bg-primary-3000-button-border-dark:hover{background-color:#b17816!important}.hover\\:border-primary-3000-button-border-dark:hover{border-color:#b17816!important}.hover\\:text-primary-3000-button-border-hover-dark:hover{color:#8e5b03!important}.hover\\:bg-primary-3000-button-border-hover-dark:hover{background-color:#8e5b03!important}.hover\\:border-primary-3000-button-border-hover-dark:hover{border-color:#8e5b03!important}.hover\\:text-primary-alt-highlight-dark:hover{color:#232429!important}.hover\\:bg-primary-alt-highlight-dark:hover{background-color:#232429!important}.hover\\:border-primary-alt-highlight-dark:hover{border-color:#232429!important}.hover\\:text-secondary-3000-frame-bg-dark:hover{color:#323232!important}.hover\\:bg-secondary-3000-frame-bg-dark:hover{background-color:#323232!important}.hover\\:border-secondary-3000-frame-bg-dark:hover{border-color:#323232!important}.hover\\:text-secondary-3000-button-bg-dark:hover{color:#1d1f27!important}.hover\\:bg-secondary-3000-button-bg-dark:hover{background-color:#1d1f27!important}.hover\\:border-secondary-3000-button-bg-dark:hover{border-color:#1d1f27!important}.hover\\:text-secondary-3000-button-border-dark:hover{color:#4a4c52!important}.hover\\:bg-secondary-3000-button-border-dark:hover{background-color:#4a4c52!important}.hover\\:border-secondary-3000-button-border-dark:hover{border-color:#4a4c52!important}.hover\\:text-secondary-3000-button-border-hover-dark:hover{color:#5e6064!important}.hover\\:bg-secondary-3000-button-border-hover-dark:hover{background-color:#5e6064!important}.hover\\:border-secondary-3000-button-border-hover-dark:hover{border-color:#5e6064!important}.hover\\:text-danger-3000-frame-bg-dark:hover{color:rgba(245,78,0,.502)!important}.hover\\:bg-danger-3000-frame-bg-dark:hover{background-color:rgba(245,78,0,.502)!important}.hover\\:border-danger-3000-frame-bg-dark:hover{border-color:rgba(245,78,0,.502)!important}.hover\\:text-danger-3000-button-border-dark:hover{color:#c44003!important}.hover\\:bg-danger-3000-button-border-dark:hover{background-color:#c44003!important}.hover\\:border-danger-3000-button-border-dark:hover{border-color:#c44003!important}.hover\\:text-danger-3000-button-border-hover-dark:hover{color:#f54e00!important}.hover\\:bg-danger-3000-button-border-hover-dark:hover{background-color:#f54e00!important}.hover\\:border-danger-3000-button-border-hover-dark:hover{border-color:#f54e00!important}.hover\\:text-default:hover{color:var(--default)!important}.hover\\:bg-default:hover{background-color:var(--default)!important}.hover\\:border-default:hover{border-color:var(--default)!important}.hover\\:text-text-3000:hover{color:var(--text-3000)!important}.hover\\:bg-text-3000:hover{background-color:var(--text-3000)!important}.hover\\:border-text-3000:hover{border-color:var(--text-3000)!important}.hover\\:text-text-secondary-3000:hover{color:var(--text-secondary-3000)!important}.hover\\:bg-text-secondary-3000:hover{background-color:var(--text-secondary-3000)!important}.hover\\:border-text-secondary-3000:hover{border-color:var(--text-secondary-3000)!important}.hover\\:text-muted-3000:hover{color:var(--muted-3000)!important}.hover\\:bg-muted-3000:hover{background-color:var(--muted-3000)!important}.hover\\:border-muted-3000:hover{border-color:var(--muted-3000)!important}.hover\\:text-primary-3000:hover{color:var(--primary-3000)!important}.hover\\:bg-primary-3000:hover{background-color:var(--primary-3000)!important}.hover\\:border-primary-3000:hover{border-color:var(--primary-3000)!important}.hover\\:text-secondary-3000:hover{color:var(--secondary-3000)!important}.hover\\:bg-secondary-3000:hover{background-color:var(--secondary-3000)!important}.hover\\:border-secondary-3000:hover{border-color:var(--secondary-3000)!important}.hover\\:text-secondary-3000-hover:hover{color:var(--secondary-3000-hover)!important}.hover\\:bg-secondary-3000-hover:hover{background-color:var(--secondary-3000-hover)!important}.hover\\:border-secondary-3000-hover:hover{border-color:var(--secondary-3000-hover)!important}.hover\\:text-accent-3000:hover{color:var(--accent-3000)!important}.hover\\:bg-accent-3000:hover{background-color:var(--accent-3000)!important}.hover\\:border-accent-3000:hover{border-color:var(--accent-3000)!important}.hover\\:text-bg-3000:hover{color:var(--bg-3000)!important}.hover\\:bg-bg-3000:hover{background-color:var(--bg-3000)!important}.hover\\:border-bg-3000:hover{border-color:var(--bg-3000)!important}.hover\\:text-primary-highlight:hover{color:var(--primary-highlight)!important}.hover\\:bg-primary-highlight:hover{background-color:var(--primary-highlight)!important}.hover\\:border-primary-highlight:hover{border-color:var(--primary-highlight)!important}.hover\\:text-primary-alt-highlight:hover{color:var(--primary-alt-highlight)!important}.hover\\:bg-primary-alt-highlight:hover{background-color:var(--primary-alt-highlight)!important}.hover\\:border-primary-alt-highlight:hover{border-color:var(--primary-alt-highlight)!important}.hover\\:text-primary-alt:hover{color:var(--primary-alt)!important}.hover\\:bg-primary-alt:hover{background-color:var(--primary-alt)!important}.hover\\:border-primary-alt:hover{border-color:var(--primary-alt)!important}.placeholder\\:\\*\\:\\*\\:text-default>*>::-moz-placeholder{color:var(--default)}.placeholder\\:\\*\\:\\*\\:text-default>*>::placeholder{color:var(--default)}.subtitle{align-items:center;display:flex;font-size:22px;font-weight:700;line-height:26px;margin-top:12px}.subtitle.highlighted{padding:1rem 1rem 1rem .5rem}.l3{font-size:16px;font-weight:600;line-height:19px}.l4{font-size:14px;font-weight:700}.col{max-width:100%;min-height:1px;position:relative}.highlighted{animation:highlight 2s ease-out;border-radius:var(--radius);scroll-margin-top:var(--breadcrumbs-height-full)}:root{--neutral-50:#fafafa;--neutral-100:#f5f5f5;--neutral-150:#ebebeb;--neutral-200:#e0e0e0;--neutral-250:#d6d6d6;--neutral-300:#ccc;--neutral-350:#bfbfbf;--neutral-400:#b3b3b3;--neutral-450:#a6a6a6;--neutral-550:#8c8c8c;--neutral-700:#666;--neutral-800:#4d4d4d;--neutral-900:#333;--neutral-950:#262626;--neutral-warm-50:#f3f4f0;--neutral-warm-100:#e8eae0;--neutral-warm-150:#dde0d2;--neutral-warm-200:#d2d6c2;--neutral-warm-250:#c6cbb3;--neutral-warm-300:#bbc1a3;--neutral-warm-350:#b0b795;--neutral-warm-400:#a5ac86;--neutral-warm-450:#99a276;--neutral-warm-500:#8e9867;--neutral-warm-550:#80895d;--neutral-warm-600:#727953;--neutral-warm-650:#636a48;--neutral-warm-700:#565c3e;--neutral-warm-750:#474c34;--neutral-warm-800:#393d29;--neutral-warm-850:#2a2d1f;--neutral-warm-900:#1d1f15;--neutral-warm-950:#0e0f0b;--neutral-cool-50:#f1f2f3;--neutral-cool-100:#e3e5e8;--neutral-cool-150:#d6d8dc;--neutral-cool-200:#c8cbd0;--neutral-cool-250:#babec4;--neutral-cool-300:#adb2b9;--neutral-cool-350:#9fa5ad;--neutral-cool-400:#9197a1;--neutral-cool-450:#838a95;--neutral-cool-500:#767e8a;--neutral-cool-550:#6a717c;--neutral-cool-600:#5e646e;--neutral-cool-650:#525860;--neutral-cool-700:#474c53;--neutral-cool-750:#3b3f45;--neutral-cool-800:#2f3237;--neutral-cool-850:#232529;--neutral-cool-900:#1b1c18;--neutral-cool-950:#0e0e0c;--orange-850:#4c3201;--content-warning:var(--orange-400);--content-danger-bold-disabled:var(--red-800);--content-success-bold-disabled:var(--green-700);--background-secondary:var(--neutral-warm-50);--background-tertiary:var(--neutral-warm-100);--background-hover:var(--neutral-warm-50);--background-pressed:var(--neutral-warm-100);--background-disabled:var(--neutral-warm-50);--background-inverse:var(--neutral-warm-900);--border-primary:var(--neutral-warm-600);--border-secondary:var(--neutral-warm-400);--border-tertiary:var(--neutral-warm-200);--border-disabled:var(--neutral-warm-200);--blue-100:#d2dcfd;--blue-200:#a5b9fb;--blue-300:#7995fa;--blue-400:#4c72f8;--blue-500:#1f4ff6;--blue-600:#193fc5;--blue-700:#132f94;--blue-800:#0c2062;--blue-900:#061031;--brand-100:#fddccc;--brand-200:#fbb899;--brand-300:#f99567;--brand-400:#f77134;--brand-500:#f54e01;--brand-600:#c43e01;--brand-700:#932f01;--brand-800:#621f00;--brand-900:#311000;--green-50:#ebf3e5;--green-100:#d7e7cc;--green-200:#afcf99;--green-300:#88b666;--green-400:#609e33;--green-500:#388600;--green-600:#2d6b00;--green-700:#225000;--green-800:#163600;--green-900:#0b1b00;--neutral-100:#e5e5e5;--neutral-150:#d9d9d9;--neutral-200:#ccc;--neutral-250:#bfbfbf;--neutral-300:#b2b2b2;--neutral-350:#a6a6a6;--neutral-400:#999;--neutral-450:#8c8c8c;--neutral-50:#f2f2f2;--neutral-500:grey;--neutral-550:#737373;--neutral-600:#666;--neutral-650:#595959;--neutral-700:#4d4d4d;--neutral-750:#404040;--neutral-800:#333;--neutral-850:#262626;--neutral-900:#1a1a1a;--neutral-950:#0d0d0d;--orange-50:#fff3e5;--orange-100:#ffe6cc;--orange-200:#fc9;--orange-300:#ffb366;--orange-400:#f93;--orange-500:#ff8000;--orange-600:#c60;--orange-700:#994d00;--orange-800:#630;--orange-900:#331a00;--pink-100:#ffedeb;--pink-200:#ffdbd6;--pink-300:#ffc9c2;--pink-400:#ffb7ad;--pink-500:#ffa599;--pink-600:#cc847a;--pink-700:#99635c;--pink-800:#66423d;--pink-900:#33211f;--primary-black:#000;--primary-black-50:#00000080;--primary-white:#fff;--primary-white-50:#ffffff80;--purple-100:#e0ceff;--purple-200:#c29cff;--purple-300:#a36bff;--purple-400:#8539ff;--purple-500:#6608ff;--purple-600:#5206cc;--purple-700:#3d0599;--purple-800:#290366;--purple-900:#140233;--red-50:#f9ebe6;--red-100:#f8d7cd;--red-200:#f1af9c;--red-300:#e9876a;--red-400:#e25f39;--red-500:#db3707;--red-600:#af2c06;--red-700:#832104;--red-800:#581603;--red-900:#2c0b01;--teal-100:#d9f5f3;--teal-200:#b3eae7;--teal-300:#8de0dc;--teal-400:#67d5d0;--teal-500:#41cbc4;--teal-600:#34a29d;--teal-700:#277a76;--teal-800:#1a514e;--teal-900:#0d2927;--violet-100:#f1d6ff;--violet-200:#e4adff;--violet-300:#d685ff;--violet-400:#c95cff;--violet-500:#b3f;--violet-600:#9629cc;--violet-700:#701f99;--violet-800:#4b1466;--violet-900:#250a33;--yellow-100:#fdedcd;--yellow-200:#fcdb9a;--yellow-300:#fac968;--yellow-400:#f9b735;--yellow-500:#f7a503;--yellow-600:#c68402;--yellow-700:#946302;--yellow-800:#634201;--yellow-900:#312101;--content-primary:var(--neutral-950);--content-secondary:var(--neutral-800);--content-tertiary:var(--neutral-700);--content-primary-inverse:var(--primary-white);--content-secondary-inverse:var(--neutral-100);--content-tertiary-inverse:var(--neutral-300);--content-disabled:var(--neutral-300);--content-brand:var(--brand-500);--content-link:var(--brand-500);--content-link-hover:var(--brand-400);--content-link-pressed:var(--brand-600);--content-warning-bold:var(--orange-700);--content-danger:var(--red-500);--content-danger-bold:var(--red-600);--content-success:var(--green-500);--content-success-bold:var(--green-600);--background-primary:var(--primary-white);--background-secondary:var(--neutral-50);--background-tertiary:var(--neutral-100);--background-hover:var(--neutral-50);--background-pressed:var(--neutral-100);--background-selected:var(--orange-100);--background-disabled:var(--neutral-50);--background-inverse:var(--neutral-900);--background-brand:var(--brand-500);--background-brand-hover:var(--brand-600);--background-brand-pressed:var(--brand-700);--background-warning:var(--orange-500);--background-warning-subtle:var(--orange-50);--background-danger:var(--red-500);--background-danger-subtle:var(--red-50);--background-success:var(--green-500);--background-success-subtle:var(--green-50);--border-primary:var(--neutral-600);--border-secondary:var(--neutral-400);--border-tertiary:var(--neutral-200);--border-disabled:var(--neutral-200);--border-brand:var(--brand-500);--border-inverse:var(--primary-white);--border-focus:var(--blue-500);--border-warning:var(--orange-500);--border-danger:var(--red-500);--border-success:var(--green-500);--overlay-50:var(--primary-black-50);--overlay-50-inverse:var(--primary-white-50);--bg-bridge:#ebece8;--radius:0.375rem;--radius-sm:0.25rem;--radius-lg:0.625rem;--modal-shadow-elevation:0px 16px 16px -16px rgba(0,0,0,.35);--opacity-disabled:0.65;--font-medium:500;--font-semibold:600;--font-sans:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI","Roboto","Helvetica Neue",helvetica,arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-title:"MatterSQ",-apple-system,BlinkMacSystemFont,"Inter","Segoe UI","Roboto","Helvetica Neue",helvetica,arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-mono:ui-monospace,"SFMono-Regular","SF Mono","Menlo","Consolas","Liberation Mono",monospace;--blue:#597dce;--purple:#c278cf;--green:var(--success);--black:var(--text-3000);--data-color-1:#1d4aff;--data-color-2:#621da6;--data-color-3:#42827e;--data-color-4:#ce0e74;--data-color-5:#f14f58;--data-color-6:#7c440e;--data-color-7:#529a0a;--data-color-8:#0476fb;--data-color-9:#fe729e;--data-color-10:#35416b;--data-color-11:#41cbc4;--data-color-12:#b64b02;--data-color-13:#e4a604;--data-color-14:#a56eff;--data-color-15:#30d5c8;--lifecycle-new:#1d4aff;--lifecycle-returning:#388600;--lifecycle-resurrecting:#a56eff;--lifecycle-dormant:#db3707;--lifecycle-new-hover:#0024b6;--lifecycle-returning-hover:#0d2000;--lifecycle-resurrecting-hover:#6608ff;--lifecycle-dormant-hover:#781e04;--funnel-axis:var(--border);--funnel-grid:#ddd;--z-bottom-notice:5100;--z-command-palette:1875;--z-force-modal-above-popovers:1850;--z-tooltip:1070;--z-definition-popover:1065;--z-popover:1064;--z-graph-tooltip:1063;--z-modal:1060;--z-hedgehog-buddy:1059;--z-annotation-popover:1049;--z-drawer:950;--z-notifications-popover:949;--z-main-nav:948;--z-lemon-sidebar:940;--z-lemon-activation-sidebar:939;--z-mobile-nav-overlay:931;--z-top-navigation:800;--z-content-overlay:488;--z-raised:5;--toastify-color-dark:var(--accent-3000-dark);--toastify-color-light:var(--bg-light);--toastify-color-info:var(--primary);--toastify-color-success:var(--success);--toastify-color-warning:var(--warning);--toastify-color-error:var(--danger);--toastify-color-progress-info:var(--toastify-color-info);--toastify-color-progress-success:var(--toastify-color-success);--toastify-color-progress-warning:var(--toastify-color-warning);--toastify-color-progress-error:var(--toastify-color-error);--toastify-toast-background:var(--bg-light);--toastify-toast-width:26rem;--toastify-toast-min-height:3.5rem;--toastify-toast-max-height:16rem;--toastify-text-color-light:#757575;--in-app-prompts-width:26rem;--lettermark-1-bg:#dcb1e3;--lettermark-1-text:#572e5e;--lettermark-2-bg:#ffc4b2;--lettermark-2-text:#3e5891;--lettermark-3-bg:#fdedc9;--lettermark-3-text:#3e5891;--lettermark-4-bg:#3e5891;--lettermark-4-text:#ffc4b2;--lettermark-5-bg:#8da9e7;--lettermark-5-text:#572e5e;--lettermark-6-bg:#572e5e;--lettermark-6-text:#dcb1e3;--lettermark-7-bg:#ffc035;--lettermark-7-text:#35416b;--lettermark-8-bg:#ff906e;--lettermark-8-text:#2a3d65;--modal-backdrop-blur:5px;--modal-backdrop-color:rgba(0,0,0,.2);--modal-transition-time:200ms;--tooltip-bg-light:#2d2d2d;--tooltip-bg-dark:#656d81;--notebook-popover-transition-properties:150ms cubic-bezier(0,0.5,0.5,1);--notebook-column-left-width:27rem;--notebook-column-right-width:20rem;--primary:#1d4aff;--danger-highlight:rgba(219,55,7,.1);--danger-lighter:#ffa599;--danger-light:#df4b20;--danger:#db3707;--danger-dark:#992705;--warning-highlight:rgba(247,165,1,.1);--warning:#f7a501;--warning-dark:#e09423;--highlight:#e49f2c;--success-highlight:rgba(56,134,0,.1);--success-light:#5f9d32;--success:#388600;--success-dark:#245700;--muted:#5f5f5f;--muted-alt:#747ea1;--mark:hsla(42,93%,86%,.8);--white:#fff;--bg-light:#fff;--side:#fafaf9;--mid:#f2f2f2;--border:rgba(0,0,0,.15);--border-light:rgba(0,0,0,.08);--border-bold:rgba(0,0,0,.24);--transparent:transparent;--link:var(--primary-3000);--brand-blue:#1d4aff;--brand-red:#f54e00;--brand-yellow:#f9bd2b;--brand-key:#000;--text-3000-light:#111;--text-secondary-3000-light:hsla(0,0%,7%,.7);--muted-3000-light:hsla(0,0%,7%,.6);--trace-3000-light:hsla(0,0%,7%,.25);--primary-3000-light:#f54e01;--primary-highlight-light:rgba(245,78,1,.1);--primary-3000-hover-light:#f54e01;--primary-3000-active-light:#f54e01;--secondary-3000-light:hsla(68,14%,79%,.6);--secondary-3000-hover-light:#cfd1c2;--accent-3000-light:#eeefe9;--bg-3000-light:#f3f4ef;--border-3000-light:#dadbd2;--border-bold-3000-light:#c1c2b9;--glass-bg-3000-light:hsla(69,12%,88%,.702);--glass-border-3000-light:#e4e5de;--link-3000-light:#f54e00;--primary-3000-frame-bg-light:#eb9d2a;--primary-3000-button-bg-light:#fff;--primary-3000-button-border-light:#b17816;--primary-3000-button-border-hover-light:#8e5b03;--secondary-3000-frame-bg-light:#e1dddd;--secondary-3000-button-bg-light:#f3f4ef;--secondary-3000-button-border-light:#ccc;--secondary-3000-button-border-hover-light:#aaa;--danger-3000-frame-bg-light:rgba(245,78,0,.502);--danger-3000-button-border-light:#e96b30;--danger-3000-button-border-hover-light:#f54e00;--shadow-elevation-3000-light:0 3px 0 var(--border-3000-light);--shadow-elevation-3000-dark:0 3px 0 var(--border-3000-dark);--text-3000-dark:#fff;--text-secondary-3000-dark:hsla(0,0%,100%,.7);--muted-3000-dark:hsla(0,0%,100%,.5);--trace-3000-dark:hsla(0,0%,100%,.25);--primary-3000-dark:#f7a503;--primary-highlight-dark:rgba(247,165,3,.1);--primary-3000-hover-dark:#f7a503;--primary-3000-active-dark:#f7a503;--primary-alt-highlight-light:#e5e7e0;--secondary-3000-dark:#1d1f27;--secondary-3000-hover-dark:#575d77;--accent-3000-dark:#21242b;--bg-3000-dark:#1d1f27;--border-3000-dark:#35373e;--border-bold-3000-dark:#3f4046;--glass-bg-3000-dark:rgba(36,38,42,.6);--glass-border-3000-dark:var(--border-3000-dark);--link-3000-dark:#f1a82c;--primary-3000-frame-bg-dark:#926826;--primary-3000-button-bg-dark:#e0a045;--primary-3000-button-border-dark:#b17816;--primary-3000-button-border-hover-dark:#8e5b03;--primary-alt-highlight-dark:#232429;--secondary-3000-frame-bg-dark:#323232;--secondary-3000-button-bg-dark:#1d1f27;--secondary-3000-button-border-dark:#4a4c52;--secondary-3000-button-border-hover-dark:#5e6064;--danger-3000-frame-bg-dark:rgba(245,78,0,.502);--danger-3000-button-border-dark:#c44003;--danger-3000-button-border-hover-dark:#f54e00;--default:var(--default);--text-3000:var(--text-3000);--text-secondary-3000:var(--text-secondary-3000);--muted-3000:var(--muted-3000);--primary-3000:var(--primary-3000);--secondary-3000:var(--secondary-3000);--secondary-3000-hover:var(--secondary-3000-hover);--accent-3000:var(--accent-3000);--bg-3000:var(--bg-3000);--primary-highlight:var(--primary-highlight);--primary-alt-highlight:var(--primary-alt-highlight);--primary-alt:var(--primary-alt)}*,:after,:before{border-color:var(--border)}input[type=radio]{accent-color:var(--primary-3000)}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{display:none}.page-title-row{align-items:center;display:flex;flex-wrap:wrap;gap:.5rem 1rem;margin:1rem 0 .25rem;min-height:2.5rem}@media screen and (min-width:768px){.page-title-row{flex-wrap:nowrap}}.page-title{font-size:28px;font-weight:600;line-height:34px;margin:0;min-width:0}.page-caption{font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;max-width:48rem}.page-caption.tabbed{margin-bottom:.5rem}.secondary{background:none;border:0;color:var(--primary-alt);font-size:.9em;font-weight:var(--font-medium);letter-spacing:1px;text-transform:uppercase}.card-secondary{color:var(--muted);font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}mark{background-color:var(--mark)!important;border-radius:var(--radius)}hr{border-top:1px solid var(--border);margin:1em 0}input::-ms-clear{display:none}@keyframes highlight{0%{background-color:var(--mark)}to{background-color:initial}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.Toastify__toast{align-items:center;border:1px solid var(--secondary-3000-button-border);border-radius:var(--radius);box-shadow:var(--shadow-elevation-3000);cursor:unset;font-family:var(--font-sans);font-size:1rem;margin-bottom:.5rem;opacity:1!important;padding:.75rem}.Toastify__toast-container{padding:0}.Toastify__toast-body{color:var(--text-3000);font-size:.875rem;font-weight:500;line-height:1.25rem;padding:0}.Toastify__toast-body b,.Toastify__toast-body strong{font-weight:700}.Toastify__toast-body button{margin:0 .75rem}.Toastify__toast-icon{color:var(--muted-alt);font-size:1.5rem;height:1.5rem;margin-right:.75rem;width:1.5rem}.Toastify__toast--success .Toastify__toast-icon{color:var(--toastify-color-success)}.Toastify__toast--warning .Toastify__toast-icon{color:var(--toastify-color-warning)}.Toastify__toast--error .Toastify__toast-icon{color:var(--toastify-color-error)}.Toastify__progress-bar{height:var(--radius)}.error-on-blur.errored:not(:focus){border-color:var(--danger)!important}.info-indicator{color:var(--primary-alt)!important;cursor:pointer;margin-left:4px}.info-indicator.left{margin-left:0;margin-right:4px}.graph-series-glyph{align-items:center;border:2px solid var(--text-3000);border-radius:50%;display:flex;flex-shrink:0;font-size:12px;font-weight:700;height:22px;justify-content:center;pointer-events:none;width:22px}.graph-series-glyph.funnel-step-glyph{background-color:var(--bg-light);border-color:var(--border);color:var(--primary-alt);font-size:unset;height:23px;width:23px}#bottom-notice{background:#000;bottom:0;color:#fff;display:flex!important;flex-direction:row;font-size:.75rem;left:0;line-height:1.5rem;position:fixed;width:100%;z-index:var(--z-bottom-notice)}#bottom-notice code{color:inherit;font-size:inherit}#bottom-notice.warning div{background:var(--danger);height:auto}#bottom-notice.tricolor{cursor:pointer}#bottom-notice.tricolor div:first-child{background:var(--brand-blue)}#bottom-notice.tricolor div:nth-child(2){background:var(--brand-red)}#bottom-notice.tricolor div:nth-child(3){background:var(--brand-yellow)}#bottom-notice.tricolor span{cursor:text}#bottom-notice div{flex-basis:0;flex-grow:1;height:1.5rem;text-align:center}#bottom-notice span{display:none}#bottom-notice button{background:transparent;border:none;color:inherit;cursor:pointer;font-size:1rem;font-weight:700;height:1.5rem;padding:0;width:1.5rem}@media screen and (min-width:750px){#bottom-notice{font-size:1rem;line-height:2rem}#bottom-notice div{height:2rem}#bottom-notice span{display:inline}#bottom-notice button{font-size:1.25rem;height:2rem;width:2rem}}html{-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}input::-moz-placeholder,textarea::-moz-placeholder{color:var(--muted)}input::placeholder,textarea::placeholder{color:var(--muted)}body{background:var(--bg-3000);color:var(--text-3000);font-size:14px;line-height:1.5715;touch-action:manipulation;--primary:var(--primary-3000);--muted:var(--muted-3000);--default:var(--text-3000);--muted-alt:var(--muted-3000);--primary-alt:var(--text-3000);--border:var(--border-3000);--border-bold:var(--border-bold-3000);--data-color-1:#1d4aff;--data-color-1-hover:#1a3cf6;--data-color-10:#35416b}body[theme=light]{--text-3000:var(--text-3000-light);--text-secondary-3000:var(--text-secondary-3000-light);--muted-3000:var(--muted-3000-light);--trace-3000:var(--trace-3000-light);--primary-3000:var(--primary-3000-light);--primary-highlight:var(--primary-highlight-light);--primary-3000-hover:var(--primary-3000-hover-light);--primary-3000-active:var(--primary-3000-active-light);--secondary-3000:var(--secondary-3000-light);--secondary-3000-hover:var(--secondary-3000-hover-light);--accent-3000:var(--accent-3000-light);--bg-3000:var(--bg-3000-light);--border-3000:var(--border-3000-light);--border-light-opaque:#eee;--border-bold-3000:var(--border-bold-3000-light);--glass-bg-3000:var(--glass-bg-3000-light);--glass-border-3000:var(--glass-border-3000-light);--bg-light:#fff;--bg-table:#f9faf7;--link:var(--link-3000-light);--shadow-elevation-3000:var(--shadow-elevation-3000-light);--primary-3000-frame-bg:var(--primary-3000-frame-bg-light);--primary-3000-button-bg:var(--primary-3000-button-bg-light);--primary-3000-button-border:var(--primary-3000-button-border-light);--primary-3000-button-border-hover:var(--primary-3000-button-border-hover-light);--primary-alt-highlight:var(--primary-alt-highlight-light);--secondary-3000-frame-bg:var(--secondary-3000-frame-bg-light);--secondary-3000-button-bg:var(--secondary-3000-button-bg-light);--secondary-3000-button-border:var(--secondary-3000-button-border-light);--secondary-3000-button-border-hover:var(--secondary-3000-button-border-hover-light);--danger-3000-frame-bg:var(--danger-3000-frame-bg-light);--danger-3000-button-border:var(--danger-3000-button-border-light);--danger-3000-button-border-hover:var(--danger-3000-button-border-hover-light);--tooltip-bg:var(--tooltip-bg-light)}body[theme=dark]{--content-primary:var(--neutral-cool-100);--content-warning:var(--orange-300);--content-warning-bold:var(--orange-100);--content-danger-bold:var(--red-100);--content-success-bold:var(--green-100);--background-primary:var(--neutral-cool-900);--background-secondary:var(--neutral-cool-850);--background-tertiary:var(--neutral-cool-800);--background-warning-subtle:var(--orange-850);--background-danger-subtle:var(--red-800);--background-success-subtle:var(--green-800);--border-tertiary:var(--neutral-cool-750);--text-3000:var(--text-3000-dark);--text-secondary-3000:var(--text-secondary-3000-dark);--muted-3000:var(--muted-3000-dark);--trace-3000:var(--trace-3000-dark);--primary-3000:var(--primary-3000-dark);--primary-highlight:var(--primary-highlight-dark);--primary-3000-hover:var(--primary-3000-hover-dark);--primary-3000-active:var(--primary-3000-active-dark);--secondary-3000:var(--secondary-3000-dark);--secondary-3000-hover:var(--secondary-3000-hover-dark);--accent-3000:var(--accent-3000-dark);--bg-3000:var(--bg-3000-dark);--border-3000:var(--border-3000-dark);--border-light-opaque:#1e2028;--border-bold-3000:var(--border-bold-3000-dark);--glass-bg-3000:var(--glass-bg-3000-dark);--glass-border-3000:var(--glass-border-3000-dark);--bg-light:var(--accent-3000);--bg-table:#232429;--brand-key:#fff;--link:var(--link-3000-dark);--shadow-elevation-3000:var(--shadow-elevation-3000-dark);--primary-3000-frame-bg:var(--primary-3000-frame-bg-dark);--primary-3000-button-bg:var(--primary-3000-button-bg-dark);--primary-3000-button-border:var(--primary-3000-button-border-dark);--primary-3000-button-border-hover:var(--primary-3000-button-border-hover-dark);--primary-alt-highlight:var(--primary-alt-highlight-dark);--secondary-3000-frame-bg:var(--secondary-3000-frame-bg-dark);--secondary-3000-button-bg:var(--secondary-3000-button-bg-dark);--secondary-3000-button-border:var(--secondary-3000-button-border-dark);--secondary-3000-button-border-hover:var(--secondary-3000-button-border-hover-dark);--danger-3000-frame-bg:var(--danger-3000-frame-bg-dark);--danger-3000-button-border:var(--danger-3000-button-border-dark);--danger-3000-button-border-hover:var(--danger-3000-button-border-hover-dark);--tooltip-bg:var(--tooltip-bg-dark);--data-color-2:#7f26d9;--data-color-3:#3e7a76;--data-color-4:#bf0d6c;--data-color-5:#f0474f;--data-color-6:#b36114;--data-color-10:#6576b3}body *>::-webkit-scrollbar{height:.5rem;width:.5rem}body *>::-webkit-scrollbar-track{background:var(--accent-3000)}body *>::-webkit-scrollbar-thumb{background:var(--trace-3000);border-radius:var(--radius)}body *>::-webkit-scrollbar-thumb:hover{background:var(--muted-3000)}body b,body strong{font-weight:600}body h1,body h2,body h3,body h4,body h5{font-family:var(--font-title);font-weight:500;margin-bottom:.5em;margin-top:0}body h1,body h2,body h3,body h4{color:var(--text-3000)}body h1{font-size:1.75rem}body h2{font-size:1.3125rem}body h3{font-size:1rem}body h5{color:var(--muted-alt);font-size:.6875rem;font-weight:600;letter-spacing:.075em;line-height:1.5rem;margin-bottom:.25rem;text-transform:uppercase}body pre{margin-bottom:1em;margin-top:0;overflow:auto}body dialog{background-color:var(--bg-3000)}body .LemonButton .text-link,body .Link .text-link{color:var(--text-3000)!important}body .LemonButton:hover .text-link,body .Link:hover .text-link{color:var(--primary-3000)!important}a{color:var(--link);-webkit-text-decoration:none;text-decoration:none}p{margin-bottom:1em;margin-top:0}img{border-style:none;vertical-align:middle}[tabindex="-1"]:focus{outline:none!important}.storybook-test-runner.storybook-test-runner--fullscreen{height:-moz-fit-content;height:fit-content}.storybook-test-runner.storybook-test-runner--padded #storybook-root{display:inline-block}.storybook-test-runner *,.storybook-test-runner :after,.storybook-test-runner :before{animation-duration:0ms!important;animation-fill-mode:forwards!important;animation-iteration-count:1!important;transition-duration:0ms!important}.storybook-test-runner *>::-webkit-scrollbar,.storybook-test-runner .LemonTabs__bar:after,.storybook-test-runner .scrollable:after,.storybook-test-runner .scrollable:before,.storybook-test-runner ::-webkit-scrollbar{display:none}.storybook-test-runner #storybook-root:empty~.ReactModalPortal>.ReactModal__Overlay,.storybook-test-runner #storybook-root>.fixed:only-child{position:static!important}.ligatures-none{font-feature-settings:none;font-variant-ligatures:none}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{display:none}.\\*\\:w-80>*{width:20rem!important}.\\*\\:grow>*{flex-grow:1!important}.\\*\\:p-1>*{padding:.25rem!important}.\\*\\:\\*\\:font-medium>*>*{font-weight:500!important}.placeholder\\:\\*\\:\\*\\:font-medium>*>::-moz-placeholder{font-weight:500!important}.placeholder\\:\\*\\:\\*\\:font-medium>*>::placeholder{font-weight:500!important}.before\\:absolute:before{content:var(--tw-content)!important;position:absolute!important}.before\\:inset-0:before{content:var(--tw-content)!important;inset:0!important}.before\\:rounded:before{border-radius:var(--radius)!important;content:var(--tw-content)!important}.before\\:border:before{border-width:1px!important;content:var(--tw-content)!important}.first\\:mt-0:first-child{margin-top:0!important}.first\\:border-t-0:first-child{border-top-width:0!important}.last\\:border-b-0:last-child{border-bottom-width:0!important}.odd\\:last\\:\\*\\:col-span-2>:last-child:nth-child(odd){grid-column:span 2/span 2!important}.hover\\:border-\\[var\\(--primary\\)\\]:hover{border-color:var(--primary)!important}.hover\\:bg-\\[var\\(--bg-light\\)\\]:hover{background-color:var(--bg-light)!important}.hover\\:underline:hover{text-decoration-line:underline!important}.hover\\:opacity-100:hover{opacity:1!important}.hover\\:ring-2:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.focus\\:outline-none:focus{outline:2px solid transparent!important;outline-offset:2px!important}.group:hover .group-hover\\:visible{visibility:visible!important}.group:hover .group-hover\\:flex{display:flex!important}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.group:hover .group-hover\\:animate-bounce{animation:bounce 1s infinite!important}.group:hover .group-hover\\:opacity-100{opacity:1!important}.group:hover .group-hover\\:opacity-90{opacity:.9!important}@container og (min-width: 20rem){.\\@xs\\/og\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@container og (min-width: 28rem){.\\@md\\/og\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}}@container (min-width: 28rem){.\\@md\\:block{display:block!important}.\\@md\\:flex{display:flex!important}.\\@md\\:hidden{display:none!important}.\\@md\\:px-1{padding-left:.25rem!important;padding-right:.25rem!important}}@container (min-width: 56rem){.\\@4xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@media not all and (min-width:576px){.max-sm\\:hidden{display:none!important}}@media (min-width:576px){.sm\\:mb-0{margin-bottom:0!important}.sm\\:block{display:block!important}.sm\\:flex{display:flex!important}.sm\\:min-w-0{min-width:0!important}.sm\\:grow-0{flex-grow:0!important}.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\\:flex-row{flex-direction:row!important}.sm\\:items-start{align-items:flex-start!important}.sm\\:justify-center{justify-content:center!important}.sm\\:p-6{padding:1.5rem!important}.sm\\:pb-0{padding-bottom:0!important}.sm\\:pb-8{padding-bottom:2rem!important}}@media (min-width:768px){.md\\:col-span-1{grid-column:span 1/span 1!important}.md\\:col-span-2{grid-column:span 2/span 2!important}.md\\:col-span-6{grid-column:span 6/span 6!important}.md\\:col-span-full{grid-column:1/-1!important}.md\\:col-start-2{grid-column-start:2!important}.md\\:row-span-1{grid-row:span 1/span 1!important}.md\\:block{display:block!important}.md\\:inline{display:inline!important}.md\\:flex{display:flex!important}.md\\:grid{display:grid!important}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\\:grid-cols-\\[320px_1fr\\]{grid-template-columns:320px 1fr!important}.md\\:grid-cols-\\[repeat\\(3\\2c _minmax\\(min-content\\2c _160px\\)\\)\\]{grid-template-columns:repeat(3,minmax(min-content,160px))!important}.md\\:border-b-0{border-bottom-width:0!important}.md\\:p-6{padding:1.5rem!important}}@media (min-width:992px){.lg\\:grid-cols-\\[12\\.5rem_1fr\\]{grid-template-columns:12.5rem 1fr!important}}@media (min-width:1200px){.xl\\:mt-0{margin-top:0!important}.xl\\:flex{display:flex!important}.xl\\:pl-2{padding-left:.5rem!important}}@media (prefers-color-scheme:dark){.dark\\:text-\\[\\#C170E8\\]{--tw-text-opacity:1!important;color:rgb(193 112 232/var(--tw-text-opacity))!important}}.\\[\\&\\>\\*\\]\\:grow>*{flex-grow:1!important}@media (min-width:768px){.md\\:\\[\\&\\>\\*\\]\\:grow-0>*{flex-grow:0!important}}.\\[\\&\\>input\\:\\:-webkit-inner-spin-button\\]\\:appearance-none>input::-webkit-inner-spin-button{-webkit-appearance:none!important;appearance:none!important}.\\[\\&_\\>\\*\\]\\:px-2>*{padding-left:.5rem!important;padding-right:.5rem!important}.\\[\\&_\\>\\*\\]\\:py-0\\.5>*{padding-bottom:.125rem!important;padding-top:.125rem!important}.\\[\\&_\\>span\\>span\\]\\:flex-col>span>span{flex-direction:column!important}.\\[\\&_\\>span\\>span\\]\\:items-start>span>span{align-items:flex-start!important}.\\[\\&_\\>span\\>span\\]\\:space-y-1>span>span>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0!important;margin-bottom:calc(.25rem*var(--tw-space-y-reverse))!important;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))!important}.SidePanel3000 .\\[\\.SidePanel3000_\\&\\]\\:top-0{top:0!important}',""]),module.exports=exports},"./frontend/public/hedgehog/running-hog.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/running-hog.d286878cf0d59615f60a05cc434e29a0.png"},"./frontend/public/langfuse-icon.svg":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/langfuse-icon.7106297f8ddfacfd23f2e0a5a16846e1.svg"},"./frontend/public/not-found-astrohog.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/not-found-astrohog.a4e3a59b90ccd886ab4231c270e5d92f.png"},"./frontend/public/posthog-icon.svg":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/posthog-icon.14d048148d45b6fe9c0a5d829469b0e5.svg"},"./frontend/public/services/aws-s3.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/aws-s3.ec2332979c65a4e9a2fa28ddc65f0468.png"},"./frontend/public/services/bigquery.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/bigquery.1bd7c5187189fe1c78abeab849f5e0ec.png"},"./frontend/public/services/google-cloud-storage.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/google-cloud-storage.e1bd2d5efb0bf56cf48e9e90cd2c6c3a.png"},"./frontend/public/services/hubspot.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/hubspot.aa61b2aaad7e9eeeb43f46d98988323d.png"},"./frontend/public/services/postgres.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/postgres.dc5b1b72f73b1a6c2c9d6d354a204e17.png"},"./frontend/public/services/salesforce.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/salesforce.3b4908e6f4a90fc0607f295de7908a58.png"},"./frontend/public/services/snowflake.png":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{Z:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"images/snowflake.e08a91548c74ea3172ae2f0c9d22b0f8.png"},"./frontend/public/Inter.woff":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"fonts/Inter.10f84849b8a69b4844b2925080f81a97.woff"},"./frontend/public/Inter.woff2":(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{default:()=>__WEBPACK_DEFAULT_EXPORT__});let __WEBPACK_DEFAULT_EXPORT__=__webpack_require__.p+"fonts/Inter.7cb807e6006c622d46c52bf1fdf0ece1.woff2"},"./node_modules/.pnpm/memoizerific@1.11.3/node_modules/memoizerific sync recursive":module=>{function webpackEmptyContext(req){var e=Error("Cannot find module '"+req+"'");throw e.code="MODULE_NOT_FOUND",e}webpackEmptyContext.keys=()=>[],webpackEmptyContext.resolve=webpackEmptyContext,webpackEmptyContext.id="./node_modules/.pnpm/memoizerific@1.11.3/node_modules/memoizerific sync recursive",module.exports=webpackEmptyContext},"./frontend/src/lib/components/Cards/InsightCard/InsightCard.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightCard_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/Cards/InsightCard/InsightCard.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightCard_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightCard_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightCard_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightCard_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/lib/components/HedgehogBuddy/HedgehogBuddy.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_HedgehogBuddy_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/components/HedgehogBuddy/HedgehogBuddy.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_HedgehogBuddy_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_HedgehogBuddy_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_HedgehogBuddy_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_HedgehogBuddy_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/lib/lemon-ui/Popover/Popover.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Popover_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/lib/lemon-ui/Popover/Popover.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Popover_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Popover_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Popover_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Popover_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/billing/Billing.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Billing_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/billing/Billing.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Billing_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Billing_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Billing_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_Billing_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/feature-flags/FeatureFlag.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FeatureFlag_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/feature-flags/FeatureFlag.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FeatureFlag_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FeatureFlag_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FeatureFlag_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FeatureFlag_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/insights/InsightTooltip/InsightTooltip.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightTooltip_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/InsightTooltip/InsightTooltip.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightTooltip_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightTooltip_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightTooltip_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_InsightTooltip_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/insights/filters/BreakdownFilter/BreakdownTagMenu.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_BreakdownTagMenu_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/filters/BreakdownFilter/BreakdownTagMenu.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_BreakdownTagMenu_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_BreakdownTagMenu_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_BreakdownTagMenu_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_BreakdownTagMenu_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/insights/views/Funnels/FunnelCorrelationTable.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FunnelCorrelationTable_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/insights/views/Funnels/FunnelCorrelationTable.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FunnelCorrelationTable_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FunnelCorrelationTable_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FunnelCorrelationTable_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_FunnelCorrelationTable_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/notebooks/NotebookScene.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_NotebookScene_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/notebooks/NotebookScene.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_NotebookScene_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_NotebookScene_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_NotebookScene_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_NotebookScene_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/persons/PersonDisplay.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PersonDisplay_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/persons/PersonDisplay.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PersonDisplay_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PersonDisplay_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PersonDisplay_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PersonDisplay_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/saved-insights/SavedInsights.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_SavedInsights_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/saved-insights/SavedInsights.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_SavedInsights_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_SavedInsights_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_SavedInsights_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_SavedInsights_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/scenes/session-recordings/player/PlayerMeta.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PlayerMeta_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/scenes/session-recordings/player/PlayerMeta.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PlayerMeta_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PlayerMeta_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PlayerMeta_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_PlayerMeta_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"./frontend/src/styles/global.scss":(__unused_webpack_module,__unused_webpack___webpack_exports__,__webpack_require__)=>{"use strict";var _node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("./node_modules/.pnpm/style-loader@2.0.0_webpack@5.88.2/node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"),_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_global_scss__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("./node_modules/.pnpm/css-loader@3.6.0_webpack@5.88.2/node_modules/css-loader/dist/cjs.js!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.4.31_webpack@5.88.2/node_modules/postcss-loader/dist/cjs.js!./node_modules/.pnpm/sass-loader@10.3.1_sass@1.56.0_webpack@5.88.2/node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[2].use[3]!./frontend/src/styles/global.scss"),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_global_scss__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_global_scss__WEBPACK_IMPORTED_MODULE_1__),options={};options.insert="head",options.singleton=!1,_node_modules_pnpm_style_loader_2_0_0_webpack_5_88_2_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_global_scss__WEBPACK_IMPORTED_MODULE_1___default(),options),_node_modules_pnpm_css_loader_3_6_0_webpack_5_88_2_node_modules_css_loader_dist_cjs_js_node_modules_pnpm_postcss_loader_4_3_0_postcss_8_4_31_webpack_5_88_2_node_modules_postcss_loader_dist_cjs_js_node_modules_pnpm_sass_loader_10_3_1_sass_1_56_0_webpack_5_88_2_node_modules_sass_loader_dist_cjs_js_ruleSet_1_rules_2_use_3_global_scss__WEBPACK_IMPORTED_MODULE_1___default().locals},"@storybook/channels":module=>{"use strict";module.exports=__STORYBOOK_MODULE_CHANNELS__},"@storybook/client-logger":module=>{"use strict";module.exports=__STORYBOOK_MODULE_CLIENT_LOGGER__},"@storybook/core-events":module=>{"use strict";module.exports=__STORYBOOK_MODULE_CORE_EVENTS__},"@storybook/global":module=>{"use strict";module.exports=__STORYBOOK_MODULE_GLOBAL__},"@storybook/preview-api":module=>{"use strict";module.exports=__STORYBOOK_MODULE_PREVIEW_API__},"?cafa":()=>{},"?4c41":()=>{},"?0634":()=>{},"?8b23":()=>{},"?4d21":()=>{},"?46f2":()=>{},"./frontend/src/mocks/fixtures/_instance_status.json":module=>{"use strict";module.exports=JSON.parse('{"results":{"overview":[{"key":"posthog_git_sha","metric":"PostHog Git SHA","value":"Undefined"},{"key":"analytics_database","metric":"Analytics database in use","value":"ClickHouse"},{"key":"plugin_sever_alive","metric":"Plugin server alive","value":true},{"key":"plugin_sever_version","metric":"Plugin server version","value":"1.10.5"},{"key":"plugin_sever_job_queues","metric":"Job queues enabled in plugin server","value":"Graphile"},{"key":"db_alive","metric":"Postgres database alive","value":true},{"key":"pg_version","metric":"Postgres version","value":"12.0.9"},{"key":"async_migrations_ok","metric":"Async migrations up-to-date","value":true},{"key":"clickhouse_alive","metric":"Clickhouse database alive","value":true},{"key":"clickhouse_event_count","metric":"Events in ClickHouse","value":175843},{"key":"clickhouse_event_count_last_month","metric":"Events recorded last month","value":904},{"key":"clickhouse_event_count_month_to_date","metric":"Events recorded month to date","value":173420},{"key":"clickhouse_disk_0_free_space","metric":"Clickhouse disk free space","value":"28.79 GiB"},{"key":"clickhouse_disk_0_total_space","metric":"Clickhouse disk total space","value":"58.42 GiB"},{"key":"clickhouse_table_sizes","metric":"Clickhouse table sizes","value":"","subrows":{"columns":["Table","Size","Rows"],"rows":[["asynchronous_metric_log","161.20 MiB",137266041],["text_log","584.87 MiB",29580188],["metric_log","25.78 MiB",297922],["query_thread_log","18.04 MiB",219137],["events","34.39 MiB",176855],["events_dead_letter_queue","40.32 MiB",114794],["query_log","9.62 MiB",78456],["person","1.94 MiB",42393],["person_distinct_id2","1.63 MiB",40542],["person_distinct_id","1.55 MiB",40539],["plugin_log_entries","7.64 KiB",94],["session_recording_events","9.91 KiB",62],["infi_clickhouse_orm_migrations","1.58 KiB",46],["groups","5.25 KiB",22]]}},{"key":"clickhouse_system_metrics","metric":"Clickhouse system metrics","value":"","subrows":{"columns":["Metric","Value","Description"],"rows":[["ActiveAsyncDrainedConnections",0,"Number of active connections drained asynchronously."],["ActiveSyncDrainedConnections",0,"Number of active connections drained synchronously."],["AsyncDrainedConnections",0,"Number of connections drained asynchronously."],["AsynchronousMetricsCalculationTimeSpent",0.002780791],["BackgroundBufferFlushSchedulePoolTask",0,"Number of active tasks in BackgroundBufferFlushSchedulePool. This pool is used for periodic Buffer flushes"],["BackgroundDistributedSchedulePoolTask",0,"Number of active tasks in BackgroundDistributedSchedulePool. This pool is used for distributed sends that is done in background."],["BackgroundFetchesPoolTask",0,"Number of active tasks in BackgroundFetchesPool"],["BackgroundMessageBrokerSchedulePoolTask",15,"Number of active tasks in BackgroundProcessingPool for message streaming"],["BackgroundMovePoolTask",0,"Number of active tasks in BackgroundProcessingPool for moves"],["BackgroundPoolTask",0,"Number of active tasks in BackgroundProcessingPool (merges, mutations, or replication queue bookkeeping)"],["BackgroundSchedulePoolTask",0,"Number of active tasks in BackgroundSchedulePool. This pool is used for periodic ReplicatedMergeTree tasks, like cleaning old data parts, altering data parts, replica re-initialization, etc."],["BlockActiveTime_nbd0",0],["BlockActiveTime_nbd1",0],["BlockActiveTime_nbd10",0],["BlockActiveTime_nbd11",0],["BlockActiveTime_nbd12",0],["BlockActiveTime_nbd13",0],["BlockActiveTime_nbd14",0],["BlockActiveTime_nbd15",0],["BlockActiveTime_nbd2",0],["BlockActiveTime_nbd3",0],["BlockActiveTime_nbd4",0],["BlockActiveTime_nbd5",0],["BlockActiveTime_nbd6",0],["BlockActiveTime_nbd7",0],["BlockActiveTime_nbd8",0],["BlockActiveTime_nbd9",0],["BlockActiveTime_vda",0.000011],["BlockDiscardBytes_nbd0",0],["BlockDiscardBytes_nbd1",0],["BlockDiscardBytes_nbd10",0],["BlockDiscardBytes_nbd11",0],["BlockDiscardBytes_nbd12",0],["BlockDiscardBytes_nbd13",0],["BlockDiscardBytes_nbd14",0],["BlockDiscardBytes_nbd15",0],["BlockDiscardBytes_nbd2",0],["BlockDiscardBytes_nbd3",0],["BlockDiscardBytes_nbd4",0],["BlockDiscardBytes_nbd5",0],["BlockDiscardBytes_nbd6",0],["BlockDiscardBytes_nbd7",0],["BlockDiscardBytes_nbd8",0],["BlockDiscardBytes_nbd9",0],["BlockDiscardBytes_vda",0],["BlockDiscardMerges_nbd0",0],["BlockDiscardMerges_nbd1",0],["BlockDiscardMerges_nbd10",0],["BlockDiscardMerges_nbd11",0],["BlockDiscardMerges_nbd12",0],["BlockDiscardMerges_nbd13",0],["BlockDiscardMerges_nbd14",0],["BlockDiscardMerges_nbd15",0],["BlockDiscardMerges_nbd2",0],["BlockDiscardMerges_nbd3",0],["BlockDiscardMerges_nbd4",0],["BlockDiscardMerges_nbd5",0],["BlockDiscardMerges_nbd6",0],["BlockDiscardMerges_nbd7",0],["BlockDiscardMerges_nbd8",0],["BlockDiscardMerges_nbd9",0],["BlockDiscardMerges_vda",0],["BlockDiscardOps_nbd0",0],["BlockDiscardOps_nbd1",0],["BlockDiscardOps_nbd10",0],["BlockDiscardOps_nbd11",0],["BlockDiscardOps_nbd12",0],["BlockDiscardOps_nbd13",0],["BlockDiscardOps_nbd14",0],["BlockDiscardOps_nbd15",0],["BlockDiscardOps_nbd2",0],["BlockDiscardOps_nbd3",0],["BlockDiscardOps_nbd4",0],["BlockDiscardOps_nbd5",0],["BlockDiscardOps_nbd6",0],["BlockDiscardOps_nbd7",0],["BlockDiscardOps_nbd8",0],["BlockDiscardOps_nbd9",0],["BlockDiscardOps_vda",0],["BlockDiscardTime_nbd0",0],["BlockDiscardTime_nbd1",0],["BlockDiscardTime_nbd10",0],["BlockDiscardTime_nbd11",0],["BlockDiscardTime_nbd12",0],["BlockDiscardTime_nbd13",0],["BlockDiscardTime_nbd14",0],["BlockDiscardTime_nbd15",0],["BlockDiscardTime_nbd2",0],["BlockDiscardTime_nbd3",0],["BlockDiscardTime_nbd4",0],["BlockDiscardTime_nbd5",0],["BlockDiscardTime_nbd6",0],["BlockDiscardTime_nbd7",0],["BlockDiscardTime_nbd8",0],["BlockDiscardTime_nbd9",0],["BlockDiscardTime_vda",0],["BlockInFlightOps_nbd0",0],["BlockInFlightOps_nbd1",0],["BlockInFlightOps_nbd10",0],["BlockInFlightOps_nbd11",0],["BlockInFlightOps_nbd12",0],["BlockInFlightOps_nbd13",0],["BlockInFlightOps_nbd14",0],["BlockInFlightOps_nbd15",0],["BlockInFlightOps_nbd2",0],["BlockInFlightOps_nbd3",0],["BlockInFlightOps_nbd4",0],["BlockInFlightOps_nbd5",0],["BlockInFlightOps_nbd6",0],["BlockInFlightOps_nbd7",0],["BlockInFlightOps_nbd8",0],["BlockInFlightOps_nbd9",0],["BlockInFlightOps_vda",0],["BlockQueueTime_nbd0",0],["BlockQueueTime_nbd1",0],["BlockQueueTime_nbd10",0],["BlockQueueTime_nbd11",0],["BlockQueueTime_nbd12",0],["BlockQueueTime_nbd13",0],["BlockQueueTime_nbd14",0],["BlockQueueTime_nbd15",0],["BlockQueueTime_nbd2",0],["BlockQueueTime_nbd3",0],["BlockQueueTime_nbd4",0],["BlockQueueTime_nbd5",0],["BlockQueueTime_nbd6",0],["BlockQueueTime_nbd7",0],["BlockQueueTime_nbd8",0],["BlockQueueTime_nbd9",0],["BlockQueueTime_vda",0.000009999999999999999],["BlockReadBytes_nbd0",0],["BlockReadBytes_nbd1",0],["BlockReadBytes_nbd10",0],["BlockReadBytes_nbd11",0],["BlockReadBytes_nbd12",0],["BlockReadBytes_nbd13",0],["BlockReadBytes_nbd14",0],["BlockReadBytes_nbd15",0],["BlockReadBytes_nbd2",0],["BlockReadBytes_nbd3",0],["BlockReadBytes_nbd4",0],["BlockReadBytes_nbd5",0],["BlockReadBytes_nbd6",0],["BlockReadBytes_nbd7",0],["BlockReadBytes_nbd8",0],["BlockReadBytes_nbd9",0],["BlockReadBytes_vda",0],["BlockReadMerges_nbd0",0],["BlockReadMerges_nbd1",0],["BlockReadMerges_nbd10",0],["BlockReadMerges_nbd11",0],["BlockReadMerges_nbd12",0],["BlockReadMerges_nbd13",0],["BlockReadMerges_nbd14",0],["BlockReadMerges_nbd15",0],["BlockReadMerges_nbd2",0],["BlockReadMerges_nbd3",0],["BlockReadMerges_nbd4",0],["BlockReadMerges_nbd5",0],["BlockReadMerges_nbd6",0],["BlockReadMerges_nbd7",0],["BlockReadMerges_nbd8",0],["BlockReadMerges_nbd9",0],["BlockReadMerges_vda",0],["BlockReadOps_nbd0",0],["BlockReadOps_nbd1",0],["BlockReadOps_nbd10",0],["BlockReadOps_nbd11",0],["BlockReadOps_nbd12",0],["BlockReadOps_nbd13",0],["BlockReadOps_nbd14",0],["BlockReadOps_nbd15",0],["BlockReadOps_nbd2",0],["BlockReadOps_nbd3",0],["BlockReadOps_nbd4",0],["BlockReadOps_nbd5",0],["BlockReadOps_nbd6",0],["BlockReadOps_nbd7",0],["BlockReadOps_nbd8",0],["BlockReadOps_nbd9",0],["BlockReadOps_vda",0],["BlockReadTime_nbd0",0],["BlockReadTime_nbd1",0],["BlockReadTime_nbd10",0],["BlockReadTime_nbd11",0],["BlockReadTime_nbd12",0],["BlockReadTime_nbd13",0],["BlockReadTime_nbd14",0],["BlockReadTime_nbd15",0],["BlockReadTime_nbd2",0],["BlockReadTime_nbd3",0],["BlockReadTime_nbd4",0],["BlockReadTime_nbd5",0],["BlockReadTime_nbd6",0],["BlockReadTime_nbd7",0],["BlockReadTime_nbd8",0],["BlockReadTime_nbd9",0],["BlockReadTime_vda",0],["BlockWriteBytes_nbd0",0],["BlockWriteBytes_nbd1",0],["BlockWriteBytes_nbd10",0],["BlockWriteBytes_nbd11",0],["BlockWriteBytes_nbd12",0],["BlockWriteBytes_nbd13",0],["BlockWriteBytes_nbd14",0],["BlockWriteBytes_nbd15",0],["BlockWriteBytes_nbd2",0],["BlockWriteBytes_nbd3",0],["BlockWriteBytes_nbd4",0],["BlockWriteBytes_nbd5",0],["BlockWriteBytes_nbd6",0],["BlockWriteBytes_nbd7",0],["BlockWriteBytes_nbd8",0],["BlockWriteBytes_nbd9",0],["BlockWriteBytes_vda",253952],["BlockWriteMerges_nbd0",0],["BlockWriteMerges_nbd1",0],["BlockWriteMerges_nbd10",0],["BlockWriteMerges_nbd11",0],["BlockWriteMerges_nbd12",0],["BlockWriteMerges_nbd13",0],["BlockWriteMerges_nbd14",0],["BlockWriteMerges_nbd15",0],["BlockWriteMerges_nbd2",0],["BlockWriteMerges_nbd3",0],["BlockWriteMerges_nbd4",0],["BlockWriteMerges_nbd5",0],["BlockWriteMerges_nbd6",0],["BlockWriteMerges_nbd7",0],["BlockWriteMerges_nbd8",0],["BlockWriteMerges_nbd9",0],["BlockWriteMerges_vda",0],["BlockWriteOps_nbd0",0],["BlockWriteOps_nbd1",0],["BlockWriteOps_nbd10",0],["BlockWriteOps_nbd11",0],["BlockWriteOps_nbd12",0],["BlockWriteOps_nbd13",0],["BlockWriteOps_nbd14",0],["BlockWriteOps_nbd15",0],["BlockWriteOps_nbd2",0],["BlockWriteOps_nbd3",0],["BlockWriteOps_nbd4",0],["BlockWriteOps_nbd5",0],["BlockWriteOps_nbd6",0],["BlockWriteOps_nbd7",0],["BlockWriteOps_nbd8",0],["BlockWriteOps_nbd9",0],["BlockWriteOps_vda",12],["BlockWriteTime_nbd0",0],["BlockWriteTime_nbd1",0],["BlockWriteTime_nbd10",0],["BlockWriteTime_nbd11",0],["BlockWriteTime_nbd12",0],["BlockWriteTime_nbd13",0],["BlockWriteTime_nbd14",0],["BlockWriteTime_nbd15",0],["BlockWriteTime_nbd2",0],["BlockWriteTime_nbd3",0],["BlockWriteTime_nbd4",0],["BlockWriteTime_nbd5",0],["BlockWriteTime_nbd6",0],["BlockWriteTime_nbd7",0],["BlockWriteTime_nbd8",0],["BlockWriteTime_nbd9",0],["BlockWriteTime_vda",0.000008],["BrokenDistributedFilesToInsert",0,"Number of files for asynchronous insertion into Distributed tables that has been marked as broken. This metric will starts from 0 on start. Number of files for every shard is summed."],["CacheDictionaryUpdateQueueBatches",0,"Number of \'batches\' (a set of keys) in update queue in CacheDictionaries."],["CacheDictionaryUpdateQueueKeys",0,"Exact number of keys in update queue in CacheDictionaries."],["ContextLockWait",0,"Number of threads waiting for lock in Context. This is global lock."],["DelayedInserts",0,"Number of INSERT queries that are throttled due to high number of active data parts for partition in a MergeTree table."],["DictCacheRequests",0,"Number of requests in fly to data sources of dictionaries of cache type."],["DiskAvailable_default",30909685760],["DiskSpaceReservedForMerge",0,"Disk space reserved for currently running background merges. It is slightly more than the total size of currently merging parts."],["DiskTotal_default",62725623808],["DiskUnreserved_default",30909685760],["DiskUsed_default",31815938048],["DistributedFilesToInsert",0,"Number of pending files to process for asynchronous insertion into Distributed tables. Number of files for every shard is summed."],["DistributedSend",0,"Number of connections to remote servers sending data that was INSERTed into Distributed tables. Both synchronous and asynchronous mode."],["EphemeralNode",0,"Number of ephemeral nodes hold in ZooKeeper."],["FilesystemLogsPathAvailableBytes",30909685760],["FilesystemLogsPathAvailableINodes",3024789],["FilesystemLogsPathTotalBytes",62725623808],["FilesystemLogsPathTotalINodes",3907584],["FilesystemLogsPathUsedBytes",31815938048],["FilesystemLogsPathUsedINodes",882795],["FilesystemMainPathAvailableBytes",30909685760],["FilesystemMainPathAvailableINodes",3024789],["FilesystemMainPathTotalBytes",62725623808],["FilesystemMainPathTotalINodes",3907584],["FilesystemMainPathUsedBytes",31815938048],["FilesystemMainPathUsedINodes",882795],["GlobalThread",208,"Number of threads in global thread pool."],["GlobalThreadActive",164,"Number of threads in global thread pool running a task."],["HTTPConnection",0,"Number of connections to HTTP server"],["HTTPThreads",1],["InterserverConnection",0,"Number of connections from other replicas to fetch parts"],["InterserverThreads",0],["Jitter",0.000253],["LoadAverage1",0.56],["LoadAverage15",0.25],["LoadAverage5",0.34],["LocalThread",0,"Number of threads in local thread pools. The threads in local thread pools are taken from the global thread pool."],["LocalThreadActive",0,"Number of threads in local thread pools running a task."],["MMapCacheCells",0],["MMappedFileBytes",1958451168,"Sum size of mmapped file regions."],["MMappedFiles",7,"Total number of mmapped files."],["MarkCacheBytes",3995568],["MarkCacheFiles",6657],["MaxDDLEntryID",442,"Max processed DDL entry of DDLWorker."],["MaxPartCountForPartition",8],["MaxPushedDDLEntryID",442,"Max DDL entry of DDLWorker that pushed to zookeeper."],["MemoryCode",265568256],["MemoryDataAndStack",22894653440],["MemoryResident",757252096],["MemoryShared",270368768],["MemoryTracking",757483984,"Total amount of memory (bytes) allocated by the server."],["MemoryVirtual",25127219200],["Merge",0,"Number of executing background merges"],["MySQLConnection",0,"Number of client connections using MySQL protocol"],["MySQLThreads",0],["NetworkReceive",0,"Number of threads receiving data from network. Only ClickHouse-related network interaction is included, not by 3rd party libraries."],["NetworkReceiveBytes_eth0",20222],["NetworkReceiveBytes_ip6tnl0",0],["NetworkReceiveBytes_tunl0",0],["NetworkReceiveDrop_eth0",0],["NetworkReceiveDrop_ip6tnl0",0],["NetworkReceiveDrop_tunl0",0],["NetworkReceiveErrors_eth0",0],["NetworkReceiveErrors_ip6tnl0",0],["NetworkReceiveErrors_tunl0",0],["NetworkReceivePackets_eth0",59],["NetworkReceivePackets_ip6tnl0",0],["NetworkReceivePackets_tunl0",0],["NetworkSend",0,"Number of threads sending data to network. Only ClickHouse-related network interaction is included, not by 3rd party libraries."],["NetworkSendBytes_eth0",6902],["NetworkSendBytes_ip6tnl0",0],["NetworkSendBytes_tunl0",0],["NetworkSendDrop_eth0",0],["NetworkSendDrop_ip6tnl0",0],["NetworkSendDrop_tunl0",0],["NetworkSendErrors_eth0",0],["NetworkSendErrors_ip6tnl0",0],["NetworkSendErrors_tunl0",0],["NetworkSendPackets_eth0",32],["NetworkSendPackets_ip6tnl0",0],["NetworkSendPackets_tunl0",0],["NumberOfDatabases",4],["NumberOfTables",128],["OSContextSwitches",6175],["OSGuestNiceTime",0],["OSGuestNiceTimeCPU0",0],["OSGuestNiceTimeCPU1",0],["OSGuestNiceTimeCPU2",0],["OSGuestNiceTimeCPU3",0],["OSGuestNiceTimeCPU4",0],["OSGuestNiceTimeCPU5",0],["OSGuestNiceTimeCPU6",0],["OSGuestNiceTimeCPU7",0],["OSGuestNiceTimeNormalized",0],["OSGuestTime",0],["OSGuestTimeCPU0",0],["OSGuestTimeCPU1",0],["OSGuestTimeCPU2",0],["OSGuestTimeCPU3",0],["OSGuestTimeCPU4",0],["OSGuestTimeCPU5",0],["OSGuestTimeCPU6",0],["OSGuestTimeCPU7",0],["OSGuestTimeNormalized",0],["OSIOWaitTime",0],["OSIOWaitTimeCPU0",0],["OSIOWaitTimeCPU1",0],["OSIOWaitTimeCPU2",0],["OSIOWaitTimeCPU3",0],["OSIOWaitTimeCPU4",0],["OSIOWaitTimeCPU5",0],["OSIOWaitTimeCPU6",0],["OSIOWaitTimeCPU7",0],["OSIOWaitTimeNormalized",0],["OSIdleTime",6.238421679315133],["OSIdleTimeCPU0",0.7698052392744635],["OSIdleTimeCPU1",0.7997976511942478],["OSIdleTimeCPU2",0.719817886074823],["OSIdleTimeCPU3",0.7997976511942478],["OSIdleTimeCPU4",0.6698305328751826],["OSIdleTimeCPU5",0.8097951218341759],["OSIdleTimeCPU6",0.8197925924741041],["OSIdleTimeCPU7",0.8497850043938884],["OSIdleTimeNormalized",0.7798027099143916],["OSInterrupts",4856],["OSIrqTime",0],["OSIrqTimeCPU0",0],["OSIrqTimeCPU1",0],["OSIrqTimeCPU2",0],["OSIrqTimeCPU3",0],["OSIrqTimeCPU4",0],["OSIrqTimeCPU5",0],["OSIrqTimeCPU6",0],["OSIrqTimeCPU7",0],["OSIrqTimeNormalized",0],["OSMemoryAvailable",3400728576],["OSMemoryBuffers",424554496],["OSMemoryCached",2488438784],["OSMemoryFreePlusCached",3341795328],["OSMemoryFreeWithoutCached",853356544],["OSMemorySwapCached",1839104],["OSMemoryTotal",6227279872],["OSNiceTime",0],["OSNiceTimeCPU0",0],["OSNiceTimeCPU1",0],["OSNiceTimeCPU2",0],["OSNiceTimeCPU3",0],["OSNiceTimeCPU4",0],["OSNiceTimeCPU5",0],["OSNiceTimeCPU6",0],["OSNiceTimeCPU7",0],["OSNiceTimeNormalized",0],["OSOpenFiles",5248],["OSProcessesBlocked",0],["OSProcessesCreated",3],["OSProcessesRunning",4],["OSSoftIrqTime",0.06998229447949669],["OSSoftIrqTimeCPU0",0.029992411919784294],["OSSoftIrqTimeCPU1",0],["OSSoftIrqTimeCPU2",0.009997470639928098],["OSSoftIrqTimeCPU3",0.009997470639928098],["OSSoftIrqTimeCPU4",0],["OSSoftIrqTimeCPU5",0],["OSSoftIrqTimeCPU6",0.009997470639928098],["OSSoftIrqTimeCPU7",0.009997470639928098],["OSSoftIrqTimeNormalized",0.008747786809937087],["OSStealTime",0],["OSStealTimeCPU0",0],["OSStealTimeCPU1",0],["OSStealTimeCPU2",0],["OSStealTimeCPU3",0],["OSStealTimeCPU4",0],["OSStealTimeCPU5",0],["OSStealTimeCPU6",0],["OSStealTimeCPU7",0],["OSStealTimeNormalized",0],["OSSystemTime",0.28992664855791483],["OSSystemTimeCPU0",0.029992411919784294],["OSSystemTimeCPU1",0.03998988255971239],["OSSystemTimeCPU2",0.029992411919784294],["OSSystemTimeCPU3",0.03998988255971239],["OSSystemTimeCPU4",0.05998482383956859],["OSSystemTimeCPU5",0.029992411919784294],["OSSystemTimeCPU6",0.03998988255971239],["OSSystemTimeCPU7",0.029992411919784294],["OSSystemTimeNormalized",0.036240831069739354],["OSThreadsRunnable",4],["OSThreadsTotal",1084],["OSUptime",298274.46],["OSUserTime",0.309921589837771],["OSUserTimeCPU0",0.029992411919784294],["OSUserTimeCPU1",0.029992411919784294],["OSUserTimeCPU2",0.029992411919784294],["OSUserTimeCPU3",0.029992411919784294],["OSUserTimeCPU4",0.08997723575935287],["OSUserTimeCPU5",0.029992411919784294],["OSUserTimeCPU6",0.019994941279856196],["OSUserTimeCPU7",0.029992411919784294],["OSUserTimeNormalized",0.03874019872972138],["OpenFileForRead",31,"Number of files open for reading"],["OpenFileForWrite",0,"Number of files open for writing"],["PartMutation",0,"Number of mutations (ALTER DELETE/UPDATE)"],["PartsCommitted",95,"Active data part, used by current and upcoming SELECTs."],["PartsCompact",152,"Compact parts."],["PartsDeleteOnDestroy",0,"Part was moved to another disk and should be deleted in own destructor."],["PartsDeleting",0,"Not active data part with identity refcounter, it is deleting right now by a cleaner."],["PartsInMemory",0,"In-memory parts."],["PartsOutdated",93,"Not active data part, but could be used by only current SELECTs, could be deleted after SELECTs finishes."],["PartsPreCommitted",0,"The part is in data_parts, but not used for SELECTs."],["PartsTemporary",0,"The part is generating now, it is not in data_parts list."],["PartsWide",36,"Wide parts."],["PostgreSQLConnection",0,"Number of client connections using PostgreSQL protocol"],["Query",1,"Number of executing queries"],["QueryPreempted",0,"Number of queries that are stopped and waiting due to \'priority\' setting."],["QueryThread",0,"Number of query processing threads"],["RWLockActiveReaders",46,"Number of threads holding read lock in a table RWLock."],["RWLockActiveWriters",0,"Number of threads holding write lock in a table RWLock."],["RWLockWaitingReaders",0,"Number of threads waiting for read on a table RWLock."],["RWLockWaitingWriters",0,"Number of threads waiting for write on a table RWLock."],["Read",1,"Number of read (read, pread, io_getevents, etc.) syscalls in fly"],["ReadonlyReplica",0,"Number of Replicated tables that are currently in readonly state due to re-initialization after ZooKeeper session loss or due to startup without ZooKeeper configured."],["ReplicasMaxAbsoluteDelay",0],["ReplicasMaxInsertsInQueue",0],["ReplicasMaxMergesInQueue",0],["ReplicasMaxQueueSize",0],["ReplicasMaxRelativeDelay",0],["ReplicasSumInsertsInQueue",0],["ReplicasSumMergesInQueue",0],["ReplicasSumQueueSize",0],["ReplicatedChecks",0,"Number of data parts checking for consistency"],["ReplicatedFetch",0,"Number of data parts being fetched from replica"],["ReplicatedSend",0,"Number of data parts being sent to replicas"],["Revision",54454,"Revision of the server. It is a number incremented for every release or release candidate except patch releases."],["SendExternalTables",0,"Number of connections that are sending data for external tables to remote servers. External tables are used to implement GLOBAL IN and GLOBAL JOIN operators with distributed subqueries."],["SendScalars",0,"Number of connections that are sending data for scalars to remote servers."],["StorageBufferBytes",0,"Number of bytes in buffers of Buffer tables"],["StorageBufferRows",0,"Number of rows in buffers of Buffer tables"],["SyncDrainedConnections",0,"Number of connections drained synchronously."],["TCPConnection",2,"Number of connections to TCP server (clients with native interface), also included server-server distributed query connections"],["TCPThreads",2],["TablesToDropQueueSize",0,"Number of dropped tables, that are waiting for background data removal."],["TotalBytesOfMergeTreeTables",922069414],["TotalPartsOfMergeTreeTables",95],["TotalRowsOfMergeTreeTables",167857091],["UncompressedCacheBytes",0],["UncompressedCacheCells",0],["Uptime",297631],["VersionInteger",21009002,"Version of the server in a single integer number in base-1000. For example, version 11.22.33 is translated to 11022033."],["Write",0,"Number of write (write, pwrite, io_getevents, etc.) syscalls in fly"],["ZooKeeperRequest",0,"Number of requests to ZooKeeper in fly."],["ZooKeeperSession",1,"Number of sessions (connections) to ZooKeeper. Should be no more than one, because using more than one connection to ZooKeeper may lead to bugs due to lack of linearizability (stale reads) that ZooKeeper consistency model allows."],["ZooKeeperWatch",1,"Number of watches (event subscriptions) in ZooKeeper."],["jemalloc.active",415367168],["jemalloc.allocated",259537136],["jemalloc.arenas.all.dirty_purged",144941416],["jemalloc.arenas.all.muzzy_purged",138378738],["jemalloc.arenas.all.pactive",6338],["jemalloc.arenas.all.pdirty",14251],["jemalloc.arenas.all.pmuzzy",50],["jemalloc.background_thread.num_runs",0],["jemalloc.background_thread.num_threads",0],["jemalloc.background_thread.run_intervals",0],["jemalloc.epoch",297926],["jemalloc.mapped",5647564800],["jemalloc.metadata",45092944],["jemalloc.metadata_thp",0],["jemalloc.resident",1381040128],["jemalloc.retained",14753529856]]}},{"key":"last_event_ingested_timestamp","metric":"Last event ingested","value":"2022-03-16T10:16:44"},{"key":"dead_letter_queue_size","metric":"Dead letter queue size","value":114794},{"key":"dead_letter_queue_events_last_day","metric":"Events sent to dead letter queue in the last 24h","value":4682},{"key":"dead_letter_queue_ratio_ok","metric":"Dead letter queue ratio healthy","value":true},{"key":"redis_alive","metric":"Redis alive","value":true},{"metric":"Redis version","value":"6.2.6"},{"metric":"Redis current queue depth","value":"0"},{"metric":"Redis connected client count","value":"28"},{"metric":"Redis memory used","value":"3.04MB"},{"metric":"Redis memory peak","value":"4.04MB"},{"metric":"Redis total memory available","value":"5.80GB"}],"internal_metrics":{}}}')},"./frontend/src/mocks/fixtures/_preflight.json":module=>{"use strict";module.exports=JSON.parse('{"django":true,"redis":true,"plugins":false,"celery":false,"db":true,"clickhouse":true,"kafka":true,"initiated":true,"cloud":false,"demo":false,"object_storage":true,"realm":"hosted-clickhouse","region":"US","available_social_auth_providers":{"github":false,"gitlab":false,"google-oauth2":false,"saml":false},"can_create_org":false,"email_service_available":false,"db_backend":"clickhouse","available_timezones":{"Africa/Abidjan":0,"Africa/Accra":0,"Africa/Addis_Ababa":3,"Africa/Algiers":1,"Africa/Asmara":3,"Africa/Bamako":0,"Africa/Bangui":1,"Africa/Banjul":0,"Africa/Bissau":0,"Africa/Blantyre":2,"Africa/Brazzaville":1,"Africa/Bujumbura":2,"Africa/Cairo":2,"Africa/Casablanca":1,"Africa/Ceuta":1,"Africa/Conakry":0,"Africa/Dakar":0,"Africa/Dar_es_Salaam":3,"Africa/Djibouti":3,"Africa/Douala":1,"Africa/El_Aaiun":1,"Africa/Freetown":0,"Africa/Gaborone":2,"Africa/Harare":2,"Africa/Johannesburg":2,"Africa/Juba":2,"Africa/Kampala":3,"Africa/Khartoum":2,"Africa/Kigali":2,"Africa/Kinshasa":1,"Africa/Lagos":1,"Africa/Libreville":1,"Africa/Lome":0,"Africa/Luanda":1,"Africa/Lubumbashi":2,"Africa/Lusaka":2,"Africa/Malabo":1,"Africa/Maputo":2,"Africa/Maseru":2,"Africa/Mbabane":2,"Africa/Mogadishu":3,"Africa/Monrovia":0,"Africa/Nairobi":3,"Africa/Ndjamena":1,"Africa/Niamey":1,"Africa/Nouakchott":0,"Africa/Ouagadougou":0,"Africa/Porto-Novo":1,"Africa/Sao_Tome":0,"Africa/Tripoli":2,"Africa/Tunis":1,"Africa/Windhoek":2,"America/Adak":-9,"America/Anchorage":-8,"America/Anguilla":-4,"America/Antigua":-4,"America/Araguaina":-3,"America/Argentina/Buenos_Aires":-3,"America/Argentina/Catamarca":-3,"America/Argentina/Cordoba":-3,"America/Argentina/Jujuy":-3,"America/Argentina/La_Rioja":-3,"America/Argentina/Mendoza":-3,"America/Argentina/Rio_Gallegos":-3,"America/Argentina/Salta":-3,"America/Argentina/San_Juan":-3,"America/Argentina/San_Luis":-3,"America/Argentina/Tucuman":-3,"America/Argentina/Ushuaia":-3,"America/Aruba":-4,"America/Asuncion":-3,"America/Atikokan":-5,"America/Bahia":-3,"America/Bahia_Banderas":-6,"America/Barbados":-4,"America/Belem":-3,"America/Belize":-6,"America/Blanc-Sablon":-4,"America/Boa_Vista":-4,"America/Bogota":-5,"America/Boise":-6,"America/Cambridge_Bay":-6,"America/Campo_Grande":-4,"America/Cancun":-5,"America/Caracas":-4,"America/Cayenne":-3,"America/Cayman":-5,"America/Chicago":-5,"America/Chihuahua":-7,"America/Costa_Rica":-6,"America/Creston":-7,"America/Cuiaba":-4,"America/Curacao":-4,"America/Danmarkshavn":0,"America/Dawson":-7,"America/Dawson_Creek":-7,"America/Denver":-6,"America/Detroit":-4,"America/Dominica":-4,"America/Edmonton":-6,"America/Eirunepe":-5,"America/El_Salvador":-6,"America/Fort_Nelson":-7,"America/Fortaleza":-3,"America/Glace_Bay":-3,"America/Goose_Bay":-3,"America/Grand_Turk":-4,"America/Grenada":-4,"America/Guadeloupe":-4,"America/Guatemala":-6,"America/Guayaquil":-5,"America/Guyana":-4,"America/Halifax":-3,"America/Havana":-4,"America/Hermosillo":-7,"America/Indiana/Indianapolis":-4,"America/Indiana/Knox":-5,"America/Indiana/Marengo":-4,"America/Indiana/Petersburg":-4,"America/Indiana/Tell_City":-5,"America/Indiana/Vevay":-4,"America/Indiana/Vincennes":-4,"America/Indiana/Winamac":-4,"America/Inuvik":-6,"America/Iqaluit":-4,"America/Jamaica":-5,"America/Juneau":-8,"America/Kentucky/Louisville":-4,"America/Kentucky/Monticello":-4,"America/Kralendijk":-4,"America/La_Paz":-4,"America/Lima":-5,"America/Los_Angeles":-7,"America/Lower_Princes":-4,"America/Maceio":-3,"America/Managua":-6,"America/Manaus":-4,"America/Marigot":-4,"America/Martinique":-4,"America/Matamoros":-5,"America/Mazatlan":-7,"America/Menominee":-5,"America/Merida":-6,"America/Metlakatla":-8,"America/Mexico_City":-6,"America/Miquelon":-2,"America/Moncton":-3,"America/Monterrey":-6,"America/Montevideo":-3,"America/Montserrat":-4,"America/Nassau":-4,"America/New_York":-4,"America/Nipigon":-4,"America/Nome":-8,"America/Noronha":-2,"America/North_Dakota/Beulah":-5,"America/North_Dakota/Center":-5,"America/North_Dakota/New_Salem":-5,"America/Nuuk":-3,"America/Ojinaga":-6,"America/Panama":-5,"America/Pangnirtung":-4,"America/Paramaribo":-3,"America/Phoenix":-7,"America/Port-au-Prince":-4,"America/Port_of_Spain":-4,"America/Porto_Velho":-4,"America/Puerto_Rico":-4,"America/Punta_Arenas":-3,"America/Rainy_River":-5,"America/Rankin_Inlet":-5,"America/Recife":-3,"America/Regina":-6,"America/Resolute":-5,"America/Rio_Branco":-5,"America/Santarem":-3,"America/Santiago":-3,"America/Santo_Domingo":-4,"America/Sao_Paulo":-3,"America/Scoresbysund":-1,"America/Sitka":-8,"America/St_Barthelemy":-4,"America/St_Johns":-2.5,"America/St_Kitts":-4,"America/St_Lucia":-4,"America/St_Thomas":-4,"America/St_Vincent":-4,"America/Swift_Current":-6,"America/Tegucigalpa":-6,"America/Thule":-3,"America/Thunder_Bay":-4,"America/Tijuana":-7,"America/Toronto":-4,"America/Tortola":-4,"America/Vancouver":-7,"America/Whitehorse":-7,"America/Winnipeg":-5,"America/Yakutat":-8,"America/Yellowknife":-6,"Antarctica/Casey":11,"Antarctica/Davis":7,"Antarctica/DumontDUrville":10,"Antarctica/Macquarie":11,"Antarctica/Mawson":5,"Antarctica/McMurdo":13,"Antarctica/Palmer":-3,"Antarctica/Rothera":-3,"Antarctica/Syowa":3,"Antarctica/Troll":0,"Antarctica/Vostok":6,"Arctic/Longyearbyen":1,"Asia/Aden":3,"Asia/Almaty":6,"Asia/Amman":2,"Asia/Anadyr":12,"Asia/Aqtau":5,"Asia/Aqtobe":5,"Asia/Ashgabat":5,"Asia/Atyrau":5,"Asia/Baghdad":3,"Asia/Bahrain":3,"Asia/Baku":4,"Asia/Bangkok":7,"Asia/Barnaul":7,"Asia/Beirut":2,"Asia/Bishkek":6,"Asia/Brunei":8,"Asia/Chita":9,"Asia/Choibalsan":8,"Asia/Colombo":5.5,"Asia/Damascus":2,"Asia/Dhaka":6,"Asia/Dili":9,"Asia/Dubai":4,"Asia/Dushanbe":5,"Asia/Famagusta":2,"Asia/Gaza":2,"Asia/Hebron":2,"Asia/Ho_Chi_Minh":7,"Asia/Hong_Kong":8,"Asia/Hovd":7,"Asia/Irkutsk":8,"Asia/Jakarta":7,"Asia/Jayapura":9,"Asia/Jerusalem":2,"Asia/Kabul":4.5,"Asia/Kamchatka":12,"Asia/Karachi":5,"Asia/Kathmandu":5.75,"Asia/Khandyga":9,"Asia/Kolkata":5.5,"Asia/Krasnoyarsk":7,"Asia/Kuala_Lumpur":8,"Asia/Kuching":8,"Asia/Kuwait":3,"Asia/Macau":8,"Asia/Magadan":11,"Asia/Makassar":8,"Asia/Manila":8,"Asia/Muscat":4,"Asia/Nicosia":2,"Asia/Novokuznetsk":7,"Asia/Novosibirsk":7,"Asia/Omsk":6,"Asia/Oral":5,"Asia/Phnom_Penh":7,"Asia/Pontianak":7,"Asia/Pyongyang":9,"Asia/Qatar":3,"Asia/Qostanay":6,"Asia/Qyzylorda":5,"Asia/Riyadh":3,"Asia/Sakhalin":11,"Asia/Samarkand":5,"Asia/Seoul":9,"Asia/Shanghai":8,"Asia/Singapore":8,"Asia/Srednekolymsk":11,"Asia/Taipei":8,"Asia/Tashkent":5,"Asia/Tbilisi":4,"Asia/Tehran":3.5,"Asia/Thimphu":6,"Asia/Tokyo":9,"Asia/Tomsk":7,"Asia/Ulaanbaatar":8,"Asia/Urumqi":6,"Asia/Ust-Nera":10,"Asia/Vientiane":7,"Asia/Vladivostok":10,"Asia/Yakutsk":9,"Asia/Yangon":6.5,"Asia/Yekaterinburg":5,"Asia/Yerevan":4,"Atlantic/Azores":-1,"Atlantic/Bermuda":-3,"Atlantic/Canary":0,"Atlantic/Cape_Verde":-1,"Atlantic/Faroe":0,"Atlantic/Madeira":0,"Atlantic/Reykjavik":0,"Atlantic/South_Georgia":-2,"Atlantic/St_Helena":0,"Atlantic/Stanley":-3,"Australia/Adelaide":10.5,"Australia/Brisbane":10,"Australia/Broken_Hill":10.5,"Australia/Darwin":9.5,"Australia/Eucla":8.75,"Australia/Hobart":11,"Australia/Lindeman":10,"Australia/Lord_Howe":11,"Australia/Melbourne":11,"Australia/Perth":8,"Australia/Sydney":11,"Canada/Atlantic":-3,"Canada/Central":-5,"Canada/Eastern":-4,"Canada/Mountain":-6,"Canada/Newfoundland":-2.5,"Canada/Pacific":-7,"Europe/Amsterdam":1,"Europe/Andorra":1,"Europe/Astrakhan":4,"Europe/Athens":2,"Europe/Belgrade":1,"Europe/Berlin":1,"Europe/Bratislava":1,"Europe/Brussels":1,"Europe/Bucharest":2,"Europe/Budapest":1,"Europe/Busingen":1,"Europe/Chisinau":2,"Europe/Copenhagen":1,"Europe/Dublin":0,"Europe/Gibraltar":1,"Europe/Guernsey":0,"Europe/Helsinki":2,"Europe/Isle_of_Man":0,"Europe/Istanbul":3,"Europe/Jersey":0,"Europe/Kaliningrad":2,"Europe/Kiev":2,"Europe/Kirov":3,"Europe/Lisbon":0,"Europe/Ljubljana":1,"Europe/London":0,"Europe/Luxembourg":1,"Europe/Madrid":1,"Europe/Malta":1,"Europe/Mariehamn":2,"Europe/Minsk":3,"Europe/Monaco":1,"Europe/Moscow":3,"Europe/Oslo":1,"Europe/Paris":1,"Europe/Podgorica":1,"Europe/Prague":1,"Europe/Riga":2,"Europe/Rome":1,"Europe/Samara":4,"Europe/San_Marino":1,"Europe/Sarajevo":1,"Europe/Saratov":4,"Europe/Simferopol":3,"Europe/Skopje":1,"Europe/Sofia":2,"Europe/Stockholm":1,"Europe/Tallinn":2,"Europe/Tirane":1,"Europe/Ulyanovsk":4,"Europe/Uzhgorod":2,"Europe/Vaduz":1,"Europe/Vatican":1,"Europe/Vienna":1,"Europe/Vilnius":2,"Europe/Volgograd":3,"Europe/Warsaw":1,"Europe/Zagreb":1,"Europe/Zaporozhye":2,"Europe/Zurich":1,"GMT":0,"Indian/Antananarivo":3,"Indian/Chagos":6,"Indian/Christmas":7,"Indian/Cocos":6.5,"Indian/Comoro":3,"Indian/Kerguelen":5,"Indian/Mahe":4,"Indian/Maldives":5,"Indian/Mauritius":4,"Indian/Mayotte":3,"Indian/Reunion":4,"Pacific/Apia":14,"Pacific/Auckland":13,"Pacific/Bougainville":11,"Pacific/Chatham":13.75,"Pacific/Chuuk":10,"Pacific/Easter":-5,"Pacific/Efate":11,"Pacific/Enderbury":13,"Pacific/Fakaofo":13,"Pacific/Fiji":12,"Pacific/Funafuti":12,"Pacific/Galapagos":-6,"Pacific/Gambier":-9,"Pacific/Guadalcanal":11,"Pacific/Guam":10,"Pacific/Honolulu":-10,"Pacific/Kiritimati":14,"Pacific/Kosrae":11,"Pacific/Kwajalein":12,"Pacific/Majuro":12,"Pacific/Marquesas":-9.5,"Pacific/Midway":-11,"Pacific/Nauru":12,"Pacific/Niue":-11,"Pacific/Norfolk":12,"Pacific/Noumea":11,"Pacific/Pago_Pago":-11,"Pacific/Palau":9,"Pacific/Pitcairn":-8,"Pacific/Pohnpei":11,"Pacific/Port_Moresby":10,"Pacific/Rarotonga":-10,"Pacific/Saipan":10,"Pacific/Tahiti":-10,"Pacific/Tarawa":12,"Pacific/Tongatapu":13,"Pacific/Wake":12,"Pacific/Wallis":12,"US/Alaska":-8,"US/Arizona":-7,"US/Central":-5,"US/Eastern":-4,"US/Hawaii":-10,"US/Mountain":-6,"US/Pacific":-7,"UTC":0},"opt_out_capture":false,"is_debug":true,"licensed_users_available":21311,"site_url":"http://localhost:6006","instance_preferences":{"debug_queries":false,"disable_paid_fs":false}}')},"./frontend/src/mocks/fixtures/_system_status.json":module=>{"use strict";module.exports=JSON.parse('{"results":[{"key":"ingestion_server","metric":"Event ingestion via","value":"Plugin Server"},{"key":"plugin_sever_alive","metric":"Plugin server alive","value":true},{"key":"plugin_sever_version","metric":"Plugin server version","value":"0.15.5"},{"key":"db_alive","metric":"Postgres database alive","value":true},{"key":"pg_version","metric":"Postgres version","value":"13.0.1"},{"metric":"Postgres elements table size","value":"~3508 rows (~840 kB)"},{"metric":"Postgres events table size","value":"~5003 rows (~7032 kB)"},{"metric":"Postgres session recording table size","value":"~536 rows (~4608 kB)"},{"key":"redis_alive","metric":"Redis alive","value":true},{"metric":"Redis version","value":"6.0.10"},{"metric":"Redis current queue depth","value":"0"},{"metric":"Redis connected client count","value":"37"},{"metric":"Redis memory used","value":"2.10MB"},{"metric":"Redis memory peak","value":"12.00MB"},{"metric":"Redis total memory available","value":"64.00GB"}]}')},"./frontend/src/queries/schema.json":module=>{"use strict";module.exports=JSON.parse('{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ActionConversionGoal":{"additionalProperties":false,"properties":{"actionId":{"type":"integer"}},"required":["actionId"],"type":"object"},"ActionsNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"id":{"type":"integer"},"kind":{"const":"ActionsNode","type":"string"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_hogql":{"type":"string"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["id","kind"],"type":"object"},"ActorsPropertyTaxonomyQuery":{"additionalProperties":false,"properties":{"group_type_index":{"type":"integer"},"kind":{"const":"ActorsPropertyTaxonomyQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"property":{"type":"string"},"response":{"$ref":"#/definitions/ActorsPropertyTaxonomyQueryResponse"}},"required":["kind","property"],"type":"object"},"ActorsPropertyTaxonomyQueryResponse":{"additionalProperties":false,"description":"All analytics query responses must inherit from this.","properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/ActorsPropertyTaxonomyResponse"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"ActorsPropertyTaxonomyResponse":{"additionalProperties":false,"properties":{"sample_count":{"type":"integer"},"sample_values":{"items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"integer"}]},"type":"array"}},"required":["sample_values","sample_count"],"type":"object"},"ActorsQuery":{"additionalProperties":false,"properties":{"fixedProperties":{"description":"Currently only person filters supported. No filters for querying groups. See `filter_conditions()` in actor_strategies.py.","items":{"$ref":"#/definitions/AnyPersonScopeFilter"},"type":"array"},"kind":{"const":"ActorsQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"orderBy":{"items":{"type":"string"},"type":"array"},"properties":{"description":"Currently only person filters supported. No filters for querying groups. See `filter_conditions()` in actor_strategies.py.","items":{"$ref":"#/definitions/AnyPersonScopeFilter"},"type":"array"},"response":{"$ref":"#/definitions/ActorsQueryResponse"},"search":{"type":"string"},"select":{"items":{"$ref":"#/definitions/HogQLExpression"},"type":"array"},"source":{"anyOf":[{"$ref":"#/definitions/InsightActorsQuery"},{"$ref":"#/definitions/FunnelsActorsQuery"},{"$ref":"#/definitions/FunnelCorrelationActorsQuery"},{"$ref":"#/definitions/HogQLQuery"}]}},"required":["kind"],"type":"object"},"ActorsQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"missing_actors_count":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","limit","offset","results","types"],"type":"object"},"AggregationAxisFormat":{"enum":["numeric","duration","duration_ms","percentage","percentage_scaled"],"type":"string"},"AlertCalculationInterval":{"enum":["hourly","daily","weekly","monthly"],"type":"string"},"AlertCondition":{"additionalProperties":false,"properties":{"type":{"$ref":"#/definitions/AlertConditionType"}},"required":["type"],"type":"object"},"AlertConditionType":{"enum":["absolute_value","relative_increase","relative_decrease"],"type":"string"},"AlertState":{"enum":["Firing","Not firing","Errored","Snoozed"],"type":"string"},"AnyDataNode":{"anyOf":[{"$ref":"#/definitions/EventsNode"},{"$ref":"#/definitions/ActionsNode"},{"$ref":"#/definitions/PersonsNode"},{"$ref":"#/definitions/EventsQuery"},{"$ref":"#/definitions/ActorsQuery"},{"$ref":"#/definitions/InsightActorsQuery"},{"$ref":"#/definitions/InsightActorsQueryOptions"},{"$ref":"#/definitions/SessionsTimelineQuery"},{"$ref":"#/definitions/HogQuery"},{"$ref":"#/definitions/HogQLQuery"},{"$ref":"#/definitions/HogQLMetadata"},{"$ref":"#/definitions/HogQLAutocomplete"},{"$ref":"#/definitions/WebOverviewQuery"},{"$ref":"#/definitions/WebStatsTableQuery"},{"$ref":"#/definitions/WebExternalClicksTableQuery"},{"$ref":"#/definitions/WebGoalsQuery"},{"$ref":"#/definitions/SessionAttributionExplorerQuery"},{"$ref":"#/definitions/ErrorTrackingQuery"},{"$ref":"#/definitions/ExperimentFunnelsQuery"},{"$ref":"#/definitions/ExperimentTrendsQuery"},{"$ref":"#/definitions/RecordingsQuery"}]},"AnyEntityNode":{"anyOf":[{"$ref":"#/definitions/EventsNode"},{"$ref":"#/definitions/ActionsNode"},{"$ref":"#/definitions/DataWarehouseNode"}]},"AnyFilterLike":{"anyOf":[{"$ref":"#/definitions/AnyPropertyFilter"},{"$ref":"#/definitions/PropertyGroupFilter"},{"$ref":"#/definitions/PropertyGroupFilterValue"}]},"AnyPersonScopeFilter":{"anyOf":[{"$ref":"#/definitions/PersonPropertyFilter"},{"$ref":"#/definitions/CohortPropertyFilter"},{"$ref":"#/definitions/HogQLPropertyFilter"},{"$ref":"#/definitions/EmptyPropertyFilter"}],"description":"Any filter type supported by `property_to_expr(scope=\\"person\\", ...)`."},"AnyPropertyFilter":{"anyOf":[{"$ref":"#/definitions/EventPropertyFilter"},{"$ref":"#/definitions/PersonPropertyFilter"},{"$ref":"#/definitions/ElementPropertyFilter"},{"$ref":"#/definitions/SessionPropertyFilter"},{"$ref":"#/definitions/CohortPropertyFilter"},{"$ref":"#/definitions/RecordingPropertyFilter"},{"$ref":"#/definitions/LogEntryPropertyFilter"},{"$ref":"#/definitions/GroupPropertyFilter"},{"$ref":"#/definitions/FeaturePropertyFilter"},{"$ref":"#/definitions/HogQLPropertyFilter"},{"$ref":"#/definitions/EmptyPropertyFilter"},{"$ref":"#/definitions/DataWarehousePropertyFilter"},{"$ref":"#/definitions/DataWarehousePersonPropertyFilter"}]},"AnyResponseType":{"anyOf":[{"type":"object"},{"$ref":"#/definitions/HogQueryResponse"},{"$ref":"#/definitions/HogQLQueryResponse"},{"$ref":"#/definitions/HogQLMetadataResponse"},{"$ref":"#/definitions/HogQLAutocompleteResponse"},{"type":"object"},{"not":{}},{"$ref":"#/definitions/EventsQueryResponse"},{"$ref":"#/definitions/ErrorTrackingQueryResponse"}]},"AssistantArrayPropertyFilter":{"additionalProperties":false,"properties":{"operator":{"$ref":"#/definitions/AssistantArrayPropertyFilterOperator","description":"`exact` - exact match of any of the values. `is_not` - does not match any of the values."},"value":{"description":"Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \\"true\\" or \\"false\\".","items":{"type":"string"},"type":"array"}},"required":["operator","value"],"type":"object"},"AssistantArrayPropertyFilterOperator":{"enum":["exact","is_not"],"type":"string"},"AssistantBaseMultipleBreakdownFilter":{"additionalProperties":false,"properties":{"property":{"description":"Property name from the plan to break down by.","type":"string"}},"required":["property"],"type":"object"},"AssistantBasePropertyFilter":{"anyOf":[{"$ref":"#/definitions/AssistantStringNumberOrBooleanPropertyFilter"},{"$ref":"#/definitions/AssistantDateTimePropertyFilter"},{"$ref":"#/definitions/AssistantSetPropertyFilter"}]},"AssistantBreakdownFilter":{"additionalProperties":false,"properties":{"breakdown_limit":{"default":25,"description":"How many distinct values to show.","type":"integer"}},"type":"object"},"AssistantDateTimePropertyFilter":{"additionalProperties":false,"properties":{"operator":{"$ref":"#/definitions/AssistantDateTimePropertyFilterOperator"},"value":{"description":"Value must be a date in ISO 8601 format.","type":"string"}},"required":["operator","value"],"type":"object"},"AssistantDateTimePropertyFilterOperator":{"enum":["is_date_exact","is_date_before","is_date_after"],"type":"string"},"AssistantEventMultipleBreakdownFilterType":{"enum":["person","event","session","hogql"],"type":"string"},"AssistantEventType":{"enum":["status","message","conversation"],"type":"string"},"AssistantFunnelsBreakdownFilter":{"additionalProperties":false,"properties":{"breakdown":{"description":"The entity property to break down by.","type":"string"},"breakdown_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"If `breakdown_type` is `group`, this is the index of the group. Use the index from the group mapping."},"breakdown_limit":{"default":25,"description":"How many distinct values to show.","type":"integer"},"breakdown_type":{"$ref":"#/definitions/AssistantFunnelsBreakdownType","default":"event","description":"Type of the entity to break down by. If `group` is used, you must also provide `breakdown_group_type_index` from the group mapping."}},"required":["breakdown_type","breakdown"],"type":"object"},"AssistantFunnelsBreakdownType":{"enum":["person","event","group","session"],"type":"string"},"AssistantFunnelsEventsNode":{"additionalProperties":false,"properties":{"custom_name":{"description":"Optional custom name for the event if it is needed to be renamed.","type":"string"},"event":{"description":"Name of the event.","type":"string"},"kind":{"const":"EventsNode","type":"string"},"math":{"$ref":"#/definitions/AssistantTrendsMath","description":"Optional math aggregation type for the series. Only specify this math type if the user wants one of these. `first_time_for_user` - counts the number of users who have completed the event for the first time ever. `first_time_for_user_with_filters` - counts the number of users who have completed the event with specified filters for the first time."},"properties":{"items":{"$ref":"#/definitions/AssistantPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["event","kind"],"type":"object"},"AssistantFunnelsExclusionEventsNode":{"additionalProperties":false,"description":"Exclustion steps for funnels. The \\"from\\" and \\"to\\" steps must not exceed the funnel\'s series length.","properties":{"event":{"type":"string"},"funnelFromStep":{"type":"integer"},"funnelToStep":{"type":"integer"},"kind":{"const":"EventsNode","type":"string"}},"required":["event","funnelFromStep","funnelToStep","kind"],"type":"object"},"AssistantFunnelsFilter":{"additionalProperties":false,"properties":{"binCount":{"description":"Use this setting only when `funnelVizType` is `time_to_convert`: number of bins to show in histogram.","type":"integer"},"exclusions":{"default":[],"description":"Users may want to use exclusion events to filter out conversions in which a particular event occurred between specific steps. These events must not be included in the main sequence. You must include start and end indexes for each exclusion where the minimum index is one and the maximum index is the number of steps in the funnel. For example, there is a sequence with three steps: sign up, finish onboarding, purchase. If the user wants to exclude all conversions in which users left the page before finishing the onboarding, the exclusion step would be the event `$pageleave` with start index 2 and end index 3.","items":{"$ref":"#/definitions/AssistantFunnelsExclusionEventsNode"},"type":"array"},"funnelAggregateByHogQL":{"const":"properties.$session_id","description":"Use this field only if the user explicitly asks to aggregate the funnel by unique sessions.","type":"string"},"funnelOrderType":{"$ref":"#/definitions/StepOrderValue","default":"ordered","description":"Defines the behavior of event matching between steps. Prefer the `strict` option unless explicitly told to use a different one. `ordered` - defines a sequential funnel. Step B must happen after Step A, but any number of events can happen between A and B. `strict` - defines a funnel where all events must happen in order. Step B must happen directly after Step A without any events in between. `any` - order doesn\'t matter. Steps can be completed in any sequence."},"funnelStepReference":{"$ref":"#/definitions/FunnelStepReference","default":"total","description":"Whether conversion shown in the graph should be across all steps or just relative to the previous step."},"funnelVizType":{"$ref":"#/definitions/FunnelVizType","default":"steps","description":"Defines the type of visualization to use. The `steps` option is recommended. `steps` - shows a step-by-step funnel. Perfect to show a conversion rate of a sequence of events (default). `time_to_convert` - shows a histogram of the time it took to complete the funnel. Use this if the user asks about the average time it takes to complete the funnel. `trends` - shows a trend of the whole sequence\'s conversion rate over time. Use this if the user wants to see how the conversion rate changes over time."},"funnelWindowInterval":{"default":14,"description":"Controls a time frame value for a conversion to be considered. Select a reasonable value based on the user\'s query. Use in combination with `funnelWindowIntervalUnit`. The default value is 14 days.","type":"integer"},"funnelWindowIntervalUnit":{"$ref":"#/definitions/FunnelConversionWindowTimeUnit","default":"day","description":"Controls a time frame interval for a conversion to be considered. Select a reasonable value based on the user\'s query. Use in combination with `funnelWindowInterval`. The default value is 14 days."},"layout":{"$ref":"#/definitions/FunnelLayout","default":"vertical","description":"Controls how the funnel chart is displayed: vertically (preferred) or horizontally."}},"type":"object"},"AssistantFunnelsQuery":{"additionalProperties":false,"properties":{"aggregation_group_type_index":{"description":"Use this field to define the aggregation by a specific group from the group mapping that the user has provided.","type":"integer"},"breakdownFilter":{"$ref":"#/definitions/AssistantFunnelsBreakdownFilter","description":"Breakdown the chart by a property"},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"funnelsFilter":{"$ref":"#/definitions/AssistantFunnelsFilter","description":"Properties specific to the funnels insight"},"interval":{"$ref":"#/definitions/IntervalType","description":"Granularity of the response. Can be one of `hour`, `day`, `week` or `month`"},"kind":{"const":"FunnelsQuery","type":"string"},"properties":{"default":[],"description":"Property filters for all series","items":{"$ref":"#/definitions/AssistantPropertyFilter"},"type":"array"},"samplingFactor":{"description":"Sampling rate from 0 to 1 where 1 is 100% of the data.","type":["number","null"]},"series":{"description":"Events to include","items":{"$ref":"#/definitions/AssistantFunnelsEventsNode"},"type":"array"}},"required":["kind","series"],"type":"object"},"AssistantGenerationStatusEvent":{"additionalProperties":false,"properties":{"type":{"$ref":"#/definitions/AssistantGenerationStatusType"}},"required":["type"],"type":"object"},"AssistantGenerationStatusType":{"enum":["ack","generation_error"],"type":"string"},"AssistantGenericMultipleBreakdownFilter":{"additionalProperties":false,"properties":{"property":{"description":"Property name from the plan to break down by.","type":"string"},"type":{"$ref":"#/definitions/AssistantEventMultipleBreakdownFilterType"}},"required":["property","type"],"type":"object"},"AssistantGenericPropertyFilter":{"anyOf":[{"additionalProperties":false,"properties":{"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantSingleValuePropertyFilterOperator","description":"`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern."},"type":{"enum":["event","person","session","feature"],"type":"string"},"value":{"description":"Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid ClickHouse regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value.","type":"string"}},"required":["key","operator","type","value"],"type":"object"},{"additionalProperties":false,"properties":{"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantArrayPropertyFilterOperator","description":"`exact` - exact match of any of the values. `is_not` - does not match any of the values."},"type":{"enum":["event","person","session","feature"],"type":"string"},"value":{"description":"Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \\"true\\" or \\"false\\".","items":{"type":"string"},"type":"array"}},"required":["key","operator","type","value"],"type":"object"},{"additionalProperties":false,"properties":{"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantDateTimePropertyFilterOperator"},"type":{"enum":["event","person","session","feature"],"type":"string"},"value":{"description":"Value must be a date in ISO 8601 format.","type":"string"}},"required":["key","operator","type","value"],"type":"object"},{"additionalProperties":false,"properties":{"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantSetPropertyFilterOperator","description":"`is_set` - the property has any value. `is_not_set` - the property doesn\'t have a value or wasn\'t collected."},"type":{"enum":["event","person","session","feature"],"type":"string"}},"required":["key","operator","type"],"type":"object"}]},"AssistantGroupMultipleBreakdownFilter":{"additionalProperties":false,"properties":{"group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Index of the group type from the group mapping."},"property":{"description":"Property name from the plan to break down by.","type":"string"},"type":{"const":"group","type":"string"}},"required":["property","type"],"type":"object"},"AssistantGroupPropertyFilter":{"anyOf":[{"additionalProperties":false,"properties":{"group_type_index":{"description":"Index of the group type from the group mapping.","type":"integer"},"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantSingleValuePropertyFilterOperator","description":"`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern."},"type":{"const":"group","type":"string"},"value":{"description":"Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid ClickHouse regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value.","type":"string"}},"required":["group_type_index","key","operator","type","value"],"type":"object"},{"additionalProperties":false,"properties":{"group_type_index":{"description":"Index of the group type from the group mapping.","type":"integer"},"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantArrayPropertyFilterOperator","description":"`exact` - exact match of any of the values. `is_not` - does not match any of the values."},"type":{"const":"group","type":"string"},"value":{"description":"Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \\"true\\" or \\"false\\".","items":{"type":"string"},"type":"array"}},"required":["group_type_index","key","operator","type","value"],"type":"object"},{"additionalProperties":false,"properties":{"group_type_index":{"description":"Index of the group type from the group mapping.","type":"integer"},"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantDateTimePropertyFilterOperator"},"type":{"const":"group","type":"string"},"value":{"description":"Value must be a date in ISO 8601 format.","type":"string"}},"required":["group_type_index","key","operator","type","value"],"type":"object"},{"additionalProperties":false,"properties":{"group_type_index":{"description":"Index of the group type from the group mapping.","type":"integer"},"key":{"description":"Use one of the properties the user has provided in the plan.","type":"string"},"operator":{"$ref":"#/definitions/AssistantSetPropertyFilterOperator","description":"`is_set` - the property has any value. `is_not_set` - the property doesn\'t have a value or wasn\'t collected."},"type":{"const":"group","type":"string"}},"required":["group_type_index","key","operator","type"],"type":"object"}]},"AssistantInsightsQueryBase":{"additionalProperties":false,"properties":{"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"properties":{"default":[],"description":"Property filters for all series","items":{"$ref":"#/definitions/AssistantPropertyFilter"},"type":"array"},"samplingFactor":{"description":"Sampling rate from 0 to 1 where 1 is 100% of the data.","type":["number","null"]}},"type":"object"},"AssistantMessage":{"additionalProperties":false,"properties":{"content":{"type":"string"},"id":{"type":"string"},"type":{"const":"ai","type":"string"}},"required":["type","content"],"type":"object"},"AssistantMessageType":{"enum":["human","ai","ai/reasoning","ai/viz","ai/failure","ai/router"],"type":"string"},"AssistantMultipleBreakdownFilter":{"anyOf":[{"$ref":"#/definitions/AssistantGroupMultipleBreakdownFilter"},{"$ref":"#/definitions/AssistantGenericMultipleBreakdownFilter"}]},"AssistantPropertyFilter":{"anyOf":[{"$ref":"#/definitions/AssistantGenericPropertyFilter"},{"$ref":"#/definitions/AssistantGroupPropertyFilter"}]},"AssistantRetentionFilter":{"additionalProperties":false,"properties":{"cumulative":{"description":"Whether retention should be rolling (aka unbounded, cumulative). Rolling retention means that a user coming back in period 5 makes them count towards all the previous periods.","type":"boolean"},"period":{"$ref":"#/definitions/RetentionPeriod","default":"Day","description":"Retention period, the interval to track cohorts by."},"retentionReference":{"description":"Whether retention is with regard to initial cohort size, or that of the previous period.","enum":["total","previous"],"type":"string"},"retentionType":{"$ref":"#/definitions/RetentionType","description":"Retention type: recurring or first time. Recurring retention counts a user as part of a cohort if they performed the cohort event during that time period, irrespective of it was their first time or not. First time retention only counts a user as part of the cohort if it was their first time performing the cohort event."},"returningEntity":{"$ref":"#/definitions/RetentionEntity","description":"Retention event (event marking the user coming back)."},"showMean":{"description":"Whether an additional series should be shown, showing the mean conversion for each period across cohorts.","type":"boolean"},"targetEntity":{"$ref":"#/definitions/RetentionEntity","description":"Activation event (event putting the actor into the initial cohort)."},"totalIntervals":{"default":11,"description":"How many intervals to show in the chart. The default value is 11 (meaning 10 periods after initial cohort).","type":"integer"}},"type":"object"},"AssistantRetentionQuery":{"additionalProperties":false,"properties":{"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"const":"RetentionQuery","type":"string"},"properties":{"default":[],"description":"Property filters for all series","items":{"$ref":"#/definitions/AssistantPropertyFilter"},"type":"array"},"retentionFilter":{"$ref":"#/definitions/AssistantRetentionFilter","description":"Properties specific to the retention insight"},"samplingFactor":{"description":"Sampling rate from 0 to 1 where 1 is 100% of the data.","type":["number","null"]}},"required":["kind","retentionFilter"],"type":"object"},"AssistantSetPropertyFilter":{"additionalProperties":false,"properties":{"operator":{"$ref":"#/definitions/AssistantSetPropertyFilterOperator","description":"`is_set` - the property has any value. `is_not_set` - the property doesn\'t have a value or wasn\'t collected."}},"required":["operator"],"type":"object"},"AssistantSetPropertyFilterOperator":{"enum":["is_set","is_not_set"],"type":"string"},"AssistantSingleValuePropertyFilter":{"additionalProperties":false,"properties":{"operator":{"$ref":"#/definitions/AssistantSingleValuePropertyFilterOperator","description":"`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern."},"value":{"description":"Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid ClickHouse regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value.","type":"string"}},"required":["operator","value"],"type":"object"},"AssistantSingleValuePropertyFilterOperator":{"enum":["exact","is_not","icontains","not_icontains","regex","not_regex"],"type":"string"},"AssistantStringNumberOrBooleanPropertyFilter":{"anyOf":[{"$ref":"#/definitions/AssistantSingleValuePropertyFilter"},{"$ref":"#/definitions/AssistantArrayPropertyFilter"}]},"AssistantTrendsBreakdownFilter":{"additionalProperties":false,"properties":{"breakdown_limit":{"default":25,"description":"How many distinct values to show.","type":"integer"},"breakdowns":{"description":"Use this field to define breakdowns.","items":{"$ref":"#/definitions/AssistantMultipleBreakdownFilter"},"maxLength":3,"type":"array"}},"required":["breakdowns"],"type":"object"},"AssistantTrendsDisplayType":{"anyOf":[{"const":"ActionsLineGraph","type":"string"},{"const":"ActionsBar","type":"string"},{"const":"ActionsAreaGraph","type":"string"},{"const":"ActionsLineGraphCumulative","type":"string"},{"const":"BoldNumber","type":"string"},{"const":"ActionsPie","type":"string"},{"const":"ActionsBarValue","type":"string"},{"const":"ActionsTable","type":"string"},{"const":"WorldMap","type":"string"},{"not":{}}]},"AssistantTrendsEventsNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"event":{"description":"The event or `null` for all events.","type":["string","null"]},"kind":{"const":"EventsNode","type":"string"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"orderBy":{"description":"Columns to order by","items":{"type":"string"},"type":"array"},"properties":{"items":{"$ref":"#/definitions/AssistantPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["kind"],"type":"object"},"AssistantTrendsFilter":{"additionalProperties":false,"properties":{"aggregationAxisFormat":{"$ref":"#/definitions/AggregationAxisFormat","default":"numeric","description":"Formats the trends value axis. Do not use the formatting unless you are absolutely sure that formatting will match the data. `numeric` - no formatting. Prefer this option by default. `duration` - formats the value in seconds to a human-readable duration, e.g., `132` becomes `2 minutes 12 seconds`. Use this option only if you are sure that the values are in seconds. `duration_ms` - formats the value in miliseconds to a human-readable duration, e.g., `1050` becomes `1 second 50 milliseconds`. Use this option only if you are sure that the values are in miliseconds. `percentage` - adds a percentage sign to the value, e.g., `50` becomes `50%`. `percentage_scaled` - formats the value as a percentage scaled to 0-100, e.g., `0.5` becomes `50%`."},"aggregationAxisPostfix":{"description":"Custom postfix to add to the aggregation axis, e.g., ` clicks` to format 5 as `5 clicks`. You may need to add a space before postfix.","type":"string"},"aggregationAxisPrefix":{"description":"Custom prefix to add to the aggregation axis, e.g., `$` for USD dollars. You may need to add a space after prefix.","type":"string"},"decimalPlaces":{"description":"Number of decimal places to show. Do not add this unless you are sure that values will have a decimal point.","type":"number"},"display":{"default":"ActionsLineGraph","description":"Visualization type. Available values: `ActionsLineGraph` - time-series line chart; most common option, as it shows change over time. `ActionsBar` - time-series bar chart. `ActionsAreaGraph` - time-series area chart. `ActionsLineGraphCumulative` - cumulative time-series line chart; good for cumulative metrics. `BoldNumber` - total value single large number. You can\'t use this with breakdown; use when user explicitly asks for a single output number. `ActionsBarValue` - total value (NOT time-series) bar chart; good for categorical data. `ActionsPie` - total value pie chart; good for visualizing proportions. `ActionsTable` - total value table; good when using breakdown to list users or other entities. `WorldMap` - total value world map; use when breaking down by country name using property `$geoip_country_name`, and only then.","enum":["ActionsLineGraph","ActionsBar","ActionsAreaGraph","ActionsLineGraphCumulative","BoldNumber","ActionsPie","ActionsBarValue","ActionsTable","WorldMap"],"type":"string"},"formula":{"description":"If the formula is provided, apply it here.","type":"string"},"showLegend":{"default":false,"description":"Whether to show the legend describing series and breakdowns.","type":"boolean"},"showPercentStackView":{"default":false,"description":"Whether to show a percentage of each series. Use only with","type":"boolean"},"showValuesOnSeries":{"default":false,"description":"Whether to show a value on each data point.","type":"boolean"},"yAxisScaleType":{"default":"linear","description":"Whether to scale the y-axis.","enum":["log10","linear"],"type":"string"}},"type":"object"},"AssistantTrendsMath":{"enum":["first_time_for_user","first_time_for_user_with_filters"],"type":"string"},"AssistantTrendsQuery":{"additionalProperties":false,"properties":{"breakdownFilter":{"$ref":"#/definitions/AssistantTrendsBreakdownFilter","description":"Breakdown of the events"},"compareFilter":{"$ref":"#/definitions/CompareFilter","description":"Compare to date range"},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"interval":{"$ref":"#/definitions/IntervalType","default":"day","description":"Granularity of the response. Can be one of `hour`, `day`, `week` or `month`"},"kind":{"const":"TrendsQuery","type":"string"},"properties":{"default":[],"description":"Property filters for all series","items":{"$ref":"#/definitions/AssistantPropertyFilter"},"type":"array"},"samplingFactor":{"description":"Sampling rate from 0 to 1 where 1 is 100% of the data.","type":["number","null"]},"series":{"description":"Events to include","items":{"$ref":"#/definitions/AssistantTrendsEventsNode"},"type":"array"},"trendsFilter":{"$ref":"#/definitions/AssistantTrendsFilter","description":"Properties specific to the trends insight"}},"required":["kind","series"],"type":"object"},"AutocompleteCompletionItem":{"additionalProperties":false,"properties":{"detail":{"description":"A human-readable string with additional information about this item, like type or symbol information.","type":"string"},"documentation":{"description":"A human-readable string that represents a doc-comment.","type":"string"},"insertText":{"description":"A string or snippet that should be inserted in a document when selecting this completion.","type":"string"},"kind":{"$ref":"#/definitions/AutocompleteCompletionItemKind","description":"The kind of this completion item. Based on the kind an icon is chosen by the editor."},"label":{"description":"The label of this completion item. By default this is also the text that is inserted when selecting this completion.","type":"string"}},"required":["label","insertText","kind"],"type":"object"},"AutocompleteCompletionItemKind":{"enum":["Method","Function","Constructor","Field","Variable","Class","Struct","Interface","Module","Property","Event","Operator","Unit","Value","Constant","Enum","EnumMember","Keyword","Text","Color","File","Reference","Customcolor","Folder","TypeParameter","User","Issue","Snippet"],"type":"string"},"BaseAssistantMessage":{"additionalProperties":false,"properties":{"id":{"type":"string"}},"type":"object"},"BaseMathType":{"enum":["total","dau","weekly_active","monthly_active","unique_session","first_time_for_user","first_matching_event_for_user"],"type":"string"},"BinCountValue":{"anyOf":[{"type":"number"},{"const":"auto","type":"string"}]},"Breakdown":{"additionalProperties":false,"properties":{"group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}]},"histogram_bin_count":{"type":"integer"},"normalize_url":{"type":"boolean"},"property":{"type":"string"},"type":{"anyOf":[{"$ref":"#/definitions/MultipleBreakdownType"},{"type":"null"}]}},"required":["property"],"type":"object"},"BreakdownAttributionType":{"enum":["first_touch","last_touch","all_events","step"],"type":"string"},"BreakdownFilter":{"additionalProperties":false,"properties":{"breakdown":{"anyOf":[{"type":"string"},{"type":"integer"},{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}]},"breakdown_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}]},"breakdown_hide_other_aggregation":{"type":["boolean","null"]},"breakdown_histogram_bin_count":{"type":"integer"},"breakdown_limit":{"type":"integer"},"breakdown_normalize_url":{"type":"boolean"},"breakdown_type":{"anyOf":[{"$ref":"#/definitions/BreakdownType"},{"type":"null"}],"default":"event"},"breakdowns":{"items":{"$ref":"#/definitions/Breakdown"},"maxLength":3,"type":"array"}},"type":"object"},"BreakdownItem":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/BreakdownValueInt"}]}},"required":["label","value"],"type":"object"},"BreakdownKeyType":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"number"},{"items":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"number"}]},"type":"array"},{"type":"null"}]},"BreakdownType":{"enum":["cohort","person","event","group","session","hogql","data_warehouse","data_warehouse_person_property"],"type":"string"},"BreakdownValueInt":{"type":"integer"},"CacheMissResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":["string","null"]},"query_status":{"$ref":"#/definitions/QueryStatus"}},"required":["cache_key"],"type":"object"},"CachedActorsPropertyTaxonomyQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/ActorsPropertyTaxonomyResponse"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedActorsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"missing_actors_count":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["cache_key","columns","hogql","is_cached","last_refresh","limit","next_allowed_client_refresh","offset","results","timezone","types"],"type":"object"},"CachedErrorTrackingQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{"type":"string"},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/ErrorTrackingIssue"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedEventTaxonomyQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/EventTaxonomyResponse"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedEventsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["cache_key","columns","hogql","is_cached","last_refresh","next_allowed_client_refresh","results","timezone","types"],"type":"object"},"CachedExperimentFunnelsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"expected_loss":{"type":"number"},"funnels_query":{"$ref":"#/definitions/FunnelsQuery"},"insight":{"items":{"items":{"type":"object"},"type":"array"},"type":"array"},"is_cached":{"type":"boolean"},"kind":{"const":"ExperimentFunnelsQuery","type":"string"},"last_refresh":{"format":"date-time","type":"string"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"timezone":{"type":"string"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantFunnelsBaseStats"},"type":"array"}},"required":["cache_key","credible_intervals","expected_loss","insight","is_cached","kind","last_refresh","next_allowed_client_refresh","probability","significance_code","significant","timezone","variants"],"type":"object"},"CachedExperimentTrendsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"count_query":{"$ref":"#/definitions/TrendsQuery"},"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"exposure_query":{"$ref":"#/definitions/TrendsQuery"},"insight":{"items":{"type":"object"},"type":"array"},"is_cached":{"type":"boolean"},"kind":{"const":"ExperimentTrendsQuery","type":"string"},"last_refresh":{"format":"date-time","type":"string"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"p_value":{"type":"number"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"timezone":{"type":"string"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantTrendsBaseStats"},"type":"array"}},"required":["cache_key","credible_intervals","insight","is_cached","kind","last_refresh","next_allowed_client_refresh","p_value","probability","significance_code","significant","timezone","variants"],"type":"object"},"CachedFunnelCorrelationResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/FunnelCorrelationResult"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedFunnelsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"isUdf":{"type":"boolean"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"anyOf":[{"$ref":"#/definitions/FunnelStepsResults"},{"$ref":"#/definitions/FunnelStepsBreakdownResults"},{"$ref":"#/definitions/FunnelTimeToConvertResults"},{"$ref":"#/definitions/FunnelTrendsResults"}]},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedHogQLQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"clickhouse":{"description":"Executed ClickHouse query","type":"string"},"columns":{"description":"Returned columns","items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"explain":{"description":"Query explanation output","items":{"type":"string"},"type":"array"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"metadata":{"$ref":"#/definitions/HogQLMetadataResponse","description":"Query metadata output"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query":{"description":"Input query string","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"description":"Types of returned columns","items":{},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedInsightActorsQueryOptionsResponse":{"additionalProperties":false,"properties":{"breakdown":{"items":{"$ref":"#/definitions/BreakdownItem"},"type":"array"},"breakdowns":{"items":{"$ref":"#/definitions/MultipleBreakdownOptions"},"type":"array"},"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"compare":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"type":"object"},"type":"array"},"day":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/DatetimeDay"},{"$ref":"#/definitions/Day"}]}},"required":["label","value"],"type":"object"},"type":"array"},"interval":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"description":"An interval selected out of available intervals in source query","type":"integer"}},"required":["label","value"],"type":"object"},"type":"array"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"series":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"integer"}},"required":["label","value"],"type":"object"},"type":"array"},"status":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"type":"object"},"type":"array"},"timezone":{"type":"string"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","timezone"],"type":"object"},"CachedLifecycleQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedPathsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedRetentionQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/RetentionResult"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedSessionAttributionExplorerQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedSessionsTimelineQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/TimelineEntry"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedStickinessQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedSuggestedQuestionsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"questions":{"items":{"type":"string"},"type":"array"},"timezone":{"type":"string"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","questions","timezone"],"type":"object"},"CachedTeamTaxonomyQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/TeamTaxonomyResponse"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedTrendsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"description":"Wether more breakdown values are available.","type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedWebExternalClicksTableQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedWebGoalsQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedWebOverviewQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"dateFrom":{"type":"string"},"dateTo":{"type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/WebOverviewItem"},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"CachedWebStatsTableQueryResponse":{"additionalProperties":false,"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"ChartAxis":{"additionalProperties":false,"properties":{"column":{"type":"string"},"settings":{"additionalProperties":false,"properties":{"display":{"$ref":"#/definitions/ChartSettingsDisplay"},"formatting":{"$ref":"#/definitions/ChartSettingsFormatting"}},"type":"object"}},"required":["column"],"type":"object"},"ChartDisplayType":{"enum":["ActionsLineGraph","ActionsBar","ActionsStackedBar","ActionsAreaGraph","ActionsLineGraphCumulative","BoldNumber","ActionsPie","ActionsBarValue","ActionsTable","WorldMap"],"type":"string"},"ChartSettings":{"additionalProperties":false,"properties":{"goalLines":{"items":{"$ref":"#/definitions/GoalLine"},"type":"array"},"leftYAxisSettings":{"$ref":"#/definitions/YAxisSettings"},"rightYAxisSettings":{"$ref":"#/definitions/YAxisSettings"},"seriesBreakdownColumn":{"type":["string","null"]},"stackBars100":{"description":"Whether we fill the bars to 100% in stacked mode","type":"boolean"},"xAxis":{"$ref":"#/definitions/ChartAxis"},"yAxis":{"items":{"$ref":"#/definitions/ChartAxis"},"type":"array"},"yAxisAtZero":{"description":"Deprecated: use `[left|right]YAxisSettings`. Whether the Y axis should start at zero","type":"boolean"}},"type":"object"},"ChartSettingsDisplay":{"additionalProperties":false,"properties":{"color":{"type":"string"},"displayType":{"enum":["auto","line","bar"],"type":"string"},"label":{"type":"string"},"trendLine":{"type":"boolean"},"yAxisPosition":{"enum":["left","right"],"type":"string"}},"type":"object"},"ChartSettingsFormatting":{"additionalProperties":false,"properties":{"decimalPlaces":{"type":"number"},"prefix":{"type":"string"},"style":{"enum":["none","number","percent"],"type":"string"},"suffix":{"type":"string"}},"type":"object"},"ClickhouseQueryProgress":{"additionalProperties":false,"properties":{"active_cpu_time":{"type":"integer"},"bytes_read":{"type":"integer"},"estimated_rows_total":{"type":"integer"},"rows_read":{"type":"integer"},"time_elapsed":{"type":"integer"}},"required":["bytes_read","rows_read","estimated_rows_total","time_elapsed","active_cpu_time"],"type":"object"},"CohortPropertyFilter":{"additionalProperties":false,"description":"Sync with plugin-server/src/types.ts","properties":{"key":{"const":"id","type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator","default":"in"},"type":{"const":"cohort","type":"string"},"value":{"type":"integer"}},"required":["key","operator","type","value"],"type":"object"},"CompareFilter":{"additionalProperties":false,"properties":{"compare":{"default":false,"description":"Whether to compare the current date range to a previous date range.","type":"boolean"},"compare_to":{"description":"The date range to compare to. The value is a relative date. Examples of relative dates are: `-1y` for 1 year ago, `-14m` for 14 months ago, `-100w` for 100 weeks ago, `-14d` for 14 days ago, `-30h` for 30 hours ago.","type":"string"}},"type":"object"},"ConditionalFormattingRule":{"additionalProperties":false,"properties":{"bytecode":{"items":{},"type":"array"},"color":{"type":"string"},"colorMode":{"enum":["light","dark"],"type":"string"},"columnName":{"type":"string"},"id":{"type":"string"},"input":{"type":"string"},"templateId":{"type":"string"}},"required":["id","templateId","columnName","bytecode","input","color"],"type":"object"},"CountPerActorMathType":{"enum":["avg_count_per_actor","min_count_per_actor","max_count_per_actor","median_count_per_actor","p75_count_per_actor","p90_count_per_actor","p95_count_per_actor","p99_count_per_actor"],"type":"string"},"CustomChannelCondition":{"additionalProperties":false,"properties":{"id":{"type":"string"},"key":{"$ref":"#/definitions/CustomChannelField"},"op":{"$ref":"#/definitions/CustomChannelOperator"},"value":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]}},"required":["key","op","id"],"type":"object"},"CustomChannelField":{"enum":["utm_source","utm_medium","utm_campaign","referring_domain","url","pathname","hostname"],"type":"string"},"CustomChannelOperator":{"enum":["exact","is_not","is_set","is_not_set","icontains","not_icontains","regex","not_regex"],"type":"string"},"CustomChannelRule":{"additionalProperties":false,"properties":{"channel_type":{"type":"string"},"combiner":{"$ref":"#/definitions/FilterLogicalOperator"},"id":{"type":"string"},"items":{"items":{"$ref":"#/definitions/CustomChannelCondition"},"type":"array"}},"required":["items","combiner","channel_type","id"],"type":"object"},"CustomEventConversionGoal":{"additionalProperties":false,"properties":{"customEventName":{"type":"string"}},"required":["customEventName"],"type":"object"},"DashboardFilter":{"additionalProperties":false,"properties":{"date_from":{"type":["string","null"]},"date_to":{"type":["string","null"]},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"type":"null"}]}},"type":"object"},"DataColorToken":{"enum":["preset-1","preset-2","preset-3","preset-4","preset-5","preset-6","preset-7","preset-8","preset-9","preset-10","preset-11","preset-12","preset-13","preset-14","preset-15"],"type":"string"},"DataTableNode":{"additionalProperties":false,"properties":{"allowSorting":{"description":"Can the user click on column headers to sort the table? (default: true)","type":"boolean"},"columns":{"description":"Columns shown in the table, unless the `source` provides them.","items":{"$ref":"#/definitions/HogQLExpression"},"type":"array"},"embedded":{"description":"Uses the embedded version of LemonTable","type":"boolean"},"expandable":{"description":"Can expand row to show raw event data (default: true)","type":"boolean"},"full":{"description":"Show with most visual options enabled. Used in scenes.","type":"boolean"},"hiddenColumns":{"description":"Columns that aren\'t shown in the table, even if in columns or returned data","items":{"$ref":"#/definitions/HogQLExpression"},"type":"array"},"kind":{"const":"DataTableNode","type":"string"},"propertiesViaUrl":{"description":"Link properties via the URL (default: false)","type":"boolean"},"response":{"anyOf":[{"properties":{},"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","results","types"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"missing_actors_count":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","limit","offset","results","types"],"type":"object"},{"additionalProperties":false,"properties":{"clickhouse":{"description":"Executed ClickHouse query","type":"string"},"columns":{"description":"Returned columns","items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"explain":{"description":"Query explanation output","items":{"type":"string"},"type":"array"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"metadata":{"$ref":"#/definitions/HogQLMetadataResponse","description":"Query metadata output"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query":{"description":"Input query string","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"description":"Types of returned columns","items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"dateFrom":{"type":"string"},"dateTo":{"type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/WebOverviewItem"},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"type":"string"},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/ErrorTrackingIssue"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"expected_loss":{"type":"number"},"funnels_query":{"$ref":"#/definitions/FunnelsQuery"},"insight":{"items":{"items":{"type":"object"},"type":"array"},"type":"array"},"kind":{"const":"ExperimentFunnelsQuery","type":"string"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantFunnelsBaseStats"},"type":"array"}},"required":["credible_intervals","expected_loss","insight","kind","probability","significance_code","significant","variants"],"type":"object"},{"additionalProperties":false,"properties":{"count_query":{"$ref":"#/definitions/TrendsQuery"},"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"exposure_query":{"$ref":"#/definitions/TrendsQuery"},"insight":{"items":{"type":"object"},"type":"array"},"kind":{"const":"ExperimentTrendsQuery","type":"string"},"p_value":{"type":"number"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantTrendsBaseStats"},"type":"array"}},"required":["credible_intervals","insight","kind","p_value","probability","significance_code","significant","variants"],"type":"object"}]},"showActions":{"description":"Show the kebab menu at the end of the row","type":"boolean"},"showColumnConfigurator":{"description":"Show a button to configure the table\'s columns if possible","type":"boolean"},"showDateRange":{"description":"Show date range selector","type":"boolean"},"showElapsedTime":{"description":"Show the time it takes to run a query","type":"boolean"},"showEventFilter":{"description":"Include an event filter above the table (EventsNode only)","type":"boolean"},"showExport":{"description":"Show the export button","type":"boolean"},"showHogQLEditor":{"description":"Include a HogQL query editor above HogQL tables","type":"boolean"},"showOpenEditorButton":{"description":"Show a button to open the current query as a new insight. (default: true)","type":"boolean"},"showPersistentColumnConfigurator":{"description":"Show a button to configure and persist the table\'s default columns if possible","type":"boolean"},"showPropertyFilter":{"anyOf":[{"type":"boolean"},{"items":{"$ref":"#/definitions/TaxonomicFilterGroupType"},"type":"array"}],"description":"Include a property filter above the table"},"showReload":{"description":"Show a reload button","type":"boolean"},"showResultsTable":{"description":"Show a results table","type":"boolean"},"showSavedQueries":{"description":"Shows a list of saved queries","type":"boolean"},"showSearch":{"description":"Include a free text search field (PersonsNode only)","type":"boolean"},"showTestAccountFilters":{"description":"Show filter to exclude test accounts","type":"boolean"},"showTimings":{"description":"Show a detailed query timing breakdown","type":"boolean"},"source":{"anyOf":[{"$ref":"#/definitions/EventsNode"},{"$ref":"#/definitions/EventsQuery"},{"$ref":"#/definitions/PersonsNode"},{"$ref":"#/definitions/ActorsQuery"},{"$ref":"#/definitions/HogQLQuery"},{"$ref":"#/definitions/WebOverviewQuery"},{"$ref":"#/definitions/WebStatsTableQuery"},{"$ref":"#/definitions/WebExternalClicksTableQuery"},{"$ref":"#/definitions/WebGoalsQuery"},{"$ref":"#/definitions/SessionAttributionExplorerQuery"},{"$ref":"#/definitions/ErrorTrackingQuery"},{"$ref":"#/definitions/ExperimentFunnelsQuery"},{"$ref":"#/definitions/ExperimentTrendsQuery"}],"description":"Source of the events"}},"required":["kind","source"],"type":"object"},"DataVisualizationNode":{"additionalProperties":false,"properties":{"chartSettings":{"$ref":"#/definitions/ChartSettings"},"display":{"$ref":"#/definitions/ChartDisplayType"},"kind":{"const":"DataVisualizationNode","type":"string"},"source":{"$ref":"#/definitions/HogQLQuery"},"tableSettings":{"$ref":"#/definitions/TableSettings"}},"required":["kind","source"],"type":"object"},"DataWarehouseEventsModifier":{"additionalProperties":false,"properties":{"distinct_id_field":{"type":"string"},"id_field":{"type":"string"},"table_name":{"type":"string"},"timestamp_field":{"type":"string"}},"required":["table_name","timestamp_field","distinct_id_field","id_field"],"type":"object"},"DataWarehouseNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"distinct_id_field":{"type":"string"},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"id":{"type":"string"},"id_field":{"type":"string"},"kind":{"const":"DataWarehouseNode","type":"string"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_hogql":{"type":"string"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"},"table_name":{"type":"string"},"timestamp_field":{"type":"string"}},"required":["distinct_id_field","id","id_field","kind","table_name","timestamp_field"],"type":"object"},"DataWarehousePersonPropertyFilter":{"additionalProperties":false,"properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"data_warehouse_person_property","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"DataWarehousePropertyFilter":{"additionalProperties":false,"properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"data_warehouse","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"DatabaseSchemaBatchExportTable":{"additionalProperties":false,"properties":{"fields":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaField"},"type":"object"},"id":{"type":"string"},"name":{"type":"string"},"type":{"const":"batch_export","type":"string"}},"required":["fields","id","name","type"],"type":"object"},"DatabaseSchemaDataWarehouseTable":{"additionalProperties":false,"properties":{"fields":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaField"},"type":"object"},"format":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"schema":{"$ref":"#/definitions/DatabaseSchemaSchema"},"source":{"$ref":"#/definitions/DatabaseSchemaSource"},"type":{"const":"data_warehouse","type":"string"},"url_pattern":{"type":"string"}},"required":["fields","format","id","name","type","url_pattern"],"type":"object"},"DatabaseSchemaField":{"additionalProperties":false,"properties":{"chain":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},"fields":{"items":{"type":"string"},"type":"array"},"hogql_value":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"schema_valid":{"type":"boolean"},"table":{"type":"string"},"type":{"$ref":"#/definitions/DatabaseSerializedFieldType"}},"required":["name","hogql_value","type","schema_valid"],"type":"object"},"DatabaseSchemaMaterializedViewTable":{"additionalProperties":false,"properties":{"fields":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaField"},"type":"object"},"id":{"type":"string"},"last_run_at":{"type":"string"},"name":{"type":"string"},"query":{"$ref":"#/definitions/HogQLQuery"},"status":{"type":"string"},"type":{"const":"materialized_view","type":"string"}},"required":["fields","id","name","query","type"],"type":"object"},"DatabaseSchemaPostHogTable":{"additionalProperties":false,"properties":{"fields":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaField"},"type":"object"},"id":{"type":"string"},"name":{"type":"string"},"type":{"const":"posthog","type":"string"}},"required":["fields","id","name","type"],"type":"object"},"DatabaseSchemaQuery":{"additionalProperties":false,"properties":{"kind":{"const":"DatabaseSchemaQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/DatabaseSchemaQueryResponse"}},"required":["kind"],"type":"object"},"DatabaseSchemaQueryResponse":{"additionalProperties":false,"properties":{"tables":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaTable"},"type":"object"}},"required":["tables"],"type":"object"},"DatabaseSchemaSchema":{"additionalProperties":false,"properties":{"id":{"type":"string"},"incremental":{"type":"boolean"},"last_synced_at":{"type":"string"},"name":{"type":"string"},"should_sync":{"type":"boolean"},"status":{"type":"string"}},"required":["id","name","should_sync","incremental"],"type":"object"},"DatabaseSchemaSource":{"additionalProperties":false,"properties":{"id":{"type":"string"},"last_synced_at":{"type":"string"},"prefix":{"type":"string"},"source_type":{"type":"string"},"status":{"type":"string"}},"required":["id","status","source_type","prefix"],"type":"object"},"DatabaseSchemaTable":{"anyOf":[{"$ref":"#/definitions/DatabaseSchemaPostHogTable"},{"$ref":"#/definitions/DatabaseSchemaDataWarehouseTable"},{"$ref":"#/definitions/DatabaseSchemaViewTable"},{"$ref":"#/definitions/DatabaseSchemaBatchExportTable"},{"$ref":"#/definitions/DatabaseSchemaMaterializedViewTable"}]},"DatabaseSchemaTableCommon":{"additionalProperties":false,"properties":{"fields":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaField"},"type":"object"},"id":{"type":"string"},"name":{"type":"string"},"type":{"enum":["posthog","data_warehouse","view","batch_export","materialized_view"],"type":"string"}},"required":["type","id","name","fields"],"type":"object"},"DatabaseSchemaViewTable":{"additionalProperties":false,"properties":{"fields":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaField"},"type":"object"},"id":{"type":"string"},"name":{"type":"string"},"query":{"$ref":"#/definitions/HogQLQuery"},"type":{"const":"view","type":"string"}},"required":["fields","id","name","query","type"],"type":"object"},"DatabaseSerializedFieldType":{"enum":["integer","float","string","datetime","date","boolean","array","json","lazy_table","virtual_table","field_traverser","expression","view","materialized_view"],"type":"string"},"DateRange":{"additionalProperties":false,"properties":{"date_from":{"type":["string","null"]},"date_to":{"type":["string","null"]},"explicitDate":{"default":false,"description":"Whether the date_from and date_to should be used verbatim. Disables rounding to the start and end of period.","type":["boolean","null"]}},"type":"object"},"DatetimeDay":{"format":"date-time","type":"string"},"Day":{"type":"integer"},"DefaultChannelTypes":{"enum":["Cross Network","Paid Search","Paid Social","Paid Video","Paid Shopping","Paid Unknown","Direct","Organic Search","Organic Social","Organic Video","Organic Shopping","Push","SMS","Audio","Email","Referral","Affiliate","Unknown"],"type":"string"},"DurationType":{"enum":["duration","active_seconds","inactive_seconds"],"type":"string"},"ElementPropertyFilter":{"additionalProperties":false,"description":"Sync with plugin-server/src/types.ts","properties":{"key":{"enum":["tag_name","text","href","selector"],"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"element","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"ElementType":{"additionalProperties":false,"properties":{"attr_class":{"items":{"type":"string"},"type":"array"},"attr_id":{"type":"string"},"attributes":{"additionalProperties":{"type":"string"},"type":"object"},"href":{"type":"string"},"nth_child":{"type":"number"},"nth_of_type":{"type":"number"},"order":{"type":"number"},"tag_name":{"type":"string"},"text":{"type":"string"}},"required":["attributes","tag_name"],"type":"object"},"EmptyPropertyFilter":{"additionalProperties":false,"type":"object"},"EntityNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"kind":{"$ref":"#/definitions/NodeKind"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_hogql":{"type":"string"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["kind"],"type":"object"},"EntityType":{"enum":["actions","events","data_warehouse","new_entity"],"type":"string"},"ErrorTrackingIssue":{"additionalProperties":false,"properties":{"assignee":{"type":["number","null"]},"description":{"type":["string","null"]},"earliest":{"type":"string"},"first_seen":{"format":"date-time","type":"string"},"id":{"type":"string"},"last_seen":{"format":"date-time","type":"string"},"name":{"type":["string","null"]},"occurrences":{"type":"number"},"sessions":{"type":"number"},"status":{"enum":["archived","active","resolved","pending_release"],"type":"string"},"users":{"type":"number"},"volume":{}},"required":["id","name","description","occurrences","sessions","users","first_seen","last_seen","earliest","assignee","status"],"type":"object"},"ErrorTrackingQuery":{"additionalProperties":false,"properties":{"assignee":{"anyOf":[{"type":"integer"},{"type":"null"}]},"dateRange":{"$ref":"#/definitions/DateRange"},"filterGroup":{"$ref":"#/definitions/PropertyGroupFilter"},"filterTestAccounts":{"type":"boolean"},"issueId":{"type":"string"},"kind":{"const":"ErrorTrackingQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"orderBy":{"enum":["last_seen","first_seen","occurrences","users","sessions"],"type":"string"},"response":{"$ref":"#/definitions/ErrorTrackingQueryResponse"},"searchQuery":{"type":"string"},"select":{"items":{"$ref":"#/definitions/HogQLExpression"},"type":"array"}},"required":["dateRange","kind"],"type":"object"},"ErrorTrackingQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{"type":"string"},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/ErrorTrackingIssue"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"EventDefinition":{"additionalProperties":false,"properties":{"elements":{"items":{},"type":"array"},"event":{"type":"string"},"properties":{"type":"object"}},"required":["event","properties","elements"],"type":"object"},"EventOddsRatioSerialized":{"additionalProperties":false,"properties":{"correlation_type":{"enum":["success","failure"],"type":"string"},"event":{"$ref":"#/definitions/EventDefinition"},"failure_count":{"type":"integer"},"odds_ratio":{"type":"number"},"success_count":{"type":"integer"}},"required":["event","success_count","failure_count","odds_ratio","correlation_type"],"type":"object"},"EventPropertyFilter":{"additionalProperties":false,"description":"Sync with plugin-server/src/types.ts","properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator","default":"exact"},"type":{"const":"event","description":"Event properties","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"EventTaxonomyItem":{"additionalProperties":false,"properties":{"property":{"type":"string"},"sample_count":{"type":"integer"},"sample_values":{"items":{"type":"string"},"type":"array"}},"required":["property","sample_values","sample_count"],"type":"object"},"EventTaxonomyQuery":{"additionalProperties":false,"properties":{"event":{"type":"string"},"kind":{"const":"EventTaxonomyQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"items":{"type":"string"},"type":"array"},"response":{"$ref":"#/definitions/EventTaxonomyQueryResponse"}},"required":["event","kind"],"type":"object"},"EventTaxonomyQueryResponse":{"additionalProperties":false,"description":"All analytics query responses must inherit from this.","properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/EventTaxonomyResponse"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"EventTaxonomyResponse":{"items":{"$ref":"#/definitions/EventTaxonomyItem"},"type":"array"},"EventType":{"additionalProperties":false,"properties":{"distinct_id":{"type":"string"},"elements":{"items":{"$ref":"#/definitions/ElementType"},"type":"array"},"elements_chain":{"type":["string","null"]},"event":{"type":"string"},"id":{"type":"string"},"person":{"additionalProperties":false,"properties":{"distinct_ids":{"items":{"type":"string"},"type":"array"},"is_identified":{"type":"boolean"},"properties":{"type":"object"}},"required":["distinct_ids","properties"],"type":"object"},"properties":{"type":"object"},"timestamp":{"type":"string"},"uuid":{"type":"string"}},"required":["id","distinct_id","properties","event","timestamp","elements"],"type":"object"},"EventsNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"event":{"description":"The event or `null` for all events.","type":["string","null"]},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"kind":{"const":"EventsNode","type":"string"},"limit":{"type":"integer"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_hogql":{"type":"string"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"orderBy":{"description":"Columns to order by","items":{"type":"string"},"type":"array"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["kind"],"type":"object"},"EventsQuery":{"additionalProperties":false,"properties":{"actionId":{"description":"Show events matching a given action","type":"integer"},"after":{"description":"Only fetch events that happened after this timestamp","type":"string"},"before":{"description":"Only fetch events that happened before this timestamp","type":"string"},"event":{"description":"Limit to events matching this string","type":["string","null"]},"filterTestAccounts":{"description":"Filter test accounts","type":"boolean"},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyFilterLike"},"type":"array"},"kind":{"const":"EventsQuery","type":"string"},"limit":{"description":"Number of rows to return","type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"description":"Number of rows to skip before returning rows","type":"integer"},"orderBy":{"description":"Columns to order by","items":{"type":"string"},"type":"array"},"personId":{"description":"Show events for a given person","type":"string"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"$ref":"#/definitions/EventsQueryResponse"},"select":{"description":"Return a limited set of data. Required.","items":{"$ref":"#/definitions/HogQLExpression"},"type":"array"},"where":{"description":"HogQL filters to apply on returned data","items":{"$ref":"#/definitions/HogQLExpression"},"type":"array"}},"required":["kind","select"],"type":"object"},"EventsQueryPersonColumn":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"distinct_id":{"type":"string"},"properties":{"additionalProperties":false,"properties":{"email":{"type":"string"},"name":{"type":"string"}},"type":"object"},"uuid":{"type":"string"}},"required":["uuid","created_at","properties","distinct_id"],"type":"object"},"EventsQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","results","types"],"type":"object"},"ExperimentFunnelsQuery":{"additionalProperties":false,"properties":{"experiment_id":{"type":"integer"},"funnels_query":{"$ref":"#/definitions/FunnelsQuery"},"kind":{"const":"ExperimentFunnelsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"name":{"type":"string"},"response":{"$ref":"#/definitions/ExperimentFunnelsQueryResponse"}},"required":["funnels_query","kind"],"type":"object"},"ExperimentFunnelsQueryResponse":{"additionalProperties":false,"properties":{"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"expected_loss":{"type":"number"},"funnels_query":{"$ref":"#/definitions/FunnelsQuery"},"insight":{"items":{"items":{"type":"object"},"type":"array"},"type":"array"},"kind":{"const":"ExperimentFunnelsQuery","type":"string"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantFunnelsBaseStats"},"type":"array"}},"required":["kind","insight","variants","probability","significant","significance_code","expected_loss","credible_intervals"],"type":"object"},"ExperimentSignificanceCode":{"enum":["significant","not_enough_exposure","low_win_probability","high_loss","high_p_value"],"type":"string"},"ExperimentTrendsQuery":{"additionalProperties":false,"properties":{"count_query":{"$ref":"#/definitions/TrendsQuery"},"experiment_id":{"type":"integer"},"exposure_query":{"$ref":"#/definitions/TrendsQuery"},"kind":{"const":"ExperimentTrendsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"name":{"type":"string"},"response":{"$ref":"#/definitions/ExperimentTrendsQueryResponse"}},"required":["count_query","kind"],"type":"object"},"ExperimentTrendsQueryResponse":{"additionalProperties":false,"properties":{"count_query":{"$ref":"#/definitions/TrendsQuery"},"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"exposure_query":{"$ref":"#/definitions/TrendsQuery"},"insight":{"items":{"type":"object"},"type":"array"},"kind":{"const":"ExperimentTrendsQuery","type":"string"},"p_value":{"type":"number"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantTrendsBaseStats"},"type":"array"}},"required":["kind","insight","variants","probability","significant","significance_code","p_value","credible_intervals"],"type":"object"},"ExperimentVariantFunnelsBaseStats":{"additionalProperties":false,"properties":{"failure_count":{"type":"number"},"key":{"type":"string"},"success_count":{"type":"number"}},"required":["key","success_count","failure_count"],"type":"object"},"ExperimentVariantTrendsBaseStats":{"additionalProperties":false,"properties":{"absolute_exposure":{"type":"number"},"count":{"type":"number"},"exposure":{"type":"number"},"key":{"type":"string"}},"required":["key","count","exposure","absolute_exposure"],"type":"object"},"FailureMessage":{"additionalProperties":false,"properties":{"content":{"type":"string"},"id":{"type":"string"},"type":{"const":"ai/failure","type":"string"}},"required":["type"],"type":"object"},"FeaturePropertyFilter":{"additionalProperties":false,"properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"feature","description":"Event property with \\"$feature/\\" prepended","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"FilterLogicalOperator":{"enum":["AND","OR"],"type":"string"},"FunnelConversionWindowTimeUnit":{"enum":["second","minute","hour","day","week","month"],"type":"string"},"FunnelCorrelationActorsQuery":{"additionalProperties":false,"properties":{"funnelCorrelationPersonConverted":{"type":"boolean"},"funnelCorrelationPersonEntity":{"$ref":"#/definitions/AnyEntityNode"},"funnelCorrelationPropertyValues":{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"includeRecordings":{"type":"boolean"},"kind":{"const":"FunnelCorrelationActorsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/ActorsQueryResponse"},"source":{"$ref":"#/definitions/FunnelCorrelationQuery"}},"required":["kind","source"],"type":"object"},"FunnelCorrelationQuery":{"additionalProperties":false,"properties":{"funnelCorrelationEventExcludePropertyNames":{"items":{"type":"string"},"type":"array"},"funnelCorrelationEventNames":{"items":{"type":"string"},"type":"array"},"funnelCorrelationExcludeEventNames":{"items":{"type":"string"},"type":"array"},"funnelCorrelationExcludeNames":{"items":{"type":"string"},"type":"array"},"funnelCorrelationNames":{"items":{"type":"string"},"type":"array"},"funnelCorrelationType":{"$ref":"#/definitions/FunnelCorrelationResultsType"},"kind":{"const":"FunnelCorrelationQuery","type":"string"},"response":{"$ref":"#/definitions/FunnelCorrelationResponse"},"source":{"$ref":"#/definitions/FunnelsActorsQuery"}},"required":["funnelCorrelationType","kind","source"],"type":"object"},"FunnelCorrelationResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/FunnelCorrelationResult"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},"FunnelCorrelationResult":{"additionalProperties":false,"properties":{"events":{"items":{"$ref":"#/definitions/EventOddsRatioSerialized"},"type":"array"},"skewed":{"type":"boolean"}},"required":["events","skewed"],"type":"object"},"FunnelCorrelationResultsType":{"enum":["events","properties","event_with_properties"],"type":"string"},"FunnelExclusion":{"anyOf":[{"$ref":"#/definitions/FunnelExclusionEventsNode"},{"$ref":"#/definitions/FunnelExclusionActionsNode"}]},"FunnelExclusionActionsNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"funnelFromStep":{"type":"integer"},"funnelToStep":{"type":"integer"},"id":{"type":"integer"},"kind":{"const":"ActionsNode","type":"string"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_hogql":{"type":"string"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["funnelFromStep","funnelToStep","id","kind"],"type":"object"},"FunnelExclusionEventsNode":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"event":{"description":"The event or `null` for all events.","type":["string","null"]},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"funnelFromStep":{"type":"integer"},"funnelToStep":{"type":"integer"},"kind":{"const":"EventsNode","type":"string"},"limit":{"type":"integer"},"math":{"$ref":"#/definitions/MathType"},"math_group_type_index":{"enum":[0,1,2,3,4],"type":"number"},"math_hogql":{"type":"string"},"math_property":{"type":"string"},"math_property_type":{"type":"string"},"name":{"type":"string"},"orderBy":{"description":"Columns to order by","items":{"type":"string"},"type":"array"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"}},"required":["funnelFromStep","funnelToStep","kind"],"type":"object"},"FunnelExclusionLegacy":{"additionalProperties":false,"properties":{"custom_name":{"type":["string","null"]},"funnel_from_step":{"type":"number"},"funnel_to_step":{"type":"number"},"id":{"type":["string","number","null"]},"index":{"type":"number"},"name":{"type":["string","null"]},"order":{"type":"number"},"type":{"$ref":"#/definitions/EntityType"}},"required":["funnel_from_step","funnel_to_step"],"type":"object"},"FunnelExclusionSteps":{"additionalProperties":false,"properties":{"funnelFromStep":{"type":"integer"},"funnelToStep":{"type":"integer"}},"required":["funnelFromStep","funnelToStep"],"type":"object"},"FunnelLayout":{"enum":["horizontal","vertical"],"type":"string"},"FunnelMathType":{"enum":["total","first_time_for_user","first_time_for_user_with_filters"],"type":"string"},"FunnelPathType":{"enum":["funnel_path_before_step","funnel_path_between_steps","funnel_path_after_step"],"type":"string"},"FunnelPathsFilter":{"additionalProperties":false,"properties":{"funnelPathType":{"$ref":"#/definitions/FunnelPathType"},"funnelSource":{"$ref":"#/definitions/FunnelsQuery"},"funnelStep":{"type":"integer"}},"required":["funnelSource"],"type":"object"},"FunnelStepReference":{"enum":["total","previous"],"type":"string"},"FunnelStepsBreakdownResults":{"items":{"items":{"type":"object"},"type":"array"},"type":"array"},"FunnelStepsResults":{"items":{"type":"object"},"type":"array"},"FunnelTimeToConvertResults":{"additionalProperties":false,"properties":{"average_conversion_time":{"type":["number","null"]},"bins":{"items":{"items":{"type":"integer"},"maxItems":2,"minItems":2,"type":"array"},"type":"array"}},"required":["average_conversion_time","bins"],"type":"object"},"FunnelTrendsResults":{"items":{"type":"object"},"type":"array"},"FunnelVizType":{"enum":["steps","time_to_convert","trends"],"type":"string"},"FunnelsActorsQuery":{"additionalProperties":false,"properties":{"funnelCustomSteps":{"description":"Custom step numbers to get persons for. This overrides `funnelStep`. Primarily for correlation use.","items":{"type":"integer"},"type":"array"},"funnelStep":{"description":"Index of the step for which we want to get the timestamp for, per person. Positive for converted persons, negative for dropped of persons.","type":"integer"},"funnelStepBreakdown":{"$ref":"#/definitions/BreakdownKeyType","description":"The breakdown value for which to get persons for. This is an array for person and event properties, a string for groups and an integer for cohorts."},"funnelTrendsDropOff":{"type":"boolean"},"funnelTrendsEntrancePeriodStart":{"description":"Used together with `funnelTrendsDropOff` for funnels time conversion date for the persons modal.","type":"string"},"includeRecordings":{"type":"boolean"},"kind":{"const":"FunnelsActorsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/ActorsQueryResponse"},"source":{"$ref":"#/definitions/FunnelsQuery"}},"required":["kind","source"],"type":"object"},"FunnelsFilter":{"additionalProperties":false,"properties":{"binCount":{"type":"integer"},"breakdownAttributionType":{"$ref":"#/definitions/BreakdownAttributionType","default":"first_touch"},"breakdownAttributionValue":{"type":"integer"},"exclusions":{"default":[],"items":{"$ref":"#/definitions/FunnelExclusion"},"type":"array"},"funnelAggregateByHogQL":{"type":"string"},"funnelFromStep":{"type":"integer"},"funnelOrderType":{"$ref":"#/definitions/StepOrderValue","default":"ordered"},"funnelStepReference":{"$ref":"#/definitions/FunnelStepReference","default":"total"},"funnelToStep":{"type":"integer"},"funnelVizType":{"$ref":"#/definitions/FunnelVizType","default":"steps"},"funnelWindowInterval":{"default":14,"type":"integer"},"funnelWindowIntervalUnit":{"$ref":"#/definitions/FunnelConversionWindowTimeUnit","default":"day"},"hiddenLegendBreakdowns":{"items":{"type":"string"},"type":"array"},"layout":{"$ref":"#/definitions/FunnelLayout","default":"vertical"},"resultCustomizations":{"additionalProperties":{"$ref":"#/definitions/ResultCustomizationByValue"},"description":"Customizations for the appearance of result datasets.","type":"object"},"useUdf":{"type":"boolean"}},"type":"object"},"FunnelsFilterLegacy":{"additionalProperties":false,"description":"`FunnelsFilterType` minus everything inherited from `FilterType` and persons modal related params","properties":{"bin_count":{"$ref":"#/definitions/BinCountValue"},"breakdown_attribution_type":{"$ref":"#/definitions/BreakdownAttributionType"},"breakdown_attribution_value":{"type":"number"},"exclusions":{"items":{"$ref":"#/definitions/FunnelExclusionLegacy"},"type":"array"},"funnel_aggregate_by_hogql":{"type":"string"},"funnel_from_step":{"type":"number"},"funnel_order_type":{"$ref":"#/definitions/StepOrderValue"},"funnel_step_reference":{"$ref":"#/definitions/FunnelStepReference"},"funnel_to_step":{"type":"number"},"funnel_viz_type":{"$ref":"#/definitions/FunnelVizType"},"funnel_window_interval":{"type":"number"},"funnel_window_interval_unit":{"$ref":"#/definitions/FunnelConversionWindowTimeUnit"},"hidden_legend_keys":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"not":{}}]},"type":"object"},"layout":{"$ref":"#/definitions/FunnelLayout"}},"type":"object"},"FunnelsQuery":{"additionalProperties":false,"properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"breakdownFilter":{"$ref":"#/definitions/BreakdownFilter","description":"Breakdown of the events and actions"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"funnelsFilter":{"$ref":"#/definitions/FunnelsFilter","description":"Properties specific to the funnels insight"},"interval":{"$ref":"#/definitions/IntervalType","description":"Granularity of the response. Can be one of `hour`, `day`, `week` or `month`"},"kind":{"const":"FunnelsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/FunnelsQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]},"series":{"description":"Events and actions to include","items":{"$ref":"#/definitions/AnyEntityNode"},"type":"array"}},"required":["kind","series"],"type":"object"},"FunnelsQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"isUdf":{"type":"boolean"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"anyOf":[{"$ref":"#/definitions/FunnelStepsResults"},{"$ref":"#/definitions/FunnelStepsBreakdownResults"},{"$ref":"#/definitions/FunnelTimeToConvertResults"},{"$ref":"#/definitions/FunnelTrendsResults"}]},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"GenericCachedQueryResponse":{"properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"timezone":{"type":"string"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","timezone"],"type":"object"},"GoalLine":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"number"}},"required":["label","value"],"type":"object"},"GroupMathType":{"const":"unique_group","type":"string"},"GroupPropertyFilter":{"additionalProperties":false,"properties":{"group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}]},"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"group","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"HasPropertiesNode":{"anyOf":[{"$ref":"#/definitions/EventsNode"},{"$ref":"#/definitions/EventsQuery"},{"$ref":"#/definitions/PersonsNode"}]},"HogCompileResponse":{"additionalProperties":false,"properties":{"bytecode":{"items":{},"type":"array"},"locals":{"items":{},"type":"array"}},"required":["bytecode","locals"],"type":"object"},"HogLanguage":{"enum":["hog","hogJson","hogQL","hogQLExpr","hogTemplate"],"type":"string"},"HogQLAutocomplete":{"additionalProperties":false,"properties":{"endPosition":{"description":"End position of the editor word","type":"integer"},"filters":{"$ref":"#/definitions/HogQLFilters","description":"Table to validate the expression against"},"globals":{"description":"Global values in scope","type":"object"},"kind":{"const":"HogQLAutocomplete","type":"string"},"language":{"$ref":"#/definitions/HogLanguage","description":"Language to validate"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query":{"description":"Query to validate","type":"string"},"response":{"$ref":"#/definitions/HogQLAutocompleteResponse"},"sourceQuery":{"$ref":"#/definitions/AnyDataNode","description":"Query in whose context to validate."},"startPosition":{"description":"Start position of the editor word","type":"integer"}},"required":["endPosition","kind","language","query","startPosition"],"type":"object"},"HogQLAutocompleteResponse":{"additionalProperties":false,"properties":{"incomplete_list":{"description":"Whether or not the suggestions returned are complete","type":"boolean"},"suggestions":{"items":{"$ref":"#/definitions/AutocompleteCompletionItem"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["suggestions","incomplete_list"],"type":"object"},"HogQLExpression":{"type":"string"},"HogQLFilters":{"additionalProperties":false,"description":"Filters object that will be converted to a HogQL {filters} placeholder","properties":{"dateRange":{"$ref":"#/definitions/DateRange"},"filterTestAccounts":{"type":"boolean"},"properties":{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"}},"type":"object"},"HogQLMathType":{"const":"hogql","type":"string"},"HogQLMetadata":{"additionalProperties":false,"properties":{"debug":{"description":"Enable more verbose output, usually run from the /debug page","type":"boolean"},"filters":{"$ref":"#/definitions/HogQLFilters","description":"Extra filters applied to query via {filters}"},"globals":{"description":"Extra globals for the query","type":"object"},"kind":{"const":"HogQLMetadata","type":"string"},"language":{"$ref":"#/definitions/HogLanguage","description":"Language to validate"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query":{"description":"Query to validate","type":"string"},"response":{"$ref":"#/definitions/HogQLMetadataResponse"},"sourceQuery":{"$ref":"#/definitions/AnyDataNode","description":"Query within which \\"expr\\" and \\"template\\" are validated. Defaults to \\"select * from events\\""},"variables":{"additionalProperties":{"$ref":"#/definitions/HogQLVariable"},"description":"Variables to be subsituted into the query","type":"object"}},"required":["kind","language","query"],"type":"object"},"HogQLMetadataResponse":{"additionalProperties":false,"properties":{"errors":{"items":{"$ref":"#/definitions/HogQLNotice"},"type":"array"},"isValid":{"type":"boolean"},"isValidView":{"type":"boolean"},"notices":{"items":{"$ref":"#/definitions/HogQLNotice"},"type":"array"},"query":{"type":"string"},"table_names":{"items":{"type":"string"},"type":"array"},"warnings":{"items":{"$ref":"#/definitions/HogQLNotice"},"type":"array"}},"required":["errors","warnings","notices"],"type":"object"},"HogQLNotice":{"additionalProperties":false,"properties":{"end":{"type":"integer"},"fix":{"type":"string"},"message":{"type":"string"},"start":{"type":"integer"}},"required":["message"],"type":"object"},"HogQLPropertyFilter":{"additionalProperties":false,"properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"const":"hogql","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","type"],"type":"object"},"HogQLQuery":{"additionalProperties":false,"properties":{"explain":{"deprecated":"use modifiers.debug instead","type":"boolean"},"filters":{"$ref":"#/definitions/HogQLFilters"},"kind":{"const":"HogQLQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query":{"type":"string"},"response":{"$ref":"#/definitions/HogQLQueryResponse"},"values":{"description":"Constant values that can be referenced with the {placeholder} syntax in the query","type":"object"},"variables":{"additionalProperties":{"$ref":"#/definitions/HogQLVariable"},"description":"Variables to be subsituted into the query","type":"object"}},"required":["kind","query"],"type":"object"},"HogQLQueryModifiers":{"additionalProperties":false,"description":"HogQL Query Options are automatically set per team. However, they can be overridden in the query.","properties":{"bounceRateDurationSeconds":{"type":"number"},"bounceRatePageViewMode":{"enum":["count_pageviews","uniq_urls","uniq_page_screen_autocaptures"],"type":"string"},"customChannelTypeRules":{"items":{"$ref":"#/definitions/CustomChannelRule"},"type":"array"},"dataWarehouseEventsModifiers":{"items":{"$ref":"#/definitions/DataWarehouseEventsModifier"},"type":"array"},"debug":{"type":"boolean"},"inCohortVia":{"enum":["auto","leftjoin","subquery","leftjoin_conjoined"],"type":"string"},"materializationMode":{"enum":["auto","legacy_null_as_string","legacy_null_as_null","disabled"],"type":"string"},"optimizeJoinedFilters":{"type":"boolean"},"personsArgMaxVersion":{"enum":["auto","v1","v2"],"type":"string"},"personsJoinMode":{"enum":["inner","left"],"type":"string"},"personsOnEventsMode":{"enum":["disabled","person_id_no_override_properties_on_events","person_id_override_properties_on_events","person_id_override_properties_joined"],"type":"string"},"propertyGroupsMode":{"enum":["enabled","disabled","optimized"],"type":"string"},"s3TableUseInvalidColumns":{"type":"boolean"},"sessionTableVersion":{"enum":["auto","v1","v2"],"type":"string"},"useMaterializedViews":{"type":"boolean"}},"type":"object"},"HogQLQueryResponse":{"additionalProperties":false,"properties":{"clickhouse":{"description":"Executed ClickHouse query","type":"string"},"columns":{"description":"Returned columns","items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"explain":{"description":"Query explanation output","items":{"type":"string"},"type":"array"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"metadata":{"$ref":"#/definitions/HogQLMetadataResponse","description":"Query metadata output"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query":{"description":"Input query string","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"description":"Types of returned columns","items":{},"type":"array"}},"required":["results"],"type":"object"},"HogQLVariable":{"additionalProperties":false,"properties":{"code_name":{"type":"string"},"value":{},"variableId":{"type":"string"}},"required":["variableId","code_name"],"type":"object"},"HogQuery":{"additionalProperties":false,"properties":{"code":{"type":"string"},"kind":{"const":"HogQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/HogQueryResponse"}},"required":["kind"],"type":"object"},"HogQueryResponse":{"additionalProperties":false,"properties":{"bytecode":{"items":{},"type":"array"},"coloredBytecode":{"items":{},"type":"array"},"results":{},"stdout":{"type":"string"}},"required":["results"],"type":"object"},"HumanMessage":{"additionalProperties":false,"properties":{"content":{"type":"string"},"id":{"type":"string"},"type":{"const":"human","type":"string"}},"required":["type","content"],"type":"object"},"InsightActorsQuery":{"additionalProperties":false,"properties":{"breakdown":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/BreakdownValueInt"},{"items":{"type":"string"},"type":"array"}]},"compare":{"enum":["current","previous"],"type":"string"},"day":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/Day"}]},"includeRecordings":{"type":"boolean"},"interval":{"description":"An interval selected out of available intervals in source query.","type":"integer"},"kind":{"const":"InsightActorsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/ActorsQueryResponse"},"series":{"type":"integer"},"source":{"$ref":"#/definitions/InsightQuerySource"},"status":{"type":"string"}},"required":["kind","source"],"type":"object"},"InsightActorsQueryBase":{"additionalProperties":false,"properties":{"includeRecordings":{"type":"boolean"},"kind":{"$ref":"#/definitions/NodeKind"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/ActorsQueryResponse"}},"required":["kind"],"type":"object"},"InsightActorsQueryOptions":{"additionalProperties":false,"properties":{"kind":{"const":"InsightActorsQueryOptions","type":"string"},"response":{"$ref":"#/definitions/InsightActorsQueryOptionsResponse"},"source":{"anyOf":[{"$ref":"#/definitions/InsightActorsQuery"},{"$ref":"#/definitions/FunnelsActorsQuery"},{"$ref":"#/definitions/FunnelCorrelationActorsQuery"}]}},"required":["kind","source"],"type":"object"},"InsightActorsQueryOptionsResponse":{"additionalProperties":false,"properties":{"breakdown":{"items":{"$ref":"#/definitions/BreakdownItem"},"type":"array"},"breakdowns":{"items":{"$ref":"#/definitions/MultipleBreakdownOptions"},"type":"array"},"compare":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"type":"object"},"type":"array"},"day":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/DatetimeDay"},{"$ref":"#/definitions/Day"}]}},"required":["label","value"],"type":"object"},"type":"array"},"interval":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"description":"An interval selected out of available intervals in source query","type":"integer"}},"required":["label","value"],"type":"object"},"type":"array"},"series":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"integer"}},"required":["label","value"],"type":"object"},"type":"array"},"status":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"type":"object"},"type":"array"}},"type":"object"},"InsightFilter":{"anyOf":[{"$ref":"#/definitions/TrendsFilter"},{"$ref":"#/definitions/FunnelsFilter"},{"$ref":"#/definitions/RetentionFilter"},{"$ref":"#/definitions/PathsFilter"},{"$ref":"#/definitions/StickinessFilter"},{"$ref":"#/definitions/LifecycleFilter"}]},"InsightFilterProperty":{"enum":["trendsFilter","funnelsFilter","retentionFilter","pathsFilter","stickinessFilter","lifecycleFilter"],"type":"string"},"InsightNodeKind":{"enum":["TrendsQuery","FunnelsQuery","RetentionQuery","PathsQuery","StickinessQuery","LifecycleQuery"],"type":"string"},"InsightQueryNode":{"discriminator":{"propertyName":"kind"},"oneOf":[{"$ref":"#/definitions/TrendsQuery"},{"$ref":"#/definitions/FunnelsQuery"},{"$ref":"#/definitions/RetentionQuery"},{"$ref":"#/definitions/PathsQuery"},{"$ref":"#/definitions/StickinessQuery"},{"$ref":"#/definitions/LifecycleQuery"}],"required":["kind"],"type":"object"},"InsightQuerySource":{"$ref":"#/definitions/InsightQueryNode"},"InsightShortId":{"type":"string"},"InsightThreshold":{"additionalProperties":false,"properties":{"bounds":{"$ref":"#/definitions/InsightsThresholdBounds"},"type":{"$ref":"#/definitions/InsightThresholdType"}},"required":["type"],"type":"object"},"InsightThresholdType":{"enum":["absolute","percentage"],"type":"string"},"InsightVizNode":{"additionalProperties":false,"properties":{"embedded":{"description":"Query is embedded inside another bordered component","type":"boolean"},"full":{"description":"Show with most visual options enabled. Used in insight scene.","type":"boolean"},"hidePersonsModal":{"type":"boolean"},"kind":{"const":"InsightVizNode","type":"string"},"showCorrelationTable":{"type":"boolean"},"showFilters":{"type":"boolean"},"showHeader":{"type":"boolean"},"showLastComputation":{"type":"boolean"},"showLastComputationRefresh":{"type":"boolean"},"showResults":{"type":"boolean"},"showTable":{"type":"boolean"},"source":{"$ref":"#/definitions/InsightQueryNode"},"suppressSessionAnalysisWarning":{"type":"boolean"},"vizSpecificOptions":{"$ref":"#/definitions/VizSpecificOptions"}},"required":["kind","source"],"type":"object"},"InsightsQueryBase":{"additionalProperties":false,"description":"Base class for insight query nodes. Should not be used directly.","properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"$ref":"#/definitions/NodeKind"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/FunnelsQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind"],"type":"object"},"InsightsQueryBase":{"additionalProperties":false,"description":"Base class for insight query nodes. Should not be used directly.","properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"$ref":"#/definitions/NodeKind"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/LifecycleQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind"],"type":"object"},"InsightsQueryBase":{"additionalProperties":false,"description":"Base class for insight query nodes. Should not be used directly.","properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"$ref":"#/definitions/NodeKind"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/PathsQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind"],"type":"object"},"InsightsQueryBase":{"additionalProperties":false,"description":"Base class for insight query nodes. Should not be used directly.","properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"$ref":"#/definitions/NodeKind"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/RetentionQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind"],"type":"object"},"InsightsQueryBase":{"additionalProperties":false,"description":"Base class for insight query nodes. Should not be used directly.","properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"$ref":"#/definitions/NodeKind"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/TrendsQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind"],"type":"object"},"InsightsThresholdBounds":{"additionalProperties":false,"properties":{"lower":{"type":"number"},"upper":{"type":"number"}},"type":"object"},"IntervalType":{"enum":["minute","hour","day","week","month"],"type":"string"},"LifecycleFilter":{"additionalProperties":false,"properties":{"showLegend":{"default":false,"type":"boolean"},"showValuesOnSeries":{"type":"boolean"},"toggledLifecycles":{"items":{"$ref":"#/definitions/LifecycleToggle"},"type":"array"}},"type":"object"},"LifecycleFilterLegacy":{"additionalProperties":false,"description":"`LifecycleFilterType` minus everything inherited from `FilterType`","properties":{"show_legend":{"type":"boolean"},"show_values_on_series":{"type":"boolean"},"toggledLifecycles":{"items":{"$ref":"#/definitions/LifecycleToggle"},"type":"array"}},"type":"object"},"LifecycleQuery":{"additionalProperties":false,"properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"interval":{"$ref":"#/definitions/IntervalType","default":"day","description":"Granularity of the response. Can be one of `hour`, `day`, `week` or `month`"},"kind":{"const":"LifecycleQuery","type":"string"},"lifecycleFilter":{"$ref":"#/definitions/LifecycleFilter","description":"Properties specific to the lifecycle insight"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/LifecycleQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]},"series":{"description":"Events and actions to include","items":{"$ref":"#/definitions/AnyEntityNode"},"type":"array"}},"required":["kind","series"],"type":"object"},"LifecycleQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"LifecycleToggle":{"enum":["new","resurrecting","returning","dormant"],"type":"string"},"LogEntryPropertyFilter":{"additionalProperties":false,"properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"log_entry","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"MatchedRecording":{"additionalProperties":false,"properties":{"events":{"items":{"$ref":"#/definitions/MatchedRecordingEvent"},"type":"array"},"session_id":{"type":"string"}},"required":["events"],"type":"object"},"MatchedRecordingEvent":{"additionalProperties":false,"properties":{"uuid":{"type":"string"}},"required":["uuid"],"type":"object"},"MathType":{"anyOf":[{"$ref":"#/definitions/BaseMathType"},{"$ref":"#/definitions/FunnelMathType"},{"$ref":"#/definitions/PropertyMathType"},{"$ref":"#/definitions/CountPerActorMathType"},{"$ref":"#/definitions/GroupMathType"},{"$ref":"#/definitions/HogQLMathType"}]},"MultipleBreakdownOptions":{"additionalProperties":false,"properties":{"values":{"items":{"$ref":"#/definitions/BreakdownItem"},"type":"array"}},"required":["values"],"type":"object"},"MultipleBreakdownType":{"enum":["person","event","group","session","hogql"],"type":"string"},"NodeKind":{"description":"PostHog Query Schema definition.\\n\\nThis file acts as the source of truth for:\\n\\n- frontend/src/queries/schema.json - generated from typescript via \\"pnpm run schema:build:json\\"\\n\\n- posthog/schema.py - generated from json the above json via \\"pnpm run schema:build:python\\"","enum":["EventsNode","ActionsNode","DataWarehouseNode","EventsQuery","PersonsNode","HogQuery","HogQLQuery","HogQLMetadata","HogQLAutocomplete","ActorsQuery","FunnelsActorsQuery","FunnelCorrelationActorsQuery","SessionsTimelineQuery","RecordingsQuery","SessionAttributionExplorerQuery","ErrorTrackingQuery","DataTableNode","DataVisualizationNode","SavedInsightNode","InsightVizNode","TrendsQuery","FunnelsQuery","RetentionQuery","PathsQuery","StickinessQuery","LifecycleQuery","InsightActorsQuery","InsightActorsQueryOptions","FunnelCorrelationQuery","WebOverviewQuery","WebStatsTableQuery","WebExternalClicksTableQuery","WebGoalsQuery","ExperimentFunnelsQuery","ExperimentTrendsQuery","DatabaseSchemaQuery","SuggestedQuestionsQuery","TeamTaxonomyQuery","EventTaxonomyQuery","ActorsPropertyTaxonomyQuery"],"type":"string"},"PathCleaningFilter":{"additionalProperties":false,"properties":{"alias":{"type":"string"},"regex":{"type":"string"}},"type":"object"},"PathType":{"enum":["$pageview","$screen","custom_event","hogql"],"type":"string"},"PathsFilter":{"additionalProperties":false,"properties":{"edgeLimit":{"default":50,"type":"integer"},"endPoint":{"type":"string"},"excludeEvents":{"items":{"type":"string"},"type":"array"},"includeEventTypes":{"items":{"$ref":"#/definitions/PathType"},"type":"array"},"localPathCleaningFilters":{"anyOf":[{"items":{"$ref":"#/definitions/PathCleaningFilter"},"type":"array"},{"type":"null"}]},"maxEdgeWeight":{"type":"integer"},"minEdgeWeight":{"type":"integer"},"pathDropoffKey":{"description":"Relevant only within actors query","type":"string"},"pathEndKey":{"description":"Relevant only within actors query","type":"string"},"pathGroupings":{"items":{"type":"string"},"type":"array"},"pathReplacements":{"type":"boolean"},"pathStartKey":{"description":"Relevant only within actors query","type":"string"},"pathsHogQLExpression":{"type":"string"},"startPoint":{"type":"string"},"stepLimit":{"default":5,"type":"integer"}},"type":"object"},"PathsFilterLegacy":{"additionalProperties":false,"description":"`PathsFilterType` minus everything inherited from `FilterType` and persons modal related params","properties":{"edge_limit":{"type":"integer"},"end_point":{"type":"string"},"exclude_events":{"items":{"type":"string"},"type":"array"},"funnel_filter":{"type":"object"},"funnel_paths":{"$ref":"#/definitions/FunnelPathType"},"include_event_types":{"items":{"$ref":"#/definitions/PathType"},"type":"array"},"local_path_cleaning_filters":{"anyOf":[{"items":{"$ref":"#/definitions/PathCleaningFilter"},"type":"array"},{"type":"null"}]},"max_edge_weight":{"type":"integer"},"min_edge_weight":{"type":"integer"},"path_groupings":{"items":{"type":"string"},"type":"array"},"path_replacements":{"type":"boolean"},"path_type":{"$ref":"#/definitions/PathType"},"paths_hogql_expression":{"type":"string"},"start_point":{"type":"string"},"step_limit":{"type":"integer"}},"type":"object"},"PathsQuery":{"additionalProperties":false,"properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"funnelPathsFilter":{"$ref":"#/definitions/FunnelPathsFilter","description":"Used for displaying paths in relation to funnel steps."},"kind":{"const":"PathsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"pathsFilter":{"$ref":"#/definitions/PathsFilter","description":"Properties specific to the paths insight"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/PathsQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind","pathsFilter"],"type":"object"},"PathsQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"PersonPropertyFilter":{"additionalProperties":false,"description":"Sync with plugin-server/src/types.ts","properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"person","description":"Person properties","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"PersonType":{"additionalProperties":false,"properties":{"created_at":{"type":"string"},"distinct_ids":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"is_identified":{"type":"boolean"},"name":{"type":"string"},"properties":{"type":"object"},"uuid":{"type":"string"}},"required":["distinct_ids","properties"],"type":"object"},"PersonsNode":{"additionalProperties":false,"deprecated":"Use `ActorsQuery` instead.","properties":{"cohort":{"type":"integer"},"distinctId":{"type":"string"},"fixedProperties":{"description":"Fixed properties in the query, can\'t be edited in the interface (e.g. scoping down by person)","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"kind":{"const":"PersonsNode","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"properties":{"description":"Properties configurable in the interface","items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"type":"object"},"search":{"type":"string"}},"required":["kind"],"type":"object"},"PropertyFilterType":{"enum":["meta","event","person","element","feature","session","cohort","recording","log_entry","group","hogql","data_warehouse","data_warehouse_person_property"],"type":"string"},"PropertyFilterValue":{"anyOf":[{"type":"string"},{"type":"number"},{"items":{"type":["string","number"]},"type":"array"},{"type":"null"}]},"PropertyGroupFilter":{"additionalProperties":false,"properties":{"type":{"$ref":"#/definitions/FilterLogicalOperator"},"values":{"items":{"$ref":"#/definitions/PropertyGroupFilterValue"},"type":"array"}},"required":["type","values"],"type":"object"},"PropertyGroupFilterValue":{"additionalProperties":false,"properties":{"type":{"$ref":"#/definitions/FilterLogicalOperator"},"values":{"items":{"anyOf":[{"$ref":"#/definitions/AnyPropertyFilter"},{"$ref":"#/definitions/PropertyGroupFilterValue"}]},"type":"array"}},"required":["type","values"],"type":"object"},"PropertyMathType":{"enum":["avg","sum","min","max","median","p75","p90","p95","p99"],"type":"string"},"PropertyOperator":{"description":"Sync with plugin-server/src/types.ts","enum":["exact","is_not","icontains","not_icontains","regex","not_regex","gt","gte","lt","lte","is_set","is_not_set","is_date_exact","is_date_before","is_date_after","between","not_between","min","max","in","not_in"],"type":"string"},"QueryRequest":{"additionalProperties":false,"properties":{"async":{"deprecated":"Use `refresh` instead.","type":"boolean"},"client_query_id":{"description":"Client provided query ID. Can be used to retrieve the status or cancel the query.","type":"string"},"filters_override":{"$ref":"#/definitions/DashboardFilter"},"query":{"$ref":"#/definitions/QuerySchema","description":"Submit a JSON string representing a query for PostHog data analysis, for example a HogQL query.\\n\\nExample payload:\\n\\n```\\n\\n{\\"query\\": {\\"kind\\": \\"HogQLQuery\\", \\"query\\": \\"select * from events limit 100\\"}}\\n\\n```\\n\\nFor more details on HogQL queries, see the [PostHog HogQL documentation](/docs/hogql#api-access)."},"refresh":{"$ref":"#/definitions/RefreshType","default":"blocking","description":"Whether results should be calculated sync or async, and how much to rely on the cache:\\n- `\'blocking\'` - calculate synchronously (returning only when the query is done), UNLESS there are very fresh results in the cache\\n- `\'async\'` - kick off background calculation (returning immediately with a query status), UNLESS there are very fresh results in the cache\\n- `\'lazy_async\'` - kick off background calculation, UNLESS there are somewhat fresh results in the cache\\n- `\'force_blocking\'` - calculate synchronously, even if fresh results are already cached\\n- `\'force_async\'` - kick off background calculation, even if fresh results are already cached\\n- `\'force_cache\'` - return cached data or a cache miss; always completes immediately as it never calculates Background calculation can be tracked using the `query_status` response field."},"variables_override":{"additionalProperties":{"type":"object"},"type":"object"}},"required":["query"],"type":"object"},"QueryResponseAlternative":{"anyOf":[{"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","results","types"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"missing_actors_count":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","limit","offset","results","types"],"type":"object"},{"additionalProperties":false,"properties":{"breakdown":{"items":{"$ref":"#/definitions/BreakdownItem"},"type":"array"},"breakdowns":{"items":{"$ref":"#/definitions/MultipleBreakdownOptions"},"type":"array"},"compare":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"type":"object"},"type":"array"},"day":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"anyOf":[{"type":"string"},{"$ref":"#/definitions/DatetimeDay"},{"$ref":"#/definitions/Day"}]}},"required":["label","value"],"type":"object"},"type":"array"},"interval":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"description":"An interval selected out of available intervals in source query","type":"integer"}},"required":["label","value"],"type":"object"},"type":"array"},"series":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"integer"}},"required":["label","value"],"type":"object"},"type":"array"},"status":{"items":{"additionalProperties":false,"properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"type":"object"},"type":"array"}},"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/TimelineEntry"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"bytecode":{"items":{},"type":"array"},"coloredBytecode":{"items":{},"type":"array"},"results":{},"stdout":{"type":"string"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"clickhouse":{"description":"Executed ClickHouse query","type":"string"},"columns":{"description":"Returned columns","items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"explain":{"description":"Query explanation output","items":{"type":"string"},"type":"array"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"metadata":{"$ref":"#/definitions/HogQLMetadataResponse","description":"Query metadata output"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query":{"description":"Input query string","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"description":"Types of returned columns","items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"errors":{"items":{"$ref":"#/definitions/HogQLNotice"},"type":"array"},"isValid":{"type":"boolean"},"isValidView":{"type":"boolean"},"notices":{"items":{"$ref":"#/definitions/HogQLNotice"},"type":"array"},"query":{"type":"string"},"table_names":{"items":{"type":"string"},"type":"array"},"warnings":{"items":{"$ref":"#/definitions/HogQLNotice"},"type":"array"}},"required":["errors","warnings","notices"],"type":"object"},{"additionalProperties":false,"properties":{"incomplete_list":{"description":"Whether or not the suggestions returned are complete","type":"boolean"},"suggestions":{"items":{"$ref":"#/definitions/AutocompleteCompletionItem"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["suggestions","incomplete_list"],"type":"object"},{"additionalProperties":false,"properties":{"dateFrom":{"type":"string"},"dateTo":{"type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/WebOverviewItem"},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"type":"string"},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/ErrorTrackingIssue"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"expected_loss":{"type":"number"},"funnels_query":{"$ref":"#/definitions/FunnelsQuery"},"insight":{"items":{"items":{"type":"object"},"type":"array"},"type":"array"},"kind":{"const":"ExperimentFunnelsQuery","type":"string"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantFunnelsBaseStats"},"type":"array"}},"required":["kind","insight","variants","probability","significant","significance_code","expected_loss","credible_intervals"],"type":"object"},{"additionalProperties":false,"properties":{"count_query":{"$ref":"#/definitions/TrendsQuery"},"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"exposure_query":{"$ref":"#/definitions/TrendsQuery"},"insight":{"items":{"type":"object"},"type":"array"},"kind":{"const":"ExperimentTrendsQuery","type":"string"},"p_value":{"type":"number"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantTrendsBaseStats"},"type":"array"}},"required":["kind","insight","variants","probability","significant","significance_code","p_value","credible_intervals"],"type":"object"},{"properties":{},"type":"object"},{"not":{}},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","results","types"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"missing_actors_count":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"items":{},"type":"array"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{"type":"string"},"type":"array"}},"required":["columns","hogql","limit","offset","results","types"],"type":"object"},{"additionalProperties":false,"properties":{"clickhouse":{"description":"Executed ClickHouse query","type":"string"},"columns":{"description":"Returned columns","items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"explain":{"description":"Query explanation output","items":{"type":"string"},"type":"array"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"metadata":{"$ref":"#/definitions/HogQLMetadataResponse","description":"Query metadata output"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query":{"description":"Input query string","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"description":"Types of returned columns","items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"dateFrom":{"type":"string"},"dateTo":{"type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/WebOverviewItem"},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{"type":"string"},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/ErrorTrackingIssue"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"expected_loss":{"type":"number"},"funnels_query":{"$ref":"#/definitions/FunnelsQuery"},"insight":{"items":{"items":{"type":"object"},"type":"array"},"type":"array"},"kind":{"const":"ExperimentFunnelsQuery","type":"string"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantFunnelsBaseStats"},"type":"array"}},"required":["credible_intervals","expected_loss","insight","kind","probability","significance_code","significant","variants"],"type":"object"},{"additionalProperties":false,"properties":{"count_query":{"$ref":"#/definitions/TrendsQuery"},"credible_intervals":{"additionalProperties":{"items":{"type":"number"},"maxItems":2,"minItems":2,"type":"array"},"type":"object"},"exposure_query":{"$ref":"#/definitions/TrendsQuery"},"insight":{"items":{"type":"object"},"type":"array"},"kind":{"const":"ExperimentTrendsQuery","type":"string"},"p_value":{"type":"number"},"probability":{"additionalProperties":{"type":"number"},"type":"object"},"significance_code":{"$ref":"#/definitions/ExperimentSignificanceCode"},"significant":{"type":"boolean"},"stats_version":{"type":"integer"},"variants":{"items":{"$ref":"#/definitions/ExperimentVariantTrendsBaseStats"},"type":"array"}},"required":["credible_intervals","insight","kind","p_value","probability","significance_code","significant","variants"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"description":"Wether more breakdown values are available.","type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"isUdf":{"type":"boolean"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"anyOf":[{"$ref":"#/definitions/FunnelStepsResults"},{"$ref":"#/definitions/FunnelStepsBreakdownResults"},{"$ref":"#/definitions/FunnelTimeToConvertResults"},{"$ref":"#/definitions/FunnelTrendsResults"}]},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/RetentionResult"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/FunnelCorrelationResult"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"tables":{"additionalProperties":{"$ref":"#/definitions/DatabaseSchemaTable"},"type":"object"}},"required":["tables"],"type":"object"},{"additionalProperties":false,"properties":{"questions":{"items":{"type":"string"},"type":"array"}},"required":["questions"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/TeamTaxonomyResponse"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/EventTaxonomyResponse"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/ActorsPropertyTaxonomyResponse"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"}]},"QuerySchema":{"discriminator":{"propertyName":"kind"},"oneOf":[{"$ref":"#/definitions/EventsNode"},{"$ref":"#/definitions/ActionsNode"},{"$ref":"#/definitions/PersonsNode"},{"$ref":"#/definitions/DataWarehouseNode"},{"$ref":"#/definitions/EventsQuery"},{"$ref":"#/definitions/ActorsQuery"},{"$ref":"#/definitions/InsightActorsQuery"},{"$ref":"#/definitions/InsightActorsQueryOptions"},{"$ref":"#/definitions/SessionsTimelineQuery"},{"$ref":"#/definitions/HogQuery"},{"$ref":"#/definitions/HogQLQuery"},{"$ref":"#/definitions/HogQLMetadata"},{"$ref":"#/definitions/HogQLAutocomplete"},{"$ref":"#/definitions/WebOverviewQuery"},{"$ref":"#/definitions/WebStatsTableQuery"},{"$ref":"#/definitions/WebExternalClicksTableQuery"},{"$ref":"#/definitions/WebGoalsQuery"},{"$ref":"#/definitions/SessionAttributionExplorerQuery"},{"$ref":"#/definitions/ErrorTrackingQuery"},{"$ref":"#/definitions/ExperimentFunnelsQuery"},{"$ref":"#/definitions/ExperimentTrendsQuery"},{"$ref":"#/definitions/DataVisualizationNode"},{"$ref":"#/definitions/DataTableNode"},{"$ref":"#/definitions/SavedInsightNode"},{"$ref":"#/definitions/InsightVizNode"},{"$ref":"#/definitions/TrendsQuery"},{"$ref":"#/definitions/FunnelsQuery"},{"$ref":"#/definitions/RetentionQuery"},{"$ref":"#/definitions/PathsQuery"},{"$ref":"#/definitions/StickinessQuery"},{"$ref":"#/definitions/LifecycleQuery"},{"$ref":"#/definitions/FunnelCorrelationQuery"},{"$ref":"#/definitions/DatabaseSchemaQuery"},{"$ref":"#/definitions/SuggestedQuestionsQuery"},{"$ref":"#/definitions/TeamTaxonomyQuery"},{"$ref":"#/definitions/EventTaxonomyQuery"},{"$ref":"#/definitions/ActorsPropertyTaxonomyQuery"}],"required":["kind"],"type":"object"},"QuerySchemaRoot":{"$ref":"#/definitions/QuerySchema"},"QueryStatus":{"additionalProperties":false,"properties":{"complete":{"default":false,"description":"Whether the query is still running. Will be true if the query is complete, even if it errored. Either result or error will be set.","type":"boolean"},"dashboard_id":{"type":"integer"},"end_time":{"description":"When did the query execution task finish (whether successfully or not).","format":"date-time","type":"string"},"error":{"default":false,"description":"If the query failed, this will be set to true. More information can be found in the error_message field.","type":"boolean"},"error_message":{"default":null,"type":["string","null"]},"expiration_time":{"format":"date-time","type":"string"},"id":{"type":"string"},"insight_id":{"type":"integer"},"labels":{"items":{"type":"string"},"type":"array"},"pickup_time":{"description":"When was the query execution task picked up by a worker.","format":"date-time","type":"string"},"query_async":{"const":true,"default":true,"description":"ONLY async queries use QueryStatus.","type":"boolean"},"query_progress":{"$ref":"#/definitions/ClickhouseQueryProgress"},"results":{},"start_time":{"description":"When was query execution task enqueued.","format":"date-time","type":"string"},"task_id":{"type":"string"},"team_id":{"type":"integer"}},"required":["id","query_async","team_id","error","complete","error_message"],"type":"object"},"QueryStatusResponse":{"additionalProperties":false,"properties":{"query_status":{"$ref":"#/definitions/QueryStatus"}},"required":["query_status"],"type":"object"},"QueryTiming":{"additionalProperties":false,"properties":{"k":{"description":"Key. Shortened to \'k\' to save on data.","type":"string"},"t":{"description":"Time in seconds. Shortened to \'t\' to save on data.","type":"number"}},"required":["k","t"],"type":"object"},"ReasoningMessage":{"additionalProperties":false,"properties":{"content":{"type":"string"},"id":{"type":"string"},"substeps":{"items":{"type":"string"},"type":"array"},"type":{"const":"ai/reasoning","type":"string"}},"required":["type","content"],"type":"object"},"RecordingOrder":{"enum":["duration","recording_duration","inactive_seconds","active_seconds","start_time","console_error_count","click_count","keypress_count","mouse_activity_count","activity_score"],"type":"string"},"RecordingPropertyFilter":{"additionalProperties":false,"properties":{"key":{"anyOf":[{"$ref":"#/definitions/DurationType"},{"const":"snapshot_source","type":"string"},{"const":"visited_page","type":"string"}]},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"recording","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"RecordingsQuery":{"additionalProperties":false,"properties":{"actions":{"items":{"type":"object"},"type":"array"},"console_log_filters":{"items":{"$ref":"#/definitions/LogEntryPropertyFilter"},"type":"array"},"date_from":{"default":"-3d","type":["string","null"]},"date_to":{"type":["string","null"]},"events":{"items":{"type":"object"},"type":"array"},"filter_test_accounts":{"type":"boolean"},"having_predicates":{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"kind":{"const":"RecordingsQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"operand":{"$ref":"#/definitions/FilterLogicalOperator","default":"AND"},"order":{"$ref":"#/definitions/RecordingOrder","default":"start_time"},"person_uuid":{"type":"string"},"properties":{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},"response":{"$ref":"#/definitions/RecordingsQueryResponse"},"session_ids":{"items":{"type":"string"},"type":"array"},"user_modified_filters":{"type":"object"}},"required":["kind"],"type":"object"},"RecordingsQueryResponse":{"additionalProperties":false,"properties":{"has_next":{"type":"boolean"},"results":{"items":{"$ref":"#/definitions/SessionRecordingType"},"type":"array"}},"required":["results","has_next"],"type":"object"},"RefreshType":{"anyOf":[{"type":"boolean"},{"const":"async","type":"string"},{"const":"async_except_on_cache_miss","type":"string"},{"const":"blocking","type":"string"},{"const":"force_async","type":"string"},{"const":"force_blocking","type":"string"},{"const":"force_cache","type":"string"},{"const":"lazy_async","type":"string"}]},"ResultCustomization":{"anyOf":[{"$ref":"#/definitions/ResultCustomizationByValue"},{"$ref":"#/definitions/ResultCustomizationByPosition"}]},"ResultCustomizationBase":{"additionalProperties":false,"properties":{"color":{"$ref":"#/definitions/DataColorToken"}},"required":["color"],"type":"object"},"ResultCustomizationBy":{"enum":["value","position"],"type":"string"},"ResultCustomizationByPosition":{"additionalProperties":false,"properties":{"assignmentBy":{"const":"position","type":"string"},"color":{"$ref":"#/definitions/DataColorToken"}},"required":["assignmentBy","color"],"type":"object"},"ResultCustomizationByValue":{"additionalProperties":false,"properties":{"assignmentBy":{"const":"value","type":"string"},"color":{"$ref":"#/definitions/DataColorToken"}},"required":["assignmentBy","color"],"type":"object"},"RetentionEntity":{"additionalProperties":false,"properties":{"custom_name":{"type":"string"},"id":{"type":["string","number"]},"kind":{"$ref":"#/definitions/RetentionEntityKind"},"name":{"type":"string"},"order":{"type":"integer"},"type":{"$ref":"#/definitions/EntityType"},"uuid":{"type":"string"}},"type":"object"},"RetentionEntityKind":{"enum":["ActionsNode","EventsNode"],"type":"string"},"RetentionFilter":{"additionalProperties":false,"properties":{"cumulative":{"type":"boolean"},"period":{"$ref":"#/definitions/RetentionPeriod","default":"Day"},"retentionReference":{"description":"Whether retention is with regard to initial cohort size, or that of the previous period.","enum":["total","previous"],"type":"string"},"retentionType":{"$ref":"#/definitions/RetentionType"},"returningEntity":{"$ref":"#/definitions/RetentionEntity"},"showMean":{"type":"boolean"},"targetEntity":{"$ref":"#/definitions/RetentionEntity"},"totalIntervals":{"default":11,"type":"integer"}},"type":"object"},"RetentionFilterLegacy":{"additionalProperties":false,"description":"`RetentionFilterType` minus everything inherited from `FilterType`","properties":{"cumulative":{"type":"boolean"},"period":{"$ref":"#/definitions/RetentionPeriod"},"retention_reference":{"description":"Whether retention is with regard to initial cohort size, or that of the previous period.","enum":["total","previous"],"type":"string"},"retention_type":{"$ref":"#/definitions/RetentionType"},"returning_entity":{"$ref":"#/definitions/RetentionEntity"},"show_mean":{"type":"boolean"},"target_entity":{"$ref":"#/definitions/RetentionEntity"},"total_intervals":{"type":"integer"}},"type":"object"},"RetentionPeriod":{"enum":["Hour","Day","Week","Month"],"type":"string"},"RetentionQuery":{"additionalProperties":false,"properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"kind":{"const":"RetentionQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/RetentionQueryResponse"},"retentionFilter":{"$ref":"#/definitions/RetentionFilter","description":"Properties specific to the retention insight"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]}},"required":["kind","retentionFilter"],"type":"object"},"RetentionQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/RetentionResult"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"RetentionResult":{"additionalProperties":false,"properties":{"date":{"format":"date-time","type":"string"},"label":{"type":"string"},"values":{"items":{"$ref":"#/definitions/RetentionValue"},"type":"array"}},"required":["values","label","date"],"type":"object"},"RetentionType":{"enum":["retention_recurring","retention_first_time"],"type":"string"},"RetentionValue":{"additionalProperties":false,"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"},"RootAssistantMessage":{"anyOf":[{"$ref":"#/definitions/VisualizationMessage"},{"$ref":"#/definitions/ReasoningMessage"},{"$ref":"#/definitions/AssistantMessage"},{"$ref":"#/definitions/HumanMessage"},{"$ref":"#/definitions/FailureMessage"},{"$ref":"#/definitions/RouterMessage"}]},"RouterMessage":{"additionalProperties":false,"properties":{"content":{"type":"string"},"id":{"type":"string"},"type":{"const":"ai/router","type":"string"}},"required":["type","content"],"type":"object"},"SamplingRate":{"additionalProperties":false,"properties":{"denominator":{"type":"number"},"numerator":{"type":"number"}},"required":["numerator"],"type":"object"},"SavedInsightNode":{"additionalProperties":false,"properties":{"allowSorting":{"description":"Can the user click on column headers to sort the table? (default: true)","type":"boolean"},"embedded":{"description":"Query is embedded inside another bordered component","type":"boolean"},"expandable":{"description":"Can expand row to show raw event data (default: true)","type":"boolean"},"full":{"description":"Show with most visual options enabled. Used in insight scene.","type":"boolean"},"hidePersonsModal":{"type":"boolean"},"kind":{"const":"SavedInsightNode","type":"string"},"propertiesViaUrl":{"description":"Link properties via the URL (default: false)","type":"boolean"},"shortId":{"$ref":"#/definitions/InsightShortId"},"showActions":{"description":"Show the kebab menu at the end of the row","type":"boolean"},"showColumnConfigurator":{"description":"Show a button to configure the table\'s columns if possible","type":"boolean"},"showCorrelationTable":{"type":"boolean"},"showDateRange":{"description":"Show date range selector","type":"boolean"},"showElapsedTime":{"description":"Show the time it takes to run a query","type":"boolean"},"showEventFilter":{"description":"Include an event filter above the table (EventsNode only)","type":"boolean"},"showExport":{"description":"Show the export button","type":"boolean"},"showFilters":{"type":"boolean"},"showHeader":{"type":"boolean"},"showHogQLEditor":{"description":"Include a HogQL query editor above HogQL tables","type":"boolean"},"showLastComputation":{"type":"boolean"},"showLastComputationRefresh":{"type":"boolean"},"showOpenEditorButton":{"description":"Show a button to open the current query as a new insight. (default: true)","type":"boolean"},"showPersistentColumnConfigurator":{"description":"Show a button to configure and persist the table\'s default columns if possible","type":"boolean"},"showPropertyFilter":{"anyOf":[{"type":"boolean"},{"items":{"$ref":"#/definitions/TaxonomicFilterGroupType"},"type":"array"}],"description":"Include a property filter above the table"},"showReload":{"description":"Show a reload button","type":"boolean"},"showResults":{"type":"boolean"},"showResultsTable":{"description":"Show a results table","type":"boolean"},"showSavedQueries":{"description":"Shows a list of saved queries","type":"boolean"},"showSearch":{"description":"Include a free text search field (PersonsNode only)","type":"boolean"},"showTable":{"type":"boolean"},"showTestAccountFilters":{"description":"Show filter to exclude test accounts","type":"boolean"},"showTimings":{"description":"Show a detailed query timing breakdown","type":"boolean"},"suppressSessionAnalysisWarning":{"type":"boolean"},"vizSpecificOptions":{"$ref":"#/definitions/VizSpecificOptions"}},"required":["kind","shortId"],"type":"object"},"SessionAttributionExplorerQuery":{"additionalProperties":false,"properties":{"filters":{"additionalProperties":false,"properties":{"dateRange":{"$ref":"#/definitions/DateRange"},"properties":{"items":{"$ref":"#/definitions/SessionPropertyFilter"},"type":"array"}},"type":"object"},"groupBy":{"items":{"$ref":"#/definitions/SessionAttributionGroupBy"},"type":"array"},"kind":{"const":"SessionAttributionExplorerQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"response":{"$ref":"#/definitions/SessionAttributionExplorerQueryResponse"}},"required":["groupBy","kind"],"type":"object"},"SessionAttributionExplorerQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},"SessionAttributionGroupBy":{"enum":["ChannelType","Medium","Source","Campaign","AdIds","ReferringDomain","InitialURL"],"type":"string"},"SessionPropertyFilter":{"additionalProperties":false,"properties":{"key":{"type":"string"},"label":{"type":"string"},"operator":{"$ref":"#/definitions/PropertyOperator"},"type":{"const":"session","type":"string"},"value":{"$ref":"#/definitions/PropertyFilterValue"}},"required":["key","operator","type"],"type":"object"},"SessionRecordingType":{"additionalProperties":false,"properties":{"active_seconds":{"type":"number"},"activity_score":{"description":"calculated on the backend so that we can sort by it, definition may change over time","type":"number"},"click_count":{"type":"number"},"console_error_count":{"type":"number"},"console_log_count":{"type":"number"},"console_warn_count":{"type":"number"},"distinct_id":{"type":"string"},"email":{"type":"string"},"end_time":{"description":"When the recording ends in ISO format.","type":"string"},"id":{"type":"string"},"inactive_seconds":{"type":"number"},"keypress_count":{"type":"number"},"matching_events":{"description":"List of matching events. *","items":{"$ref":"#/definitions/MatchedRecording"},"type":"array"},"mouse_activity_count":{"description":"count of all mouse activity in the recording, not just clicks","type":"number"},"ongoing":{"description":"whether we have received data for this recording in the last 5 minutes (assumes the recording was loaded from ClickHouse)\\n*","type":"boolean"},"person":{"$ref":"#/definitions/PersonType"},"recording_duration":{"description":"Length of recording in seconds.","type":"number"},"snapshot_source":{"enum":["web","mobile","unknown"],"type":"string"},"start_time":{"description":"When the recording starts in ISO format.","type":"string"},"start_url":{"type":"string"},"storage":{"description":"Where this recording information was loaded from","enum":["object_storage_lts","object_storage"],"type":"string"},"summary":{"type":"string"},"viewed":{"description":"Whether this recording has been viewed already.","type":"boolean"}},"required":["id","viewed","recording_duration","start_time","end_time","snapshot_source"],"type":"object"},"SessionsTimelineQuery":{"additionalProperties":false,"properties":{"after":{"description":"Only fetch sessions that started after this timestamp (default: \'-24h\')","type":"string"},"before":{"description":"Only fetch sessions that started before this timestamp (default: \'+5s\')","type":"string"},"kind":{"const":"SessionsTimelineQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"personId":{"description":"Fetch sessions only for a given person","type":"string"},"response":{"$ref":"#/definitions/SessionsTimelineQueryResponse"}},"required":["kind"],"type":"object"},"SessionsTimelineQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/TimelineEntry"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"StepOrderValue":{"enum":["strict","unordered","ordered"],"type":"string"},"StickinessFilter":{"additionalProperties":false,"properties":{"display":{"$ref":"#/definitions/ChartDisplayType"},"hiddenLegendIndexes":{"items":{"type":"integer"},"type":"array"},"showLegend":{"type":"boolean"},"showValuesOnSeries":{"type":"boolean"},"stickinessCriteria":{"additionalProperties":false,"properties":{"operator":{"$ref":"#/definitions/StickinessOperator"},"value":{"type":"integer"}},"required":["operator","value"],"type":"object"}},"type":"object"},"StickinessFilterLegacy":{"additionalProperties":false,"description":"`StickinessFilterType` minus everything inherited from `FilterType` and persons modal related params","properties":{"compare":{"type":"boolean"},"compare_to":{"type":"string"},"display":{"$ref":"#/definitions/ChartDisplayType"},"hidden_legend_keys":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"not":{}}]},"type":"object"},"show_legend":{"type":"boolean"},"show_values_on_series":{"type":"boolean"}},"type":"object"},"StickinessOperator":{"enum":["gte","lte","exact"],"type":"string"},"StickinessQuery":{"additionalProperties":false,"properties":{"compareFilter":{"$ref":"#/definitions/CompareFilter","description":"Compare to date range"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"interval":{"$ref":"#/definitions/IntervalType","default":"day","description":"Granularity of the response. Can be one of `hour`, `day`, `week` or `month`"},"kind":{"const":"StickinessQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/StickinessQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]},"series":{"description":"Events and actions to include","items":{"$ref":"#/definitions/AnyEntityNode"},"type":"array"},"stickinessFilter":{"$ref":"#/definitions/StickinessFilter","description":"Properties specific to the stickiness insight"}},"required":["kind","series"],"type":"object"},"StickinessQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"SuggestedQuestionsQuery":{"additionalProperties":false,"properties":{"kind":{"const":"SuggestedQuestionsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/SuggestedQuestionsQueryResponse"}},"required":["kind"],"type":"object"},"SuggestedQuestionsQueryResponse":{"additionalProperties":false,"properties":{"questions":{"items":{"type":"string"},"type":"array"}},"required":["questions"],"type":"object"},"TableSettings":{"additionalProperties":false,"properties":{"columns":{"items":{"$ref":"#/definitions/ChartAxis"},"type":"array"},"conditionalFormatting":{"items":{"$ref":"#/definitions/ConditionalFormattingRule"},"type":"array"}},"type":"object"},"TaxonomicFilterGroupType":{"enum":["metadata","actions","cohorts","cohorts_with_all","data_warehouse","data_warehouse_properties","data_warehouse_person_properties","elements","events","event_properties","event_feature_flags","numerical_event_properties","person_properties","pageview_urls","screens","custom_events","wildcard","groups","persons","feature_flags","insights","experiments","plugins","dashboards","name_groups","session_properties","hogql_expression","notebooks","log_entries","replay"],"type":"string"},"TeamTaxonomyItem":{"additionalProperties":false,"properties":{"count":{"type":"integer"},"event":{"type":"string"}},"required":["event","count"],"type":"object"},"TeamTaxonomyQuery":{"additionalProperties":false,"properties":{"kind":{"const":"TeamTaxonomyQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"response":{"$ref":"#/definitions/TeamTaxonomyQueryResponse"}},"required":["kind"],"type":"object"},"TeamTaxonomyQueryResponse":{"additionalProperties":false,"description":"All analytics query responses must inherit from this.","properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"$ref":"#/definitions/TeamTaxonomyResponse"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"TeamTaxonomyResponse":{"items":{"$ref":"#/definitions/TeamTaxonomyItem"},"type":"array"},"TestBasicQueryResponse":{"additionalProperties":false,"deprecated":"Only exported for use in test_query_runner.py! Don\'t use anywhere else.","properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"TestCachedBasicQueryResponse":{"additionalProperties":false,"deprecated":"Only exported for use in test_query_runner.py! Don\'t use anywhere else.","properties":{"cache_key":{"type":"string"},"cache_target_age":{"format":"date-time","type":"string"},"calculation_trigger":{"description":"What triggered the calculation of the query, leave empty if user/immediate","type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"is_cached":{"type":"boolean"},"last_refresh":{"format":"date-time","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"next_allowed_client_refresh":{"format":"date-time","type":"string"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"timezone":{"type":"string"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["cache_key","is_cached","last_refresh","next_allowed_client_refresh","results","timezone"],"type":"object"},"TimelineEntry":{"additionalProperties":false,"properties":{"events":{"items":{"$ref":"#/definitions/EventType"},"type":"array"},"recording_duration_s":{"description":"Duration of the recording in seconds.","type":"number"},"sessionId":{"description":"Session ID. None means out-of-session events","type":"string"}},"required":["events"],"type":"object"},"TrendsAlertConfig":{"additionalProperties":false,"properties":{"check_ongoing_interval":{"type":"boolean"},"series_index":{"type":"integer"},"type":{"const":"TrendsAlertConfig","type":"string"}},"required":["type","series_index"],"type":"object"},"TrendsFilter":{"additionalProperties":false,"properties":{"aggregationAxisFormat":{"$ref":"#/definitions/AggregationAxisFormat","default":"numeric"},"aggregationAxisPostfix":{"type":"string"},"aggregationAxisPrefix":{"type":"string"},"breakdown_histogram_bin_count":{"type":"number"},"decimalPlaces":{"type":"number"},"display":{"$ref":"#/definitions/ChartDisplayType","default":"ActionsLineGraph"},"formula":{"type":"string"},"hiddenLegendIndexes":{"items":{"type":"integer"},"type":"array"},"resultCustomizationBy":{"$ref":"#/definitions/ResultCustomizationBy","default":"value","description":"Wether result datasets are associated by their values or by their order."},"resultCustomizations":{"anyOf":[{"additionalProperties":{"$ref":"#/definitions/ResultCustomizationByValue"},"type":"object"},{"additionalProperties":{"$ref":"#/definitions/ResultCustomizationByPosition"},"propertyNames":{"type":"string"},"type":"object"}],"description":"Customizations for the appearance of result datasets."},"showAlertThresholdLines":{"default":false,"type":"boolean"},"showLabelsOnSeries":{"type":"boolean"},"showLegend":{"default":false,"type":"boolean"},"showPercentStackView":{"default":false,"type":"boolean"},"showValuesOnSeries":{"default":false,"type":"boolean"},"smoothingIntervals":{"default":1,"type":"integer"},"yAxisScaleType":{"enum":["log10","linear"],"type":"string"}},"type":"object"},"TrendsFilterLegacy":{"additionalProperties":false,"description":"`TrendsFilterType` minus everything inherited from `FilterType` and `shown_as`","properties":{"aggregation_axis_format":{"$ref":"#/definitions/AggregationAxisFormat"},"aggregation_axis_postfix":{"type":"string"},"aggregation_axis_prefix":{"type":"string"},"breakdown_histogram_bin_count":{"type":"number"},"compare":{"type":"boolean"},"compare_to":{"type":"string"},"decimal_places":{"type":"number"},"display":{"$ref":"#/definitions/ChartDisplayType"},"formula":{"type":"string"},"hidden_legend_keys":{"additionalProperties":{"anyOf":[{"type":"boolean"},{"not":{}}]},"type":"object"},"show_alert_threshold_lines":{"type":"boolean"},"show_labels_on_series":{"type":"boolean"},"show_legend":{"type":"boolean"},"show_percent_stack_view":{"type":"boolean"},"show_values_on_series":{"type":"boolean"},"smoothing_intervals":{"type":"number"},"y_axis_scale_type":{"enum":["log10","linear"],"type":"string"}},"type":"object"},"TrendsQuery":{"additionalProperties":false,"properties":{"aggregation_group_type_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Groups aggregation"},"breakdownFilter":{"$ref":"#/definitions/BreakdownFilter","description":"Breakdown of the events and actions"},"compareFilter":{"$ref":"#/definitions/CompareFilter","description":"Compare to date range"},"conversionGoal":{"anyOf":[{"$ref":"#/definitions/WebAnalyticsConversionGoal"},{"type":"null"}],"description":"Whether we should be comparing against a specific conversion goal"},"dataColorTheme":{"description":"Colors used in the insight\'s visualization","type":["number","null"]},"dateRange":{"$ref":"#/definitions/DateRange","description":"Date range for the query"},"filterTestAccounts":{"default":false,"description":"Exclude internal and test users by applying the respective filters","type":"boolean"},"interval":{"$ref":"#/definitions/IntervalType","default":"day","description":"Granularity of the response. Can be one of `hour`, `day`, `week` or `month`"},"kind":{"const":"TrendsQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"anyOf":[{"items":{"$ref":"#/definitions/AnyPropertyFilter"},"type":"array"},{"$ref":"#/definitions/PropertyGroupFilter"}],"default":[],"description":"Property filters for all series"},"response":{"$ref":"#/definitions/TrendsQueryResponse"},"samplingFactor":{"description":"Sampling rate","type":["number","null"]},"series":{"description":"Events and actions to include","items":{"$ref":"#/definitions/AnyEntityNode"},"type":"array"},"trendsFilter":{"$ref":"#/definitions/TrendsFilter","description":"Properties specific to the trends insight"}},"required":["kind","series"],"type":"object"},"TrendsQueryResponse":{"additionalProperties":false,"properties":{"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"description":"Wether more breakdown values are available.","type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"type":"object"},"type":"array"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"VisualizationMessage":{"additionalProperties":false,"properties":{"answer":{"anyOf":[{"$ref":"#/definitions/AssistantTrendsQuery"},{"$ref":"#/definitions/AssistantFunnelsQuery"},{"$ref":"#/definitions/AssistantRetentionQuery"}]},"id":{"type":"string"},"initiator":{"type":"string"},"plan":{"type":"string"},"type":{"const":"ai/viz","type":"string"}},"required":["type"],"type":"object"},"VizSpecificOptions":{"additionalProperties":false,"description":"Chart specific rendering options. Use ChartRenderingMetadata for non-serializable values, e.g. onClick handlers","properties":{"ActionsPie":{"additionalProperties":false,"properties":{"disableHoverOffset":{"type":"boolean"},"hideAggregation":{"type":"boolean"}},"type":"object"},"RETENTION":{"additionalProperties":false,"properties":{"hideLineGraph":{"type":"boolean"},"hideSizeColumn":{"type":"boolean"},"useSmallLayout":{"type":"boolean"}},"type":"object"}},"type":"object"},"WebAnalyticsConversionGoal":{"anyOf":[{"$ref":"#/definitions/ActionConversionGoal"},{"$ref":"#/definitions/CustomEventConversionGoal"}]},"WebAnalyticsPropertyFilter":{"anyOf":[{"$ref":"#/definitions/EventPropertyFilter"},{"$ref":"#/definitions/PersonPropertyFilter"},{"$ref":"#/definitions/SessionPropertyFilter"}]},"WebAnalyticsPropertyFilters":{"items":{"$ref":"#/definitions/WebAnalyticsPropertyFilter"},"type":"array"},"WebExternalClicksTableQuery":{"additionalProperties":false,"properties":{"compareFilter":{"$ref":"#/definitions/CompareFilter"},"conversionGoal":{"anyOf":[{"$ref":"#/definitions/WebAnalyticsConversionGoal"},{"type":"null"}]},"dateRange":{"$ref":"#/definitions/DateRange"},"filterTestAccounts":{"type":"boolean"},"kind":{"const":"WebExternalClicksTableQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"$ref":"#/definitions/WebAnalyticsPropertyFilters"},"response":{"$ref":"#/definitions/WebExternalClicksTableQueryResponse"},"sampling":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"forceSamplingRate":{"$ref":"#/definitions/SamplingRate"}},"type":"object"},"stripQueryParams":{"type":"boolean"},"useSessionsTable":{"deprecated":"ignored, always treated as enabled *","type":"boolean"}},"required":["kind","properties"],"type":"object"},"WebExternalClicksTableQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},"WebGoalsQuery":{"additionalProperties":false,"properties":{"compareFilter":{"$ref":"#/definitions/CompareFilter"},"conversionGoal":{"anyOf":[{"$ref":"#/definitions/WebAnalyticsConversionGoal"},{"type":"null"}]},"dateRange":{"$ref":"#/definitions/DateRange"},"filterTestAccounts":{"type":"boolean"},"kind":{"const":"WebGoalsQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"$ref":"#/definitions/WebAnalyticsPropertyFilters"},"response":{"$ref":"#/definitions/WebGoalsQueryResponse"},"sampling":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"forceSamplingRate":{"$ref":"#/definitions/SamplingRate"}},"type":"object"},"useSessionsTable":{"deprecated":"ignored, always treated as enabled *","type":"boolean"}},"required":["kind","properties"],"type":"object"},"WebGoalsQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},"WebOverviewItem":{"additionalProperties":false,"properties":{"changeFromPreviousPct":{"type":"number"},"isIncreaseBad":{"type":"boolean"},"key":{"type":"string"},"kind":{"$ref":"#/definitions/WebOverviewItemKind"},"previous":{"type":"number"},"value":{"type":"number"}},"required":["key","kind"],"type":"object"},"WebOverviewItemKind":{"enum":["unit","duration_s","percentage"],"type":"string"},"WebOverviewQuery":{"additionalProperties":false,"properties":{"compareFilter":{"$ref":"#/definitions/CompareFilter"},"conversionGoal":{"anyOf":[{"$ref":"#/definitions/WebAnalyticsConversionGoal"},{"type":"null"}]},"dateRange":{"$ref":"#/definitions/DateRange"},"filterTestAccounts":{"type":"boolean"},"includeLCPScore":{"type":"boolean"},"kind":{"const":"WebOverviewQuery","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"$ref":"#/definitions/WebAnalyticsPropertyFilters"},"response":{"$ref":"#/definitions/WebOverviewQueryResponse"},"sampling":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"forceSamplingRate":{"$ref":"#/definitions/SamplingRate"}},"type":"object"},"useSessionsTable":{"deprecated":"ignored, always treated as enabled *","type":"boolean"}},"required":["kind","properties"],"type":"object"},"WebOverviewQueryResponse":{"additionalProperties":false,"properties":{"dateFrom":{"type":"string"},"dateTo":{"type":"string"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hogql":{"description":"Generated HogQL query.","type":"string"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{"$ref":"#/definitions/WebOverviewItem"},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"}},"required":["results"],"type":"object"},"WebStatsBreakdown":{"enum":["Page","InitialPage","ExitPage","ExitClick","ScreenName","InitialChannelType","InitialReferringDomain","InitialUTMSource","InitialUTMCampaign","InitialUTMMedium","InitialUTMTerm","InitialUTMContent","InitialUTMSourceMediumCampaign","Browser","OS","Viewport","DeviceType","Country","Region","City","Timezone","Language"],"type":"string"},"WebStatsTableQuery":{"additionalProperties":false,"properties":{"breakdownBy":{"$ref":"#/definitions/WebStatsBreakdown"},"compareFilter":{"$ref":"#/definitions/CompareFilter"},"conversionGoal":{"anyOf":[{"$ref":"#/definitions/WebAnalyticsConversionGoal"},{"type":"null"}]},"dateRange":{"$ref":"#/definitions/DateRange"},"doPathCleaning":{"type":"boolean"},"filterTestAccounts":{"type":"boolean"},"includeBounceRate":{"type":"boolean"},"includeScrollDepth":{"type":"boolean"},"kind":{"const":"WebStatsTableQuery","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"properties":{"$ref":"#/definitions/WebAnalyticsPropertyFilters"},"response":{"$ref":"#/definitions/WebStatsTableQueryResponse"},"sampling":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"forceSamplingRate":{"$ref":"#/definitions/SamplingRate"}},"type":"object"},"useSessionsTable":{"deprecated":"ignored, always treated as enabled *","type":"boolean"}},"required":["breakdownBy","kind","properties"],"type":"object"},"WebStatsTableQueryResponse":{"additionalProperties":false,"properties":{"columns":{"items":{},"type":"array"},"error":{"description":"Query error. Returned only if \'explain\' or `modifiers.debug` is true. Throws an error otherwise.","type":"string"},"hasMore":{"type":"boolean"},"hogql":{"description":"Generated HogQL query.","type":"string"},"limit":{"type":"integer"},"modifiers":{"$ref":"#/definitions/HogQLQueryModifiers","description":"Modifiers used when performing the query"},"offset":{"type":"integer"},"query_status":{"$ref":"#/definitions/QueryStatus","description":"Query status indicates whether next to the provided data, a query is still running."},"results":{"items":{},"type":"array"},"samplingRate":{"$ref":"#/definitions/SamplingRate"},"timings":{"description":"Measured timings for different parts of the query generation process","items":{"$ref":"#/definitions/QueryTiming"},"type":"array"},"types":{"items":{},"type":"array"}},"required":["results"],"type":"object"},"YAxisSettings":{"additionalProperties":false,"properties":{"scale":{"enum":["linear","logarithmic"],"type":"string"},"startAtZero":{"description":"Whether the Y axis should start at zero","type":"boolean"}},"type":"object"},"numerical_key":{"type":"string"}}}')}},__webpack_require__=>{var __webpack_exec__=moduleId=>__webpack_require__(__webpack_require__.s=moduleId);__webpack_require__.O(0,[97192],()=>__webpack_exec__("./storybook-config-entry.js")),__webpack_require__.O()}]); -//# sourceMappingURL=main.237ccbc7.iframe.bundle.js.map \ No newline at end of file +//# sourceMappingURL=main.e36073f9.iframe.bundle.js.map \ No newline at end of file diff --git a/docs/main.e36073f9.iframe.bundle.js.map b/docs/main.e36073f9.iframe.bundle.js.map new file mode 100644 index 000000000..9d6462b36 --- /dev/null +++ b/docs/main.e36073f9.iframe.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.e36073f9.iframe.bundle.js","mappings":";;;;;AAyBA;ACqKA;;;;;;;ACiCA;AC7LA;AAAA;AAKA;;;ACVA;;;AAsBA;;AAEA;;ACYA;ACrCA;AAUA;AAOA;AAkDA;;AAuXA;AAAA;AAAA;AAAA;AAlZA;AAaA;AAOA;;;;;;;ACWA;;AC5EA;;;;;;;;;;;ACmPA;;;;;AAeA;;;AAcA;;;;;;;AAyDA;AC9QA;ACqhBA;AACA;AC9fA;AASA;;;AAWA;AC1GA;;;AAoBA;;;AAIA;AAKA;AACA;AAGA;;AAIA;;AAEA;AAGA;AACA;AAGA;AAGA;;AAEA;;AAWA;AACA;AACA;;;;;AAiCA;;;AAIA;AAKA;;;AAGA;AACA;AAGA;AACA;AACA;;AAWA;AACA;AACA;;;AAwBA;;;AAIA;;AAMA;;AAEA;;AAEA;;AAGA;AACA;AACA;;AAUA;AACA;AACA;;;AAwBA;;;AAIA;AAKA;;AAEA;AACA;AAGA;AACA;AACA;;AAUA;AACA;AACA;;;AA6BA;;;AAIA;AAKA;;AAEA;AACA;AAGA;AACA;AACA;;AAUA;AACA;AACA;;;AA8BA;;;AAyBA;;AAuBA;;;;AAyBA;;;;;;;AAOA;;;;AAIA;AACA;AAkBA;;;AAGA;;AAEA;;;AAGA;AAUA;;;AASA;AACA;;AAEA;;;AA6BA;;AAMA;;AAWA;;AAEA;;;;;;AAMA;;AAEA;;;;AAaA;;;;;;;;;;;;;AAaA;ACxeA;;;;;;;;;;;ACyLA;;;;;;;;;;;;;;;;;;;AC8nCA;;;;;;AC5sBA;AACA;AACA;AACA;;;;;;;;;;;ACjoBA;AACA;;;;;AAKA;AACA;AACA;;;ACFA;AC0EA;;;;;ACoJA;AACA;AACA;;;;AAIA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;;AAuCA;;;;AAIA;AACA;AACA;AACA;;AAEA;;;AA0CA;;;;AAIA;AACA;AACA;;AAEA;;AAuEA;;;;AAIA;AACA;AACA;;AAEA;;;AAkCA;;;AAGA;AACA;AACA;;;AAGA;;;;AA+CA;AACA;AACA;AACA;;AAEA","sources":["webpack://posthog/./frontend/src/lib/components/ReverseProxyChecker/reverseProxyCheckerLogic.ts","webpack://posthog/./frontend/src/lib/components/Alerts/views/EditAlertModal.tsx","webpack://posthog/./frontend/src/lib/components/AuthorizedUrlList/authorizedUrlListLogic.ts","webpack://posthog/./frontend/src/lib/components/JSSnippet.tsx","webpack://posthog/./frontend/src/lib/components/Metalytics/metalyticsLogic.ts","webpack://posthog/./frontend/src/lib/components/Support/SupportForm.tsx","webpack://posthog/./frontend/src/lib/components/Support/supportLogic.ts","webpack://posthog/./frontend/src/lib/components/VersionChecker/versionCheckerLogic.ts","webpack://posthog/./frontend/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown.tsx","webpack://posthog/./frontend/src/queries/examples.ts","webpack://posthog/./frontend/src/scenes/paths/renderPaths.ts","webpack://posthog/./frontend/src/scenes/billing/billingLogic.tsx","webpack://posthog/./frontend/src/scenes/early-access-features/InstructionsModal.tsx","webpack://posthog/./frontend/src/scenes/feature-flags/FeatureFlagSnippets.tsx","webpack://posthog/./frontend/src/scenes/notebooks/Nodes/NotebookNodeReplayTimestamp.tsx","webpack://posthog/./frontend/src/scenes/notebooks/Notebook/SlashCommands.tsx","webpack://posthog/./ee/frontend/mobile-replay/transformer/transformers.ts","webpack://posthog/./frontend/src/scenes/session-recordings/player/sessionRecordingDataLogic.ts","webpack://posthog/./frontend/src/scenes/session-recordings/playlist/sessionRecordingsListPropertiesLogic.ts","webpack://posthog/./frontend/src/scenes/settings/organization/VerifiedDomains/ConfigureSAMLModal.tsx","webpack://posthog/./frontend/src/scenes/settings/environment/ManagedReverseProxy.tsx","webpack://posthog/./frontend/src/scenes/surveys/surveyLogic.tsx"],"sourcesContent":["import { afterMount, kea, path, reducers } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport api from 'lib/api'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\n\nimport type { reverseProxyCheckerLogicType } from './reverseProxyCheckerLogicType'\n\nconst CHECK_INTERVAL_MS = 1000 * 60 * 60 // 1 hour\n\nexport const reverseProxyCheckerLogic = kea([\n path(['components', 'ReverseProxyChecker', 'reverseProxyCheckerLogic']),\n loaders({\n hasReverseProxy: [\n false as boolean | null,\n {\n loadHasReverseProxy: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT properties.$lib_custom_api_host AS lib_custom_api_host\n FROM events\n WHERE timestamp >= now() - INTERVAL 1 DAY \n AND timestamp <= now()\n ORDER BY timestamp DESC\n limit 10`,\n }\n\n const res = await api.query(query)\n return !!res.results?.find((x) => !!x[0])\n },\n },\n ],\n }),\n reducers({\n lastCheckedTimestamp: [\n 0,\n { persist: true },\n {\n loadHasReverseProxySuccess: () => Date.now(),\n },\n ],\n }),\n afterMount(({ actions, values }) => {\n if (values.lastCheckedTimestamp < Date.now() - CHECK_INTERVAL_MS) {\n actions.loadHasReverseProxy()\n }\n }),\n])\n","import { IconInfo } from '@posthog/icons'\nimport {\n LemonBanner,\n LemonCheckbox,\n LemonInput,\n LemonSegmentedButton,\n LemonSelect,\n SpinnerOverlay,\n Tooltip,\n} from '@posthog/lemon-ui'\nimport { useActions, useValues } from 'kea'\nimport { Form, Group } from 'kea-forms'\nimport { AlertStateIndicator } from 'lib/components/Alerts/views/ManageAlertsModal'\nimport { MemberSelectMultiple } from 'lib/components/MemberSelectMultiple'\nimport { TZLabel } from 'lib/components/TZLabel'\nimport { UserActivityIndicator } from 'lib/components/UserActivityIndicator/UserActivityIndicator'\nimport { dayjs } from 'lib/dayjs'\nimport { IconChevronLeft } from 'lib/lemon-ui/icons'\nimport { LemonButton } from 'lib/lemon-ui/LemonButton'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonModal } from 'lib/lemon-ui/LemonModal'\nimport { alphabet, formatDate } from 'lib/utils'\nimport { useCallback } from 'react'\nimport { trendsDataLogic } from 'scenes/trends/trendsDataLogic'\n\nimport { AlertCalculationInterval, AlertConditionType, AlertState, InsightThresholdType } from '~/queries/schema'\nimport { InsightShortId, QueryBasedInsightModel } from '~/types'\n\nimport { alertFormLogic, canCheckOngoingInterval } from '../alertFormLogic'\nimport { alertLogic } from '../alertLogic'\nimport { SnoozeButton } from '../SnoozeButton'\nimport { AlertType } from '../types'\n\nexport function AlertStateTable({ alert }: { alert: AlertType }): JSX.Element | null {\n if (!alert.checks || alert.checks.length === 0) {\n return null\n }\n\n return (\n
\n
\n

Current status:

\n \n

\n {alert.snoozed_until && ` until ${formatDate(dayjs(alert?.snoozed_until), 'MMM D, HH:mm')}`}\n

\n
\n \n \n \n \n \n \n \n \n \n \n {alert.checks.map((check) => (\n \n \n \n \n \n \n ))}\n \n
StatusTimeValueTargets notified
{check.state}\n \n {check.calculated_value}{check.targets_notified ? 'Yes' : 'No'}
\n
\n )\n}\n\ninterface EditAlertModalProps {\n isOpen: boolean | undefined\n alertId?: AlertType['id']\n insightId: QueryBasedInsightModel['id']\n insightShortId: InsightShortId\n onEditSuccess: () => void\n onClose?: () => void\n}\n\nexport function EditAlertModal({\n isOpen,\n alertId,\n insightId,\n insightShortId,\n onClose,\n onEditSuccess,\n}: EditAlertModalProps): JSX.Element {\n const _alertLogic = alertLogic({ alertId })\n const { alert, alertLoading } = useValues(_alertLogic)\n const { loadAlert } = useActions(_alertLogic)\n\n // need to reload edited alert as well\n const _onEditSuccess = useCallback(() => {\n loadAlert()\n onEditSuccess()\n }, [loadAlert, onEditSuccess])\n\n const formLogicProps = { alert, insightId, onEditSuccess: _onEditSuccess }\n const formLogic = alertFormLogic(formLogicProps)\n const { alertForm, isAlertFormSubmitting, alertFormChanged } = useValues(formLogic)\n const { deleteAlert, snoozeAlert, clearSnooze } = useActions(formLogic)\n const { setAlertFormValue } = useActions(formLogic)\n\n const trendsLogic = trendsDataLogic({ dashboardItemId: insightShortId })\n const { alertSeries, isNonTimeSeriesDisplay, isBreakdownValid, formula } = useValues(trendsLogic)\n\n const creatingNewAlert = alertForm.id === undefined\n // can only check ongoing interval for absolute value/increase alerts with upper threshold\n const can_check_ongoing_interval = canCheckOngoingInterval(alertForm)\n\n return (\n \n {alertLoading ? (\n \n ) : (\n \n \n
\n } onClick={onClose} size=\"xsmall\" />\n\n

{creatingNewAlert ? 'New' : 'Edit '} Alert

\n
\n
\n\n \n
\n
\n
\n \n \n \n \n \n \n
\n {alert?.created_by ? (\n \n ) : null}\n
\n\n
\n

Definition

\n
\n {isBreakdownValid && (\n \n For trends with breakdown, the alert will fire if any of the breakdown\n values breaches the threshold.\n \n )}\n
\n
When
\n \n \n ({\n label: isBreakdownValid\n ? 'any breakdown value'\n : formula\n ? `Formula (${formula})`\n : `${alphabet[index]} - ${\n custom_name ?? name ?? event\n }`,\n value: isBreakdownValid || formula ? 0 : index,\n })\n )}\n disabledReason={\n (isBreakdownValid &&\n `For trends with breakdown, the alert will fire if any of the breakdown\n values breaches the threshold.`) ||\n (formula &&\n `When using formula mode, can only alert on formula value`)\n }\n />\n \n \n \n \n \n \n \n
\n
\n
less than
\n \n \n setAlertFormValue('threshold', {\n configuration: {\n type: alertForm.threshold.configuration.type,\n bounds: {\n ...alertForm.threshold.configuration.bounds,\n lower:\n value &&\n alertForm.threshold.configuration.type ===\n InsightThresholdType.PERCENTAGE\n ? value / 100\n : value,\n },\n },\n })\n }\n />\n \n
or more than
\n \n \n setAlertFormValue('threshold', {\n configuration: {\n type: alertForm.threshold.configuration.type,\n bounds: {\n ...alertForm.threshold.configuration.bounds,\n upper:\n value &&\n alertForm.threshold.configuration.type ===\n InsightThresholdType.PERCENTAGE\n ? value / 100\n : value,\n },\n },\n })\n }\n />\n \n {alertForm.condition.type !== AlertConditionType.ABSOLUTE_VALUE && (\n \n \n \n \n \n )}\n
\n
\n
\n {alertForm.condition.type === AlertConditionType.ABSOLUTE_VALUE\n ? 'check'\n : 'compare'}\n
\n \n ({\n label: interval,\n value: interval,\n }))}\n />\n \n
and notify
\n
\n u.id) ?? []}\n idKey=\"id\"\n onChange={(value) => setAlertFormValue('subscribed_users', value)}\n />\n
\n
\n
\n
\n\n
\n

Advanced

\n \n
\n \n \n \n \n \n \n
\n
\n \n \n \n
\n
\n\n {alert && }\n
\n\n \n
\n
\n {!creatingNewAlert ? (\n \n Delete alert\n \n ) : null}\n {!creatingNewAlert && alert?.state === AlertState.FIRING ? (\n \n ) : null}\n {!creatingNewAlert && alert?.state === AlertState.SNOOZED ? (\n \n Clear snooze\n \n ) : null}\n
\n
\n \n {creatingNewAlert ? 'Create alert' : 'Save'}\n
\n \n \n )}\n \n )\n}\n","import Fuse from 'fuse.js'\nimport {\n actions,\n afterMount,\n connect,\n kea,\n key,\n listeners,\n path,\n props,\n reducers,\n selectors,\n sharedListeners,\n} from 'kea'\nimport { forms } from 'kea-forms'\nimport { loaders } from 'kea-loaders'\nimport { encodeParams, urlToAction } from 'kea-router'\nimport { subscriptions } from 'kea-subscriptions'\nimport api from 'lib/api'\nimport { isDomain, isURL } from 'lib/utils'\nimport { apiHostOrigin } from 'lib/utils/apiHost'\nimport { teamLogic } from 'scenes/teamLogic'\nimport { urls } from 'scenes/urls'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport { ExperimentIdType, ToolbarParams, ToolbarUserIntent } from '~/types'\n\nimport type { authorizedUrlListLogicType } from './authorizedUrlListLogicType'\n\nexport interface ProposeNewUrlFormType {\n url: string\n}\n\nexport enum AuthorizedUrlListType {\n TOOLBAR_URLS = 'TOOLBAR_URLS',\n RECORDING_DOMAINS = 'RECORDING_DOMAINS',\n WEB_EXPERIMENTS = 'WEB_EXPERIMENTS',\n}\n\n/**\n * Firefox does not allow you construct a new URL with e.g. https://*.example.com (which is to be fair more standards compliant than Chrome)\n * when used to probe for e.g. for authorized urls we only care if the proposed URL has a path so we can safely replace the wildcard with a character\n * NB this changes its input and shouldn't be used for general purpose URL parsing\n */\nexport function sanitizePossibleWildCardedURL(url: string): URL {\n const deWildCardedURL = url.replace(/\\*/g, 'x')\n return new URL(deWildCardedURL)\n}\n\n/**\n * Checks if the URL has a wildcard (*) in the port position e.g. http://localhost:*\n */\nexport function hasPortWildcard(input: unknown): boolean {\n if (!input || typeof input !== 'string') {\n return false\n }\n // This regex matches URLs with a wildcard (*) in the port position\n const portWildcardRegex = /^(https?:\\/\\/[^:/]+):\\*(.*)$/\n return portWildcardRegex.test(input.trim())\n}\n\nexport const validateProposedUrl = (\n proposedUrl: string,\n currentUrls: string[],\n onlyAllowDomains: boolean = false\n): string | undefined => {\n if (!isURL(proposedUrl)) {\n return 'Please enter a valid URL'\n }\n\n if (hasPortWildcard(proposedUrl)) {\n return 'Wildcards are not allowed in the port position'\n }\n\n if (onlyAllowDomains && !isDomain(sanitizePossibleWildCardedURL(proposedUrl))) {\n return \"Please enter a valid domain (URLs with a path aren't allowed)\"\n }\n\n if (proposedUrl.indexOf('*') > -1 && !proposedUrl.match(/^(.*)\\*[^*]*\\.[^*]+\\.[^*]+$/)) {\n return 'Wildcards can only be used for subdomains'\n }\n\n if (currentUrls.indexOf(proposedUrl) > -1) {\n return `This ${onlyAllowDomains ? 'domains' : 'URL'} already is registered`\n }\n\n return\n}\n\n/** defaultIntent: whether to launch with empty intent (i.e. toolbar mode is default) */\nexport function appEditorUrl(\n appUrl: string,\n options?: { actionId?: number | null; experimentId?: ExperimentIdType; userIntent?: ToolbarUserIntent }\n): string {\n // See https://github.com/PostHog/posthog-js/blob/f7119c/src/extensions/toolbar.ts#L52 for where these params\n // are passed. `appUrl` is an extra `redirect_to_site` param.\n const params: ToolbarParams & { appUrl: string } = {\n userIntent:\n options?.userIntent ??\n (options?.actionId ? 'edit-action' : options?.experimentId ? 'edit-experiment' : 'add-action'),\n // Make sure to pass the app url, otherwise the api_host will be used by\n // the toolbar, which isn't correct when used behind a reverse proxy as\n // we require e.g. SSO login to the app, which will not work when placed\n // behind a proxy unless we register each domain with the OAuth2 client.\n apiURL: apiHostOrigin(),\n appUrl,\n ...(options?.actionId ? { actionId: options.actionId } : {}),\n ...(options?.experimentId ? { experimentId: options.experimentId } : {}),\n }\n return '/api/user/redirect_to_site/' + encodeParams(params, '?')\n}\n\nexport const checkUrlIsAuthorized = (url: string | URL, authorizedUrls: string[]): boolean => {\n try {\n const parsedUrl = typeof url === 'string' ? sanitizePossibleWildCardedURL(url) : url\n const urlWithoutPath = parsedUrl.protocol + '//' + parsedUrl.host\n // Is this domain already in the list of urls?\n const exactMatch =\n authorizedUrls.filter((authorizedUrl) => authorizedUrl.indexOf(urlWithoutPath) > -1).length > 0\n\n if (exactMatch) {\n return true\n }\n\n const wildcardMatch = !!authorizedUrls.find((authorizedUrl) => {\n // Matches something like `https://*.example.com` against the urlWithoutPath\n const regex = new RegExp(authorizedUrl.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*'))\n return urlWithoutPath.match(regex)\n })\n\n if (wildcardMatch) {\n return true\n }\n } catch (error) {\n // Ignore invalid URLs\n }\n\n return false\n}\n\nexport interface SuggestedDomain {\n url: string\n count: number\n}\n\nexport const filterNotAuthorizedUrls = (\n suggestions: SuggestedDomain[],\n authorizedUrls: string[]\n): SuggestedDomain[] => {\n const suggestedDomains: SuggestedDomain[] = []\n\n suggestions.forEach(({ url, count }) => {\n const parsedUrl = sanitizePossibleWildCardedURL(url)\n const urlWithoutPath = parsedUrl.protocol + '//' + parsedUrl.host\n // Have we already added this domain?\n if (suggestedDomains.some((sd) => sd.url === urlWithoutPath)) {\n return\n }\n\n if (!checkUrlIsAuthorized(parsedUrl, authorizedUrls)) {\n suggestedDomains.push({ url: urlWithoutPath, count })\n }\n })\n\n return suggestedDomains\n}\n\nexport const NEW_URL = 'https://'\n\nexport interface KeyedAppUrl {\n url: string\n type: 'authorized' | 'suggestion'\n originalIndex: number\n // how many seen in the last three days\n count?: number\n}\n\nexport interface AuthorizedUrlListLogicProps {\n actionId: number | null\n experimentId: ExperimentIdType | null\n type: AuthorizedUrlListType\n query: string | null | undefined\n}\n\nexport const defaultAuthorizedUrlProperties = {\n actionId: null,\n experimentId: null,\n query: null,\n}\n\nexport const authorizedUrlListLogic = kea([\n path((key) => ['lib', 'components', 'AuthorizedUrlList', 'authorizedUrlListLogic', key]),\n key((props) => (props.experimentId ? `${props.type}-${props.experimentId}` : `${props.type}-${props.actionId}`)),\n props({} as AuthorizedUrlListLogicProps),\n connect({\n values: [teamLogic, ['currentTeam', 'currentTeamId']],\n actions: [teamLogic, ['updateCurrentTeam']],\n }),\n actions(() => ({\n setAuthorizedUrls: (authorizedUrls: string[]) => ({ authorizedUrls }),\n addUrl: (url: string, launch?: boolean) => ({ url, launch }),\n newUrl: true,\n removeUrl: (index: number) => ({ index }),\n updateUrl: (index: number, url: string) => ({ index, url }),\n launchAtUrl: (url: string) => ({ url }),\n setSearchTerm: (term: string) => ({ term }),\n setEditUrlIndex: (originalIndex: number | null) => ({ originalIndex }),\n cancelProposingUrl: true,\n })),\n loaders(({ values }) => ({\n suggestions: {\n __default: [] as SuggestedDomain[],\n loadSuggestions: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`select properties.$current_url, count()\n from events\n where event = '$pageview'\n and timestamp >= now() - interval 3 day \n and timestamp <= now()\n group by properties.$current_url\n order by count() desc\n limit 25`,\n }\n\n const response = await api.query(query)\n const result = response.results as [string, number][]\n\n if (result && result.length === 0) {\n return []\n }\n\n const suggestedDomains = filterNotAuthorizedUrls(\n result.map(([url, count]) => ({ url, count })),\n values.authorizedUrls\n )\n\n return suggestedDomains.slice(0, 20)\n },\n },\n })),\n subscriptions(({ props, actions }) => ({\n currentTeam: (currentTeam) => {\n actions.setAuthorizedUrls(\n (props.type === AuthorizedUrlListType.RECORDING_DOMAINS\n ? currentTeam.recording_domains\n : currentTeam.app_urls) || []\n )\n },\n })),\n afterMount(({ actions }) => {\n actions.loadSuggestions()\n }),\n forms(({ values, actions }) => ({\n proposedUrl: {\n defaults: { url: '' } as ProposeNewUrlFormType,\n errors: ({ url }) => ({\n url: validateProposedUrl(url, values.authorizedUrls, values.onlyAllowDomains),\n }),\n submit: async ({ url }) => {\n if (values.editUrlIndex !== null && values.editUrlIndex >= 0) {\n actions.updateUrl(values.editUrlIndex, url)\n } else {\n actions.addUrl(url)\n }\n },\n },\n })),\n reducers(() => ({\n showProposedURLForm: [\n false as boolean,\n {\n newUrl: () => true,\n submitProposedUrlSuccess: () => false,\n cancelProposingUrl: () => false,\n },\n ],\n authorizedUrls: [\n [] as string[],\n {\n setAuthorizedUrls: (_, { authorizedUrls }) => authorizedUrls,\n addUrl: (state, { url }) => (!state.includes(url) ? state.concat([url]) : state),\n updateUrl: (state, { index, url }) => Object.assign([...state], { [index]: url }),\n removeUrl: (state, { index }) => {\n const newUrls = [...state]\n newUrls.splice(index, 1)\n return newUrls\n },\n },\n ],\n suggestions: [\n [],\n {\n addUrl: (state, { url }) => [...state].filter((sd) => url !== sd.url),\n },\n ],\n searchTerm: [\n '',\n {\n setSearchTerm: (_, { term }) => term,\n },\n ],\n editUrlIndex: [\n null as number | null,\n {\n setEditUrlIndex: (_, { originalIndex }) => originalIndex,\n removeUrl: (editUrlIndex, { index }) =>\n editUrlIndex && index < editUrlIndex\n ? editUrlIndex - 1\n : index === editUrlIndex\n ? null\n : editUrlIndex,\n newUrl: () => -1,\n updateUrl: () => null,\n addUrl: () => null,\n cancelProposingUrl: () => null,\n },\n ],\n })),\n sharedListeners(({ values, props }) => ({\n saveUrls: async () => {\n if (props.type === AuthorizedUrlListType.RECORDING_DOMAINS) {\n await teamLogic.asyncActions.updateCurrentTeam({ recording_domains: values.authorizedUrls })\n } else {\n await teamLogic.asyncActions.updateCurrentTeam({ app_urls: values.authorizedUrls })\n }\n },\n })),\n listeners(({ sharedListeners, values, actions }) => ({\n setEditUrlIndex: () => {\n actions.setProposedUrlValue('url', values.urlToEdit)\n },\n newUrl: () => {\n actions.setProposedUrlValue('url', NEW_URL)\n },\n addUrl: [\n sharedListeners.saveUrls,\n ({ url, launch }) => {\n if (launch) {\n actions.launchAtUrl(url)\n }\n },\n ],\n removeUrl: sharedListeners.saveUrls,\n updateUrl: sharedListeners.saveUrls,\n launchAtUrl: ({ url }) => {\n window.location.href = values.launchUrl(url)\n },\n cancelProposingUrl: () => {\n actions.resetProposedUrl()\n },\n submitProposedUrlSuccess: () => {\n actions.setEditUrlIndex(null)\n actions.resetProposedUrl()\n },\n })),\n selectors({\n urlToEdit: [\n (s) => [s.authorizedUrls, s.editUrlIndex],\n (authorizedUrls, editUrlIndex) => {\n if (editUrlIndex === null || editUrlIndex === -1) {\n return NEW_URL\n }\n return authorizedUrls[editUrlIndex]\n },\n ],\n urlsKeyed: [\n (s) => [s.authorizedUrls, s.suggestions, s.searchTerm],\n (authorizedUrls, suggestions, searchTerm): KeyedAppUrl[] => {\n const keyedUrls = authorizedUrls\n .map((url, index) => ({\n url,\n type: 'authorized',\n originalIndex: index,\n }))\n .concat(\n suggestions.map(({ url, count }, index) => ({\n url,\n type: 'suggestion',\n originalIndex: index,\n count,\n }))\n ) as KeyedAppUrl[]\n\n if (!searchTerm) {\n return keyedUrls\n }\n\n return new Fuse(keyedUrls, {\n keys: ['url'],\n threshold: 0.3,\n })\n .search(searchTerm)\n .map((result) => result.item)\n },\n ],\n launchUrl: [\n (_, p) => [p.actionId, p.experimentId],\n (actionId, experimentId) => (url: string) => {\n if (experimentId) {\n return appEditorUrl(url, {\n experimentId,\n })\n }\n\n return appEditorUrl(url, {\n actionId,\n })\n },\n ],\n isAddUrlFormVisible: [(s) => [s.editUrlIndex], (editUrlIndex) => editUrlIndex === -1],\n onlyAllowDomains: [(_, p) => [p.type], (type) => type === AuthorizedUrlListType.RECORDING_DOMAINS],\n\n checkUrlIsAuthorized: [\n (s) => [s.authorizedUrls],\n (authorizedUrls) => (url: string) => {\n return checkUrlIsAuthorized(url, authorizedUrls)\n },\n ],\n }),\n urlToAction(({ actions }) => ({\n [urls.toolbarLaunch()]: (_, searchParams) => {\n if (searchParams.addNew) {\n actions.newUrl()\n }\n },\n })),\n])\n","import { useValues } from 'kea'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport { FEATURE_FLAGS } from 'lib/constants'\nimport { featureFlagLogic } from 'lib/logic/featureFlagLogic'\nimport { apiHostOrigin } from 'lib/utils/apiHost'\nimport posthog from 'posthog-js'\nimport { teamLogic } from 'scenes/teamLogic'\n\nfunction snippetFunctions(arrayJs = '/static/array.js'): string {\n const methods: string[] = []\n const posthogPrototype = Object.getPrototypeOf(posthog)\n for (const key of Object.getOwnPropertyNames(posthogPrototype)) {\n if (\n typeof posthogPrototype[key] === 'function' &&\n !key.startsWith('_') &&\n !['constructor', 'toString', 'push'].includes(key)\n ) {\n methods.push(key)\n }\n }\n const snippetMethods = methods.join(' ')\n\n return `!function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(\".\");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(\"script\")).type=\"text/javascript\",p.crossOrigin=\"anonymous\",p.async=!0,p.src=s.api_host.replace(\".i.posthog.com\",\"-assets.i.posthog.com\")+\"${arrayJs}\",(r=t.getElementsByTagName(\"script\")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=\"posthog\",u.people=u.people||[],u.toString=function(t){var e=\"posthog\";return\"posthog\"!==a&&(e+=\".\"+a),t||(e+=\" (stub)\"),e},u.people.toString=function(){return u.toString(1)+\".people (stub)\"},o=\"${snippetMethods}\".split(\" \"),n=0;n',\n ` ${snippetFunctions(arrayJs)}`,\n ` posthog.init('${currentTeam?.api_token}', {\n api_host:'${apiHostOrigin()}'${\n isPersonProfilesDisabled\n ? ``\n : `,\\n person_profiles: 'identified_only' // or 'always' to create profiles for anonymous users as well`\n }\n })`,\n '',\n ]\n .map((x) => ' '.repeat(indent) + x)\n .join('\\n')\n}\n\nexport function JSSnippet(): JSX.Element {\n const snippet = useJsSnippet()\n\n return {snippet}\n}\n\nexport function JSSnippetV2(): JSX.Element {\n const { currentTeam } = useValues(teamLogic)\n\n const snippet = useJsSnippet(0, `/array/${currentTeam?.api_token}/array.js`)\n\n return {snippet}\n}\n","import { connect, kea, path, selectors } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport { subscriptions } from 'kea-subscriptions'\nimport api from 'lib/api'\nimport { membersLogic } from 'scenes/organization/membersLogic'\n\nimport { sidePanelContextLogic } from '~/layout/navigation-3000/sidepanel/panels/sidePanelContextLogic'\nimport { SidePanelSceneContext } from '~/layout/navigation-3000/sidepanel/types'\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\n\nimport type { metalyticsLogicType } from './metalyticsLogicType'\n\nexport const metalyticsLogic = kea([\n path(['lib', 'components', 'metalytics', 'metalyticsLogic']),\n connect({\n values: [sidePanelContextLogic, ['sceneSidePanelContext'], membersLogic, ['members']],\n }),\n\n loaders(({ values }) => ({\n viewCount: [\n null as { views: number; users: number } | null,\n {\n loadViewCount: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT SUM(count) AS count, COUNT(DISTINCT app_source_id) AS unique_users\n FROM app_metrics\n WHERE app_source = 'metalytics'\n AND instance_id = ${values.instanceId}`,\n }\n\n // NOTE: I think this gets cached heavily - how to correctly invalidate?\n const response = await api.query(query, undefined, undefined, true)\n const result = response.results as number[][]\n return {\n views: result[0][0],\n users: result[0][1],\n }\n },\n },\n ],\n recentUsers: [\n [] as string[],\n {\n loadUsersLast30days: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT DISTINCT app_source_id\n FROM app_metrics\n WHERE app_source = 'metalytics'\n AND instance_id = ${values.instanceId}\n AND timestamp >= NOW() - INTERVAL 30 DAY\n ORDER BY timestamp DESC`,\n }\n\n const response = await api.query(query, undefined, undefined, true)\n return response.results.map((result) => result[0]) as string[]\n },\n },\n ],\n })),\n\n selectors({\n instanceId: [\n (s) => [s.sceneSidePanelContext],\n (sidePanelContext: SidePanelSceneContext) =>\n sidePanelContext?.activity_item_id\n ? `${sidePanelContext.activity_scope}:${sidePanelContext.activity_item_id}`\n : null,\n ],\n scope: [\n (s) => [s.sceneSidePanelContext],\n (sidePanelContext: SidePanelSceneContext) => sidePanelContext?.activity_scope,\n ],\n\n recentUserMembers: [\n (s) => [s.recentUsers, s.members],\n (recentUsers, members) => {\n if (!members || !recentUsers) {\n return []\n }\n // Filter members whose IDs match the recentUsers array\n const filteredMembers = members.filter((member) => recentUsers.includes(String(member.user.id)))\n return filteredMembers\n },\n ],\n }),\n\n subscriptions(({ actions }) => ({\n instanceId: async (instanceId) => {\n if (instanceId) {\n actions.loadViewCount()\n actions.loadUsersLast30days()\n\n await api.create('/api/projects/@current/metalytics/', {\n metric_name: 'viewed',\n instance_id: instanceId,\n })\n }\n },\n })),\n])\n","import { IconBug, IconInfo, IconQuestion } from '@posthog/icons'\nimport {\n LemonInput,\n LemonSegmentedButton,\n LemonSegmentedButtonOption,\n lemonToast,\n Link,\n Tooltip,\n} from '@posthog/lemon-ui'\nimport { useActions, useValues } from 'kea'\nimport { Form } from 'kea-forms'\nimport { useUploadFiles } from 'lib/hooks/useUploadFiles'\nimport { IconFeedback } from 'lib/lemon-ui/icons'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonFileInput } from 'lib/lemon-ui/LemonFileInput/LemonFileInput'\nimport { LemonSelect } from 'lib/lemon-ui/LemonSelect/LemonSelect'\nimport { LemonTextArea } from 'lib/lemon-ui/LemonTextArea/LemonTextArea'\nimport { useRef } from 'react'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { userLogic } from 'scenes/userLogic'\n\nimport {\n SEVERITY_LEVEL_TO_NAME,\n SUPPORT_TICKET_TEMPLATES,\n supportLogic,\n SupportTicketKind,\n TARGET_AREA_TO_NAME,\n} from './supportLogic'\n\nconst SUPPORT_TICKET_OPTIONS: LemonSegmentedButtonOption[] = [\n {\n value: 'support',\n label: 'Question',\n icon: ,\n },\n {\n value: 'feedback',\n label: 'Feedback',\n icon: ,\n },\n {\n value: 'bug',\n label: 'Bug',\n icon: ,\n },\n]\n\nconst SUPPORT_TICKET_KIND_TO_PROMPT: Record = {\n bug: \"What's the bug?\",\n feedback: 'What feedback do you have?',\n support: 'What can we help you with?',\n}\n\nexport function SupportForm(): JSX.Element | null {\n const { sendSupportRequest } = useValues(supportLogic)\n const { setSendSupportRequestValue } = useActions(supportLogic)\n const { objectStorageAvailable } = useValues(preflightLogic)\n // the support model can be shown when logged out, file upload is not offered to anonymous users\n const { user } = useValues(userLogic)\n // only allow authentication issues for logged out users\n\n const dropRef = useRef(null)\n\n const { setFilesToUpload, filesToUpload, uploading } = useUploadFiles({\n onUpload: (url, fileName) => {\n setSendSupportRequestValue('message', sendSupportRequest.message + `\\n\\nAttachment \"${fileName}\": ${url}`)\n },\n onError: (detail) => {\n lemonToast.error(`Error uploading image: ${detail}`)\n },\n })\n\n const changeKind = (kind: SupportTicketKind): void => {\n setSendSupportRequestValue('kind', kind)\n if (kind === 'bug') {\n setSendSupportRequestValue('severity_level', 'medium')\n } else {\n setSendSupportRequestValue('severity_level', 'low')\n }\n }\n\n return (\n \n {!user && (\n <>\n \n \n \n \n \n \n \n )}\n \n \n \n \n \n \n \n {(props) => (\n
\n \n {objectStorageAvailable && !!user && (\n \n )}\n
\n )}\n \n
\n
\n \n \n Definitions\n \n
\n \n ({\n label: value,\n value: key,\n }))}\n />\n \n
\n \n )\n}\n","import { captureException } from '@sentry/react'\nimport * as Sentry from '@sentry/react'\nimport { actions, connect, kea, listeners, path, props, reducers, selectors } from 'kea'\nimport { forms } from 'kea-forms'\nimport { urlToAction } from 'kea-router'\nimport { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast'\nimport { uuid } from 'lib/utils'\nimport posthog from 'posthog-js'\nimport { organizationLogic } from 'scenes/organizationLogic'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { teamLogic } from 'scenes/teamLogic'\nimport { userLogic } from 'scenes/userLogic'\n\nimport { sidePanelStateLogic } from '~/layout/navigation-3000/sidepanel/sidePanelStateLogic'\nimport { AvailableFeature, OrganizationBasicType, Region, SidePanelTab, TeamPublicType, UserType } from '~/types'\n\nimport type { supportLogicType } from './supportLogicType'\nimport { openSupportModal } from './SupportModal'\n\nexport function getPublicSupportSnippet(\n cloudRegion: Region | null | undefined,\n currentOrganization: OrganizationBasicType | null,\n currentTeam: TeamPublicType | null,\n includeCurrentLocation = true\n): string {\n if (!cloudRegion) {\n return ''\n }\n return (\n (includeCurrentLocation ? getCurrentLocationLink() : '') +\n getSessionReplayLink() +\n `\\nAdmin: http://go/adminOrg${cloudRegion}/${currentOrganization?.id} (project ID ${currentTeam?.id})` +\n getSentryLink(cloudRegion, currentTeam)\n ).trimStart()\n}\n\nfunction getCurrentLocationLink(): string {\n const cleanedCurrentUrl = window.location.href.replace(/panel=support[^&]*(&)?/, '').replace(/#$/, '')\n return `\\nLocation: ${cleanedCurrentUrl}`\n}\n\nfunction getSessionReplayLink(): string {\n const replayUrl = posthog\n .get_session_replay_url({ withTimestamp: true, timestampLookBack: 30 })\n .replace(window.location.origin + '/replay/', 'http://go/session/')\n return `\\nSession: ${replayUrl}`\n}\n\nfunction getErrorTrackingLink(): string {\n const filterGroup = encodeURIComponent(\n JSON.stringify({\n type: 'AND',\n values: [\n {\n type: 'AND',\n values: [\n {\n key: '$session_id',\n value: [posthog.get_session_id()],\n operator: 'exact',\n type: 'event',\n },\n ],\n },\n ],\n })\n )\n\n return `\\nExceptions: https://us.posthog.com/project/2/error_tracking?filterGroup=${filterGroup}`\n}\n\nfunction getDjangoAdminLink(\n user: UserType | null,\n cloudRegion: Region | null | undefined,\n currentOrganization: OrganizationBasicType | null,\n currentTeam: TeamPublicType | null\n): string {\n if (!user || !cloudRegion) {\n return ''\n }\n const link = `http://go/admin${cloudRegion}/${user.email}`\n return `\\nAdmin: ${link} (organization ID ${currentOrganization?.id}: ${currentOrganization?.name}, project ID ${currentTeam?.id}: ${currentTeam?.name})`\n}\n\nfunction getBillingAdminLink(currentOrganization: OrganizationBasicType | null): string {\n if (!currentOrganization) {\n return ''\n }\n return `\\nBilling admin: http://go/billing/${currentOrganization.id}`\n}\n\nfunction getSentryLink(cloudRegion: Region | null | undefined, currentTeam: TeamPublicType | null): string {\n if (!cloudRegion || !currentTeam) {\n return ''\n }\n return `\\nSentry: http://go/sentry${cloudRegion}/${currentTeam.id}`\n}\n\nconst SUPPORT_TICKET_KIND_TO_TITLE: Record = {\n support: 'Contact support',\n feedback: 'Give feedback',\n bug: 'Report a bug',\n}\n\nexport const TARGET_AREA_TO_NAME = [\n {\n title: 'General',\n options: [\n {\n value: 'apps',\n 'data-attr': `support-form-target-area-apps`,\n label: 'Data pipelines',\n },\n {\n value: 'login',\n 'data-attr': `support-form-target-area-login`,\n label: 'Authentication (incl. login, sign-up, invites)',\n },\n {\n value: 'billing',\n 'data-attr': `support-form-target-area-billing`,\n label: 'Billing',\n },\n {\n value: 'onboarding',\n 'data-attr': `support-form-target-area-onboarding`,\n label: 'Onboarding',\n },\n {\n value: 'sdk',\n 'data-attr': `support-form-target-area-onboarding`,\n label: 'SDK / Implementation',\n },\n {\n value: 'cohorts',\n 'data-attr': `support-form-target-area-cohorts`,\n label: 'Cohorts',\n },\n {\n value: 'data_management',\n 'data-attr': `support-form-target-area-data_management`,\n label: 'Data management (incl. events, actions, properties)',\n },\n {\n value: 'notebooks',\n 'data-attr': `support-form-target-area-notebooks`,\n label: 'Notebooks',\n },\n {\n value: 'mobile',\n 'data-attr': `support-form-target-area-mobile`,\n label: 'Mobile',\n },\n ],\n },\n {\n title: 'Individual product',\n options: [\n {\n value: 'experiments',\n 'data-attr': `support-form-target-area-experiments`,\n label: 'Experiments',\n },\n {\n value: 'data_warehouse',\n 'data-attr': `support-form-target-area-data_warehouse`,\n label: 'Data warehouse',\n },\n {\n value: 'batch_exports',\n 'data-attr': `support-form-target-area-batch-exports`,\n label: 'Batch exports',\n },\n {\n value: 'feature_flags',\n 'data-attr': `support-form-target-area-feature_flags`,\n label: 'Feature flags',\n },\n {\n value: 'analytics',\n 'data-attr': `support-form-target-area-analytics`,\n label: 'Product analytics (incl. insights, dashboards, annotations)',\n },\n {\n value: 'session_replay',\n 'data-attr': `support-form-target-area-session_replay`,\n label: 'Session replay (incl. recordings)',\n },\n {\n value: 'toolbar',\n 'data-attr': `support-form-target-area-toolbar`,\n label: 'Toolbar (incl. heatmaps)',\n },\n {\n value: 'surveys',\n 'data-attr': `support-form-target-area-surveys`,\n label: 'Surveys',\n },\n {\n value: 'web_analytics',\n 'data-attr': `support-form-target-area-web_analytics`,\n label: 'Web Analytics',\n },\n {\n value: 'error_tracking',\n 'data-attr': `support-form-target-area-error_tracking`,\n label: 'Error tracking',\n },\n ],\n },\n]\n\nexport const SEVERITY_LEVEL_TO_NAME = {\n critical: 'Outage, data loss, or data breach',\n high: 'Feature is not working at all',\n medium: 'Feature not working as expected',\n low: 'Question or feature request',\n}\n\nexport const SUPPORT_KIND_TO_SUBJECT = {\n bug: 'Bug Report',\n feedback: 'Feedback',\n support: 'Support Ticket',\n}\n\nexport type SupportTicketTargetArea =\n | 'experiments'\n | 'apps'\n | 'login'\n | 'billing'\n | 'onboarding'\n | 'cohorts'\n | 'data_management'\n | 'notebooks'\n | 'data_warehouse'\n | 'feature_flags'\n | 'analytics'\n | 'session_replay'\n | 'toolbar'\n | 'surveys'\n | 'web_analytics'\n | 'error_tracking'\nexport type SupportTicketSeverityLevel = keyof typeof SEVERITY_LEVEL_TO_NAME\nexport type SupportTicketKind = keyof typeof SUPPORT_KIND_TO_SUBJECT\n\nexport const getLabelBasedOnTargetArea = (target_area: SupportTicketTargetArea): null | string => {\n for (const category of TARGET_AREA_TO_NAME) {\n for (const option of category.options) {\n if (option.value === target_area) {\n return option.label\n }\n }\n }\n return null // Return null if the value is not found\n}\n\nexport const URL_PATH_TO_TARGET_AREA: Record = {\n insights: 'analytics',\n recordings: 'session_replay',\n replay: 'session_replay',\n dashboard: 'analytics',\n feature_flags: 'feature_flags',\n experiments: 'experiments',\n 'web-performance': 'session_replay',\n events: 'analytics',\n 'data-management': 'data_management',\n cohorts: 'cohorts',\n annotations: 'analytics',\n persons: 'analytics',\n groups: 'analytics',\n app: 'apps',\n toolbar: 'session_replay',\n warehouse: 'data_warehouse',\n surveys: 'surveys',\n web: 'web_analytics',\n}\n\nexport const SUPPORT_TICKET_TEMPLATES = {\n bug: 'Please describe the bug you saw, and how to reproduce it.\\n\\nIf the bug appeared on a specific insight or dashboard, please include a link to it.',\n feedback:\n \"If your request is due to a problem, please describe the problem as best you can.\\n\\nPlease also describe the solution you'd like to see, and any alternatives you considered.\\n\\nYou can add images below to help illustrate your request, if needed!\",\n support:\n \"Please explain as fully as possible what you're aiming to do, and what you'd like help with.\\n\\nIf your question involves an existing insight or dashboard, please include a link to it.\",\n}\n\nexport function getURLPathToTargetArea(pathname: string): SupportTicketTargetArea | null {\n const first_part = pathname.split('/')[1]\n return URL_PATH_TO_TARGET_AREA[first_part] ?? null\n}\n\nexport type SupportFormLogicProps = {\n onClose?: () => void\n}\n\nexport type SupportFormFields = {\n name: string\n email: string\n kind: SupportTicketKind\n target_area: SupportTicketTargetArea | null\n severity_level: SupportTicketSeverityLevel | null\n message: string\n isEmailFormOpen?: boolean | 'true' | 'false'\n}\n\nexport const supportLogic = kea([\n props({} as SupportFormLogicProps),\n path(['lib', 'components', 'support', 'supportLogic']),\n connect(() => ({\n values: [\n userLogic,\n ['user'],\n preflightLogic,\n ['preflight'],\n sidePanelStateLogic,\n ['sidePanelAvailable'],\n userLogic,\n ['hasAvailableFeature'],\n ],\n actions: [sidePanelStateLogic, ['openSidePanel', 'setSidePanelOptions']],\n })),\n actions(() => ({\n closeSupportForm: true,\n openSupportForm: (values: Partial) => values,\n submitZendeskTicket: (form: SupportFormFields) => form,\n updateUrlParams: true,\n openEmailForm: true,\n closeEmailForm: true,\n })),\n reducers(() => ({\n isSupportFormOpen: [\n false,\n {\n openSupportForm: () => true,\n closeSupportForm: () => false,\n },\n ],\n isEmailFormOpen: [\n false,\n {\n openEmailForm: () => true,\n closeEmailForm: () => false,\n },\n ],\n })),\n forms(({ actions, values }) => ({\n sendSupportRequest: {\n defaults: {\n name: '',\n email: '',\n kind: 'support',\n severity_level: null,\n target_area: null,\n message: '',\n } as SupportFormFields,\n errors: ({ name, email, message, kind, target_area, severity_level }) => {\n return {\n name: !values.user ? (!name ? 'Please enter your name' : '') : '',\n email: !values.user ? (!email ? 'Please enter your email' : '') : '',\n message: !message ? 'Please enter a message' : '',\n kind: !kind ? 'Please choose' : undefined,\n severity_level: !severity_level ? 'Please choose' : undefined,\n target_area: !target_area ? 'Please choose' : undefined,\n }\n },\n submit: async (formValues) => {\n // name must be present for zendesk to accept the ticket\n formValues.name = values.user?.first_name ?? formValues.name ?? 'name not set'\n formValues.email = values.user?.email ?? formValues.email ?? ''\n actions.submitZendeskTicket(formValues)\n actions.closeSupportForm()\n actions.resetSendSupportRequest()\n },\n },\n })),\n selectors({\n title: [\n (s) => [s.sendSupportRequest ?? null],\n (sendSupportRequest) =>\n sendSupportRequest.kind\n ? SUPPORT_TICKET_KIND_TO_TITLE[sendSupportRequest.kind]\n : 'Leave a message with PostHog',\n ],\n }),\n listeners(({ actions, props, values }) => ({\n updateUrlParams: async () => {\n const panelOptions = [\n values.sendSupportRequest.kind ?? '',\n values.sendSupportRequest.target_area ?? '',\n values.sendSupportRequest.severity_level ?? '',\n values.isEmailFormOpen ?? 'false',\n ].join(':')\n\n if (panelOptions !== ':') {\n actions.setSidePanelOptions(panelOptions)\n }\n },\n openSupportForm: async ({ name, email, isEmailFormOpen, kind, target_area, severity_level, message }) => {\n let area = target_area ?? getURLPathToTargetArea(window.location.pathname)\n if (!userLogic.values.user) {\n area = 'login'\n }\n kind = kind ?? 'support'\n actions.resetSendSupportRequest({\n name: name ?? '',\n email: email ?? '',\n kind,\n target_area: area,\n severity_level: severity_level ?? null,\n message: message ?? '',\n })\n\n if (isEmailFormOpen === 'true' || isEmailFormOpen === true) {\n actions.openEmailForm()\n } else {\n actions.closeEmailForm()\n }\n\n if (values.sidePanelAvailable) {\n const panelOptions = [kind ?? '', area ?? ''].join(':')\n actions.openSidePanel(SidePanelTab.Support, panelOptions === ':' ? undefined : panelOptions)\n } else {\n openSupportModal()\n }\n\n actions.updateUrlParams()\n },\n submitZendeskTicket: async ({ name, email, kind, target_area, severity_level, message }) => {\n const zendesk_ticket_uuid = uuid()\n const subject =\n SUPPORT_KIND_TO_SUBJECT[kind ?? 'support'] +\n ': ' +\n (target_area\n ? getLabelBasedOnTargetArea(target_area) ?? `${target_area} (feature preview)`\n : 'General') +\n ' (' +\n zendesk_ticket_uuid +\n ')'\n const cloudRegion = preflightLogic.values.preflight?.region\n\n const payload = {\n request: {\n requester: { name: name, email: email },\n subject: subject,\n custom_fields: [\n {\n id: 22084126888475,\n value: severity_level,\n },\n {\n id: 22129191462555,\n value: posthog.get_distinct_id(),\n },\n {\n id: 27242745654043,\n value: target_area ?? '',\n },\n {\n id: 27031528411291,\n value: userLogic?.values?.user?.organization?.id ?? '',\n },\n {\n id: 26073267652251,\n value: values.hasAvailableFeature(AvailableFeature.PRIORITY_SUPPORT)\n ? 'priority_support'\n : values.hasAvailableFeature(AvailableFeature.EMAIL_SUPPORT)\n ? 'email_support'\n : 'free_support',\n },\n ],\n comment: {\n body:\n message +\n `\\n\\n-----` +\n `\\nKind: ${kind}` +\n `\\nTarget area: ${target_area}` +\n `\\nReport event: http://go/ticketByUUID/${zendesk_ticket_uuid}` +\n getSessionReplayLink() +\n getErrorTrackingLink() +\n getCurrentLocationLink() +\n getDjangoAdminLink(\n userLogic.values.user,\n cloudRegion,\n organizationLogic.values.currentOrganization,\n teamLogic.values.currentTeam\n ) +\n (target_area === 'billing' || target_area === 'login' || target_area === 'onboarding'\n ? getBillingAdminLink(organizationLogic.values.currentOrganization)\n : '') +\n getSentryLink(cloudRegion, teamLogic.values.currentTeam) +\n (cloudRegion && teamLogic.values.currentTeam\n ? '\\nPersons-on-events mode for project: ' +\n (teamLogic.values.currentTeam.modifiers?.personsOnEventsMode ??\n teamLogic.values.currentTeam.default_modifiers?.personsOnEventsMode ??\n 'unknown')\n : ''),\n },\n },\n }\n\n try {\n const zendeskRequestBody = JSON.stringify(payload, undefined, 4)\n const response = await fetch('https://posthoghelp.zendesk.com/api/v2/requests.json', {\n method: 'POST',\n body: zendeskRequestBody,\n headers: { 'Content-Type': 'application/json' },\n })\n if (!response.ok) {\n const error = new Error(`There was an error creating the support ticket with zendesk.`)\n const extra: Record = { zendeskBody: zendeskRequestBody }\n Object.entries(payload).forEach(([key, value]) => {\n extra[`payload_${key}`] = value\n })\n const body = await response.text()\n const contexts = {\n response: {\n status_code: response.status,\n data: body,\n body_size: body?.length,\n },\n }\n captureException(error, {\n extra,\n contexts,\n })\n lemonToast.error(`There was an error sending the message.`)\n return\n }\n\n const json = await response.json()\n\n const zendesk_ticket_id = json.request.id\n const zendesk_ticket_link = `https://posthoghelp.zendesk.com/agent/tickets/${zendesk_ticket_id}`\n const properties = {\n zendesk_ticket_uuid,\n kind,\n target_area,\n message,\n zendesk_ticket_id,\n zendesk_ticket_link,\n }\n posthog.capture('support_ticket', properties)\n Sentry.captureMessage('User submitted Zendesk ticket', {\n tags: {\n zendesk_ticket_uuid,\n zendesk_ticket_link,\n support_request_kind: kind,\n support_request_area: target_area,\n team_id: teamLogic.values.currentTeamId,\n },\n extra: properties,\n level: 'log',\n })\n lemonToast.success(\"Got the message! If we have follow-up information for you, we'll reply via email.\")\n } catch (e) {\n captureException(e)\n lemonToast.error(`There was an error sending the message.`)\n }\n },\n\n closeSupportForm: () => {\n props.onClose?.()\n },\n\n setSendSupportRequestValue: () => {\n actions.updateUrlParams()\n },\n })),\n\n urlToAction(({ actions, values }) => ({\n '*': (_, _search, hashParams) => {\n if (values.isSupportFormOpen) {\n return\n }\n\n const [panel, ...panelOptions] = (hashParams['panel'] ?? '').split(':')\n\n if (panel === SidePanelTab.Support) {\n const [kind, area, severity, isEmailFormOpen] = panelOptions\n\n actions.openSupportForm({\n kind: Object.keys(SUPPORT_KIND_TO_SUBJECT).includes(kind) ? kind : null,\n target_area: getLabelBasedOnTargetArea(area) ? area : null,\n severity_level: Object.keys(SEVERITY_LEVEL_TO_NAME).includes(severity) ? severity : null,\n isEmailFormOpen: isEmailFormOpen ?? 'false',\n })\n return\n }\n\n // Legacy supportModal param\n if ('supportModal' in hashParams) {\n const [kind, area, severity] = (hashParams['supportModal'] || '').split(':')\n\n actions.openSupportForm({\n kind: Object.keys(SUPPORT_KIND_TO_SUBJECT).includes(kind) ? kind : null,\n target_area: Object.keys(TARGET_AREA_TO_NAME).includes(area) ? area : null,\n severity_level: Object.keys(SEVERITY_LEVEL_TO_NAME).includes(severity) ? severity : null,\n })\n }\n },\n })),\n])\n","import { actions, afterMount, kea, key, listeners, path, props, reducers, sharedListeners } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport api from 'lib/api'\nimport { isNotNil } from 'lib/utils'\nimport {\n diffVersions,\n highestVersion,\n isEqualVersion,\n parseVersion,\n SemanticVersion,\n tryParseVersion,\n versionToString,\n} from 'lib/utils/semver'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\n\nimport type { versionCheckerLogicType } from './versionCheckerLogicType'\n\n// If you would like to deprecate all posthog-js versions older than a specific version\n// (i.e. after fixing an important bug) please edit\n// https://github.com/PostHog/posthog-js/blob/main/deprecation.json\n\nconst CHECK_INTERVAL_MS = 1000 * 60 * 60 * 6 // 6 hour\n\nexport type SDKVersion = {\n version: SemanticVersion\n timestamp?: string\n}\n\nexport type SDKVersionWarning = {\n latestUsedVersion: string\n latestAvailableVersion: string\n numVersionsBehind?: number\n level: 'warning' | 'info' | 'error'\n}\n\nexport interface PosthogJSDeprecation {\n deprecateBeforeVersion?: string\n deprecateOlderThanDays?: number\n}\n\nexport interface AvailableVersions {\n sdkVersions?: SemanticVersion[]\n deprecation?: PosthogJSDeprecation\n}\n\nexport interface VersionCheckerLogicProps {\n teamId: number | null\n}\n\nexport const versionCheckerLogic = kea([\n props({ teamId: null } as VersionCheckerLogicProps),\n key(({ teamId }) => teamId || 'no-team-id'),\n path((key) => ['components', 'VersionChecker', 'versionCheckerLogic', key]),\n actions({\n setVersionWarning: (versionWarning: SDKVersionWarning | null) => ({ versionWarning }),\n setSdkVersions: (sdkVersions: SDKVersion[]) => ({ sdkVersions }),\n }),\n loaders(({ values }) => ({\n availableVersions: [\n {} as AvailableVersions,\n {\n loadAvailableVersions: async (): Promise => {\n // Make both requests simultaneously and don't return until both have finished, to avoid a flash\n // of partial results in the UI.\n const availableVersionsPromise: Promise = fetch(\n 'https://api.github.com/repos/posthog/posthog-js/tags'\n )\n .then((r) => r.json())\n .then((r) => r.map((x: any) => tryParseVersion(x.name)).filter(isNotNil))\n const deprecationPromise: Promise = fetch(\n 'https://raw.githubusercontent.com/PostHog/posthog-js/main/deprecation.json'\n ).then((r) => r.json())\n const settled = await Promise.allSettled([availableVersionsPromise, deprecationPromise])\n const availableVersions = settled[0].status === 'fulfilled' ? settled[0].value : []\n const deprecation = settled[1].status === 'fulfilled' ? settled[1].value : {}\n // if one or more of the requests failed, merge in the previous value if we have one\n return {\n ...values.availableVersions,\n sdkVersions: availableVersions,\n deprecation: deprecation,\n }\n },\n },\n ],\n usedVersions: [\n null as SDKVersion[] | null,\n {\n loadUsedVersions: async () => {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT properties.$lib_version AS lib_version, max(timestamp) AS latest_timestamp, count(lib_version) as count\n FROM events\n WHERE timestamp >= now() - INTERVAL 1 DAY \n AND timestamp <= now()\n AND properties.$lib = 'web'\n GROUP BY lib_version\n ORDER BY latest_timestamp DESC\n limit 10`,\n }\n\n const res = await api.query(query, undefined, undefined, true)\n\n return (\n res.results\n ?.map((x) => {\n const version = tryParseVersion(x[0])\n if (!version) {\n return null\n }\n return {\n version,\n timestamp: x[1],\n }\n })\n .filter(isNotNil) ?? null\n )\n },\n },\n ],\n })),\n\n reducers({\n lastCheckTimestamp: [\n 0,\n { persist: true },\n {\n loadUsedVersionsSuccess: () => Date.now(),\n },\n ],\n versionWarning: [\n null as SDKVersionWarning | null,\n // bumping cache key due to an incorrect tag being cached on 2024-02-12\n { persist: true, prefix: '2024-02-12' },\n {\n setVersionWarning: (_, { versionWarning }) => versionWarning,\n },\n ],\n }),\n\n sharedListeners(({ values, actions }) => ({\n checkForVersionWarning: () => {\n if (!values.usedVersions?.length) {\n return\n }\n const { deprecation, sdkVersions } = values.availableVersions\n\n // We want the highest semantic version to be the latest used one, rather than\n // the one with the latest timestamp, because secondary installations can spew old versions\n const latestUsedVersion = highestVersion(values.usedVersions.map((v) => v.version))\n\n // the latest version published on github\n const latestAvailableVersion = sdkVersions?.[0]\n\n // the version where, anything before this deprecated (i.e. this version is allowed, before it is not)\n const deprecateBeforeVersion = deprecation?.deprecateBeforeVersion\n ? parseVersion(deprecation.deprecateBeforeVersion)\n : null\n\n let warning: SDKVersionWarning | null = null\n\n if (deprecateBeforeVersion) {\n const diff = diffVersions(deprecateBeforeVersion, latestUsedVersion)\n // if they are behind the deprecatedBeforeVersion by any amount, show an error\n if (diff && diff.diff > 0) {\n warning = {\n latestUsedVersion: versionToString(latestUsedVersion),\n latestAvailableVersion: versionToString(latestAvailableVersion || deprecateBeforeVersion),\n level: 'error',\n }\n }\n }\n\n if (!warning && sdkVersions && latestAvailableVersion) {\n const diff = diffVersions(latestAvailableVersion, latestUsedVersion)\n\n if (diff && diff.diff > 0) {\n // there's a difference between the latest used version and the latest available version\n\n let numVersionsBehind = sdkVersions.findIndex((v) => isEqualVersion(v, latestUsedVersion))\n if (numVersionsBehind === -1) {\n // if we couldn't find the versions, use the length of the list as a fallback\n numVersionsBehind = sdkVersions.length - 1\n }\n if (numVersionsBehind < diff.diff) {\n // we might have deleted versions, but if the actual diff is X then we must be at least X versions behind\n numVersionsBehind = diff.diff\n }\n\n let level: 'warning' | 'info' | 'error' | undefined\n if (diff.kind === 'major') {\n level = 'info' // it is desirable to be on the latest major version, but not critical\n } else if (diff.kind === 'minor') {\n level = numVersionsBehind >= 40 ? 'warning' : undefined\n }\n\n if (level === undefined && numVersionsBehind >= 50) {\n level = 'error'\n }\n\n // we check if there is a \"latest user version string\" to avoid returning odd data in unexpected cases\n if (level && !!versionToString(latestUsedVersion).trim().length) {\n warning = {\n latestUsedVersion: versionToString(latestUsedVersion),\n latestAvailableVersion: versionToString(latestAvailableVersion),\n level,\n numVersionsBehind,\n }\n }\n }\n }\n\n actions.setVersionWarning(warning)\n },\n })),\n\n listeners(({ sharedListeners }) => ({\n loadAvailableVersionsSuccess: sharedListeners.checkForVersionWarning,\n loadUsedVersionsSuccess: sharedListeners.checkForVersionWarning,\n })),\n\n afterMount(({ actions, values }) => {\n if (values.lastCheckTimestamp < Date.now() - CHECK_INTERVAL_MS) {\n actions.loadAvailableVersions()\n actions.loadUsedVersions()\n }\n }),\n])\n","import { useValues } from 'kea'\nimport { TextContent } from 'lib/components/Cards/TextCard/TextCard'\nimport { useUploadFiles } from 'lib/hooks/useUploadFiles'\nimport { IconMarkdown, IconTools } from 'lib/lemon-ui/icons'\nimport { LemonFileInput } from 'lib/lemon-ui/LemonFileInput'\nimport { LemonTabs } from 'lib/lemon-ui/LemonTabs'\nimport { LemonTextArea, LemonTextAreaProps } from 'lib/lemon-ui/LemonTextArea/LemonTextArea'\nimport { lemonToast } from 'lib/lemon-ui/LemonToast'\nimport { Link } from 'lib/lemon-ui/Link'\nimport { Tooltip } from 'lib/lemon-ui/Tooltip'\nimport posthog from 'posthog-js'\nimport React, { useRef, useState } from 'react'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\n\nexport const LemonTextAreaMarkdown = React.forwardRef(\n function _LemonTextAreaMarkdown({ value, onChange, ...editAreaProps }, ref): JSX.Element {\n const { objectStorageAvailable } = useValues(preflightLogic)\n\n const [isPreviewShown, setIsPreviewShown] = useState(false)\n const dropRef = useRef(null)\n\n const { setFilesToUpload, filesToUpload, uploading } = useUploadFiles({\n onUpload: (url, fileName) => {\n onChange?.(value + `\\n\\n![${fileName}](${url})`)\n posthog.capture('markdown image uploaded', { name: fileName })\n },\n onError: (detail) => {\n posthog.capture('markdown image upload failed', { error: detail })\n lemonToast.error(`Error uploading image: ${detail}`)\n },\n })\n\n return (\n setIsPreviewShown(key === 'preview')}\n tabs={[\n {\n key: 'write',\n label: 'Write',\n content: (\n
\n \n
\n \n Markdown formatting support\n
\n {objectStorageAvailable ? (\n \n ) : (\n
\n \n \n \n \n \n \n Add external images using{' '}\n \n {' '}\n Markdown image links\n \n .\n \n
\n )}\n
\n ),\n },\n {\n key: 'preview',\n label: 'Preview',\n content: value ? (\n \n ) : (\n Nothing to preview\n ),\n },\n ]}\n />\n )\n }\n)\n","// This file contains example queries, used in storybook and in the /query interface.\nimport { defaultDataTableColumns } from '~/queries/nodes/DataTable/utils'\nimport {\n ActionsNode,\n DataTableNode,\n DataVisualizationNode,\n EventsNode,\n EventsQuery,\n FunnelsQuery,\n HogQLQuery,\n HogQuery,\n InsightVizNode,\n LifecycleQuery,\n Node,\n NodeKind,\n PathsQuery,\n PersonsNode,\n RetentionQuery,\n StickinessQuery,\n TrendsQuery,\n} from '~/queries/schema'\nimport {\n ChartDisplayType,\n FilterLogicalOperator,\n PropertyFilterType,\n PropertyGroupFilter,\n PropertyOperator,\n StepOrderValue,\n} from '~/types'\n\nconst Events: EventsQuery = {\n kind: NodeKind.EventsQuery,\n select: defaultDataTableColumns(NodeKind.EventsQuery),\n properties: [\n { type: PropertyFilterType.Event, key: '$browser', operator: PropertyOperator.Exact, value: 'Chrome' },\n ],\n after: '-24h',\n limit: 100,\n}\n\nconst EventsTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n source: Events,\n}\nconst EventsTableFull: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: Events,\n}\n\nconst TotalEvents: EventsQuery = {\n kind: NodeKind.EventsQuery,\n select: ['count()'],\n}\n\nexport const TotalEventsTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: TotalEvents,\n}\n\nconst PropertyFormulas: EventsQuery = {\n kind: NodeKind.EventsQuery,\n select: [\n '1 + 2 + 3',\n 'event',\n 'person.created_at',\n \"concat(properties['$browser'], ' 💚 ', properties['$geoip_city_name']) -- Browser 💚 City\",\n \"'random string'\",\n ],\n limit: 100,\n}\n\nconst PropertyFormulasTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: PropertyFormulas,\n}\n\nconst EventAggregations: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: {\n kind: NodeKind.EventsQuery,\n select: [\n \"concat(properties['$geoip_city_name'], ' ', 'Rocks') -- City\",\n 'event',\n 'count() + 100000 -- Inflamed total',\n '1 + 2',\n ],\n orderBy: ['-count()'],\n },\n}\n\nconst Persons: PersonsNode = {\n kind: NodeKind.PersonsNode,\n properties: [\n { type: PropertyFilterType.Person, key: '$browser', operator: PropertyOperator.Exact, value: 'Chrome' },\n ],\n}\n\nconst PersonsTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n columns: defaultDataTableColumns(NodeKind.PersonsNode),\n source: Persons,\n}\n\nconst PersonsTableFull: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n columns: defaultDataTableColumns(NodeKind.PersonsNode),\n source: Persons,\n}\n\nconst properties: PropertyGroupFilter = {\n type: FilterLogicalOperator.And,\n values: [\n {\n type: FilterLogicalOperator.Or,\n values: [\n {\n type: PropertyFilterType.Event,\n key: '$current_url',\n operator: PropertyOperator.Exact,\n value: ['https://hedgebox.net/files/'],\n },\n {\n type: PropertyFilterType.Event,\n key: '$geoip_country_code',\n operator: PropertyOperator.Exact,\n value: ['US', 'AU'],\n },\n ],\n },\n ],\n}\n\nconst filterTestAccounts = false\nconst series: (EventsNode | ActionsNode)[] = [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n custom_name: 'Views',\n event: '$pageview',\n properties: [\n {\n type: PropertyFilterType.Event,\n key: '$browser',\n operator: PropertyOperator.Exact,\n value: 'Chrome',\n },\n {\n type: PropertyFilterType.Cohort,\n key: 'id',\n operator: PropertyOperator.In,\n value: 2,\n },\n ],\n },\n // {\n // kind: NodeKind.ActionsNode,\n // id: 1,\n // name: 'Interacted with file',\n // custom_name: 'Interactions',\n // properties: [\n // {\n // type: PropertyFilterType.Event,\n // key: '$geoip_country_code',\n // operator: PropertyOperator.Exact,\n // value: ['US'],\n // },\n // ],\n // math: PropertyMathType.Average,\n // math_property: '$session_duration',\n // },\n]\n\nconst InsightTrendsQuery: TrendsQuery = {\n kind: NodeKind.TrendsQuery,\n properties,\n filterTestAccounts,\n interval: 'day',\n dateRange: {\n date_from: '-7d',\n },\n series,\n trendsFilter: {\n display: ChartDisplayType.ActionsAreaGraph,\n },\n breakdownFilter: {\n breakdown: '$geoip_country_code',\n breakdown_type: 'event',\n },\n}\n\nconst InsightFunnelsQuery: FunnelsQuery = {\n kind: NodeKind.FunnelsQuery,\n properties,\n filterTestAccounts,\n interval: 'day',\n dateRange: {\n date_from: '-7d',\n },\n series,\n funnelsFilter: {\n funnelOrderType: StepOrderValue.ORDERED,\n },\n breakdownFilter: {\n breakdown: '$geoip_country_code',\n breakdown_type: 'event',\n },\n}\n\nconst InsightRetentionQuery: RetentionQuery = {\n kind: NodeKind.RetentionQuery,\n properties,\n filterTestAccounts,\n retentionFilter: {\n // TODO: this should be typed as (EventsNode | ActionsNode)[] without math and properties\n targetEntity: { type: 'events', id: '$pageview', name: '$pageview' },\n returningEntity: { type: 'events', id: '$pageview', name: '$pageview' },\n },\n}\n\nconst InsightPathsQuery: PathsQuery = {\n kind: NodeKind.PathsQuery,\n properties,\n filterTestAccounts,\n pathsFilter: {},\n}\n\nconst InsightStickinessQuery: StickinessQuery = {\n kind: NodeKind.StickinessQuery,\n properties,\n filterTestAccounts,\n interval: 'day',\n dateRange: {\n date_from: '-7d',\n },\n series,\n stickinessFilter: {},\n}\n\nconst InsightLifecycleQuery: LifecycleQuery = {\n kind: NodeKind.LifecycleQuery,\n properties,\n filterTestAccounts,\n dateRange: {\n date_from: '-7d',\n },\n series, // TODO: Visualization only supports one event or action\n}\n\nconst HogQLRaw: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: ` select event,\n person.properties.email,\n properties.$browser,\n count()\n from events\n where {filters} -- replaced with global date and property filters\n and person.properties.email is not null\n group by event,\n properties.$browser,\n person.properties.email\n order by count() desc\n limit 100`,\n filters: {\n dateRange: {\n date_from: '-24h',\n },\n },\n}\n\nconst HogQLForDataVisualization: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `select toDate(timestamp) as timestamp, count()\nfrom events\nwhere {filters} and timestamp <= now()\ngroup by timestamp\norder by timestamp asc\nlimit 100`,\n explain: true,\n filters: {\n dateRange: {\n date_from: '-7d',\n },\n },\n}\n\nconst HogQLForDataWarehouse: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `select toDate(timestamp) as timestamp, count()\nfrom events\ngroup by timestamp\nlimit 100`,\n explain: true,\n}\n\nconst DataWarehouse: DataVisualizationNode = {\n kind: NodeKind.DataVisualizationNode,\n source: HogQLForDataWarehouse,\n}\n\nconst HogQLTable: DataTableNode = {\n kind: NodeKind.DataTableNode,\n full: true,\n source: HogQLRaw,\n}\n\nconst DataVisualization: DataVisualizationNode = {\n kind: NodeKind.DataVisualizationNode,\n source: HogQLForDataVisualization,\n tableSettings: {\n columns: [\n {\n column: 'timestamp',\n settings: {\n formatting: {\n prefix: '',\n suffix: '',\n },\n },\n },\n {\n column: 'count()',\n settings: {\n formatting: {\n prefix: '',\n suffix: '',\n },\n },\n },\n ],\n },\n chartSettings: { goalLines: undefined },\n}\n\nconst Hog: HogQuery = {\n kind: NodeKind.HogQuery,\n code: 'return 1 + 2;',\n}\n\nconst Hoggonacci: HogQuery = {\n kind: NodeKind.HogQuery,\n code: `fn fibonacci(number) {\n if (number < 2) {\n return number;\n } else {\n return fibonacci(number - 1) + fibonacci(number - 2);\n }\n}\nreturn fibonacci(16);`,\n}\n/* a subset of examples including only those we can show all users and that don't use HogQL */\nexport const queryExamples: Record = {\n Events,\n EventsTable,\n EventsTableFull,\n TotalEventsTable,\n PropertyFormulasTable,\n EventAggregations,\n Persons,\n PersonsTable,\n PersonsTableFull,\n InsightTrendsQuery,\n InsightTrends: { kind: NodeKind.InsightVizNode, source: InsightTrendsQuery } as InsightVizNode,\n InsightFunnelsQuery,\n InsightFunnels: { kind: NodeKind.InsightVizNode, source: InsightFunnelsQuery } as InsightVizNode,\n InsightRetentionQuery,\n InsightRetention: {\n kind: NodeKind.InsightVizNode,\n source: InsightRetentionQuery,\n } as InsightVizNode,\n InsightPathsQuery,\n InsightPaths: { kind: NodeKind.InsightVizNode, source: InsightPathsQuery } as InsightVizNode,\n InsightStickinessQuery,\n InsightStickiness: {\n kind: NodeKind.InsightVizNode,\n source: InsightStickinessQuery,\n } as InsightVizNode,\n InsightLifecycleQuery,\n InsightLifecycle: {\n kind: NodeKind.InsightVizNode,\n source: InsightLifecycleQuery,\n } as InsightVizNode,\n}\n\nexport const stringifiedQueryExamples: Record = Object.fromEntries(\n Object.entries(queryExamples).map(([key, node]) => [key, JSON.stringify(node)])\n)\n\nexport const examples: Record = {\n ...queryExamples,\n HogQLRaw,\n HogQLTable,\n DataVisualization,\n Hog,\n Hoggonacci,\n DataWarehouse,\n}\n\nexport const stringifiedExamples: Record = Object.fromEntries(\n Object.entries(examples).map(([key, node]) => [key, JSON.stringify(node)])\n)\n","import * as d3 from 'd3'\nimport * as Sankey from 'd3-sankey'\nimport { D3Selector } from 'lib/hooks/useD3'\nimport { stripHTTP } from 'lib/utils'\nimport { Dispatch, RefObject, SetStateAction } from 'react'\n\nimport { FunnelPathsFilter, PathsFilter } from '~/queries/schema'\n\nimport { FALLBACK_CANVAS_WIDTH, HIDE_PATH_CARD_HEIGHT } from './Paths'\nimport { PathNode } from './pathsDataLogic'\nimport { isSelectedPathStartOrEnd, PathNodeData, PathTargetLink, roundedRect } from './pathUtils'\n\nconst createCanvas = (canvasRef: RefObject, width: number, height: number): D3Selector => {\n return d3\n .select(canvasRef.current)\n .append('svg')\n .classed('Paths__canvas', true)\n .style('background', 'var(--item-background)')\n .style('width', `${width}px`)\n .style('height', `${height}px`)\n}\n\nconst createSankey = (width: number, height: number): Sankey.SankeyLayout => {\n // @ts-expect-error - d3 sankey typing things\n return new Sankey.sankey()\n .nodeId((d: PathNodeData) => d.name)\n .nodeAlign(Sankey.sankeyJustify)\n .nodeSort(null)\n .nodeWidth(15)\n .size([width, height])\n}\n\nconst appendPathNodes = (\n svg: any,\n nodes: PathNodeData[],\n pathsFilter: PathsFilter,\n funnelPathsFilter: FunnelPathsFilter,\n setNodeCards: Dispatch>\n): void => {\n svg.append('g')\n .selectAll('rect')\n .data(nodes)\n .join('rect')\n .attr('x', (d: PathNodeData) => d.x0 + 1)\n .attr('y', (d: PathNodeData) => d.y0)\n .attr('height', (d: PathNodeData) => d.y1 - d.y0)\n .attr('width', (d: PathNodeData) => d.x1 - d.x0 - 2)\n .attr('fill', (d: PathNodeData) => {\n let c\n for (const link of d.sourceLinks) {\n if (c === undefined) {\n c = link.color\n } else if (c !== link.color) {\n c = null\n }\n }\n if (c === undefined) {\n for (const link of d.targetLinks) {\n if (c === undefined) {\n c = link.color\n } else if (c !== link.color) {\n c = null\n }\n }\n }\n if (isSelectedPathStartOrEnd(pathsFilter, funnelPathsFilter, d)) {\n return d3.color('purple')\n }\n const startNodeColor = c && d3.color(c) ? d3.color(c) : d3.color('#5375ff')\n return startNodeColor\n })\n .on('mouseover', (_event: MouseEvent, data: PathNodeData) => {\n if (data.y1 - data.y0 > HIDE_PATH_CARD_HEIGHT) {\n return\n }\n setNodeCards(\n nodes.map((node: PathNodeData) =>\n node.index === data.index\n ? { ...node, visible: true }\n : { ...node, visible: node.y1 - node.y0 > HIDE_PATH_CARD_HEIGHT }\n )\n )\n })\n .append('title')\n .text((d: PathNodeData) => `${stripHTTP(d.name)}\\n${d.value.toLocaleString()}`)\n}\n\nconst appendDropoffs = (svg: D3Selector): void => {\n const dropOffGradient = svg\n .append('defs')\n .append('linearGradient')\n .attr('id', 'dropoff-gradient')\n .attr('gradientTransform', 'rotate(90)')\n\n dropOffGradient.append('stop').attr('offset', '0%').attr('stop-color', 'rgba(220,53,69,0.7)')\n\n dropOffGradient.append('stop').attr('offset', '100%').attr('stop-color', 'var(--bg-light)')\n}\n\nconst appendPathLinks = (\n svg: any,\n links: PathNodeData[],\n nodes: PathNodeData[],\n setNodeCards: Dispatch>\n): void => {\n const link = svg\n .append('g')\n .attr('fill', 'none')\n .selectAll('g')\n .data(links)\n .join('g')\n .attr('stroke', 'var(--primary)')\n .attr('opacity', 0.35)\n\n link.append('path')\n .attr('d', Sankey.sankeyLinkHorizontal())\n .attr('id', (d: PathNodeData) => `path-${d.index}`)\n .attr('stroke-width', (d: PathNodeData) => {\n return Math.max(1, d.width)\n })\n .on('mouseover', (_event: MouseEvent, data: PathNodeData) => {\n svg.select(`#path-${data.index}`).attr('stroke', 'blue')\n if (data?.source?.targetLinks.length === 0) {\n return\n }\n const nodesToColor = [data.source]\n const pathCardsToShow: number[] = []\n while (nodesToColor.length > 0) {\n const _node = nodesToColor.pop()\n _node?.targetLinks.forEach((_link: PathTargetLink) => {\n svg.select(`#path-${_link.index}`).attr('stroke', 'blue')\n nodesToColor.push(_link.source)\n pathCardsToShow.push(_link.source.index)\n })\n }\n const pathCards = [data.target]\n pathCardsToShow.push(data.target.index, data.source.index)\n while (pathCards.length > 0) {\n const node = pathCards.pop()\n node?.sourceLinks.forEach((l: PathTargetLink) => {\n pathCards.push(l.target)\n pathCardsToShow.push(l.target.index)\n })\n }\n setNodeCards(\n nodes.map((node: PathNodeData) => ({\n ...node,\n ...{\n visible: pathCardsToShow.includes(node.index)\n ? true\n : node.y1 - node.y0 > HIDE_PATH_CARD_HEIGHT,\n },\n }))\n )\n })\n .on('mouseleave', () => {\n svg.selectAll('path').attr('stroke', 'var(--primary)')\n })\n\n link.append('g')\n .append('path')\n .attr('d', (data: PathNodeData) => {\n if (data.source.layer === 0) {\n return\n }\n const _height =\n data.source.y1 - data.source.y0 - data.source.sourceLinks.reduce((prev, curr) => prev + curr.width, 0)\n return roundedRect(0, 0, 30, _height, Math.min(25, _height), false, true, false, false)\n })\n .attr('fill', 'url(#dropoff-gradient)')\n .attr('stroke-width', 0)\n .attr('transform', (data: PathNodeData) => {\n return (\n 'translate(' +\n Math.round(data.source.x1) +\n ',' +\n Math.round(data.source.y0 + data.source.sourceLinks.reduce((prev, curr) => prev + curr.width, 0)) +\n ')'\n )\n })\n}\n\nconst addChartAxisLines = (svg: D3Selector, height: number, nodes: PathNodeData[], maxLayer: number): void => {\n if (maxLayer > 5) {\n const arr = [...Array(maxLayer)]\n const minWidthApart = nodes[1].x0 - nodes[0].x0\n arr.forEach((_, i) => {\n svg.append('line')\n .style('stroke', 'var(--border)')\n .attr('stroke-width', 2)\n .attr('x1', minWidthApart * (i + 1) - 20)\n .attr('y1', 0)\n .attr('x2', minWidthApart * (i + 1) - 20)\n .attr('y2', height)\n })\n }\n}\n\nexport function renderPaths(\n canvasRef: RefObject,\n canvasWidth: number,\n canvasHeight: number,\n paths: { links: PathNode[]; nodes: any[] },\n pathsFilter: PathsFilter,\n funnelPathsFilter: FunnelPathsFilter,\n setNodeCards: Dispatch>\n): void {\n if (!paths || paths.nodes.length === 0) {\n return\n }\n\n const maxLayer = paths.links.reduce((prev, curr) => {\n // @ts-expect-error - sometimes target is an object instead of string\n const currNum = curr.target.name || curr.target\n return Math.max(prev, Number(currNum.match(/[^_]*/)))\n }, 0)\n\n const minWidth = canvasWidth > FALLBACK_CANVAS_WIDTH || maxLayer < 3 ? canvasWidth : FALLBACK_CANVAS_WIDTH\n\n const width = maxLayer > 5 && canvasWidth ? (minWidth / 5) * maxLayer : minWidth\n const height = canvasHeight\n\n const svg = createCanvas(canvasRef, width, height)\n const sankey = createSankey(width, height)\n const { nodes, links } = sankey({\n nodes: paths.nodes.map((d) => ({ ...d })),\n links: paths.links.map((d) => ({ ...d })),\n })\n\n setNodeCards(nodes.map((node: PathNodeData) => ({ ...node, visible: node.y1 - node.y0 > HIDE_PATH_CARD_HEIGHT })))\n\n appendPathNodes(svg, nodes, pathsFilter, funnelPathsFilter, setNodeCards)\n appendDropoffs(svg)\n appendPathLinks(svg, links, nodes, setNodeCards)\n addChartAxisLines(svg, height, nodes, maxLayer)\n}\n","import { LemonDialog, lemonToast, Link } from '@posthog/lemon-ui'\nimport { actions, afterMount, connect, kea, listeners, path, reducers, selectors } from 'kea'\nimport { FieldNamePath, forms } from 'kea-forms'\nimport { loaders } from 'kea-loaders'\nimport { router, urlToAction } from 'kea-router'\nimport api, { getJSONOrNull } from 'lib/api'\nimport { FEATURE_FLAGS } from 'lib/constants'\nimport { dayjs } from 'lib/dayjs'\nimport { LemonBannerAction } from 'lib/lemon-ui/LemonBanner/LemonBanner'\nimport { lemonBannerLogic } from 'lib/lemon-ui/LemonBanner/lemonBannerLogic'\nimport { LemonButtonPropsBase } from 'lib/lemon-ui/LemonButton'\nimport { featureFlagLogic } from 'lib/logic/featureFlagLogic'\nimport { pluralize } from 'lib/utils'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\nimport posthog from 'posthog-js'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { userLogic } from 'scenes/userLogic'\n\nimport { BillingPlanType, BillingProductV2Type, BillingType, ProductKey } from '~/types'\n\nimport type { billingLogicType } from './billingLogicType'\nimport { DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD } from './CreditCTAHero'\n\nexport const ALLOCATION_THRESHOLD_ALERT = 0.85 // Threshold to show warning of event usage near limit\nexport const ALLOCATION_THRESHOLD_BLOCK = 1.2 // Threshold to block usage\n\nexport interface BillingAlertConfig {\n status: 'info' | 'warning' | 'error'\n title: string\n message?: string\n contactSupport?: boolean\n buttonCTA?: string\n dismissKey?: string\n action?: LemonBannerAction\n pathName?: string\n onClose?: () => void\n}\n\nexport enum BillingAPIErrorCodes {\n OPEN_INVOICES_ERROR = 'open_invoices_error',\n NO_ACTIVE_PAYMENT_METHOD_ERROR = 'no_active_payment_method_error',\n COULD_NOT_PAY_INVOICES_ERROR = 'could_not_pay_invoices_error',\n}\n\nexport interface UnsubscribeError {\n detail: string | JSX.Element\n link: JSX.Element\n}\n\nexport interface BillingError {\n status: 'info' | 'warning' | 'error'\n message: string\n action: LemonButtonPropsBase\n}\n\nconst parseBillingResponse = (data: Partial): BillingType => {\n if (data.billing_period) {\n data.billing_period = {\n current_period_start: dayjs(data.billing_period.current_period_start),\n current_period_end: dayjs(data.billing_period.current_period_end),\n interval: data.billing_period.interval,\n }\n }\n\n data.free_trial_until = data.free_trial_until ? dayjs(data.free_trial_until) : undefined\n data.amount_off_expires_at = data.amount_off_expires_at ? dayjs(data.amount_off_expires_at) : undefined\n // If expiration is in the middle of the current period, we let it expire at the end of the period\n if (\n data.amount_off_expires_at &&\n data.billing_period &&\n data.amount_off_expires_at.isBefore(data.billing_period.current_period_end) &&\n data.amount_off_expires_at.isAfter(data.billing_period.current_period_start)\n ) {\n data.amount_off_expires_at = data.billing_period.current_period_end\n }\n\n return data as BillingType\n}\n\nexport const billingLogic = kea([\n path(['scenes', 'billing', 'billingLogic']),\n actions({\n setProductSpecificAlert: (productSpecificAlert: BillingAlertConfig | null) => ({ productSpecificAlert }),\n setScrollToProductKey: (scrollToProductKey: ProductKey | null) => ({ scrollToProductKey }),\n setShowLicenseDirectInput: (show: boolean) => ({ show }),\n reportBillingAlertShown: (alertConfig: BillingAlertConfig) => ({ alertConfig }),\n reportBillingAlertActionClicked: (alertConfig: BillingAlertConfig) => ({ alertConfig }),\n reportCreditsFormSubmitted: (creditInput: number) => ({ creditInput }),\n reportCreditsModalShown: true,\n reportBillingShown: true,\n registerInstrumentationProps: true,\n reportCreditsCTAShown: (creditOverview: any) => ({ creditOverview }),\n setRedirectPath: true,\n setIsOnboarding: true,\n determineBillingAlert: true,\n setUnsubscribeError: (error: null | UnsubscribeError) => ({ error }),\n resetUnsubscribeError: true,\n setBillingAlert: (billingAlert: BillingAlertConfig | null) => ({ billingAlert }),\n showPurchaseCreditsModal: (isOpen: boolean) => ({ isOpen }),\n toggleCreditCTAHeroDismissed: (isDismissed: boolean) => ({ isDismissed }),\n setComputedDiscount: (discount: number) => ({ discount }),\n }),\n connect(() => ({\n values: [featureFlagLogic, ['featureFlags'], preflightLogic, ['preflight']],\n actions: [\n userLogic,\n ['loadUser'],\n eventUsageLogic,\n ['reportProductUnsubscribed'],\n lemonBannerLogic({ dismissKey: 'usage-limit-exceeded' }),\n ['resetDismissKey as resetUsageLimitExceededKey'],\n lemonBannerLogic({ dismissKey: 'usage-limit-approaching' }),\n ['resetDismissKey as resetUsageLimitApproachingKey'],\n ],\n })),\n reducers({\n billingAlert: [\n null as BillingAlertConfig | null,\n {\n setBillingAlert: (_, { billingAlert }) => billingAlert,\n },\n ],\n scrollToProductKey: [\n null as ProductKey | null,\n {\n setScrollToProductKey: (_, { scrollToProductKey }) => scrollToProductKey,\n },\n ],\n productSpecificAlert: [\n null as BillingAlertConfig | null,\n {\n setProductSpecificAlert: (_, { productSpecificAlert }) => productSpecificAlert,\n },\n ],\n showLicenseDirectInput: [\n false,\n {\n setShowLicenseDirectInput: (_, { show }) => show,\n },\n ],\n redirectPath: [\n '' as string,\n {\n setRedirectPath: () => {\n return window.location.pathname.includes('/onboarding')\n ? window.location.pathname + window.location.search\n : ''\n },\n },\n ],\n isOnboarding: [\n false,\n {\n setIsOnboarding: () => window.location.pathname.includes('/onboarding'),\n },\n ],\n unsubscribeError: [\n null as null | UnsubscribeError,\n {\n resetUnsubscribeError: () => null,\n setUnsubscribeError: (_, { error }) => error,\n },\n ],\n timeRemainingInSeconds: [\n 0,\n {\n loadBillingSuccess: (_, { billing }) => {\n if (!billing?.billing_period) {\n return 0\n }\n const currentTime = dayjs()\n const periodEnd = dayjs(billing.billing_period.current_period_end)\n return periodEnd.diff(currentTime, 'second')\n },\n },\n ],\n timeTotalInSeconds: [\n 0,\n {\n loadBillingSuccess: (_, { billing }) => {\n if (!billing?.billing_period) {\n return 0\n }\n const periodStart = dayjs(billing.billing_period.current_period_start)\n const periodEnd = dayjs(billing.billing_period.current_period_end)\n return periodEnd.diff(periodStart, 'second')\n },\n },\n ],\n isPurchaseCreditsModalOpen: [\n false,\n {\n showPurchaseCreditsModal: (_, { isOpen }) => isOpen,\n },\n ],\n isCreditCTAHeroDismissed: [\n false,\n { persist: true },\n {\n toggleCreditCTAHeroDismissed: (_, { isDismissed }) => isDismissed,\n },\n ],\n computedDiscount: [\n 0,\n {\n setComputedDiscount: (_, { discount }) => discount,\n },\n ],\n }),\n loaders(({ actions, values }) => ({\n billing: [\n null as BillingType | null,\n {\n loadBilling: async () => {\n // Note: this is a temporary flag to skip forecasting in the billing page\n // for customers running into performance issues until we have a more permanent fix\n // of splitting the billing and forecasting data.\n const skipForecasting = values.featureFlags[FEATURE_FLAGS.BILLING_SKIP_FORECASTING]\n const response = await api.get(\n 'api/billing' + (skipForecasting ? '?include_forecasting=false' : '')\n )\n\n return parseBillingResponse(response)\n },\n\n updateBillingLimits: async (limits: { [key: string]: number | null }) => {\n try {\n const response = await api.update('api/billing', { custom_limits_usd: limits })\n lemonToast.success('Billing limits updated')\n return parseBillingResponse(response)\n } catch (error: any) {\n lemonToast.error(\n 'There was an error updating your billing limits. Please try again or contact support.'\n )\n throw error\n }\n },\n\n deactivateProduct: async (key: string) => {\n // clear upgrade params from URL\n // Note(@zach): This is not working properly. We need to look into this.\n const currentURL = new URL(window.location.href)\n currentURL.searchParams.delete('upgraded')\n currentURL.searchParams.delete('products')\n router.actions.push(currentURL.pathname + currentURL.search)\n\n actions.resetUnsubscribeError()\n try {\n const response = await api.getResponse('api/billing/deactivate?products=' + key)\n const jsonRes = await getJSONOrNull(response)\n\n lemonToast.success(\n \"You have been unsubscribed. We're sad to see you go. May the hedgehogs be ever in your favor.\"\n )\n actions.reportProductUnsubscribed(key)\n\n return parseBillingResponse(jsonRes)\n } catch (error: any) {\n if (error.code) {\n if (error.code === BillingAPIErrorCodes.OPEN_INVOICES_ERROR) {\n actions.setUnsubscribeError({\n detail: error.detail,\n link: (\n \n View invoices\n \n ),\n } as UnsubscribeError)\n } else if (error.code === BillingAPIErrorCodes.NO_ACTIVE_PAYMENT_METHOD_ERROR) {\n actions.setUnsubscribeError({\n detail: error.detail,\n } as UnsubscribeError)\n } else if (error.code === BillingAPIErrorCodes.COULD_NOT_PAY_INVOICES_ERROR) {\n actions.setUnsubscribeError({\n detail: error.detail,\n link: (\n \n {error.link ? 'View invoice' : 'View invoices'}\n \n ),\n } as UnsubscribeError)\n }\n } else {\n actions.setUnsubscribeError({\n detail:\n typeof error.detail === 'string'\n ? error.detail\n : `We encountered a problem. Please try again or submit a support ticket.`,\n } as UnsubscribeError)\n }\n console.error(error)\n // This is a bit of a hack to prevent the page from re-rendering.\n return values.billing\n }\n },\n },\n ],\n billingError: [\n null as BillingError | null,\n {\n getInvoices: async () => {\n // First check to see if there are open invoices\n try {\n const res = await api.getResponse('api/billing/get_invoices?status=open')\n const jsonRes = await getJSONOrNull(res)\n const numOpenInvoices = jsonRes['count']\n if (numOpenInvoices > 0) {\n const viewInvoicesButton = {\n to:\n numOpenInvoices == 1 && jsonRes['link']\n ? jsonRes['link']\n : values.billing?.stripe_portal_url,\n children: `View invoice${numOpenInvoices > 1 ? 's' : ''}`,\n targetBlank: true,\n }\n return {\n status: 'warning',\n message: `You have ${numOpenInvoices} open invoice${\n numOpenInvoices > 1 ? 's' : ''\n }. Please pay ${\n numOpenInvoices > 1 ? 'them' : 'it'\n } before adding items to your subscription.`,\n action: viewInvoicesButton,\n }\n }\n } catch (error: any) {\n console.error(error)\n }\n return null\n },\n },\n ],\n creditOverview: [\n {\n eligible: false,\n estimated_monthly_credit_amount_usd: DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD,\n status: 'none',\n invoice_url: null,\n collection_method: null,\n cc_last_four: null,\n email: null,\n },\n {\n loadCreditOverview: async () => {\n // Check if the user is subscribed\n if (values.billing?.has_active_subscription) {\n const response = await api.get('api/billing/credits/overview')\n if (!values.creditForm.creditInput) {\n actions.setCreditFormValue(\n 'creditInput',\n Math.round(\n (response.estimated_monthly_credit_amount_usd ||\n DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD) * 12\n )\n )\n }\n\n if (response.eligible && response.status === 'none') {\n actions.reportCreditsCTAShown(response)\n }\n return response\n }\n // Return default values if not subscribed\n return {\n eligible: false,\n estimated_monthly_credit_amount_usd: DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD,\n status: 'none',\n invoice_url: null,\n collection_method: null,\n cc_last_four: null,\n email: null,\n }\n },\n },\n ],\n products: [\n [] as BillingProductV2Type[],\n {\n loadProducts: async () => {\n const response = await api.get('api/billing/available_products')\n return response\n },\n },\n ],\n })),\n selectors({\n upgradeLink: [(s) => [s.preflight], (): string => '/organization/billing'],\n isUnlicensedDebug: [\n (s) => [s.preflight, s.billing],\n (preflight, billing): boolean => !!preflight?.is_debug && !billing?.billing_period,\n ],\n projectedTotalAmountUsdWithBillingLimits: [\n (s) => [s.billing],\n (billing: BillingType): number => {\n if (!billing) {\n return 0\n }\n let projectedTotal = 0\n for (const product of billing.products || []) {\n const billingLimit =\n billing?.custom_limits_usd?.[product.type] ||\n (product.usage_key ? billing?.custom_limits_usd?.[product.usage_key] || 0 : 0)\n projectedTotal += Math.min(parseFloat(product.projected_amount_usd || '0'), billingLimit)\n }\n return projectedTotal\n },\n ],\n supportPlans: [\n (s) => [s.billing],\n (billing: BillingType): BillingPlanType[] => {\n const platformAndSupportProduct = billing?.products?.find(\n (product) => product.type == ProductKey.PLATFORM_AND_SUPPORT\n )\n if (!platformAndSupportProduct?.plans) {\n return []\n }\n\n const addonPlans = platformAndSupportProduct?.addons?.map((addon) => addon.plans).flat()\n const insertionIndex = Math.max(0, (platformAndSupportProduct?.plans?.length ?? 1) - 1)\n const allPlans = platformAndSupportProduct?.plans?.slice(0) || []\n allPlans.splice(insertionIndex, 0, ...addonPlans)\n return allPlans\n },\n ],\n hasSupportAddonPlan: [\n (s) => [s.billing],\n (billing: BillingType): boolean => {\n return !!billing?.products\n ?.find((product) => product.type == ProductKey.PLATFORM_AND_SUPPORT)\n ?.addons.find((addon) => addon.plans.find((plan) => plan.current_plan))\n },\n ],\n creditDiscount: [(s) => [s.computedDiscount], (computedDiscount) => computedDiscount || 0],\n }),\n forms(({ actions, values }) => ({\n activateLicense: {\n defaults: { license: '' } as { license: string },\n errors: ({ license }) => ({\n license: !license ? 'Please enter your license key' : undefined,\n }),\n submit: async ({ license }, breakpoint) => {\n await breakpoint(500)\n try {\n await api.update('api/billing/license', {\n license,\n })\n\n // Reset the URL so we don't trigger the license submission again\n router.actions.replace(\n `/${values.isOnboarding ? 'ingestion' : 'organization'}/billing?success=true`\n )\n setTimeout(() => {\n window.location.reload() // Permissions, projects etc will be out of date at this point, so refresh\n }, 100)\n } catch (e: any) {\n actions.setActivateLicenseManualErrors({\n license: e.detail || 'License could not be activated. Please contact support.',\n })\n throw e\n }\n },\n },\n creditForm: {\n defaults: {\n creditInput: '',\n collectionMethod: 'charge_automatically',\n },\n submit: async ({ creditInput, collectionMethod }) => {\n await api.create('api/billing/credits/purchase', {\n annual_amount_usd: +Math.round(+creditInput - +creditInput * values.creditDiscount),\n discount_percent: values.computedDiscount * 100,\n collection_method: collectionMethod,\n })\n\n actions.showPurchaseCreditsModal(false)\n actions.loadCreditOverview()\n actions.reportCreditsFormSubmitted(+creditInput)\n\n LemonDialog.open({\n title: 'Your credit purchase has been submitted',\n width: 536,\n content:\n collectionMethod === 'send_invoice' ? (\n <>\n

\n The invoice for your credits has been created and it will be emailed to the email on\n file.\n

\n

\n Once the invoice is paid we will apply the credits to your account. Until the\n invoice is paid you will be charged for usage as normal.\n

\n \n ) : (\n <>\n

\n Your card will be charged soon and the credits will be applied to your account.\n Please make sure your{' '}\n \n card on file\n {' '}\n is up to date. You will receive an email when the credits are applied.\n

\n \n ),\n })\n },\n errors: ({ creditInput, collectionMethod }) => ({\n creditInput: !creditInput\n ? 'Please enter the amount of credits you want to purchase'\n : // This value is used because 3333 - 10% = 3000\n +creditInput < 3333\n ? 'Please enter a credit amount of at least $3,333'\n : undefined,\n collectionMethod: !collectionMethod ? 'Please select a collection method' : undefined,\n }),\n },\n })),\n listeners(({ actions, values }) => ({\n reportBillingShown: () => {\n posthog.capture('billing v2 shown')\n },\n reportBillingAlertShown: ({ alertConfig }) => {\n posthog.capture('billing alert shown', {\n ...alertConfig,\n })\n },\n reportBillingAlertActionClicked: ({ alertConfig }) => {\n posthog.capture('billing alert action clicked', {\n ...alertConfig,\n })\n },\n reportCreditsModalShown: () => {\n posthog.capture('credits modal shown')\n },\n reportCreditsFormSubmitted: ({ creditInput }) => {\n posthog.capture('credits modal credit form submitted', {\n credit_amount_usd: creditInput,\n })\n },\n reportCreditsCTAShown: ({ creditOverview }) => {\n posthog.capture('credits cta shown', {\n eligible: creditOverview.eligible,\n status: creditOverview.status,\n estimated_monthly_credit_amount_usd:\n creditOverview.estimated_monthly_credit_amount_usd || DEFAULT_ESTIMATED_MONTHLY_CREDIT_AMOUNT_USD,\n })\n },\n toggleCreditCTAHeroDismissed: ({ isDismissed }) => {\n if (isDismissed) {\n posthog.capture('credits cta hero dismissed')\n }\n },\n loadBillingSuccess: () => {\n if (\n router.values.location.pathname.includes('/organization/billing') &&\n router.values.searchParams['success']\n ) {\n // if the activation is successful, we reload the user to get the updated billing info on the organization\n actions.loadUser()\n router.actions.replace('/organization/billing')\n }\n actions.registerInstrumentationProps()\n\n actions.determineBillingAlert()\n\n actions.loadCreditOverview()\n },\n determineBillingAlert: () => {\n if (values.productSpecificAlert) {\n actions.setBillingAlert(values.productSpecificAlert)\n return\n }\n\n if (!values.billing || !values.preflight?.cloud) {\n return\n }\n\n if (values.billing.free_trial_until && values.billing.free_trial_until.isAfter(dayjs())) {\n const remainingDays = values.billing.free_trial_until.diff(dayjs(), 'days')\n const remainingHours = values.billing.free_trial_until.diff(dayjs(), 'hours')\n\n if (remainingHours > 72) {\n return\n }\n\n actions.setBillingAlert({\n status: 'info',\n title: `Your free trial will end in ${\n remainingHours < 24 ? pluralize(remainingHours, 'hour') : pluralize(remainingDays, 'day')\n }.`,\n message: `Setup billing now to ensure you don't lose access to premium features.`,\n })\n return\n }\n\n if (values.billing.deactivated) {\n actions.setBillingAlert({\n status: 'error',\n title: 'Your organization has been temporarily suspended.',\n message: 'Please contact support to reactivate it.',\n contactSupport: true,\n })\n return\n }\n\n const productOverLimit = values.billing.products?.find((x: BillingProductV2Type) => {\n return x.percentage_usage > 1 && x.usage_key\n })\n\n if (productOverLimit) {\n actions.setBillingAlert({\n status: 'error',\n title: 'Usage limit exceeded',\n message: `You have exceeded the usage limit for ${productOverLimit.name}. Please \n ${productOverLimit.subscribed ? 'increase your billing limit' : 'upgrade your plan'}\n or ${\n productOverLimit.name === 'Data warehouse'\n ? 'data will not be synced'\n : 'data loss may occur'\n }.`,\n dismissKey: 'usage-limit-exceeded',\n })\n return\n }\n\n actions.resetUsageLimitExceededKey()\n\n const productApproachingLimit = values.billing.products?.find(\n (x) => x.percentage_usage > ALLOCATION_THRESHOLD_ALERT\n )\n\n if (productApproachingLimit) {\n actions.setBillingAlert({\n status: 'info',\n title: 'You will soon hit your usage limit',\n message: `You have currently used ${parseFloat(\n (productApproachingLimit.percentage_usage * 100).toFixed(2)\n )}% of your ${\n productApproachingLimit.usage_key && productApproachingLimit.usage_key.toLowerCase()\n } allocation.`,\n dismissKey: 'usage-limit-approaching',\n })\n return\n }\n\n actions.resetUsageLimitApproachingKey()\n },\n setCreditFormValue: ({ name, value }) => {\n if (name === 'creditInput' || (name as FieldNamePath)?.[0] === 'creditInput') {\n const spend = +value\n let discount = 0\n if (spend >= 100000) {\n discount = 0.35\n } else if (spend >= 60000) {\n discount = 0.25\n } else if (spend >= 20000) {\n discount = 0.2\n } else if (spend >= 3000) {\n discount = 0.1\n }\n actions.setComputedDiscount(discount)\n }\n },\n registerInstrumentationProps: async (_, breakpoint) => {\n await breakpoint(100)\n if (posthog && values.billing) {\n const payload = {\n has_billing_plan: !!values.billing.has_active_subscription,\n free_trial_until: values.billing.free_trial_until?.toISOString(),\n customer_deactivated: values.billing.deactivated,\n current_total_amount_usd: values.billing.current_total_amount_usd,\n }\n if (values.billing.custom_limits_usd) {\n for (const product of Object.keys(values.billing.custom_limits_usd)) {\n payload[`custom_limits_usd.${product}`] = values.billing.custom_limits_usd[product]\n }\n }\n if (values.billing.products) {\n for (const product of values.billing.products) {\n const type = product.type.toLowerCase()\n payload[`percentage_usage.${type}`] = product.percentage_usage\n payload[`current_amount_usd.${type}`] = product.current_amount_usd\n payload[`unit_amount_usd.${type}`] = product.unit_amount_usd\n payload[`usage_limit.${type}`] = product.usage_limit\n payload[`current_usage.${type}`] = product.current_usage\n payload[`projected_usage.${type}`] = product.projected_usage\n payload[`free_allocation.${type}`] = product.free_allocation\n }\n }\n if (values.billing.billing_period) {\n payload['billing_period_start'] = values.billing.billing_period.current_period_start\n payload['billing_period_end'] = values.billing.billing_period.current_period_end\n }\n posthog.register(payload)\n }\n },\n showPurchaseCreditsModal: ({ isOpen }) => {\n if (isOpen) {\n actions.reportCreditsModalShown()\n }\n },\n })),\n afterMount(({ actions }) => {\n actions.loadBilling()\n actions.getInvoices()\n }),\n urlToAction(({ actions }) => ({\n // IMPORTANT: This needs to be above the \"*\" so it takes precedence\n '/*/billing': (_params, _search, hash) => {\n if (hash.license) {\n actions.setShowLicenseDirectInput(true)\n actions.setActivateLicenseValues({ license: hash.license })\n actions.submitActivateLicense()\n }\n if (_search.products) {\n const products = _search.products.split(',')\n actions.setScrollToProductKey(products[0])\n }\n if (_search.billing_error) {\n actions.setBillingAlert({\n status: 'error',\n title: 'Error',\n message: _search.billing_error,\n })\n }\n actions.setRedirectPath()\n actions.setIsOnboarding()\n },\n '*': () => {\n actions.setRedirectPath()\n actions.setIsOnboarding()\n },\n })),\n])\n","import { LemonCollapse, LemonModal, Link } from '@posthog/lemon-ui'\nimport { useValues } from 'kea'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport EarlyAccessFeatureImage from 'public/early-access-feature-demo.png'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\nimport { urls } from 'scenes/urls'\n\nimport { FeatureFlagType, PipelineStage, Region } from '~/types'\n\ninterface InstructionsModalProps {\n flag: FeatureFlagType['key']\n visible: boolean\n onClose: () => void\n}\n\nexport function InstructionsModal({ onClose, visible, flag }: InstructionsModalProps): JSX.Element {\n const { preflight } = useValues(preflightLogic)\n\n const getCloudPanels = (): JSX.Element => (\n \n Give your users a{' '}\n \n prebuilt widget\n {' '}\n to opt-in to features\n \n \n ),\n },\n {\n key: '2',\n header: 'Option 2: Custom implementation',\n content: (\n
\n Opt user in\n
\n \n
\n\n Opt user out\n
\n \n
\n\n Retrieve Previews\n
\n \n
\n
\n ),\n },\n ]}\n />\n )\n\n const getSelfHostedPanels = (): JSX.Element => (\n
\n Opt user in\n
\n \n
\n\n Opt user out\n
\n \n
\n\n Retrieve Previews\n
\n \n
\n
\n )\n\n const panels: JSX.Element = preflight?.cloud ? getCloudPanels() : getSelfHostedPanels()\n\n return (\n \n
\n
\n Implement manual release condition toggles to give your users the ability choose which features they\n want to try\n
\n {panels}\n
\n
\n )\n}\n\nfunction FeatureEnrollInstructions({ flag }: { flag: string }): JSX.Element {\n return (\n \n {`posthog.updateEarlyAccessFeatureEnrollment(\"${flag}\", true)\n`}\n \n )\n}\n\nfunction FeatureUnenrollInstructions({ flag }: { flag: string }): JSX.Element {\n return (\n \n {`posthog.updateEarlyAccessFeatureEnrollment(\"${flag}\", false)\n`}\n \n )\n}\n\nfunction RetrievePreviewsInstructions(): JSX.Element {\n return (\n \n {`posthog.getEarlyAccessFeatures((previewItemData) => {\n // do something with early access feature\n})\n`}\n \n )\n}\n","import { useValues } from 'kea'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport { apiHostOrigin } from 'lib/utils/apiHost'\nimport { teamLogic } from 'scenes/teamLogic'\n\nimport { GroupType } from '~/types'\n\nexport const UTM_TAGS = '?utm_medium=in-product&utm_campaign=feature-flag'\n\nexport interface FeatureFlagSnippet {\n flagKey: string\n multivariant?: boolean\n groupType?: GroupType\n localEvaluation?: boolean\n payload?: boolean\n samplePropertyName?: string\n instantlyAvailableProperties?: boolean\n}\n\nconst LOCAL_EVAL_REMINDER = `Remember to set a personal API key in the SDK to enable local evaluation.\n`\n\nexport function NodeJSSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n payload,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'await client.'\n const flagFunction = payload ? 'getFeatureFlagPayload' : multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n // add group properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n groupProperties: { ${groupType.group_type}: {'${propertyName}': 'value', 'name': 'xyz'}}`\n : `\n // add person properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n personProperties: {'${propertyName}': 'value'}`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${\n payload\n ? `\n undefined,`\n : ''\n }\n {\n groups: { '${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>' },${localEvalAddition}\n }\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${\n payload\n ? `\n undefined,`\n : ''\n }\n {${localEvalAddition}\n }\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n\n const variableName = payload ? 'matchedFlagPayload' : multivariant ? 'enabledVariant' : 'isMyFlagEnabledForUser'\n\n const conditional = multivariant ? `${variableName} === 'example-variant'` : `${variableName}`\n\n const followUpCode = payload\n ? ''\n : `\n\nif (${conditional}) {\n // Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n}`\n\n return (\n <>\n \n {`${\n localEvaluation ? '// ' + LOCAL_EVAL_REMINDER : ''\n }const ${variableName} = ${flagSnippet}${followUpCode}`}\n \n \n )\n}\n\nexport function PHPSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'PostHog::'\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n // empty person properties\n [],\n // add group properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n [${groupType.group_type} => ['${propertyName}' => 'value', 'name' => 'xyz']]`\n : `\n // add person properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n ['${propertyName}' => 'value']`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',\n // group types\n ['${groupType.group_type}' => '<${groupType.name_singular || 'group'} ID>'],${localEvalAddition}\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${localEvalAddition}\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n const variableName = multivariant ? '$enabledVariant' : '$isMyFlagEnabledForUser'\n\n const conditional = multivariant ? `${variableName} === 'example-variant'` : `${variableName}`\n\n return (\n <>\n \n {`${localEvaluation ? '// ' + LOCAL_EVAL_REMINDER : ''}${variableName} = ${flagSnippet}\n\nif (${conditional}) {\n // Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n}`}\n \n \n )\n}\n\nexport function GolangSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'client.'\n\n const flagFunction = multivariant ? 'GetFeatureFlag' : 'IsFeatureEnabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n // add group properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n groupProperties: map[string]Properties{\"${groupType.group_type}\": posthog.NewProperties().Set(\"${propertyName}\", \"value\").Set(\"name\", \"xyz\")}`\n : `\n // add person properties used in the flag to ensure the flag\n // is evaluated locally, vs. going to our servers\n PersonProperties: posthog.NewProperties().Set(\"${propertyName}\", \"value\")`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n FeatureFlagPayload{\n Key: \"${flagKey}\",\n DistinctId: \"distinct-id\",\n Groups: Groups{'${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>'},${localEvalAddition}\n }\n)`\n : `${clientSuffix}${flagFunction}(\n FeatureFlagPayload{\n Key: '${flagKey}',\n DistinctId: \"distinct-id\",${localEvalAddition}\n })`\n const variableName = multivariant ? 'enabledVariant, err' : 'isMyFlagEnabledForUser, err'\n\n const conditional = multivariant ? `enabledVariant == 'example-variant'` : `isMyFlagEnabledForUser`\n\n return (\n <>\n \n {`${localEvaluation ? '// ' + LOCAL_EVAL_REMINDER : ''}${variableName} := ${flagSnippet}\n\nif ${conditional} {\n // Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n}`}\n \n \n )\n}\n\nexport function RubySnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n payload,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'posthog.'\n const flagFunction = payload ? 'get_feature_flag_payload' : multivariant ? 'get_feature_flag' : 'is_feature_enabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n # add group properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n group_properties: { ${groupType.group_type}: {'${propertyName}': 'value', 'name': 'xyz'}}`\n : `\n # add person properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n person_properties: {'${propertyName}': 'value'}`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',\n groups: { '${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>' },${localEvalAddition}\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${localEvalAddition}\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n const variableName = payload ? 'matched_flag_payload' : multivariant ? 'enabled_variant' : 'is_my_flag_enabled'\n\n const conditional = multivariant ? `${variableName} == 'example-variant'` : `${variableName}`\n\n const followUpCode = payload\n ? ''\n : `\n\nif ${conditional}\n # Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\nend`\n\n return (\n <>\n \n {`${localEvaluation ? '# ' + LOCAL_EVAL_REMINDER : ''}${variableName} = ${flagSnippet}${followUpCode}`}\n \n \n )\n}\n\nexport function PythonSnippet({\n flagKey,\n groupType,\n multivariant,\n localEvaluation,\n payload,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'posthog.'\n const flagFunction = payload ? 'get_feature_flag_payload' : multivariant ? 'get_feature_flag' : 'feature_enabled'\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const localEvalAddition = localEvaluation\n ? groupType\n ? `\n # add group properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n group_properties={ ${groupType.group_type}: {'${propertyName}': 'value', 'name': 'xyz'}}`\n : `\n # add person properties used in the flag to ensure the flag\n # is evaluated locally, vs. going to our servers\n person_properties={'${propertyName}': 'value'}`\n : ''\n\n const flagSnippet = groupType\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',\n groups={ '${groupType.group_type}': '<${groupType.name_singular || 'group'} ID>' },${localEvalAddition}\n)`\n : localEvalAddition\n ? `${clientSuffix}${flagFunction}(\n '${flagKey}',\n 'user distinct id',${localEvalAddition}\n)`\n : `${clientSuffix}${flagFunction}('${flagKey}', 'user distinct id')`\n const variableName = payload ? 'matched_flag_payload' : multivariant ? 'enabled_variant' : 'is_my_flag_enabled'\n\n const conditional = multivariant ? `${variableName} == 'example-variant'` : `${variableName}`\n\n const followUpCode = payload\n ? ''\n : `\n\nif ${conditional}:\n # Do something differently for this ${groupType ? groupType.name_singular || 'group' : 'user'}\n`\n\n return (\n <>\n \n {`${localEvaluation ? '# ' + LOCAL_EVAL_REMINDER : ''}${variableName} = ${flagSnippet}${followUpCode}`}\n \n \n )\n}\n\nexport function AndroidSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'PostHog.'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload(\"${flagKey}\")`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == \"example-variant\"` : ''\n return (\n \n {`if (${clientSuffix}${flagFunction}(\"${flagKey}\")${variantSuffix}) {\n // do something\n}\n `}\n \n )\n}\n\nexport function FlutterSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'await Posthog().'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload('${flagKey}');`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n\n return (\n \n {`if (${clientSuffix}${flagFunction}('${flagKey}')${variantSuffix}) {\n // do something\n}\n `}\n \n )\n}\n\nexport function iOSSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'PostHogSDK.shared.'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload(\"${flagKey}\")`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? `as? String == \"example-variant\"` : ''\n return (\n \n {`if ${clientSuffix}${flagFunction}(\"${flagKey}\")${variantSuffix} {\n // do something\n}`}\n \n )\n}\n\nexport function ReactNativeSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const clientSuffix = 'posthog.'\n\n if (payload) {\n return (\n \n {`${clientSuffix}getFeatureFlagPayload('${flagKey}')`}\n \n )\n }\n\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n return (\n \n {`// With a hook\nimport { useFeatureFlag } from 'posthog-react-native'\n\nconst MyComponent = () => {\n const showFlaggedFeature = useFeatureFlag('${flagKey}')\n\n if (showFlaggedFeature === undefined) {\n // the response is undefined if the flags are being loaded\n return null\n }\n\n return showFlaggedFeature ${variantSuffix} ? Testing feature 😄 : Not Testing feature 😢\n}\n\n// Or calling on the method directly\n${clientSuffix}${flagFunction}('${flagKey}')\n `}\n \n )\n}\n\nexport function ReactSnippet({ flagKey, multivariant, payload }: FeatureFlagSnippet): JSX.Element {\n const flagFunction = payload\n ? 'useFeatureFlagPayload'\n : multivariant\n ? 'useFeatureFlagVariantKey'\n : 'useFeatureFlagEnabled'\n\n const variable = payload ? 'payload' : multivariant ? 'variant' : 'flagEnabled'\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n\n return (\n \n {`\nimport { ${flagFunction} } from 'posthog-js/react'\n\nfunction App() {\n const ${variable} = ${flagFunction}('${flagKey}')\n\n if (${variable}${variantSuffix}) {\n // do something\n }\n}`}\n \n )\n}\n\nexport function APISnippet({ groupType }: FeatureFlagSnippet): JSX.Element {\n const { currentTeam } = useValues(teamLogic)\n\n const groupAddition = groupType\n ? `\n \"groups\": { \"${groupType.group_type}\": \"<${groupType.name_singular || 'group'} ID>\" },`\n : ''\n\n return (\n <>\n \n {`curl ${apiHostOrigin()}/decide?v=3/ \\\\\n-X POST -H 'Content-Type: application/json' \\\\\n-d '{\n \"api_key\": \"${currentTeam ? currentTeam.api_token : '[project_api_key]'}\",\n \"distinct_id\": \"[user distinct id]\",${groupAddition}\n}'\n `}\n \n \n )\n}\n\nexport function JSSnippet({\n flagKey,\n multivariant,\n payload,\n groupType,\n instantlyAvailableProperties,\n samplePropertyName,\n}: FeatureFlagSnippet): JSX.Element {\n if (payload) {\n return (\n <>\n \n {`posthog.getFeatureFlagPayload('${flagKey ?? ''}')`}\n \n \n )\n }\n\n const propertyName = samplePropertyName || 'is_authorized'\n\n const propertyOverrideSnippet = `// Your flag depends on properties that are not instantly available. If you want\n// to make them available without waiting for server delays, send these properties for flag evaluation, like so:\n// Make sure to call this before evaluating flags. More info: https://posthog.com/docs/libraries/js#overriding-server-properties \nposthog.${\n groupType\n ? `setGroupPropertiesForFlags({ '${groupType.group_type}': {'${propertyName}': 'value'}})`\n : `setPersonPropertiesForFlags({'${propertyName}': 'value'})`\n }\n\n`\n\n const clientSuffix = 'posthog.'\n const flagFunction = multivariant ? 'getFeatureFlag' : 'isFeatureEnabled'\n\n const variantSuffix = multivariant ? ` == 'example-variant'` : ''\n return (\n <>\n \n {`${instantlyAvailableProperties ? '' : propertyOverrideSnippet}// Ensure flags are loaded before usage.\n// You'll only need to call this on the code for when the first time a user visits.\n${clientSuffix}onFeatureFlags(function() {\n // feature flags should be available at this point\n if (${clientSuffix}${flagFunction}('${flagKey ?? ''}') ${variantSuffix}) {\n // do something\n }\n})\n\n// Otherwise, you can just do:\nif (${clientSuffix}${flagFunction}('${flagKey ?? ''}') ${variantSuffix}) {\n // do something\n}`}\n \n \n )\n}\n\nexport function JSBootstrappingSnippet(): JSX.Element {\n return (\n \n {`// Initialise the posthog library with a distinct ID and feature flags for immediate loading\n// This avoids the delay between the library loading and feature flags becoming available to use.\n\nposthog.init('{project_api_key}', {\n api_host: '${apiHostOrigin()}'\n bootstrap:\n {\n distinctID: 'your-anonymous-id',\n featureFlags: {\n // input the flag values here from 'posthog.getAllFlags(distinct_id)' which you can find in the server-side libraries.\n // example:\n // 'flag-1': true,\n // 'variant-flag': 'control',\n // 'other-flag': false\n },\n }\n})\n `}\n \n )\n}\n","import { mergeAttributes, Node, NodeViewProps } from '@tiptap/core'\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react'\nimport { NotebookNodeType, NotebookTarget } from '~/types'\nimport { dayjs } from 'lib/dayjs'\nimport { JSONContent } from '../Notebook/utils'\nimport clsx from 'clsx'\nimport { urls } from 'scenes/urls'\nimport { LemonButton } from '@posthog/lemon-ui'\nimport { notebookLogic } from '../Notebook/notebookLogic'\nimport { useValues } from 'kea'\nimport { useMemo } from 'react'\nimport { openNotebook } from '~/models/notebooksModel'\n\nexport interface NotebookNodeReplayTimestampAttrs {\n playbackTime?: number\n sessionRecordingId: string\n sourceNodeId?: string\n}\n\nconst Component = (props: NodeViewProps): JSX.Element => {\n const { shortId, findNodeLogic, findNodeLogicById } = useValues(notebookLogic)\n const { sessionRecordingId, playbackTime = 0, sourceNodeId } = props.node.attrs as NotebookNodeReplayTimestampAttrs\n\n const relatedNodeInNotebook = useMemo(() => {\n const logicById = sourceNodeId ? findNodeLogicById(sourceNodeId) : null\n\n return logicById ?? findNodeLogic(NotebookNodeType.Recording, { id: sessionRecordingId })\n }, [findNodeLogic])\n\n const handlePlayInNotebook = (): void => {\n // TODO: Figure out how to send this action info to the playlist OR the replay node...\n\n relatedNodeInNotebook?.values.sendMessage('play-replay', {\n sessionRecordingId,\n time: playbackTime ?? 0,\n })\n }\n\n return (\n \n openNotebook(shortId, NotebookTarget.Popover)\n }\n to={\n !relatedNodeInNotebook\n ? urls.replaySingle(sessionRecordingId) + `?t=${playbackTime / 1000}`\n : undefined\n }\n >\n {formatTimestamp(playbackTime)}\n \n \n )\n}\n\nexport const NotebookNodeReplayTimestamp = Node.create({\n name: NotebookNodeType.ReplayTimestamp,\n inline: true,\n group: 'inline',\n atom: true,\n\n serializedText: (attrs: NotebookNodeReplayTimestampAttrs): string => {\n // timestamp is not a block so `getText` does not add a separator.\n // we need to add it manually\n return `${attrs.playbackTime ? formatTimestamp(attrs.playbackTime) : '00:00'}:\\n`\n },\n\n addAttributes() {\n return {\n playbackTime: { default: null, keepOnSplit: false },\n sessionRecordingId: { default: null, keepOnSplit: true, isRequired: true },\n sourceNodeId: { default: null, keepOnSplit: true },\n }\n },\n\n parseHTML() {\n return [{ tag: NotebookNodeType.ReplayTimestamp }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return [NotebookNodeType.ReplayTimestamp, mergeAttributes(HTMLAttributes)]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Component)\n },\n})\n\nexport function formatTimestamp(time: number): string {\n return dayjs.duration(time, 'milliseconds').format('HH:mm:ss').replace(/^00:/, '').trim()\n}\n\nexport function buildTimestampCommentContent(attrs: NotebookNodeReplayTimestampAttrs): JSONContent {\n return {\n type: 'paragraph',\n content: [\n {\n type: NotebookNodeType.ReplayTimestamp,\n attrs,\n },\n { type: 'text', text: ' ' },\n ],\n }\n}\n","import {\n IconCursor,\n IconFunnels,\n IconHogQL,\n IconLifecycle,\n IconPeople,\n IconRetention,\n IconRewindPlay,\n IconStickiness,\n IconTrends,\n IconUpload,\n IconUserPaths,\n} from '@posthog/icons'\nimport { IconCode } from '@posthog/icons'\nimport { LemonButton, LemonDivider, lemonToast } from '@posthog/lemon-ui'\nimport { Extension } from '@tiptap/core'\nimport { ReactRenderer } from '@tiptap/react'\nimport Suggestion from '@tiptap/suggestion'\nimport Fuse from 'fuse.js'\nimport { useValues } from 'kea'\nimport { IconBold, IconItalic } from 'lib/lemon-ui/icons'\nimport { Popover } from 'lib/lemon-ui/Popover'\nimport { selectFiles } from 'lib/utils/file-utils'\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react'\n\nimport { KeyboardShortcut } from '~/layout/navigation-3000/components/KeyboardShortcut'\nimport { defaultDataTableColumns } from '~/queries/nodes/DataTable/utils'\nimport { NodeKind } from '~/queries/schema'\nimport { BaseMathType, ChartDisplayType, FunnelVizType, NotebookNodeType, PathType, RetentionPeriod } from '~/types'\n\nimport { buildNodeEmbed } from '../Nodes/NotebookNodeEmbed'\nimport { buildInsightVizQueryContent, buildNodeQueryContent } from '../Nodes/NotebookNodeQuery'\nimport NotebookIconHeading from './NotebookIconHeading'\nimport { notebookLogic } from './notebookLogic'\nimport { EditorCommands, EditorRange } from './utils'\n\ntype SlashCommandConditionalProps =\n | {\n mode: 'add'\n getPos: () => number\n range?: never\n }\n | {\n mode: 'slash'\n getPos?: never\n range: EditorRange\n }\n\ntype SlashCommandsProps = SlashCommandConditionalProps & {\n query?: string\n decorationNode?: any\n onClose?: () => void\n}\n\ntype SlashCommandsPopoverProps = SlashCommandsProps & {\n visible: boolean\n children?: JSX.Element\n}\n\ntype SlashCommandsRef = {\n onKeyDown: (event: KeyboardEvent) => boolean\n}\n\ntype SlashCommandsItem = {\n title: string\n search?: string\n icon?: JSX.Element\n command: (chain: EditorCommands, pos: number | EditorRange) => EditorCommands | Promise\n}\n\nconst TEXT_CONTROLS: SlashCommandsItem[] = [\n {\n title: 'h1',\n icon: ,\n command: (chain) => chain.toggleHeading({ level: 1 }),\n },\n {\n title: 'h2',\n icon: ,\n command: (chain) => chain.toggleHeading({ level: 2 }),\n },\n {\n title: 'h3',\n icon: ,\n command: (chain) => chain.toggleHeading({ level: 3 }),\n },\n {\n title: 'bold',\n icon: ,\n command: (chain) => chain.toggleBold(),\n },\n {\n title: 'italic',\n icon: ,\n command: (chain) => chain.toggleItalic(),\n },\n]\n\nconst SLASH_COMMANDS: SlashCommandsItem[] = [\n {\n title: 'Trend',\n search: 'graph trend insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.TrendsQuery,\n filterTestAccounts: false,\n series: [\n {\n kind: NodeKind.EventsNode,\n event: '$pageview',\n name: '$pageview',\n math: BaseMathType.TotalCount,\n },\n ],\n interval: 'day',\n trendsFilter: {\n display: ChartDisplayType.ActionsLineGraph,\n },\n })\n ),\n },\n {\n title: 'Funnel',\n search: 'funnel insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.FunnelsQuery,\n series: [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n },\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n },\n ],\n funnelsFilter: {\n funnelVizType: FunnelVizType.Steps,\n },\n })\n ),\n },\n {\n title: 'Retention',\n search: 'retention insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.RetentionQuery,\n retentionFilter: {\n period: RetentionPeriod.Day,\n totalIntervals: 11,\n targetEntity: {\n id: '$pageview',\n name: '$pageview',\n type: 'events',\n },\n returningEntity: {\n id: '$pageview',\n name: '$pageview',\n type: 'events',\n },\n retentionType: 'retention_first_time',\n },\n })\n ),\n },\n {\n title: 'Paths',\n search: 'user paths insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.PathsQuery,\n pathsFilter: {\n includeEventTypes: [PathType.PageView],\n },\n })\n ),\n },\n {\n title: 'Stickiness',\n search: 'stickiness insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.StickinessQuery,\n series: [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n math: BaseMathType.TotalCount,\n },\n ],\n stickinessFilter: {},\n })\n ),\n },\n {\n title: 'Lifecycle',\n search: 'lifecycle insight',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildInsightVizQueryContent({\n kind: NodeKind.LifecycleQuery,\n series: [\n {\n kind: NodeKind.EventsNode,\n name: '$pageview',\n event: '$pageview',\n math: BaseMathType.TotalCount,\n },\n ],\n })\n ),\n },\n {\n title: 'HogQL',\n search: 'sql',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildNodeQueryContent({\n kind: NodeKind.DataTableNode,\n source: {\n kind: NodeKind.HogQLQuery,\n query: `select event,\n person.properties.email,\n properties.$browser,\n count()\n from events\n where {filters} -- replaced with global date and property filters\n and person.properties.email is not null\ngroup by event,\n properties.$browser,\n person.properties.email\norder by count() desc\n limit 100`,\n filters: {\n dateRange: {\n date_from: '-24h',\n },\n },\n },\n })\n ),\n },\n {\n title: 'Events',\n search: 'data explore',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildNodeQueryContent({\n kind: NodeKind.DataTableNode,\n source: {\n kind: NodeKind.EventsQuery,\n select: defaultDataTableColumns(NodeKind.EventsQuery),\n properties: [],\n after: '-24h',\n limit: 100,\n },\n })\n ),\n },\n {\n title: 'People',\n search: 'persons users',\n icon: ,\n command: (chain, pos) =>\n chain.insertContentAt(\n pos,\n buildNodeQueryContent({\n kind: NodeKind.DataTableNode,\n columns: defaultDataTableColumns(NodeKind.ActorsQuery),\n source: {\n kind: NodeKind.ActorsQuery,\n properties: [],\n },\n })\n ),\n },\n {\n title: 'Session recordings',\n search: 'video replay',\n icon: ,\n command: (chain, pos) => chain.insertContentAt(pos, { type: NotebookNodeType.RecordingPlaylist, attrs: {} }),\n },\n {\n title: 'Image',\n search: 'picture gif',\n icon: ,\n command: async (chain, pos) => {\n // Trigger upload followed by insert\n try {\n const files = await selectFiles({ contentType: 'image/*', multiple: false })\n\n if (files.length) {\n return chain.insertContentAt(pos, { type: NotebookNodeType.Image, attrs: { file: files[0] } })\n }\n } catch (e) {\n lemonToast.error('Something went wrong when trying to select a file.')\n }\n\n return chain\n },\n },\n {\n title: 'Embedded iframe',\n search: 'iframe embed',\n icon: ,\n command: async (chain, pos) => {\n return chain.insertContentAt(pos, buildNodeEmbed())\n },\n },\n]\n\nexport const SlashCommands = forwardRef(function SlashCommands(\n { mode, range, getPos, onClose, query }: SlashCommandsProps,\n ref\n): JSX.Element | null {\n const { editor } = useValues(notebookLogic)\n // We start with 1 because the first item is the text controls\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [selectedHorizontalIndex, setSelectedHorizontalIndex] = useState(0)\n\n const allCommmands = [...TEXT_CONTROLS, ...SLASH_COMMANDS]\n\n const fuse = useMemo(() => {\n return new Fuse(allCommmands, {\n keys: ['title', 'search'],\n threshold: 0.3,\n })\n }, [allCommmands])\n\n const filteredCommands = useMemo(() => {\n if (!query) {\n return allCommmands\n }\n return fuse.search(query).map((result) => result.item)\n }, [query, fuse])\n\n const filteredSlashCommands = useMemo(\n () => filteredCommands.filter((item) => SLASH_COMMANDS.includes(item)),\n [filteredCommands]\n )\n\n useEffect(() => {\n setSelectedIndex(0)\n setSelectedHorizontalIndex(0)\n }, [query])\n\n const execute = async (item: SlashCommandsItem): Promise => {\n if (editor) {\n const selectedNode = editor.getSelectedNode()\n const isTextNode = selectedNode === null || selectedNode.isText\n const isTextCommand = TEXT_CONTROLS.map((c) => c.title).includes(item.title)\n\n const position = mode === 'slash' ? range.from : getPos()\n let chain = mode === 'slash' ? editor.deleteRange(range) : editor.chain()\n\n if (!isTextNode && isTextCommand) {\n chain = chain.insertContentAt(position, { type: 'paragraph' })\n }\n\n const partialCommand = await item.command(chain, position)\n partialCommand.run()\n\n onClose?.()\n }\n }\n\n const onPressEnter = async (): Promise => {\n const command =\n selectedIndex === -1 ? TEXT_CONTROLS[selectedHorizontalIndex] : filteredSlashCommands[selectedIndex]\n\n await execute(command)\n }\n const onPressUp = (): void => {\n setSelectedIndex(Math.max(selectedIndex - 1, -1))\n }\n const onPressDown = (): void => {\n setSelectedIndex(Math.min(selectedIndex + 1, SLASH_COMMANDS.length - 1))\n }\n\n const onPressLeft = (): void => {\n setSelectedHorizontalIndex(Math.max(selectedHorizontalIndex - 1, 0))\n }\n const onPressRight = (): void => {\n setSelectedHorizontalIndex(Math.min(selectedHorizontalIndex + 1, TEXT_CONTROLS.length - 1))\n }\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent): boolean => {\n const keyMappings = {\n ArrowUp: onPressUp,\n ArrowDown: onPressDown,\n ArrowLeft: onPressLeft,\n ArrowRight: onPressRight,\n Enter: onPressEnter,\n }\n\n if (keyMappings[event.key]) {\n keyMappings[event.key]()\n return true\n }\n\n return false\n },\n [selectedIndex, selectedHorizontalIndex, filteredCommands]\n )\n\n // Expose the keydown handler to the tiptap extension\n useImperativeHandle(ref, () => ({ onKeyDown }), [onKeyDown])\n\n useEffect(() => {\n if (mode !== 'add') {\n return\n }\n\n // If not opened from a slash command, we want to add our own keyboard listeners\n const keyDownListener = (event: KeyboardEvent): void => {\n const preventDefault = onKeyDown(event)\n if (preventDefault) {\n event.preventDefault()\n }\n }\n\n window.addEventListener('keydown', keyDownListener, true)\n\n return () => window.removeEventListener('keydown', keyDownListener, true)\n }, [onKeyDown, mode])\n\n if (!editor) {\n return null\n }\n\n return (\n
\n
\n {TEXT_CONTROLS.map((item, index) => (\n void execute(item)}\n icon={item.icon}\n />\n ))}\n
\n\n \n\n {filteredSlashCommands.map((item, index) => (\n void execute(item)}\n >\n {item.title}\n \n ))}\n\n {filteredSlashCommands.length === 0 && (\n
\n Nothing matching /{query}\n
\n )}\n\n {mode === 'add' && (\n <>\n \n
\n You can trigger this menu by typing \n
\n \n )}\n
\n )\n})\n\nexport const SlashCommandsPopover = forwardRef(\n function SlashCommandsPopover(\n { visible = true, decorationNode, children, onClose, ...props }: SlashCommandsPopoverProps,\n ref\n ): JSX.Element | null {\n return (\n }\n referenceElement={decorationNode}\n visible={visible}\n onClickOutside={onClose}\n >\n {children}\n \n )\n }\n)\n\nexport const SlashCommandsExtension = Extension.create({\n name: 'slash-commands',\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: '/',\n startOfLine: true,\n render: () => {\n let renderer: ReactRenderer\n\n return {\n onStart: (props) => {\n renderer = new ReactRenderer(SlashCommandsPopover, {\n props: { ...props, mode: 'slash' },\n editor: props.editor,\n })\n },\n\n onUpdate(props) {\n renderer.updateProps(props)\n\n if (!props.clientRect) {\n return\n }\n },\n\n onKeyDown(props) {\n if (props.event.key === 'Escape') {\n renderer.destroy()\n return true\n }\n return renderer.ref?.onKeyDown(props.event) ?? false\n },\n\n onExit() {\n renderer.destroy()\n },\n }\n },\n }),\n ]\n },\n})\n","import {\n addedNodeMutation,\n customEvent,\n EventType,\n fullSnapshotEvent,\n incrementalSnapshotEvent,\n IncrementalSource,\n metaEvent,\n mutationData,\n removedNodeMutation,\n} from '@rrweb/types'\nimport { captureMessage } from '@sentry/react'\nimport { isObject } from 'lib/utils'\nimport { PLACEHOLDER_SVG_DATA_IMAGE_URL } from 'scenes/session-recordings/player/rrweb'\n\nimport {\n attributes,\n documentNode,\n elementNode,\n fullSnapshotEvent as MobileFullSnapshotEvent,\n keyboardEvent,\n metaEvent as MobileMetaEvent,\n MobileIncrementalSnapshotEvent,\n MobileNodeMutation,\n MobileNodeType,\n NodeType,\n serializedNodeWithId,\n textNode,\n wireframe,\n wireframeButton,\n wireframeCheckBox,\n wireframeDiv,\n wireframeImage,\n wireframeInputComponent,\n wireframeNavigationBar,\n wireframePlaceholder,\n wireframeProgress,\n wireframeRadio,\n wireframeRadioGroup,\n wireframeRectangle,\n wireframeScreenshot,\n wireframeSelect,\n wireframeStatusBar,\n wireframeText,\n wireframeToggle,\n} from '../mobile.types'\nimport { makeNavigationBar, makeOpenKeyboardPlaceholder, makeStatusBar } from './screen-chrome'\nimport { ConversionContext, ConversionResult } from './types'\nimport {\n asStyleString,\n makeBodyStyles,\n makeColorStyles,\n makeDeterminateProgressStyles,\n makeHTMLStyles,\n makeIndeterminateProgressStyles,\n makeMinimalStyles,\n makePositionStyles,\n makeStylesString,\n} from './wireframeStyle'\n\nexport const BACKGROUND = '#f3f4ef'\nconst FOREGROUND = '#35373e'\n\n/**\n * generates a sequence of ids\n * from 100 to 9,999,999\n * the transformer reserves ids in the range 0 to 9,999,999\n * we reserve a range of ids because we need nodes to have stable ids across snapshots\n * in order for incremental snapshots to work\n * some mobile elements have to be wrapped in other elements in order to be styled correctly\n * which means the web version of a mobile replay will use ids that don't exist in the mobile replay,\n * and we need to ensure they don't clash\n * -----\n * id is typed as a number in rrweb\n * and there's a few places in their code where rrweb uses a check for `id === -1` to bail out of processing\n * so, it's safest to assume that id is expected to be a positive integer\n */\nfunction* ids(): Generator {\n let i = 100\n while (i < 9999999) {\n yield i++\n }\n}\n\nlet globalIdSequence = ids()\n\n// there are some fixed ids that we need to use for fixed elements or artificial mutations\nconst DOCUMENT_ID = 1\nconst HTML_DOC_TYPE_ID = 2\nconst HTML_ELEMENT_ID = 3\nconst HEAD_ID = 4\nconst BODY_ID = 5\n// the nav bar should always be the last item in the body so that it is at the top of the stack\nconst NAVIGATION_BAR_PARENT_ID = 7\nexport const NAVIGATION_BAR_ID = 8\n// the keyboard so that it is still before the nav bar\nconst KEYBOARD_PARENT_ID = 9\nexport const KEYBOARD_ID = 10\nexport const STATUS_BAR_PARENT_ID = 11\nexport const STATUS_BAR_ID = 12\n\nfunction isKeyboardEvent(x: unknown): x is keyboardEvent {\n return isObject(x) && 'data' in x && isObject(x.data) && 'tag' in x.data && x.data.tag === 'keyboard'\n}\n\nexport function _isPositiveInteger(id: unknown): id is number {\n return typeof id === 'number' && id > 0 && id % 1 === 0\n}\n\nfunction _isNullish(x: unknown): x is null | undefined {\n return x === null || x === undefined\n}\n\nfunction isRemovedNodeMutation(x: addedNodeMutation | removedNodeMutation): x is removedNodeMutation {\n return isObject(x) && 'id' in x\n}\n\nexport const makeCustomEvent = (\n mobileCustomEvent: (customEvent | keyboardEvent) & {\n timestamp: number\n delay?: number\n }\n): (customEvent | incrementalSnapshotEvent) & {\n timestamp: number\n delay?: number\n} => {\n if (isKeyboardEvent(mobileCustomEvent)) {\n // keyboard events are handled as incremental snapshots to add or remove a keyboard from the DOM\n // TODO eventually we can pass something to makeIncrementalEvent here\n const adds: addedNodeMutation[] = []\n const removes = []\n if (mobileCustomEvent.data.payload.open) {\n const keyboardPlaceHolder = makeOpenKeyboardPlaceholder(mobileCustomEvent, {\n timestamp: mobileCustomEvent.timestamp,\n idSequence: globalIdSequence,\n })\n if (keyboardPlaceHolder) {\n adds.push({\n parentId: KEYBOARD_PARENT_ID,\n nextId: null,\n node: keyboardPlaceHolder.result,\n })\n // mutations seem not to want a tree of nodes to add\n // so even though `keyboardPlaceholder` is a tree with content\n // we have to add the text content as well\n adds.push({\n parentId: keyboardPlaceHolder.result.id,\n nextId: null,\n node: {\n type: NodeType.Text,\n id: globalIdSequence.next().value,\n textContent: 'keyboard',\n },\n })\n } else {\n captureMessage('Failed to create keyboard placeholder', { extra: { mobileCustomEvent } })\n }\n } else {\n removes.push({\n parentId: KEYBOARD_PARENT_ID,\n id: KEYBOARD_ID,\n })\n }\n const mutation: mutationData = { adds, attributes: [], removes, source: IncrementalSource.Mutation, texts: [] }\n return {\n type: EventType.IncrementalSnapshot,\n data: mutation,\n timestamp: mobileCustomEvent.timestamp,\n }\n }\n return mobileCustomEvent\n}\n\nexport const makeMetaEvent = (\n mobileMetaEvent: MobileMetaEvent & {\n timestamp: number\n }\n): metaEvent & {\n timestamp: number\n delay?: number\n} => ({\n type: EventType.Meta,\n data: {\n href: mobileMetaEvent.data.href || '', // the replay doesn't use the href, so we safely ignore any absence\n // mostly we need width and height in order to size the viewport\n width: mobileMetaEvent.data.width,\n height: mobileMetaEvent.data.height,\n },\n timestamp: mobileMetaEvent.timestamp,\n})\n\nexport function makeDivElement(\n wireframe: wireframeDiv,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const _id = _isPositiveInteger(wireframe.id) ? wireframe.id : context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: asStyleString([makeStylesString(wireframe), 'overflow:hidden', 'white-space:nowrap']),\n 'data-rrweb-id': _id,\n },\n id: _id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction makeTextElement(\n wireframe: wireframeText,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (wireframe.type !== 'text') {\n console.error('Passed incorrect wireframe type to makeTextElement')\n return null\n }\n\n // because we might have to style the text, we always wrap it in a div\n // and apply styles to that\n const id = context.idSequence.next().value\n\n const childNodes = [...children]\n if (!_isNullish(wireframe.text)) {\n childNodes.unshift({\n type: NodeType.Text,\n textContent: wireframe.text,\n // since the text node is wrapped, we assign it a synthetic id\n id,\n })\n }\n\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: asStyleString([makeStylesString(wireframe), 'overflow:hidden', 'white-space:normal']),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes,\n },\n context,\n }\n}\n\nfunction makeWebViewElement(\n wireframe: wireframe,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const labelledWireframe: wireframePlaceholder = { ...wireframe } as wireframePlaceholder\n if ('url' in wireframe) {\n labelledWireframe.label = wireframe.url\n }\n\n return makePlaceholderElement(labelledWireframe, children, context)\n}\n\nexport function makePlaceholderElement(\n wireframe: wireframe,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const txt = 'label' in wireframe && wireframe.label ? wireframe.label : wireframe.type || 'PLACEHOLDER'\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe, {\n verticalAlign: 'center',\n horizontalAlign: 'center',\n backgroundColor: wireframe.style?.backgroundColor || BACKGROUND,\n color: wireframe.style?.color || FOREGROUND,\n backgroundImage: PLACEHOLDER_SVG_DATA_IMAGE_URL,\n backgroundSize: 'auto',\n backgroundRepeat: 'unset',\n ...context.styleOverride,\n }),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [\n {\n type: NodeType.Text,\n // since the text node is wrapped, we assign it a synthetic id\n id: context.idSequence.next().value,\n textContent: txt,\n },\n ...children,\n ],\n },\n context,\n }\n}\n\nexport function dataURIOrPNG(src: string): string {\n // replace all new lines in src\n src = src.replace(/\\r?\\n|\\r/g, '')\n if (!src.startsWith('data:image/')) {\n return 'data:image/png;base64,' + src\n }\n return src\n}\n\nfunction makeImageElement(\n wireframe: wireframeImage | wireframeScreenshot,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (!wireframe.base64) {\n return makePlaceholderElement(wireframe, children, context)\n }\n\n const src = dataURIOrPNG(wireframe.base64)\n return {\n result: {\n type: NodeType.Element,\n tagName: 'img',\n attributes: {\n src: src,\n width: wireframe.width,\n height: wireframe.height,\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction inputAttributes(wireframe: T): attributes {\n const attributes = {\n style: makeStylesString(wireframe),\n type: wireframe.inputType,\n ...(wireframe.disabled ? { disabled: wireframe.disabled } : {}),\n 'data-rrweb-id': wireframe.id,\n }\n\n switch (wireframe.inputType) {\n case 'checkbox':\n return {\n ...attributes,\n style: null, // checkboxes are styled by being combined with a label\n ...(wireframe.checked ? { checked: wireframe.checked } : {}),\n }\n case 'toggle':\n return {\n ...attributes,\n style: null, // toggle are styled by being combined with a label\n ...(wireframe.checked ? { checked: wireframe.checked } : {}),\n }\n case 'radio':\n return {\n ...attributes,\n style: null, // radio buttons are styled by being combined with a label\n ...(wireframe.checked ? { checked: wireframe.checked } : {}),\n // radio value defaults to the string \"on\" if not specified\n // we're not really submitting the form, so it doesn't matter 🤞\n // radio name is used to correctly uncheck values when one is checked\n // mobile doesn't really have it, and we will be checking based on snapshots,\n // so we can ignore it for now\n }\n case 'button':\n return {\n ...attributes,\n }\n case 'text_area':\n return {\n ...attributes,\n value: wireframe.value || '',\n }\n case 'progress':\n return {\n ...attributes,\n // indeterminate when omitted\n value: wireframe.value || null,\n // defaults to 1 when omitted\n max: wireframe.max || null,\n type: null, // progress has no type attribute\n }\n default:\n return {\n ...attributes,\n value: wireframe.value || '',\n }\n }\n}\n\nfunction makeButtonElement(\n wireframe: wireframeButton,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const buttonText: textNode | null = wireframe.value\n ? {\n type: NodeType.Text,\n textContent: wireframe.value,\n }\n : null\n\n return {\n result: {\n type: NodeType.Element,\n tagName: 'button',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: buttonText ? [{ ...buttonText, id: context.idSequence.next().value }, ...children] : children,\n },\n context,\n }\n}\n\nfunction makeSelectOptionElement(\n option: string,\n selected: boolean,\n context: ConversionContext\n): ConversionResult {\n const optionId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'option',\n attributes: {\n ...(selected ? { selected: selected } : {}),\n 'data-rrweb-id': optionId,\n },\n id: optionId,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: option,\n id: context.idSequence.next().value,\n },\n ],\n },\n context,\n }\n}\n\nfunction makeSelectElement(\n wireframe: wireframeSelect,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const selectOptions: serializedNodeWithId[] = []\n if (wireframe.options) {\n let optionContext = context\n for (let i = 0; i < wireframe.options.length; i++) {\n const option = wireframe.options[i]\n const conversion = makeSelectOptionElement(option, wireframe.value === option, optionContext)\n selectOptions.push(conversion.result)\n optionContext = conversion.context\n }\n }\n return {\n result: {\n type: NodeType.Element,\n tagName: 'select',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: [...selectOptions, ...children],\n },\n context,\n }\n}\n\nfunction groupRadioButtons(children: serializedNodeWithId[], radioGroupName: string): serializedNodeWithId[] {\n return children.map((child) => {\n if (child.type === NodeType.Element && child.tagName === 'input' && child.attributes.type === 'radio') {\n return {\n ...child,\n attributes: {\n ...child.attributes,\n name: radioGroupName,\n 'data-rrweb-id': child.id,\n },\n }\n }\n return child\n })\n}\n\nfunction makeRadioGroupElement(\n wireframe: wireframeRadioGroup,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n const radioGroupName = 'radio_group_' + wireframe.id\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: groupRadioButtons(children, radioGroupName),\n },\n context,\n }\n}\n\nfunction makeStar(title: string, path: string, context: ConversionContext): serializedNodeWithId {\n const svgId = context.idSequence.next().value\n const titleId = context.idSequence.next().value\n const pathId = context.idSequence.next().value\n return {\n type: NodeType.Element,\n tagName: 'svg',\n isSVG: true,\n attributes: {\n style: asStyleString(['height: 100%', 'overflow-clip-margin: content-box', 'overflow:hidden']),\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n 'data-rrweb-id': svgId,\n },\n id: svgId,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'title',\n isSVG: true,\n attributes: {\n 'data-rrweb-id': titleId,\n },\n id: titleId,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: title,\n id: context.idSequence.next().value,\n },\n ],\n },\n {\n type: NodeType.Element,\n tagName: 'path',\n isSVG: true,\n attributes: {\n d: path,\n 'data-rrweb-id': pathId,\n },\n id: pathId,\n childNodes: [],\n },\n ],\n }\n}\n\nfunction filledStar(context: ConversionContext): serializedNodeWithId {\n return makeStar(\n 'filled star',\n 'M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z',\n context\n )\n}\n\nfunction halfStar(context: ConversionContext): serializedNodeWithId {\n return makeStar(\n 'half-filled star',\n 'M12,15.4V6.1L13.71,10.13L18.09,10.5L14.77,13.39L15.76,17.67M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z',\n context\n )\n}\n\nfunction emptyStar(context: ConversionContext): serializedNodeWithId {\n return makeStar(\n 'empty star',\n 'M12,15.39L8.24,17.66L9.23,13.38L5.91,10.5L10.29,10.13L12,6.09L13.71,10.13L18.09,10.5L14.77,13.38L15.76,17.66M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z',\n context\n )\n}\n\nfunction makeRatingBar(\n wireframe: wireframeProgress,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n // max is the number of stars... and value is the number of stars to fill\n\n // deliberate double equals, because we want to allow null and undefined\n if (wireframe.value == null || wireframe.max == null) {\n return makePlaceholderElement(wireframe, children, context)\n }\n\n const numberOfFilledStars = Math.floor(wireframe.value)\n const numberOfHalfStars = wireframe.value - numberOfFilledStars > 0 ? 1 : 0\n const numberOfEmptyStars = wireframe.max - numberOfFilledStars - numberOfHalfStars\n\n const filledStars = Array(numberOfFilledStars)\n .fill(undefined)\n .map(() => filledStar(context))\n const halfStars = Array(numberOfHalfStars)\n .fill(undefined)\n .map(() => halfStar(context))\n const emptyStars = Array(numberOfEmptyStars)\n .fill(undefined)\n .map(() => emptyStar(context))\n\n const ratingBarId = context.idSequence.next().value\n const ratingBar = {\n type: NodeType.Element,\n tagName: 'div',\n id: ratingBarId,\n attributes: {\n style: asStyleString([\n makeColorStyles(wireframe),\n 'position: relative',\n 'display: flex',\n 'flex-direction: row',\n 'padding: 2px 4px',\n ]),\n 'data-rrweb-id': ratingBarId,\n },\n childNodes: [...filledStars, ...halfStars, ...emptyStars],\n } as serializedNodeWithId\n\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [ratingBar, ...children],\n },\n context,\n }\n}\n\nfunction makeProgressElement(\n wireframe: wireframeProgress,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (wireframe.style?.bar === 'circular') {\n // value needs to be expressed as a number between 0 and 100\n const max = wireframe.max || 1\n let value = wireframe.value || null\n if (_isPositiveInteger(value) && value <= max) {\n value = (value / max) * 100\n } else {\n value = null\n }\n\n const styleOverride = {\n color: wireframe.style?.color || FOREGROUND,\n backgroundColor: wireframe.style?.backgroundColor || BACKGROUND,\n }\n\n // if not _isPositiveInteger(value) then we render a spinner,\n // so we need to add a style element with the spin keyframe\n const stylingChildren: serializedNodeWithId[] = _isPositiveInteger(value)\n ? []\n : [\n {\n type: NodeType.Element,\n tagName: 'style',\n attributes: {\n type: 'text/css',\n },\n id: context.idSequence.next().value,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: `@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`,\n id: context.idSequence.next().value,\n },\n ],\n },\n ]\n\n const wrappingDivId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeMinimalStyles(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n // with no provided value we render a spinner\n style: _isPositiveInteger(value)\n ? makeDeterminateProgressStyles(wireframe, styleOverride)\n : makeIndeterminateProgressStyles(wireframe, styleOverride),\n 'data-rrweb-id': wrappingDivId,\n },\n id: wrappingDivId,\n childNodes: stylingChildren,\n },\n ...children,\n ],\n },\n context,\n }\n } else if (wireframe.style?.bar === 'rating') {\n return makeRatingBar(wireframe, children, context)\n }\n return {\n result: {\n type: NodeType.Element,\n tagName: 'progress',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction makeToggleParts(wireframe: wireframeToggle, context: ConversionContext): serializedNodeWithId[] {\n const togglePosition = wireframe.checked ? 'right' : 'left'\n const defaultColor = wireframe.checked ? '#1d4aff' : BACKGROUND\n const sliderPartId = context.idSequence.next().value\n const handlePartId = context.idSequence.next().value\n return [\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-toggle-part': 'slider',\n style: asStyleString([\n 'position:absolute',\n 'top:33%',\n 'left:5%',\n 'display:inline-block',\n 'width:75%',\n 'height:33%',\n 'opacity: 0.2',\n 'border-radius:7.5%',\n `background-color:${wireframe.style?.color || defaultColor}`,\n ]),\n 'data-rrweb-id': sliderPartId,\n },\n id: sliderPartId,\n childNodes: [],\n },\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-toggle-part': 'handle',\n style: asStyleString([\n 'position:absolute',\n 'top:1.5%',\n `${togglePosition}:5%`,\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'width:40%',\n 'height:75%',\n 'cursor:inherit',\n 'border-radius:50%',\n `background-color:${wireframe.style?.color || defaultColor}`,\n `border:2px solid ${wireframe.style?.borderColor || wireframe.style?.color || defaultColor}`,\n ]),\n 'data-rrweb-id': handlePartId,\n },\n id: handlePartId,\n childNodes: [],\n },\n ]\n}\n\nfunction makeToggleElement(\n wireframe: wireframeToggle,\n context: ConversionContext\n): ConversionResult<\n elementNode & {\n id: number\n }\n> | null {\n const isLabelled = 'label' in wireframe\n const wrappingDivId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n // if labelled take up available space, otherwise use provided positioning\n style: isLabelled ? asStyleString(['height:100%', 'flex:1']) : makePositionStyles(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n // relative position, fills parent\n style: asStyleString(['position:relative', 'width:100%', 'height:100%']),\n 'data-rrweb-id': wrappingDivId,\n },\n id: wrappingDivId,\n childNodes: makeToggleParts(wireframe, context),\n },\n ],\n },\n context,\n }\n}\n\nfunction makeLabelledInput(\n wireframe: wireframeCheckBox | wireframeRadio | wireframeToggle,\n theInputElement: serializedNodeWithId,\n context: ConversionContext\n): ConversionResult {\n const theLabel: serializedNodeWithId = {\n type: NodeType.Text,\n textContent: wireframe.label || '',\n id: context.idSequence.next().value,\n }\n\n const orderedChildren = wireframe.inputType === 'toggle' ? [theLabel, theInputElement] : [theInputElement, theLabel]\n\n const labelId = context.idSequence.next().value\n return {\n result: {\n type: NodeType.Element,\n tagName: 'label',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': labelId,\n },\n id: labelId,\n childNodes: orderedChildren,\n },\n context,\n }\n}\n\nfunction makeInputElement(\n wireframe: wireframeInputComponent,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n if (!wireframe.inputType) {\n return null\n }\n\n if (wireframe.inputType === 'button') {\n return makeButtonElement(wireframe, children, context)\n }\n\n if (wireframe.inputType === 'select') {\n return makeSelectElement(wireframe, children, context)\n }\n\n if (wireframe.inputType === 'progress') {\n return makeProgressElement(wireframe, children, context)\n }\n\n const theInputElement: ConversionResult | null =\n wireframe.inputType === 'toggle'\n ? makeToggleElement(wireframe, context)\n : {\n result: {\n type: NodeType.Element,\n tagName: 'input',\n attributes: inputAttributes(wireframe),\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n\n if (!theInputElement) {\n return null\n }\n\n if ('label' in wireframe) {\n return makeLabelledInput(wireframe, theInputElement.result, theInputElement.context)\n }\n // when labelled no styles are needed, when un-labelled as here - we add the styling in.\n ;(theInputElement.result as elementNode).attributes.style = makeStylesString(wireframe)\n return theInputElement\n}\n\nfunction makeRectangleElement(\n wireframe: wireframeRectangle,\n children: serializedNodeWithId[],\n context: ConversionContext\n): ConversionResult | null {\n return {\n result: {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n style: makeStylesString(wireframe),\n 'data-rrweb-id': wireframe.id,\n },\n id: wireframe.id,\n childNodes: children,\n },\n context,\n }\n}\n\nfunction chooseConverter(\n wireframe: T\n): (\n wireframe: T,\n children: serializedNodeWithId[],\n context: ConversionContext\n) => ConversionResult | null {\n // in theory type is always present\n // but since this is coming over the wire we can't really be sure,\n // and so we default to div\n const converterType: MobileNodeType = wireframe.type || 'div'\n const converterMapping: Record<\n MobileNodeType,\n (wireframe: T, children: serializedNodeWithId[]) => ConversionResult | null\n > = {\n // KLUDGE: TS can't tell that the wireframe type of each function is safe based on the converter type\n text: makeTextElement as any,\n image: makeImageElement as any,\n rectangle: makeRectangleElement as any,\n div: makeDivElement as any,\n input: makeInputElement as any,\n radio_group: makeRadioGroupElement as any,\n web_view: makeWebViewElement as any,\n placeholder: makePlaceholderElement as any,\n status_bar: makeStatusBar as any,\n navigation_bar: makeNavigationBar as any,\n screenshot: makeImageElement as any,\n }\n return converterMapping[converterType]\n}\n\nfunction convertWireframe(\n wireframe: wireframe,\n context: ConversionContext\n): ConversionResult | null {\n const children = convertWireframesFor(wireframe.childWireframes, context)\n const converted = chooseConverter(wireframe)?.(wireframe, children.result, children.context)\n return converted || null\n}\n\nfunction convertWireframesFor(\n wireframes: wireframe[] | undefined,\n context: ConversionContext\n): ConversionResult {\n if (!wireframes) {\n return { result: [], context }\n }\n\n const result: serializedNodeWithId[] = []\n for (const wireframe of wireframes) {\n const converted = convertWireframe(wireframe, context)\n if (converted) {\n result.push(converted.result)\n context = converted.context\n }\n }\n return { result, context }\n}\n\nfunction isMobileIncrementalSnapshotEvent(x: unknown): x is MobileIncrementalSnapshotEvent {\n const isIncrementalSnapshot = isObject(x) && 'type' in x && x.type === EventType.IncrementalSnapshot\n if (!isIncrementalSnapshot) {\n return false\n }\n const hasData = isObject(x) && 'data' in x\n const data = hasData ? x.data : null\n\n const hasMutationSource = isObject(data) && 'source' in data && data.source === IncrementalSource.Mutation\n\n const adds = isObject(data) && 'adds' in data && Array.isArray(data.adds) ? data.adds : null\n const updates = isObject(data) && 'updates' in data && Array.isArray(data.updates) ? data.updates : null\n\n const hasUpdatedWireframe = !!updates && updates.length > 0 && isObject(updates[0]) && 'wireframe' in updates[0]\n const hasAddedWireframe = !!adds && adds.length > 0 && isObject(adds[0]) && 'wireframe' in adds[0]\n\n return hasMutationSource && (hasAddedWireframe || hasUpdatedWireframe)\n}\n\nfunction chooseParentId(nodeType: MobileNodeType, providedParentId: number): number {\n return nodeType === 'screenshot' ? BODY_ID : providedParentId\n}\n\nfunction makeIncrementalAdd(add: MobileNodeMutation, context: ConversionContext): addedNodeMutation[] | null {\n const converted = convertWireframe(add.wireframe, context)\n\n if (!converted) {\n return null\n }\n\n const addition: addedNodeMutation = {\n parentId: chooseParentId(add.wireframe.type, add.parentId),\n nextId: null,\n node: converted.result,\n }\n const adds: addedNodeMutation[] = []\n if (addition) {\n const flattened = flattenMutationAdds(addition)\n flattened.forEach((x) => adds.push(x))\n return adds\n }\n return null\n}\n\n/**\n * When processing an update we remove the entire item, and then add it back in.\n */\nfunction makeIncrementalRemoveForUpdate(update: MobileNodeMutation): removedNodeMutation {\n return {\n parentId: chooseParentId(update.wireframe.type, update.parentId),\n id: update.wireframe.id,\n }\n}\n\nfunction isNode(x: unknown): x is serializedNodeWithId {\n // KLUDGE: really we should check that x.type is valid, but we're safe enough already\n return isObject(x) && 'type' in x && 'id' in x\n}\n\nfunction isNodeWithChildren(x: unknown): x is elementNode | documentNode {\n return isNode(x) && 'childNodes' in x && Array.isArray(x.childNodes)\n}\n\n/**\n * when creating incremental adds we have to flatten the node tree structure\n * there's no point, then keeping those child nodes in place\n */\nfunction cloneWithoutChildren(converted: addedNodeMutation): addedNodeMutation {\n const cloned = { ...converted }\n const clonedNode: serializedNodeWithId = { ...converted.node }\n if (isNodeWithChildren(clonedNode)) {\n clonedNode.childNodes = []\n }\n cloned.node = clonedNode\n return cloned\n}\n\nfunction flattenMutationAdds(converted: addedNodeMutation): addedNodeMutation[] {\n const flattened: addedNodeMutation[] = []\n\n flattened.push(cloneWithoutChildren(converted))\n\n const node: unknown = converted.node\n const newParentId = converted.node.id\n if (isNodeWithChildren(node)) {\n node.childNodes.forEach((child) => {\n flattened.push(\n cloneWithoutChildren({\n parentId: newParentId,\n nextId: null,\n node: child,\n })\n )\n if (isNodeWithChildren(child)) {\n flattened.push(...flattenMutationAdds({ parentId: newParentId, nextId: null, node: child }))\n }\n })\n }\n return flattened\n}\n\n/**\n * each update wireframe carries the entire tree because we don't want to diff on the client\n * that means that we might create multiple mutations for the same node\n * we only want to add it once, so we dedupe the mutations\n * the app guarantees that for a given ID that is present more than once in a single snapshot\n * every instance of that ID is identical\n * it might change in the next snapshot but for a single incremental snapshot there is one\n * and only one version of any given ID\n */\nfunction dedupeMutations(mutations: T[]): T[] {\n // KLUDGE: it's slightly yucky to stringify everything but since synthetic nodes\n // introduce a new id, we can't just compare the id\n const seen = new Set()\n\n // in case later mutations are the ones we want to keep, we reverse the array\n // this does help with the deduping, so, it's likely that the view for a single ID\n // is not consistent over a snapshot, but it's cheap to reverse so :YOLO:\n return mutations\n .reverse()\n .filter((mutation: addedNodeMutation | removedNodeMutation) => {\n let toCompare: string\n if (isRemovedNodeMutation(mutation)) {\n toCompare = JSON.stringify(mutation)\n } else {\n // if this is a synthetic addition, then we need to ignore the id,\n // since duplicates won't have duplicate ids\n toCompare = JSON.stringify({\n ...mutation.node,\n id: 0,\n })\n }\n\n if (seen.has(toCompare)) {\n return false\n }\n seen.add(toCompare)\n return true\n })\n .reverse()\n}\n\n/**\n * We want to ensure that any events don't use id = 0.\n * They must always represent a valid ID from the dom, so we swap in the body id when the id = 0.\n *\n * For \"removes\", we don't need to do anything, the id of the element to be removed remains valid. We won't try and remove other elements that we added during transformation in order to show that element.\n *\n * \"adds\" are converted from wireframes to nodes and converted to `incrementalSnapshotEvent.adds`\n *\n * \"updates\" are converted to a remove and an add.\n *\n */\nexport const makeIncrementalEvent = (\n mobileEvent: (MobileIncrementalSnapshotEvent | incrementalSnapshotEvent) & {\n timestamp: number\n delay?: number\n }\n): incrementalSnapshotEvent & {\n timestamp: number\n delay?: number\n} => {\n const converted = mobileEvent as unknown as incrementalSnapshotEvent & {\n timestamp: number\n delay?: number\n }\n if ('id' in converted.data && converted.data.id === 0) {\n converted.data.id = BODY_ID\n }\n\n if (isMobileIncrementalSnapshotEvent(mobileEvent)) {\n const adds: addedNodeMutation[] = []\n const removes: removedNodeMutation[] = mobileEvent.data.removes || []\n if ('adds' in mobileEvent.data && Array.isArray(mobileEvent.data.adds)) {\n const addsContext = {\n timestamp: mobileEvent.timestamp,\n idSequence: globalIdSequence,\n }\n\n mobileEvent.data.adds.forEach((add) => {\n makeIncrementalAdd(add, addsContext)?.forEach((x) => adds.push(x))\n })\n }\n if ('updates' in mobileEvent.data && Array.isArray(mobileEvent.data.updates)) {\n const updatesContext = {\n timestamp: mobileEvent.timestamp,\n idSequence: globalIdSequence,\n }\n const updateAdditions: addedNodeMutation[] = []\n mobileEvent.data.updates.forEach((update) => {\n const removal = makeIncrementalRemoveForUpdate(update)\n if (removal) {\n removes.push(removal)\n }\n makeIncrementalAdd(update, updatesContext)?.forEach((x) => updateAdditions.push(x))\n })\n dedupeMutations(updateAdditions).forEach((x) => adds.push(x))\n }\n\n converted.data = {\n source: IncrementalSource.Mutation,\n attributes: [],\n texts: [],\n adds: dedupeMutations(adds),\n // TODO: this assumes that removes are processed before adds 🤞\n removes: dedupeMutations(removes),\n }\n }\n\n return converted\n}\n\nfunction makeKeyboardParent(): serializedNodeWithId {\n return {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-render-reason': 'a fixed placeholder to contain the keyboard in the correct stacking position',\n 'data-rrweb-id': KEYBOARD_PARENT_ID,\n },\n id: KEYBOARD_PARENT_ID,\n childNodes: [],\n }\n}\n\nfunction makeStatusBarNode(\n statusBar: wireframeStatusBar | undefined,\n context: ConversionContext\n): serializedNodeWithId {\n const childNodes = statusBar ? convertWireframesFor([statusBar], context).result : []\n return {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-rrweb-id': STATUS_BAR_PARENT_ID,\n },\n id: STATUS_BAR_PARENT_ID,\n childNodes,\n }\n}\n\nfunction makeNavBarNode(\n navigationBar: wireframeNavigationBar | undefined,\n context: ConversionContext\n): serializedNodeWithId {\n const childNodes = navigationBar ? convertWireframesFor([navigationBar], context).result : []\n return {\n type: NodeType.Element,\n tagName: 'div',\n attributes: {\n 'data-rrweb-id': NAVIGATION_BAR_PARENT_ID,\n },\n id: NAVIGATION_BAR_PARENT_ID,\n childNodes,\n }\n}\n\nfunction stripBarsFromWireframe(wireframe: wireframe): {\n wireframe: wireframe | undefined\n statusBar: wireframeStatusBar | undefined\n navBar: wireframeNavigationBar | undefined\n} {\n if (wireframe.type === 'status_bar') {\n return { wireframe: undefined, statusBar: wireframe, navBar: undefined }\n } else if (wireframe.type === 'navigation_bar') {\n return { wireframe: undefined, statusBar: undefined, navBar: wireframe }\n }\n let statusBar: wireframeStatusBar | undefined\n let navBar: wireframeNavigationBar | undefined\n const wireframeToReturn: wireframe | undefined = { ...wireframe }\n wireframeToReturn.childWireframes = []\n for (const child of wireframe.childWireframes || []) {\n const {\n wireframe: childWireframe,\n statusBar: childStatusBar,\n navBar: childNavBar,\n } = stripBarsFromWireframe(child)\n statusBar = statusBar || childStatusBar\n navBar = navBar || childNavBar\n if (childWireframe) {\n wireframeToReturn.childWireframes.push(childWireframe)\n }\n }\n return { wireframe: wireframeToReturn, statusBar, navBar }\n}\n\n/**\n * We want to be able to place the status bar and navigation bar in the correct stacking order.\n * So, we lift them out of the tree, and return them separately.\n */\nexport function stripBarsFromWireframes(wireframes: wireframe[]): {\n statusBar: wireframeStatusBar | undefined\n navigationBar: wireframeNavigationBar | undefined\n appNodes: wireframe[]\n} {\n let statusBar: wireframeStatusBar | undefined\n let navigationBar: wireframeNavigationBar | undefined\n const copiedNodes: wireframe[] = []\n\n wireframes.forEach((w) => {\n const matches = stripBarsFromWireframe(w)\n if (matches.statusBar) {\n statusBar = matches.statusBar\n }\n if (matches.navBar) {\n navigationBar = matches.navBar\n }\n if (matches.wireframe) {\n copiedNodes.push(matches.wireframe)\n }\n })\n return { statusBar, navigationBar, appNodes: copiedNodes }\n}\n\nexport const makeFullEvent = (\n mobileEvent: MobileFullSnapshotEvent & {\n timestamp: number\n delay?: number\n }\n): fullSnapshotEvent & {\n timestamp: number\n delay?: number\n} => {\n // we can restart the id sequence on each full snapshot\n globalIdSequence = ids()\n\n if (!('wireframes' in mobileEvent.data)) {\n return mobileEvent as unknown as fullSnapshotEvent & {\n timestamp: number\n delay?: number\n }\n }\n\n const conversionContext = {\n timestamp: mobileEvent.timestamp,\n idSequence: globalIdSequence,\n }\n\n const { statusBar, navigationBar, appNodes } = stripBarsFromWireframes(mobileEvent.data.wireframes)\n\n const nodeGroups = {\n appNodes: convertWireframesFor(appNodes, conversionContext).result || [],\n statusBarNode: makeStatusBarNode(statusBar, conversionContext),\n navBarNode: makeNavBarNode(navigationBar, conversionContext),\n }\n\n return {\n type: EventType.FullSnapshot,\n timestamp: mobileEvent.timestamp,\n data: {\n node: {\n type: NodeType.Document,\n childNodes: [\n {\n type: NodeType.DocumentType,\n name: 'html',\n publicId: '',\n systemId: '',\n id: HTML_DOC_TYPE_ID,\n },\n {\n type: NodeType.Element,\n tagName: 'html',\n attributes: { style: makeHTMLStyles(), 'data-rrweb-id': HTML_ELEMENT_ID },\n id: HTML_ELEMENT_ID,\n childNodes: [\n {\n type: NodeType.Element,\n tagName: 'head',\n attributes: { 'data-rrweb-id': HEAD_ID },\n id: HEAD_ID,\n childNodes: [makeCSSReset(conversionContext)],\n },\n {\n type: NodeType.Element,\n tagName: 'body',\n attributes: { style: makeBodyStyles(), 'data-rrweb-id': BODY_ID },\n id: BODY_ID,\n childNodes: [\n // in the order they should stack if they ever clash\n // lower is higher in the stacking context\n ...nodeGroups.appNodes,\n makeKeyboardParent(),\n nodeGroups.navBarNode,\n nodeGroups.statusBarNode,\n ],\n },\n ],\n },\n ],\n id: DOCUMENT_ID,\n },\n initialOffset: {\n top: 0,\n left: 0,\n },\n },\n }\n}\n\nfunction makeCSSReset(context: ConversionContext): serializedNodeWithId {\n // we need to normalize CSS so browsers don't do unexpected things\n return {\n type: NodeType.Element,\n tagName: 'style',\n attributes: {\n type: 'text/css',\n },\n id: context.idSequence.next().value,\n childNodes: [\n {\n type: NodeType.Text,\n textContent: `\n body {\n margin: unset;\n }\n input, button, select, textarea {\n font: inherit;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: transparent;\n padding-block: 0 !important;\n }\n .input:focus {\n outline: none;\n }\n img {\n border-style: none;\n }\n `,\n id: context.idSequence.next().value,\n },\n ],\n }\n}\n","import posthogEE from '@posthog/ee/exports'\nimport { customEvent, EventType, eventWithTime, fullSnapshotEvent, IncrementalSource } from '@rrweb/types'\nimport { captureException } from '@sentry/react'\nimport { gunzipSync, strFromU8, strToU8 } from 'fflate'\nimport {\n actions,\n afterMount,\n beforeUnmount,\n connect,\n defaults,\n kea,\n key,\n listeners,\n path,\n props,\n reducers,\n selectors,\n} from 'kea'\nimport { loaders } from 'kea-loaders'\nimport { subscriptions } from 'kea-subscriptions'\nimport api from 'lib/api'\nimport { FEATURE_FLAGS } from 'lib/constants'\nimport { Dayjs, dayjs } from 'lib/dayjs'\nimport { featureFlagLogic, FeatureFlagsSet } from 'lib/logic/featureFlagLogic'\nimport { isObject } from 'lib/utils'\nimport { chainToElements } from 'lib/utils/elements-chain'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\nimport posthog from 'posthog-js'\nimport { compressedEventWithTime } from 'posthog-js/lib/src/extensions/replay/sessionrecording'\nimport { RecordingComment } from 'scenes/session-recordings/player/inspector/playerInspectorLogic'\nimport { teamLogic } from 'scenes/teamLogic'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport {\n AnyPropertyFilter,\n EncodedRecordingSnapshot,\n PersonType,\n PropertyFilterType,\n PropertyOperator,\n RecordingEventsFilters,\n RecordingEventType,\n RecordingReportLoadTimes,\n RecordingSegment,\n RecordingSnapshot,\n SessionPlayerData,\n SessionRecordingId,\n SessionRecordingSnapshotParams,\n SessionRecordingSnapshotSource,\n SessionRecordingSnapshotSourceResponse,\n SessionRecordingType,\n SessionRecordingUsageType,\n SnapshotSourceType,\n} from '~/types'\n\nimport { PostHogEE } from '../../../../@posthog/ee/types'\nimport { ExportedSessionRecordingFileV2 } from '../file-playback/types'\nimport type { sessionRecordingDataLogicType } from './sessionRecordingDataLogicType'\nimport { createSegments, mapSnapshotsToWindowId } from './utils/segmenter'\n\nconst IS_TEST_MODE = process.env.NODE_ENV === 'test'\nconst BUFFER_MS = 60000 // +- before and after start and end of a recording to query for.\nconst DEFAULT_REALTIME_POLLING_MILLIS = 3000\n\nlet postHogEEModule: PostHogEE\n\nfunction isRecordingSnapshot(x: unknown): x is RecordingSnapshot {\n return typeof x === 'object' && x !== null && 'type' in x && 'timestamp' in x\n}\n\n/*\n there was a bug in mobile SDK that didn't consistently send a meta event with a full snapshot.\n rrweb player hides itself until it has seen the meta event 🤷\n but we can patch a meta event into the recording data to make it work\n*/\nfunction patchMetaEventIntoMobileData(parsedLines: RecordingSnapshot[]): RecordingSnapshot[] {\n let fullSnapshotIndex: number = -1\n let metaIndex: number = -1\n try {\n fullSnapshotIndex = parsedLines.findIndex((l) => l.type === EventType.FullSnapshot)\n metaIndex = parsedLines.findIndex((l) => l.type === EventType.Meta)\n\n // then we need to patch the meta event into the snapshot data\n if (fullSnapshotIndex > -1 && metaIndex === -1) {\n const fullSnapshot = parsedLines[fullSnapshotIndex] as RecordingSnapshot & fullSnapshotEvent & eventWithTime\n // a full snapshot (particularly from the mobile transformer) has a relatively fixed structure,\n // but the types exposed by rrweb don't quite cover what we need , so...\n const mainNode = fullSnapshot.data.node as any\n const targetNode = mainNode.childNodes[1].childNodes[1].childNodes[0]\n const { width, height } = targetNode.attributes\n const metaEvent: RecordingSnapshot = {\n windowId: fullSnapshot.windowId,\n type: EventType.Meta,\n timestamp: fullSnapshot.timestamp,\n data: {\n href: getHrefFromSnapshot(fullSnapshot) || '',\n width,\n height,\n },\n }\n parsedLines.splice(fullSnapshotIndex, 0, metaEvent)\n }\n } catch (e) {\n captureException(e, {\n tags: { feature: 'session-recording-missing-meta-patching' },\n extra: { fullSnapshotIndex, metaIndex },\n })\n }\n\n return parsedLines\n}\n\nfunction hasAnyWireframes(snapshotData: Record[]): boolean {\n return snapshotData.some((d) => {\n return isObject(d.data) && 'wireframes' in d.data\n })\n}\n\nfunction isCompressedEvent(ev: unknown): ev is compressedEventWithTime {\n return typeof ev === 'object' && ev !== null && 'cv' in ev\n}\n\nfunction unzip(compressedStr: string): any {\n return JSON.parse(strFromU8(gunzipSync(strToU8(compressedStr, true))))\n}\n\n/**\n *\n * takes an event that might be from web, might be from mobile,\n * and might be partially compressed,\n * and decompresses it when possible\n *\n * you can't return a union of `KnownType | unknown`\n * so even though this returns `eventWithTime | unknown`\n * it has to be typed as only unknown\n */\nfunction decompressEvent(ev: unknown): unknown {\n try {\n if (isCompressedEvent(ev)) {\n if (ev.cv === '2024-10') {\n if (ev.type === EventType.FullSnapshot) {\n return {\n ...ev,\n data: unzip(ev.data),\n }\n } else if (ev.type === EventType.IncrementalSnapshot) {\n if (ev.data.source === IncrementalSource.StyleSheetRule) {\n return {\n ...ev,\n data: {\n ...ev.data,\n source: IncrementalSource.StyleSheetRule,\n adds: unzip(ev.data.adds),\n removes: unzip(ev.data.removes),\n },\n }\n } else if (ev.data.source === IncrementalSource.Mutation) {\n return {\n ...ev,\n data: {\n ...ev.data,\n source: IncrementalSource.Mutation,\n adds: unzip(ev.data.adds),\n removes: unzip(ev.data.removes),\n texts: unzip(ev.data.texts),\n attributes: unzip(ev.data.attributes),\n },\n }\n }\n }\n } else {\n posthog.captureException(new Error('Unknown compressed event version'), {\n feature: 'session-recording-compressed-event-decompression',\n compressedEvent: ev,\n compressionVersion: ev.cv,\n })\n // probably unplayable but we don't know how to decompress it\n return ev\n }\n }\n return ev\n } catch (e) {\n posthog.captureException((e as Error) || new Error('Could not decompress event'), {\n feature: 'session-recording-compressed-event-decompression',\n compressedEvent: ev,\n })\n return ev\n }\n}\n\n/**\n * We can receive data in one of multiple formats, so we treat it as unknown\n * And if we can't process it force it into eventWithTime\n *\n * If it can't be case as eventWithTime by this point then it's probably not a valid event anyway\n */\nfunction coerceToEventWithTime(d: unknown, withMobileTransformer: boolean): eventWithTime {\n // we decompress first so that we could support partial compression on mobile in future\n const currentEvent = decompressEvent(d)\n return withMobileTransformer\n ? postHogEEModule?.mobileReplay?.transformEventToWeb(currentEvent) || (currentEvent as eventWithTime)\n : (currentEvent as eventWithTime)\n}\n\nexport const parseEncodedSnapshots = async (\n items: (RecordingSnapshot | EncodedRecordingSnapshot | string)[],\n sessionId: string,\n // this is only kept so that we can export the untransformed data for debugging\n withMobileTransformer: boolean = true\n): Promise => {\n if (!postHogEEModule) {\n postHogEEModule = await posthogEE()\n }\n\n const lineCount = items.length\n const unparseableLines: string[] = []\n let isMobileSnapshots = false\n\n const parsedLines: RecordingSnapshot[] = items.flatMap((l) => {\n if (!l) {\n // blob files have an empty line at the end\n return []\n }\n try {\n let snapshotLine: { windowId: string } | EncodedRecordingSnapshot\n if (typeof l === 'string') {\n // is loaded from blob or realtime storage\n snapshotLine = JSON.parse(l) as EncodedRecordingSnapshot\n } else {\n // is loaded from file export\n snapshotLine = l\n }\n let snapshotData: ({ windowId: string } | EncodedRecordingSnapshot)[]\n if (isRecordingSnapshot(snapshotLine)) {\n // is loaded from file export\n snapshotData = [snapshotLine]\n } else {\n // is loaded from blob or realtime storage\n snapshotData = snapshotLine['data']\n }\n\n if (!isMobileSnapshots) {\n isMobileSnapshots = hasAnyWireframes(snapshotData)\n }\n\n return snapshotData.map((d: unknown) => {\n const snap = coerceToEventWithTime(d, withMobileTransformer)\n\n return {\n // this handles parsing data that was loaded from blob storage \"window_id\"\n // and data that was exported from the front-end \"windowId\"\n // we have more than one format of data that we store/pass around\n // but only one that we play back\n windowId: snapshotLine['window_id'] || snapshotLine['windowId'],\n ...snap,\n }\n })\n } catch (e) {\n if (typeof l === 'string') {\n unparseableLines.push(l)\n }\n return []\n }\n })\n\n if (unparseableLines.length) {\n const extra = {\n playbackSessionId: sessionId,\n totalLineCount: lineCount,\n unparseableLinesCount: unparseableLines.length,\n exampleLines: unparseableLines.slice(0, 3),\n }\n posthog.capture('session recording had unparseable lines', {\n ...extra,\n feature: 'session-recording-snapshot-processing',\n })\n }\n\n return isMobileSnapshots ? patchMetaEventIntoMobileData(parsedLines) : parsedLines\n}\n\nconst getHrefFromSnapshot = (snapshot: unknown): string | undefined => {\n return isObject(snapshot) && 'data' in snapshot\n ? (snapshot.data as any)?.href || (snapshot.data as any)?.payload?.href\n : undefined\n}\n\n/*\n cyrb53 (c) 2018 bryc (github.com/bryc)\n License: Public domain. Attribution appreciated.\n A fast and simple 53-bit string hash function with decent collision resistance.\n Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity.\n*/\nconst cyrb53 = function (str: string, seed = 0): number {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i)\n h1 = Math.imul(h1 ^ ch, 2654435761)\n h2 = Math.imul(h2 ^ ch, 1597334677)\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507)\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507)\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n\nexport const deduplicateSnapshots = (snapshots: RecordingSnapshot[] | null): RecordingSnapshot[] => {\n const seenHashes: Set = new Set()\n\n return (snapshots ?? [])\n .filter((snapshot) => {\n // For a multitude of reasons, there can be duplicate snapshots in the same recording.\n // we have to stringify the snapshot to compare it to other snapshots.\n // so we can filter by storing them all in a set\n\n // we can see duplicates that only differ by delay - these still count as duplicates\n // even though the delay would hide that\n const { delay: _delay, ...delayFreeSnapshot } = snapshot\n // we check each item multiple times as new snapshots come in\n // so store the computer value on the object to save recalculating it so much\n const key = (snapshot as any).seen || cyrb53(JSON.stringify(delayFreeSnapshot))\n ;(snapshot as any).seen = key\n\n if (seenHashes.has(key)) {\n return false\n }\n seenHashes.add(key)\n return true\n })\n .sort((a, b) => a.timestamp - b.timestamp)\n}\n\nconst generateRecordingReportDurations = (cache: Record): RecordingReportLoadTimes => {\n return {\n metadata: cache.metadataLoadDuration || Math.round(performance.now() - cache.metaStartTime),\n snapshots: cache.snapshotsLoadDuration || Math.round(performance.now() - cache.snapshotsStartTime),\n events: cache.eventsLoadDuration || Math.round(performance.now() - cache.eventsStartTime),\n firstPaint: cache.firstPaintDuration,\n }\n}\n\nconst resetTimingsCache = (cache: Record): void => {\n cache.metaStartTime = null\n cache.metadataLoadDuration = null\n cache.snapshotsStartTime = null\n cache.snapshotsLoadDuration = null\n cache.eventsStartTime = null\n cache.eventsLoadDuration = null\n cache.firstPaintDuration = null\n}\n\nexport interface SessionRecordingDataLogicProps {\n sessionRecordingId: SessionRecordingId\n realTimePollingIntervalMilliseconds?: number\n}\n\nfunction makeEventsQuery(\n person: PersonType | null,\n distinctId: string | null,\n start: Dayjs,\n end: Dayjs,\n properties: AnyPropertyFilter[]\n): Promise {\n return api.query({\n kind: NodeKind.EventsQuery,\n // NOTE: Be careful adding fields here. We want to keep the payload as small as possible to load all events quickly\n select: [\n 'uuid',\n 'event',\n 'timestamp',\n 'elements_chain',\n 'properties.$window_id',\n 'properties.$current_url',\n 'properties.$event_type',\n ],\n orderBy: ['timestamp ASC'],\n limit: 1000000,\n personId: person ? String(person.id) : undefined,\n after: start.subtract(BUFFER_MS, 'ms').format(),\n before: end.add(BUFFER_MS, 'ms').format(),\n properties: properties,\n where: distinctId ? [`distinct_id = ('${distinctId}')`] : undefined,\n })\n}\n\nasync function processEncodedResponse(\n encodedResponse: (EncodedRecordingSnapshot | string)[],\n props: SessionRecordingDataLogicProps,\n featureFlags: FeatureFlagsSet\n): Promise<{ transformed: RecordingSnapshot[]; untransformed: RecordingSnapshot[] | null }> {\n let untransformed: RecordingSnapshot[] | null = null\n\n const transformed = await parseEncodedSnapshots(encodedResponse, props.sessionRecordingId)\n\n if (featureFlags[FEATURE_FLAGS.SESSION_REPLAY_EXPORT_MOBILE_DATA]) {\n untransformed = await parseEncodedSnapshots(\n encodedResponse,\n props.sessionRecordingId,\n false // don't transform mobile data\n )\n }\n\n return { transformed, untransformed }\n}\n\nconst getSourceKey = (source: SessionRecordingSnapshotSource): string => {\n // realtime sources vary so blob_key is not always present and is either null or undefined...\n // we only care about key when not realtime\n // and we'll always have a key when not realtime\n return `${source.source}-${source.blob_key || source.source}`\n}\n\nexport const sessionRecordingDataLogic = kea([\n path((key) => ['scenes', 'session-recordings', 'sessionRecordingDataLogic', key]),\n props({} as SessionRecordingDataLogicProps),\n key(({ sessionRecordingId }) => sessionRecordingId || 'no-session-recording-id'),\n connect({\n logic: [eventUsageLogic],\n values: [featureFlagLogic, ['featureFlags'], teamLogic, ['currentTeam']],\n }),\n defaults({\n sessionPlayerMetaData: null as SessionRecordingType | null,\n }),\n actions({\n setFilters: (filters: Partial) => ({ filters }),\n loadRecordingMeta: true,\n loadRecordingComments: true,\n maybeLoadRecordingMeta: true,\n loadSnapshots: true,\n loadSnapshotSources: true,\n loadNextSnapshotSource: true,\n loadSnapshotsForSource: (source: Pick) => ({ source }),\n loadEvents: true,\n loadFullEventData: (event: RecordingEventType | RecordingEventType[]) => ({ event }),\n markViewed: (delay?: number) => ({ delay }),\n reportUsageIfFullyLoaded: true,\n persistRecording: true,\n maybePersistRecording: true,\n pollRealtimeSnapshots: true,\n stopRealtimePolling: true,\n setTrackedWindow: (windowId: string | null) => ({ windowId }),\n setWasMarkedViewed: (wasMarkedViewed: boolean) => ({ wasMarkedViewed }),\n }),\n reducers(() => ({\n trackedWindow: [\n null as string | null,\n {\n setTrackedWindow: (_, { windowId }) => windowId,\n },\n ],\n filters: [\n {} as Partial,\n {\n setFilters: (state, { filters }) => ({ ...state, ...filters }),\n },\n ],\n isRealtimePolling: [\n false as boolean,\n {\n pollRealtimeSnapshots: () => true,\n stopRealtimePolling: () => false,\n },\n ],\n isNotFound: [\n false as boolean,\n {\n loadRecordingMeta: () => false,\n loadRecordingMetaSuccess: () => false,\n loadRecordingMetaFailure: () => true,\n },\n ],\n snapshotsBySource: [\n null as Record | null,\n {\n loadSnapshotsForSourceSuccess: (state, { snapshotsForSource }) => {\n const sourceKey = getSourceKey(snapshotsForSource.source)\n\n return {\n ...state,\n [sourceKey]: snapshotsForSource,\n }\n },\n },\n ],\n wasMarkedViewed: [\n false as boolean,\n {\n setWasMarkedViewed: (_, { wasMarkedViewed }) => wasMarkedViewed,\n },\n ],\n })),\n loaders(({ values, props, cache }) => ({\n sessionComments: {\n loadRecordingComments: async (_, breakpoint) => {\n const empty: RecordingComment[] = []\n if (!props.sessionRecordingId) {\n return empty\n }\n\n const response = await api.notebooks.recordingComments(props.sessionRecordingId)\n breakpoint()\n\n return response.results || empty\n },\n },\n sessionPlayerMetaData: {\n loadRecordingMeta: async (_, breakpoint) => {\n if (!props.sessionRecordingId) {\n return null\n }\n\n cache.metaStartTime = performance.now()\n\n const response = await api.recordings.get(props.sessionRecordingId)\n breakpoint()\n\n return response\n },\n\n persistRecording: async (_, breakpoint) => {\n if (!values.sessionPlayerMetaData) {\n return null\n }\n await breakpoint(100)\n await api.recordings.persist(props.sessionRecordingId)\n\n return {\n ...values.sessionPlayerMetaData,\n storage: 'object_storage_lts',\n }\n },\n },\n snapshotSources: [\n null as SessionRecordingSnapshotSource[] | null,\n {\n loadSnapshotSources: async () => {\n const response = await api.recordings.listSnapshotSources(props.sessionRecordingId)\n return response.sources ?? []\n },\n },\n ],\n snapshotsForSource: [\n null as SessionRecordingSnapshotSourceResponse | null,\n {\n loadSnapshotsForSource: async ({ source }, breakpoint) => {\n let params: SessionRecordingSnapshotParams\n\n if (source.source === SnapshotSourceType.blob) {\n if (!source.blob_key) {\n throw new Error('Missing key')\n }\n params = { blob_key: source.blob_key, source: 'blob' }\n } else if (source.source === SnapshotSourceType.realtime) {\n params = { source: 'realtime', version: '2024-04-30' }\n } else {\n throw new Error(`Unsupported source: ${source.source}`)\n }\n\n const snapshotLoadingStartTime = performance.now()\n\n if (!cache.snapshotsStartTime) {\n cache.snapshotsStartTime = snapshotLoadingStartTime\n }\n\n await breakpoint(1)\n\n const response = await api.recordings.getSnapshots(props.sessionRecordingId, params).catch((e) => {\n if (source.source === 'realtime' && e.status === 404) {\n // Realtime source is not always available so a 404 is expected\n return []\n }\n throw e\n })\n\n const { transformed, untransformed } = await processEncodedResponse(\n response,\n props,\n values.featureFlags\n )\n\n return { snapshots: transformed, untransformed_snapshots: untransformed ?? undefined, source }\n },\n },\n ],\n sessionEventsData: [\n null as null | RecordingEventType[],\n {\n loadEvents: async () => {\n if (!cache.eventsStartTime) {\n cache.eventsStartTime = performance.now()\n }\n\n const { start, end, person } = values.sessionPlayerData\n\n if (!person || !start || !end) {\n return null\n }\n\n const [sessionEvents, relatedEvents]: any[] = await Promise.all([\n // make one query for all events that are part of the session\n makeEventsQuery(null, null, start, end, [\n {\n key: '$session_id',\n value: [props.sessionRecordingId],\n operator: PropertyOperator.Exact,\n type: PropertyFilterType.Event,\n },\n ]),\n // make a second for all events from that person,\n // not marked as part of the session\n // but in the same time range\n // these are probably e.g. backend events for the session\n // but with no session id\n // since posthog-js must always add session id we can also\n // take advantage of lib being materialized and further filter\n makeEventsQuery(null, values.sessionPlayerMetaData?.distinct_id || null, start, end, [\n {\n key: '$session_id',\n value: '',\n operator: PropertyOperator.Exact,\n type: PropertyFilterType.Event,\n },\n {\n key: '$lib',\n value: ['web'],\n operator: PropertyOperator.IsNot,\n type: PropertyFilterType.Event,\n },\n ]),\n ])\n\n return [...sessionEvents.results, ...relatedEvents.results].map(\n (event: any): RecordingEventType => {\n const currentUrl = event[5]\n // We use the pathname to simplify the UI - we build it here instead of fetching it to keep data usage small\n let pathname: string | undefined\n try {\n pathname = event[5] ? new URL(event[5]).pathname : undefined\n } catch {\n pathname = undefined\n }\n\n return {\n id: event[0],\n event: event[1],\n timestamp: event[2],\n elements: chainToElements(event[3]),\n properties: {\n $window_id: event[4],\n $current_url: currentUrl,\n $event_type: event[6],\n $pathname: pathname,\n },\n playerTime: +dayjs(event[2]) - +start,\n fullyLoaded: false,\n }\n }\n )\n },\n\n loadFullEventData: async ({ event }) => {\n // box so we're always dealing with a list\n const events = Array.isArray(event) ? event : [event]\n\n let existingEvents = values.sessionEventsData?.filter((x) => events.some((e) => e.id === x.id))\n\n const allEventsAreFullyLoaded =\n existingEvents?.every((e) => e.fullyLoaded) && existingEvents.length === events.length\n if (!existingEvents || allEventsAreFullyLoaded) {\n return values.sessionEventsData\n }\n\n existingEvents = existingEvents.filter((e) => !e.fullyLoaded)\n const timestamps = existingEvents.map((ee) => dayjs(ee.timestamp).utc().valueOf())\n const eventNames = Array.from(new Set(existingEvents.map((ee) => ee.event)))\n const eventIds = existingEvents.map((ee) => ee.id)\n const earliestTimestamp = timestamps.reduce((a, b) => Math.min(a, b))\n const latestTimestamp = timestamps.reduce((a, b) => Math.max(a, b))\n\n try {\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT properties, uuid\n FROM events\n -- the timestamp range here is only to avoid querying too much of the events table\n -- we don't really care about the absolute value, \n -- but we do care about whether timezones have an odd impact\n -- so, we extend the range by a day on each side so that timezones don't cause issues\n WHERE timestamp > ${dayjs(earliestTimestamp).subtract(1, 'day')}\n AND timestamp < ${dayjs(latestTimestamp).add(1, 'day')}\n AND event in ${eventNames}\n AND uuid in ${eventIds}`,\n }\n\n const response = await api.query(query)\n if (response.error) {\n throw new Error(response.error)\n }\n\n for (const event of existingEvents) {\n const result = response.results.find((x: any) => {\n return x[1] === event.id\n })\n\n if (result) {\n event.properties = JSON.parse(result[0])\n event.fullyLoaded = true\n }\n }\n } catch (e) {\n // NOTE: This is not ideal but should happen so rarely that it is tolerable.\n existingEvents.forEach((e) => (e.fullyLoaded = true))\n captureException(e, {\n tags: { feature: 'session-recording-load-full-event-data' },\n })\n }\n\n // here we map the events list because we want the result to be a new instance to trigger downstream recalculation\n return !values.sessionEventsData\n ? values.sessionEventsData\n : values.sessionEventsData.map((x) => {\n const event = existingEvents?.find((ee) => ee.id === x.id)\n return event\n ? ({\n ...x,\n properties: event.properties,\n fullyLoaded: event.fullyLoaded,\n } as RecordingEventType)\n : x\n })\n },\n },\n ],\n })),\n listeners(({ values, actions, cache, props }) => ({\n loadSnapshots: () => {\n // This kicks off the loading chain\n if (!values.snapshotSourcesLoading) {\n actions.loadSnapshotSources()\n }\n },\n maybeLoadRecordingMeta: () => {\n if (!values.sessionPlayerMetaDataLoading) {\n actions.loadRecordingMeta()\n }\n if (!values.sessionCommentsLoading) {\n actions.loadRecordingComments()\n }\n },\n loadSnapshotSources: () => {\n // We only load events once we actually start loading the recording\n actions.loadEvents()\n },\n loadRecordingMetaSuccess: () => {\n cache.metadataLoadDuration = Math.round(performance.now() - cache.metaStartTime)\n actions.reportUsageIfFullyLoaded()\n },\n loadRecordingMetaFailure: () => {\n cache.metadataLoadDuration = Math.round(performance.now() - cache.metaStartTime)\n },\n\n loadSnapshotSourcesSuccess: () => {\n // When we receive the list of sources we can kick off the loading chain\n actions.loadNextSnapshotSource()\n },\n\n loadSnapshotsForSourceSuccess: ({ snapshotsForSource }) => {\n const sources = values.snapshotSources\n const snapshots = snapshotsForSource.snapshots\n\n // Cache the last response count to detect if we're getting the same data over and over\n const newSnapshotsCount = snapshots.length\n\n if ((cache.lastSnapshotsCount ?? newSnapshotsCount) === newSnapshotsCount) {\n // if we're getting no results from realtime polling we can increment faster\n // so that we stop polling sooner\n const increment = newSnapshotsCount === 0 ? 2 : 1\n cache.lastSnapshotsUnchangedCount = (cache.lastSnapshotsUnchangedCount ?? 0) + increment\n } else {\n cache.lastSnapshotsUnchangedCount = 0\n }\n cache.lastSnapshotsCount = newSnapshotsCount\n\n if (!snapshots.length && sources?.length === 1) {\n // We got only a single source to load, loaded it successfully, but it had no snapshots.\n posthog.capture('recording_snapshots_v2_empty_response', {\n source: sources[0],\n })\n } else if (!cache.firstPaintDuration) {\n cache.firstPaintDuration = Math.round(performance.now() - cache.snapshotsStartTime)\n }\n if (!values.wasMarkedViewed) {\n actions.markViewed()\n }\n\n actions.loadNextSnapshotSource()\n },\n\n loadNextSnapshotSource: () => {\n const nextSourceToLoad = values.snapshotSources?.find((s) => {\n const sourceKey = getSourceKey(s)\n return !values.snapshotsBySource?.[sourceKey]\n })\n\n if (nextSourceToLoad) {\n return actions.loadSnapshotsForSource(nextSourceToLoad)\n }\n\n // TODO: Move this to a one time check - only report once per recording\n cache.snapshotsLoadDuration = Math.round(performance.now() - cache.snapshotsStartTime)\n actions.reportUsageIfFullyLoaded()\n\n // If we have a realtime source, start polling it\n const realTimeSource = values.snapshotSources?.find((s) => s.source === SnapshotSourceType.realtime)\n if (realTimeSource) {\n actions.pollRealtimeSnapshots()\n }\n },\n loadSnapshotsForSourceFailure: () => {\n cache.snapshotsLoadDuration = Math.round(performance.now() - cache.snapshotsStartTime)\n },\n pollRealtimeSnapshots: () => {\n // always make sure we've cleared up the last timeout\n clearTimeout(cache.realTimePollingTimeoutID)\n cache.realTimePollingTimeoutID = null\n\n // ten is an arbitrary limit to try to avoid sending requests to our backend unnecessarily\n // we could change this or add to it e.g. only poll if browser is visible to user\n if ((cache.lastSnapshotsUnchangedCount ?? 0) <= 10) {\n cache.realTimePollingTimeoutID = setTimeout(() => {\n actions.loadSnapshotsForSource({ source: SnapshotSourceType.realtime })\n }, props.realTimePollingIntervalMilliseconds || DEFAULT_REALTIME_POLLING_MILLIS)\n } else {\n actions.stopRealtimePolling()\n }\n },\n loadEventsSuccess: () => {\n cache.eventsLoadDuration = Math.round(performance.now() - cache.eventsStartTime)\n actions.reportUsageIfFullyLoaded()\n },\n loadEventsFailure: () => {\n cache.eventsLoadDuration = Math.round(performance.now() - cache.eventsStartTime)\n },\n reportUsageIfFullyLoaded: (_, breakpoint) => {\n breakpoint()\n if (values.fullyLoaded) {\n eventUsageLogic.actions.reportRecording(\n values.sessionPlayerData,\n generateRecordingReportDurations(cache),\n SessionRecordingUsageType.LOADED,\n values.sessionPlayerMetaData,\n 0\n )\n // Reset cache now that final usage report has been sent\n resetTimingsCache(cache)\n }\n },\n markViewed: async ({ delay }, breakpoint) => {\n const durations = generateRecordingReportDurations(cache)\n // Triggered on first paint\n breakpoint()\n if (values.wasMarkedViewed) {\n return\n }\n actions.setWasMarkedViewed(true) // this prevents us from calling the function multiple times\n\n await breakpoint(IS_TEST_MODE ? 1 : delay ?? 3000)\n await api.recordings.update(props.sessionRecordingId, {\n viewed: true,\n player_metadata: values.sessionPlayerMetaData,\n durations,\n })\n await breakpoint(IS_TEST_MODE ? 1 : 10000)\n await api.recordings.update(props.sessionRecordingId, {\n analyzed: true,\n player_metadata: values.sessionPlayerMetaData,\n durations,\n })\n },\n\n maybePersistRecording: () => {\n if (values.sessionPlayerMetaDataLoading) {\n return\n }\n\n if (values.sessionPlayerMetaData?.storage === 'object_storage') {\n actions.persistRecording()\n }\n },\n })),\n selectors(({ cache }) => ({\n webVitalsEvents: [\n (s) => [s.sessionEventsData],\n (sessionEventsData): RecordingEventType[] =>\n (sessionEventsData || []).filter((e) => e.event === '$web_vitals'),\n ],\n\n windowIdForTimestamp: [\n (s) => [s.segments],\n (segments) =>\n (timestamp: number): string | undefined => {\n return segments.find(\n (segment) => segment.startTimestamp <= timestamp && segment.endTimestamp >= timestamp\n )?.windowId\n },\n ],\n\n sessionPlayerData: [\n (s, p) => [\n s.sessionPlayerMetaData,\n s.snapshotsByWindowId,\n s.segments,\n s.bufferedToTime,\n s.start,\n s.end,\n s.durationMs,\n s.fullyLoaded,\n p.sessionRecordingId,\n ],\n (\n meta,\n snapshotsByWindowId,\n segments,\n bufferedToTime,\n start,\n end,\n durationMs,\n fullyLoaded,\n sessionRecordingId\n ): SessionPlayerData => ({\n person: meta?.person ?? null,\n start,\n end,\n durationMs,\n snapshotsByWindowId,\n segments,\n bufferedToTime,\n fullyLoaded,\n sessionRecordingId,\n }),\n ],\n\n snapshotsLoading: [\n (s) => [s.snapshotSourcesLoading, s.snapshotsForSourceLoading],\n (snapshotSourcesLoading, snapshotsForSourceLoading): boolean => {\n // if there's a realTimePollingTimeoutID, don't signal that we're loading\n // we don't want the UI to flip to \"loading\" every time we poll\n return !cache.realTimePollingTimeoutID && (snapshotSourcesLoading || snapshotsForSourceLoading)\n },\n ],\n\n snapshotsLoaded: [(s) => [s.snapshotSources], (snapshotSources): boolean => !!snapshotSources],\n\n fullyLoaded: [\n (s) => [s.snapshots, s.sessionPlayerMetaDataLoading, s.snapshotsLoading, s.sessionEventsDataLoading],\n (snapshots, sessionPlayerMetaDataLoading, snapshotsLoading, sessionEventsDataLoading): boolean => {\n // TODO: Do a proper check for all sources having been loaded\n return (\n !!snapshots.length &&\n !sessionPlayerMetaDataLoading &&\n !snapshotsLoading &&\n !sessionEventsDataLoading\n )\n },\n ],\n\n firstSnapshot: [\n (s) => [s.snapshots],\n (snapshots): RecordingSnapshot | null => {\n return snapshots[0] || null\n },\n ],\n\n lastSnapshot: [\n (s) => [s.snapshots],\n (snapshots): RecordingSnapshot | null => {\n return snapshots[snapshots.length - 1] || null\n },\n ],\n\n start: [\n (s) => [s.firstSnapshot, s.sessionPlayerMetaData],\n (firstSnapshot, meta): Dayjs | null => {\n const eventStart = meta?.start_time ? dayjs(meta.start_time) : null\n const snapshotStart = firstSnapshot ? dayjs(firstSnapshot.timestamp) : null\n\n // whichever is earliest\n if (eventStart && snapshotStart) {\n return eventStart.isBefore(snapshotStart) ? eventStart : snapshotStart\n }\n return eventStart || snapshotStart\n },\n ],\n\n end: [\n (s) => [s.lastSnapshot, s.sessionPlayerMetaData],\n (lastSnapshot, meta): Dayjs | null => {\n const eventEnd = meta?.end_time ? dayjs(meta.end_time) : null\n const snapshotEnd = lastSnapshot ? dayjs(lastSnapshot.timestamp) : null\n\n // whichever is latest\n if (eventEnd && snapshotEnd) {\n return eventEnd.isAfter(snapshotEnd) ? eventEnd : snapshotEnd\n }\n return eventEnd || snapshotEnd\n },\n ],\n\n durationMs: [\n (s) => [s.start, s.end],\n (start, end): number => {\n return !!start && !!end ? end.diff(start) : 0\n },\n ],\n\n segments: [\n (s) => [s.snapshots, s.start, s.end, s.trackedWindow],\n (snapshots, start, end, trackedWindow): RecordingSegment[] => {\n return createSegments(snapshots || [], start, end, trackedWindow)\n },\n ],\n\n urls: [\n (s) => [s.snapshots],\n (snapshots): { url: string; timestamp: number }[] => {\n return (\n snapshots\n .filter((snapshot) => getHrefFromSnapshot(snapshot))\n .map((snapshot) => {\n return {\n url: getHrefFromSnapshot(snapshot) as string,\n timestamp: snapshot.timestamp,\n }\n }) ?? []\n )\n },\n ],\n\n snapshots: [\n (s) => [s.snapshotSources, s.snapshotsBySource],\n (sources, snapshotsBySource): RecordingSnapshot[] => {\n const allSnapshots =\n sources?.flatMap((source) => {\n const sourceKey = getSourceKey(source)\n return snapshotsBySource?.[sourceKey]?.snapshots || []\n }) ?? []\n\n return deduplicateSnapshots(allSnapshots)\n },\n ],\n\n untransformedSnapshots: [\n (s) => [s.snapshotSources, s.snapshotsBySource],\n (sources, snapshotsBySource): RecordingSnapshot[] => {\n const allSnapshots =\n sources?.flatMap((source) => {\n const sourceKey = getSourceKey(source)\n return snapshotsBySource?.[sourceKey]?.untransformed_snapshots || []\n }) ?? []\n\n return deduplicateSnapshots(allSnapshots)\n },\n ],\n\n snapshotsByWindowId: [\n (s) => [s.snapshots],\n (snapshots): Record => {\n return mapSnapshotsToWindowId(snapshots || [])\n },\n ],\n\n snapshotsInvalid: [\n (s, p) => [s.snapshotsByWindowId, s.fullyLoaded, s.start, p.sessionRecordingId, s.currentTeam],\n (snapshotsByWindowId, fullyLoaded, start, sessionRecordingId, currentTeam): boolean => {\n if (!fullyLoaded || !start) {\n return false\n }\n\n const windowsHaveFullSnapshot = Object.entries(snapshotsByWindowId).reduce(\n (acc, [windowId, events]) => {\n acc[`window-id-${windowId}-has-full-snapshot`] = events.some(\n (event) => event.type === EventType.FullSnapshot\n )\n return acc\n },\n {}\n )\n const anyWindowMissingFullSnapshot = !Object.values(windowsHaveFullSnapshot).some((x) => x)\n const everyWindowMissingFullSnapshot = !Object.values(windowsHaveFullSnapshot).every((x) => x)\n\n if (everyWindowMissingFullSnapshot) {\n // video is definitely unplayable\n posthog.capture('recording_has_no_full_snapshot', {\n watchedSession: sessionRecordingId,\n teamId: currentTeam?.id,\n teamName: currentTeam?.name,\n })\n } else if (anyWindowMissingFullSnapshot) {\n posthog.capture('recording_window_missing_full_snapshot', {\n watchedSession: sessionRecordingId,\n teamID: currentTeam?.id,\n teamName: currentTeam?.name,\n })\n }\n\n return everyWindowMissingFullSnapshot\n },\n ],\n\n isRecentAndInvalid: [\n (s) => [s.start, s.snapshotsInvalid],\n (start, snapshotsInvalid) => {\n const lessThanFiveMinutesOld = dayjs().diff(start, 'minute') <= 5\n return snapshotsInvalid && lessThanFiveMinutesOld\n },\n ],\n\n bufferedToTime: [\n (s) => [s.segments],\n (segments): number | null => {\n if (!segments.length) {\n return null\n }\n\n const startTime = segments[0].startTimestamp\n const lastSegment = segments[segments.length - 1]\n\n if (lastSegment.kind === 'buffer') {\n return lastSegment.startTimestamp - startTime\n }\n\n return lastSegment.endTimestamp - startTime\n },\n ],\n\n windowIds: [\n (s) => [s.snapshotsByWindowId],\n (snapshotsByWindowId) => {\n return Object.keys(snapshotsByWindowId)\n },\n ],\n\n createExportJSON: [\n (s) => [s.sessionPlayerMetaData, s.snapshots, s.untransformedSnapshots],\n (\n sessionPlayerMetaData,\n snapshots,\n untransformedSnapshots\n ): ((exportUntransformedMobileSnapshotData: boolean) => ExportedSessionRecordingFileV2) => {\n return (exportUntransformedMobileSnapshotData: boolean) => ({\n version: '2023-04-28',\n data: {\n id: sessionPlayerMetaData?.id ?? '',\n person: sessionPlayerMetaData?.person,\n snapshots: exportUntransformedMobileSnapshotData ? untransformedSnapshots : snapshots,\n },\n })\n },\n ],\n\n customRRWebEvents: [\n (s) => [s.snapshots],\n (snapshots): customEvent[] => {\n return snapshots.filter((snapshot) => snapshot.type === EventType.Custom).map((x) => x as customEvent)\n },\n ],\n })),\n subscriptions(({ actions, values }) => ({\n webVitalsEvents: (value: RecordingEventType[]) => {\n // we preload all web vitals data, so it can be used before user interaction\n if (!values.sessionEventsDataLoading) {\n actions.loadFullEventData(value)\n }\n },\n isRecentAndInvalid: (prev: boolean, next: boolean) => {\n if (!prev && next) {\n posthog.capture('recording cannot playback yet', {\n watchedSession: values.sessionPlayerData.sessionRecordingId,\n })\n }\n },\n })),\n afterMount(({ cache }) => {\n resetTimingsCache(cache)\n }),\n beforeUnmount(({ cache }) => {\n resetTimingsCache(cache)\n }),\n])\n","import { actions, connect, kea, listeners, path, reducers } from 'kea'\nimport { loaders } from 'kea-loaders'\nimport api from 'lib/api'\nimport { dayjs } from 'lib/dayjs'\nimport { CORE_FILTER_DEFINITIONS_BY_GROUP } from 'lib/taxonomy'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\n\nimport { HogQLQuery, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport { SessionRecordingPropertiesType, SessionRecordingType } from '~/types'\n\nimport type { sessionRecordingsListPropertiesLogicType } from './sessionRecordingsListPropertiesLogicType'\n\n// This logic is used to fetch properties for a list of recordings\n// It is used in a global way as the cached values can be re-used\nexport const sessionRecordingsListPropertiesLogic = kea([\n path(() => ['scenes', 'session-recordings', 'playlist', 'sessionRecordingsListPropertiesLogic']),\n connect(() => ({\n actions: [eventUsageLogic, ['reportRecordingsListPropertiesFetched']],\n })),\n\n actions({\n loadPropertiesForSessions: (sessions: SessionRecordingType[]) => ({ sessions }),\n maybeLoadPropertiesForSessions: (sessions: SessionRecordingType[]) => ({ sessions }),\n }),\n\n loaders(({ actions }) => ({\n recordingProperties: [\n [] as SessionRecordingPropertiesType[],\n {\n loadPropertiesForSessions: async ({ sessions }, breakpoint) => {\n await breakpoint(100)\n\n const startTime = performance.now()\n const sessionIds = sessions.map((x) => x.id)\n\n const oldestTimestamp = sessions.map((x) => x.start_time).sort()[0]\n const newestTimestamp = sessions.map((x) => x.end_time).sort()[sessions.length - 1]\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`SELECT \n $session_id as session_id, \n any(properties.$geoip_country_code) as $geoip_country_code, \n any(properties.$browser) as $browser, \n any(properties.$device_type) as $device_type, \n any(properties.$os) as $os, \n any(properties.$os_name) as $os_name,\n argMin(properties.$referring_domain, timestamp) as $referring_domain,\n any(properties.$geoip_subdivision_1_name) as $geoip_subdivision_1_name,\n any(properties.$geoip_city_name) as $geoip_city_name\n FROM events\n WHERE event IN ${Object.keys(CORE_FILTER_DEFINITIONS_BY_GROUP['events'])}\n AND session_id IN ${sessionIds}\n -- the timestamp range here is only to avoid querying too much of the events table\n -- we don't really care about the absolute value, \n -- but we do care about whether timezones have an odd impact\n -- so, we extend the range by a day on each side so that timezones don't cause issues\n AND timestamp >= ${dayjs(oldestTimestamp).subtract(1, 'day')}\n AND timestamp <= ${dayjs(newestTimestamp).add(1, 'day')}\n GROUP BY session_id`,\n }\n\n const response = await api.query(query)\n const loadTimeMs = performance.now() - startTime\n\n actions.reportRecordingsListPropertiesFetched(loadTimeMs)\n\n breakpoint()\n return (response.results || []).map((x: any): SessionRecordingPropertiesType => {\n return {\n id: x[0],\n properties: {\n $geoip_country_code: x[1],\n $browser: x[2],\n $device_type: x[3],\n $os: x[4],\n $os_name: x[5],\n $referring_domain: x[6],\n $geoip_subdivision_1_name: x[7],\n $geoip_city_name: x[8],\n },\n }\n })\n },\n },\n ],\n })),\n\n listeners(({ actions, values }) => ({\n maybeLoadPropertiesForSessions: ({ sessions }) => {\n const newSessions = sessions.filter((session) => !values.recordingPropertiesById[session.id])\n\n if (newSessions.length > 0) {\n actions.loadPropertiesForSessions(newSessions)\n }\n },\n })),\n\n reducers({\n recordingPropertiesById: [\n {} as Record,\n {\n loadPropertiesForSessionsSuccess: (\n state,\n { recordingProperties }\n ): Record => {\n const newState = { ...state }\n recordingProperties.forEach((properties) => {\n newState[properties.id] = properties.properties\n })\n\n return newState\n },\n },\n ],\n }),\n])\n","import { Link } from '@posthog/lemon-ui'\nimport { useActions, useValues } from 'kea'\nimport { Form } from 'kea-forms'\nimport { CopyToClipboardInline } from 'lib/components/CopyToClipboard'\nimport { LemonBanner } from 'lib/lemon-ui/LemonBanner'\nimport { LemonButton } from 'lib/lemon-ui/LemonButton'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonInput } from 'lib/lemon-ui/LemonInput/LemonInput'\nimport { LemonModal } from 'lib/lemon-ui/LemonModal'\nimport { LemonTextArea } from 'lib/lemon-ui/LemonTextArea/LemonTextArea'\nimport { preflightLogic } from 'scenes/PreflightCheck/preflightLogic'\n\nimport { verifiedDomainsLogic } from './verifiedDomainsLogic'\n\nexport function ConfigureSAMLModal(): JSX.Element {\n const { configureSAMLModalId, isSamlConfigSubmitting, samlConfig } = useValues(verifiedDomainsLogic)\n const { setConfigureSAMLModalId } = useActions(verifiedDomainsLogic)\n const { preflight } = useValues(preflightLogic)\n const siteUrl = preflight?.site_url ?? window.location.origin\n\n const samlReady = samlConfig.saml_acs_url && samlConfig.saml_entity_id && samlConfig.saml_x509_cert\n\n const handleClose = (): void => {\n setConfigureSAMLModalId(null)\n // clean()\n }\n\n return (\n \n
\n \n

Configure SAML authentication and provisioning

\n
\n \n

\n \n Read the docs\n \n

\n \n {`${siteUrl}/complete/saml/`}\n \n \n {configureSAMLModalId || 'unknown'}\n \n \n {siteUrl}\n \n \n \n \n \n \n \n \n \n \n {!samlReady && (\n \n SAML will not be enabled unless you enter all attributes above. However you can still\n settings as draft.\n \n )}\n
\n \n \n Save settings\n \n \n
\n
\n )\n}\n","import { IconEllipsis, IconInfo } from '@posthog/icons'\nimport {\n LemonBanner,\n LemonButton,\n LemonDialog,\n LemonInput,\n LemonMenu,\n LemonTable,\n LemonTableColumns,\n LemonTabs,\n Spinner,\n Tooltip,\n} from '@posthog/lemon-ui'\nimport clsx from 'clsx'\nimport { useActions, useValues } from 'kea'\nimport { Form } from 'kea-forms'\nimport { CodeSnippet, Language } from 'lib/components/CodeSnippet'\nimport { PayGateMini } from 'lib/components/PayGateMini/PayGateMini'\nimport { RestrictionScope, useRestrictedArea } from 'lib/components/RestrictedArea'\nimport { OrganizationMembershipLevel } from 'lib/constants'\nimport { LemonField } from 'lib/lemon-ui/LemonField'\nimport { LemonMarkdown } from 'lib/lemon-ui/LemonMarkdown'\n\nimport { AvailableFeature } from '~/types'\n\nimport { proxyLogic, ProxyRecord } from './proxyLogic'\n\nconst MAX_PROXY_RECORDS = 3\n\nconst statusText = {\n valid: 'live',\n timed_out: 'timed out',\n}\n\nexport function ManagedReverseProxy(): JSX.Element {\n const { formState, proxyRecords, proxyRecordsLoading } = useValues(proxyLogic)\n const { showForm, deleteRecord } = useActions(proxyLogic)\n\n const restrictionReason = useRestrictedArea({\n minimumAccessLevel: OrganizationMembershipLevel.Admin,\n scope: RestrictionScope.Organization,\n })\n\n const maxRecordsReached = proxyRecords.length >= MAX_PROXY_RECORDS\n\n const recordsWithMessages = proxyRecords.filter((record) => !!record.message)\n\n const columns: LemonTableColumns = [\n {\n title: 'Domain',\n dataIndex: 'domain',\n },\n {\n title: 'Status',\n dataIndex: 'status',\n render: function RenderStatus(status) {\n if (!status) {\n return Unknown\n }\n\n return (\n \n {status === 'issuing' && }\n {statusText[status] || status}\n {status === 'waiting' && (\n \n \n \n )}\n {status === 'timed_out' && (\n \n \n \n )}\n \n )\n },\n },\n {\n title: ,\n width: 20,\n className: 'flex justify-center',\n render: function Render(_, { id, status }) {\n return (\n status != 'deleting' &&\n !restrictionReason && (\n {\n LemonDialog.open({\n title: 'Delete managed proxy',\n width: '20rem',\n content:\n 'Are you sure you want to delete this managed proxy? This cannot be undone and if it is in use then events sent to the domain will not be processed.',\n primaryButton: {\n status: 'danger',\n onClick: () => deleteRecord(id),\n children: 'Delete',\n },\n secondaryButton: {\n children: 'Cancel',\n },\n })\n },\n },\n ]}\n >\n } />\n \n )\n )\n },\n },\n ]\n\n return (\n \n
\n {recordsWithMessages.map((r) => (\n \n {`**${r.domain}**\\n ${r.message}`}\n \n ))}\n ,\n }}\n />\n {formState === 'collapsed' ? (\n maxRecordsReached ? (\n \n There is a maximum of {MAX_PROXY_RECORDS} records allowed per organization\n \n ) : (\n
\n \n Add managed proxy\n \n
\n )\n ) : (\n \n )}\n
\n
\n )\n}\n\nconst ExpandedRow = ({ record }: { record: ProxyRecord }): JSX.Element => {\n return (\n
\n \n {record.target_cname}\n \n ),\n },\n ]}\n />\n
\n )\n}\n\nfunction CreateRecordForm(): JSX.Element {\n const { formState, proxyRecordsLoading, proxyRecords } = useValues(proxyLogic)\n const { collapseForm } = useActions(proxyLogic)\n\n const waitingRecords = proxyRecords.filter((r) => r.status === 'waiting')\n\n return (\n
\n {formState == 'active' ? (\n
\n \n \n \n
\n \n Cancel\n \n \n Add\n \n
\n
\n ) : (\n <>\n
Almost there
\n
\n You need to set the following CNAME records in your DNS provider:\n
\n {waitingRecords.map((r) => (\n
\n {r.domain}\n \n {r.target_cname}\n \n
\n ))}\n
\n \n Done\n \n
\n \n )}\n
\n )\n}\n","import { lemonToast } from '@posthog/lemon-ui'\nimport { actions, afterMount, connect, kea, key, listeners, path, props, reducers, selectors } from 'kea'\nimport { forms } from 'kea-forms'\nimport { loaders } from 'kea-loaders'\nimport { actionToUrl, router, urlToAction } from 'kea-router'\nimport api from 'lib/api'\nimport { dayjs } from 'lib/dayjs'\nimport { featureFlagLogic as enabledFlagLogic } from 'lib/logic/featureFlagLogic'\nimport { hasFormErrors, isObject } from 'lib/utils'\nimport { eventUsageLogic } from 'lib/utils/eventUsageLogic'\nimport { Scene } from 'scenes/sceneTypes'\nimport { teamLogic } from 'scenes/teamLogic'\nimport { urls } from 'scenes/urls'\n\nimport { DataTableNode, HogQLQuery, InsightVizNode, NodeKind } from '~/queries/schema'\nimport { hogql } from '~/queries/utils'\nimport {\n BaseMathType,\n Breadcrumb,\n FeatureFlagFilters,\n MultipleSurveyQuestion,\n PropertyFilterType,\n PropertyOperator,\n RatingSurveyQuestion,\n Survey,\n SurveyQuestionBase,\n SurveyQuestionBranchingType,\n SurveyQuestionType,\n SurveyUrlMatchType,\n} from '~/types'\n\nimport { defaultSurveyAppearance, defaultSurveyFieldValues, NEW_SURVEY, NewSurvey } from './constants'\nimport type { surveyLogicType } from './surveyLogicType'\nimport { surveysLogic } from './surveysLogic'\nimport { sanitizeHTML } from './utils'\n\nexport enum SurveyEditSection {\n Steps = 'steps',\n Widget = 'widget',\n Presentation = 'presentation',\n Appearance = 'appearance',\n Customization = 'customization',\n DisplayConditions = 'DisplayConditions',\n Scheduling = 'scheduling',\n CompletionConditions = 'CompletionConditions',\n}\nexport interface SurveyLogicProps {\n /** Either a UUID or 'new'. */\n id: string\n}\n\nexport interface SurveyMetricsQueries {\n surveysShown: DataTableNode\n surveysDismissed: DataTableNode\n}\n\nexport interface SurveyUserStats {\n seen: number\n dismissed: number\n sent: number\n}\n\nexport interface SurveyRatingResults {\n [key: number]: {\n data: number[]\n total: number\n }\n}\n\nexport interface SurveyRecurringNPSResults {\n [key: number]: {\n data: number[]\n total: number\n }\n}\n\ntype SurveyNPSResult = {\n Promoters: number\n Detractors: number\n Passives: number\n}\n\nexport interface SurveySingleChoiceResults {\n [key: number]: {\n labels: string[]\n data: number[]\n total: number\n }\n}\n\nexport interface SurveyMultipleChoiceResults {\n [key: number]: {\n labels: string[]\n data: number[]\n }\n}\n\nexport interface SurveyOpenTextResults {\n [key: number]: {\n events: { distinct_id: string; properties: Record; personProperties: Record }[]\n }\n}\n\nexport interface QuestionResultsReady {\n [key: string]: boolean\n}\n\nexport type DataCollectionType = 'until_stopped' | 'until_limit' | 'until_adaptive_limit'\nexport type ScheduleType = 'once' | 'recurring'\n\nconst getResponseField = (i: number): string => (i === 0 ? '$survey_response' : `$survey_response_${i}`)\n\nfunction duplicateExistingSurvey(survey: Survey | NewSurvey): Partial {\n return {\n ...survey,\n id: NEW_SURVEY.id,\n name: `${survey.name} (copy)`,\n archived: false,\n start_date: null,\n end_date: null,\n targeting_flag_filters: survey.targeting_flag?.filters ?? NEW_SURVEY.targeting_flag_filters,\n linked_flag_id: survey.linked_flag?.id ?? NEW_SURVEY.linked_flag_id,\n }\n}\n\nexport const surveyLogic = kea([\n props({} as SurveyLogicProps),\n key(({ id }) => id),\n path((key) => ['scenes', 'surveys', 'surveyLogic', key]),\n connect(() => ({\n actions: [\n surveysLogic,\n ['loadSurveys'],\n eventUsageLogic,\n [\n 'reportSurveyCreated',\n 'reportSurveyEdited',\n 'reportSurveyArchived',\n 'reportSurveyViewed',\n 'reportSurveyCycleDetected',\n ],\n ],\n values: [enabledFlagLogic, ['featureFlags as enabledFlags'], surveysLogic, ['surveys']],\n })),\n actions({\n setSurveyMissing: true,\n editingSurvey: (editing: boolean) => ({ editing }),\n setDefaultForQuestionType: (\n idx: number,\n type: SurveyQuestionType,\n isEditingQuestion: boolean,\n isEditingDescription: boolean,\n isEditingThankYouMessage: boolean\n ) => ({\n idx,\n type,\n isEditingQuestion,\n isEditingDescription,\n isEditingThankYouMessage,\n }),\n setQuestionBranchingType: (questionIndex, type, specificQuestionIndex) => ({\n questionIndex,\n type,\n specificQuestionIndex,\n }),\n setResponseBasedBranchingForQuestion: (questionIndex, responseValue, nextStep, specificQuestionIndex) => ({\n questionIndex,\n responseValue,\n nextStep,\n specificQuestionIndex,\n }),\n setDataCollectionType: (dataCollectionType: DataCollectionType) => ({\n dataCollectionType,\n }),\n resetBranchingForQuestion: (questionIndex) => ({ questionIndex }),\n deleteBranchingLogic: true,\n archiveSurvey: true,\n setWritingHTMLDescription: (writingHTML: boolean) => ({ writingHTML }),\n setSurveyTemplateValues: (template: any) => ({ template }),\n setSelectedPageIndex: (idx: number | null) => ({ idx }),\n setSelectedSection: (section: SurveyEditSection | null) => ({ section }),\n\n setSchedule: (schedule: ScheduleType) => ({ schedule }),\n resetTargeting: true,\n resetSurveyAdaptiveSampling: true,\n resetSurveyResponseLimits: true,\n setFlagPropertyErrors: (errors: any) => ({ errors }),\n }),\n loaders(({ props, actions, values }) => ({\n responseSummary: {\n summarize: async ({ questionIndex }: { questionIndex?: number }) => {\n return api.surveys.summarize_responses(props.id, questionIndex)\n },\n },\n survey: {\n loadSurvey: async () => {\n if (props.id && props.id !== 'new') {\n try {\n const survey = await api.surveys.get(props.id)\n actions.reportSurveyViewed(survey)\n return survey\n } catch (error: any) {\n if (error.status === 404) {\n actions.setSurveyMissing()\n return { ...NEW_SURVEY }\n }\n throw error\n }\n }\n if (props.id === 'new' && router.values.hashParams.fromTemplate) {\n const templatedSurvey = values.survey\n templatedSurvey.appearance = {\n ...defaultSurveyAppearance,\n ...teamLogic.values.currentTeam?.survey_config?.appearance,\n ...templatedSurvey.appearance,\n }\n return templatedSurvey\n }\n\n const newSurvey = NEW_SURVEY\n newSurvey.appearance = {\n ...defaultSurveyAppearance,\n ...teamLogic.values.currentTeam?.survey_config?.appearance,\n ...newSurvey.appearance,\n }\n\n return newSurvey\n },\n createSurvey: async (surveyPayload: Partial) => {\n return await api.surveys.create(sanitizeQuestions(surveyPayload))\n },\n updateSurvey: async (surveyPayload: Partial) => {\n return await api.surveys.update(props.id, sanitizeQuestions(surveyPayload))\n },\n launchSurvey: async () => {\n const startDate = dayjs()\n return await api.surveys.update(props.id, { start_date: startDate.toISOString() })\n },\n stopSurvey: async () => {\n return await api.surveys.update(props.id, { end_date: dayjs().toISOString() })\n },\n resumeSurvey: async () => {\n return await api.surveys.update(props.id, { end_date: null })\n },\n },\n duplicatedSurvey: {\n duplicateSurvey: async () => {\n const { survey } = values\n const payload = duplicateExistingSurvey(survey)\n const createdSurvey = await api.surveys.create(sanitizeQuestions(payload))\n\n lemonToast.success('Survey duplicated.', {\n toastId: `survey-duplicated-${createdSurvey.id}`,\n button: {\n label: 'View Survey',\n action: () => {\n router.actions.push(urls.survey(createdSurvey.id))\n },\n },\n })\n\n actions.reportSurveyCreated(createdSurvey, true)\n return survey\n },\n },\n surveyUserStats: {\n loadSurveyUserStats: async (): Promise => {\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: hogql`\n SELECT\n (SELECT COUNT(DISTINCT person_id)\n FROM events\n WHERE event = 'survey shown'\n AND properties.$survey_id = ${props.id}\n AND timestamp >= ${startDate}\n AND timestamp <= ${endDate}),\n (SELECT COUNT(DISTINCT person_id)\n FROM events\n WHERE event = 'survey dismissed'\n AND properties.$survey_id = ${props.id}\n AND timestamp >= ${startDate}\n AND timestamp <= ${endDate}),\n (SELECT COUNT(DISTINCT person_id)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = ${props.id}\n AND timestamp >= ${startDate}\n AND timestamp <= ${endDate})\n `,\n }\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n if (results && results[0]) {\n const [totalSeen, dismissed, sent] = results[0]\n const onlySeen = totalSeen - dismissed - sent\n return { seen: onlySeen < 0 ? 0 : onlySeen, dismissed, sent }\n }\n return { seen: 0, dismissed: 0, sent: 0 }\n },\n },\n surveyRatingResults: {\n loadSurveyRatingResults: async ({\n questionIndex,\n iteration,\n }: {\n questionIndex: number\n iteration?: number | null | undefined\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.Rating) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.Rating}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n let iterationCondition = ''\n if (iteration && iteration > 0) {\n iterationCondition = ` AND properties.$survey_iteration='${iteration}' `\n }\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n JSONExtractString(properties, '${getResponseField(questionIndex)}') AS survey_response,\n COUNT(survey_response)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = '${props.id}'\n ${iterationCondition}\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY survey_response\n `,\n }\n const responseJSON = await api.query(query)\n // TODO:Dylan - I don't like how we lose our types here\n // would be cool if we could parse this in a more type-safe way\n const { results } = responseJSON\n\n let total = 0\n const dataSize = question.scale === 10 ? 11 : question.scale\n const data = new Array(dataSize).fill(0)\n results?.forEach(([value, count]) => {\n total += count\n\n const index = question.scale === 10 ? value : value - 1\n data[index] = count\n })\n\n return { ...values.surveyRatingResults, [questionIndex]: { total, data } }\n },\n },\n surveyRecurringNPSResults: {\n loadSurveyRecurringNPSResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.Rating) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.Rating}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n JSONExtractString(properties, '$survey_iteration') AS survey_iteration,\n JSONExtractString(properties, '${getResponseField(questionIndex)}') AS survey_response,\n COUNT(survey_response)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = '${props.id}'\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY survey_response, survey_iteration\n `,\n }\n\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n let total = 100\n const data = new Array(survey.iteration_count).fill(0)\n\n const iterations = new Map()\n\n results?.forEach(([iteration, response, count]) => {\n let promoters = 0\n let passives = 0\n let detractors = 0\n\n if (parseInt(response) >= 9) {\n // a Promoter is someone who gives a survey response of 9 or 10\n promoters += parseInt(count)\n } else if (parseInt(response) > 6) {\n // a Passive is someone who gives a survey response of 7 or 8\n passives += parseInt(count)\n } else {\n // a Detractor is someone who gives a survey response of 0 - 6\n detractors += parseInt(count)\n }\n\n if (iterations.has(iteration)) {\n const currentValue = iterations.get(iteration)\n if (currentValue !== undefined) {\n currentValue.Detractors += detractors\n currentValue.Promoters += promoters\n currentValue.Passives += passives\n }\n } else {\n iterations.set(iteration, {\n Detractors: detractors,\n Passives: passives,\n Promoters: promoters,\n })\n }\n })\n\n iterations.forEach((value: SurveyNPSResult, key: string) => {\n // NPS score is calculated with this formula\n // (Promoters / (Promoters + Passives + Detractors) * 100) - (Detractors / (Promoters + Passives + Detractors)* 100)\n const totalResponses = value.Promoters + value.Passives + value.Detractors\n const npsScore =\n (value.Promoters / totalResponses) * 100 - (value.Detractors / totalResponses) * 100\n data[parseInt(key) - 1] = npsScore\n total += 100\n })\n\n return { ...values.surveyRecurringNPSResults, [questionIndex]: { total, data } }\n },\n },\n surveySingleChoiceResults: {\n loadSurveySingleChoiceResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n JSONExtractString(properties, '${getResponseField(questionIndex)}') AS survey_response,\n COUNT(survey_response)\n FROM events\n WHERE event = 'survey sent'\n AND properties.$survey_id = '${props.id}'\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY survey_response\n `,\n }\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n\n const labels = results?.map((r) => r[0])\n const data = results?.map((r) => r[1])\n const total = data?.reduce((a, b) => a + b, 0)\n\n return { ...values.surveySingleChoiceResults, [questionIndex]: { labels, data, total } }\n },\n },\n surveyMultipleChoiceResults: {\n loadSurveyMultipleChoiceResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.MultipleChoice) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.MultipleChoice}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT\n count(),\n arrayJoin(JSONExtractArrayRaw(properties, '${getResponseField(questionIndex)}')) AS choice\n FROM events\n WHERE event == 'survey sent'\n AND properties.$survey_id == '${survey.id}'\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n GROUP BY choice\n ORDER BY count() DESC\n `,\n }\n const responseJSON = await api.query(query)\n let { results } = responseJSON\n\n // Remove outside quotes\n results = results?.map((r) => {\n return [r[0], r[1].slice(1, r[1].length - 1)]\n })\n\n // Zero-fill choices that are not open-ended\n question.choices.forEach((choice, idx) => {\n const isOpenChoice = idx == question.choices.length - 1 && question?.hasOpenChoice\n if (results?.length && !isOpenChoice && !results.some((r) => r[1] === choice)) {\n results.push([0, choice])\n }\n })\n\n const data = results?.map((r) => r[0])\n const labels = results?.map((r) => r[1])\n\n return { ...values.surveyMultipleChoiceResults, [questionIndex]: { labels, data } }\n },\n },\n surveyOpenTextResults: {\n loadSurveyOpenTextResults: async ({\n questionIndex,\n }: {\n questionIndex: number\n }): Promise => {\n const question = values.survey.questions[questionIndex]\n if (question.type !== SurveyQuestionType.Open) {\n throw new Error(`Survey question type must be ${SurveyQuestionType.Open}`)\n }\n\n const survey: Survey = values.survey as Survey\n const startDate = dayjs(survey.start_date || survey.created_at).format('YYYY-MM-DD')\n const endDate = survey.end_date\n ? dayjs(survey.end_date).add(1, 'day').format('YYYY-MM-DD')\n : dayjs().add(1, 'day').format('YYYY-MM-DD')\n\n const query: HogQLQuery = {\n kind: NodeKind.HogQLQuery,\n query: `\n SELECT distinct_id, properties, person.properties\n FROM events\n WHERE event == 'survey sent'\n AND properties.$survey_id == '${survey.id}'\n AND trim(JSONExtractString(properties, '${getResponseField(questionIndex)}')) != ''\n AND timestamp >= '${startDate}'\n AND timestamp <= '${endDate}'\n LIMIT 20\n `,\n }\n\n const responseJSON = await api.query(query)\n const { results } = responseJSON\n\n const events =\n results?.map((r) => {\n const distinct_id = r[0]\n const properties = JSON.parse(r[1])\n const personProperties = JSON.parse(r[2])\n return { distinct_id, properties, personProperties }\n }) || []\n\n return { ...values.surveyOpenTextResults, [questionIndex]: { events } }\n },\n },\n })),\n listeners(({ actions, values }) => ({\n createSurveySuccess: ({ survey }) => {\n lemonToast.success(<>Survey {survey.name} created)\n actions.loadSurveys()\n router.actions.replace(urls.survey(survey.id))\n actions.reportSurveyCreated(survey)\n },\n updateSurveySuccess: ({ survey }) => {\n lemonToast.success(<>Survey {survey.name} updated)\n actions.editingSurvey(false)\n actions.reportSurveyEdited(survey)\n actions.loadSurveys()\n },\n duplicateSurveySuccess: () => {\n actions.loadSurveys()\n },\n launchSurveySuccess: ({ survey }) => {\n lemonToast.success(<>Survey {survey.name} launched)\n actions.loadSurveys()\n },\n stopSurveySuccess: () => {\n actions.loadSurveys()\n },\n resumeSurveySuccess: () => {\n actions.loadSurveys()\n },\n archiveSurvey: () => {\n actions.updateSurvey({ archived: true })\n },\n loadSurveySuccess: () => {\n actions.loadSurveyUserStats()\n },\n resetSurveyResponseLimits: () => {\n actions.setSurveyValue('responses_limit', null)\n },\n\n resetSurveyAdaptiveSampling: () => {\n actions.setSurveyValues({\n response_sampling_interval: null,\n response_sampling_interval_type: null,\n response_sampling_limit: null,\n response_sampling_start_date: null,\n response_sampling_daily_limits: null,\n })\n },\n resetTargeting: () => {\n actions.setSurveyValue('linked_flag_id', NEW_SURVEY.linked_flag_id)\n actions.setSurveyValue('targeting_flag_filters', NEW_SURVEY.targeting_flag_filters)\n actions.setSurveyValue('linked_flag', NEW_SURVEY.linked_flag)\n actions.setSurveyValue('targeting_flag', NEW_SURVEY.targeting_flag)\n actions.setSurveyValue('conditions', NEW_SURVEY.conditions)\n actions.setSurveyValue('remove_targeting_flag', true)\n actions.setSurveyValue('responses_limit', NEW_SURVEY.responses_limit)\n actions.setSurveyValues({\n iteration_count: NEW_SURVEY.iteration_count,\n iteration_frequency_days: NEW_SURVEY.iteration_frequency_days,\n })\n actions.setFlagPropertyErrors(NEW_SURVEY.targeting_flag_filters)\n },\n submitSurveyFailure: async () => {\n // When errors occur, scroll to the error, but wait for errors to be set in the DOM first\n if (hasFormErrors(values.flagPropertyErrors) || values.urlMatchTypeValidationError) {\n actions.setSelectedSection(SurveyEditSection.DisplayConditions)\n } else {\n actions.setSelectedSection(SurveyEditSection.Steps)\n }\n setTimeout(\n () => document.querySelector(`.Field--error`)?.scrollIntoView({ block: 'center', behavior: 'smooth' }),\n 5\n )\n },\n })),\n reducers({\n isEditingSurvey: [\n false,\n {\n editingSurvey: (_, { editing }) => editing,\n },\n ],\n surveyMissing: [\n false,\n {\n setSurveyMissing: () => true,\n },\n ],\n dataCollectionType: [\n 'until_stopped' as DataCollectionType,\n {\n setDataCollectionType: (_, { dataCollectionType }) => dataCollectionType,\n },\n ],\n\n survey: [\n { ...NEW_SURVEY } as NewSurvey | Survey,\n {\n setDefaultForQuestionType: (\n state,\n { idx, type, isEditingQuestion, isEditingDescription, isEditingThankYouMessage }\n ) => {\n const question = isEditingQuestion\n ? state.questions[idx].question\n : defaultSurveyFieldValues[type].questions[0].question\n const description = isEditingDescription\n ? state.questions[idx].description\n : defaultSurveyFieldValues[type].questions[0].description\n const thankYouMessageHeader = isEditingThankYouMessage\n ? state.appearance?.thankYouMessageHeader\n : defaultSurveyFieldValues[type].appearance.thankYouMessageHeader\n const newQuestions = [...state.questions]\n newQuestions[idx] = {\n ...state.questions[idx],\n ...(defaultSurveyFieldValues[type].questions[0] as SurveyQuestionBase),\n question,\n description,\n }\n return {\n ...state,\n questions: newQuestions,\n appearance: {\n ...state.appearance,\n ...defaultSurveyFieldValues[type].appearance,\n thankYouMessageHeader,\n },\n }\n },\n setSurveyTemplateValues: (_, { template }) => {\n const newTemplateSurvey = { ...NEW_SURVEY, ...template }\n return newTemplateSurvey\n },\n setQuestionBranchingType: (state, { questionIndex, type, specificQuestionIndex }) => {\n const newQuestions = [...state.questions]\n const question = newQuestions[questionIndex]\n\n if (type === SurveyQuestionBranchingType.NextQuestion) {\n delete question.branching\n } else if (type === SurveyQuestionBranchingType.End) {\n question.branching = {\n type: SurveyQuestionBranchingType.End,\n }\n } else if (type === SurveyQuestionBranchingType.ResponseBased) {\n if (\n question.type !== SurveyQuestionType.Rating &&\n question.type !== SurveyQuestionType.SingleChoice\n ) {\n throw new Error(\n `Survey question type must be ${SurveyQuestionType.Rating} or ${SurveyQuestionType.SingleChoice}`\n )\n }\n\n question.branching = {\n type: SurveyQuestionBranchingType.ResponseBased,\n responseValues: {},\n }\n } else if (type === SurveyQuestionBranchingType.SpecificQuestion) {\n question.branching = {\n type: SurveyQuestionBranchingType.SpecificQuestion,\n index: specificQuestionIndex,\n }\n }\n\n newQuestions[questionIndex] = question\n return {\n ...state,\n questions: newQuestions,\n }\n },\n setResponseBasedBranchingForQuestion: (\n state,\n { questionIndex, responseValue, nextStep, specificQuestionIndex }\n ) => {\n const newQuestions = [...state.questions]\n const question = newQuestions[questionIndex]\n\n if (\n question.type !== SurveyQuestionType.Rating &&\n question.type !== SurveyQuestionType.SingleChoice\n ) {\n throw new Error(\n `Survey question type must be ${SurveyQuestionType.Rating} or ${SurveyQuestionType.SingleChoice}`\n )\n }\n\n if (question.branching?.type !== SurveyQuestionBranchingType.ResponseBased) {\n throw new Error(\n `Survey question branching type must be ${SurveyQuestionBranchingType.ResponseBased}`\n )\n }\n\n if ('responseValues' in question.branching) {\n if (nextStep === SurveyQuestionBranchingType.NextQuestion) {\n delete question.branching.responseValues[responseValue]\n } else if (nextStep === SurveyQuestionBranchingType.End) {\n question.branching.responseValues[responseValue] = SurveyQuestionBranchingType.End\n } else if (nextStep === SurveyQuestionBranchingType.SpecificQuestion) {\n question.branching.responseValues[responseValue] = specificQuestionIndex\n }\n }\n\n newQuestions[questionIndex] = question\n return {\n ...state,\n questions: newQuestions,\n }\n },\n resetBranchingForQuestion: (state, { questionIndex }) => {\n const newQuestions = [...state.questions]\n const question = newQuestions[questionIndex]\n delete question.branching\n\n newQuestions[questionIndex] = question\n return {\n ...state,\n questions: newQuestions,\n }\n },\n deleteBranchingLogic: (state) => {\n const newQuestions = [...state.questions]\n newQuestions.forEach((question) => {\n delete question.branching\n })\n\n return {\n ...state,\n questions: newQuestions,\n }\n },\n },\n ],\n selectedPageIndex: [\n 0 as number | null,\n {\n setSelectedPageIndex: (_, { idx }) => idx,\n },\n ],\n selectedSection: [\n SurveyEditSection.Steps as SurveyEditSection | null,\n {\n setSelectedSection: (_, { section }) => section,\n },\n ],\n surveyRatingResultsReady: [\n {},\n {\n loadSurveyRatingResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveyRecurringNPSResultsReady: [\n {},\n {\n loadSurveyRecurringNPSResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveySingleChoiceResultsReady: [\n {},\n {\n loadSurveySingleChoiceResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveyMultipleChoiceResultsReady: [\n {},\n {\n loadSurveyMultipleChoiceResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n surveyOpenTextResultsReady: [\n {},\n {\n loadSurveyOpenTextResultsSuccess: (state, { payload }) => {\n if (!payload || !payload.hasOwnProperty('questionIndex')) {\n return { ...state }\n }\n return { ...state, [payload.questionIndex]: true }\n },\n },\n ],\n writingHTMLDescription: [\n false,\n {\n setWritingHTMLDescription: (_, { writingHTML }) => writingHTML,\n },\n ],\n schedule: [\n 'once',\n {\n setSchedule: (_, { schedule }) => schedule,\n },\n ],\n flagPropertyErrors: [\n null as any,\n {\n setFlagPropertyErrors: (_, { errors }) => errors,\n },\n ],\n }),\n selectors({\n isSurveyRunning: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return !!(survey.start_date && !survey.end_date)\n },\n ],\n surveyUsesLimit: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return !!(survey.responses_limit && survey.responses_limit > 0)\n },\n ],\n surveyUsesAdaptiveLimit: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return !!(\n survey.response_sampling_interval &&\n survey.response_sampling_interval > 0 &&\n survey.response_sampling_interval_type !== '' &&\n survey.response_sampling_limit &&\n survey.response_sampling_limit > 0\n )\n },\n ],\n surveyShufflingQuestionsAvailable: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n return survey.questions.length > 1\n },\n ],\n showSurveyRepeatSchedule: [(s) => [s.schedule], (schedule: ScheduleType) => schedule == 'recurring'],\n descriptionContentType: [\n (s) => [s.survey],\n (survey: Survey) => (questionIndex: number) => {\n return survey.questions[questionIndex].descriptionContentType\n },\n ],\n surveyRepeatedActivationAvailable: [\n (s) => [s.survey],\n (survey: Survey): boolean =>\n survey.conditions?.events?.values != undefined && survey.conditions?.events?.values?.length > 0,\n ],\n hasTargetingSet: [\n (s) => [s.survey],\n (survey: Survey): boolean => {\n const hasLinkedFlag =\n !!survey.linked_flag_id || (survey.linked_flag && Object.keys(survey.linked_flag).length > 0)\n const hasTargetingFlag =\n (survey.targeting_flag && Object.keys(survey.targeting_flag).length > 0) ||\n (survey.targeting_flag_filters && Object.keys(survey.targeting_flag_filters).length > 0)\n const hasOtherConditions = survey.conditions && Object.keys(survey.conditions).length > 0\n return !!hasLinkedFlag || !!hasTargetingFlag || !!hasOtherConditions\n },\n ],\n breadcrumbs: [\n (s) => [s.survey],\n (survey: Survey): Breadcrumb[] => [\n {\n key: Scene.Surveys,\n name: 'Surveys',\n path: urls.surveys(),\n },\n { key: [Scene.Survey, survey?.id || 'new'], name: survey.name },\n ],\n ],\n dataTableQuery: [\n (s) => [s.survey],\n (survey): DataTableNode | null => {\n if (survey.id === 'new') {\n return null\n }\n const surveyWithResults = survey as Survey\n const startDate = surveyWithResults.start_date || surveyWithResults.created_at\n return {\n kind: NodeKind.DataTableNode,\n source: {\n kind: NodeKind.EventsQuery,\n select: [\n '*',\n ...survey.questions.map((q, i) => {\n if (q.type === SurveyQuestionType.MultipleChoice) {\n // Join array items into a string\n return `coalesce(arrayStringConcat(JSONExtractArrayRaw(properties, '${getResponseField(\n i\n )}'), ', ')) -- ${q.question}`\n }\n\n return `coalesce(JSONExtractString(properties, '${getResponseField(i)}')) -- ${\n q.question\n }`\n }),\n 'timestamp',\n 'person',\n `coalesce(JSONExtractString(properties, '$lib_version')) -- Library Version`,\n `coalesce(JSONExtractString(properties, '$lib')) -- Library`,\n `coalesce(JSONExtractString(properties, '$current_url')) -- URL`,\n ],\n orderBy: ['timestamp DESC'],\n where: [`event == 'survey sent'`],\n after: startDate,\n properties: [\n {\n type: PropertyFilterType.Event,\n key: '$survey_id',\n operator: PropertyOperator.Exact,\n value: survey.id,\n },\n ],\n },\n propertiesViaUrl: true,\n showExport: true,\n showReload: true,\n showEventFilter: false,\n showPropertyFilter: true,\n showTimings: false,\n }\n },\n ],\n targetingFlagFilters: [\n (s) => [s.survey],\n (survey): FeatureFlagFilters | undefined => {\n if (survey.targeting_flag_filters) {\n return {\n ...survey.targeting_flag_filters,\n groups: survey.targeting_flag_filters.groups,\n multivariate: null,\n payloads: {},\n super_groups: undefined,\n }\n }\n return survey.targeting_flag?.filters || undefined\n },\n ],\n urlMatchTypeValidationError: [\n (s) => [s.survey],\n (survey): string | null => {\n if (survey.conditions?.urlMatchType === SurveyUrlMatchType.Regex && survey.conditions.url) {\n try {\n new RegExp(survey.conditions.url)\n } catch (e: any) {\n return e.message\n }\n }\n return null\n },\n ],\n surveyNPSScore: [\n (s) => [s.surveyRatingResults],\n (surveyRatingResults) => {\n if (surveyRatingResults) {\n const questionIdx = Object.keys(surveyRatingResults)[0]\n const questionResults = surveyRatingResults[questionIdx]\n\n // If we don't have any results, return 'No data available' instead of NaN.\n if (questionResults.total === 0) {\n return 'No data available'\n }\n\n const data: number[] = questionResults.data\n if (data.length === 11) {\n const promoters = data.slice(9, 11).reduce((a, b) => a + b, 0)\n const passives = data.slice(7, 9).reduce((a, b) => a + b, 0)\n const detractors = data.slice(0, 7).reduce((a, b) => a + b, 0)\n const npsScore = ((promoters - detractors) / (promoters + passives + detractors)) * 100\n return npsScore.toFixed(1)\n }\n }\n },\n ],\n\n getBranchingDropdownValue: [\n (s) => [s.survey],\n (survey) => (questionIndex: number, question: RatingSurveyQuestion | MultipleSurveyQuestion) => {\n if (question.branching?.type) {\n const { type } = question.branching\n\n if (type === SurveyQuestionBranchingType.SpecificQuestion) {\n const nextQuestionIndex = question.branching.index\n return `${SurveyQuestionBranchingType.SpecificQuestion}:${nextQuestionIndex}`\n }\n\n return type\n }\n\n // No branching specified, default to Next question / Confirmation message\n if (questionIndex < survey.questions.length - 1) {\n return SurveyQuestionBranchingType.NextQuestion\n }\n\n return SurveyQuestionBranchingType.End\n },\n ],\n getResponseBasedBranchingDropdownValue: [\n (s) => [s.survey],\n (survey) => (questionIndex: number, question: RatingSurveyQuestion | MultipleSurveyQuestion, response) => {\n if (!question.branching || !('responseValues' in question.branching)) {\n return SurveyQuestionBranchingType.NextQuestion\n }\n\n // If a value is mapped onto an integer, we're redirecting to a specific question\n if (Number.isInteger(question.branching.responseValues[response])) {\n const nextQuestionIndex = question.branching.responseValues[response]\n return `${SurveyQuestionBranchingType.SpecificQuestion}:${nextQuestionIndex}`\n }\n\n // If any other value is present (practically only Confirmation message), return that value\n if (question.branching?.responseValues?.[response]) {\n return question.branching.responseValues[response]\n }\n\n // No branching specified, default to Next question / Confirmation message\n if (questionIndex < survey.questions.length - 1) {\n return SurveyQuestionBranchingType.NextQuestion\n }\n\n return SurveyQuestionBranchingType.End\n },\n ],\n hasCycle: [\n (s) => [s.survey],\n (survey) => {\n const graph = new Map()\n survey.questions.forEach((question, fromIndex: number) => {\n if (!graph.has(fromIndex)) {\n graph.set(fromIndex, new Set())\n }\n\n if (question.branching?.type === SurveyQuestionBranchingType.End) {\n return\n } else if (\n question.branching?.type === SurveyQuestionBranchingType.SpecificQuestion &&\n Number.isInteger(question.branching.index)\n ) {\n const toIndex = question.branching.index\n graph.get(fromIndex).add(toIndex)\n return\n } else if (\n question.branching?.type === SurveyQuestionBranchingType.ResponseBased &&\n isObject(question.branching?.responseValues)\n ) {\n for (const [_, toIndex] of Object.entries(question.branching?.responseValues)) {\n if (Number.isInteger(toIndex)) {\n graph.get(fromIndex).add(toIndex)\n }\n }\n }\n\n // No branching - still need to connect the next question\n if (fromIndex < survey.questions.length - 1) {\n const toIndex = fromIndex + 1\n graph.get(fromIndex).add(toIndex)\n }\n })\n\n let cycleDetected = false\n function dfs(node: number, seen: number[]): void {\n if (cycleDetected) {\n return\n }\n\n for (const neighbor of graph.get(node) || []) {\n if (seen.includes(neighbor)) {\n cycleDetected = true\n return\n }\n dfs(neighbor, seen.concat(neighbor))\n }\n }\n dfs(0, [0])\n\n return cycleDetected\n },\n ],\n hasBranchingLogic: [\n (s) => [s.survey],\n (survey) =>\n survey.questions.some((question) => question.branching && Object.keys(question.branching).length > 0),\n ],\n surveyAsInsightURL: [\n (s) => [s.survey],\n (survey) => {\n const query: InsightVizNode = {\n kind: NodeKind.InsightVizNode,\n source: {\n kind: NodeKind.TrendsQuery,\n properties: [\n {\n key: '$survey_id',\n value: survey.id,\n operator: PropertyOperator.Exact,\n type: PropertyFilterType.Event,\n },\n ],\n series: [\n {\n kind: NodeKind.EventsNode,\n event: 'survey sent',\n name: 'survey sent',\n math: BaseMathType.TotalCount,\n },\n {\n kind: NodeKind.EventsNode,\n event: 'survey shown',\n name: 'survey shown',\n math: BaseMathType.TotalCount,\n },\n {\n kind: NodeKind.EventsNode,\n event: 'survey dismissed',\n name: 'survey dismissed',\n math: BaseMathType.TotalCount,\n },\n ],\n },\n }\n\n return urls.insightNew(undefined, undefined, query)\n },\n ],\n }),\n forms(({ actions, props, values }) => ({\n survey: {\n defaults: { ...NEW_SURVEY } as NewSurvey | Survey,\n errors: ({ name, questions }) => ({\n // NOTE: When more validation errors are added, the submitSurveyFailure listener should be updated\n // to scroll to the right error section\n name: !name && 'Please enter a name.',\n questions: questions.map((question) => {\n const questionErrors = {\n question: !question.question && 'Please enter a question label.',\n }\n\n if (question.type === SurveyQuestionType.Rating) {\n return {\n ...questionErrors,\n display: !question.display && 'Please choose a display type.',\n scale: !question.scale && 'Please choose a scale.',\n lowerBoundLabel: !question.lowerBoundLabel && 'Please enter a lower bound label.',\n upperBoundLabel: !question.upperBoundLabel && 'Please enter an upper bound label.',\n }\n } else if (\n question.type === SurveyQuestionType.SingleChoice ||\n question.type === SurveyQuestionType.MultipleChoice\n ) {\n return {\n ...questionErrors,\n choices: question.choices.some((choice) => !choice.trim())\n ? 'Please ensure all choices are non-empty.'\n : undefined,\n }\n }\n\n return questionErrors\n }),\n // release conditions controlled using a PureField in the form\n targeting_flag_filters: values.flagPropertyErrors,\n // controlled using a PureField in the form\n urlMatchType: values.urlMatchTypeValidationError,\n }),\n submit: (surveyPayload) => {\n if (values.hasCycle) {\n actions.reportSurveyCycleDetected(values.survey)\n\n return lemonToast.error(\n 'Your survey contains an endless cycle. Please revisit your branching rules.'\n )\n }\n\n // when the survey is being submitted, we should turn off editing mode\n actions.editingSurvey(false)\n if (props.id && props.id !== 'new') {\n actions.updateSurvey(surveyPayload)\n } else {\n actions.createSurvey(surveyPayload)\n }\n },\n },\n })),\n urlToAction(({ actions, props }) => ({\n [urls.survey(props.id ?? 'new')]: (_, { edit }, __, { method }) => {\n // We always set the editingSurvey to true when we create a new survey\n if (props.id === 'new') {\n actions.editingSurvey(true)\n }\n // If the URL was pushed (user clicked on a link), reset the scene's data.\n // This avoids resetting form fields if you click back/forward.\n if (method === 'PUSH') {\n if (props.id) {\n actions.loadSurvey()\n } else {\n actions.resetSurvey()\n }\n }\n\n if (edit) {\n actions.editingSurvey(true)\n }\n },\n })),\n actionToUrl(({ values }) => ({\n setSurveyTemplateValues: () => {\n const hashParams = router.values.hashParams\n hashParams['fromTemplate'] = true\n\n return [urls.survey(values.survey.id), router.values.searchParams, hashParams]\n },\n editingSurvey: ({ editing }) => {\n const searchParams = router.values.searchParams\n if (editing) {\n searchParams['edit'] = true\n } else {\n delete searchParams['edit']\n }\n\n return [router.values.location.pathname, router.values.searchParams, router.values.hashParams]\n },\n })),\n afterMount(({ props, actions }) => {\n if (props.id !== 'new') {\n actions.loadSurvey()\n }\n if (props.id === 'new') {\n actions.resetSurvey()\n }\n }),\n])\n\nfunction sanitizeQuestions(surveyPayload: Partial): Partial {\n if (!surveyPayload.questions) {\n return surveyPayload\n }\n\n const sanitizedThankYouHeader = sanitizeHTML(surveyPayload.appearance?.thankYouMessageHeader || '')\n const sanitizedThankYouDescription = sanitizeHTML(surveyPayload.appearance?.thankYouMessageDescription || '')\n\n return {\n ...surveyPayload,\n questions: surveyPayload.questions?.map((rawQuestion) => {\n return {\n ...rawQuestion,\n description: sanitizeHTML(rawQuestion.description || ''),\n question: sanitizeHTML(rawQuestion.question || ''),\n }\n }),\n appearance: {\n ...surveyPayload.appearance,\n ...(sanitizedThankYouHeader && { thankYouMessageHeader: sanitizedThankYouHeader }),\n ...(sanitizedThankYouDescription && { thankYouMessageDescription: sanitizedThankYouDescription }),\n },\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/docs/project.json b/docs/project.json index 9fffb4eaa..5b091237a 100644 --- a/docs/project.json +++ b/docs/project.json @@ -1 +1 @@ -{"generatedAt":1736462857264,"hasCustomBabel":false,"hasCustomWebpack":true,"hasStaticDirs":true,"hasStorybookEslint":true,"refCount":0,"packageManager":{"type":"pnpm","version":"8.10.5"},"typescriptOptions":{"reactDocgen":"react-docgen"},"preview":{"usesGlobals":true},"framework":{"name":"@storybook/react-webpack5","options":{"builder":{"useSWC":true}}},"builder":"@storybook/builder-webpack5","renderer":"@storybook/react","storybookVersion":"7.6.4","storybookVersionSpecifier":"^7.6.4","language":"typescript","storybookPackages":{"@storybook/addon-actions":{"version":"7.6.4"},"@storybook/addons":{"version":"7.6.4"},"@storybook/api":{"version":"7.6.4"},"@storybook/blocks":{"version":"7.6.4"},"@storybook/components":{"version":"7.6.4"},"@storybook/core-events":{"version":"7.6.4"},"@storybook/csf":{"version":null},"@storybook/react":{"version":"7.6.4"},"@storybook/react-webpack5":{"version":"7.6.4"},"@storybook/test-runner":{"version":"0.16.0"},"@storybook/theming":{"version":"7.6.4"},"@storybook/types":{"version":"7.6.4"},"eslint-plugin-storybook":{"version":"0.6.15"},"storybook":{"version":"7.6.4"}},"addons":{"@storybook/addon-docs":{"version":"7.6.4"},"@storybook/addon-links":{"version":"7.6.4"},"@storybook/addon-essentials":{"version":"7.6.4"},"@storybook/addon-storysource":{"version":"7.6.4"},"@storybook/addon-a11y":{"version":"7.6.4"},"storybook-addon-pseudo-states":{"version":"2.1.2"}}} +{"generatedAt":1736467014072,"hasCustomBabel":false,"hasCustomWebpack":true,"hasStaticDirs":true,"hasStorybookEslint":true,"refCount":0,"packageManager":{"type":"pnpm","version":"8.10.5"},"typescriptOptions":{"reactDocgen":"react-docgen"},"preview":{"usesGlobals":true},"framework":{"name":"@storybook/react-webpack5","options":{"builder":{"useSWC":true}}},"builder":"@storybook/builder-webpack5","renderer":"@storybook/react","storybookVersion":"7.6.4","storybookVersionSpecifier":"^7.6.4","language":"typescript","storybookPackages":{"@storybook/addon-actions":{"version":"7.6.4"},"@storybook/addons":{"version":"7.6.4"},"@storybook/api":{"version":"7.6.4"},"@storybook/blocks":{"version":"7.6.4"},"@storybook/components":{"version":"7.6.4"},"@storybook/core-events":{"version":"7.6.4"},"@storybook/csf":{"version":null},"@storybook/react":{"version":"7.6.4"},"@storybook/react-webpack5":{"version":"7.6.4"},"@storybook/test-runner":{"version":"0.16.0"},"@storybook/theming":{"version":"7.6.4"},"@storybook/types":{"version":"7.6.4"},"eslint-plugin-storybook":{"version":"0.6.15"},"storybook":{"version":"7.6.4"}},"addons":{"@storybook/addon-docs":{"version":"7.6.4"},"@storybook/addon-links":{"version":"7.6.4"},"@storybook/addon-essentials":{"version":"7.6.4"},"@storybook/addon-storysource":{"version":"7.6.4"},"@storybook/addon-a11y":{"version":"7.6.4"},"storybook-addon-pseudo-states":{"version":"2.1.2"}}}