\n \n);\n\nexport default LinkBlocked;\n","import React, { useContext, createContext } from 'react';\nimport { PricingExperiments } from '~shared/types/pricing/experiments';\nimport { PricingConfigStaticData } from '~shared/types/pricing/load-cache';\n\nconst BOOTSTRAP_CONTEXT: PricingExperiments = {\n priceExperiment: {\n hasAssignment: false,\n experimentName: null,\n treatmentName: null,\n },\n featureExperiment: {\n hasAssignment: false,\n experimentName: null,\n treatmentName: null,\n },\n uiExperiment: {\n hasAssignment: false,\n experimentName: null,\n treatmentName: null,\n },\n};\n\n// attempt to grab the cached experiments response to rehydrate when we make it to the browser\nconst win = typeof window !== 'undefined' ? window : undefined;\nconst payloadCache: PricingConfigStaticData | undefined =\n win && (win?.SM?.__LOAD_PAYLOAD_CACHE__ as PricingConfigStaticData);\nconst defaultContextValue = payloadCache?.experiments || BOOTSTRAP_CONTEXT;\n\nexport const PricingExperimentContext = createContext(defaultContextValue);\n\nexport const PricingExperimentProvider = ({\n experiments,\n children,\n}: {\n experiments: PricingExperiments | undefined;\n children: React.ReactNode;\n}): React.ReactElement => (\n \n {children}\n \n);\n\nexport function usePricingExperiments(): PricingExperiments {\n return useContext(PricingExperimentContext);\n}\n","import React, { useContext, createContext } from 'react';\n\nimport { PricingConfigStaticData } from '~shared/types/pricing/load-cache';\nimport { PricingExperience } from '~shared/types/pricing/pricingsvc';\n\n// attempt to grab the cached experiments response to rehydrate when we make it to the browser\nconst win = typeof window !== 'undefined' ? window : undefined;\nconst payloadCache: PricingConfigStaticData | undefined =\n win && (win?.SM?.__LOAD_PAYLOAD_CACHE__ as PricingConfigStaticData);\nconst initialPricingExperience = (payloadCache?.pricingExperience || {}) as PricingExperience;\n\n// NOOP API so the page doesn't explode on initial render\nexport const PackageDataContext = createContext(initialPricingExperience);\n\nexport const PackageDataProvider = ({\n pricingExperience,\n children,\n}: {\n pricingExperience?: PricingExperience;\n children: React.ReactNode;\n}): React.ReactElement => {\n return (\n \n {children}\n \n );\n};\n\nexport const usePricingExperience = (): PricingExperience => useContext(PackageDataContext);\n","enum GROW2529_ACTIONS {\n FORMS_TOGGLE_SWITCH = 'FORMS_TOGGLE_SWITCH',\n FORMS_RESET_TOGGLE_SWITCH = 'FORMS_RESET_TOGGLE_SWITCH',\n}\n\nexport default GROW2529_ACTIONS;\n","import GROW2529_ACTIONS from '~app/pages/Pricing/experiments/grow_2529_forms/actions';\n\nexport enum PACKAGE_ACTIONS {\n SWITCH_PACKAGES = 'SWITCH_PACKAGES',\n UPDATE_PACKAGES = 'UPDATE_PACKAGES',\n UPDATE_PACKAGES_TO_DISPLAY = 'UPDATE_PACKAGES_TO_DISPLAY',\n}\n\nconst ACTIONS = { ...PACKAGE_ACTIONS, ...GROW2529_ACTIONS };\n\nexport default ACTIONS;\n","import { PackageStateType } from '~shared/types/pricing/state';\nimport { PackageActions } from '~shared/types/pricing/actions';\nimport ACTIONS from '~shared/actions';\nimport { PricingPackage } from '~shared/types/pricing/pricingsvc';\n\nexport default function packageReducer(state: PackageStateType, action: PackageActions): PackageStateType {\n const { type, payload } = action;\n\n if (type === ACTIONS.UPDATE_PACKAGES) {\n return {\n ...state,\n allPackages: payload?.allPackages ? payload.allPackages : state.allPackages,\n displayPackages: payload?.displayPackages,\n };\n }\n\n if (type === ACTIONS.UPDATE_PACKAGES_TO_DISPLAY) {\n return {\n ...state,\n packagesToDisplayState: payload?.packagesToDisplay,\n };\n }\n\n if (type === ACTIONS.SWITCH_PACKAGES) {\n const replacementPackage = state?.allPackages.find(pkg => Number(pkg?.id) === payload.replacedWith);\n const newPackages = state?.displayPackages?.map(pkg =>\n Number(pkg?.id) === payload?.packageToBeReplaced ? replacementPackage : pkg\n ) as PricingPackage[];\n\n return {\n ...state,\n displayPackages: newPackages ?? state.displayPackages,\n };\n }\n\n return state;\n}\n","const PROJECT_NAME = 'PricingWeb';\n\nexport default PROJECT_NAME;\n","import { defineMessages } from '@sm/intl';\nimport PROJECT_NAME from '~app/pages/Pricing/constants/project';\n\n/**\n * Shared copy file between all the pages\n */\n\nconst COPY = defineMessages({\n MAIN_HEADING: {\n id: 'Pricing.copy.SharedPagesHeading',\n defaultMessage: 'Choose a plan that works for you',\n desc: {\n id: 'Pricing.copy.SharedPagesHeading',\n message: '[Type: header][Vis: high] - Primary header for pricing summary page',\n project: PROJECT_NAME,\n },\n },\n DETAILS_HEADING: {\n id: 'Pricing.copy.SharedPagesDetailsHeading',\n defaultMessage: 'Compare our full set of features',\n desc: {\n id: 'Pricing.copy.SharedPagesDetailsHeading',\n message: '[Type: header][Vis: high] - Primary header for pricing details page',\n project: PROJECT_NAME,\n },\n },\n EDUCATIONAL_HEADING: {\n id: 'Pricing.copy.SharedPagesEnterpriseHeading',\n defaultMessage: 'Discounts for Students and Educators',\n desc: {\n id: 'Pricing.copy.SharedPagesEnterpriseHeading',\n message: '[Type: header][Vis: high] - Primary header for pricing educational page',\n project: PROJECT_NAME,\n },\n },\n EDUCATIONAL_SUBHEADING: {\n id: 'Pricing.copy.SharedPagesSubHeading',\n defaultMessage:\n 'You must have a valid student, staff, or faculty ID to qualify for discounted pricing. Not eligible for this discount?',\n desc: {\n id: 'Pricing.copy.SharedPagesSubHeading',\n message: '[Type: header][Vis: high] - Subheader for pricing educational page',\n project: PROJECT_NAME,\n },\n },\n VIEW_PRICING: {\n id: 'Pricing.copy.SharedPagesLink',\n defaultMessage: 'View pricing',\n desc: {\n id: 'Pricing.copy.SharedPagesLink',\n message: '[Type: Link][Vis: high] - Link to pricing page',\n project: PROJECT_NAME,\n },\n },\n TEAM_PLANS: {\n id: 'Pricing.copy.SharedPagesTeamPlans',\n defaultMessage: 'Team Plans',\n desc: {\n id: 'Pricing.copy.SharedPagesTeamPlans',\n message: '[Type: Link][Vis.: high] - A link that will direct the user to the Team Plans Pricing Summary page',\n project: PROJECT_NAME,\n },\n },\n INDIVIDUAL_PLANS: {\n id: 'Pricing.copy.SharedPagesIndividualPlans',\n defaultMessage: 'Individual Plans',\n desc: {\n id: 'Pricing.copy.SharedPagesIndividualPlans',\n message:\n '[Type: Link][Vis.: high] - A link that will direct the user to the Individual Plans Pricing Summary page',\n project: PROJECT_NAME,\n },\n },\n ENTERPRISE: {\n id: 'Pricing.copy.SharedPagesEnterprise',\n defaultMessage: 'Enterprise',\n desc: {\n id: 'Pricing.copy.SharedPagesEnterprise',\n message: '[Type: Link][Vis.: high] - A link that will direct the user to the Enterprise Pricing page',\n project: PROJECT_NAME,\n },\n },\n BACK_TO_SUMMARY: {\n id: 'Pricing.copy.SharedPagesBackToSummary',\n defaultMessage: 'Back to pricing summary',\n desc: {\n id: 'Pricing.copy.SharedPagesBackToSummary',\n message: '[Type: Link][Vis.: high] - A link that will direct the user to back to the pricing summary page',\n project: PROJECT_NAME,\n },\n },\n EXPAND_ALL: {\n id: 'Pricing.copy.SharedPagesExpandAll',\n defaultMessage: 'Expand all',\n desc: {\n id: 'Pricing.copy.SharedPagesExpandAll',\n message: '[Type: Link][Vis.: high] - A button discription to Expand all accordions',\n project: PROJECT_NAME,\n },\n },\n COLLAPSE_ALL: {\n id: 'Pricing.copy.SharedPagesCollapseAll',\n defaultMessage: 'Collapse all',\n desc: {\n id: 'Pricing.copy.SharedPagesCollapseAll',\n message: '[Type: Link][Vis.: high] - A button discription to Collapse all accordions',\n project: PROJECT_NAME,\n },\n },\n BASIC: {\n id: 'Pricing.copy.SharedPagesBasic',\n defaultMessage: 'Basic',\n desc: {\n id: 'Pricing.copy.SharedPagesBasic',\n message: '[Type: Heading][Vis.: high] - Basic package name heading',\n project: PROJECT_NAME,\n },\n },\n STANDARD_MONTHLY: {\n id: 'Pricing.copy.SharedPagesStandardMonthly',\n defaultMessage: 'Standard Monthly',\n desc: {\n id: 'Pricing.copy.SharedPagesStandardMonthly',\n message: '[Type: Heading][Vis.: high] - Standard Monthly package name heading',\n project: PROJECT_NAME,\n },\n },\n STANDARD_ANNUAL: {\n id: 'Pricing.copy.SharedPagesStandardAnnual',\n defaultMessage: 'Standard Annual',\n desc: {\n id: 'Pricing.copy.SharedPagesStandardAnnual',\n message: '[Type: Heading][Vis.: high] - Standard Annual package name heading',\n project: PROJECT_NAME,\n },\n },\n STARTER_MONTHLY: {\n id: 'Pricing.copy.SharedPagesStarterMonthly',\n defaultMessage: 'Starter Monthly',\n desc: {\n id: 'Pricing.copy.SharedPagesStarterMonthly',\n message: '[Type: Heading][Vis.: high] - Starter Monthly package name heading',\n project: PROJECT_NAME,\n },\n },\n STARTER_ANNUAL: {\n id: 'Pricing.copy.SharedPagesStarterAnnual',\n defaultMessage: 'Starter Annual',\n desc: {\n id: 'Pricing.copy.SharedPagesStarterAnnual',\n message: '[Type: Heading][Vis.: high] - Starter Annual package name heading',\n project: PROJECT_NAME,\n },\n },\n ADVANTAGE_MONTHLY: {\n id: 'Pricing.copy.SharedPagesAdvantageMonthly',\n defaultMessage: 'Advantage',\n desc: {\n id: 'Pricing.copy.SharedPagesAdvantageMonthly',\n message: '[Type: Heading][Vis.: high] - Advantage Monthly package name heading',\n project: PROJECT_NAME,\n },\n },\n ADVANTAGE_ANNUAL: {\n id: 'Pricing.copy.SharedPagesAdvantageAnnual',\n defaultMessage: 'Advantage Annual',\n desc: {\n id: 'Pricing.copy.SharedPagesAdvantageAnnual',\n message: '[Type: Heading][Vis.: high] - Advantage Annual package name heading',\n project: PROJECT_NAME,\n },\n },\n PREMIER_MONTHLY: {\n id: 'Pricing.copy.SharedPagesPremierMonthly',\n defaultMessage: 'Premier Monthly',\n desc: {\n id: 'Pricing.copy.SharedPagesPremierMonthly',\n message: '[Type: Heading][Vis.: high] - Premier Monthly package name heading',\n project: PROJECT_NAME,\n },\n },\n PREMIER_ANNUAL: {\n id: 'Pricing.copy.SharedPagesPremierAnnual',\n defaultMessage: 'Premier Annual',\n desc: {\n id: 'Pricing.copy.SharedPagesPremierAnnual',\n message: '[Type: Heading][Vis.: high] - Premier Annual package name heading',\n project: PROJECT_NAME,\n },\n },\n TEAM_ADVANTAGE: {\n id: 'Pricing.copy.SharedPagesTeamAdvantage',\n defaultMessage: 'Team Advantage',\n desc: {\n id: 'Pricing.copy.SharedPagesTeamAdvantage',\n message: '[Type: Heading][Vis.: high] - Team Advantage package name heading',\n project: PROJECT_NAME,\n },\n },\n TEAM_PREMIER: {\n id: 'Pricing.copy.SharedPagesTeamPremier',\n defaultMessage: 'Team Premier',\n desc: {\n id: 'Pricing.copy.SharedPagesTeamPremier',\n message: '[Type: Heading][Vis.: high] - Team Premier package name heading',\n project: PROJECT_NAME,\n },\n },\n ENT_PLATINUM: {\n id: 'Pricing.copy.EnterprisePlatinum',\n defaultMessage: 'Enterprise',\n desc: {\n id: 'Pricing.copy.EnterprisePlatinum',\n message: '[Type: Heading][Vis.: high] - Enterprise package name heading',\n project: PROJECT_NAME,\n },\n },\n FLEX: {\n id: 'Pricing.copy.SharedPagesFlex',\n defaultMessage: 'Flex',\n desc: {\n id: 'Pricing.copy.SharedPagesFlex',\n message: '[Type: Heading][Vis.: high] - Flex package name heading',\n project: PROJECT_NAME,\n },\n },\n FORMS: {\n id: 'Pricing.copy.SharedPagesForms',\n defaultMessage: 'Forms',\n desc: {\n id: 'Pricing.copy.SharedPagesForms',\n message: '[Type: Heading][Vis.: high] - Forms package name heading',\n project: PROJECT_NAME,\n },\n },\n PLAN_FEATURES: {\n id: 'Pricing.copy.SharedPlanFeaturesLink',\n defaultMessage: 'See all plan features',\n desc: {\n id: 'Pricing.copy.SharedPlanFeaturesLink',\n message: '[Type: Heading][Vis.: high] - See all plans features link',\n project: PROJECT_NAME,\n },\n },\n});\n\nexport default COPY;\n","import { Desc } from '@sm/intl';\n\nimport COPY from '~pricing/copy';\n\nexport enum Sources {\n PRICINGWEB = 'pricingweb',\n}\n\nexport enum Packages {\n Basic = 'BASIC',\n\n StandardMonthly = 'STANDARD_MONTHLY',\n StandardAnnual = 'STANDARD_ANNUAL', // This is preserve because of canonical name (which it may never change)\n\n StarterMonthly = 'STARTER_MONTHLY',\n StarterAnnual = 'STANDARD_ANNUAL',\n\n AdvantageMonthly = 'ADVANTAGE_MONTHLY',\n AdvantageAnnual = 'ADVANTAGE_ANNUAL',\n\n PremierMonthly = 'PREMIER_MONTHLY',\n PremierAnnual = 'PREMIER_ANNUAL',\n\n TeamAdvantage = 'TEAM_ADVANTAGE_ANNUAL',\n TeamPremier = 'TEAM_PREMIER_ANNUAL',\n\n Enterprise = 'ENT_PLATINUM',\n Flex = 'ANALYZE_MONTHLY',\n\n FormsMonthly = 'FORMS_MONTHLY',\n FormsAnnual = 'FORMS_ANNUAL',\n}\n\nexport const PackageIds: Record = {\n [Packages.Basic]: 1,\n [Packages.StandardMonthly]: 31,\n [Packages.StandardAnnual]: 32, // See Packages\n\n [Packages.StarterMonthly]: 31,\n [Packages.StarterAnnual]: 32,\n\n [Packages.AdvantageMonthly]: 33,\n [Packages.AdvantageAnnual]: 34,\n\n [Packages.PremierMonthly]: 35,\n [Packages.PremierAnnual]: 36,\n\n [Packages.TeamAdvantage]: 134,\n [Packages.TeamPremier]: 136,\n\n [Packages.Enterprise]: 26,\n [Packages.Flex]: 37,\n\n [Packages.FormsMonthly]: 41,\n [Packages.FormsAnnual]: 42,\n};\n\nexport const ComparePlanIds: string[] = [\n Packages.Basic,\n Packages.StandardMonthly,\n Packages.StarterAnnual,\n Packages.AdvantageAnnual,\n Packages.PremierAnnual,\n Packages.TeamAdvantage,\n Packages.TeamPremier,\n Packages.Enterprise,\n];\n\nexport enum LanguageCodes {\n PT = 'pt',\n EN = 'en-US',\n GB = 'en-GB',\n FR = 'fr',\n ES = 'es',\n}\n\nexport enum SkuTypes {\n CoreSeat = 'SUBSCRIPTION_CORE_SEAT',\n AdditionalSeat = 'SUBSCRIPTION_ADDITIONAL_SEAT',\n ResponseOverage = 'RESPONSES',\n}\n\n/**\n * Localization should only happen in the L10nProvider\n * See https://github.com/pages/mntv-webplatform/smweb/#/pages/webs/localization?id=ltl10nprovidergt-t-and-lttgt\n */\nexport const PackageDisplayNames: Record = {\n [Packages.Basic]: COPY.BASIC,\n [Packages.StandardMonthly]: COPY.STANDARD_MONTHLY,\n [Packages.StandardAnnual]: COPY.STANDARD_ANNUAL, // In the process of decommissioning but who knows, maybe never\n [Packages.StarterMonthly]: COPY.STARTER_MONTHLY,\n [Packages.StarterAnnual]: COPY.STARTER_ANNUAL,\n [Packages.AdvantageMonthly]: COPY.ADVANTAGE_MONTHLY,\n [Packages.AdvantageAnnual]: COPY.ADVANTAGE_ANNUAL,\n [Packages.PremierMonthly]: COPY.PREMIER_MONTHLY,\n [Packages.PremierAnnual]: COPY.PREMIER_ANNUAL,\n [Packages.TeamAdvantage]: COPY.TEAM_ADVANTAGE,\n [Packages.TeamPremier]: COPY.TEAM_PREMIER,\n [Packages.Enterprise]: COPY.ENT_PLATINUM,\n [Packages.Flex]: COPY.STANDARD_MONTHLY,\n [Packages.FormsMonthly]: COPY.FORMS,\n [Packages.FormsAnnual]: COPY.FORMS,\n};\n","import ACTIONS from '~shared/actions';\nimport { Grow2529Actions, Grow2529StateType } from './types';\nimport { Packages } from '~shared/constants/pricing';\n\nexport const grow2529State: Grow2529StateType = {\n toggleChecked: [Packages.FormsAnnual, Packages.StarterAnnual],\n};\n\nexport default function Grow2529Reducer(state: Grow2529StateType, action: Grow2529Actions): Grow2529StateType {\n const { type, payload } = action;\n\n if (type === ACTIONS.FORMS_TOGGLE_SWITCH) {\n const newState = state.toggleChecked.filter(pkg => pkg !== payload.packageToBeReplaced);\n newState.push(payload.replacedWith);\n\n return {\n ...state,\n toggleChecked: newState,\n };\n }\n\n if (type === ACTIONS.FORMS_RESET_TOGGLE_SWITCH) {\n return {\n ...state,\n toggleChecked: [Packages.FormsAnnual, Packages.StarterAnnual],\n };\n }\n\n return state;\n}\n","import { PackageStateType } from '~shared/types/pricing/state';\nimport { grow2529State } from '~app/pages/Pricing/experiments/grow_2529_forms/reducer';\n\nexport const packageState: PackageStateType = {\n allPackages: [],\n displayPackages: [],\n packagesToDisplayState: [],\n};\n\nexport const combinedStates = {\n packages: packageState,\n grow2529: grow2529State,\n};\n","import React, { createContext, useContext, useReducer, useMemo, Dispatch } from 'react';\nimport useCombinedReducers from 'use-combined-reducers';\nimport packageReducer from '~shared/reducers/packageReducer';\nimport Grow2529Reducer, { grow2529State } from '~app/pages/Pricing/experiments/grow_2529_forms/reducer';\nimport { combinedStates, packageState } from '~shared/state';\n\nimport { RootPricingProviderStateType, CombinedStates } from '~shared/types/pricing/state';\nimport { CombinedActions } from '~shared/types/pricing/actions';\n\nexport const PricingStateContext = createContext<{ state: CombinedStates; dispatch: Dispatch }>({\n state: combinedStates,\n dispatch: () => {},\n});\n\nexport function PricingStateProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const [state, dispatch] = useCombinedReducers({\n packages: useReducer(packageReducer, packageState),\n grow2529: useReducer(Grow2529Reducer, grow2529State),\n });\n\n const value = useMemo(() => {\n return { state, dispatch };\n }, [dispatch, state]);\n\n return {children};\n}\n\nexport const usePricingState = (): RootPricingProviderStateType => useContext(PricingStateContext);\n","import React from 'react';\nimport { Helmet } from '@sm/webassets';\nimport { HelmetProps } from './types';\n\n/**\n * To appease TS and extend Helmet which does not accept direct JSX.Element component instead as a function,\n * This wrapper is needed to extend the basic Helmet component to accept children as optional\n * See this thread https://github.com/nfl/react-helmet/issues/646#issuecomment-1398700719\n */\n\nexport default function HelmetWithChildren({ children, ...rest }: HelmetProps): JSX.Element {\n return {children};\n}\n","import HelmetWithChildren from './HelmetWrappers';\n\nexport default HelmetWithChildren;\n","export type Links = {\n lang: string;\n href?: string;\n};\n\nexport enum ORDER {\n First = 2,\n Last = 1,\n None = 0,\n Skipped = 3,\n}\n\ntype LanguageDetails = {\n langCode: string;\n order: ORDER;\n};\n\nexport type Language = {\n [key: string]: LanguageDetails;\n};\n\nexport type HrefLangsTagsProps = {\n hrefLangs: Links[];\n path: string;\n};\n\nexport type SeoProps = {\n canonicalPath?: string;\n children?: React.ReactNode;\n};\n","import { Language, Links, ORDER } from './types';\n\nconst languages: Required = Object.freeze({\n 'x-default': {\n langCode: '',\n order: ORDER.None,\n },\n 'en-US': {\n langCode: '',\n order: ORDER.None,\n },\n 'en-GB': {\n langCode: 'co.uk',\n order: ORDER.Last,\n },\n de: {\n langCode: 'de',\n order: ORDER.Last,\n },\n ru: {\n langCode: 'ru',\n order: ORDER.Skipped,\n },\n es: {\n langCode: 'es',\n order: ORDER.First,\n },\n pt: {\n langCode: 'pt',\n order: ORDER.First,\n },\n nl: {\n langCode: 'nl',\n order: ORDER.First,\n },\n fr: {\n langCode: 'fr',\n order: ORDER.First,\n },\n it: {\n langCode: 'fr',\n order: ORDER.First,\n },\n da: {\n langCode: 'da',\n order: ORDER.First,\n },\n sv: {\n langCode: 'sv',\n order: ORDER.First,\n },\n ja: {\n langCode: 'ja',\n order: ORDER.First,\n },\n ko: {\n langCode: 'ko',\n order: ORDER.First,\n },\n zh: {\n langCode: 'zh',\n order: ORDER.First,\n },\n tr: {\n langCode: 'tr',\n order: ORDER.First,\n },\n no: {\n langCode: 'no',\n order: ORDER.First,\n },\n fi: {\n langCode: 'fr',\n order: ORDER.First,\n },\n});\n\nexport const LINKS: Links[] = [\n {\n lang: 'x-default',\n },\n {\n lang: 'en-US',\n },\n {\n lang: 'en-GB',\n },\n {\n lang: 'de',\n },\n {\n lang: 'ru',\n },\n {\n lang: 'es',\n },\n {\n lang: 'pt',\n },\n {\n lang: 'nl',\n },\n {\n lang: 'fr',\n },\n {\n lang: 'it',\n },\n {\n lang: 'da',\n },\n {\n lang: 'sv',\n },\n {\n lang: 'ja',\n },\n {\n lang: 'ko',\n },\n {\n lang: 'zh',\n },\n {\n lang: 'tr',\n },\n {\n lang: 'no',\n },\n {\n lang: 'fi',\n },\n];\n\nexport function getLinks(domain: string, path: string): (Links | undefined)[] {\n const tempLinks = LINKS.map(({ lang }: Links): Links | undefined => {\n const language = languages[lang].langCode;\n if (languages[lang].order === ORDER.None) {\n return {\n lang,\n href: `https://www.${domain}.com${path}`,\n };\n }\n if (languages[lang].order === ORDER.First) {\n return {\n lang,\n href: `https://www.${language}.${domain}.com${path}`,\n };\n }\n if (languages[lang].order === ORDER.Last) {\n return {\n lang,\n href: `https://www.${domain}.${language}${path}`,\n };\n }\n return undefined;\n });\n return tempLinks.filter(links => links);\n}\n","import React, { useContext, useMemo } from 'react';\nimport { StaticContext } from '@sm/webassets';\n\nimport HelmetWithChildren from '~pricing/lib/HelmetWrapper';\nimport { SeoHeadTags, HrefLangsTags } from '~pricing/components/SEO';\n\nimport { getLinks } from './links';\nimport { SeoProps, Links } from './types';\n\nexport default function Seo({ canonicalPath = '', children }: SeoProps): JSX.Element {\n const {\n environment: { domain },\n url,\n } = useContext(StaticContext);\n const path = canonicalPath || url;\n const hrefLangs = useMemo(() => getLinks(domain, path) as Links[], [domain, path]);\n return (\n <>\n \n {/*\n these need to be referenced as function calls because of Helmet's requirements for children:\n https://github.com/nfl/react-helmet/issues/326\n */}\n {SeoHeadTags()}\n {HrefLangsTags({ hrefLangs, path })}\n \n {children}\n >\n );\n}\n","import * as React from 'react';\nimport { t } from '@sm/intl';\n\nimport COPY from './copy';\n\nexport default function SeoHeadTags(): JSX.Element {\n return (\n <>\n {t(COPY.pageTitle)}\n \n \n >\n );\n}\n","import * as React from 'react';\nimport { HrefLangsTagsProps } from './types';\n\nexport default function HrefLangsTags({ hrefLangs, path }: HrefLangsTagsProps): JSX.Element {\n return (\n <>\n \n {hrefLangs?.map(({ lang, href }) => (\n \n ))}\n >\n );\n}\n","import { defineMessages } from '@sm/intl';\nimport PROJECT_NAME from '~app/pages/Pricing/constants/project';\n\nconst COPY = defineMessages({\n pageTitle: {\n id: 'Pricing.copy.pageTitle',\n defaultMessage: 'SurveyMonkey Plans and Pricing',\n desc: {\n id: 'Pricing.copy.pageTitle',\n message: '[Type: Label][Vis: med] - Page title for Pricing pages',\n project: PROJECT_NAME,\n },\n },\n pageDescription: {\n id: 'Pricing.copy.pageDescription',\n defaultMessage:\n 'Create and publish online surveys in minutes, and view results graphically and in real time. SurveyMonkey provides free online questionnaire and survey software.',\n desc: {\n id: 'Pricing.copy.pageDescription',\n message: '[Type: Label][Vis: med] - Page meta description for pricing pages',\n project: PROJECT_NAME,\n },\n },\n pageKeywords: {\n id: 'Pricing.copy.pageKeywords',\n defaultMessage:\n 'questionnaire, questionnaires, questionaire, questionaires, free online survey, free online surveys',\n desc: {\n id: 'Pricing.copy.pageKeywords',\n message: '[Type: Label][Vis: med] - Page meta keywords for pricing pages. Includes deliberate misspellings',\n project: PROJECT_NAME,\n },\n },\n});\n\nexport default COPY;\n","import { Packages } from '~shared/constants/pricing';\nimport { FeatureSet } from '~shared/types/pricing/features';\nimport { DiscountInfo, PackageList, PricingPackage } from '~shared/types/pricing/pricingsvc';\n\nexport enum PackageType {\n Individual = 'individual',\n Teams = 'teams',\n Educational = 'educational',\n Enterprise = 'enterprise',\n Details = 'details', // `pricing/details` is a valid route that renders the teams details page\n}\n\ntype Currency = {\n code: string;\n};\n\nexport type PackageSkuCost = {\n skuType: string;\n cost: number;\n currency: Currency;\n};\n\nexport type PackageSkuCosts = PackageSkuCost[];\n\nexport enum PACKAGE_PRICE_TYPE {\n SUMMARY = 'Summary',\n DETAIL = 'Detail',\n COMPARISON = 'Comparison',\n}\n\nexport type PACKAGE_PRICE_TYPE_KEYS = keyof typeof PACKAGE_PRICE_TYPE;\nexport type PACKAGE_PRICE_TYPE_VALUES = `${PACKAGE_PRICE_TYPE}`;\nexport type DisplayString = React.ReactElement | string | undefined;\nexport type PackageData = PricingPackage;\nexport type PackageDataSet = PackageData[];\nexport type PackageSet = Packages[];\n\nexport type PackagesHook = {\n allPackages: PricingPackage[];\n userPackage: PricingPackage;\n displayPackages: PricingPackage[];\n discountInfo: DiscountInfo | undefined;\n showEduDiscount: boolean;\n packagesToDisplay: Packages[];\n comparePlans: boolean;\n overageCost: PackageSkuCost | undefined;\n getPackageById(packageId: number | string): PricingPackage;\n};\n\nexport type PackageMap = Record;\n\nexport type PackagesProviderProps = {\n packagesToDisplay: PackageList;\n showEduDiscount: boolean;\n comparePlans: boolean;\n children: React.ReactNode;\n};\n\nexport type PackageProps = {\n packageName: Packages;\n skuCost: PackageSkuCosts;\n comparisonSkuCost: PackageSkuCosts;\n ribbonText?: string | boolean | null;\n features: FeatureSet;\n comparePlans: boolean;\n isLastPackage: boolean;\n discountInfo?: DiscountInfo;\n};\n\nexport type RoutePackageMap = {\n [x: string]: PackageSet;\n};\n","import { GBCountryCodes, USTerritoryCountryCodes } from '@sm/locale/dist/localeSets';\n\nimport { Packages } from '~shared/constants/pricing';\nimport { PackageSet, PackageType, RoutePackageMap } from '~shared/types/pricing/package';\n\nexport const EXTERNAL_SCRIPTS: readonly string[] = Object.freeze(['https://js.stripe.com/v3/']);\n\nexport const MONTHLY_PACKAGES: PackageSet = [\n Packages.StandardMonthly,\n Packages.AdvantageMonthly,\n Packages.PremierMonthly,\n Packages.FormsMonthly,\n Packages.Flex,\n];\n\nexport const INDIVIDUAL_PACKAGES: PackageSet = [\n Packages.PremierAnnual,\n Packages.AdvantageAnnual,\n Packages.StandardMonthly,\n Packages.Basic,\n];\n\nexport const INDIVIDUAL_PACKAGES_WITH_STARTER: PackageSet = [\n Packages.PremierAnnual,\n Packages.AdvantageAnnual,\n Packages.StarterAnnual,\n Packages.StandardMonthly,\n Packages.Basic,\n];\n\nexport const INDIVIDUAL_PACKAGES_WITH_FORMS: PackageSet = [\n Packages.PremierAnnual,\n Packages.AdvantageAnnual,\n Packages.StarterAnnual,\n Packages.FormsAnnual,\n Packages.Basic,\n];\n\nexport const INDIVIDUAL_PACKAGES_WITH_FORMS_REVERSED: PackageSet = [\n Packages.Basic,\n Packages.FormsAnnual,\n Packages.StarterAnnual,\n Packages.AdvantageAnnual,\n Packages.PremierAnnual,\n];\n\nexport const INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL: PackageSet = [\n Packages.PremierAnnual,\n Packages.AdvantageAnnual,\n Packages.StandardMonthly,\n Packages.FormsAnnual,\n Packages.Basic,\n];\n\nexport const INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL_REVERSED: PackageSet = [\n Packages.Basic,\n Packages.FormsAnnual,\n Packages.StandardMonthly,\n Packages.AdvantageAnnual,\n Packages.PremierAnnual,\n];\n\n// For now, the educational package set is identical to what we show for\n// individual details. That may change some day, though, so making an explicitly\n// named set here in case that ever changes. The shallow copy is to prevent any\n// unexpected results when doing equality checks elsewhere\nexport const EDUCATIONAL_PACKAGES: PackageSet = [...INDIVIDUAL_PACKAGES];\n\nexport const TEAMS_PACKAGES: PackageSet = [Packages.TeamAdvantage, Packages.TeamPremier, Packages.Enterprise];\n\nexport const SUITE_PRICING_PACKAGES: PackageSet = [\n Packages.AdvantageAnnual,\n Packages.TeamAdvantage,\n Packages.TeamPremier,\n];\n\n// As of 2023/05/09, only annual packages are eligible for stripe checkout\nexport const STRIPE_ELIGIBLE_PACKAGES: PackageSet = [\n Packages.AdvantageAnnual,\n Packages.PremierAnnual,\n Packages.TeamAdvantage,\n Packages.TeamPremier,\n];\n\nexport const GUAC_COUNTRY_CODES = Object.freeze(['GB', 'US', 'AU', 'CA']);\nexport const STARTER_ENABLED_COUNTRIES = Object.freeze([...USTerritoryCountryCodes, ...GBCountryCodes, 'AU']);\n\nexport const COMPARISON_PACKAGES: Partial> = {\n [Packages.TeamAdvantage]: Packages.AdvantageAnnual,\n [Packages.TeamPremier]: Packages.PremierAnnual,\n};\n\n// A list of packages that should display highlighted\nexport const HIGHLIGHTED_PACKAGES = [Packages.AdvantageAnnual];\n\n// these domains do not get hreflang tags added to their \nexport const SKIP_HREF_LANG_TAGS = Object.freeze({\n 'de.surveymonkey.com': true,\n 'ru.surveymonkey.com': true,\n});\n\n// Package type(route) and comparison packages mapping\nexport const ROUTE_PACKAGE_MAP: RoutePackageMap = {\n [PackageType.Individual]: INDIVIDUAL_PACKAGES,\n [PackageType.Teams]: TEAMS_PACKAGES,\n [PackageType.Educational]: EDUCATIONAL_PACKAGES,\n};\n","import { createUseStyles } from 'react-jss';\n\nconst useMainStyles = createUseStyles(() => ({\n Main: {\n maxWidth: 1400,\n margin: [0, 'auto'],\n },\n}));\n\nexport default useMainStyles;\n","import React from 'react';\nimport { BasePage } from '@sm/webassets';\nimport { useLocation } from 'react-router-dom';\nimport SEO from '~pricing/components/SEO';\nimport useScript from '~pricing/hooks/useScripts';\nimport { EXTERNAL_SCRIPTS } from '~pricing/lib/constants';\nimport useMainStyles from './useStyles';\n\nexport default function Layout({ children }: { children: React.ReactElement }): JSX.Element {\n useScript(EXTERNAL_SCRIPTS);\n // GP-69 Needs full page width so having the 1400px max-width from Main breaks the ui\n const routerLocation = useLocation();\n const { Main } = useMainStyles();\n return (\n \n \n {children}\n \n \n );\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * This hook creates a script tag that is appended to the body of an HTML page\n * e.g. the Stripe fraud detection script.\n * @param {string[]} urls\n * @returns void\n */\n\nexport default function useScript(urls: readonly string[]): void {\n const scriptElements = useRef([]);\n\n useEffect(() => {\n scriptElements.current = urls.map((url: string): HTMLScriptElement => {\n const existingScriptElement = document.querySelector(`script[src=\"${url}\"]`) as HTMLScriptElement;\n if (!existingScriptElement) {\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n script.type = 'text/javascript';\n script.setAttribute('data-status', 'loading');\n document.body.appendChild(script);\n return script;\n }\n return existingScriptElement;\n });\n\n return () => {\n // cleanup\n scriptElements.current?.forEach(\n (scriptElement: HTMLScriptElement) => scriptElement && document.body.removeChild(scriptElement)\n );\n };\n }, [urls]);\n}\n","import { useLocation } from 'react-router';\nimport { TrackingDetails } from './types';\n\n/**\n * We need to send exactly what is sent in prod now so we do not mess up existing dashboards.\n * For now, details & summary will suffice (we do not track enterprise page).\n * Do not change the object mapping without approval\n */\nconst PAGE_NAME_MAP: Record = Object.freeze({\n pricing: 'pricing summary canonical',\n 'pricing-teams': 'pricing summary teams',\n 'pricing-individual': 'pricing summary individual',\n 'pricing-details': 'pricing details canonical',\n 'pricing-teams-details': 'pricing details teams',\n 'pricing-individual-details': 'pricing details individual',\n 'pricing-educational': 'pricing educational',\n});\n\n/**\n * Similar to the above, a map of generated page names to the ut_source\n * parameter that will be attached to outgoing links\n */\nconst UT_SOURCE_MAP: Record = Object.freeze({\n pricing: 'pricing-teams-summary',\n 'pricing-teams': 'pricing-teams-summary',\n 'pricing-details': 'pricing-teams-details',\n 'pricing-individual': 'pricing-indv-summary',\n 'pricing-teams-details': 'pricing-teams-details',\n 'pricing-individual-details': 'pricing-indv-details',\n 'pricing-educational': 'pricing-indv-details',\n 'pricing-enterprise': 'pricing-teams-summary', // for now we are replicating legacy billweb\n 'pricing-enterprise-details': 'pricing-teams-summary',\n});\n\n/**\n * This hook returns the tracking info we need for either @sm/metrics or amplitude.\n * This hook can be extended to support all required tracking information in the near future\n * If display name is not provided, we fall back to the route.\n * @returns TrackingDetails\n */\nexport default function useTrackingDetails(): TrackingDetails {\n const { pathname, search } = useLocation();\n const utSource = new URLSearchParams(search).get('ut_source');\n // strips and replaces beginning and ending forward slash in the pathname\n const pageName = pathname\n ?.replace(/\\//g, '-')\n .replace(/^\\W+|\\W+$/gm, '')\n .trim();\n\n return {\n utSource,\n pageName: PAGE_NAME_MAP[pageName],\n pageUtSource: UT_SOURCE_MAP[pageName],\n };\n}\n","import { useContext, useMemo, useState } from 'react';\nimport { StaticContext } from '@sm/webassets';\n\nimport { PackageIds } from '~shared/constants/pricing';\nimport { STARTER_ENABLED_COUNTRIES } from '~pricing/lib/constants';\n\nimport { StarterEnabled } from './types';\n\n/**\n * Given an authenticated user and the country they live in, check to see if\n * that country is in the list of countries that qualify for Standard Annual.\n * @returns {StarterEnabled} A boolean flag: { isStarterEnabled: boolean; }\n */\nexport default function useStarterEnabled(): StarterEnabled {\n const [isStarterEnabled, setIsStarterEnabled] = useState(false);\n const {\n user: {\n package: packageID,\n isAuthenticated,\n subscribedAt,\n billingCountry, // see https://momentiveai.atlassian.net/browse/GROW-2417\n },\n } = useContext(StaticContext);\n\n useMemo(() => {\n const convertedPackageID = parseInt(packageID, 10);\n const isQualifiedBasedOnAuthAndCountry = isAuthenticated && STARTER_ENABLED_COUNTRIES.includes(billingCountry);\n // if the user package_id is 32 then there is no need to check subscription status\n if (isQualifiedBasedOnAuthAndCountry && convertedPackageID === PackageIds.STANDARD_ANNUAL) {\n setIsStarterEnabled(true);\n } else {\n setIsStarterEnabled(isQualifiedBasedOnAuthAndCountry && convertedPackageID === PackageIds.BASIC && !subscribedAt);\n }\n }, [packageID, billingCountry, isAuthenticated, subscribedAt]);\n return {\n isStarterEnabled,\n };\n}\n","import { Response } from 'express';\nimport { Packages } from '~shared/constants/pricing';\nimport { ExpCookie, ExpResult } from '~shared/types/pricing/experiments';\n/**\n * Checks if we are in a browser\n * @returns boolean\n */\nexport const EMPTY_STRING = '';\n\n/**\n * Check if we are in the DOM or browser\n * @returns boolean\n */\nexport const isBrowser = (): boolean => typeof window === 'object';\n\n/**\n * See https://docs.google.com/document/d/1a6JLyH4V7C6Wipl28lJa84yeaqqvUINfrBLmUQ3lNLA/\n * See https://momentiveai.atlassian.net/wiki/spaces/GROW/pages/977240306/Amplitude+Naming+Conventions\n */\nexport const AMPLITUDE_PAGE_EVENTS: Record = Object.freeze({\n pageView: 'page viewed',\n selectedPlans: 'pricing selected plan',\n experimentEvent: 'experiment event',\n});\n\n/**\n * https://momentiveai.atlassian.net/browse/GROW-2234\n * Some canonical name does not match what amplitude tracking expects\n * The object mapping resolves anything that is different from the canonical name\n * This can also serve as an override to existing packages. Please do so with authorazation\n */\nexport const AMPLITUDE_SELECTED_PACKAGE_MAP: Partial> = Object.freeze({\n [Packages.Enterprise]: 'enterprise_platinum',\n});\n\n/**\n * A utility function that converts arrays to object like\n * @param keys\n * @returns object\n */\n\nexport function convertToObject(...keys: K[]): { [T in K]: string } {\n const tempObject = {} as { [T in K]: string };\n return keys.reduce((a, v) => ({ ...a, [v]: v }), tempObject);\n}\n\n/**\n * This is a modified clone of\n * https://github.com/mntv-webplatform/smpackages/blob/97fcc41a6808c4e2b867dc35d54b2b5abc21279c/packages/metrics/src/utils.ts#L9\n * @param cname\n * @param defaultValue\n * @returns The cookie value we are interested in\n */\nexport function getCookieValue(cname: string): string {\n if (!isBrowser()) return '';\n const name = `${cname}=`;\n let cookieValue = '';\n const decodedCookie = decodeURIComponent(document.cookie);\n const decodedCookies = decodedCookie.split(';');\n\n decodedCookies?.forEach((c: string) => {\n let cSub = c;\n while (cSub.startsWith(' ')) {\n cSub = c.substring(1);\n }\n if (cSub.startsWith(name)) {\n cookieValue = c.substring(name.length + 1, c.length);\n }\n });\n return cookieValue;\n}\n/**\n * We need to set smexp cookie for logged-out experiments to ensure smooth experience from page to page\n * The smexp cookie value has the format {experiment_id}.{treatment_id}.{datetime_created}|{experiment_id2}.{treatment_id2}.{datetime_created2}\n * Since we don't want to take any chances we will set every cookie expsvc returns except the preview cookie.\n * @param res\n * @param cookies\n */\nexport function setExperimentCookies(res: Response, cookies: ExpCookie[] | undefined, hostname: string): void {\n const remappedCookies = cookies?.reduce((acc: ExpResult, { name, value, age }: ExpCookie) => {\n return {\n ...acc,\n [name]: {\n value: acc[name]?.value ? `${acc[name]?.value}|${value}` : value,\n age,\n },\n };\n }, {});\n if (remappedCookies) {\n Object.keys(remappedCookies).forEach((name: string) => {\n const { value, age } = remappedCookies[name];\n const removeDeDupsCookieValue = Array.from(new Set(value.split('|'))).join('|');\n res.cookie(name, removeDeDupsCookieValue, {\n domain: hostname?.replace('www', ''), // surveymonkey ttld is preversed with this approach\n expires: new Date(age * 1000 + Date.now()),\n secure: true,\n path: '/',\n encode: tempValue => tempValue,\n });\n });\n }\n}\n\nexport { convertToObject as default };\n","import { MetricsTracker, USER_EVENTS, generateMetricsAttribute } from '@sm/metrics';\nimport { AMPLITUDE_PAGE_EVENTS, AMPLITUDE_SELECTED_PACKAGE_MAP } from '~shared/util';\nimport { Sources } from '~shared/constants/pricing';\nimport { AmplitudeProps, CTAClickEventType, PageEventLoadType } from './types';\n\n/**\n * Function to create an amplitude event to log the pricing page being loaded\n *\n * @param {string} pageName Name of page being loaded\n * @param {string} utSource utSource params\n * @returns void\n */\nexport function logPricingPageLoad({ pageName, utSource }: PageEventLoadType): void {\n if (!pageName) {\n return;\n }\n\n // async this to not block main thread\n setTimeout(() => {\n MetricsTracker.track({\n name: USER_EVENTS.PAGE_VIEW,\n data: {\n actionType: USER_EVENTS.PAGE_VIEW,\n actionFlow: pageName,\n amplitudeEvent: AMPLITUDE_PAGE_EVENTS.pageView,\n pageName,\n upgradeTriggerSource: utSource,\n source: Sources.PRICINGWEB,\n },\n });\n }, 0);\n}\n\n/**\n * Function to create an amplitude event to log a CTA button being clicked\n *\n * @param {string} pageName Name of page being loaded\n * @param {string} packageId ID of package where CTA was clicked\n * @param {string} packageName Name of package where CTA was clicked\n * @returns String\n */\nexport function generateCTAMetricsAttribute({ pageName, packageId, packageName }: CTAClickEventType): String {\n return generateMetricsAttribute({\n name: USER_EVENTS.ELEMENT_INTERACTION,\n data: {\n actionType: USER_EVENTS.ELEMENT_INTERACTION,\n actionFlow: pageName,\n amplitudeEvent: AMPLITUDE_PAGE_EVENTS.selectedPlans,\n pageName,\n selectedPackageId: packageId,\n selectedPackageName: AMPLITUDE_SELECTED_PACKAGE_MAP[packageName] ?? packageName.toLowerCase(),\n source: Sources.PRICINGWEB,\n },\n });\n}\n\n/**\n * A generic function to log amplitude events\n */\nexport function logAmplitudeEvent({\n eventName,\n pageName,\n amplitudeEvent = AMPLITUDE_PAGE_EVENTS.pageView,\n source = Sources.PRICINGWEB,\n userEvent = USER_EVENTS.ELEMENT_INTERACTION,\n otherData = {},\n}: AmplitudeProps): void {\n // async this to not block main thread\n setTimeout(() => {\n MetricsTracker.track({\n name: userEvent,\n data: {\n pageName,\n amplitudeEvent,\n eventName,\n source,\n ...otherData,\n },\n });\n }, 0);\n}\n","import { ExperimentList, TreatmentExperimentMap, ExperimentIdentifier } from '~shared/types/pricing/experiments';\n\nexport const EXPERIMENT_IDENTIFIERS: ExperimentIdentifier = {\n GROW_2197: {\n name: 'grow_2197_row_starter_annual_v2',\n treatment: 'grow_2197_row_starter_annual_v2_treatment',\n },\n ENTERPRISE_FEATURES_GP69: {\n name: 'gp_69_pnp_sme_features',\n treatment: 'gp_69_pnp_sme_treatment',\n },\n GROW_2529_FORMS: {\n name: 'grow_2529_forms_pricing_page',\n treatment1: 'grow_2529_forms_pricing_page_treatment1',\n treatment2: 'grow_2529_forms_pricing_page_treatment2',\n },\n GROW_2629_FORMS_V2: {\n name: 'grow_2629_forms_pricing_page_marketing',\n treatment: 'grow_2629_forms_pricing_page_marketing_treatment',\n },\n GROW_2427: {\n name: 'grow_2427_pnp_social_proof',\n treatment: 'grow_2427_pnp_social_proof_treatment',\n },\n GROW_2763: {\n name: 'grow_2763_gb_ca_and_edu_price_test',\n treatment: 'grow_2763_gb_ca_and_edu_price_test_treatment',\n },\n};\n\n// A map of `price_test` treatment names to the original experiment\n// identifier. Only experiments that have been added to experimentsvc\n// as a \"managed experiment\" should be added here.\n// ALL TREATMENTS INCLUDING CONTROL MUST BE ADDED\n//\n// This step is needed since we get price tests with the magical experiment\n// identifier \"price_test\", which hands us a treatment but not the original\n// experiment identifier.\n//\n// Price tests are generally used to test package price changes, but some times\n// also make changes to displayed features or some other UI change. If this is\n// the case for your test, be sure to add it to `FEATURE_EXPERIMENTS` or\n// `UI_EXPERIMENTS` below so other experiments will not be considered\nexport const PRICE_TEST_TREATMENTS: TreatmentExperimentMap = {\n grow_2197_row_starter_annual_v2_control: EXPERIMENT_IDENTIFIERS.GROW_2197.name,\n grow_2197_row_starter_annual_v2_treatment: EXPERIMENT_IDENTIFIERS.GROW_2197.name,\n grow_2629_forms_pricing_page_marketing_control: EXPERIMENT_IDENTIFIERS.GROW_2629_FORMS_V2.name,\n grow_2629_forms_pricing_page_marketing_treatment: EXPERIMENT_IDENTIFIERS.GROW_2629_FORMS_V2.name,\n grow_2529_forms_pricing_page_control: EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.name,\n grow_2529_forms_pricing_page_treatment1: EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.name,\n grow_2529_forms_pricing_page_treatment2: EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.name,\n grow_2763_gb_ca_and_edu_price_test_control: EXPERIMENT_IDENTIFIERS.GROW_2763.name,\n grow_2763_gb_ca_and_edu_price_test_treatment: EXPERIMENT_IDENTIFIERS.GROW_2763.name,\n};\n\n// same situation as above, but for \"feature_test\"\nexport const FEATURE_TEST_TREATMENTS: TreatmentExperimentMap = {};\n\n// A list of experiments that may change the display of prices. If your experiment\n// is listed in PRICE_TEST_TREATMENTS above, you do not need to add it again! If\n// a user is not assigned to any running price_test, we will start checking\n// for assignments against this list of experiment identifiers\nexport const PRICE_EXPERIMENTS: ExperimentList = [\n EXPERIMENT_IDENTIFIERS.GROW_2629_FORMS_V2.name, // order matters for these forms experiment\n EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.name,\n];\n\n// A list of experiments that may change the display of features. This can include\n// an experiment being run as a price_test, but if your experiment is already in\n// FEATURE_TEST_TREATMENTS, DO NOT ADD IT HERE\nexport const FEATURE_EXPERIMENTS: ExperimentList = [];\n\n// A list of experiments that will alter the UI of the page and are siginificant\n// enough that they should not overlay with each other. If you have a price test or\n// feature test above that makes changes to the UI, you should add them here so the\n// user isn't added to a different UI experiment\nexport const UI_EXPERIMENTS: ExperimentList = [\n EXPERIMENT_IDENTIFIERS.ENTERPRISE_FEATURES_GP69.name,\n EXPERIMENT_IDENTIFIERS.GROW_2197.name,\n EXPERIMENT_IDENTIFIERS.GROW_2427.name,\n EXPERIMENT_IDENTIFIERS.GROW_2629_FORMS_V2.name, // order matters for these forms experiment\n EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.name,\n];\n","import { FormattedNumber } from '@sm/intl';\n\nimport { ComparePlanIds, PackageIds, Packages, SkuTypes } from '~shared/constants/pricing';\nimport {\n INDIVIDUAL_PACKAGES_WITH_FORMS,\n INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL,\n INDIVIDUAL_PACKAGES_WITH_FORMS_REVERSED,\n INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL_REVERSED,\n INDIVIDUAL_PACKAGES_WITH_STARTER,\n ROUTE_PACKAGE_MAP,\n TEAMS_PACKAGES,\n} from './constants';\n\nimport { FeatureSetMap } from '~pricing/transformers/types';\nimport {\n PackageData,\n PackageDataSet,\n PackageSet,\n PackageSkuCost,\n PackageSkuCosts,\n PackageType,\n} from '~shared/types/pricing/package';\nimport { DiscountInfo, Feature } from '~shared/types/pricing/pricingsvc';\nimport { PlaceHolderType } from './types';\nimport { ExperimentAssignment } from '~shared/types/pricing/experiments';\nimport { EXPERIMENT_IDENTIFIERS } from '~server/routes/Pricing/experimentsConfig';\n\n/**\n * Creates a className friendly string from a package label\n *\n * @param {PlaceHolderType} packageObj The package object to create the class name from\n * @return {string} The label name, ready to be used as a className\n */\nexport function packageLabelToClassName(packageObj: PlaceHolderType): string {\n return packageObj.label.trim().replace(/\\s/g, '-').toLowerCase();\n}\n\n/**\n * Returns a package's SKU cost object for a particular SKU type\n *\n * @param skuCosts The package's SKU costs\n * @param skuType The type of SKU to find\n * @returns The SkuCost object of the requested type or undefined if not found\n */\nexport function getSkuCostByType(skuCosts: PackageSkuCosts, skuType: SkuTypes): PackageSkuCost | undefined {\n return skuCosts.find(sku => sku?.skuType === skuType);\n}\n\n/**\n *\n * @param skuCosts\n * @returns The package set cost information based on the subscription type\n */\nexport function getCoreCostFromSkus(skuCosts: PackageSkuCosts): PackageSkuCost | undefined {\n return getSkuCostByType(skuCosts, SkuTypes.CoreSeat);\n}\n\n/**\n *\n * @param packages\n * @returns The package set cost information replicated from one of the other comparison packages\n */\n\nexport function getCoreCostReplicaForBasicPackage(packages: PackageDataSet): PackageSkuCost | undefined {\n const referencePackageSkuCost = packages.find(packageData => packageData?.skuCost.length)?.skuCost[0];\n return referencePackageSkuCost\n ? {\n skuType: referencePackageSkuCost?.skuType,\n cost: 0,\n currency: referencePackageSkuCost?.currency,\n }\n : undefined;\n}\n\n/**\n * Given two skuCosts, returns the rounded percentage savings between them\n *\n * @param {object} skuCostOriginal The originally priced skuCost object\n * @param {object} skuCostDiscounted The discounted priced skuCost object\n */\nexport function calculateSavingsPercent(skuCostOriginal: PackageSkuCost, skuCostDiscounted: PackageSkuCost): number {\n let retVal = 0;\n const costDifference = skuCostOriginal?.cost - skuCostDiscounted?.cost;\n\n // If the \"discounted\" price is greater, we'll just ignore that...\n if (costDifference > 0) {\n retVal = Math.floor((costDifference / skuCostOriginal?.cost) * 100);\n }\n\n return retVal;\n}\n\nexport function formatCostInSkuCurrency(\n value: number,\n skuCost: PackageSkuCost,\n minimumFractionDigits = 0\n): React.ReactElement | string {\n return FormattedNumber({\n value,\n formatStyle: 'currency',\n currency: skuCost?.currency?.code,\n currencyDisplay: 'symbol',\n minimumFractionDigits,\n });\n}\n\nexport function formatCostInLocaleCurrency(\n skuCost: PackageSkuCost,\n minimumFractionDigits = 0\n): React.ReactElement | string {\n return formatCostInSkuCurrency(skuCost.cost / 100, skuCost, minimumFractionDigits);\n}\n\nexport function monthlyCostInDollars(skuCost: PackageSkuCost): number {\n return skuCost.cost / 100 / 12;\n}\n\nexport function formatMonthlyCostInLocaleCurrency(skuCost: PackageSkuCost): React.ReactElement | string {\n const monthlyCost = monthlyCostInDollars(skuCost);\n return formatCostInSkuCurrency(monthlyCost, skuCost);\n}\n\nexport function getDiscountedSkuCost(skuCost: PackageSkuCost, discountInfo: DiscountInfo): PackageSkuCost {\n const tempSkuCost = { ...skuCost };\n tempSkuCost.cost = (skuCost.cost * (100 - discountInfo.discountPercentage)) / 100;\n return tempSkuCost;\n}\n\nexport function createPackagesList(packages: PackageDataSet, packageSet: PackageSet): PackageDataSet {\n // The provided package list is both the filter and determines the order\n return packages\n .filter((packageObj: PackageData) => packageSet.includes(packageObj.packageName))\n .sort((a, b) => packageSet.indexOf(a.packageName) - packageSet.indexOf(b.packageName));\n}\n\nexport function convertFeatureSetToMap(featureSet: Feature[]): FeatureSetMap {\n return featureSet.reduce((acc: FeatureSetMap, feature: Feature) => {\n acc[feature.name] = feature;\n return acc;\n }, {});\n}\n\n/**\n * Get PackageSet based on package type (route) and if starter is enabled for user\n * @param packageType\n * @param isStarterEnabled (optional)\n * @returns PackageSet\n */\n\nexport function getPackageSetBasedOnPath(\n packageType: string,\n isForms?: ExperimentAssignment | null,\n isStarterEnabled = false\n): PackageSet {\n if (isForms && packageType === PackageType.Individual) {\n if (isStarterEnabled) {\n return isForms?.hasAssignment && isForms.treatmentName === EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.treatment2\n ? INDIVIDUAL_PACKAGES_WITH_FORMS_REVERSED\n : INDIVIDUAL_PACKAGES_WITH_FORMS;\n }\n return isForms?.hasAssignment && isForms.treatmentName === EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.treatment2\n ? INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL_REVERSED\n : INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL;\n }\n if (isStarterEnabled && packageType === PackageType.Individual) {\n return INDIVIDUAL_PACKAGES_WITH_STARTER;\n }\n return ROUTE_PACKAGE_MAP[packageType] ?? TEAMS_PACKAGES;\n}\n\nexport function getPackagesBasedOnQueryStringIds(ids: string, packageType: string): PackageSet {\n const packages = ids\n .split(',')\n .map(id => {\n return Object.keys(PackageIds).find((key: string): boolean => {\n return PackageIds[key as keyof typeof PackageIds] === Number(id);\n });\n })\n .filter(packageName => packageName && ComparePlanIds.includes(packageName)) as PackageSet;\n\n return packages?.length ? packages : getPackageSetBasedOnPath(packageType);\n}\n\nexport function isPaidUser(pkg: number | string): boolean {\n return Number(pkg) !== PackageIds[Packages.Basic];\n}\n","import { StaticContext } from '@sm/webassets';\nimport React, { createContext, useMemo, useContext, useCallback, useState, useEffect } from 'react';\nimport { PackageIds, SkuTypes } from '~shared/constants/pricing';\nimport { PricingPackage } from '~shared/types/pricing/pricingsvc';\nimport { PackageSkuCost, PackagesProviderProps, PackagesHook, PackageMap } from '~shared/types/pricing/package';\nimport { usePricingExperience } from './usePricingExperience';\nimport { usePricingState } from './usePricingState';\nimport ACTIONS from '~shared/actions';\nimport { CombinedActions } from '~shared/types/pricing/actions';\n\nconst NULL_PACKAGE = {} as PricingPackage;\nconst ANONYMOUS_PACKAGE = 1;\n\n// NOOP API so the page doesn't explode on initial render\nexport const PackagesContext = createContext({\n allPackages: [],\n userPackage: NULL_PACKAGE,\n displayPackages: [],\n discountInfo: undefined,\n showEduDiscount: false,\n packagesToDisplay: [],\n comparePlans: false,\n overageCost: undefined,\n getPackageById: packageId => NULL_PACKAGE,\n});\n\nexport function PackagesProvider({\n packagesToDisplay,\n showEduDiscount,\n comparePlans,\n children,\n}: PackagesProviderProps): JSX.Element {\n const { packages, discountInfo } = usePricingExperience();\n const {\n state: {\n packages: { displayPackages, packagesToDisplayState },\n },\n dispatch,\n } = usePricingState();\n\n const [packagesForExperience, setPackagesForExperience] = useState(packages);\n const [packageIdToPackageMap, setPackageIdToPackageMap] = useState({});\n\n const { user } = useContext(StaticContext);\n\n // this will reformat the data from pricingsvc to match whether we are displaying\n // the educational discount or not. since the OG data contains _all_ the information,\n // we just need to fake what gets disseminated to the page components at this point\n useMemo(() => {\n const updatedPackageMap: PackageMap = {};\n const updatedPackages = packages.map(pkg => {\n const newPackage = {\n ...pkg,\n\n // `comparisonSkuCosts` is the OG pricing data, so if this isn't EDU pricing,\n // we'll slip that in as the normal `skuCost`\n skuCost: showEduDiscount || !pkg.comparisonSkuCost?.length ? pkg.skuCost : pkg.comparisonSkuCost,\n\n // in normal view, don't send the comparison costs down\n comparisonSkuCost: showEduDiscount ? pkg.comparisonSkuCost : undefined,\n };\n updatedPackageMap[parseInt(newPackage.id, 10)] = newPackage;\n return newPackage;\n });\n\n setPackagesForExperience(updatedPackages);\n setPackageIdToPackageMap(updatedPackageMap);\n }, [showEduDiscount, packages, setPackagesForExperience, setPackageIdToPackageMap]);\n\n const getPackageById = useCallback(\n packageId => packageIdToPackageMap[parseInt(packageId, 10)],\n [packageIdToPackageMap]\n );\n\n const userPackage = useMemo(\n () => getPackageById(user.package || ANONYMOUS_PACKAGE),\n [user, getPackageById]\n );\n\n const overageCost = useMemo(() => {\n // From the implementation of BILLING-18548, overage cost is package agnostic, so we'll\n // pull the overage SKU cost from team premier\n const teamPremier = getPackageById(PackageIds.TEAM_PREMIER_ANNUAL);\n return teamPremier?.skuCost.find(skuCost => skuCost.skuType === SkuTypes.ResponseOverage);\n }, [getPackageById]);\n\n const displayedPackages = useMemo(\n () => packagesToDisplay.map(packageName => packageIdToPackageMap[PackageIds[packageName]]),\n [packagesToDisplay, packageIdToPackageMap]\n );\n\n useEffect(() => {\n if (!displayPackages?.length) {\n dispatch({\n type: ACTIONS.UPDATE_PACKAGES,\n payload: { displayPackages: displayedPackages, allPackages: packagesForExperience },\n } as CombinedActions);\n }\n }, [dispatch, displayPackages, displayedPackages, packagesForExperience]);\n\n useEffect(() => {\n if (packagesToDisplay !== packagesToDisplayState) {\n // GROW-2629\n dispatch({ type: ACTIONS.FORMS_RESET_TOGGLE_SWITCH } as CombinedActions);\n // ALL\n dispatch({ type: ACTIONS.UPDATE_PACKAGES_TO_DISPLAY, payload: { packagesToDisplay } } as CombinedActions);\n dispatch({ type: ACTIONS.UPDATE_PACKAGES, payload: { displayPackages: displayedPackages } } as CombinedActions);\n }\n }, [dispatch, displayedPackages, packagesToDisplay, packagesToDisplayState]);\n\n const hookApi = useMemo(\n () => ({\n allPackages: packagesForExperience,\n displayPackages: displayedPackages,\n discountInfo,\n userPackage,\n showEduDiscount,\n packagesToDisplay: packagesToDisplayState,\n comparePlans,\n overageCost,\n getPackageById,\n }),\n [\n packagesForExperience,\n displayedPackages,\n discountInfo,\n userPackage,\n showEduDiscount,\n packagesToDisplayState,\n comparePlans,\n overageCost,\n getPackageById,\n ]\n );\n\n return {children};\n}\n\nexport const usePackages = (): PackagesHook => useContext(PackagesContext);\n","import React, { useMemo } from 'react';\nimport { useParams, useLocation } from 'react-router';\n\nimport { FiveHundredErrorPage } from '@sm/webassets';\n\nimport useTrackingDetails from '~pricing/hooks/useTrackingDetails';\nimport useStarterEnabled from '~pricing/hooks/useStarterEnabled';\nimport { usePricingExperience } from '~shared/hooks/usePricingExperience';\nimport { PackageType } from '~shared/types/pricing/package';\nimport { logPricingPageLoad } from '~pricing/pages/shared/index';\nimport { getPackagesBasedOnQueryStringIds, getPackageSetBasedOnPath } from '~pricing/lib/lib-helpers';\nimport { PackagesProvider } from '~shared/hooks/usePackages';\nimport { MatchParams } from './types';\nimport { usePricingExperiments } from '~shared/hooks/usePricingExperiments';\nimport { EXPERIMENT_IDENTIFIERS } from '~server/routes/Pricing/experimentsConfig';\n\nexport function withPageHandler
(WrappedComponent: React.ComponentType
): React.ComponentType
{\n return props => {\n const { canonicalPath = PackageType.Teams } = useParams();\n const { search } = useLocation();\n const query = new URLSearchParams(search);\n const comparePlans = query.get('compare_plans');\n\n const { pageName, utSource } = useTrackingDetails();\n useMemo(() => {\n logPricingPageLoad({ pageName, utSource });\n }, [pageName, utSource]);\n\n const { packages } = usePricingExperience();\n const { isStarterEnabled } = useStarterEnabled();\n const { uiExperiment } = usePricingExperiments();\n\n // GROW-2197\n const isROWStarterAnnualEnabled =\n uiExperiment.hasAssignment && uiExperiment.treatmentName === 'grow_2197_row_starter_annual_v2_treatment';\n // END GROW-2197\n\n // GROW-2529 Forms, GROW-2629 v2 Forms, price_test with major UI changes\n const isForms =\n uiExperiment.hasAssignment &&\n [\n EXPERIMENT_IDENTIFIERS.GROW_2629_FORMS_V2.treatment,\n EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.treatment1,\n EXPERIMENT_IDENTIFIERS.GROW_2529_FORMS.treatment2,\n ].includes(uiExperiment.treatmentName)\n ? uiExperiment\n : null;\n // END GROW-2529, GROW-2629\n\n // no data is no page\n const error = !Array.isArray(packages) || !packages.length;\n\n return (\n \n {/* if there was an issue loading the data from pricingsvc, we've got nothing to show. bail */}\n \n \n \n \n \n \n \n \n \n );\n };\n}\n\nexport default withPageHandler;\n","import { defineMessages } from '@sm/intl';\nimport PROJECT_NAME from '~app/pages/Pricing/constants/project';\n\nconst COPY = defineMessages({\n SELECT: {\n id: 'Pricing.copy.Select',\n defaultMessage: 'SELECT',\n desc: {\n id: 'Pricing.copy.Select',\n message: '[Type: Button][Vis.: high] - A button/link text for an authenticated user',\n project: PROJECT_NAME,\n },\n },\n SIGN_UP: {\n id: 'Pricing.copy.SignUp',\n defaultMessage: 'SIGN UP',\n desc: {\n id: 'Pricing.copy.SignUp',\n message: '[Type: Button][Vis.: high] - A button/link text for an unauthenticated user',\n project: PROJECT_NAME,\n },\n },\n YOUR_PLAN: {\n id: 'Pricing.copy.YourPlan',\n defaultMessage: 'YOUR PLAN',\n desc: {\n id: 'Pricing.copy.YourPlan',\n message: '[Type: Button][Vis.: high] - A button/link text for an purchased user',\n project: PROJECT_NAME,\n },\n },\n CONTACT_US: {\n id: 'Pricing.copy.ContactUs',\n defaultMessage: 'CONTACT US',\n desc: {\n id: 'Pricing.copy.ContactUs',\n message: '[Type: Button][Vis.: high] - A button/link text to contact the sales team',\n project: PROJECT_NAME,\n },\n },\n});\n\nexport default COPY;\n","import { useContext, useMemo, useState } from 'react';\nimport { t } from '@sm/intl';\nimport { StaticContext } from '@sm/webassets';\n\nimport { STRIPE_ELIGIBLE_PACKAGES } from '~pricing/lib/constants';\nimport { Packages } from '~shared/constants/pricing';\nimport { usePackages } from '~shared/hooks/usePackages';\nimport { PricingPackage } from '~shared/types/pricing/pricingsvc';\n\nimport COPY from './copy';\nimport useTrackingDetails from './useTrackingDetails';\nimport { CtaHook } from './types';\n\n/**\n * Given a user's details & the package they've signed up for,\n * returns the relevant CTA label and URL for signup/upgrade\n * @param {PricingPackage} pricingPackage Details of the pricing and features available in a package\n * @returns CtaHook\n */\nexport default function useCta(pricingPackage: PricingPackage): CtaHook {\n const { user } = useContext(StaticContext);\n const { userPackage, showEduDiscount } = usePackages();\n const [isEnabled, setIsEnabled] = useState(true);\n const [isUserPackage, setIsUserPackage] = useState(false);\n const [ctaUrl, setCtaUrl] = useState('');\n const [ctaLabel, setCtaLabel] = useState('');\n const { pageUtSource } = useTrackingDetails();\n\n useMemo(() => {\n /* if we don't have the user's package details (because they're in a package that's\n not part of the standard pricingweb loadout), default to allowing the CTA\n TODO: at the server side, if the user's package is not returned in the pricingsvc\n call, we need to do a separate fetch to retrieve it so we can reflect this CTA correctly */\n const isUpgradeable = userPackage?.details ? userPackage.details.tier < pricingPackage?.details.tier : true;\n const packageIsUserPackage = userPackage?.packageName === pricingPackage?.packageName;\n const { isAuthenticated, isStripeEligible } = user;\n const useStripeCheckout = isStripeEligible && STRIPE_ELIGIBLE_PACKAGES.includes(pricingPackage?.packageName);\n let newCtaUrl = '';\n\n if (packageIsUserPackage) {\n /* Since all users start with a basic package, we check if they are authenticated or not\n and set the correct cta label and sign up URL */\n if (!isAuthenticated) {\n setCtaLabel(t(COPY.SIGN_UP));\n newCtaUrl = `/user/sign-up/?ut_source=${pageUtSource}`;\n } else {\n setCtaLabel(t(COPY.YOUR_PLAN));\n }\n } else if (isUpgradeable) {\n // Labels first; simpler logic\n if (pricingPackage?.packageName === Packages.Enterprise) {\n setCtaLabel(t(COPY.CONTACT_US));\n } else {\n setCtaLabel(t(isAuthenticated ? COPY.SELECT : COPY.SIGN_UP));\n }\n\n // And URLs\n if (pricingPackage?.packageName === Packages.Enterprise) {\n const utSource2 = pageUtSource?.includes('details') ? 'teams_details' : 'teams';\n newCtaUrl = `/mp/contact-sales/?ut_source=${pageUtSource}&ut_source2=${utSource2}&ut_source3=primary_contact_cta&package_id=${pricingPackage?.id}`;\n } else if (showEduDiscount) {\n if (isAuthenticated && userPackage?.packageName === Packages.Basic) {\n newCtaUrl = `/billing/pw/discount/verify?package_id=${pricingPackage?.id}&ut_source=${pageUtSource}`;\n } else if (isAuthenticated) {\n newCtaUrl = `/upgrade?package_id=${pricingPackage?.id}&e=edu_faq&ut_source=${pageUtSource}`;\n } else {\n newCtaUrl = `/user/sign-up/?e=edu_faq&sm=${pricingPackage?.encryptedEduParam}&ut_source=${pageUtSource}`;\n }\n } else if (isAuthenticated) {\n if (userPackage?.packageName === Packages.Basic) {\n newCtaUrl = `/billing/checkout?package_id=${pricingPackage?.id}&ut_source=${pageUtSource}`;\n } else {\n newCtaUrl = `/upgrade?package_id=${pricingPackage?.id}&ut_source=${pageUtSource}`;\n }\n } else {\n newCtaUrl = `/user/sign-up/?sm=${pricingPackage?.encryptedCtaParam}&ut_source=${pageUtSource}`;\n }\n }\n\n /* if this is good to go for stripe checkout, make the URL swap here; it's a pretty easy find/replace scenario on the path.\n GROW-2426: if it's the user-subscribed package and using stripe do not set the url\n Setting the url renders a link, see https://code.corp.surveymonkey.com/wrench/wrench/blob/master/packages/button/Button.tsx */\n if (useStripeCheckout && !packageIsUserPackage && !showEduDiscount) {\n newCtaUrl = `/checkout${newCtaUrl.replace('/billing/checkout', '').replace('/upgrade', '')}`;\n }\n\n setCtaUrl(newCtaUrl);\n setIsEnabled(!isAuthenticated || isUpgradeable);\n setIsUserPackage(packageIsUserPackage);\n }, [\n user,\n userPackage,\n pricingPackage,\n showEduDiscount,\n pageUtSource,\n setIsEnabled,\n setIsUserPackage,\n setCtaLabel,\n setCtaUrl,\n ]);\n\n return {\n isEnabled,\n isUserPackage,\n ctaUrl,\n ctaLabel,\n };\n}\n","import { WrenchTheme } from '@wds/styles';\nimport { convertToObject } from '~shared/util';\n\nconst DISPLAY_SIZE_OPTIONS_DATA = Object.freeze(['default', 'sm', 'mds-sm', 'md', 'lg', 'xl', 'xs', 'none']);\n\nexport const SIZE_OPTIONS: { [key: string]: string } = convertToObject(...DISPLAY_SIZE_OPTIONS_DATA);\n\nexport type DisplaySizeOption = (typeof DISPLAY_SIZE_OPTIONS_DATA)[number];\nexport type DisplaySizeOptions = Record;\n\nconst DISPLAY_SIZE_OPTIONS: Required = {\n default: 'default',\n sm: WrenchTheme.breakpoints.sm,\n 'mds-sm': 320,\n md: WrenchTheme.breakpoints.md,\n lg: WrenchTheme.breakpoints.lg,\n xl: WrenchTheme.breakpoints.xl,\n xs: WrenchTheme.breakpoints.xs,\n none: 'none',\n};\n\nexport default DISPLAY_SIZE_OPTIONS;\n","import DISPLAY_SIZE_OPTIONS, { SIZE_OPTIONS } from '~shared/constants/sizes';\n\n// CSS Constants\n/**\n * Breakpoints to delineate special handling\n */\n// If mixing lowerBPMediaQUery with upperBPMediaQuery at same WrenchTheme.breakpoints[size],\n// most recent (in sequence) or most specific css rules would apply.\n// For MDS_MOBILE (768 and below rule) in conjunction with MDS_TABLET(768 and above rule), place\n// MDS_MOBILE first, followed by MDS_TABLET\nconst lowerBPMediaQuery = (size: string | number, overrideSize?: number): string => {\n return `@media only screen and (min-width: ${overrideSize ?? DISPLAY_SIZE_OPTIONS[size]}px)`;\n};\n\n/**\n * This set of media queries are designed to work with Wrench's breakpoints.\n * In particular, use alongside GridPlus/Wrench Grid and other
s (e.g., FlexContainer).\n *\n * NOTE: media queries cascade from small to large.\n * Thus specify in the following order for ease of use, ease of understanding, and to leverage CSS\n * cascading and rule specificity precedence.\n * XS_MEDIA_QUERY, SM_MEDIA_QUERY, MD_MEDIA_QUERY, LG_MEDIA_QUERY, XL_MEDIA_QUERY.\n\n* All browser widths > WrenchTheme.breakpoints.xl conform to XL_MEDIA_QUERY.\n * Similarly, if XS_MEDIA_QUERY is not stated and others are stated, e.g., SM_MEDIA_QUERY,\n * then widths from 0 to < WrenchTheme.breakpoints.sm use default CSS rules.\n */\n// Wrench.breakpoints - lg: '992px'\nexport const LG_MEDIA_QUERY = lowerBPMediaQuery(SIZE_OPTIONS.lg);\n// Wrench.breakpoints - md: '768px'\nexport const MD_MEDIA_QUERY = lowerBPMediaQuery(SIZE_OPTIONS.md);\n// Wrench.breakpoints - sm: '576px'\nexport const SM_MEDIA_QUERY = lowerBPMediaQuery(SIZE_OPTIONS.sm);\n// MDS_SMALL_BREAKPOINT = '320px'\nexport const SM_MOBILE_MEDIA_QUERY = lowerBPMediaQuery(SIZE_OPTIONS['mds-sm']);\n// Wrench.breakpoints - xs: '0'\nexport const XS_MEDIA_QUERY = lowerBPMediaQuery(SIZE_OPTIONS.xs);\n// Wrench.breakpoints - xl: '1200px'\nexport const XL_MEDIA_QUERY = lowerBPMediaQuery(SIZE_OPTIONS.xl);\n","import { createUseStyles } from 'react-jss';\nimport { PricingAppTheme } from '~app/styles/pricing/types';\nimport { MD_MEDIA_QUERY } from '~shared/media-query';\nimport { StyleProps, StyleRules } from './types';\n\nexport default createUseStyles(\n ({ pricingPalette, packageTheme, spacing }: PricingAppTheme) => ({\n CTAMargin: {\n marginTop: spacing[3],\n [MD_MEDIA_QUERY]: {\n marginTop: 'auto',\n },\n },\n CTA: {\n extend: 'CTAMargin',\n display: 'flex',\n padding: [0, spacing[4]],\n '& a': {\n borderRadius: 2,\n flex: 1,\n backgroundColor: ({ packageName }: StyleProps) => packageTheme[packageName]?.primary,\n border: 'none',\n '&:hover, &:focus': {\n backgroundColor: ({ packageName }: StyleProps) => packageTheme[packageName]?.primary,\n },\n },\n },\n noCTA: {\n extend: 'CTAMargin',\n display: 'flex',\n justifyContent: 'center',\n background: 'none',\n border: 'none',\n '& button': {\n color: pricingPalette.colors.black,\n },\n },\n })\n);\n","import React from 'react';\nimport { Button } from '@wds/button';\n\nimport useTrackingDetails from '~pricing/hooks/useTrackingDetails';\n\nimport useCta from '~pricing/hooks/useCta';\nimport { generateCTAMetricsAttribute } from '~pricing/pages/shared/index';\nimport { PackageIds } from '~shared/constants/pricing';\nimport { usePackages } from '~shared/hooks/usePackages';\nimport { PackageCTAProps } from './types';\n\nimport useStyles from './useStyles';\n\nconst PackageCta = ({ packageName, isSummaryPage = false }: PackageCTAProps): JSX.Element => {\n const { getPackageById } = usePackages();\n const { CTA, noCTA } = useStyles({ packageName });\n const packageId = PackageIds[packageName];\n const { pageName } = useTrackingDetails();\n const { isEnabled, ctaUrl, ctaLabel } = useCta(getPackageById(packageId));\n\n return (\n
\n );\n};\n\nexport default NavBar;\n","import React from 'react';\n\nimport { SkeletonLoader } from '@sm/webassets';\nimport { ProgressCircle } from '@sm/wds-react';\n\nimport './ucs-module-loaders.scss';\n\nconst TopBarSkeleton = () => (\n
\n \n
\n);\n\nconst DefaultLoader = () => (\n
\n \n
\n);\n\nconst MODULE_SKELETONS = {\n top_bar: TopBarSkeleton,\n};\n\nexport default DefaultLoader;\nexport { MODULE_SKELETONS };\n","import React, { Component } from 'react';\nimport classnames from 'classnames';\nimport PropTypes from 'prop-types';\n\nimport { ErrorBoundary, clientErrorHandler } from '@sm/webassets';\n\nimport { sanitizeString } from '@sm/utils';\nimport DefaultLoader, { MODULE_SKELETONS } from './UCSModuleLoaders';\n\nconst UCS_CONTAINER_ID_PREFIX = 'ucs-content';\n\n// TODO: this component is a duplicate of UCSModule from coreweb and\n// will need to be moved somewhere common\nclass UCSModule extends Component {\n static propTypes = {\n className: PropTypes.string,\n moduleName: PropTypes.string,\n customLoader: PropTypes.node,\n };\n\n static defaultProps = {\n moduleName: null,\n className: null,\n customLoader: null,\n };\n\n state = {\n data: {\n moduleHTML: null,\n },\n loading: true,\n error: false,\n };\n\n componentDidMount() {\n this._isMounted = true;\n this.getModuleHTML();\n }\n\n componentWillUnmount() {\n this._isMounted = false;\n }\n\n getPreloadedModule() {\n const { moduleName } = this.props;\n const moduleContainer = document.getElementById(`${UCS_CONTAINER_ID_PREFIX}-${moduleName}`);\n if (moduleContainer) {\n moduleContainer.remove();\n return moduleContainer.textContent;\n }\n return null;\n }\n\n async getModuleHTML() {\n const reFetchFailed = () => {\n this.setState({\n loading: false,\n error: true,\n });\n };\n\n let moduleHTML = this.getPreloadedModule();\n if (!moduleHTML) {\n try {\n moduleHTML = await this.reFetchModule();\n if (!this._isMounted) {\n return null;\n }\n } catch (error) {\n if (!this._isMounted) {\n return null;\n }\n clientErrorHandler.logError(error, 'ucsFetchFailure');\n return reFetchFailed();\n }\n }\n\n if (moduleHTML === null) {\n return reFetchFailed();\n }\n\n return this.setState({\n data: { moduleHTML },\n loading: false,\n error: false,\n });\n }\n\n async reFetchModule() {\n const { moduleName } = this.props;\n const moduleContent = await fetch(`/content/api/ucs/${moduleName}/html`, {\n credentials: 'include',\n });\n const moduleJson = await moduleContent.json();\n return moduleJson.html;\n }\n\n renderLoadingState = () => {\n const { customLoader, moduleName } = this.props;\n const ModuleLoader = MODULE_SKELETONS[moduleName];\n\n if (customLoader) {\n return customLoader;\n }\n\n if (ModuleLoader) {\n return ;\n }\n\n return ;\n };\n\n render() {\n const { className } = this.props;\n const { data, loading, error } = this.state;\n // fail silently\n const errorComponent = null;\n\n const classNames = classnames('sm-ucs-module__content-container', className);\n\n return (\n \n {this.renderLoadingState()}\n {errorComponent}\n \n \n \n \n );\n }\n}\n\nconst BoundUCSModule = props => (\n \n \n \n);\n\nexport default BoundUCSModule;\n","/**\n * Get the canonical URL for the current page\n * @returns {canonicalUrl} string\n */\nexport default function getCanonicalUrlOrNoIndex(subdomain, domain, tld, url) {\n let path = '';\n let noIndex = false;\n let canonicalUrl = '';\n\n if (subdomain !== 'www' || tld !== 'com') {\n noIndex = true;\n } else {\n if (typeof window !== 'undefined') {\n path = window.location.pathname;\n } else {\n path = url.indexOf('?') > -1 ? url.substr(0, url.indexOf('?')) : url;\n }\n\n if (path.substr(-1) !== '/') {\n path += '/';\n }\n\n canonicalUrl = `https://${subdomain}.${domain}.${tld}${path}`;\n }\n\n return { noIndex, canonicalUrl };\n}\n","export default function switchAccountsUrl(pathname, search) {\n const epParam = `ep=${encodeURIComponent(pathname + search)}`;\n const sep = search ? '&' : '?';\n return `/user/account/select${search}${sep}${epParam}`;\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\n\nimport { Typography, Menu, MenuItem, Button } from '@sm/wds-react';\nimport { IconCaretDown } from '@sm/wds-icons';\nimport { Logo } from '@sm/webassets';\nimport { defineMessages, T } from '@sm/intl';\n// LinkWithSearch should be used so it will keep any existing query arguments present in the url (needed for ut_source)\nimport LinkWithSearch from '../LinkWithSearch';\nimport switchAccountsUrl from './switchAccountsUrl';\n\nconst COPY = defineMessages({\n NAV_MY_ACCOUNT: {\n id: 'AppsDirectory.AppDirNavHeaderDesktop.MyAccountLink',\n defaultMessage: 'My Account',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to their profile page',\n },\n NAV_SWITCH_ACCOUNTS: {\n id: 'AppsDirectory.AppDirNavHeaderDesktop.SwitchAccountsLink',\n defaultMessage: 'Switch accounts',\n description: '[Type: Label][Vis.: high] - A link that will direct the user to the switch accounts page',\n },\n NAV_HELP_CENTER: {\n id: 'AppsDirectory.AppDirNavHeaderDesktop.HelpCenterLink',\n defaultMessage: 'Help Center',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to the help center page',\n },\n NAV_SIGN_OUT: {\n id: 'AppsDirectory.AppDirNavHeaderDesktop.SignOutLink',\n defaultMessage: 'Sign Out',\n description: '[Type: Link][Vis.: Low] - A link that will sign the user out',\n },\n NAV_SIGN_IN: {\n id: 'AppsDirectory.AppDirNavHeaderDesktop.SignInLink',\n defaultMessage: 'Sign In',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to the sign in page',\n },\n NAV_SIGN_UP: {\n id: 'AppsDirectory.AppDirNavHeaderDesktop.SignUpLink',\n defaultMessage: 'Sign Up',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to the sign up page',\n },\n});\n\nconst AppDirNavHeaderDesktop = ({\n navItems,\n shouldDisplayNavItem,\n isAuthenticated,\n username,\n showSwitchAccounts,\n location: { pathname, search },\n}) => {\n return (\n
\n \n \n \n App Directory\n \n \n
\n \n
\n \n \n
\n
\n }\n >\n \n \n \n \n \n \n \n
\n \n \n
\n \n \n
\n \n \n
\n );\n};\n\nAppDirNavHeaderDesktop.propTypes = {\n navItems: PropTypes.arrayOf(\n PropTypes.shape({\n target: PropTypes.string.isRequired,\n text: PropTypes.node.isRequired,\n requiresAuthentication: PropTypes.bool,\n })\n ).isRequired,\n shouldDisplayNavItem: PropTypes.func.isRequired,\n isAuthenticated: PropTypes.bool.isRequired,\n username: PropTypes.string.isRequired,\n location: PropTypes.shape({\n pathname: PropTypes.string,\n search: PropTypes.string,\n }).isRequired,\n showSwitchAccounts: PropTypes.bool,\n};\n\nAppDirNavHeaderDesktop.defaultProps = {\n showSwitchAccounts: false,\n};\n\nexport default withRouter(AppDirNavHeaderDesktop);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\n\nimport { Menu, MenuGroup, MenuItem } from '@sm/wds-react';\nimport { IconMenu, IconLogoGoldie } from '@sm/wds-icons';\nimport { defineMessages, T } from '@sm/intl';\nimport switchAccountsUrl from './switchAccountsUrl';\n\nconst COPY = defineMessages({\n NAV_MY_ACCOUNT: {\n id: 'AppsDirectory.AppDirNavHeaderMobile.MyAccountLink',\n defaultMessage: 'My Account',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to their profile page',\n },\n NAV_SWITCH_ACCOUNTS: {\n id: 'AppsDirectory.AppDirNavHeaderMobile.SwitchAccountsLink',\n defaultMessage: 'Switch accounts',\n description: '[Type: Label][Vis.: high] - A link that will direct the user to the switch accounts page',\n },\n NAV_HELP_CENTER: {\n id: 'AppsDirectory.AppDirNavHeaderMobile.HelpCenterLink',\n defaultMessage: 'Help Center',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to the help center page',\n },\n NAV_SIGN_OUT: {\n id: 'AppsDirectory.AppDirNavHeaderMobile.SignOutLink',\n defaultMessage: 'Sign Out',\n description: '[Type: Link][Vis.: Low] - A link that will sign the user out',\n },\n NAV_SIGN_IN: {\n id: 'AppsDirectory.AppDirNavHeaderMobile.SignInLink',\n defaultMessage: 'Sign In',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to the sign in page',\n },\n NAV_SIGN_UP: {\n id: 'AppsDirectory.AppDirNavHeaderMobile.SignUpLink',\n defaultMessage: 'Sign Up',\n description: '[Type: Link][Vis.: Low] - A link that will direct the user to the sign up page',\n },\n});\n\nfunction urlWithSearch(url, search) {\n return `${url}${search}`;\n}\n\nconst AppDirNavHeaderMobile = ({\n isAuthenticated,\n navItems,\n shouldDisplayNavItem,\n showSwitchAccounts,\n location: { pathname, search },\n}) => {\n const authorizedMenuItems = navItems.filter(shouldDisplayNavItem).map(nav => (\n // The query params need to be preserved between urls (needed for ut_source)\n \n ));\n return (\n
\n \n \n \n \n \n
\n
\n }\n >\n {authorizedMenuItems}\n \n {/* fragment below is a workaround for https://code.corp.surveymonkey.com/wrench/wds/issues/904 */}\n <>\n \n \n \n \n \n \n >\n \n \n
\n \n \n
\n
\n }\n >\n {authorizedMenuItems}\n \n \n \n \n \n \n \n );\n};\n\nAppDirNavHeaderMobile.propTypes = {\n navItems: PropTypes.arrayOf(\n PropTypes.shape({\n target: PropTypes.string.isRequired,\n text: PropTypes.node.isRequired,\n requiresAuthentication: PropTypes.bool,\n })\n ).isRequired,\n shouldDisplayNavItem: PropTypes.func.isRequired,\n isAuthenticated: PropTypes.bool.isRequired,\n location: PropTypes.shape({\n pathname: PropTypes.string,\n search: PropTypes.string,\n }).isRequired,\n showSwitchAccounts: PropTypes.bool,\n};\n\nAppDirNavHeaderMobile.defaultProps = {\n showSwitchAccounts: false,\n};\n\nexport default withRouter(AppDirNavHeaderMobile);\n","import React, { useContext } from 'react';\nimport { Query } from '@apollo/react-components';\n\nimport { DesktopScreen, MobileTabletScreen, StaticContext } from '@sm/webassets';\nimport { defineMessages, T } from '@sm/intl';\nimport { getClientEnvironmentDetails } from '@sm/utils';\n\nimport AppDirNavHeaderDesktop from './AppDirNavHeaderDesktop';\nimport AppDirNavHeaderMobile from './AppDirNavHeaderMobile';\nimport userDropDownQuery from './AppDirNavHeader.graphql';\n\nimport './app-dir-nav-header.scss';\n\nexport const COPY = defineMessages({\n NAV_EXPLORE: {\n id: 'AppsDirectory.AppDirNavHeader.ExploreLink',\n defaultMessage: 'Explore',\n description:\n '[Type: Link][Vis.: High] - A link that will direct the user to initial page of the app directory site',\n },\n NAV_MANAGE: {\n id: 'AppsDirectory.AppDirNavHeader.ManageLink',\n defaultMessage: 'Manage',\n description:\n '[Type: Link][Vis.: High] - A link that will direct the user their installed apps and will be able to manage them',\n },\n NAV_DEVELOP: {\n id: 'AppsDirectory.AppDirNavHeader.DevelopLink',\n defaultMessage: 'Develop',\n description: '[Type: Link][Vis.: High] - A link that will direct the user to the developer portal',\n },\n NAV_PARTNER: {\n id: 'AppsDirectory.AppDirNavHeader.PartnerLink',\n defaultMessage: 'Partner',\n description: '[Type: Link][Vis.: High] - A link that will direct the user to the partner form page',\n },\n});\n\nexport const subdomainUri = (altdomain, domain, subdomain, tld) => {\n if (subdomain !== 'www') {\n return `https://${altdomain}.${subdomain}.${domain}.${tld}`;\n }\n return `https://${altdomain}.${domain}.${tld}`;\n};\n\nconst navigationItems = ({ domain, subdomain, tld }) => [\n { target: '/apps', text: },\n {\n target: '/apps/my-apps',\n text: ,\n requiresAuthentication: true,\n },\n {\n target: subdomainUri('developer', domain, subdomain, tld),\n text: ,\n },\n {\n target: 'https://www.surveymonkey.com/mp/partner-program/',\n text: ,\n },\n];\n\nexport function shouldDisplayNavItem(user, nav) {\n return !nav.requiresAuthentication || (nav.requiresAuthentication && user.isAuthenticated);\n}\n\nconst AppDirNavHeader = () => {\n const { user, environment } = useContext(StaticContext);\n const { userAgent } = useContext(StaticContext);\n const { isDesktop } = getClientEnvironmentDetails(userAgent);\n return (\n \n {({ data }) => {\n const hasMultipleLinkedIdentities = data?.user?.linkedIdentities?.totalCount > 0;\n return (\n <>\n \n
\n );\n};\n\nexport default Home;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { Typography } from '@sm/wds-react';\nimport AppPlaceHolderImg from '../../static/images/app-placeholder.png';\n// LinkWithSearch should be used so it will keep any existing query arguments present in the url (needed for ut_source)\nimport AppLink from '../AppLink';\n\nimport './app-listing-list.scss';\n\nconst AppListingList = ({ title, apps }) => (\n <>\n \n {title}\n \n\n
\n {\n setConfirmDialogVisible(false);\n onSuccess();\n }}\n >\n {(uninstallApp, { loading }) => {\n return (\n {\n setConfirmDialogVisible(false);\n onClose();\n }}\n >\n \n {COPY.REMOVE_DIALOG_MESSAGE.defaultMessage}\n \n \n \n \n \n \n \n );\n }}\n \n >\n );\n};\n\nRemoveApp.propTypes = {\n children: PropTypes.node.isRequired,\n appId: PropTypes.string.isRequired,\n onClose: PropTypes.func,\n onSuccess: PropTypes.func,\n};\n\nRemoveApp.defaultProps = {\n onClose: () => {},\n onSuccess: () => {},\n};\n\nexport default RemoveApp;\n","import React, { useContext } from 'react';\nimport { Query } from 'react-apollo';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\n\nimport { StaticContext, ErrorCard, TabletScreen, Helmet } from '@sm/webassets';\nimport { defineMessages } from '@sm/intl';\nimport { Card, Typography } from '@sm/wds-react';\nimport { IconDesktop, IconTrash, IconBadge } from '@sm/wds-icons';\nimport { getClientEnvironmentDetails } from '@sm/utils';\n\nimport NavBar from '../../components/NavBar';\nimport SearchBox from '../../components/SearchBox';\nimport RemoveApp from '../../components/RemoveApp';\nimport AppLink from '../../components/AppLink';\nimport AppListingSkeleton from '../../components/AppListingList/AppListingSkeleton';\nimport AppDirectoryBasePage from '../AppDirectoryBasePage';\n\nimport installedApplications from './myApps.graphql';\nimport './my-apps.scss';\nimport AppPlaceHolderImg from '../../static/images/app-placeholder.png';\n\nconst FETCH_LIMIT = 50;\n\nconst COPY = defineMessages({\n NO_RESULTS_FOUND: {\n id: 'MyApps.NoResultsFound',\n defaultMessage: 'You currently have no installed apps',\n description:\n '[Type: Paragraph][Vis.: med] - A message informing the current user that there are not installed apps',\n },\n PAGE_TITLE: {\n id: 'MyApps.PageTitle',\n defaultMessage: 'Installed Apps',\n description:\n '[Type: Header][Vis.: high] - The title of the page displaying the installed apps for the current user',\n },\n LAUNCH_APP_LINK: {\n id: 'MyApps.LaunchAppLink',\n defaultMessage: 'Launch',\n description: '[Type: Link][Vis.: med] - A link that will direct the user to launch page for a given application',\n },\n APP_DETAILS_LINK: {\n id: 'MyApps.AppDetailsLink',\n defaultMessage: 'Details',\n description: '[Type: Link][Vis.: med] - A link that will direct the user to details of a given application',\n },\n REMOVE_APP_LINK: {\n id: 'MyApps.RemoveAppLink',\n defaultMessage: 'Remove',\n description: '[Type: Link][Vis.: med] - A link that direct the user to uninstall a given application',\n },\n});\n\nfunction renderCategories(categories) {\n if (!categories || !categories.length) {\n return null;\n }\n return {categories.map(c => c.name).join(' ')};\n}\n\nconst MyApps = ({ location: { search } }) => {\n const {\n environment: { languageId },\n userAgent,\n } = useContext(StaticContext);\n const { isDesktop } = getClientEnvironmentDetails(userAgent);\n\n return (\n \n \n
\n \n {products.map((product, idx) => (\n \n ))}\n \n \n \n \n \n \n \n \n \n);\n\nProductCategory.propTypes = {\n title: PropTypes.string.isRequired,\n products: PropTypes.arrayOf(productPropType).isRequired,\n description: PropTypes.string.isRequired,\n first: PropTypes.bool.isRequired,\n anchor: PropTypes.string.isRequired,\n};\n\nexport default ProductCategory;\n","import React from 'react';\nimport { Grid, Row, Col, Button, Typography } from '@sm/wds-react';\nimport { TabletScreen, DesktopScreen, MobileScreen } from '@sm/webassets';\nimport { T } from '@sm/intl';\n\nimport { getLinkGenerator } from '../../helpers/logging';\nimport expertsImage from './experts.png';\nimport './here-to-help.scss';\n\nexport const COPY = {\n title: {\n id: 'mrx.HereToHelp.title',\n defaultMessage: 'Expert help for your market research program',\n description:\n '[Type: Header][Vis: med] - Title of a section of the market research experience page where we explain our customer support',\n },\n description1: {\n id: 'mrx.HereToHelp.description1',\n defaultMessage:\n 'Looking for an online panel to pinpoint hard-to-reach groups? Need to get a market research survey translated into Spanish? ' +\n 'Want reassurance that your survey logic is set up correctly? We have you covered with support and services that scale to meet your needs.',\n description: '[Type: Paragraph][Vis: med] - Description of our market research customer support',\n },\n description2: {\n id: 'mrx.HereToHelp.description2',\n defaultMessage: 'Choose from bundled or pay-as-you-go market research services.',\n description: '[Type: Paragraph][Vis: med] - Description of our market research customer support',\n },\n learnMore: {\n id: 'mrx.HereToHelp.learnMore',\n defaultMessage: 'Learn more',\n description: '[Type: Link][Vis: med] - Link to learn more about our market research solutions',\n },\n};\n\nexport const TEST_ID = 'HereToHelp';\n\nconst getLink = getLinkGenerator({\n ut_source: 'market_research',\n ut_source2: 'solutions',\n ut_source3: 'sm-button',\n});\n\nconst getBodySection = isMobile => (\n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n);\n\nconst HereToHelp = () => (\n \n \n \n
\n \n \n {getBodySection(false)}\n \n
\n \n \n \n \n {getBodySection(true)}\n \n
\n \n \n \n \n \n);\n\nexport default HereToHelp;\n","import { useState, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nexport const BREAK_POINT = Object.freeze({\n MD: 768,\n LG: 1200,\n XL: 1400,\n});\n\nexport const SCREEN = Object.freeze({\n MOBILE: `(max-width: ${BREAK_POINT.MD - 1}px)`,\n TABLET: `(min-width: ${BREAK_POINT.MD}px)`,\n MOBILE_TABLET: `(max-width: ${BREAK_POINT.LG - 1}px)`,\n SMALL_DESKTOP: `(min-width: ${BREAK_POINT.LG}px) and (max-width: ${BREAK_POINT.XL - 1}px)`,\n LARGE_DESKTOP: `(min-width: ${BREAK_POINT.XL}px)`,\n DESKTOP: `(min-width: ${BREAK_POINT.LG}px)`,\n});\n\nconst CustomScreen = ({ screen, children }) => {\n const m = window.matchMedia(screen);\n const [matches, setMatches] = useState(m.matches);\n useEffect(() => {\n const listenerArgs = [\n 'resize',\n () => {\n const doesMatch = window.matchMedia(screen).matches;\n if (matches !== doesMatch) setMatches(doesMatch);\n },\n ];\n window.addEventListener(...listenerArgs);\n return () => window.removeEventListener(...listenerArgs);\n });\n return matches ? children : null;\n};\n\nCustomScreen.propTypes = {\n screen: PropTypes.string.isRequired,\n children: PropTypes.node,\n};\n\nCustomScreen.defaultProps = {\n children: null,\n};\n\nexport default CustomScreen;\n","import { t } from '@sm/intl';\n\nconst COPY = {\n allbirds: {\n id: 'mrx.getLocalizedLogos.allbirds',\n defaultMessage: 'Allbirds company logo',\n description: '[Type: Label][Vis: low] - Labels Allbirds logo',\n },\n ibm: {\n id: 'mrx.getLocalizedLogos.ibm',\n defaultMessage: 'IBM company logo',\n description: '[Type: Label][Vis: low] - Labels IBM company logo',\n },\n just: {\n id: 'mrx.getLocalizedLogos.just',\n defaultMessage: 'JUST company logo',\n description: '[Type: Label][Vis: low] - Labels JUST company logo',\n },\n rj: {\n id: 'mrx.getLocalizedLogos.rj',\n defaultMessage: 'Raymond James company logo',\n description: '[Type: Label][Vis: low] - Labels Raymond James company logo',\n },\n tweezerman: {\n id: 'mrx.getLocalizedLogos.tweezerman',\n defaultMessage: 'Tweezerman company logo',\n description: '[Type: Label][Vis: low] - Labels Tweezerman company logo',\n },\n};\n\nconst _getImage = (imgName, useBig) =>\n useBig ? import(`./images/${imgName}--lg.png`) : import(`./images/${imgName}.png`);\n\nconst getLocalizedLogos = async (locale = 'en_US', size = 'lg') => {\n const useBig = size === 'lg';\n const getImage = async imgName => (await _getImage(imgName, useBig)).default;\n\n if (locale === 'en_US') {\n return [\n {\n id: 'ibmLogo',\n name: t(COPY.ibm),\n image: await getImage('ibm_logo'),\n },\n {\n id: 'tweezermanLogo',\n name: t(COPY.tweezerman),\n image: await getImage('tweezerman_logo'),\n },\n\n {\n id: 'justLogo',\n name: t(COPY.just),\n image: await getImage('just_logo'),\n },\n {\n id: 'raymondJamesLogo',\n name: t(COPY.rj),\n image: await getImage('rj_logo'),\n },\n {\n id: 'allbirdsLogo',\n name: t(COPY.allbirds),\n image: await getImage('allbirds_logo'),\n },\n ];\n }\n return [];\n};\n\nexport default getLocalizedLogos;\n","import React, { useState, useEffect } from 'react';\nimport classnames from 'classnames';\n\nimport { Grid, Row, Col, Typography } from '@sm/wds-react';\nimport { DesktopScreen } from '@sm/webassets';\nimport { T } from '@sm/intl';\n\nimport useBrowser, { BROWSER } from '../../helpers/useBrowser';\nimport { SCREEN } from '../../sharedComponents/CustomScreen';\nimport getLocalizedLogos from './getLocalizedLogos';\nimport './used-in-orgs.scss';\n\nexport const COPY = {\n title: {\n id: 'mrx.UsedInOrgs.title',\n defaultMessage: 'Leading brands use SurveyMonkey for market research',\n description:\n '[Type: Header][Vis: med] - Title of the section of the market research hub where we show companies that use our products',\n },\n};\n\nexport const TEST_ID = 'UsedInOrgs';\n\nconst UsedInOrgs = () => {\n const [logos, setLogos] = useState(null);\n const [screenSize, setScreenSize] = useState('lg');\n useEffect(() => {\n const listenerArgs = [\n 'resize',\n () => {\n const isMobileTablet = window.matchMedia(SCREEN.MOBILE).matches;\n if (isMobileTablet && screenSize !== 'sm') setScreenSize('sm');\n else if (screenSize !== 'lg') setScreenSize('lg');\n },\n ];\n window.addEventListener(...listenerArgs);\n getLocalizedLogos('en_US', screenSize).then(data => setLogos(data));\n return () => window.removeEventListener(...listenerArgs);\n }, [screenSize]);\n const isIE = useBrowser() === BROWSER.IE;\n return (\n \n \n \n
\n \n
\n \n \n \n \n \n
\n \n \n \n \n {logos.map(logo => (\n
\n \n \n ))}\n \n \n \n );\n};\n\nexport default UsedInOrgs;\n","import { FILTER_KEY } from '../enums';\n\nconst FILTERS = Object.freeze({\n [FILTER_KEY.CATEGORY]: (products, filterValues) =>\n Object.keys(products).reduce((prod, productCategory) => {\n if (filterValues.includes(productCategory)) return { ...prod, [productCategory]: products[productCategory] };\n return prod;\n }, {}),\n});\n\nexport const getFilterParamsFromUrlLocation = location => {\n if (!location) return {};\n const searchParams = new URLSearchParams(location.search);\n const filterParams = {};\n const validFilterKeys = Object.values(FILTER_KEY);\n searchParams.forEach((value, key) => {\n if (validFilterKeys.includes(key) && value) {\n filterParams[key] = value.split(',').map(x => x.trim());\n }\n });\n return filterParams;\n};\n\nconst filterProducts = (products, filterParams) => {\n return Object.keys(filterParams).reduce(\n (prod, filterKey) => FILTERS[filterKey](prod, filterParams[filterKey]),\n products\n );\n};\n\nexport default filterProducts;\n","/**\n * Helper class for making queries that depend on each other or for groups of\n * queries that all need to resolve before taking an action. Just cleans up\n * all of the '.then' statements needed for that kind of thing.\n */\n\nexport default class SynchronousQueryStream {\n constructor(apolloClient) {\n this.client = apolloClient;\n this.actions = [];\n this.catchHandlers = [];\n this.ctx = {};\n }\n\n /**\n * Basically a pass-through to the Apollo client.query\n */\n query = args => {\n this.actions.push(() => this.client.query(args));\n return this;\n };\n\n /**\n * Takes the result of the previous chained action and adds it to the collected\n * context\n */\n resolveToContext = () => {\n this.actions.push(data => {\n this.ctx = { ...this.ctx, ...data };\n });\n return this;\n };\n\n /**\n * Does basically the same thing as resolveToContext but destructures the\n * query result for you.\n */\n resolveQueryResultToContext = () => {\n this.actions.push(data => {\n this.ctx = { ...this.ctx, ...data.data };\n });\n return this;\n };\n\n /**\n * You get the result of the previous chained command and the context and the\n * result is transformed for the next chained command.\n */\n map = handler => {\n this.actions.push(handler);\n return this;\n };\n\n /**\n * You get the result of the previous chained command and the context but\n * this doesn't expect a return value and just passes the previous result\n * through to the next command.\n */\n peek = handler => {\n this.actions.push((...args) => {\n handler(...args);\n return args;\n });\n return this;\n };\n\n /**\n * This is a non-blocking catch that catches any error that has occurred since\n * the last catch. If this error isn't thrown, the return value of the handler\n * is passed to the next chained command after the catch.\n */\n catch = handler => {\n const startIdx = this.catchHandlers.length ? this.catchHandlers[this.catchHandlers.length - 1].range[0] : 0;\n this.catchHandlers.push({\n range: [startIdx, this.actions.length],\n handler,\n });\n return this;\n };\n\n /**\n * The commands will not be executed unless this is put at the end. This is\n * the final command that executes the chain of commands. Takes a handler that\n * will be passed the final result value as well as the final context value.\n */\n collect = async handler => {\n let result;\n for (let i = 0; i < this.actions.length; i += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n result = await this.actions[i](result, this.ctx);\n } catch (err) {\n let handled = false;\n for (let j = 0; j < this.catchHandlers.length; j += 1) {\n const catchHandler = this.catchHandlers[j];\n if (i >= catchHandler.range[0] && i < catchHandler.range[1]) {\n result = catchHandler.handler(err, result, this.ctx);\n handled = true;\n // eslint-disable-next-line prefer-destructuring\n i = catchHandler.range[1];\n break;\n }\n }\n if (!handled) throw err;\n }\n }\n\n handler(result, this.ctx);\n };\n}\n","import React, { useState, useEffect, useContext, useRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { withRouter } from 'react-router-dom';\nimport { withApollo } from 'react-apollo';\n\nimport { StaticContext, FiveHundredError } from '@sm/webassets';\nimport { Grid, Row, Col, ProgressCircle } from '@sm/wds-react';\nimport { t } from '@sm/intl';\n\nimport MRXPage from '../MRXPage';\nimport MRXHeader from './MRXHeader';\nimport ProductCategory from './ProductCategory';\nimport HereToHelp from './HereToHelp';\nimport UsedInOrgs from './UsedInOrgs';\nimport { modules as modulesQuery, user as userQuery } from './solutions.graphql';\nimport { PRODUCT_CATEGORY } from '../enums';\nimport filterProducts, { getFilterParamsFromUrlLocation } from './filter';\nimport { productCategoryPropType } from '../propTypes';\nimport getLogger, { LOGGER_NAME, getLinkGenerator } from '../helpers/logging';\nimport SynchronousQueryStream from '../helpers/SynchronousQueryStream';\n\nimport audienceImage from './audience-image.png';\nimport './mrx-solutions.scss';\n\nexport const COPY = {\n audiencePanel: {\n id: 'mrx.Solutions.audiencePanel',\n defaultMessage: 'Global survey panel',\n description: '[Type: Header][Vis: med] - Title of the Audience panel product solutions category',\n },\n expertSolutions: {\n id: 'mrx.Solutions.expertSolutions',\n defaultMessage: 'Expert solutions',\n description: '[Type: Header][Vis: med] - Title of the market research ready-made solutions category',\n },\n audiencePanelDescription: {\n id: 'mrx.Solutions.audiencePanelDescription',\n defaultMessage:\n 'Run your own global market research in minutes. Design a custom survey in the SurveyMonkey platform, ' +\n 'launch to your target audience, and receive real-time results.',\n description: '[Type: Paragraph][Vis: med] - Description of the Audience panel category of products',\n },\n expertSolutionsDescription: {\n id: 'mrx.Solutions.expertSolutionsDescription',\n defaultMessage:\n 'Get powerful insights without doing a single calculation. Customize your study using our built-in expert methodology, ' +\n 'launch to your target audience, and receive presentation-ready reports automatically.',\n description: '[Type: Paragraph][Vis: med] - Description of the market research ready-made category of products',\n },\n getStarted: {\n id: 'mrx.Solutions.getStarted',\n defaultMessage: 'Get started',\n description: '[Type: Link][Vis: med] - CTA for user to try out a market research product',\n },\n learnMore: {\n id: 'mrx.Solutions.learnMore',\n defaultMessage: 'Learn more',\n description: '[Type: Link][Vis: med] - CTA for user to learn more about a market research product',\n },\n contactUs: {\n id: 'mrx.Solutions.contactUs',\n defaultMessage: 'Contact us',\n description: '[Type: Link][Vis: med] - CTA for user to contact our support team about a market research product',\n },\n tryItNow: {\n id: 'mrx.Solutions.tryItNow',\n defaultMessage: 'Try it now',\n description: '[Type: Link][Vis: med] - CTA for user to contact our support team about a market research product',\n },\n surveyMonkeyAudience: {\n id: 'mrx.Solutions.surveyMonkeyAudience',\n defaultMessage: 'SurveyMonkey Audience',\n description: '[Type: Header][Vis: med] - Title of the Audience product',\n },\n surveyMonkeyAudienceDescription: {\n id: 'mrx.Solutions.surveyMonkeyAudienceDescription',\n defaultMessage:\n 'Find people who fit your criteria from our global panel of respondents. Select region, age, gender, income, and more.',\n description: '[Type: Paragraph][Vis: med] - Description of the Audience product',\n },\n};\n\nconst logger = getLogger(LOGGER_NAME.SOLUTIONS);\nconst biLogger = getLogger(LOGGER_NAME.BI_MARKETPLACE_MODAL);\nconst getLink = getLinkGenerator({\n ut_source: 'market_research',\n ut_source2: 'solutions',\n ut_source3: 'marketplace-cards',\n});\n\nconst getAudienceCategory = ctaCopy => ({\n name: t(COPY.audiencePanel),\n description: t(COPY.audiencePanelDescription),\n priority: 1,\n products: [\n {\n name: t(COPY.surveyMonkeyAudience),\n description: t(COPY.surveyMonkeyAudienceDescription),\n image: audienceImage,\n ctaLink: {\n href: getLink('/collect/audience/preview', {\n ut_ctatext: ctaCopy.defaultMessage,\n ut_source3: 'sm-button',\n }),\n text: t(ctaCopy),\n logging: () => logger.click.getStarted('audience_panel'),\n },\n learnMoreLink: {\n href: getLink('/market-research/solutions/audience-panel', {\n ut_ctatext: 'Learn more',\n }),\n text: t(COPY.learnMore),\n logging: () => logger.click.learnMore('audience_panel'),\n },\n },\n ],\n});\n\nconst MRX = ({ location, productCategories }) => {\n const [filterParams] = useState(getFilterParamsFromUrlLocation(location));\n const mProductCategories = filterProducts(productCategories, filterParams);\n const orderedCategories = Object.keys(mProductCategories);\n orderedCategories.sort((keyA, keyB) => {\n const priorityA = mProductCategories[keyA].priority;\n const priorityB = mProductCategories[keyB].priority;\n if (priorityA === undefined || priorityA === null) return 1;\n if (priorityB === undefined || priorityB === null) return -1;\n return priorityA - priorityB;\n });\n\n return (\n \n \n
\n \n \n \n Power your app with the SurveyMonkey API\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Learn\n \n \n \n Start by reading our documentation and decide whether you're building a public or\n private app.\n \n \n \n \n \n \n Develop\n \n \n \n As you're building, decide what scopes you'll need to request from users or ask\n for higher call limits.\n \n \n \n \n \n \n Deploy\n \n \n \n Once you're ready, deploy your app on the “Overview” page and track your user totals!\n \n \n \n
\n \n \n
\n \n \n \n Create with the SurveyMonkey API!\n \n \n \n \n Enable high-powered data collection\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Build a public app for the App Directory\n \n
\n
\n \n An unlimited number of users can access the app\n \n
\n
\n \n Developer only needs a basic account to start building\n \n
\n
\n Apps must be approved\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n Build a private app for you and your Team\n \n
\n
\n Developer purchases all accounts\n
\n
\n Developer needs an ENTERPRISE seat\n
\n
\n API limits apply\n
\n
\n \n \n \n \n \n \n \n
\n \n >\n );\n }}\n \n \n \n
\n \n \n \n Welcome to the SurveyMonkey API!\n \n \n \n \n Let's build together\n \n \n \n \n \n \n \n \n \n \n \n \n \n Customize\n \n \n \n Power your app with customer behavior data.\n \n \n \n \n \n \n Automate\n \n \n \n As your data starts rolling in, take action on your findings immediately.\n \n \n \n \n \n \n Engage\n \n \n \n Respond instantly to customer feedback.\n \n \n \n
\n );\n};\n\nAppTable.propTypes = {\n privateTable: PropTypes.bool,\n};\n\nAppTable.defaultProps = {\n privateTable: false,\n};\n\nexport default AppTable;\n","import React, { useContext, useEffect } from 'react';\n\nimport { Box } from '@wds/box';\nimport { Typography } from '@wds/typography';\n\nimport { StaticContext } from '@sm/webassets';\n\nimport DeveloperWebBasePage from '../DeveloperWebBasePage';\n\nimport waitForUsabilla from '~app/helpers/waitForUsabilla';\n\nimport AppTable from '../../components/AppTable';\n\nimport './faq.scss';\n\nconst FAQ = () => {\n const {\n environment: { domain, subdomain },\n } = useContext(StaticContext);\n\n useEffect(() => {\n waitForUsabilla(() => {\n window.usabilla_live('show');\n });\n }, []);\n\n // For testing only, when this goes live to the devekoper subdomain this will not be required\n const prependUrl = subdomain !== 'developer' && subdomain !== 'developer.eu' ? '/developer' : '';\n\n return (\n
\n \n
\n \n \n \n \n Frequently Asked Questions\n \n \n \n \n Building an app is hard work. We'll help answer any questions that you may have.\n \n \n \n\n \n \n \n What's the difference between building an app for the{' '}\n App Directory and building an app for my team?\n \n \n \n \n Based on your needs, most developers either fall into one bucket or the other. You'll find a\n quick rundown of the differences below.\n \n \n \n \n If you're looking for more info on either camp, visit{' '}\n Creating a Public App or{' '}\n Creating a Private App.\n \n \n\n \n \n \n\n \n \n *Please see our API Developer Terms for more guidelines when\n building with our API.\n \n \n \n\n \n \n How do I get support or suggest a feature for the SurveyMonkey API?\n \n \n \n Reach out to our team for help or feedback by{' '}\n visiting our contact page.\n \n \n \n\n \n \n Where can I read about the SurveyMonkey API scopes?\n \n \n \n Public app developers should understand which scopes they'll need. You can read more about scopes\n in our API Documentation.\n \n \n \n\n \n \n How do I download the actual text responses from my survey?\n \n \n \n Visit our SurveyMonkey API documentation to read about this and the other\n things you can achieve with our endpoints!\n \n \n \n\n \n \n How do I purchase more API calls?\n \n \n \n If you're building a Private app and think you need a higher API limit you should reach out to\n our sales team.\n \n \n \n\n \n \n How do I revoke an access token?\n \n \n \n You can refresh your app's credential in the settings for your app in the{' '}\n developer portal. This will refresh your secret, revoking all access to your app.\n \n \n \n\n \n \n Something missing? Reach out through our help center\n \n \n \n
\n \n
\n );\n};\n\nexport default FAQ;\n","import React from 'react';\nimport { Box } from '@wds/box';\nimport { Typography } from '@wds/typography';\n\nimport DeveloperWebBasePage from '../DeveloperWebBasePage';\n\nimport './tou.scss';\n\nconst renderSection1 = () => {\n return (\n \n \n \n 1. INTRODUCTION\n \n \n \n \n Thanks for your interest in using SurveyMonkey’s API for products and services branded as\n “SurveyMonkey” (“Services”).{' '}\n \n \n \n \n These Terms are a living document and may be changed by SurveyMonkey at any time. SurveyMonkey will post all\n changes online, and may notify you by email if SurveyMonkey regard the changes as significant and material.\n \n \n \n );\n};\n\nconst renderSection2 = () => {\n return (\n \n \n 2. USING THE API\n \n \n \n 2.1. Use Subject to Terms. Your use of the API and any API Content (including use of the API\n through a third party application that uses the API) is subject to compliance with these Terms. SurveyMonkey\n grants you a non-exclusive, non-transferable license (without the right to sublicense) to: (a) use the API\n solely as necessary to develop, test, operate and support your App using certain API Content accessed via the\n API; and (b) distribute or allow access to your integration of the API within your App to end users of your\n App. You may not sell, rent or redistribute access to the API or any API Content to any third party without\n SurveyMonkey’s prior written approval.\n \n \n \n \n 2.2. General Terms. If you use the Services as a user, such use remains subject to the\n SurveyMonkey Terms of Use for Services\n purchased on SurveyMonkey’s websites or the SurveyMonkey Governing Services Agreement (or similar\n governing service agreement) for Services purchased through SurveyMonkey’s enterprise sales team{' '}\n (“General Terms”). Your App’s interactions with a SurveyMonkey account must\n also comply with and be consistent with the General Terms.\n \n \n \n );\n};\n\nconst renderSection3 = () => {\n return (\n \n \n 3. DEVELOPER ACCOUNTS\n \n \n \n 3.1. Developer Account. Usage of the API is limited to owners of a SurveyMonkey account\n (“Developer Account”). After creation of your Developer Account, you may create\n applications, for which you will receive access credentials (“\n Access Credentials”). Keep your Access Credentials secure and confidential, as you are\n solely responsible for any activities occurring under your Developer Account.\n \n \n \n \n 3.2. Restrictions. You may open multiple Developer Accounts, but SurveyMonkey may close your\n accounts if SurveyMonkey regards that you have opened an excessive number of them. SurveyMonkey may also close\n your accounts if SurveyMonkey believes that you have created multiple accounts to bypass API call limits or\n restrictions. If your Developer Account is suspended, you must not attempt to circumvent such suspension by\n registering for a new Developer Account. You may not open a Developer Account if you are a competitor of\n SurveyMonkey.\n \n \n \n \n 3.3. Access Tokens and Credentials. If SurveyMonkey issues an Access Token for your App, you\n may only use that Access Token with that specific App, and cannot use that Access Token with any other\n application. SurveyMonkey may also issue credentials for your App. You may not sell, trade, or give your\n Access Token or credentials to any third party without SurveyMonkey’s prior written consent. You will\n take reasonable measures to safeguard Access Tokens and credentials from unauthorized use or access.\n \n \n \n );\n};\n\nconst renderSection4 = () => {\n return (\n \n \n 4. PRINCIPLES OF USER RESPECT\n \n \n \n SurveyMonkey’s goal is to ensure a great experience for SurveyMonkey’s Users. SurveyMonkey treat\n SurveyMonkey’s Users and their data with respect, so SurveyMonkey expects SurveyMonkey’s API\n developers to do the same.\n \n \n \n \n 4.1 Respect User Data. Your App must use User data in a way that the User expects. Avoid\n surprising Users by clearly describing what you are doing with their data. Obtain their permission before\n performing actions on their data, such as:\n \n \n
\n
\n editing survey data\n
\n
\n disclosing survey data to third parties\n
\n
\n using survey data in a way not expressly instructed\n
\n
\n editing survey questions or survey settings\n
\n
\n distributing surveys\n
\n
\n closing surveys\n
\n
\n altering account settings\n
\n
\n taking an account action on a User’s behalf\n
\n
\n \n \n 4.2.Don’t Mislead Users. Your App must not be presented in a way\n which misleads Users. For example, your App must not:\n \n \n
\n
\n be publicized in a way which is misleading to Users\n
\n
\n use logos or trademarks in a manner that misleads or confuses\n
\n
\n impersonate a third party without their authorization\n
\n
\n \n link to spam or malware sites or use shortened URLs to mask destinations in a misleading way\n \n
\n
\n \n \n 4.3.Don’t Encourage Bad Behavior. Your App must not induce your Users\n to act in an inappropriate or illegal manner. Specifically, you must not:\n \n \n
\n
\n \n encourage or cause Users to violate any law, terms of use or privacy policy (such as, for example, causing\n or facilitating the User to violate SurveyMonkey’s{' '}\n Acceptable Uses Policy through\n abusive use of email collectors)\n \n
\n
\n facilitate or encourage the infringement of intellectual property\n
\n
\n \n facilitate or encourage the publishing of a third party’s private or confidential information\n \n
\n
\n \n encourage collection of information SurveyMonkey doesn’t allow users to collect (like social security\n numbers, credit card numbers and passwords)\n \n
\n
\n \n encourage publishing of links to illegal or malicious content (including age restricted content to minors)\n \n
\n
\n \n );\n};\n\nconst renderSection5 = () => {\n return (\n \n \n 5. APP REQUIREMENTS\n \n \n \n 5.1.Privacy Content. Your App must include a privacy policy and/or privacy\n notices which describe in reasonably adequate detail how you handle any User data and personally identifiable\n information that may be collected from Users via the API. You must abide by your own privacy notices and\n policies.\n \n \n \n \n 5.2. Disconnection. You will make it easy for Users to disconnect or disassociate their\n account from your App, and you will not hide or obscure such functionality.\n \n \n \n );\n};\n\nconst renderSection6 = () => {\n return (\n \n \n 6. APP RESTRICTIONS\n \n \n \n 6.1. Category Restrictions. The following types of Apps are not permitted to use the API:\n \n \n
\n
\n \n Apps which are not related to facilitating surveys (e.g. you may not use SurveyMonkey as an email service\n provider to send out non-survey content).\n \n
\n
\n \n Apps which attempt to replicate core functionality of the Services, such as an App which white-labels the\n Services.\n \n
\n
\n \n Apps which facilitate the exporting of API Content for importation into a SurveyMonkey’s\n competitor’s product or service.\n \n
\n
\n \n \n 6.2. Presentation Restrictions. Your App cannot replicate, frame or mirror the SurveyMonkey\n websites or their design.\n \n \n \n \n 6.3. Functionality Restrictions. Your App may not:\n \n \n
\n
\n Crawl or datamine the API Content without each relevant User or Users’ consent\n
\n
\n \n Use the API to monitor the availability, performance or functionality of any our Services, or for other\n benchmarking or competitive purposes\n \n
\n
\n \n Alter, remove, replace or mask any aspect of a SurveyMonkey survey without SurveyMonkey’s prior\n written consent\n \n
\n
\n \n Be used in a way which lets Users circumvent any restrictions or limitations placed on their account due to\n the type of SurveyMonkey subscription plan they have (for example, the limitation on the number of survey\n responses that can be viewed by a User on a free subscription plan).\n \n
\n
\n \n );\n};\n\nconst renderSection7 = () => {\n return (\n \n \n 7. TECHNICAL RESTRICTIONS\n \n \n \n 7.1. API Call Limits. Monentive may impose limits on the number of API calls in any given\n period that your App is permitted to make. Public Apps and Private Apps may be subject to different\n limitations. If SurveyMonkey imposes such limits, SurveyMonkey may describe them on SurveyMonkey’s\n website. If you exceed the quantity of API calls you had purchased as specified in your order form,\n SurveyMonkey may charge additional fees for the excess. Unused API calls will not roll over to the next\n period.\n \n \n \n \n 7.2. Excessive Use. Abusive or excessive use of the API (as determined by SurveyMonkey) may\n result in the temporary suspension or termination of your access to the API. If your use of the API is likely\n to generate a volume of API calls materially in excess of what an average API developer would generate, or\n above the limits for your particular App, please contact SurveyMonkey first and SurveyMonkey may be able to\n agree to an arrangement in relation to your proposed use case.\n \n \n \n \n 7.3 Other Technical Limitations. Other technical restrictions imposed on Apps are:\n \n \n
\n
\n \n If you provide an application programming interface that uses the API to return the data of Users, you may\n only return Users’ usernames or unique identification numbers. You must pull all other User data by\n using the API.\n \n
\n
\n \n You may not use the API to aggregate, cache or store any place or geographic location information contained\n in API Content.\n \n
\n
\n \n );\n};\n\nconst renderSection8 = () => {\n return (\n \n \n 8. LEGAL RESTRICTIONS\n \n \n \n 8.1. Stay on the Right Side of the Law. Your App and your App’s use of the API must\n comply with all applicable laws, regulations and rules. Your App must not engage in (and must not facilitate)\n spamming, phishing or linking to illegal content. It is your responsibility to be familiar with, and abide by,\n the laws that apply to you.\n \n \n \n );\n};\n\nconst renderSection9 = () => {\n return (\n \n \n 9. SURVEYMONKEY BRAND ASSETS\n \n \n \n 9.1. Use of SurveyMonkey Brand Assets. SurveyMonkey’s name, logo, and other trademarks\n (“Marks”) are valuable brand assets of SurveyMonkey. Your use of SurveyMonkey’s name in\n conjunction with your Apps must be in accordance with the rules in this section. SurveyMonkey may publish\n brand use or trademark use guidelines from time to time on SurveyMonkey’s website, including as part of\n SurveyMonkey’s Brand and Trademark Use Policy\n , and use of SurveyMonkey’s Marks will be subject to all such guidelines. All goodwill arising out of or\n related to the use of the Marks by you shall inure to the benefit of SurveyMonkey.\n \n \n \n \n 9.2. No Endorsement. You may not use SurveyMonkey Marks in a way that creates a sense of\n affiliation, endorsement, or sponsorship by SurveyMonkey, unless you have SurveyMonkey’s express written\n permission to do so. Your Apps must be clearly labeled as your own, and not SurveyMonkey’s. While you\n may use SurveyMonkey’s name to indicate that your App integrates with or is compatible with the\n Services, or that SurveyMonkey was the source of the API Content, you may not label your product as a\n SurveyMonkey product or use the Marks as part of your own logo. You may not use SurveyMonkey’s Marks as\n part of the name of your company or of any App or other product or service created by you.\n \n \n \n \n 9.3. Proprietary Notices. You may not remove, modify or obfuscate any proprietary notices or\n marks on the API or in any API Content you obtain.\n \n \n \n );\n};\n\nconst renderSection10 = () => {\n return (\n \n \n 10. FEES\n \n \n \n 10.1. Fees. Access to the API for a basic level of API calls is currently provided at no\n additional fee apart from any applicable fees for your SurveyMonkey account. Contact Sales at SurveyMonkey for\n higher API call limit tiers.\n \n \n \n );\n};\n\nconst renderSection11 = () => {\n return (\n \n \n 11. MORE LEGAL TERMS\n \n \n \n 11.1. Limited License to Your Content. You grant SurveyMonkey a worldwide, royalty free\n license to use, reproduce, distribute, modify, adapt, create derivative works, make publicly available, and\n otherwise exploit your copyrights, trademarks, patents, publicity, moral, database, and/or other intellectual\n property rights in and to your App, but only for the limited purposes of promoting and marketing SurveyMonkey,\n SurveyMonkey’s API, and any API content in any media. This license also extends to any trusted third\n parties SurveyMonkey works with.\n \n \n \n \n 11.2. Integration Directory. SurveyMonkey may include and promote your application in\n SurveyMonkey’s integration directory of applications for SurveyMonkey users that have been developed by\n developers. Notwithstanding your application appearing in the integration directory, you agree that\n SurveyMonkey may for any reason demote or remove it from the integration directory.\n \n \n \n \n 11.3. Suspension and Termination. SurveyMonkey will endeavor to warn you if there is an issue\n with your App’s compliance with these Terms, or a compliance issue with the manner in which you are\n accessing the API, so that you can attempt to remedy the problem. Notwithstanding the foregoing, if\n SurveyMonkey believes that you have violated these terms or are accessing or using the API in any way that\n SurveyMonkey regards as abusive, or that causes liability or detriment to SurveyMonkey, SurveyMonkey may\n immediately, and without notice, suspend or terminate your access to the API, your Developer Account, and any\n API Content. SurveyMonkey may terminate these Terms for any reason, with or without notice to the email\n address associated with your Developer Account. You may terminate these Terms for any reason by ceasing to\n access the API, ceasing to use any API Content, and canceling your Developer Account.\n \n \n \n \n 11.4. Consequences of Termination. Upon termination of these Terms, you will cease accessing\n the API and will delete all API Content. Sections 3.2 (Restrictions), 9 (SurveyMonkey Brand Assets), 11.4\n (Consequences of Termination), and 11.7 (IP Ownership) to 11.14 (Terms for Non-U.S. Developers) will survive\n the termination of these Terms.\n \n \n \n \n 11.5. Cooperation. You agree to assist SurveyMonkey, at its request, to verify compliance\n with these Terms by providing SurveyMonkey with information about your App, including providing SurveyMonkey\n with access to it and/or other materials related to your use of the API.\n \n \n \n \n 11.6. Modifications and Support. SurveyMonkey may provide you with support for the API in\n SurveyMonkey’s sole discretion. SurveyMonkey may modify the API at any time without notice or liability\n to you. If you continue to access the API after such modifications, such act will be deemed your acceptance of\n the modifications.\n \n \n \n \n 11.7. IP Ownership. You acknowledge that SurveyMonkey and SurveyMonkey’s Users retain\n all worldwide rights, title and interest (including intellectual property rights) in and to the API Content.\n You acknowledge that SurveyMonkey or its licensors retain all rights, title and interest (including\n intellectual property rights) in and to the API and the Marks (and any derivative works or enhancements). You\n shall not do anything inconsistent with such ownership. Rights not expressly granted by these Terms are\n reserved by SurveyMonkey.\n \n \n \n \n Subject to the foregoing, you retain all worldwide rights, title and interest (including intellectual property\n rights) in and to your App. If you provide SurveyMonkey with any feedback or comments concerning the API or\n API Content, you agree that SurveyMonkey may use, reproduce, license, distribute and exploit in any other way,\n such feedback or comments.\n \n \n \n \n 11.8. Similar or Competitive Products or Services. You acknowledge that SurveyMonkey may\n independently develop, or have developed for it by other parties, products or services that are similar to or\n otherwise compete with your App, and nothing in these Terms will be construed against that.\n \n \n \n \n 11.9. Disclaimer of Warranties. ACCESS TO THE API AND THE API CONTENT IS PROVIDED “AS\n IS” WITH NO WARRANTY, EXPRESS OR IMPLIED, OF ANY KIND AND SURVEYMONKEY EXPRESSLY DISCLAIMS ALL\n WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AVAILABILITY,\n SECURITY, TITLE, AND NON-INFRINGEMENT. SOME API FEATURES MAY BE EXPERIMENTAL AND UNTESTED. SURVEYMONKEY DOES\n NOT REPRESENT OR WARRANT THAT THE API IS FREE OF INACCURACIES, ERRORS, BUGS, OR INTERRUPTIONS, OR ARE\n RELIABLE, ACCURATE, COMPLETE, OR OTHERWISE VALID. YOUR USE OF THE API AND API CONTENT IS AT YOUR RISK AND YOU\n WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE THAT RESULTS FROM USE OF THE API, INCLUDING FOR ANY DAMAGE TO YOUR\n COMPUTER SYSTEMS OR LOSS OF DATA. WHILE SURVEYMONKEY STRIVES TO MAKE THE API AVAILABLE WITHOUT INTERRUPTION,\n SURVEYMONKEY DOES NOT GUARANTEE THAT THE API WILL ALWAYS BE AVAILABLE AND DOES NOT PROVIDE ANY GUARANTEES AS\n TO SERVICE LEVELS.\n \n \n \n \n 11.10. Indemnity. You agree to indemnify and hold harmless SurveyMonkey, its affiliates, and\n their directors, officers, employees and agents, from and against any third party claim, losses, damages,\n suits, judgments, liability, and litigation costs (including reasonable attorneys’ fees) arising from or\n related to your use of the API or the API Content or your violation of these Terms.\n \n \n \n \n 11.11. Limitation of Liability. YOU AGREE THAT SURVEYMONKEY SHALL NOT BE LIABLE FOR ANY\n INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES, INCLUDING BUT NOT LIMITED TO, DAMAGES FOR\n LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER INTANGIBLE LOSSES (EVEN IF SURVEYMONKEY HAS BEEN ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGES), RESULTING FROM YOUR USE OF THE API OR THIRD PARTY PRODUCTS THAT ACCESS API\n CONTENT. IN ANY EVENT, SURVEYMONKEY’S AGGREGATE, CUMULATIVE LIABILITY TO YOU ARISING IN CONNECTION WITH\n THESE TERMS WILL NOT EXCEED US$100.00.\n \n \n \n \n 11.12. General. If any provision of these Terms is determined to be invalid or unenforceable\n by a court, such provision shall be deemed severable and the remainder of these Terms shall remain in full\n force and effect. The failure by SurveyMonkey to enforce any right or provision of these Terms shall not\n constitute a waiver of that provision or of any other provision of these Terms. You agree that you, and not\n SurveyMonkey, is responsible for determining which laws may apply to your use of the API and the API Content\n and assessing your obligations under such laws. These Terms comprise the entire agreement between you and\n SurveyMonkey with respect to its subject matter and supersede any prior or contemporaneous understandings,\n representations and other communications (written or oral) between you and SurveyMonkey.\n \n \n \n \n 11.13. Terms for U.S. Developers. If you are located in the United States, these Terms shall\n be governed by the laws of the State of California, without reference to its conflicts of law rules, and the\n parties hereby submit to the exclusive jurisdiction and venue of the state and federal courts located in that\n State.\n \n \n \n \n 11.14. Terms for Non-U.S. Developers. If you are located outside of the United States, these\n Terms shall be governed by the laws of Ireland, and the parties hereby submit to the exclusive jurisdiction of\n the courts of Ireland in relation to any claim arising under or in connection with these Terms which cannot be\n solved through a mutually agreed conciliation procedure.\n \n \n \n );\n};\n\nconst renderSection12 = () => {\n return (\n \n \n 12. DEFINITIONS\n \n \n \n “Access Token” means a token that permits your App to access or modify data in a\n User’s account.\n \n \n \n \n “API” means the application programming interface and associated code, tools,\n documentation and related material that SurveyMonkey provides to you in relation to our Services.\n \n \n \n \n “API Content” means any content made available to you through use of the API.\n \n \n \n \n “App” or “Application” means a software application,\n website, product or service that you create or offer.\n \n \n \n \n “Access Credentials” means the security keys, secrets, tokens, passwords,\n usernames and other identifiers and credentials used to access the API.\n \n \n \n \n “Developer Account” means the account for which you are required to register in\n order to obtain the Access Credentials and access to the API.\n \n \n \n \n “SurveyMonkey” means SurveyMonkey Inc. if you are located in the United States,\n SurveyMonkey Brasil Internet Ltda. if you are located inside of Brazil, and by SurveyMonkey Europe UC if you\n are located elsewhere.\n \n \n \n \n “Terms” means these SurveyMonkey API Developer Terms\n \n \n \n \n “User” means a SurveyMonkey user or a user of your Application that uses the API.\n \n \n \n );\n};\n\nconst TOU = () => {\n return (\n
\n \n
\n \n \n \n SurveyMonkey API Developer Terms\n \n \n VERSION DATE: November 1, 2023\n \n LAST UPDATED: November 1, 2023\n \n\n {renderSection1()}\n\n {renderSection2()}\n\n {renderSection3()}\n\n {renderSection4()}\n\n {renderSection5()}\n\n {renderSection6()}\n\n {renderSection7()}\n\n {renderSection8()}\n\n {renderSection9()}\n\n {renderSection10()}\n\n {renderSection11()}\n\n {renderSection12()}\n\n \n \n Changelog\n \n \n \n Jul 22, 2013 updates to Feb 14, 2013 version:\n \n \n
\n
\n Added provisions relating to Access Tokens and secret keys.\n
\n
\n \n \n Jan 1, 2015 updates to Jul 22, 2013 version:\n \n \n
\n
\n \n \n Changed contracting entity from our old Luxembourg entity (SurveyMonkey Europe Sarl) to our Irish\n entity (SurveyMonkey Europe).\n \n \n
\n
\n \n \n Nov 29, 2016 updates to Jan 1, 2015 version:\n \n \n
\n
\n \n \n Changed contracting entity from our old Irish entity (SurveyMonkey Europe) to our new entity\n (SurveyMonkey Europe UC).\n \n \n
\n
\n \n \n Jan 10, 2017 updates to Nov 29, 2016 version:\n \n \n
\n
\n \n \n Clarified that SurveyMonkey may charge for API calls that reach certain limits and these fees and\n quantities will be specified in the developer’s order form. Also clarified that unused API\n calls do not roll over to the next period.\n \n \n
\n
\n \n \n Added a license grant to developer's intellectual property rights for the limited purpose of\n SurveyMonkey's promotional activities.\n \n \n
\n
\n \n Clarified when a developer's App may appear in our integration directory.\n \n
\n
\n \n \n Mar 28, 2017 updates to Jan 10, 2017 version:\n \n \n
\n
\n Revise brand and trademark use guidelines.\n
\n
\n \n \n May 31, 2017 updates to March 28, 2017 version:\n \n \n
\n
\n \n Clarified SurveyMonkey may independently develop similar or competitive products or services.\n \n
\n
\n \n \n August 10, 2021 updates to May 31, 2017 version:\n \n \n
\n
\n \n Clarified that effective as of July 1, 2021, SurveyMonkey Inc. became Momentive Inc., SurveyMonkey\n Europe UC became Momentive Europe UC, and SurveyMonkey Brasil Internet Eireli became Momentive\n Brasil Internet Eireli.\n \n
\n
\n \n \n November 1, 2023 updates to August 10, 2021 version:\n \n \n
\n
\n \n Effective as of August 1, 2023, Momentive Inc. became SurveyMonkey Inc., Momentive Europe UC became\n SurveyMonkey Europe UC, and Momentive Brasil Internet Eireli became SurveyMonkey Brasil Internet\n Ltda.\n \n
\n
\n \n \n
\n \n
\n );\n};\n\nexport default TOU;\n","import React, { useContext, useEffect } from 'react';\nimport { IconFolderUser, IconChartSegment, IconEmail, IconCheckCircle } from '@sm/wds-icons';\n\nimport { Box } from '@wds/box';\nimport { Grid } from '@wds/grid';\nimport { List } from '@wds/list';\nimport { Typography } from '@wds/typography';\n\nimport { StaticContext } from '@sm/webassets';\n\nimport DeveloperWebBasePage from '../DeveloperWebBasePage';\n\nimport waitForUsabilla from '~app/helpers/waitForUsabilla';\n\nimport AppTable from '../../components/AppTable';\n\nimport './build-a-private-app.scss';\n\nconst renderAppChecklist = () => {\n return (\n \n \n \n Here's a sample guide for creating an end-to-end customer feedback app using the SurveyMonkey API:{' '}\n \n \n \n \n After authorizing into a SurveyMonkey account, the user chooses from a list of existing surveys, a\n SurveyMonkey template, or creates a new survey.{' '}\n \n \n \n \n If the survey results need to correspond to an existing object (e.g. product, customer, support case), the\n developer can automatically add a custom variable to the survey.{' '}\n \n \n \n \n An app can then grab a weblink and send a survey through either their own email tool, or use\n SurveyMonkey's email system.\n \n \n \n \n Response data is stored in SurveyMonkey, and automatically returned via the API to the partner in real time\n (using webhooks).\n \n \n \n );\n};\n\nconst renderAPIChecklist = () => {\n return (\n \n \n \n \n }\n >\n \n Use webhooks instead of polling. Besides providing added stability, webhooks reduce the\n number of calls needed to be made on the client side by only calling the API when there's new activity\n (rather than on a regular basis).\n \n \n \n \n \n }\n >\n \n Caching on the client side. We see lots of apps continually requesting details for the same\n resource from the API. If the resource isn't going to change, cache it, and use webhooks to signal a\n refresh, if available.\n \n \n \n \n \n }\n >\n \n Queue up your changes. Bundle incremental updates to resources together, if they don't\n need to be sent over immediately.\n \n \n \n \n \n }\n >\n \n Use the Bulk API endpoints. Where applicable and available (survey details, responses,\n recipients, contacts), try making bulk calls.\n \n \n \n );\n};\n\nconst BuildAPrivateApp = () => {\n const {\n environment: { subdomain },\n } = useContext(StaticContext);\n\n useEffect(() => {\n waitForUsabilla(() => {\n window.usabilla_live('show');\n });\n }, []);\n\n // For testing only, when this goes live to the devekoper subdomain this will not be required\n const prependUrl = subdomain !== 'developer' && subdomain !== 'developer.eu' ? '/developer' : '';\n\n return (\n
\n \n
\n \n \n \n \n Creating a Private App\n \n \n \n \n Apps built for private use can take many forms.\n \n Some examples may include:\n \n \n \n \n \n \n
\n \n
\n \n \n An organization purchases multiple seats for employees and creates an app for internal use\n \n \n \n \n
\n \n
\n \n \n A developer automates sending surveys and/or exporting survey data for an SM account or Team\n \n \n \n \n
\n \n
\n \n \n A team creates functionality to send thank you emails when their survey is completed\n \n \n \n \n \n\n \n \n \n Private apps have different guidelines than apps publicly available in the App Directory. Here are a\n few key differences:\n \n \n\n \n\n \n \n Think your app is better suited to be Public? Check out{' '}\n Creating a Public App.\n \n \n \n \n *Please see our API Developer Terms for more guidelines when building with our\n API.\n \n \n\n \n \n Building a Private App\n \n \n\n {renderAppChecklist()}\n\n \n \n Tips for reducing your API call usage\n \n \n\n {renderAPIChecklist()}\n \n \n
\n \n
\n );\n};\n\nexport default BuildAPrivateApp;\n","import React, { useContext, useEffect } from 'react';\nimport { IconLogoGoldie, IconLogoOutlook, IconListChecks, IconCheckCircle } from '@sm/wds-icons';\n\nimport { Box } from '@wds/box';\nimport { Grid } from '@wds/grid';\nimport { List } from '@wds/list';\nimport { Typography } from '@wds/typography';\n\nimport { StaticContext } from '@sm/webassets';\n\nimport DeveloperWebBasePage from '../DeveloperWebBasePage';\n\nimport waitForUsabilla from '~app/helpers/waitForUsabilla';\n\nimport AppTable from '../../components/AppTable';\n\nimport './build-a-public-app.scss';\n\nconst renderAppChecklist = () => {\n return (\n \n \n \n \n }\n >\n \n Your app should have unique value and be attracting new users regularly.{' '}\n \n \n \n \n \n }\n >\n \n Your app should NOT replicate functionality already offered by SurveyMonkey's survey tools.{' '}\n \n \n \n \n \n }\n >\n \n Your app's name should NOT be a generic term (i.e. "Analytics"), include versioning (i.e.\n "App V3.0"), and/or include the word "SurveyMonkey".{' '}\n \n \n \n \n \n }\n >\n \n Your app should have at least five OAuth sign ins in the first three months.{' '}\n \n \n \n \n \n }\n >\n \n You must state if users will need a free or paid account from your service to use your app.{' '}\n \n \n \n \n \n }\n >\n Your team must provide easily-accessible app support.\n \n \n \n \n }\n >\n \n All communication should be over HTTPS using a valid SSL certificate (we value security!)\n \n \n \n );\n};\n\nconst renderListingChecklist = () => {\n return (\n \n \n \n Listings help users gain a better understanding of your app's core functionality and scope requirements.\n Therefore, they should be written honestly and truthfully.{' '}\n \n \n \n \n Visit the listings tab in the My Apps view to create an app listing and submit it for approval.{' '}\n \n \n \n \n Your first app listing should be in English, but we encourage you to make additional app listings in other\n languages.{' '}\n \n \n \n );\n};\n\nconst BuildAPublicApp = () => {\n const {\n environment: { subdomain },\n } = useContext(StaticContext);\n\n useEffect(() => {\n waitForUsabilla(() => {\n window.usabilla_live('show');\n });\n }, []);\n\n const prependUrl = subdomain !== 'developer' && subdomain !== 'developer.eu' ? '/developer' : '';\n\n return (\n
\n \n
\n \n \n \n \n Creating a Public App\n \n \n \n \n Public apps can be listed on SurveyMonkey's App Directory after meeting certain criteria and\n receiving approval.\n \n Some examples may include:\n \n \n \n \n \n \n
\n \n
\n \n \n A service that offers complementary functionality to SurveyMonkey\n \n \n \n \n
\n \n
\n \n \n An integration of SurveyMonkey functionality into a pre-existing tool\n \n \n \n \n
\n \n
\n \n \n A popular app that extends SurveyMonkey's functionality\n \n \n \n \n \n\n \n \n \n Public apps have different guidelines than apps built for private use. Here are a few key differences:\n \n \n\n \n\n \n \n Think your app is better suited to be Private? Check out{' '}\n Creating a Private App.\n \n \n \n \n *Please see our API Developer Terms for more guidelines when building with our\n API.\n \n \n\n \n \n {' '}\n App Approval Checklist{' '}\n \n \n \n \n SurveyMonkey has strict standards for publishing public apps. Meet the criteria below and we'll\n help promote your app in our App Directory.\n \n \n\n \n \n Basic Requirements\n \n \n\n {renderAppChecklist()}\n\n \n \n Creating a Listing\n \n \n\n {renderListingChecklist()}\n\n \n NOTES:\n \n \n \n SurveyMonkey retains the right to reject an app based on criteria not listed above. Approval of your\n app by SurveyMonkey does not guarantee its compliance with the criteria above.\n \n \n \n \n
\n \n
\n );\n};\n\nexport default BuildAPublicApp;\n","import React, { useEffect, useContext } from 'react';\nimport { Route, withRouter, Switch } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { FourOhFourError, StaticContext } from '@sm/webassets';\n\nimport { HomePage, DocsPage, FAQPage, TOUPage, BuildAPrivateAppPage, BuildAPublicAppPage } from './pages';\n\nconst DeveloperWebRouter = ({ history }) => {\n const {\n environment: { domain },\n } = useContext(StaticContext);\n\n useEffect(() => {\n const unlisten = history.listen(() => {\n window.scrollTo(0, 0);\n });\n return () => {\n unlisten();\n };\n }, [history]);\n\n // Hide usabilla for all pages - each individual page will set usabilla configs and show if enabled\n // Note the load of usabilla hides the button so this code is included if usabilla has already been loaded\n if (typeof window !== 'undefined' && window && window.usabilla_live) {\n window.usabilla_live('virtualPageView');\n window.usabilla_live('hide');\n }\n\n return (\n \n \n \n \n \n \n \n \n\n {\n window.location.href = `https://www.${domain}.com/user/account`;\n return null;\n }}\n />\n {\n window.location.href = `https://www.${domain}.com/user/account/select?ep=https://developer.${domain}.com`;\n return null;\n }}\n />\n {\n window.location.href = `https://www.${domain}.com/team/libraries`;\n return null;\n }}\n />\n {\n window.location.href = `https://www.${domain}.com/addressbook`;\n return null;\n }}\n />\n {\n window.location.href = `https://www.${domain}.com/user/sign-out?ep=https://developer.${domain}.com`;\n return null;\n }}\n />\n\n \n \n );\n};\n\nDeveloperWebRouter.propTypes = {\n history: PropTypes.shape({\n listen: PropTypes.func.isRequired,\n }).isRequired,\n};\n\nexport default withRouter(DeveloperWebRouter);\n","import React, { useContext } from 'react';\nimport { Route, Switch, useLocation } from 'react-router-dom';\nimport { StaticContext } from '@sm/webassets';\nimport LinkBlocked from './pages/LinkBlocked';\nimport Pricing from './pages/Pricing';\nimport AppsDirectory from './pages/AppsDirectory';\nimport MRXSolutions from './pages/MRX/MRXSolutions';\nimport CreateWizard from './pages/CreateWizard';\nimport DeveloperWeb from './pages/DeveloperWeb';\n\nconst App = () => {\n const {\n environment: { subdomain },\n } = useContext(StaticContext);\n\n // From the developer subdomain prepend /developer to the path\n const location = useLocation();\n if (subdomain === 'developer' || subdomain === 'developer.eu') {\n if (!location.pathname.startsWith('/developer')) {\n location.pathname = `/developer${location.pathname}`;\n }\n }\n\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n","import 'core-js/stable';\nimport 'regenerator-runtime/runtime';\nimport { BrowserRouter } from 'react-router-dom';\nimport React from 'react';\nimport { render, hydrate } from 'react-dom';\nimport { ApolloProvider } from 'react-apollo';\nimport createBrowserApolloClient from '@sm/apollo-clients/dist/browser';\nimport { L10nProvider } from '@sm/intl';\nimport { WrenchTheme } from '@wds/styles';\nimport merge from 'lodash.merge';\n\nimport './entry.scss';\n\nimport { getClientEnvironmentDetails } from '@sm/utils';\nimport {\n ErrorBoundary,\n FiveHundredErrorPage,\n HelmetProvider,\n StaticProvider,\n GlobalThemeProvider,\n initializeClientErrorHandler,\n} from '@sm/webassets';\n\nimport getGraphQLFragmentMatcher from './helpers/fragmentMatcher';\n\nimport ContentWebApp from './App';\nimport { getPricingTheme } from './styles/theme';\n\nconst target = document.getElementById('reactApp');\n\nconst allClientStaticData = getClientEnvironmentDetails().isBrowser ? window.SM.__LOAD_PAYLOAD_CACHE__ || {} : {};\n\n/**\n * Our servers inject the payload with the `user` details and, rightfully so, leave out the authentication attribute.\n * Hence, the client/webs need to calculate whether the user is authenticated or not by looking at the userId in the webs.\n * Now, we don't want every app/page to do this; hence, we abstract the calculation out.\n * In addition, we do not want the attribute readily available in the `window` object; hence, we\n * calculate it here and directly add it to the context.\n * Yes, the user can still access it (debugging JS/React Dev Tools) but this way, it's not readily exposed.\n *\n * With this in place, the webs can retrieve the authentication status via the context.\n */\nallClientStaticData.user = allClientStaticData.user || {};\nallClientStaticData.user.isAuthenticated = allClientStaticData.user.id && allClientStaticData.user.id !== '1';\nconst {\n environment,\n pageRequestId,\n 'client-config': { appName, appVersion, graphQLUri },\n gql: { gqlCache = {} } = {},\n} = allClientStaticData;\n\n// Setup error handler to be available across the web\ninitializeClientErrorHandler();\n\nlet localeMessages = null;\n\nconst apolloClient = createBrowserApolloClient({\n uri: graphQLUri,\n cacheHydration: gqlCache,\n pageRequestId,\n fragmentMatcherFn: getGraphQLFragmentMatcher,\n linkOptions: {\n credentials: 'include',\n batchInterval: 30,\n },\n metadata: { appName, appVersion },\n availableLoggedOutPaths: [],\n});\n\n/**\n * Merge any user defined theme objects\n * See http://storybook.jungle.tech/wrench/?path=/story/intro-theming--page\n */\nconst globalTheme = merge({}, WrenchTheme, getPricingTheme());\n\nconst rendered = messages => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n);\n\n/**\n * For SSR apps we need to render the CSR version with messages. If we don't do that,\n * - SSR would send localized content\n * - CSR wouldn't have the messages; hence, it'd render `null`\n * - CSR would then fetch the messages via `ComponentDidMount`\n * - CSR would eventually show the same content\n *\n * Instead, let's fetch the messages before hand so that the initial CSR paint\n * is the same as the SSR paint.\n *\n * Note - This has no performance impact as L10NProvider was waiting for messages before\n * displaying anything anyways.\n */\nconst renderAppWithLocaleMessages = () => {\n return new Promise(resolve => {\n if (environment.slLanguageLocale === 'en-US') {\n resolve(localeMessages);\n } else {\n Promise.all([\n import(/* webpackChunkName: \"i18n/[request]\" */ `../locales/translated/${environment.slLanguageLocale}`),\n import(\n /* webpackChunkName: \"i18n/webassets/[request]\" */ `@sm/webassets/dist/locales/translated/${environment.slLanguageLocale}`\n ),\n ]).then(([appMessages, webassetsMessages]) => {\n resolve({\n ...appMessages,\n ...webassetsMessages,\n });\n });\n }\n });\n};\n\nrenderAppWithLocaleMessages()\n .then(messages => {\n localeMessages = messages;\n })\n .finally(() => {\n (target.innerHTML.trim().length ? hydrate : render)(rendered(localeMessages), document.getElementById('reactApp'));\n });\n","import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';\nimport introspectionQueryResultData from './fragmentTypes';\n\n/**\n * Get the GraphQL fragment matcher\n * @memberof module:@sm/utils\n * @returns {IntrospectionFragmentMatcher} IntrospectionFragmentMatcher\n */\nexport default function getGraphQLFragmentMatcher() {\n return new IntrospectionFragmentMatcher({\n introspectionQueryResultData,\n });\n}\n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"userDropDownQuery\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"linkedIdentities\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"totalCount\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":94}};\n doc.loc.source = {\"body\":\"query userDropDownQuery {\\n user {\\n id\\n linkedIdentities {\\n totalCount\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"userDropDownQuery\"] = oneQuery(doc, \"userDropDownQuery\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"categoriesQuery\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fetchAppCategories\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"key\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"parentId\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":143}};\n doc.loc.source = {\"body\":\"query categoriesQuery {\\n fetchAppCategories {\\n data {\\n id\\n title\\n description\\n key\\n parentId\\n }\\n }\\n}\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"categoriesQuery\"] = oneQuery(doc, \"categoriesQuery\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingCategories\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingCategories\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"key\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":155}};\n doc.loc.source = {\"body\":\"query publishedApplicationListingCategories($language: ID!) {\\n publishedApplicationListingCategories(language: $language) {\\n id\\n key\\n name\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"publishedApplicationListingCategories\"] = oneQuery(doc, \"publishedApplicationListingCategories\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"mutation\",\"name\":{\"kind\":\"Name\",\"value\":\"uninstallApp\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"UninstallAppInput\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"uninstallApp\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"input\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":100}};\n doc.loc.source = {\"body\":\"mutation uninstallApp($input: UninstallAppInput!) {\\n uninstallApp(input: $input) {\\n appId\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"uninstallApp\"] = oneQuery(doc, \"uninstallApp\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingsByKeyword\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"keyword\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingsByKeyword\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"keyword\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"keyword\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"detail\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":323}};\n doc.loc.source = {\"body\":\"query publishedApplicationListingsByKeyword($subdomain: String, $tld: String, $language: ID!, $keyword: String!) {\\n publishedApplicationListingsByKeyword(subdomain: $subdomain, tld: $tld, language: $language, keyword: $keyword) {\\n items {\\n id\\n name\\n logo\\n links {\\n detail\\n }\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"publishedApplicationListingsByKeyword\"] = oneQuery(doc, \"publishedApplicationListingsByKeyword\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"previewApplicationListingDetails\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"previewApplicationListingDetails\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fullDescription\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"installed\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publisher\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"featureList\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"googleAnalyticsTrackingId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"supportEmail\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"supportPhoneNumber\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"supportUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requirements\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"pricingUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"screenshots\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"privacyPolicyUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"termsOfUseUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"blogUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"youtubeUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"websiteUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"installUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"upgradeRequired\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"optionalUpgrade\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scopes\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"link\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"linkType\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":689}};\n doc.loc.source = {\"body\":\"query previewApplicationListingDetails($language: ID!, $appId: ID!) {\\n previewApplicationListingDetails(language: $language, appId: $appId) {\\n id\\n isIntegration\\n name\\n tagline\\n fullDescription\\n logo\\n installed\\n details {\\n publisher\\n featureList\\n googleAnalyticsTrackingId\\n supportEmail\\n supportPhoneNumber\\n supportUrl\\n requirements {\\n label\\n pricingUrl\\n type\\n description\\n }\\n screenshots\\n privacyPolicyUrl\\n termsOfUseUrl\\n blogUrl\\n youtubeUrl\\n websiteUrl\\n installUrl\\n upgradeRequired\\n optionalUpgrade\\n scopes\\n link\\n linkType\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"previewApplicationListingDetails\"] = oneQuery(doc, \"previewApplicationListingDetails\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingDetails\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingDetails\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"appId\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fullDescription\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"installed\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"details\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publisher\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"featureList\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"googleAnalyticsTrackingId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"supportEmail\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"supportPhoneNumber\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"supportUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"requirements\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"label\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"pricingUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"screenshots\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"privacyPolicyUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"termsOfUseUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"blogUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"youtubeUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"websiteUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"installUrl\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"upgradeRequired\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"optionalUpgrade\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"scopes\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"link\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"linkType\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":693}};\n doc.loc.source = {\"body\":\"query publishedApplicationListingDetails($language: ID!, $appId: ID!) {\\n publishedApplicationListingDetails(language: $language, appId: $appId) {\\n id\\n isIntegration\\n name\\n tagline\\n fullDescription\\n logo\\n installed\\n details {\\n publisher\\n featureList\\n googleAnalyticsTrackingId\\n supportEmail\\n supportPhoneNumber\\n supportUrl\\n requirements {\\n label\\n pricingUrl\\n type\\n description\\n }\\n screenshots\\n privacyPolicyUrl\\n termsOfUseUrl\\n blogUrl\\n youtubeUrl\\n websiteUrl\\n installUrl\\n upgradeRequired\\n optionalUpgrade\\n scopes\\n link\\n linkType\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"publishedApplicationListingDetails\"] = oneQuery(doc, \"publishedApplicationListingDetails\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"appsGridPublishedApplicationListings\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PublishedApplicationListingFilter\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListings\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"detail\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"categories\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":501}};\n doc.loc.source = {\"body\":\"query appsGridPublishedApplicationListings(\\n $subdomain: String\\n $tld: String\\n $language: ID!\\n $filter: PublishedApplicationListingFilter\\n $page: Int\\n $pageSize: Int\\n) {\\n publishedApplicationListings(\\n subdomain: $subdomain\\n tld: $tld\\n language: $language\\n filter: $filter\\n page: $page\\n pageSize: $pageSize\\n ) {\\n items {\\n id\\n name\\n logo\\n isIntegration\\n links {\\n detail\\n }\\n categories {\\n id\\n name\\n }\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"appsGridPublishedApplicationListings\"] = oneQuery(doc, \"appsGridPublishedApplicationListings\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"appsAppListings\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"1\"},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"defaultValue\":{\"kind\":\"IntValue\",\"value\":\"50\"},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categories\"}},\"type\":{\"kind\":\"ListType\",\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}}},\"defaultValue\":{\"kind\":\"ListValue\",\"values\":[]},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sortBy\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sortOrder\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"search\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"fetchPublishedApplicationListings\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"categories\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categories\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"search\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"search\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"sortBy\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sortBy\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"sortOrder\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"sortOrder\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"data\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"encryptedAppId\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"link\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"categories\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"perPage\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"total\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":471}};\n doc.loc.source = {\"body\":\"query appsAppListings(\\n $page: Int = 1\\n $pageSize: Int = 50\\n $categories: [String!] = []\\n $sortBy: String\\n $sortOrder: String\\n $search: String\\n) {\\n fetchPublishedApplicationListings(\\n page: $page\\n pageSize: $pageSize\\n categories: $categories\\n search: $search\\n sortBy: $sortBy\\n sortOrder: $sortOrder\\n ) {\\n data {\\n encryptedAppId\\n name\\n tagline\\n image\\n link\\n categories \\n }\\n perPage\\n page\\n total\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"appsAppListings\"] = oneQuery(doc, \"appsAppListings\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingCategory\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryKey\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingCategory\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryKey\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"categoryKey\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListings\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"detail\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListings\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"PublishedApplicationListingFilter\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"Int\"}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListings\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"filter\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"page\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"pageSize\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"detail\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":1020}};\n doc.loc.source = {\"body\":\"query publishedApplicationListingCategory(\\n $subdomain: String\\n $tld: String\\n $language: ID!\\n $categoryKey: ID!\\n $page: Int!\\n $pageSize: Int!\\n) {\\n publishedApplicationListingCategory(\\n subdomain: $subdomain\\n tld: $tld\\n language: $language\\n categoryKey: $categoryKey\\n ) {\\n id\\n name\\n publishedApplicationListings(subdomain: $subdomain, tld: $tld, page: $page, pageSize: $pageSize) {\\n items {\\n id\\n name\\n tagline\\n logo\\n isIntegration\\n links {\\n detail\\n }\\n }\\n }\\n }\\n}\\n\\nquery publishedApplicationListings(\\n $subdomain: String\\n $tld: String\\n $language: ID!\\n $filter: PublishedApplicationListingFilter!\\n $page: Int\\n $pageSize: Int\\n) {\\n publishedApplicationListings(\\n subdomain: $subdomain\\n tld: $tld\\n language: $language\\n filter: $filter\\n page: $page\\n pageSize: $pageSize\\n ) {\\n items {\\n id\\n name\\n tagline\\n logo\\n isIntegration\\n links {\\n detail\\n }\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"publishedApplicationListingCategory\"] = oneQuery(doc, \"publishedApplicationListingCategory\");\n \n module.exports[\"publishedApplicationListings\"] = oneQuery(doc, \"publishedApplicationListings\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"installedApplications\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"installedApplications\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"detail\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"launch\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"categories\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":285}};\n doc.loc.source = {\"body\":\"query installedApplications($language: ID!) {\\n installedApplications(language: $language) {\\n items {\\n id\\n isIntegration\\n name\\n tagline\\n logo\\n links {\\n detail\\n launch\\n }\\n categories {\\n id\\n name\\n }\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"installedApplications\"] = oneQuery(doc, \"installedApplications\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"searchPublishedApplicationListingsByKeyword\"},\"variableDefinitions\":[{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}},\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"ID\"}}},\"directives\":[]},{\"kind\":\"VariableDefinition\",\"variable\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"keyword\"}},\"type\":{\"kind\":\"NonNullType\",\"type\":{\"kind\":\"NamedType\",\"name\":{\"kind\":\"Name\",\"value\":\"String\"}}},\"directives\":[]}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"publishedApplicationListingsByKeyword\"},\"arguments\":[{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"subdomain\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"tld\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"language\"}}},{\"kind\":\"Argument\",\"name\":{\"kind\":\"Name\",\"value\":\"keyword\"},\"value\":{\"kind\":\"Variable\",\"name\":{\"kind\":\"Name\",\"value\":\"keyword\"}}}],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"name\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"logo\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isIntegration\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"detail\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":363}};\n doc.loc.source = {\"body\":\"query searchPublishedApplicationListingsByKeyword($subdomain: String, $tld: String, $language: ID!, $keyword: String!) {\\n publishedApplicationListingsByKeyword(subdomain: $subdomain, tld: $tld, language: $language, keyword: $keyword) {\\n items {\\n id\\n name\\n tagline\\n logo\\n isIntegration\\n links {\\n detail\\n }\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"searchPublishedApplicationListingsByKeyword\"] = oneQuery(doc, \"searchPublishedApplicationListingsByKeyword\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"developerAppListingsCount\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"developerApplications\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"totalCount\"},\"arguments\":[],\"directives\":[]}]}}]}}],\"loc\":{\"start\":0,\"end\":81}};\n doc.loc.source = {\"body\":\"query developerAppListingsCount {\\n developerApplications {\\n totalCount\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"developerAppListingsCount\"] = oneQuery(doc, \"developerAppListingsCount\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"modules\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"modules\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"items\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"title\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"tagline\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"description\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"image\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"type\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"subtype\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"price\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"cost\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"locale\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"currency\"},\"arguments\":[],\"directives\":[]}]}},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"links\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"marketingPage\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}]}},{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"preferences\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"hasPurchasedModule\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":338}};\n doc.loc.source = {\"body\":\"query modules {\\n modules {\\n items {\\n id\\n title\\n tagline\\n description\\n image\\n type\\n subtype\\n price {\\n cost\\n locale\\n currency\\n }\\n links {\\n marketingPage\\n }\\n }\\n }\\n}\\n\\nquery user {\\n user {\\n id\\n preferences {\\n hasPurchasedModule\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"modules\"] = oneQuery(doc, \"modules\");\n \n module.exports[\"user\"] = oneQuery(doc, \"user\");\n \n","\n var doc = {\"kind\":\"Document\",\"definitions\":[{\"kind\":\"OperationDefinition\",\"operation\":\"query\",\"name\":{\"kind\":\"Name\",\"value\":\"UserAccountInfo\"},\"variableDefinitions\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"user\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"id\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"email\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"firstName\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"lastName\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"features\"},\"arguments\":[],\"directives\":[],\"selectionSet\":{\"kind\":\"SelectionSet\",\"selections\":[{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"smsCollector\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isTableauEnabled\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isOfflineModeEnterpriseEnabled\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isResponseManagerEnabled\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isSalesForceEnabled\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isPowerBIEnabled\"},\"arguments\":[],\"directives\":[]},{\"kind\":\"Field\",\"name\":{\"kind\":\"Name\",\"value\":\"isHipaaEnabled\"},\"arguments\":[],\"directives\":[]}]}}]}}]}}],\"loc\":{\"start\":0,\"end\":285}};\n doc.loc.source = {\"body\":\"query UserAccountInfo {\\n user {\\n id\\n email\\n firstName\\n lastName\\n features { \\n smsCollector\\n isTableauEnabled\\n isOfflineModeEnterpriseEnabled\\n isResponseManagerEnabled\\n isSalesForceEnabled\\n isPowerBIEnabled\\n isHipaaEnabled\\n }\\n }\\n}\\n\",\"name\":\"GraphQL request\",\"locationOffset\":{\"line\":1,\"column\":1}};\n \n\n var names = {};\n function unique(defs) {\n return defs.filter(\n function(def) {\n if (def.kind !== 'FragmentDefinition') return true;\n var name = def.name.value\n if (names[name]) {\n return false;\n } else {\n names[name] = true;\n return true;\n }\n }\n )\n }\n \n\n // Collect any fragment/type references from a node, adding them to the refs Set\n function collectFragmentReferences(node, refs) {\n if (node.kind === \"FragmentSpread\") {\n refs.add(node.name.value);\n } else if (node.kind === \"VariableDefinition\") {\n var type = node.type;\n if (type.kind === \"NamedType\") {\n refs.add(type.name.value);\n }\n }\n\n if (node.selectionSet) {\n node.selectionSet.selections.forEach(function(selection) {\n collectFragmentReferences(selection, refs);\n });\n }\n\n if (node.variableDefinitions) {\n node.variableDefinitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n\n if (node.definitions) {\n node.definitions.forEach(function(def) {\n collectFragmentReferences(def, refs);\n });\n }\n }\n\n var definitionRefs = {};\n (function extractReferences() {\n doc.definitions.forEach(function(def) {\n if (def.name) {\n var refs = new Set();\n collectFragmentReferences(def, refs);\n definitionRefs[def.name.value] = refs;\n }\n });\n })();\n\n function findOperation(doc, name) {\n for (var i = 0; i < doc.definitions.length; i++) {\n var element = doc.definitions[i];\n if (element.name && element.name.value == name) {\n return element;\n }\n }\n }\n\n function oneQuery(doc, operationName) {\n // Copy the DocumentNode, but clear out the definitions\n var newDoc = {\n kind: doc.kind,\n definitions: [findOperation(doc, operationName)]\n };\n if (doc.hasOwnProperty(\"loc\")) {\n newDoc.loc = doc.loc;\n }\n\n // Now, for the operation we're running, find any fragments referenced by\n // it or the fragments it references\n var opRefs = definitionRefs[operationName] || new Set();\n var allRefs = new Set();\n var newRefs = new Set();\n\n // IE 11 doesn't support \"new Set(iterable)\", so we add the members of opRefs to newRefs one by one\n opRefs.forEach(function(refName) {\n newRefs.add(refName);\n });\n\n while (newRefs.size > 0) {\n var prevRefs = newRefs;\n newRefs = new Set();\n\n prevRefs.forEach(function(refName) {\n if (!allRefs.has(refName)) {\n allRefs.add(refName);\n var childRefs = definitionRefs[refName] || new Set();\n childRefs.forEach(function(childRef) {\n newRefs.add(childRef);\n });\n }\n });\n }\n\n allRefs.forEach(function(refName) {\n var op = findOperation(doc, refName);\n if (op) {\n newDoc.definitions.push(op);\n }\n });\n\n return newDoc;\n }\n \n module.exports = doc;\n \n module.exports[\"UserAccountInfo\"] = oneQuery(doc, \"UserAccountInfo\");\n \n","module.exports = jsdom;"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","t","keys","Object","module","exports","__schema","types","kind","name","possibleTypes","COPY","defineMessages","LINK_BLOCKED_MAIN_MESSAGE","defaultMessage","description","LINK_BLOCKED_PAGE_TITLE","LINK_BLOCKED_SIGN_UP_BLURB","LINK_BLOCKED_SIGN_UP","LINK_BLOCKED_HOME","LINK_BLOCKED_TERMS_OF_USE","LinkBlocked","React","BasePage","color","includeHeader","includeFooter","pageId","legacyWeb","Helmet","T","content","className","href","generateMetricsAttribute","data","actionType","actionFlow","LogoWithText","Typography","variant","desc","component","Button","displayName","win","window","undefined","payloadCache","_win$SM","SM","__LOAD_PAYLOAD_CACHE__","defaultContextValue","experiments","priceExperiment","hasAssignment","experimentName","treatmentName","featureExperiment","uiExperiment","PricingExperimentContext","createContext","PricingExperimentProvider","children","Provider","value","usePricingExperiments","useContext","initialPricingExperience","pricingExperience","PackageDataContext","PackageDataProvider","usePricingExperience","GROW2529_ACTIONS","PACKAGE_ACTIONS","_objectSpread","packageReducer","state","action","type","payload","ACTIONS","allPackages","displayPackages","packagesToDisplayState","packagesToDisplay","_state$displayPackage","replacementPackage","find","pkg","Number","replacedWith","newPackages","packageToBeReplaced","MAIN_HEADING","message","project","PROJECT_NAME","DETAILS_HEADING","EDUCATIONAL_HEADING","EDUCATIONAL_SUBHEADING","VIEW_PRICING","TEAM_PLANS","INDIVIDUAL_PLANS","ENTERPRISE","BACK_TO_SUMMARY","EXPAND_ALL","COLLAPSE_ALL","BASIC","STANDARD_MONTHLY","STANDARD_ANNUAL","STARTER_MONTHLY","STARTER_ANNUAL","ADVANTAGE_MONTHLY","ADVANTAGE_ANNUAL","PREMIER_MONTHLY","PREMIER_ANNUAL","TEAM_ADVANTAGE","TEAM_PREMIER","ENT_PLATINUM","FLEX","FORMS","PLAN_FEATURES","Sources","Packages","PackageIds","Basic","StandardMonthly","StandardAnnual","StarterMonthly","StarterAnnual","AdvantageMonthly","AdvantageAnnual","PremierMonthly","PremierAnnual","TeamAdvantage","TeamPremier","Enterprise","Flex","FormsMonthly","FormsAnnual","ComparePlanIds","LanguageCodes","SkuTypes","PackageDisplayNames","grow2529State","toggleChecked","Grow2529Reducer","newState","filter","push","packageState","combinedStates","packages","grow2529","PricingStateContext","dispatch","PricingStateProvider","_useCombinedReducers","useCombinedReducers","useReducer","_useCombinedReducers2","_slicedToArray","useMemo","usePricingState","HelmetWithChildren","_ref","rest","_objectWithoutProperties","_excluded","ORDER","languages","freeze","langCode","order","None","Last","de","ru","Skipped","es","First","pt","nl","fr","it","da","sv","ja","ko","zh","tr","no","fi","LINKS","lang","Seo","canonicalPath","_useContext","StaticContext","domain","environment","url","path","hrefLangs","getLinks","language","links","SeoHeadTags","HrefLangsTags","rel","key","hrefLang","pageTitle","pageDescription","pageKeywords","PackageType","PACKAGE_PRICE_TYPE","EXTERNAL_SCRIPTS","MONTHLY_PACKAGES","INDIVIDUAL_PACKAGES","INDIVIDUAL_PACKAGES_WITH_STARTER","INDIVIDUAL_PACKAGES_WITH_FORMS","INDIVIDUAL_PACKAGES_WITH_FORMS_REVERSED","INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL","INDIVIDUAL_PACKAGES_WITH_FORMS_PARTIAL_REVERSED","EDUCATIONAL_PACKAGES","TEAMS_PACKAGES","STRIPE_ELIGIBLE_PACKAGES","GUAC_COUNTRY_CODES","STARTER_ENABLED_COUNTRIES","USTerritoryCountryCodes","GBCountryCodes","COMPARISON_PACKAGES","ROUTE_PACKAGE_MAP","Individual","Teams","Educational","createUseStyles","Main","maxWidth","margin","Layout","useScript","urls","scriptElements","useRef","useEffect","current","existingScriptElement","document","querySelector","script","createElement","src","async","setAttribute","body","appendChild","_scriptElements$curre","forEach","scriptElement","removeChild","routerLocation","useLocation","useMainStyles","sticky","SEO","pathname","PAGE_NAME_MAP","pricing","UT_SOURCE_MAP","useTrackingDetails","_useLocation","search","utSource","URLSearchParams","get","pageName","replace","trim","pageUtSource","useStarterEnabled","_useState","useState","_useState2","isStarterEnabled","setIsStarterEnabled","_useContext$user","user","packageID","package","isAuthenticated","subscribedAt","billingCountry","convertedPackageID","parseInt","isQualifiedBasedOnAuthAndCountry","includes","isBrowser","AMPLITUDE_PAGE_EVENTS","pageView","selectedPlans","experimentEvent","AMPLITUDE_SELECTED_PACKAGE_MAP","getCookieValue","cname","cookieValue","decodedCookies","decodeURIComponent","cookie","split","c","cSub","startsWith","substring","length","generateCTAMetricsAttribute","packageId","packageName","_AMPLITUDE_SELECTED_P","USER_EVENTS","amplitudeEvent","selectedPackageId","selectedPackageName","toLowerCase","source","PRICINGWEB","EXPERIMENT_IDENTIFIERS","GROW_2197","treatment","ENTERPRISE_FEATURES_GP69","GROW_2529_FORMS","treatment1","treatment2","GROW_2629_FORMS_V2","GROW_2427","GROW_2763","getSkuCostByType","skuCosts","skuType","sku","getCoreCostFromSkus","CoreSeat","calculateSavingsPercent","skuCostOriginal","skuCostDiscounted","retVal","costDifference","cost","Math","floor","formatCostInSkuCurrency","skuCost","minimumFractionDigits","_skuCost$currency","FormattedNumber","formatStyle","currency","currencyDisplay","formatCostInLocaleCurrency","formatMonthlyCostInLocaleCurrency","monthlyCostInDollars","getDiscountedSkuCost","discountInfo","tempSkuCost","discountPercentage","convertFeatureSetToMap","featureSet","reduce","acc","feature","getPackageSetBasedOnPath","packageType","isForms","_ROUTE_PACKAGE_MAP$pa","getPackagesBasedOnQueryStringIds","NULL_PACKAGE","PackagesContext","userPackage","showEduDiscount","comparePlans","overageCost","getPackageById","PackagesProvider","_usePricingExperience","_usePricingState","_usePricingState$stat","packagesForExperience","setPackagesForExperience","_useState3","_useState4","packageIdToPackageMap","setPackageIdToPackageMap","updatedPackageMap","updatedPackages","_pkg$comparisonSkuCos","newPackage","comparisonSkuCost","useCallback","teamPremier","TEAM_PREMIER_ANNUAL","ResponseOverage","displayedPackages","hookApi","usePackages","withPageHandler","WrappedComponent","props","_useParams$canonicalP","useParams","_useTrackingDetails","logPricingPageLoad","setTimeout","MetricsTracker","upgradeTriggerSource","isROWStarterAnnualEnabled","error","Array","isArray","FiveHundredErrorPage","Boolean","SELECT","SIGN_UP","YOUR_PLAN","CONTACT_US","useCta","pricingPackage","_usePackages","isEnabled","setIsEnabled","isUserPackage","setIsUserPackage","_useState5","_useState6","ctaUrl","setCtaUrl","_useState7","_useState8","ctaLabel","setCtaLabel","isUpgradeable","details","tier","packageIsUserPackage","useStripeCheckout","isStripeEligible","newCtaUrl","utSource2","encryptedEduParam","encryptedCtaParam","SIZE_OPTIONS","convertToObject","a","v","default","sm","WrenchTheme","md","lg","xl","xs","none","lowerBPMediaQuery","size","overrideSize","DISPLAY_SIZE_OPTIONS","LG_MEDIA_QUERY","MD_MEDIA_QUERY","SM_MEDIA_QUERY","SM_MOBILE_MEDIA_QUERY","XS_MEDIA_QUERY","XL_MEDIA_QUERY","pricingPalette","packageTheme","spacing","CTAMargin","marginTop","CTA","extend","display","padding","borderRadius","flex","backgroundColor","_packageTheme$package","primary","border","_packageTheme$package2","noCTA","justifyContent","background","colors","black","PackageCta","isSummaryPage","_useStyles","useStyles","_useCta","disabled","PackageByline","byline","align","ALWAYS_FREE","PER_MONTH","PER_USER_PER_MONTH","BILLED_ANNUALLY","PER_MONTH_ANNUALLY","BR_BILLED_ANNUALLY","priceUnit","highlighted","PriceLabel","fontSize","fontWeight","medium","whiteSpace","textDecoration","light","stone","lineHeight","Price","marginRight","SwissPriceUnit","bodySm","packagePriceVariantMap","SUMMARY","DETAIL","COMPARISON","packagePriceComponentMap","PackagePrice","formattedPrice","packagePriceType","costUnit","_usePackagePriceStyle","usePackagePriceStyles","unitClass","endsWith","sabaeus","midnight","link","arctic","concord","raspberry","bengal","bumblebee","charcoal","slate","flint","pebble","canvas","white","navy","dijon","packageColors","advantageAnnual","advantageMonthly","basic","enterprise","premierAnnual","starterMonthly","premierMonthly","starterAnnual","standardMonthly","standardAnnual","teamAdvantage","forms","pricingElevation","zero","minusOne","plusOne","RibbonStyle","position","right","top","zIndex","overflow","width","height","left","borderTopLeftRadius","borderBottomRightRadius","bottom","textAlign","transform","boxShadow","Ribbon","useRibbonStyles","Header","marginBottom","minHeight","flexDirection","alignItems","BILLED_MONTHLY","TEAMS_BILLED_ANNUALLY","BR_TEAMS_BILLED_ANNUALLY","ENT_PLATINUM_BYLINE","usePriceDisplay","countryCode","isBasic","isBrazil","CountryCodes","isMonthlyPackage","isTeamsPackage","isGrow2529FormsMonthlyPackage","isGrow2529Forms","_useMemo","coreSeatSku","getCoreCostReplicaForBasicPackage","_packages$find","referencePackageSkuCost","packageData","additionalSeatSku","AdditionalSeat","_useMemo2","coreSeatCost","additionalSeatCost","discountedCoreSeatCost","discountedAdditionalSeatCost","monthlyFormattedCost","annualFormattedCost","monthlyFormattedDiscountedCost","annualFormattedDiscountedCost","annualTeamsFormattedCost","annualTeamsFormattedDiscountedCost","headerCost","headerDiscountedCost","headerUnit","headerByline","packageCopyKey","toUpperCase","copyKey","countryOverrideCopyKey","price","BEST_VALUE","SAVE_PERCENTAGE","PackageHeader","comparisonSkuCosts","usePackageHeaderStyles","comparisonPackageName","_usePriceDisplay","comparisonCoreSeatCost","comparisonFormattedPrice","comparisonFormattedMonthlyPrice","comparisonPackage","packageObj","comparisonSeatCost","savingsPercentage","getRibbon","_packageDefs$packageN","ribbonText","packageDefs","percentage","HIGHLIGHT","defaultColor","PricingPackageContainer","marginLeft","gridRow","PricingPackage","transition","Highlighted","paddingTop","PlanFeaturesLink","Highlight","Features","listStyle","FeatureItem","wordBreak","paddingRight","alignSelf","FeatureSummary","paddingLeft","TooltipContainer","elevation","Tooltip","space","textTransform","locale","TooltipArrow","TooltipLeft","TooltipRight","FeatureTooltip","tooltipHeading","tooltip","isLastPackage","slLanguageLocale","_useTooltipStyles","useTooltipStyles","Box","dangerouslySetInnerHTML","__html","sanitizeString","ADD_ATTR","contributor_seats","response_count","support","skip_logic","statistical_significance","grow_2529_create_limit","grow_2529_unlimited_questions","grow_2529_question_types","grow_2529_analysis_filter","FeatureSet","features","_useFeatureSetStyles","useFeatureSetStyles","isMobile","getClientEnvironmentDetails","handleFeatureHover","featureName","querySelectorAll","classList","add","handleFeatureLeave","remove","getUniqueFeatureName","uniqueFeature","uniqueFeatureNameMap","_uniqueFeatureNameMap","summary","onMouseEnter","bind","onMouseLeave","TYPE_LABEL","a_b_testing","account_control","add_users","admin_dashboard","advanced_analyze_features","advanced_collaboration","advanced_logic","all_data_exports","all_languages_supported","analyze_can_share_customize_branding","analyze_combine_filters","analyze_export_enabled","analyze_export_spss_enabled","analyze_integrations","analyze_results_together","sentiment","analyze_trends_enabled","asset_library","base_response_count","benchmarks","block_randomization","build_surveys_together","carry_forward","click_map_qt","collaborate","collect_contact_information","collector_completion_url_enabled","collector_mobile_sdk_enabled","collector_popup_enabled","collector_friendly_url_enabled","collector_white_label_enabled","consolidated_billing","create_advanced_features","create_custom_theme_enabled","create_custom_variables_enabled","create_piping_enabled","create_question_limit","create_toggle_footer_enabled","custom_templates","customer_success","download_as_ppt","email_support","enable_ip_blocking","enhanced_governance","essential_question_types","extended_piping","extract_data","file_upload","flexible_plan_types","footer_branding","gather_comments","hipaa_enabled","integrations","kiosk_mode_inactivity_timer","kiosk_mode_passcode_lock","matrix_question_type","multilingual","num_free_responses","pagination","password_protection","payment_qt","phone_support","benchmark_logic","pop_up_collector","premium_themes","priority_email_support","private_apps","progress_bar","question_library","quizzes_pro","randomize_answer_choices","ranking_question_type","rating_question_type","real_time_results","record_respondent_email_address","recurring_surveys","response_alerts","response_quality_enabled","send_surveys","set_max_response_count","set_survey_end_date","share_surveys","shared_assets","shared_library","show_create_crosstab","single_sign_on","slider_question_type","survey_branding","survey_create_limit","team_activity","team_logic","team_ownership","team_themes","text_analysis","text_formatting","track_email_responses","unlimited_questions","unlimited_responses","user_management","validate_answer","video_question_type","view_respondent_ip_address","RESPONSES_PER_YEAR","SHARED_LIBRARY","advanced_survey_features","analyze_can_customize_charts","analyze_can_export_hide_branding","analyze_can_ta_tag","analyze_dashboard_password_enabled","analyze_sentiment_enabled","analyze_ta_enabled","collaboration","collector_create_limit","collector_thank_you_enabled","create_custom_html_email_message_enabled","create_grayscale_footer","create_logo_enabled","create_print_enabled","create_quotas_enabled","create_randomization_enabled","create_skip_logic_enabled","create_templates_enabled","custom_question_bank","custom_subdomain","custom_terms_of_use","customize_disqualification_page_enabled","customer_success_manager","dashboard","global_settings","enterprise_only_integrations","labeling_titles_numbering","menu_matrix_enabled","mobile_apps_ios_android","mobile_sdk_pull_response_data_enabled","multiple_block_rotation_enabled","onboarding","plans_benchmarks","quiz_scoring_and_instant_results","require_answer","respondent_receipt","show_sig_diffs_enabled","web_social_email_responses","word_cloud_combine_hide","TYPE_HEADER","TYPE_PARAGRAPH","NUM_RESPONSES","NUM_RESPONSES_TOOLTIP","SUPPORT","SUPPORT_TOOLTIP","CONTRIBUTOR_SEATS","CONTRIBUTOR_SEATS_TOOLTIP","SENTIMENT_ANALYSIS","SENTIMENT_ANALYSIS_TOOLTIP","DATA_EXPORTS","DATA_EXPORTS_TOOLTIP","ADVANCED_LOGIC","ADVANCED_LOGIC_TOOLTIP","ADVANCED_SURVEY_LOGIC","ADVANCED_SURVEY_LOGIC_TOOLTIP","a_b_testing_tooltip_heading","a_b_testing_tooltip","account_control_tooltip_heading","account_control_tooltip","add_users_tooltip_heading","add_users_tooltip","admin_dashboard_tooltip_heading","admin_dashboard_tooltip","advanced_analyze_features_tooltip_heading","advanced_analyze_features_tooltip","advanced_collaboration_tooltip_heading","advanced_collaboration_tooltip","advanced_logic_tooltip_heading","advanced_logic_tooltip","all_data_exports_tooltip_heading","all_data_exports_tooltip","all_languages_supported_tooltip_heading","all_languages_supported_tooltip","analyze_can_share_customize_branding_tooltip_heading","analyze_can_share_customize_branding_tooltip","analyze_can_ta_tag_tooltip_heading","analyze_can_ta_tag_tooltip","analyze_combine_filters_tooltip_heading","analyze_combine_filters_tooltip","analyze_dashboard_password_enabled_tooltip_heading","analyze_dashboard_password_enabled_tooltip","analyze_export_enabled_tooltip_heading","analyze_export_enabled_tooltip","analyze_export_spss_enabled_tooltip_heading","analyze_export_spss_enabled_tooltip","analyze_integrations_tooltip_heading","analyze_integrations_tooltip","analyze_results_together_tooltip_heading","analyze_results_together_tooltip","analyze_sentiment_enabled_tooltip_heading","analyze_sentiment_enabled_tooltip","sentiment_tooltip_heading","sentiment_tooltip","analyze_ta_enabled_tooltip_heading","analyze_ta_enabled_tooltip","analyze_trends_enabled_tooltip_heading","analyze_trends_enabled_tooltip","base_response_count_tooltip_heading","base_response_count_tooltip","benchmarks_tooltip_heading","benchmarks_tooltip","block_randomization_tooltip_heading","block_randomization_tooltip","build_surveys_together_tooltip_heading","build_surveys_together_tooltip","carry_forward_tooltip_heading","carry_forward_tooltip","click_map_qt_tooltip_heading","click_map_qt_tooltip","collaboration_tooltip_heading","collaboration_tooltip","collaborate_tooltip_heading","collaborate_tooltip","collector_completion_url_enabled_tooltip_heading","collector_completion_url_enabled_tooltip","collector_create_limit_tooltip_heading","collector_create_limit_tooltip","collector_mobile_sdk_enabled_tooltip_heading","collector_mobile_sdk_enabled_tooltip","collector_friendly_url_enabled_tooltip_heading","collector_friendly_url_enabled_tooltip","collector_white_label_enabled_tooltip_heading","collector_white_label_enabled_tooltip","consolidated_billing_tooltip_heading","consolidated_billing_tooltip","contributor_seats_tooltip_heading","contributor_seats_tooltip","create_advanced_features_tooltip_heading","create_advanced_features_tooltip","create_custom_html_email_message_enabled_tooltip_heading","create_custom_html_email_message_enabled_tooltip","create_custom_theme_enabled_tooltip_heading","create_custom_theme_enabled_tooltip","create_custom_variables_enabled_tooltip_heading","create_custom_variables_enabled_tooltip","create_logo_enabled_tooltip_heading","create_logo_enabled_tooltip","create_piping_enabled_tooltip_heading","create_piping_enabled_tooltip","create_quotas_enabled_tooltip_heading","create_quotas_enabled_tooltip","create_randomization_enabled_tooltip_heading","create_randomization_enabled_tooltip","create_skip_logic_enabled_tooltip_heading","create_skip_logic_enabled_tooltip","create_templates_enabled_tooltip_heading","create_templates_enabled_tooltip","custom_question_bank_tooltip_heading","custom_question_bank_tooltip","custom_subdomain_tooltip_heading","custom_subdomain_tooltip","custom_templates_tooltip_heading","custom_templates_tooltip","customer_success_tooltip_heading","customer_success_tooltip","custom_terms_of_use_tooltip_heading","custom_terms_of_use_tooltip","customer_success_manager_tooltip_heading","customer_success_manager_tooltip","dashboard_tooltip_heading","dashboard_tooltip","email_support_tooltip_heading","email_support_tooltip","enhanced_governance_tooltip_heading","enhanced_governance_tooltip","essential_question_types_tooltip_heading","essential_question_types_tooltip","extended_piping_tooltip_heading","extended_piping_tooltip","extract_data_tooltip_heading","extract_data_tooltip","file_upload_tooltip_heading","file_upload_tooltip","flexible_plan_types_tooltip_heading","flexible_plan_types_tooltip","footer_branding_tooltip_heading","footer_branding_tooltip","gather_comments_tooltip_heading","gather_comments_tooltip","global_settings_tooltip_heading","global_settings_tooltip","hipaa_enabled_tooltip_heading","hipaa_enabled_tooltip","integrations_tooltip_heading","integrations_tooltip","enterprise_only_integrations_tooltip_heading","enterprise_only_integrations_tooltip","kiosk_mode_inactivity_timer_tooltip_heading","kiosk_mode_inactivity_timer_tooltip","kiosk_mode_passcode_lock_tooltip_heading","kiosk_mode_passcode_lock_tooltip","labeling_titles_numbering_tooltip_heading","labeling_titles_numbering_tooltip","menu_matrix_enabled_tooltip_heading","menu_matrix_enabled_tooltip","mobile_apps_ios_android_tooltip_heading","mobile_apps_ios_android_tooltip","mobile_sdk_pull_response_data_enabled_tooltip_heading","mobile_sdk_pull_response_data_enabled_tooltip","multilingual_tooltip_heading","multilingual_tooltip","multiple_block_rotation_enabled_tooltip_heading","multiple_block_rotation_enabled_tooltip","num_free_responses_tooltip_heading","num_free_responses_tooltip","payment_qt_tooltip_heading","payment_qt_tooltip","phone_support_tooltip_heading","phone_support_tooltip","benchmark_logic_tooltip_heading","benchmark_logic_tooltip","plans_benchmarks_tooltip_heading","plans_benchmarks_tooltip","premium_themes_tooltip_heading","premium_themes_tooltip","priority_email_support_tooltip_heading","priority_email_support_tooltip","private_apps_tooltip_heading","private_apps_tooltip","question_library_tooltip_heading","question_library_tooltip","quizzes_pro_tooltip_heading","quizzes_pro_tooltip","randomize_answer_choices_tooltip_heading","randomize_answer_choices_tooltip","record_respondent_email_address_tooltip_heading","record_respondent_email_address_tooltip","recurring_surveys_tooltip_heading","recurring_surveys_tooltip","respondent_receipt_tooltip_heading","respondent_receipt_tooltip","response_alerts_tooltip_heading","response_alerts_tooltip","response_quality_enabled_tooltip_heading","response_quality_enabled_tooltip","send_surveys_tooltip_heading","send_surveys_tooltip","share_surveys_tooltip_heading","share_surveys_tooltip","shared_assets_tooltip_heading","shared_assets_tooltip","shared_library_tooltip_heading","shared_library_tooltip","show_create_crosstab_tooltip_heading","show_create_crosstab_tooltip","show_sig_diffs_enabled_tooltip_heading","show_sig_diffs_enabled_tooltip","single_sign_on_tooltip_heading","single_sign_on_tooltip","skip_logic_tooltip_heading","skip_logic_tooltip","statistical_significance_tooltip_heading","statistical_significance_tooltip","survey_branding_tooltip_heading","survey_branding_tooltip","survey_create_limit_tooltip_heading","survey_create_limit_tooltip","team_activity_tooltip_heading","team_activity_tooltip","team_logic_tooltip_heading","team_logic_tooltip","team_ownership_tooltip_heading","team_ownership_tooltip","team_themes_tooltip_heading","team_themes_tooltip","text_analysis_tooltip_heading","text_analysis_tooltip","unlimited_questions_tooltip_heading","unlimited_questions_tooltip","unlimited_responses_tooltip_heading","unlimited_responses_tooltip","user_management_tooltip_heading","user_management_tooltip","validate_answer_tooltip_heading","validate_answer_tooltip","view_respondent_ip_address_tooltip_heading","view_respondent_ip_address_tooltip","word_cloud_combine_hide_tooltip_heading","word_cloud_combine_hide_tooltip","DESC_MESSAGE","grow_2529_forms_question_types","grow_2529_unlimited_forms","grow_2529_website_embed","grow_2529_zapier_integrations","grow_2529_file_upload","grow_2529_payment_qt","grow_2529_quizzes_pro","grow_2529_survey_create_limit","grow_2529_forms_analysis_filter","grow_2529_forms_unlimited_questions","grow_2529_survey_branding","grow_2529_data_exports","grow_2529_statistical_significance","grow_2529_multilingual","grow_2529_survey_quiz","grow_2529_unlimited_analysis_filters","grow_2529_forms_features","grow_2529_starter_features","grow_2529_advantage_features","grow_2529_premier_features","grow_2529_phone_support","grow_2529_analyze_sentiment_enabled","grow_2529_survey_branding_t2","grow_2529_analyze_export_spss_enabled_t2","grow_2529_skip_logic","grow_2529_collector_white_label_enabled","grow_2529_text_analysis","TYPE_DESCRIPTION","EXPERIMENT_DESCRIPTION","grow_2529_questions_per_form_survey","grow_2529_everything_in_forms_plus","grow_2529_everything_in_starter_plus","grow_2529_everything_in_advantage_plus","grow_2529_form_survey_capabilities","grow_2529_xls_csv","grow_2529_analyze_trends_enabled","grow_2529_best_value","grow_2529_extended_piping","grow_2529_recurring_surveys","grow_2529_standard_monthly","grow_2529_survey_builder","grow_2529_database_response_view","best_worst_qt","grow_2529_use_collectors","GROW_2529_EXPERIMENT_DETAILS_COPY","NUM_SURVEYS_FORMS","NUM_SURVEYS_FORMS_TOOLTIP","QUESTIONS_PER_SURVEY_FORMS","QUESTIONS_PER_SURVEY_FORMS_TOOLTIP","QUESTION_TYPES","QUESTION_TYPES_TOOLTIP","FILTER_COMPARE","grow_2529_unlimited_forms_tooltip_heading","grow_2529_unlimited_forms_tooltip","grow_2529_database_response_view_tooltip_heading","grow_2529_database_response_view_tooltip","grow_2529_question_types_tooltip_heading","grow_2529_question_types_tooltip","grow_2529_forms_question_types_tooltip_heading","grow_2529_forms_question_types_tooltip","grow_2529_website_embed_tooltip_heading","grow_2529_website_embed_tooltip","grow_2529_zapier_integrations_tooltip_heading","grow_2529_zapier_integrations_tooltip","grow_2529_analysis_filter_tooltip_heading","grow_2529_analysis_filter_tooltip","grow_2529_forms_analysis_filter_tooltip_heading","grow_2529_forms_analysis_filter_tooltip","grow_2529_survey_create_limit_tooltip_heading","grow_2529_survey_create_limit_tooltip","grow_2529_recurring_surveys_tooltip_heading","grow_2529_recurring_surveys_tooltip","grow_2529_unlimited_questions_tooltip_heading","grow_2529_unlimited_questions_tooltip","grow_2529_forms_unlimited_questions_tooltip_heading","grow_2529_forms_unlimited_questions_tooltip","grow_2529_survey_branding_tooltip_heading","grow_2529_survey_branding_tooltip","best_worst_qt_tooltip_heading","best_worst_qt_tooltip","grow_2529_multilingual_tooltip_heading","grow_2529_multilingual_tooltip","grow_2529_analyze_sentiment_enabled_tooltip","grow_2529_analyze_sentiment_enabled_tooltip_heading","grow_2529_phone_support_tooltip_heading","grow_2529_phone_support_tooltip","grow_2529_survey_branding_t2_tooltip_heading","grow_2529_survey_branding_t2_tooltip","grow_2529_statistical_significance_tooltip_heading","grow_2529_statistical_significance_tooltip","grow_2529_data_exports_tooltip_heading","grow_2529_data_exports_tooltip","grow_2529_analyze_export_spss_enabled_t2_tooltip_heading","grow_2529_analyze_export_spss_enabled_t2_tooltip","grow_2529_survey_quiz_tooltip_heading","grow_2529_survey_quiz_tooltip","grow_2529_unlimited_analysis_filters_tooltip_heading","grow_2529_unlimited_analysis_filters_tooltip","grow_2529_payment_qt_tooltip_heading","grow_2529_payment_qt_tooltip","grow_2529_file_upload_tooltip_heading","grow_2529_file_upload_tooltip","grow_2529_skip_logic_tooltip_heading","grow_2529_skip_logic_tooltip","grow_2529_text_analysis_tooltip_heading","grow_2529_text_analysis_tooltip","grow_2529_quizzes_pro_tooltip_heading","grow_2529_quizzes_pro_tooltip","grow_2529_collector_white_label_enabled_tooltip_heading","grow_2529_collector_white_label_enabled_tooltip","SUMMARY_MERGED_COPY","COMMON_TOOLTIP_COPY","SUMMARY_COPY","EXPERIMENT_SUMMARY_COPY","EXPERIMENT_TOOLTIP_COPY","DETAILS_MERGED_COPY","DETAILS_TOOLTIP_COPY","DETAILS_COPY","EXPERIMENT_DETAILS_COPY","createFeatureFormatter","COPY_MAP","formatValues","tooltipKey","String","tooltipHeadingKey","formatSummaryFeature","formatDetailsFeature","formsPackages","formsAndEnhanced","obj","setting","SETTING_UNLIMITED","_","dataCenter","everything_in","singleEnabledFeaturesRules","featureItem","nonConditionalFeatureRules","create_limit","amount","toLocaleString","funneling_enabled","share_with_your_organization","disable_footer_branding_enabled","hide_export_branding_enabled","group_templates","lite_library","shared_group_library","analyze_access_benchmarking","sa_en_ga","hasSentiment","allowedPackages","crosstabs","filter_crosstab","disAllowedPackages","ExperimentFeatureRules","featureItemKey","summaryFeaturesTransformer","featureList","featureListRules","packageFeatures","options","featureListItem","_SummaryFeatureMap$fi","SummaryFeatureMap","item","_featureItem$features","featureValues","featureKey","SummaryTransformer","constructor","_defaultIndividualList","DefaultIndividualsFeatureList","_featureRules","FeatureRules","_defaultTeamsList","TeamsFeatureList","instance","this","individualSummaryFeatureTransform","featureListConfig","_featureListConfig$li","includesDefaultList","list","featureRules","rules","teamsSummaryFeatureTransform","_featureListConfig$li2","PlanTransformers","initializeList","createFeatureList","super","_featureList","_this$_featureList$th","_this$featureList","DefaultIndividualFeatureList","FormsIndividualFeatureList","PremierAndAdvantageAnnualFeatureList","FormsOverrideRules","StarterRulesOverride","FormsDefaultIndividualFeatureList","FormsRulesOverride","AdvantageAnnualRulesOverride","PremierAnnuaRulesOverride","StarterMonthlyFeatureList","PremierAnnualOverrideRules","StandardMonthlyFeatureList","StandardMonthlyOverrideRules","StarterAnnualOverrideRules","FlexFeatureList","FlexFeatureOverrideRules","GROW2529FeatureListMapTreatment1","GROW2529FeatureListMapTreatment2","AdvantageAnnualFeatureList","TeamPremierFeatureList","EnterpriseFeatureList","summaryTransformer","getInstance","useSummaryDisplayFeatures","displayFeatures","setDisplayFeatures","_useContext$environme","hostname","experience","getDataCenterById","getDataCenterIdFromCurrentUrl","featureTransformer","getSummaryFeatureTransformer","transformerConfigObject","FeatureList","featureSetMap","usePackageFeatureSet","setFeatureSetMap","useFeatureSet","formattedOverageCost","featureSetData","regionCode","Package","_PackageDefs$packageN","_usePackageStyles","usePackageStyles","element","PackageDefs","Link","to","GROW_2427_TREATMENT","GROW_2529_FORMS_TREATMENT1","GROW_2529_FORMS_TREATMENT2","GROW_2629_FORMS_V2_TREATMENT","require","isOfflineModeEnterpriseEnabled","title","image","desiredProduct","programId","isResponseManagerEnabled","smsCollector","isTableauEnabled","isUnlimitedApiEnabled","isHipaaEnabled","isSalesForceEnabled","chimeTestimonial","logo","img","quottedPerson","company","pumaTestimonial","colgateTestimonial","conceptTesting","ctaLink","learnMoreLink","adTesting","brandTracking","BrandTrackingSvg","priceOptimization","maxDiff","boldText","theme","root","topBanner","innerWidth","bannerTitle","bannerBody","bannerButton","bannerCTA","linkIcon","sectionTitle","centerText","addOnCard","addOnContainer","addOnCardTitle","addOnCardButton","expertServicesPanel","lightTitle","lightBody","row","testimonialCard","chimeBox","pumaBox","colgateBox","testimonialBody","quoteBox","mrxCard","mrxCardInnerBox","mrxButton","mrxCardBody","modalContainer","modalTitle","fontFamily","base","modalButton","checkMark","inlineLink","MrxSection","flexJustify","target","Grid","my","px","MrxCard","solution","_useStyles2","flexAlign","alt","LinkIcon","CONTACT_US_TODAY","SURVEY_MONKEY_ENTERPRISE","LEARN_MORE","MANAGE_USERS","CONFIDENTIAL_DATA","FEEDBACK","INVALID_EMAIL","BLOCKED_EMAIL","INVALID_PHONE_NUMBER","REQUIRED","CONTACT_SALES","HUBSPOT_FORM_ERROR","ERROR","CONSENT","CONSENT_FOR_SUBMISSION","ValidationColor","HubspotApiStatus","FIELDS","email","phone","defaultType","ERROR_MAP","REQUIRED_FIELD","GENERIC_ERROR","PHONE_NUMBER_REGEX","RegExp","VALIDATOR_SUCCESS","success","minLengthValidator","FIELD_VALIDATORS","emailValidator","isValidEmail","phoneValidator","test","validateAndGetFormData","fieldType","validatorType","validator","applyValidators","validators","validatorResult","every","validate","errorMessage","HS_ERROR_STATUS","mapFieldAndValues","fields","formData","defaultValue","formDTO","saveFormData","dataOptions","autoSubmit","apiRoute","formFields","formValues","values","some","isFormValid","submitData","mapHubspotSubmissionData","_formData$consent","_formData$consent2","legalConsentOptions","consent","communications","text","subscriptionTypeId","consentToProcess","context","hutk","pageUri","location","response","fetch","method","JSON","stringify","headers","json","HUBSPOT_FORM_ID","mapHiddenField","hidden","mapHubSpotFormFields","hsData","form","mappedData","redirect","guid","portalId","temp","formFieldGroups","field","label","required","hideLabel","labelHidden","placeholder","flat","useHubSpotFormAPI","formId","status","Loading","setData","append","fetchHubSpotForm","catch","err","buildHubspotPayload","firstname","firstName","lastname","lastName","jobtitle","contact_country__c","cleanUpFormFields","editedFormFields","leadSource","hubspotProgram","NotifyInterestModal","toggleModal","showModal","Modal","show","onClose","ModalBody","onClick","ExpertServices","showThankYouModal","setShowThankYouModal","submitted","setSubmitted","expertServicesInterest","localStorage","getItem","toggleThankYouModal","open","autoFilledFormData","hubspotUrlRoute","_res$status","res","errors","clientErrorHandler","notifyInterest","setItem","IconCheck","TestimonialCard","testimonial","cssClass","cardColor","style","HubSpotErrorBanner","p","Banner","showIcon","HubspotInput","handleOnBlur","_formData$field$name","_formData$field$name2","_formData$field$name3","FormField","Input","stretched","onBlur","CheckBoxWrapper","gap","overflowX","SubscriptionLink","PrivacyLink","HubSpotForm","customOnSubmitFunction","setFormData","_useHubSpotFormAPI","useHubSpotStyles","handleChange","validatedData","handleConsentChecked","checked","handleFormSubmission","event","preventDefault","newFormData","submitErrors","redirectUri","assign","parseHubspotApiResponse","responseData","_responseData$status","_responseData$errors","errorType","match","fieldName","fs","Success","onSubmit","noValidate","FormGroup","Checkbox","defaultChecked","onChange","subLink","privacyNotice","buttonType","ProgressCircle","valueText","continuous","AddOnSection","AddOnCard","addOn","showHubspotModal","setShowHubspotModal","desiredProductInterestSent","EnterpriseFeatures","setUser","setFeatures","ssoInterestSent","urlPath","useQuery","UserAccountInfo","onCompleted","hookData","userResp","userFeatures","activeFeatures","keyValue","powerBIEnabled","SSOSVG","SocialProof","flexWrap","paddingBottom","borderBottom","objectFit","SocialProofLogos","Grow2427SocialProof","_grow2529Theme$packag","grow2529Theme","_grow2529Theme$packag2","Grow2529ExperimentPackages","Grow2529ExperimentPackagesPartial","PACKAGE_SWAP","FORMS_ANNUAL","swap","FORMS_MONTHLY","PRICING_DESCRIPTION","grow_2529_annual_billing","grow_2529_monthly_billing","GROW_2529_Switch","opacity","Values","cursor","Checked","ToggleSwitch","annualPackage","monthlyPackage","annualSkuCost","monthlySkuCost","isChecked","annualSavings","htmlFor","role","tabIndex","packageSwap","logAmplitudeEvent","eventName","userEvent","otherData","selectedPackage","billingToggleCopy","isEdu","GROW2529Ribbon","EduContext","PackagesSupported","borderRight","borderWidth","DetailsPackageHeader","index","_useDetailsPackageHea","useDetailsPackageHeaderStyles","gridArea","PRICING_DISCLAIMER","BUY_RESPONSES","ADVANCE_SURVEY","TARGET_PEOPLE","SURVEY_RESPONSES","PAID_FEATURES","DISPLAYED_PRICING","PER_ADDITIONAL_RESPONSE","ADD_ON_FEATURES","BASICS","GET_STARTED","ALL_FEATURES","MORE","SURVEYMONKEY_COST","SEE_PRICING","SPECIAL_PRICING_FOR_EDUCATORS_FAQ","SPECIAL_PRICING_FOR_EDUCATORS_ANSWER","DISCOUNTS_FOR_TEAMS_FAQ","DISCOUNTS_FOR_TEAMS_ANSWER","CORPORATE_PLANS_FAQ","CORPORATE_PLANS_ANSWER","BASIC_FREE","PLAN_PRICE","AUDIENCE_NUMBER_OF_SURVEYS","AUDIENCE_QUESTIONS_PER_SURVEY","AUDIENCE_UNLIMITED_RESPONSES","AUDIENCE_EMAIL_SUPPORT","AUDIENCE_CUSTOMIZATION","AUDIENCE_DATA_EXPORTS","AUDIENCE_SKIP_LOGIC","AUDIENCE_PIPING","AUDIENCE_FILE_UPLOAD","AUDIENCE_A_B_TESTING","AUDIENCE_HIDE_FOOTER","AUDIENCE_MULTILINGUAL","TEAMS_DISCOUNT_DISCLAIMER","Footer","Content","Audience","Accordion","AccordionContent","FAQHeading","pointerEvents","Answer","Spacer","Active","Inactive","Toggle","footerImg","backgroundSize","Feature","Disclaimers","Disclaimer","GetStarted","More","borderTop","PricingList","flexBasis","flexGrow","SeeAllLink","FAQ","heading","testid","isActive","setIsActive","_usePricingFooterStyl","usePricingFooterStyles","handleClick","onKeyUp","IconChevronUp","IconChevronDown","FAQAnswer","grow_2529_can_i_build","grow_2529_all_our_plans","MoreAbout","displayEduFaq","displayTeamsDiscountFAQ","teamsDiscountPercent","utSource3","formsAnnual","formsMonthly","formsAnnualCost","formsMonthlyCost","experimentCopy","monthlyCost","annualMonthlyCost","teamsMinimumDiscount","FeatureItemOverride","visibility","EverythingIn","_styleOverrides","styleOverrides","Treatments","EnterpriseFeaturesGp69","Grow2529FormsTreatment1","useTreatment","conditions","assignments","treatments","assignment","exp","activeTreatments","_activeTreatments$exp","LegaleseDisclaimer","TeamsDiscount","OverageCost","EnterpriseAddons","TeamsOfferExpiry","included","EnabledCheckMark","viewBox","xmlns","fill","fillRule","d","stroke","strokeLinecap","strokeLinejoin","strokeWidth","DisabledCheckMark","cx","cy","r","AudiencePlaceholder","PricingFeatures","audience","mb","audienceFeatures","EDU_COUNTRIES","HIDDEN_FAQ_PACKAGES","PricingFooter","_disclaimers","_useParams","subPath","_useTreatment$uiExper","filteredPackages","reverse","isPaidUser","discountPercent","minimumPercent","teamPackageName","newMinimumPercent","teamPricingPackage","comparisonPricingPackage","teamSku","comparisonSku","packagePercent","disclaimers","disclaimer","IconArrowRight","Heading","hero2","MainHeading","useHeadingStyles","teams","individual","Container","List","ListItem","NavItem","selected","usePricingNavigationStyles","Navigation","_useNavigationStyles","useNavigationStyles","navItems","ROUTE_CONFIG","routeName","_ROUTE_CONFIG","TITLE","createURL","ut_source","Summary","PackagesContainer","radius","BannerRow","BannerContainer","DotGrid","DiscountLargeText","fontStyle","sectionTitleSm","TryNowBox","ViewPlansButton","small","DISCOUNT_TEXT","VIEW_PLANS_BUTTON","DiscountBanner","html","PricingSummaryPage","_discountBannerTreatm","_useSummaryStyles","useSummaryStyles","GROW_2529_TREATMENT","discountBannerTreatments","useExperiment","treatmentNames","showDiscountBanner","billing_20014_teams_discount_treatment","getPackage","SummaryFooter","Back","BackToSummary","IconArrowLeft","AVAILABLE","UNAVAILABLE","BUSINESS_PLANS_LINK","IncludedLink","TYPE_TEXT","BASIC_COMPARE_FILTER","BASIC_NUM_RESPONSES","MANUAL","MANUAL_RULE","TEMPLATE_ENABLED_VALUE","BASIC_TEMPLATE_ENABLED_VALUE","UNLIMITED","getStringValue","settingCopy","CELL_COPY","_feature$setting","cellValue","tagValue","getBaseResponseCount","copy","ALL_BUT_BASIC","ADVANTAGE_AND_ABOVE","teamCollaborationRules","getTeamCollaborationValues","stringValueRules","enterpriseOnly","includeInAllPackages","includeInPackagesOnly","getTagValue","getCompareResults","getTemplatesEnabledValue","getCollectorCreateLimitValue","getCreateQuestionLimitValue","allExceptBasicFeatures","formsAndBasic","allExceptForms","experimentDetailsCopy","number","defaultRules","Details","GROW_2529_FEATURE_RULES","getFeatureValue","featureRulesObj","detailsFeatureRules","getFormattedAmountValue","determineCombinedFeature","_combinedFeatures$fin","combinedFeature","combinedFeatures","combined","_combinedFeature$feat","TEAM_COLLABORATION","TEAM_MANAGEMENT","ENTERPRISE_GRADE_SECURITY","SURVEY_CAPABILITIES","FAST_SUPPORT","SURVEY_BUILDER","CUSTOMIZATION_BRANDING","ANALYSIS_REPORTING","RESPONSE_MANAGEMENT","ENHANCED_SECURITY","PARTNER_INTEGRATIONS","category","EXPERIMENT_COPY","teamGroupings","individualGroupings","GROW_2529_INDIVIDUAL_GROUPINGS","palette","Bullet","Sticky","gridTemplateColumns","packageCount","gridTemplateAreas","getGridTemplateAreas","i","str","sky","Package1","Package2","Package3","Package4","Package5","Package6","Mobile","Desktop","AccordionControl","main","Cell","DetailRow","borderLeft","BulletInverse","composes","ExpandCollapse","TooltipIndicator","FeatureCell","_PackageDefs$pkg$pack","_PackageDefs$pkg$pack2","_usePricingExperiment","isInGrow2629Treatment","styles","useCategoryStyles","grow2529styles","useGrow2529CategoryStyles","stylesToUse","a11yValue","CaretDown","IconCaretDown","CaretUp","IconCaretUp","expandAll","collapseAll","Categories","_useCategoryStyles","currentPath","categories","_categoryGroupings$cu","groupings","categoryGroupings","getFeatureCategories","transformedPackages","fakeFeatures","experimentFeatures","_determineCombinedFea","categoryIndices","_category","initialState","initialLoad","isExpanded","indices","icon","toggleData","setToggleData","handleToggle","multiple","_expandedIndices","_id","isExpanding","NAME","expanded","featureRowCells","DetailsPackagesView","_useDetailsStyles","useDetailsStyles","ssrEnv","Responsive","defaultMatches","packageClassName","minWidth","isDesktop","Fragment","PricingDetailsPage","scrollTo","DetailsFooter","ContactList","listStyleType","ListHeading","TypographyBolded","HubSpotWrapper","ContactUs","_useEnterprisePageSty","useEnterprisePageStyles","EnterprisePage","isEnterpriseUser","isEnterprisePackage","pb","ViewPricingLink","EducationalDetailsPage","useEducationalStyles","viewPricingLinkText","isEduValue","PricingSummary","paths","PricingDetails","EducationalPage","PricingRoutes","redirectPath","Redirect","Route","PricingRouter","Switch","pages","page","exact","FourOhFourErrorPage","PricingPage","SEARCHBOX_PLACEHOLDER","mapItemsToAutocomplete","publishedApplicationListingsByKeyword","items","detail","SearchBox","Component","args","keyword","handleTermChanged","setState","handleItemSelected","handleSubmit","searchTerm","history","render","Query","query","publishedApplicationListingsByKeywordQuery","skip","variables","subdomain","tld","languageId","loading","Autocomplete","onTextChanged","onItemSelected","isLoading","hasError","renderItem","AppPlaceHolderImg","withRouter","contextType","JUMBO_TAGLINE","JUMBO_SUBTITLE","JumboHeader","_useContext$HEADER_EX","HEADER_EXP","_useContext$HEADER_EX3","isModernTreatment","shouldShowNewHeader","AppLink","_props$app","app","isIntegration","indexOf","AppsGrid","apps","noBleeds","Row","Col","userAgent","TabletScreen","SkeletonLoader","x","y","rx","ry","MobileScreen","FEATURED_APPS_TITLE","RECENTLY_ADDED_APPS_TITLE","MOST_RECENT_APPS_TITLE","GRID_APPS_SEE_MORE","AppsGridContainer","gridOption","_retrieveValuesForGri","option","moreLink","pageSize","retrieveValuesForGridOption","publishedApplicationListingsQuery","ErrorCard","AppsGridSkeleton","publishedApplicationListings","defaultProps","SidebarSkeleton","LinkWithSearch","staticContext","NAVBAR_APPS_DIRECTORY","NAVBAR_CATEGORIES","NAVBAR_MY_APPS","NAVBAR_FEATURED","NAVBAR_MOST_POPULAR","NAVBAR_RECENTLY_ADDED","SidebarLink","dataTestId","NavBar","publishedApplicationListingCategoriesQuery","AccordionItem","dense","transparent","publishedApplicationListingCategories","cat","TopBarSkeleton","DefaultLoader","MODULE_SKELETONS","top_bar","UCSModule","moduleHTML","renderLoadingState","_this$props","customLoader","moduleName","ModuleLoader","componentDidMount","_isMounted","getModuleHTML","componentWillUnmount","getPreloadedModule","moduleContainer","getElementById","textContent","reFetchFailed","reFetchModule","moduleContent","credentials","_this$state","classNames","classnames","BoundUCSModule","ErrorBoundary","getCanonicalUrlOrNoIndex","noIndex","canonicalUrl","substr","switchAccountsUrl","encodeURIComponent","NAV_MY_ACCOUNT","NAV_SWITCH_ACCOUNTS","NAV_HELP_CENTER","NAV_SIGN_OUT","NAV_SIGN_IN","NAV_SIGN_UP","AppDirNavHeaderDesktop","shouldDisplayNavItem","username","showSwitchAccounts","Logo","nav","Menu","autoClose","noRules","placement","menuTrigger","MenuItem","isNavigable","navigationTarget","urlWithSearch","AppDirNavHeaderMobile","authorizedMenuItems","IconLogoGoldie","IconMenu","MenuGroup","NAV_EXPLORE","NAV_MANAGE","NAV_DEVELOP","NAV_PARTNER","subdomainUri","altdomain","navigationItems","requiresAuthentication","AppDirNavHeader","userDropDownQuery","_data$user","_data$user$linkedIden","hasMultipleLinkedIdentities","linkedIdentities","totalCount","DesktopScreen","MobileTabletScreen","ModernHeader","languageCode","isEUDC","SMHeader","isUserAuthenticated","wrenchVariant","AppDirectoryBasePage","header","navbar","pageMetricsAttributes","_getCanonicalUrlOrNoI","isMarketing","referrer","networkName","fluid","waitForUsabilla","callback","count","waitForUsabillaLiveToLoad","usabilla_live","Home","AppListingList","tagline","categoryKey","params","publishedApplicationListingCategory","AppListingSkeleton","FourOhFourError","ListingsBasePage","PAGE_TITLE","Featured","MostPopular","RecentlyAdded","SEARCH_RESULTS","RESULTS_NOT_FOUND","FILL_IN_KEYWORD","Search","Card","REMOVE_DIALOG_HEADER","REMOVE_DIALOG_MESSAGE","REMOVE_DIALOG_CONFIRM","REMOVE_DIALOG_CANCEL","RemoveApp","appId","onSuccess","confirmDialogVisible","setConfirmDialogVisible","Mutation","mutation","uninstallAppMutation","input","uninstallApp","ModalHeader","ModalFooter","Align","NO_RESULTS_FOUND","LAUNCH_APP_LINK","APP_DETAILS_LINK","REMOVE_APP_LINK","renderCategories","join","MyApps","installedApplications","refetch","launch","IconDesktop","IconBadge","IconTrash","MediaCarousel","media","setCurrent","currentMedia","m","allowFullScreen","altText","mediaIdx","AppDetailsItem","linkLabel","APP_DETAILS_HEADER","REQUIRED_ACCESS_LABEL","REQUIRED_ACCOUNT_LABEL","INSTALLED_LABEL","INSTALL_LABEL","VISIT_SITE_LABEL","LAUNCH_LABEL","UPGRADE_LABEL","REMOVE_APP","AppDirectoryAppDetails","preview","selectedTab","setSelectedTab","pageTracked","setPageTracked","googleTracked","setGoogleTracked","_useContext2","_useContext2$environm","getLangFromUrl","urlParams","useSearchParams","getEventNameFromSource","getAppDetails","previewApplicationListingDetails","publishedApplicationListingDetails","_useQuery","appDetails","googleAnalyticsTrackingId","trackerName","ReactGA","appName","_useQuery$data","AppDirectoryAppDetailsSkeleton","installed","linkType","interactionType","interactionLocation","integrationOptionClicked","addCollectEventInfo","mdOrder","noRule","upgradeRequired","optionalUpgrade","IconTag","websiteUrl","publisher","supportEmail","IconEmail","supportPhoneNumber","IconLogoWhatsApp","supportUrl","IconGlobe","IconLock","privacyPolicyUrl","IconNews","termsOfUseUrl","blogUrl","IconMegaphone","concat","youtubeUrl","screenshots","s","Tabs","Tab","fullDescription","requirements","substitute","accountType","IconUserFilled","pricingUrl","scopes","scope","IconGear","headerContainer","headerSubtitle","ALPHABETICAL","FEATURED","POPULAR","RELEVANCE","ALL_SORT_BY_TYPES","SORT_BY_TYPES_PRE_SEARCH","SORT_BY_TYPES_POST_SEARCH","SORT_ORDER","DEFAULT_FILTERS","DEFAULT_SORTBY","DEFAULT_SORTORDER","SearchContext","filters","sortBy","sortOrder","pageNum","SearchProvider","setSearch","setFilters","setSortBy","setSortOrder","_useState9","_useState10","setPageNum","updateSearch","newSearch","updateFilter","updateSortBy","updatePageNum","resetSearch","hasSearchParams","SearchConsumer","Consumer","CategoriesContext","CategoriesProvider","setIsLoading","setCategories","categoriesQuery","isError","fetchAppCategories","FilterNav","isCategoriesLoading","_useContext$categorie","categoryTree","setCategoryTree","result","noParentCategories","parentId","ordinal","parent","parentWithChildren","sort","b","_a$title","localeCompare","aKey","bKey","buildCategoryTree","renderFilter","f","weight","FilterNavSkeleton","featured","AppListingContext","appListings","isInitialSearch","pageInfo","AppListingProvider","setAppListings","setInitialSearch","setPageInfo","paramsChanged","setParamsChanged","setVariables","_useLazyQuery","useLazyQuery","appsAppListings","_useLazyQuery2","getAppListings","_useLazyQuery2$","_data$fetchPublishedA","fetchPublishedApplicationListings","_data$fetchPublishedA2","listings","paging","_state$moreParams","moreParams","prevVariables","toString","flattenCategories","paramsWithoutSort","initialWithoutSort","nextPageNum","clearSearch","appCardLogo","AppCard","encryptedAppId","origin","appGrid","textRight","CategorySection","queryParams","sectionName","moreLinkLabel","lessLink","lessLinkLabel","showMore","setShowMore","placeItems","CategorySectionSkeleton","mt","MenuTrigger","mr","getLabelFromValue","AppListingSort","sortTypes","breakpoints","homeContainer","bodyContainer","tabletSearchBox","featuredApps","results","fullWidth","NoResultsCard","gridTemplateRows","alignContent","EmptySearchImg","Listings","featuredParams","setFeaturedParams","showAllFeatured","hideAllFeatured","noGutters","Pagination","total","rowsPerPage","perPage","onChangePage","newPage","container","leftColumn","LeftNavLayout","flexItemGrow","debouncedUpdateSearch","debounce","InputGroup","InputGroupAddon","IconSearch","HomeV2","renderHeader","setRenderHeader","v2","responsiveContainerPadding","appDetailsHeader","contentContainer","appDetailsHeaderLogo","maxHeight","appDetailsHeaderLogoImg","maxInlineSize","blockSize","textContainer","appDetailsTab","appDetailsMediaGallery","appDetailsMediaModalImg","appDetailsMediaModalYoutube","appDetailsYoutubeWrapper","appDetailsMediaModalYoutubeWrapper","appDetailsYoutubeFrame","appDetailsModalLeft","appDetailsModalMain","appDetailsModalRight","uninstallButton","ResponsiveImage","nextInArray","array","startIndex","step","_regeneratorRuntime","nextInArray$","_context","prev","next","stop","_marked","AppDetailsMedia","mediaFiles","mediaIndex","setShowModal","selectedMedia","setSelectedMedia","nextMediaGenerator","setNextImageGenerator","prevMediaGenerator","setPrevImageGenerator","closeButtonLabel","previousMedia","nextMedia","AppDetailsActionButton","UninstallButton","removeQueryParameters","urlObj","URL","stripHttp","AppDetails","refreshDetails","_getClientEnvironment2","buildAppDetailsMediaFilesList","mediaList","py","addOnLeft","DetailsPage","setAppDetails","newAppDetails","_newAppDetails$detail","onQueryComplete","APP_DIRECTORY_V2_EXPERIMENT","HomePageExperiment","_treatments$integrate","showV2","integrate_4500_app_dir_v2_enabled","HomePageV2","HomePage","AppDetailsExperiment","_treatments$integrate2","DetailsV2Page","AppPreviewExperiment","_treatments$integrate3","AppsDirectoryRouter","country","_useContext$clientCo","loggingAPIPath","amplitudeToken","unlisten","listen","ExperimentProvider","MyAppsPage","RecentlyAddedPage","MostPopularPage","FeaturedPage","SearchPage","CategoriesPage","PRODUCT_CATEGORY","AUDIENCE","EXPERT_SOLUTIONS","FILTER_KEY","CATEGORY","NAV_VARIANT","LIGHT","DARK","BROWSER","IE","UNKNOWN","useBrowser","MSInputMethodContext","documentMode","handler","onKeyPress","useLayoutEffect","getLinkWithParams","config","_config$queryParams","anchor","paramKey","buildEventData","trackEvent","LOGGER_NAME","SOLUTIONS","NAV","BI_MARKETPLACE_MODAL","ActionFlowLogger","registerActionKey","handlerName","logger","createLogger","removeSpaces","getLoggedModuleType","moduleType","getLinkGenerator","PropTypes","ut_source2","ut_source3","conf","utSource3sub","utCtaText","ut_ctatext","linkConfig","loggerName","moduleTitle","dest","moduleSubType","button","module_subtype","MENU","MORE_RESOURCES","listenerArgs","pageYOffset","addEventListener","removeEventListener","getLogger","marketResearchSolutions","homeLink","solutions","globalSurveyPanel","expertSolutions","services","moreResources","audienceTargeting","dataQuality","budgetingOptions","guidesAndCaseStudies","getADemo","getLink","menuItems","logging","linkPropType","productPropType","priority","products","isRequired","useCursor","cursorPos","clientX","clientY","isCursorOverElement","rect","getBoundingClientRect","isInBound","getLinkTestId","ExpandableMenu","isOpen","boundingElementId","getText","textClasses","getClickHandlers","interactive","TEST_ID","NavForDesktop","openMenu","setOpenMenu","scrolledToTop","setScrolledToTop","useIsomorphicLayoutEffect","addScrollListener","isAtTop","classes","mrxLogoLight","mrxLogoDark","buttonColor","buttonVariant","buttonClass","textVariant","MENU_CONFIG","NavForTablet","setIsOpen","useLight","chevronColor","scrollPosRef","isScrolledToTop","NavForIE","removeListener","removeScrollListener","DesktopNav","MobileNav","MRXNav","mobileOpen","setMobileOpen","_setOpenMenu","menu","MRXPage","previewImageHref","canonicalLink","requestUrl","mobileNavOpen","_setMobileNavOpen","scrollPosition","mPreviewImageHref","isMRX","property","setMobileNavOpen","previewImage","subtitle","MRXHeader","isIE","VECTOR","UP","DOWN","RIGHT","LEFT","getSwipeVectorFromPoints","start","end","vector","vectorDeg","convertToAbsoluteAngle","quadrant","isUpperHemisphere","isLeftHemisphere","getQuadrant","atan","PI","getDistanceBetweenPoints","trunc","sqrt","Carousel","currentOffset","setCurrentOffset","touchDownPosition","onTouchStart","touches","onTouchEnd","pos","changedTouches","hasSwipedLeft","touchStartPos","touchEndPos","hasSwipedRight","Children","child","idx","isFocused","myOffset","timeout","getOffsetTop","offsetParent","offsetTop","scrollToElement","clearTimeout","offset","focus","Anchor","hash","hashId","slice","ProductTile","ctaButton","outerClasses","ProductCategory","first","product","description1","description2","learnMore","getBodySection","HereToHelp","expertsImage","BREAK_POINT","MD","LG","XL","SCREEN","MOBILE","TABLET","MOBILE_TABLET","SMALL_DESKTOP","LARGE_DESKTOP","DESKTOP","CustomScreen","screen","matchMedia","matches","setMatches","doesMatch","propTypes","useBig","getImage","_getImage","imgName","UsedInOrgs","logos","setLogos","screenSize","setScreenSize","getLocalizedLogos","FILTERS","filterValues","prod","productCategory","filterProducts","filterParams","filterKey","SynchronousQueryStream","apolloClient","actions","client","resolveToContext","ctx","resolveQueryResultToContext","peek","startIdx","catchHandlers","range","collect","handled","j","catchHandler","audiencePanel","audiencePanelDescription","expertSolutionsDescription","getStarted","contactUs","tryItNow","surveyMonkeyAudience","surveyMonkeyAudienceDescription","biLogger","getAudienceCategory","ctaCopy","audienceImage","click","MRX","productCategories","searchParams","validFilterKeys","getFilterParamsFromUrlLocation","mProductCategories","orderedCategories","keyA","keyB","priorityA","priorityB","pcKey","FETCH_STATE","LOADING","IDLE","Wrapper","useIntercom","ctmProducts","fetchState","setFetchState","inner","pageLoad","modulesQuery","userQuery","modules","hasPurchasedModule","preferences","mapModules","subtype","marketingPage","FiveHundredError","withApollo","CreateWizardConfigContext","CreateWizardConfigContextProvider","createWizardConfig","defaultConfig","_setCreateWizardConfig","setCreateWizardConfig","newCreateWizardConfig","SINGLE_CHOICE","DROPDOWN","MULTIPLE_CHOICE","SINGLE_TEXTBOX","COMMENT_BOX","STAR_RATING","SLIDER","MULTI_CHOICE_QUESTIONS","NON_MULTI_CHOICE_QUESTIONS","DEFAULT_POLL_QUESTION_TYPES","ChoiceOptions","questionAnswersLength","moveAnswer","deleteAnswer","IconArrowUp","IconArrowDown","IconX","SurveyChoice","readOnlySurvey","questionId","answersLength","answerValue","handleAnswerChange","QuizChoice","answer","handleScoreChange","score","MultipleChoice","question","surveyType","updateQuestion","maxAnsChoices","currentQuestion","cloneDeep","answers","down","splice","val","addAnswer","IconPlusCircle","questionType","min","max","allowComments","isNew","isUpdated","defaultPollQuestionConfig","forTypes","maxOptions","customConfigs","hideRequired","defaultSurveyQuestionConfig","getQuestionConfigs","configs","questionArray","disabledQuestionTypes","questionConfigOverride","getDefaultQuestionConfig","enabledQuestionTypes","sendMessage","msg","postMessage","ACTION_TYPES","PREVIEW","READ_ONLY","NO_CHANGE","UPDATE","SAVE","CANCEL","BACK","isQuestionInvalid","validateQuestionType","validateMultipleChoiceQuestionType","validateSliderQuestionType","minmaxid","createNewQuestion","Date","getUTCMilliseconds","mapAnswersFromAPI","apiQuestion","family","choices","choice","quiz_options","mapQuestionTypeFromAPI","displayOptions","singleChoiceSubType","display_type","display_subtype","mapQuestionToAPI","isQuiz","originalQuestionFromApi","familySubType","mapQuestionTypeToAPI","headings","layout","handleRequired","updatedQuestion","mapAnswersToAPI","mappedAnwers","visible","rows","handleStarQuestionType","display_options","forced_ranking","handleSliderQuestionType","right_label","custom_options","starting_position","step_size","left_label","validation","sum_text","scoring_enabled","feedback","correct_text","incorrect_text","getInputConfig","survey","maxQuestions","maxQuestionsBasic","selectedType","showBadge","sendPayloadOnAllUpdates","hideCreateSurveyButton","hideCancelSurveyButton","NewSurvey","primaryCtaCopy","secondaryCtaCopy","redirectToEditorPage","redirectTo","showPrimaryCtaIcon","parentDomain","questionConfig","surveyTypeSelected","defaultInputConfig","MAX_QUESTIONS","inputData","surveyDetails","setSurveyDetails","questions","setQuestions","surveyTitle","setSurveyTitle","setSurveyType","_useState11","_useState12","shouldRedirectBackToHome","setShouldRedirectBackToHome","_useState13","_useState14","redirectUrl","setRedirectUrl","isNewSurvey","edit","_useState15","_useState16","questionsFromApiMap","setQuestionsFromApiMap","_useState17","questionConfigs","_useState19","_useState20","showUnsupportedAlert","setUnsupportedAlert","loadMappedQuestionsList","surveyData","questionsList","questionsFromAPIList","q","mapQuestionFromApi","question_id","initialPosition","unsupported","newMap","iconColor","buttonTextColor","secondaryButtonColor","secondaryButtonTextColor","badgeColor","badgeTextColor","containerBackgroundColor","_style$middleContaine","middleContainerBackgroundColor","inputBackgroundColor","inputBorderColor","inputBorderHoverColor","inputBorderFocusColor","inputLabelBackgroundColor","documentElement","setProperty","_useState21","_useState22","showToast","setShowToast","_useState23","_useState24","errorText","setErrorText","_useState25","_useState27","_useState28","questionsToDelete","setQuestionsToDelete","hasErrors","questionErrors","saveSurvey","overrideAction","dataToSend","questionsToSend","buildQuestionData","mappedQuestion","changeIds","errorClass","_question","questionsTemp","foundIndex","findIndex","errOutline","moveQuestion","from","showErrors","errObj","handleUpdate","questionFromApi","questionToDelete","determineActionType","removeItem","handleSave","handleCancel","isSubmitDisabled","primaryCtaIcon","ml","pl","Alert","Badge","Select","attributes","supportedSurveyType","Option","uuid","questionID","IconMore","questionsToDeleteList","filteredQuestions","deleteQuestion","handleQuestionTypeChange","tmpQuestion","getQuestionTypes","handleQuestionChange","IconStarFilled","handleMinChange","handleMaxChange","handleRequiredChange","addQuestion","questionTitles","getElementsByClassName","Toast","onCloseToast","dismissible","ToastTitle","IconPoll","version","x1","y1","x2","y2","IconSurvey","points","IconTemplate","IconQuiz","strokeMiterlimit","shouldRedirect","setShouldRedirect","showCreatePollCard","setShowCreatePollCard","showCreateSurveyCard","setShowCreateSurveyCard","showStartFromTemplateCard","setShowStartFromTemplateCard","showCreateQuizCard","setShowCreateQuizCard","customStylings","setCustomStylings","onMessageReceivedFromIframe","parse","Templates","templatesList","badgeTextTransform","handleBackToHome","template","handleTemplateSelect","DEFAULT_STYLES","DEFAULT_CREATE_WIZARD_CONFIG","CreateWizardRouter","updateCreateWizardConfig","newConfigs","NewSurveyPage","TemplatesPage","makeLinksStatic","linkHref","getAttribute","linkElement","targetSubdomain","DeveloperWebNavHeaderDesktop","class","DeveloperWebNavHeaderMobile","headerItem","DeveloperWebNavHeader","portedPages","headerPlaceholderSabeus","headerPlaceholderBlack","fixLinks","getElementsByTagName","headerLink","headerLinkHref","postRenderHeader","setPostRenderHeader","mobileButtons","mobileButton","fixSubdomainLinks","fixAccountLinks","tryAttachCount","attachAccountAction","setInterval","accountButton","clearInterval","DeveloperWebBasePage","footer","postRenderFooter","setPostRenderFooter","staticFooter","fixLanguagerDropdown","languageButton","languageMenuItems","targetUrl","setTargetUrl","developerEUSubdomain","developerSubdomain","prependUrl","prependStatic","developerApplications","_data$developerApplic","_data$developerApplic2","mx","Docs","frameRef","addEu","comOrCa","query_string","pushState","newurl","protocol","host","frameBorder","ref","AppTable","privateTable","planLabel","user_data","col1","col2","col3","firstCol","secondCol","Table","renderSection1","renderSection2","renderSection3","renderSection4","renderSection5","renderSection6","renderSection7","renderSection8","renderSection9","renderSection10","renderSection11","renderSection12","TOU","renderAppChecklist","renderAPIChecklist","IconCheckCircle","BuildAPrivateApp","IconFolderUser","IconChartSegment","renderListingChecklist","BuildAPublicApp","IconLogoOutlook","IconListChecks","DeveloperWebRouter","DocsPage","FAQPage","TOUPage","BuildAPrivateAppPage","BuildAPublicAppPage","App","Pricing","AppsDirectory","MRXSolutions","CreateWizard","DeveloperWeb","allClientStaticData","pageRequestId","_allClientStaticData$","appVersion","graphQLUri","_allClientStaticData$2","gql","_allClientStaticData$4","gqlCache","initializeClientErrorHandler","localeMessages","createBrowserApolloClient","uri","cacheHydration","fragmentMatcherFn","getGraphQLFragmentMatcher","IntrospectionFragmentMatcher","introspectionQueryResultData","linkOptions","batchInterval","metadata","availableLoggedOutPaths","globalTheme","merge","getPricingTheme","rendered","messages","GlobalThemeProvider","FallbackComponent","HelmetProvider","ApolloProvider","BrowserRouter","StaticProvider","L10nProvider","localeCode","ContentWebApp","all","appMessages","webassetsMessages","finally","innerHTML","hydrate","doc","loc","collectFragmentReferences","node","refs","selectionSet","selections","selection","variableDefinitions","def","definitions","definitionRefs","findOperation","extractReferences","Set","oneQuery","operationName","newDoc","hasOwnProperty","opRefs","allRefs","newRefs","refName","prevRefs","has","childRef","op","jsdom"],"sourceRoot":""}