{"version":3,"sources":["../src/utils/storage.ts","../src/analytics.ts"],"names":["CACHE_STORAGE_EVENTS","CACHE_STORAGE_PAGES","cacheEventToStorage","eventName","properties","existingCache","events","err","cachePageViewToStorage","pageName","pages","getCachedEvents","storedEventsString","getCachedPageViews","storedPagesString","clearCachedEvents","clearCachedPageViews","createAnalyticsInstance","_options","_debug","log","createLogger","_growthbook","_rudderstack","_posthog","core_data","tracking_config","offline_event_cache","_pending_identify_calls","_storage_cache_processed","processStorageCache","storedEvents","event","cleaned_properties","cleanObject","storedPages","page","getId","onSdkLoaded","userId","traits","initialise","growthbookKey","growthbookDecryptionKey","rudderstackKey","growthbookOptions","posthogOptions","debug","_a","_b","country","getCountry","RudderStack","attrs","anonymousId","isUUID","anonId","Growthbook","interval","getFeatureValue","Posthog","setAttributes","attributes","user_id","rest","user_identity","config","v","getFeatureState","id","defaultValue","getGrowthbookStatus","isFeatureOn","key","setUrl","href","AnalyticsInstance","stored_user_id","sanitizePII","t","email","safe","isInternalEmail","hasProviderStructure","rudderstackTraits","posthogTraits","rudderstack","posthog","sharedTraits","call","language","country_of_residence","analytics_data","final_payload","hasRudderstackInitialized","cache","cleaned_cache_payload","cleaned_payload","posthog_payload","flattenObject","current_page","platform","callback","Analytics"],"mappings":";AAAO,IAAMA,EAAuB,yBAAA,CACvBC,CAAAA,CAAsB,8BActBC,CAAAA,CAAsB,CAACC,EAAmBC,CAAAA,GAA8C,CACjG,GAAI,CACA,IAAMC,CAAAA,CAAgB,YAAA,CAAa,QAAQL,CAAoB,CAAA,CACzDM,EAAwBD,CAAAA,CAAgB,IAAA,CAAK,KAAA,CAAMA,CAAa,EAAI,EAAC,CAC3EC,EAAO,IAAA,CAAK,CAAE,KAAMH,CAAAA,CAAW,UAAA,CAAAC,CAAAA,CAAY,SAAA,CAAW,KAAK,GAAA,EAAM,CAAC,CAAA,CAClE,YAAA,CAAa,QAAQJ,CAAAA,CAAsB,IAAA,CAAK,SAAA,CAAUM,CAAM,CAAC,EACrE,CAAA,MAASC,EAAK,CACV,OAAA,CAAQ,KAAK,kCAAA,CAAoCA,CAAG,EACxD,CACJ,EAEaC,CAAAA,CAAyB,CAACC,EAAkBL,CAAAA,GAA+C,CACpG,GAAI,CACA,IAAMC,CAAAA,CAAgB,YAAA,CAAa,QAAQJ,CAAmB,CAAA,CACxDS,EAA0BL,CAAAA,CAAgB,IAAA,CAAK,MAAMA,CAAa,CAAA,CAAI,EAAC,CAC7EK,CAAAA,CAAM,KAAK,CAAE,IAAA,CAAMD,EAAU,UAAA,CAAAL,CAAAA,CAAY,UAAW,IAAA,CAAK,GAAA,EAAM,CAAC,EAChE,YAAA,CAAa,OAAA,CAAQH,EAAqB,IAAA,CAAK,SAAA,CAAUS,CAAK,CAAC,EACnE,CAAA,MAASH,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,uCAAwCA,CAAG,EAC5D,CACJ,CAAA,CAEaI,CAAAA,CAAkB,IAAqB,CAChD,GAAI,CACA,IAAMC,EAAqB,YAAA,CAAa,OAAA,CAAQZ,CAAoB,CAAA,CACpE,GAAIY,CAAAA,CAAoB,CACpB,IAAMN,CAAAA,CAAS,IAAA,CAAK,MAAMM,CAAkB,CAAA,CAC5C,OAAO,KAAA,CAAM,OAAA,CAAQN,CAAM,CAAA,CAAIA,EAAS,EAC5C,CACJ,CAAA,MAASC,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,wCAAA,CAA0CA,CAAG,EAC9D,CACA,OAAO,EACX,CAAA,CAEaM,EAAqB,IAAwB,CACtD,GAAI,CACA,IAAMC,CAAAA,CAAoB,YAAA,CAAa,QAAQb,CAAmB,CAAA,CAClE,GAAIa,CAAAA,CAAmB,CACnB,IAAMJ,CAAAA,CAAQ,IAAA,CAAK,MAAMI,CAAiB,CAAA,CAC1C,OAAO,KAAA,CAAM,OAAA,CAAQJ,CAAK,CAAA,CAAIA,CAAAA,CAAQ,EAC1C,CACJ,CAAA,MAASH,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,wCAAyCA,CAAG,EAC7D,CACA,OAAO,EACX,CAAA,CAEaQ,EAAoB,IAAY,CACzC,GAAI,CACA,YAAA,CAAa,UAAA,CAAWf,CAAoB,EAChD,CAAA,MAASO,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,2CAA4CA,CAAG,EAChE,CACJ,CAAA,CAEaS,EAAuB,IAAY,CAC5C,GAAI,CACA,YAAA,CAAa,WAAWf,CAAmB,EAC/C,CAAA,MAASM,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,+CAAgDA,CAAG,EACpE,CACJ,CAAA,CCCO,SAASU,CAAAA,CAAwBC,CAAAA,CAAoB,CACxD,IAAIC,CAAAA,CAA4B,KAAA,CAE1BC,EAAMC,CAAAA,CAAa,EAAA,CAAI,IAAMF,CAAM,EAErCG,CAAAA,CACAC,CAAAA,CACAC,EACAC,GAAAA,CAAiC,GACjCC,CAAAA,CAA8C,GAC9CC,CAAAA,CAA8E,GAC9EC,CAAAA,CAAmF,GACnFC,CAAAA,CAA2B,KAAA,CAEzBC,EAAsB,IAAM,CAC9B,GAAI,CAAAD,GACCN,CAAAA,EAAc,eAAA,CAEnB,CAAAM,CAAAA,CAA2B,IAAA,CAE3B,GAAI,CACA,IAAME,CAAAA,CAAepB,CAAAA,GACjBoB,CAAAA,CAAa,MAAA,CAAS,IACtBX,CAAAA,CAAI,CAAA,gCAAA,EAAmCW,EAAa,MAAM,CAAA,gBAAA,CAAA,CAAoBA,CAAY,CAAA,CAC1FA,EAAa,OAAA,CAAQC,CAAAA,EAAS,CAC1B,IAAMC,CAAAA,CAAqBC,IAAYF,CAAAA,CAAM,UAAU,CAAA,CACvDT,CAAAA,EAAc,MAAMS,CAAAA,CAAM,IAAA,CAAMC,CAAkB,EACtD,CAAC,EACDlB,CAAAA,EAAkB,CAAA,CAGtB,IAAMoB,CAAAA,CAActB,GAAmB,CACnCsB,CAAAA,CAAY,OAAS,CAAA,GACrBf,CAAAA,CAAI,mCAAmCe,CAAAA,CAAY,MAAM,CAAA,oBAAA,CAAA,CAAwBA,CAAW,EAC5FA,CAAAA,CAAY,OAAA,CAAQC,GAAQ,CACxBb,CAAAA,EAAc,SAASa,CAAAA,CAAK,IAAA,CAAM,WAAA,CAAaC,GAAAA,GAASD,CAAAA,CAAK,UAAU,EAC3E,CAAC,CAAA,CACDpB,GAAqB,EAE7B,CAAA,MAAST,EAAK,CACV,OAAA,CAAQ,KAAK,4CAAA,CAA8CA,CAAG,EAClE,CAAA,CACJ,CAAA,CAEM+B,EAAc,IAAM,CACtBlB,CAAAA,CAAI,sCAAsC,EAC1CU,CAAAA,EAAoB,CAEhBF,EAAwB,MAAA,CAAS,CAAA,EACjCR,EAAI,CAAA,uBAAA,EAA0BQ,CAAAA,CAAwB,MAAM,CAAA,yBAAA,CAA2B,EAE3FA,CAAAA,CAAwB,OAAA,CAAQ,CAAC,CAAE,MAAA,CAAAW,EAAQ,MAAA,CAAAC,CAAO,CAAA,GAAM,CAChDD,GACAhB,CAAAA,EAAc,aAAA,CAAcgB,EAAQC,CAAM,EAElD,CAAC,CAAA,CACDZ,CAAAA,CAA0B,GAC9B,EAiCMa,CAAAA,CAAa,MAAO,CACtB,aAAA,CAAAC,CAAAA,CACA,wBAAAC,CAAAA,CACA,cAAA,CAAAC,GAAAA,CACA,iBAAA,CAAAC,IACA,cAAA,CAAAC,CAAAA,CACA,MAAAC,GACJ,CAAA,GAAe,CA/KnB,IAAAC,CAAAA,CAAAC,CAAAA,CAgLYF,GAAAA,GAAU,SAAW5B,CAAAA,CAAS4B,GAAAA,CAAAA,CAElC3B,EAAI,gDAAA,CAAkD,CAClD,YAAa,CAAC,CAACwB,GAAAA,CACf,UAAA,CAAY,CAAC,CAACF,CAAAA,CACd,QAAS,CAAC,CAACI,CACf,CAAC,CAAA,CAED,GAAI,CAEA,IAAMI,EAAUL,GAAAA,EAAmB,UAAA,EAAY,UAAYH,CAAAA,CAAgB,MAAMS,GAAW,CAAI,KAAA,CAAA,CAAA,CAOhG,GALIP,GAAAA,GACAxB,EAAI,uCAAuC,CAAA,CAC3CG,EAAe6B,CAAAA,CAAY,sBAAA,CAAuBR,IAAgBN,CAAAA,CAAanB,CAAM,CAAA,CAAA,CAGrF0B,GAAAA,EAAmB,YAAc,MAAA,CAAO,IAAA,CAAKA,IAAkB,UAAU,CAAA,CAAE,OAAS,CAAA,CAAG,CACvF,IAAMQ,CAAAA,CAAQR,IAAkB,UAAA,CAC1BS,CAAAA,CAAc/B,GAAc,cAAA,EAAe,CAEjDE,IAAY,CACR,GAAGA,GAAAA,CACH,OAAA,CAAAyB,EACA,GAAIG,CAAAA,CAAM,eAAiB,CAAE,aAAA,CAAeA,EAAM,aAAc,CAAA,CAChE,GAAIA,CAAAA,CAAM,cAAgB,CAAE,YAAA,CAAcA,EAAM,YAAa,CAAA,CAC7D,GAAIA,CAAAA,CAAM,MAAA,EAAU,CAAE,MAAA,CAAQA,EAAM,MAAO,CAAA,CAC3C,GAAIA,CAAAA,CAAM,iBAAA,EAAqB,CAAE,iBAAA,CAAmBA,CAAAA,CAAM,iBAAkB,CAAA,CAC5E,GAAIA,CAAAA,CAAM,WAAA,EAAe,CAAE,WAAA,CAAaA,CAAAA,CAAM,WAAY,CAAA,CAC1D,GAAIA,EAAM,GAAA,EAAO,CAAE,IAAKA,CAAAA,CAAM,GAAI,EAClC,GAAIA,CAAAA,CAAM,YAAc,CAAE,UAAA,CAAYA,CAAAA,CAAM,UAAW,EACvD,GAAIA,CAAAA,CAAM,cAAgB,CAAE,YAAA,CAAcA,EAAM,YAAa,CAAA,CAC7D,GAAIA,CAAAA,CAAM,aAAe,CAAE,WAAA,CAAaA,EAAM,WAAY,CAAA,CAC1D,GAAIA,CAAAA,CAAM,gBAAA,EAAoB,CAAE,gBAAA,CAAkBA,EAAM,gBAAiB,CAAA,CACzE,GAAIA,CAAAA,CAAM,gBAAA,EAAoB,CAAE,gBAAA,CAAkBA,CAAAA,CAAM,gBAAiB,CAAA,CACzE,GAAIA,CAAAA,CAAM,YAAA,EAAgB,CAAE,YAAA,CAAcA,CAAAA,CAAM,YAAa,CAAA,CAC7D,QAAA,CAAU,CAAC,CAACA,EAAM,QAAA,CAClB,GAAIA,EAAM,OAAA,EAAW,CAACE,EAAOF,CAAAA,CAAM,OAAO,CAAA,EAAK,CAAE,QAASA,CAAAA,CAAM,OAAQ,EACxE,GAAIC,CAAAA,EAAe,CAAE,YAAA,CAAcA,CAAY,CACnD,EACJ,CAEAT,GAAAA,GAAAA,GAAAA,CAAsB,IACtBA,GAAAA,CAAkB,UAAA,GAAlBA,IAAkB,UAAA,CAAe,IACjC,IAAMW,CAAAA,CAASjC,GAAc,cAAA,EAAe,CAI5C,IAHAyB,CAAAA,CAAAH,GAAAA,CAAkB,YAAW,EAAA,GAA7BG,CAAAA,CAA6B,EAAA,CAAOQ,CAAAA,CAAAA,CAAAA,CACpCP,EAAAJ,GAAAA,CAAkB,UAAA,EAAW,UAA7BI,CAAAA,CAA6B,OAAA,CAAYC,GAErCR,CAAAA,CAAe,CACftB,CAAAA,CAAI,sCAAsC,EAE1C,GAAM,CAAE,WAAAqC,CAAW,CAAA,CAAI,MAAM,OAAO,kCAAwB,CAAA,CAC5DnC,CAAAA,CAAcmC,EAAW,qBAAA,CACrBf,CAAAA,CACAC,EACAE,GAAAA,CACA1B,CACJ,EACAC,CAAAA,CAAI,qCAAqC,CAAA,CAEzC,IAAMsC,EAAW,WAAA,CAAY,IAAM,CAC3B,MAAA,CAAO,IAAA,CAAKhC,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAG,aAAA,CAAcgC,CAAQ,CAAA,CAC9DhC,CAAAA,CAAkBiC,EAAgB,yBAAA,CAA2B,EAAE,EACxE,CAAA,CAAG,GAAI,EACX,CAEA,GAAIb,CAAAA,CAAgB,CAChB1B,CAAAA,CAAI,mCAAmC,EAEvC,GAAM,CAAE,OAAA,CAAAwC,CAAQ,EAAI,MAAM,OAAO,+BAAqB,CAAA,CACtDpC,CAAAA,CAAWoC,EAAQ,kBAAA,CAAmBd,CAAAA,CAAgB3B,CAAM,CAAA,CAC5DC,CAAAA,CAAI,kCAAkC,EAC1C,CAEAA,EAAI,gDAAgD,EACxD,OAASb,CAAAA,CAAK,CACV,OAAA,CAAQ,IAAA,CAAK,kCAAmCA,CAAG,EACvD,CACJ,CAAA,CAyBMsD,CAAAA,CAAiBC,GAAoC,CACvD1C,CAAAA,CAAI,qCAAA,CAAuC0C,CAAU,EAErD,GAAM,CAAE,QAAAC,CAAAA,CAAS,GAAGC,CAAK,CAAA,CAAIF,CAAAA,CACvBG,CAAAA,CAAgBF,CAAAA,EAAW1B,KAAM,CAEvC,GAAIf,EAAa,CACb,IAAM4C,EAAgC,CAAE,GAAGF,CAAK,CAAA,CAC5CD,GAAW,CAACR,CAAAA,CAAOQ,CAAO,CAAA,GAAGG,CAAAA,CAAO,QAAUH,CAAAA,CAAAA,CAC9CE,CAAAA,GACAC,CAAAA,CAAO,EAAA,CAAKD,EACZC,CAAAA,CAAO,OAAA,CAAUD,GAErB7C,CAAAA,CAAI,iDAAA,CAAmD8C,CAAM,CAAA,CAC7D5C,CAAAA,CAAY,aAAA,CAAc4C,CAAM,EACpC,CAEAzC,GAAAA,CAAY,CACR,GAAGA,GAAAA,CACH,GAAG,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQuC,CAAI,CAAA,CAAE,MAAA,CAAO,CAAC,EAAGG,CAAC,CAAA,GAAMA,CAAAA,GAAM,MAAS,CAAC,CAAA,CAC7E,GAAIJ,CAAAA,GAAY,MAAA,EAAa,CAACR,CAAAA,CAAOQ,CAAO,GAAK,CAAE,OAAA,CAAAA,CAAQ,CAC/D,EAEA3C,CAAAA,CAAI,mCAAA,CAAqCK,GAAS,EACtD,CAAA,CAEM2C,EAAmBC,CAAAA,EAAe/C,CAAAA,EAAa,eAAA,CAAgB+C,CAAE,GAAG,gBAAA,EAAkB,IAAA,CAEtFV,EAAkB,CACpBU,CAAAA,CACAC,IACChD,CAAAA,EAAa,eAAA,CAAgB+C,CAAAA,CAAcC,CAAY,EAEtDC,CAAAA,CAAsB,SAAY,MAAMjD,CAAAA,EAAa,SAAA,GACrDkD,CAAAA,CAAeC,CAAAA,EAAgBnD,CAAAA,EAAa,IAAA,CAAKmD,CAAG,CAAA,CACpDC,CAAAA,CAAUC,GAAiBrD,CAAAA,EAAa,MAAA,CAAOqD,CAAI,CAAA,CAEnDtC,GAAAA,CAAQ,IAAM,CAChB,IAAME,CAAAA,CAAShB,CAAAA,EAAc,WAAU,EAAK,EAAA,CAC5C,OAAOgB,CAAAA,EAAU,CAACgB,CAAAA,CAAOhB,CAAM,EAAIA,CAAAA,CAAS,EAChD,EA8RMqC,CAAAA,CAAoB,CACtB,WAAAnC,CAAAA,CACA,aAAA,CAAAoB,CAAAA,CACA,aAAA,CA5NkB,CAACE,CAAAA,CAAkBvB,CAAAA,GAAiC,CACtE,IAAMqC,CAAAA,CAAiBd,GAAW1B,GAAAA,EAAM,CACxC,GAAI,CAACwC,CAAAA,CAAgB,CACjBzD,CAAAA,CAAI,qDAAgD,EACpD,MACJ,CAEAA,EAAI,wBAAA,CAA0B,CAAE,OAAA,CAASyD,CAAAA,CAAgB,OAAArC,CAAO,CAAC,EAGjE,IAAMsC,CAAAA,CAAeC,GAA4B,CAC7C,GAAI,CAACA,CAAAA,CAAG,OAAOA,CAAAA,CACf,GAAM,CAAE,KAAA,CAAAC,CAAAA,CAAO,GAAGC,CAAK,CAAA,CAAIF,CAAAA,CAC3B,OAAO,CAAE,GAAGE,CAAAA,CAAM,GAAID,CAAAA,EAAS,CAAE,YAAaE,CAAAA,CAAgBF,CAAK,CAAE,CAAG,CAC5E,CAAA,CAGMG,GAAAA,CAAuB3C,GAAQ,WAAA,GAAgB,MAAA,EAAaA,GAAQ,OAAA,GAAY,MAAA,CAClF4C,CAAAA,CAAmBC,CAAAA,CACvB,GAAIF,GAAAA,CAAsB,CAEtB,GAAM,CAAE,WAAA,CAAAG,EAAa,OAAA,CAAAC,CAAAA,CAAS,GAAGC,CAAa,EAAIhD,CAAAA,CAClD4C,CAAAA,CAAoBN,EAAY,CAAE,GAAGU,EAAc,GAAGF,CAAY,CAAC,CAAA,CACnED,EAAgBP,CAAAA,CAAY,CAAE,GAAGU,CAAAA,CAAc,GAAGD,CAAQ,CAAC,EAC/D,MACIH,CAAAA,CAAoBN,CAAAA,CAAYtC,CAAM,CAAA,CACtC6C,CAAAA,CAAgBP,EAAYtC,CAAM,CAAA,CAIlCjB,IACIA,CAAAA,CAAa,eAAA,EACbH,CAAAA,CAAI,8CAAA,CAAgD,CAChD,OAAA,CAASyD,CAAAA,CACT,OAAQO,CACZ,CAAC,EACD7D,CAAAA,CAAa,aAAA,CAAcsD,CAAAA,CAAgBO,CAAiB,GAEvDxD,CAAAA,CAAwB,IAAA,CAAK6D,GAAQA,CAAAA,CAAK,MAAA,GAAWZ,CAAc,CAAA,GACpEzD,CAAAA,CAAI,0EAAA,CAAuE,CACvE,QAASyD,CACb,CAAC,EACDjD,CAAAA,CAAwB,IAAA,CAAK,CAAE,MAAA,CAAQiD,CAAAA,CAAgB,MAAA,CAAQO,CAAkB,CAAC,CAAA,CAAA,CAAA,CAM1F5D,CAAAA,EAAU,kBACVJ,CAAAA,CAAI,0CAAA,CAA4C,CAAE,OAAA,CAASyD,CAAAA,CAAgB,MAAA,CAAQQ,CAAc,CAAC,CAAA,CAClG7D,CAAAA,CAAS,cAAcqD,CAAAA,CAAgBQ,CAAuC,GAEtF,CAAA,CAyKI,wBAAA,CArE6B,CAAC,CAC9B,QAAAtB,CAAAA,CACA,KAAA,CAAAiB,EACA,QAAA,CAAAU,CAAAA,CACA,qBAAAC,CACJ,CAAA,GAKY,CACRvE,CAAAA,CAAI,oCAAqC,CAAE,OAAA,CAAA2C,CAAQ,CAAC,CAAA,CAChDvC,GAAU,eAAA,EACVJ,CAAAA,CAAI,sEAAuE,CAAE,OAAA,CAAA2C,CAAQ,CAAC,CAAA,CACtFvC,EAAS,wBAAA,CAAyB,CAAE,QAAAuC,CAAAA,CAAS,KAAA,CAAAiB,CAAAA,CAAO,QAAA,CAAAU,EAAU,oBAAA,CAAAC,CAAqB,CAAC,CAAA,EAEpFvE,CAAAA,CAAI,mEAA8D,EAE1E,CAAA,CAoDI,eAAA,CAAAgD,CAAAA,CACA,gBAAAT,CAAAA,CACA,mBAAA,CAAAY,EACA,WAAA,CAAAC,CAAAA,CACA,OAAAE,CAAAA,CACA,KAAA,CAAArC,GAAAA,CACA,cAAA,CAvSmB,IAAMd,CAAAA,EAAc,cAAA,IAAoB,EAAA,CAwS3D,UAAA,CArJe,CAACS,CAAAA,CAAe4D,CAAAA,GAAwC,CACvE,IAAMrD,EAASF,GAAAA,EAAM,CAErBjB,EAAI,qBAAA,CAAuB,CAAE,MAAAY,CAAAA,CAAO,cAAA,CAAA4D,CAAAA,CAAgB,MAAA,CAAArD,EAAQ,SAAA,CAAAd,GAAU,CAAC,CAAA,CAEvE,IAAMoE,EAAgB,CAClB,GAAGpE,GAAAA,CACH,GAAGmE,EACH,GAAIrD,CAAAA,EAAU,CAACd,GAAAA,CAAU,OAAA,EAAW,CAAE,OAAA,CAASc,CAAO,CAC1D,CAAA,CAKA,GAHAnB,CAAAA,CAAI,4BAAA,CAA8B,CAAE,KAAA,CAAAY,CAAAA,CAAO,cAAA6D,CAAc,CAAC,EAGtD,EADgB,EAAE7D,KAASN,CAAAA,CAAAA,EAAoBA,CAAAA,CAAgBM,CAAe,CAAA,CAAA,CAChE,CACdZ,EAAI,+DAAA,CAA4D,CAAE,KAAA,CAAAY,CAAM,CAAC,CAAA,CACzE,MACJ,CAGA,IAAM8D,CAAAA,CAA4BvE,GAAc,eAAA,CAChD,GAAI,CAAC,SAAA,CAAU,QAAU,CAACuE,CAAAA,CACjBA,GAID1E,CAAAA,CAAI,qDAAA,CAAkD,CAAE,KAAA,CAAAY,CAAM,CAAC,CAAA,CAC/DL,EAAoB,IAAA,CAAK,CAAE,MAAAK,CAAAA,CAAO,OAAA,CAAS6D,CAAc,CAAC,CAAA,GAJ1DzE,CAAAA,CAAI,+EAAA,CAA4E,CAAE,KAAA,CAAAY,CAAM,CAAC,CAAA,CACzF9B,CAAAA,CAAoB8B,EAAiB6D,CAAa,CAAA,CAAA,CAAA,KAKnD,CAEClE,CAAAA,CAAoB,OAAS,CAAA,GAC7BP,CAAAA,CAAI,yBAAyBO,CAAAA,CAAoB,MAAM,yCAAyC,CAAA,CAChGA,CAAAA,CAAoB,OAAA,CAAQoE,CAAAA,EAAS,CACjC,IAAMC,CAAAA,CAAwB9D,IAAY6D,CAAAA,CAAM,OAAO,EACvDxE,CAAAA,EAAc,KAAA,CAAMwE,CAAAA,CAAM,KAAA,CAAOC,CAAqB,EAC1D,CAAC,EACDrE,CAAAA,CAAsB,IAI1B,IAAMsE,CAAAA,CAAkB/D,IAAY2D,CAAa,CAAA,CACjDzE,EAAI,2CAAA,CAA6C,CAAE,MAAAY,CAAAA,CAAO,OAAA,CAASiE,CAAgB,CAAC,CAAA,CACpF1E,CAAAA,EAAc,KAAA,CAAMS,EAAOiE,CAAe,EAC9C,CAGA,GAAIzE,CAAAA,EAAU,gBAAiB,CAC3B,IAAM0E,CAAAA,CAAkBhE,GAAAA,CAAYiE,EAAcN,CAAa,CAAC,EAChEzE,CAAAA,CAAI,uCAAA,CAAyC,CAAE,KAAA,CAAAY,CAAAA,CAAO,OAAA,CAASkE,CAAgB,CAAC,CAAA,CAChF1E,CAAAA,CAAS,QAAQQ,CAAAA,CAAiBkE,CAAe,EACrD,CACJ,CAAA,CAkGI,YAAA,CA1DiB,KAAO,CAAE,EAAA,CAAI5E,CAAAA,CAAa,SAAUC,CAAAA,CAAc,OAAA,CAASC,CAAS,CAAA,CAAA,CA2DrF,QAAA,CAvRa,CAAC4E,CAAAA,CAAsBC,EAAW,WAAA,CAAajG,CAAAA,GAAyC,CACrG,IAAMmC,CAAAA,CAASF,KAAM,CAErBjB,CAAAA,CAAI,mBAAA,CAAqB,CAAE,aAAAgF,CAAAA,CAAc,QAAA,CAAAC,EAAU,UAAA,CAAAjG,CAAAA,CAAY,OAAAmC,CAAO,CAAC,CAAA,CAGnEhB,CAAAA,EAAc,iBACdH,CAAAA,CAAI,6CAAA,CAA+C,CAAE,YAAA,CAAAgF,CAAAA,CAAc,SAAAC,CAAS,CAAC,EAC7E9E,CAAAA,CAAa,QAAA,CAAS6E,EAAcC,CAAAA,CAAU9D,CAAAA,CAAQnC,CAAU,CAAA,GAEhEgB,CAAAA,CAAI,kFAA8E,CAAE,YAAA,CAAAgF,CAAa,CAAC,EAClG5F,CAAAA,CAAuB4F,CAAAA,CAAc,CAAE,QAAA,CAAAC,CAAAA,CAAU,GAAGjG,CAAW,CAAC,CAAA,EAKxE,CAAA,CAwQI,MAlLU,IAAM,CAChBgB,EAAI,iCAAiC,CAAA,CAEjCG,GAAc,eAAA,GACdH,CAAAA,CAAI,+BAA+B,CAAA,CACnCG,EAAa,KAAA,EAAM,CAAA,CAEnBC,GAAU,eAAA,GACVJ,CAAAA,CAAI,2BAA2B,CAAA,CAC/BI,CAAAA,CAAS,KAAA,EAAM,EAEvB,EAwKI,uBAAA,CAvD6BiD,CAAAA,EAAqCjD,GAAU,gBAAA,CAAiBiD,CAAG,EAwDhG,qBAAA,CAjD2BA,CAAAA,EAA8CjD,CAAAA,EAAU,cAAA,CAAeiD,CAAG,CAAA,CAkDrG,4BAAA,CA3CAA,GAEAjD,CAAAA,EAAU,qBAAA,CAAsBiD,CAAG,CAAA,CA0CnC,kBAAA,CApCuB,IAAwCjD,CAAAA,EAAU,aAAY,EAAK,GAqC1F,qBAAA,CA7BA8E,CAAAA,EACe9E,GAAU,cAAA,CAAe8E,CAAQ,CAAA,GAAM,IAAM,CAAC,CAAA,CAAA,CA6B7D,yBAAA,CAvB8B,IAAY9E,CAAAA,EAAU,kBAAA,EAwBxD,CAAA,CAEA,OAAI,OAAO,MAAA,CAAW,GAAA,GAClB,OAAO,iBAAA,CAAoBoD,CAAAA,CAAAA,CAGxBA,CACX,CAEO,IAAM2B,EAAYtF,CAAAA","file":"index.mjs","sourcesContent":["export const CACHE_STORAGE_EVENTS = 'cached_analytics_events'\nexport const CACHE_STORAGE_PAGES = 'cached_analytics_page_views'\n\nexport type CachedEvent = {\n    name: string\n    properties: Record<string, unknown>\n    timestamp: number\n}\n\nexport type CachedPageView = {\n    name: string\n    properties?: Record<string, unknown>\n    timestamp: number\n}\n\nexport const cacheEventToStorage = (eventName: string, properties: Record<string, unknown>): void => {\n    try {\n        const existingCache = localStorage.getItem(CACHE_STORAGE_EVENTS)\n        const events: CachedEvent[] = existingCache ? JSON.parse(existingCache) : []\n        events.push({ name: eventName, properties, timestamp: Date.now() })\n        localStorage.setItem(CACHE_STORAGE_EVENTS, JSON.stringify(events))\n    } catch (err) {\n        console.warn('Analytics: Failed to cache event', err)\n    }\n}\n\nexport const cachePageViewToStorage = (pageName: string, properties?: Record<string, unknown>): void => {\n    try {\n        const existingCache = localStorage.getItem(CACHE_STORAGE_PAGES)\n        const pages: CachedPageView[] = existingCache ? JSON.parse(existingCache) : []\n        pages.push({ name: pageName, properties, timestamp: Date.now() })\n        localStorage.setItem(CACHE_STORAGE_PAGES, JSON.stringify(pages))\n    } catch (err) {\n        console.warn('Analytics: Failed to cache page view', err)\n    }\n}\n\nexport const getCachedEvents = (): CachedEvent[] => {\n    try {\n        const storedEventsString = localStorage.getItem(CACHE_STORAGE_EVENTS)\n        if (storedEventsString) {\n            const events = JSON.parse(storedEventsString)\n            return Array.isArray(events) ? events : []\n        }\n    } catch (err) {\n        console.warn('Analytics: Failed to get cached events', err)\n    }\n    return []\n}\n\nexport const getCachedPageViews = (): CachedPageView[] => {\n    try {\n        const storedPagesString = localStorage.getItem(CACHE_STORAGE_PAGES)\n        if (storedPagesString) {\n            const pages = JSON.parse(storedPagesString)\n            return Array.isArray(pages) ? pages : []\n        }\n    } catch (err) {\n        console.warn('Analytics: Failed to get cached pages', err)\n    }\n    return []\n}\n\nexport const clearCachedEvents = (): void => {\n    try {\n        localStorage.removeItem(CACHE_STORAGE_EVENTS)\n    } catch (err) {\n        console.warn('Analytics: Failed to clear cached events', err)\n    }\n}\n\nexport const clearCachedPageViews = (): void => {\n    try {\n        localStorage.removeItem(CACHE_STORAGE_PAGES)\n    } catch (err) {\n        console.warn('Analytics: Failed to clear cached page views', err)\n    }\n}\n","import { RudderStack } from './providers/rudderstack'\nimport {\n    cacheEventToStorage,\n    cachePageViewToStorage,\n    getCachedEvents,\n    getCachedPageViews,\n    clearCachedEvents,\n    clearCachedPageViews,\n} from './utils/storage'\nimport { isUUID, getCountry, cleanObject, flattenObject, createLogger, isInternalEmail } from './utils/helpers'\n// Optional Growthbook types - only import if using Growthbook\nimport type { Growthbook, GrowthbookConfigs } from './providers/growthbook'\nimport type { TGrowthbookAttributes, TGrowthbookOptions } from './providers/growthbookTypes'\n\n// Optional Posthog types - only import if using Posthog\nimport type { Posthog } from './providers/posthog'\nimport type { TPosthogIdentifyTraits, TPosthogOptions } from './providers/posthogTypes'\n\ndeclare global {\n    interface Window {\n        AnalyticsInstance: ReturnType<typeof createAnalyticsInstance>\n    }\n}\n\n/**\n * Configuration options for initializing the analytics instance\n */\ntype Options = {\n    /** GrowthBook client API key for A/B testing and feature flags */\n    growthbookKey?: string\n    /** GrowthBook decryption key for encrypted feature payloads */\n    growthbookDecryptionKey?: string\n    /** RudderStack write key for event tracking */\n    rudderstackKey?: string\n    /** Additional configuration options for GrowthBook */\n    growthbookOptions?: TGrowthbookOptions\n    /** PostHog configuration options including API keys and settings */\n    posthogOptions?: TPosthogOptions\n    /** Enable debug logging — logs all analytics calls prefixed with [ANALYTIC] */\n    debug?: boolean\n}\n\n/**\n * Creates a unified analytics instance that integrates RudderStack and GrowthBook.\n *\n * This function provides a centralized interface for:\n * - Event tracking across multiple analytics platforms\n * - A/B testing and feature flag management via GrowthBook\n * - Offline event caching with automatic replay\n *\n * @param {Options} _options - Optional initialization configuration\n * @returns {Object} Analytics instance with methods for tracking, identification, and feature management\n *\n * @example\n * ```typescript\n * const analytics = createAnalyticsInstance();\n *\n * // Initialize with providers\n * await analytics.initialise({\n *   rudderstackKey: 'YOUR_RS_KEY',\n *   growthbookKey: 'YOUR_GB_KEY',\n *   growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY'\n * });\n *\n * // Set user attributes\n * analytics.setAttributes({\n *   user_id: 'user123',\n *   country: 'US',\n *   user_language: 'en'\n * });\n *\n * // Track events\n * analytics.trackEvent('button_clicked', { button_name: 'signup' });\n *\n * // Track page views\n * analytics.pageView('/dashboard', 'Deriv App');\n * ```\n */\nexport function createAnalyticsInstance(_options?: Options) {\n    let _debug = _options?.debug ?? false\n\n    const log = createLogger('', () => _debug)\n\n    let _growthbook: Growthbook | undefined,\n        _rudderstack: RudderStack,\n        _posthog: Posthog | undefined,\n        core_data: Record<string, any> = {},\n        tracking_config: { [key: string]: boolean } = {},\n        offline_event_cache: Array<{ event: string; payload: Record<string, any> }> = [],\n        _pending_identify_calls: Array<{ userId: string; traits?: Record<string, any> }> = [],\n        _storage_cache_processed = false\n\n    const processStorageCache = () => {\n        if (_storage_cache_processed) return\n        if (!_rudderstack?.has_initialized) return\n\n        _storage_cache_processed = true\n\n        try {\n            const storedEvents = getCachedEvents()\n            if (storedEvents.length > 0) {\n                log(`processStorageCache | replaying ${storedEvents.length} cached event(s)`, storedEvents)\n                storedEvents.forEach(event => {\n                    const cleaned_properties = cleanObject(event.properties)\n                    _rudderstack?.track(event.name, cleaned_properties)\n                })\n                clearCachedEvents()\n            }\n\n            const storedPages = getCachedPageViews()\n            if (storedPages.length > 0) {\n                log(`processStorageCache | replaying ${storedPages.length} cached page view(s)`, storedPages)\n                storedPages.forEach(page => {\n                    _rudderstack?.pageView(page.name, 'Deriv App', getId(), page.properties)\n                })\n                clearCachedPageViews()\n            }\n        } catch (err) {\n            console.warn('Analytics: Failed to process storage cache', err)\n        }\n    }\n\n    const onSdkLoaded = () => {\n        log('onSdkLoaded | RudderStack SDK loaded')\n        processStorageCache()\n\n        if (_pending_identify_calls.length > 0) {\n            log(`onSdkLoaded | flushing ${_pending_identify_calls.length} pending identify call(s)`)\n        }\n        _pending_identify_calls.forEach(({ userId, traits }) => {\n            if (userId) {\n                _rudderstack?.identifyEvent(userId, traits)\n            }\n        })\n        _pending_identify_calls = []\n    }\n\n    /**\n     * Initializes the analytics instance with specified provider configurations.\n     * This method should be called before tracking any events.\n     *\n     * Features:\n     * - Lazy-loads providers (GrowthBook, PostHog) only when configured\n     * - Automatically fetches user's country for GrowthBook targeting\n     * - Processes any cached events from previous sessions\n     * - Sets up event tracking callback for GrowthBook experiments\n     *\n     * @param {Options} options - Configuration options for analytics providers\n     * @returns {Promise<void>} Resolves when initialization is complete\n     *\n     * @example\n     * ```typescript\n     * await analytics.initialise({\n     *   rudderstackKey: 'YOUR_RS_KEY',\n     *   growthbookKey: 'YOUR_GB_KEY',\n     *   growthbookDecryptionKey: 'YOUR_GB_DECRYPT_KEY',\n     *   posthogOptions: {\n     *     apiKey: 'YOUR_POSTHOG_API_KEY',\n     *     config: {\n     *       session_recording: {\n     *         recordCrossOriginIframes: true,\n     *         minimumDurationMilliseconds: 30000\n     *       }\n     *     }\n     *   }\n     * });\n     * ```\n     */\n    const initialise = async ({\n        growthbookKey,\n        growthbookDecryptionKey,\n        rudderstackKey,\n        growthbookOptions,\n        posthogOptions,\n        debug,\n    }: Options) => {\n        if (debug !== undefined) _debug = debug\n\n        log('initialise | starting analytics initialization', {\n            rudderstack: !!rudderstackKey,\n            growthbook: !!growthbookKey,\n            posthog: !!posthogOptions,\n        })\n\n        try {\n            // Only fetch country if GrowthBook is enabled and country not provided\n            const country = growthbookOptions?.attributes?.country || (growthbookKey ? await getCountry() : undefined)\n\n            if (rudderstackKey) {\n                log('initialise | initializing RudderStack')\n                _rudderstack = RudderStack.getRudderStackInstance(rudderstackKey, onSdkLoaded, _debug)\n            }\n\n            if (growthbookOptions?.attributes && Object.keys(growthbookOptions.attributes).length > 0) {\n                const attrs = growthbookOptions.attributes\n                const anonymousId = _rudderstack?.getAnonymousId()\n\n                core_data = {\n                    ...core_data,\n                    country,\n                    ...(attrs.user_language && { user_language: attrs.user_language }),\n                    ...(attrs.account_type && { account_type: attrs.account_type }),\n                    ...(attrs.app_id && { app_id: attrs.app_id }),\n                    ...(attrs.residence_country && { residence_country: attrs.residence_country }),\n                    ...(attrs.device_type && { device_type: attrs.device_type }),\n                    ...(attrs.url && { url: attrs.url }),\n                    ...(attrs.email_hash && { email_hash: attrs.email_hash }),\n                    ...(attrs.network_type && { network_type: attrs.network_type }),\n                    ...(attrs.network_rtt && { network_rtt: attrs.network_rtt }),\n                    ...(attrs.network_downlink && { network_downlink: attrs.network_downlink }),\n                    ...(attrs.account_currency && { account_currency: attrs.account_currency }),\n                    ...(attrs.account_mode && { account_mode: attrs.account_mode }),\n                    loggedIn: !!attrs.loggedIn,\n                    ...(attrs.user_id && !isUUID(attrs.user_id) && { user_id: attrs.user_id }),\n                    ...(anonymousId && { anonymous_id: anonymousId }),\n                }\n            }\n\n            growthbookOptions ??= {}\n            growthbookOptions.attributes ??= {}\n            const anonId = _rudderstack?.getAnonymousId()\n            growthbookOptions.attributes.id ??= anonId\n            growthbookOptions.attributes.country ??= country\n\n            if (growthbookKey) {\n                log('initialise | initializing GrowthBook')\n                // Dynamically import Growthbook only when needed\n                const { Growthbook } = await import('./providers/growthbook')\n                _growthbook = Growthbook.getGrowthBookInstance(\n                    growthbookKey,\n                    growthbookDecryptionKey,\n                    growthbookOptions,\n                    _debug\n                )\n                log('initialise | GrowthBook initialized')\n\n                const interval = setInterval(() => {\n                    if (Object.keys(tracking_config).length > 0) clearInterval(interval)\n                    else tracking_config = getFeatureValue('tracking-buttons-config', {}) as { [key: string]: boolean }\n                }, 1000)\n            }\n\n            if (posthogOptions) {\n                log('initialise | initializing PostHog')\n                // Dynamically import Posthog only when needed\n                const { Posthog } = await import('./providers/posthog')\n                _posthog = Posthog.getPosthogInstance(posthogOptions, _debug)\n                log('initialise | PostHog initialized')\n            }\n\n            log('initialise | analytics initialization complete')\n        } catch (err) {\n            console.warn('Analytics: Failed to initialize', err)\n        }\n    }\n\n    /**\n     * Sets user and context attributes for analytics tracking and targeting.\n     * These attributes are automatically included in all subsequent events.\n     *\n     * Attributes are used for:\n     * - Event enrichment (added to all tracked events)\n     * - GrowthBook targeting (feature flags and A/B tests)\n     * - User segmentation across analytics platforms\n     *\n     * @param {TCoreAttributes} attributes - User and context attributes\n     *\n     * @example\n     * ```typescript\n     * analytics.setAttributes({\n     *   user_id: 'CR123456',\n     *   country: 'US',\n     *   user_language: 'en',\n     *   device_type: 'desktop',\n     *   account_type: 'real',\n     *   loggedIn: true\n     * });\n     * ```\n     */\n    const setAttributes = (attributes: Record<string, any>) => {\n        log('setAttributes | received attributes', attributes)\n\n        const { user_id, ...rest } = attributes\n        const user_identity = user_id ?? getId()\n\n        if (_growthbook) {\n            const config: TGrowthbookAttributes = { ...rest }\n            if (user_id && !isUUID(user_id)) config.user_id = user_id\n            if (user_identity) {\n                config.id = user_identity\n                config.user_id = user_identity\n            }\n            log('setAttributes | called GrowthBook setAttributes', config)\n            _growthbook.setAttributes(config)\n        }\n\n        core_data = {\n            ...core_data,\n            ...Object.fromEntries(Object.entries(rest).filter(([, v]) => v !== undefined)),\n            ...(user_id !== undefined && !isUUID(user_id) && { user_id }),\n        }\n\n        log('setAttributes | updated core_data', core_data)\n    }\n\n    const getFeatureState = (id: string) => _growthbook?.getFeatureState(id)?.experimentResult?.name\n\n    const getFeatureValue = <K extends keyof GrowthbookConfigs, V extends GrowthbookConfigs[K]>(\n        id: K,\n        defaultValue: V\n    ) => _growthbook?.getFeatureValue(id as string, defaultValue)\n\n    const getGrowthbookStatus = async () => await _growthbook?.getStatus()\n    const isFeatureOn = (key: string) => _growthbook?.isOn(key)\n    const setUrl = (href: string) => _growthbook?.setUrl(href)\n\n    const getId = () => {\n        const userId = _rudderstack?.getUserId() || ''\n        return userId && !isUUID(userId) ? userId : ''\n    }\n\n    const getAnonymousId = () => _rudderstack?.getAnonymousId() || ''\n\n    /**\n     * Tracks a page view event.\n     *\n     * Features:\n     * - Automatically includes user ID if available\n     * - Caches page views when offline or provider not initialized\n     *\n     * @param {string} current_page - The current page URL or path\n     * @param {string} [platform='Deriv App'] - The platform name\n     * @param {Record<string, unknown>} [properties] - Additional page properties\n     *\n     * @example\n     * ```typescript\n     * analytics.pageView('/dashboard');\n     * analytics.pageView('/trade', 'Deriv Trader', { section: 'multipliers' });\n     * ```\n     */\n    const pageView = (current_page: string, platform = 'Deriv App', properties?: Record<string, unknown>) => {\n        const userId = getId()\n\n        log('pageView | called', { current_page, platform, properties, userId })\n\n        // Handle RudderStack pageView independently\n        if (_rudderstack?.has_initialized) {\n            log('pageView | sending page view to RudderStack', { current_page, platform })\n            _rudderstack.pageView(current_page, platform, userId, properties)\n        } else {\n            log('pageView | RudderStack not initialized — caching page view to localStorage', { current_page })\n            cachePageViewToStorage(current_page, { platform, ...properties })\n        }\n\n        // PostHog handles page views automatically via autocapture\n        // No need to manually send page views to PostHog\n    }\n\n    /**\n     * Identifies a user across analytics platforms.\n     * This method should be called after user login or when user identity is known.\n     *\n     * Features:\n     * - Queues identify calls if provider not yet initialized\n     * - Allows custom traits for each provider or shared traits for both\n     * - Identifies user in PostHog if configured\n     *\n     * @param {string} [user_id] - The user ID to identify. If not provided, uses stored user ID\n     * @param {Record<string, any>} [traits] - Optional traits to send to both providers, or provider-specific traits\n     *\n     * @example\n     * ```typescript\n     * // Simple identify\n     * analytics.identifyEvent('CR123456');\n     *\n     * // Identify with same traits for both providers\n     * analytics.identifyEvent('CR123456', {\n     *   language: 'en',\n     *   country_of_residence: 'US'\n     * });\n     *\n     * // Identify with provider-specific traits\n     * analytics.identifyEvent('CR123456', {\n     *   rudderstack: { language: 'en', custom_field: 'value' },\n     *   posthog: { language: 'en', country_of_residence: 'US' }\n     * });\n     * ```\n     */\n    const identifyEvent = (user_id?: string, traits?: Record<string, any>) => {\n        const stored_user_id = user_id || getId()\n        if (!stored_user_id) {\n            log('identifyEvent | skipped — no user_id available')\n            return\n        }\n\n        log('identifyEvent | called', { user_id: stored_user_id, traits })\n\n        // Strip PII: replace raw email with is_internal flag\n        const sanitizePII = (t?: Record<string, any>) => {\n            if (!t) return t\n            const { email, ...safe } = t\n            return { ...safe, ...(email && { is_internal: isInternalEmail(email) }) }\n        }\n\n        // Check if traits has provider-specific structure\n        const hasProviderStructure = traits?.rudderstack !== undefined || traits?.posthog !== undefined\n        let rudderstackTraits, posthogTraits\n        if (hasProviderStructure) {\n            // Merge shared top-level props with provider-specific ones (provider-specific wins on conflict)\n            const { rudderstack, posthog, ...sharedTraits } = traits as any\n            rudderstackTraits = sanitizePII({ ...sharedTraits, ...rudderstack })\n            posthogTraits = sanitizePII({ ...sharedTraits, ...posthog })\n        } else {\n            rudderstackTraits = sanitizePII(traits)\n            posthogTraits = sanitizePII(traits)\n        }\n\n        // Handle RudderStack identification independently\n        if (_rudderstack) {\n            if (_rudderstack.has_initialized) {\n                log('identifyEvent | calling RudderStack identify', {\n                    user_id: stored_user_id,\n                    traits: rudderstackTraits,\n                })\n                _rudderstack.identifyEvent(stored_user_id, rudderstackTraits)\n            } else {\n                if (!_pending_identify_calls.some(call => call.userId === stored_user_id)) {\n                    log('identifyEvent | RudderStack not initialized — queuing identify call', {\n                        user_id: stored_user_id,\n                    })\n                    _pending_identify_calls.push({ userId: stored_user_id, traits: rudderstackTraits })\n                }\n            }\n        }\n\n        // Handle PostHog identification independently\n        if (_posthog?.has_initialized) {\n            log('identifyEvent | calling PostHog identify', { user_id: stored_user_id, traits: posthogTraits })\n            _posthog.identifyEvent(stored_user_id, posthogTraits as TPosthogIdentifyTraits)\n        }\n    }\n\n    const reset = () => {\n        log('reset | resetting all providers')\n        // Reset each provider independently\n        if (_rudderstack?.has_initialized) {\n            log('reset | resetting RudderStack')\n            _rudderstack.reset()\n        }\n        if (_posthog?.has_initialized) {\n            log('reset | resetting PostHog')\n            _posthog.reset()\n        }\n    }\n\n    /**\n     * Tracks a custom event with associated data.\n     *\n     * Features:\n     * - Automatically enriches events with core attributes\n     * - RudderStack: Caches events when offline or not initialized\n     * - PostHog: Sends immediately if initialized (has built-in caching)\n     * - Respects feature flag configurations\n     * - Each provider works independently - one failing won't affect the other\n     *\n     * @param {string} event - The event name to track\n     * @param {Record<string, any>} analytics_data - The event data payload\n     */\n    const trackEvent = (event: string, analytics_data: Record<string, any>) => {\n        const userId = getId()\n\n        log('trackEvent | called', { event, analytics_data, userId, core_data })\n\n        const final_payload = {\n            ...core_data,\n            ...analytics_data,\n            ...(userId && !core_data.user_id && { user_id: userId }),\n        }\n\n        log('trackEvent | built payload', { event, final_payload })\n\n        const shouldTrack = !(event in tracking_config) || tracking_config[event as string]\n        if (!shouldTrack) {\n            log('trackEvent | skipped — event disabled by tracking_config', { event })\n            return\n        }\n\n        // Handle RudderStack independently\n        const hasRudderstackInitialized = _rudderstack?.has_initialized\n        if (!navigator.onLine || !hasRudderstackInitialized) {\n            if (!hasRudderstackInitialized) {\n                log('trackEvent | RudderStack not initialized — caching event to localStorage', { event })\n                cacheEventToStorage(event as string, final_payload)\n            } else {\n                log('trackEvent | offline — caching event to memory', { event })\n                offline_event_cache.push({ event, payload: final_payload })\n            }\n        } else {\n            // Send cached events to RudderStack\n            if (offline_event_cache.length > 0) {\n                log(`trackEvent | flushing ${offline_event_cache.length} offline cached event(s) to RudderStack`)\n                offline_event_cache.forEach(cache => {\n                    const cleaned_cache_payload = cleanObject(cache.payload)\n                    _rudderstack?.track(cache.event, cleaned_cache_payload)\n                })\n                offline_event_cache = []\n            }\n\n            // Send current event to RudderStack\n            const cleaned_payload = cleanObject(final_payload)\n            log('trackEvent | sending event to RudderStack', { event, payload: cleaned_payload })\n            _rudderstack?.track(event, cleaned_payload)\n        }\n\n        // Handle PostHog independently - send immediately if initialized\n        if (_posthog?.has_initialized) {\n            const posthog_payload = cleanObject(flattenObject(final_payload))\n            log('trackEvent | sending event to PostHog', { event, payload: posthog_payload })\n            _posthog.capture(event as string, posthog_payload)\n        }\n    }\n\n    /**\n     * Ensures client_id is set in PostHog stored person properties.\n     * Call this when the user ID is available and PostHog is loaded.\n     * Useful for backfilling client_id for users identified in previous sessions.\n     * No-op if client_id is already present or PostHog is not initialized.\n     *\n     * @param params.user_id - The user ID to use as client_id\n     * @param params.email - The user's email, used to determine is_internal\n     * @param params.language - The user's language (BCP 47 tag, e.g. \"en-GB\")\n     * @param params.country_of_residence - The user's country of residence\n     *\n     * @example\n     * ```typescript\n     * if (window.posthog?.__loaded && userId) {\n     *     analytics.backfillPersonProperties({ user_id: userId, email, language, country_of_residence })\n     * }\n     * ```\n     */\n    const backfillPersonProperties = ({\n        user_id,\n        email,\n        language,\n        country_of_residence,\n    }: {\n        user_id: string\n        email?: string\n        language?: string\n        country_of_residence?: string\n    }): void => {\n        log('backfillPersonProperties | called', { user_id })\n        if (_posthog?.has_initialized) {\n            log('backfillPersonProperties | backfilling person properties in PostHog', { user_id })\n            _posthog.backfillPersonProperties({ user_id, email, language, country_of_residence })\n        } else {\n            log('backfillPersonProperties | skipped — PostHog not initialized')\n        }\n    }\n\n    const getInstances = () => ({ ab: _growthbook, tracking: _rudderstack, posthog: _posthog })\n\n    /**\n     * Check whether a PostHog feature flag is enabled for the current user.\n     * Returns undefined if PostHog is not initialized.\n     */\n    const isPosthogFeatureEnabled = (key: string): boolean | undefined => _posthog?.isFeatureEnabled(key)\n\n    /**\n     * Get the value of a PostHog feature flag.\n     * Returns a string variant for multivariate flags, true/false for boolean flags,\n     * or undefined if the flag does not exist or PostHog is not initialized.\n     */\n    const getPosthogFeatureFlag = (key: string): string | boolean | undefined => _posthog?.getFeatureFlag(key)\n\n    /**\n     * Get the JSON payload attached to a PostHog feature flag.\n     * Returns undefined if the flag has no payload or PostHog is not initialized.\n     */\n    const getPosthogFeatureFlagPayload = (\n        key: string\n    ): string | number | boolean | null | Record<string, unknown> | unknown[] | undefined =>\n        _posthog?.getFeatureFlagPayload(key)\n\n    /**\n     * Get all currently active PostHog feature flags and their values.\n     * Returns an empty object if PostHog is not initialized.\n     */\n    const getPosthogAllFlags = (): Record<string, string | boolean> => _posthog?.getAllFlags() ?? {}\n\n    /**\n     * Subscribe to PostHog feature flag changes.\n     * The callback fires immediately with current flags and again whenever flags are reloaded.\n     * Returns an unsubscribe function — call it to stop listening.\n     */\n    const onPosthogFeatureFlags = (\n        callback: (flags: string[], variants: Record<string, string | boolean>) => void\n    ): (() => void) => _posthog?.onFeatureFlags(callback) ?? (() => {})\n\n    /**\n     * Force PostHog to reload feature flags from the server.\n     * Useful after attribute/identity changes that may affect flag targeting.\n     */\n    const reloadPosthogFeatureFlags = (): void => _posthog?.reloadFeatureFlags()\n\n    const AnalyticsInstance = {\n        initialise,\n        setAttributes,\n        identifyEvent,\n        backfillPersonProperties,\n        getFeatureState,\n        getFeatureValue,\n        getGrowthbookStatus,\n        isFeatureOn,\n        setUrl,\n        getId,\n        getAnonymousId,\n        trackEvent,\n        getInstances,\n        pageView,\n        reset,\n        isPosthogFeatureEnabled,\n        getPosthogFeatureFlag,\n        getPosthogFeatureFlagPayload,\n        getPosthogAllFlags,\n        onPosthogFeatureFlags,\n        reloadPosthogFeatureFlags,\n    }\n\n    if (typeof window !== 'undefined') {\n        window.AnalyticsInstance = AnalyticsInstance\n    }\n\n    return AnalyticsInstance\n}\n\nexport const Analytics = createAnalyticsInstance()\n"]}