{"version":3,"file":"js/27104-1e52e1508aa6623fce31.js","mappings":";mOAGA,EAFkC,iBAAVA,QAAsBA,QAAUA,OAAOC,SAAWA,QAAUD,OCEhFE,EAA0B,iBAARC,MAAoBA,MAAQA,KAAKF,SAAWA,QAAUE,KCE5E,GDCWC,GAAcF,GAAYG,SAAS,cAATA,ICHnBC,OCiBlB,MAXA,SAAkBC,EAAOC,GAKvB,IAJA,IAAIC,GAAS,EACTC,EAAkB,MAATH,EAAgB,EAAIA,EAAMG,OACnCC,EAASC,MAAMF,KAEVD,EAAQC,GACfC,EAAOF,GAASD,EAASD,EAAME,GAAQA,EAAOF,GAEhD,OAAOI,GCQT,EAFcC,MAAMC,QCpBhBC,EAAcb,OAAOc,UAGrBC,EAAiBF,EAAYE,eAO7BC,EAAuBH,EAAYI,SAGnCC,EAAiBb,EAASA,EAAOc,iBAAcC,EA6BnD,MApBA,SAAmBC,GACjB,IAAIC,EAAQP,EAAeQ,KAAKF,EAAOH,GACnCM,EAAMH,EAAMH,GAEhB,IACEG,EAAMH,QAAkBE,EACxB,IAAIK,GAAW,EACf,MAAOC,IAET,IAAIhB,EAASM,EAAqBO,KAAKF,GAQvC,OAPII,IACEH,EACFD,EAAMH,GAAkBM,SAEjBH,EAAMH,IAGVR,GClCLM,EAPchB,OAAOc,UAOcG,SAavC,MAJA,SAAwBI,GACtB,OAAOL,EAAqBO,KAAKF,ICT/BH,EAAiBb,EAASA,EAAOc,iBAAcC,EAkBnD,MATA,SAAoBC,GAClB,OAAa,MAATA,OACeD,IAAVC,EAdQ,qBADL,gBAiBJH,GAAkBA,KAAkBlB,OAAOqB,GAC/CM,EAAUN,GACVO,EAAeP,ICIrB,MAJA,SAAsBA,GACpB,OAAgB,MAATA,GAAiC,iBAATA,GCGjC,MALA,SAAkBA,GAChB,MAAuB,iBAATA,GACXQ,EAAaR,IArBF,mBAqBYS,EAAWT,IChBnCU,EAAc1B,EAASA,EAAOS,eAAYM,EAC1CY,EAAiBD,EAAcA,EAAYd,cAAWG,EA0B1D,MAhBA,SAASa,EAAaZ,GAEpB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAIT,EAAQS,GAEV,OAAOa,EAASb,EAAOY,GAAgB,GAEzC,GAAIE,EAASd,GACX,OAAOW,EAAiBA,EAAeT,KAAKF,GAAS,GAEvD,IAAIX,EAAUW,EAAQ,GACtB,MAAkB,KAAVX,GAAkB,EAAIW,IA3BjB,SA2BwC,KAAOX,GCN9D,MAJA,SAAkBW,GAChB,OAAgB,MAATA,EAAgB,GAAKY,EAAaZ,ICI3C,MAPA,WACE,IAAIe,EAAOC,UACPC,EAASrB,EAASmB,EAAK,IAE3B,OAAOA,EAAK3B,OAAS,EAAI6B,EAASA,EAAOC,QAAQH,EAAK,GAAIA,EAAK,KCHjE,MAiBMI,EAAoBC,IAMnB,IANoB,SACzBC,EADyB,OAEzBC,EAAS,SAIVF,EACC,IAAKG,OAAOC,QAAS,CACnB,MAAMC,EAASF,OAAOG,SAASC,cAAc,UACvCC,EAAkBV,EAAQI,EAAQ,IAAK,KAC7CG,EAAOI,IAAO,kEAAiED,oBAC/EH,EAAOK,OAAQ,EA5BQC,CAAAA,IAQpB,IARqB,OAC1BN,EAD0B,KAE1BO,EAF0B,SAG1BX,GAKDU,EACKL,SAASO,cAAc,QACzBP,SAASO,cAAc,SAASC,YAAYT,GAG5CJ,EADU,IAAIc,MAAO,oBAAmBH,cAiBxCI,CAAmB,CAAEX,OAAAA,EAAQO,KAAM,QAASX,SAAAA,MAQnCgB,EAAWA,CAACC,EAAejB,MACtCkB,EAAAA,EAAAA,YAAU,KACRpB,EAAkB,CAAEE,SAAAA,MACnB,CAACA,IAeJ,MAAO,CAAEmB,OAbMA,KACRjB,OAAOC,QAAQiB,aAClBlB,OAAOC,QAAQkB,KAAKC,KAAK,CACvBC,SAAU,yBACVC,MAAO,aACPC,YAAa,sCACbR,MAAAA,IAEFf,OAAOC,QAAQiB,YAAa,GAE9BlB,OAAOC,QAAQkB,KAAKK,YAMxB,wBC9EA,MAAMC,EAA0CC,EAAAA,YAC9C,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACEO,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLQ,KAAMP,EACNQ,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEa,SAAS,UACTC,EAAE,+PAKVf,EAAwCgB,aAAe,CACrDb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXiD,EAAwCiB,UAAY,CAClDd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QChCA,MAAMC,EAAgClB,EAAAA,YACpC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,0HACFL,KAAK,SAKbS,EAA8BH,aAAe,CAC3Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXoE,EAA8BF,UAAY,CACxCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QChCA,MAAME,EAAwCnB,EAAAA,YAC5C,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,qEACFL,KAAK,SAKbU,EAAsCJ,aAAe,CACnDb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXqE,EAAsCH,UAAY,CAChDd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QChCA,MAAMG,EAAuCpB,EAAAA,YAC3C,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,gIACFL,KAAK,KAEPT,EAAAA,cAAAA,OAAAA,CAAMc,EAAE,mDAAmDL,KAAK,SAItEW,EAAqCL,aAAe,CAClDb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXsE,EAAqCJ,UAAY,CAC/Cd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QCjCA,MAAMI,EAA8BrB,EAAAA,YAClC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,+IACFL,KAAK,SAKbY,EAA4BN,aAAe,CACzCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXuE,EAA4BL,UAAY,CACtCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QCtBO,MAAMK,EAAcA,CAACC,EAAoBC,KAC9C,MAAMC,GAAgBC,EAAAA,EAAAA,QAAwB,OAG9CpC,EAAAA,EAAAA,YAAU,KACRmC,EAAcE,QAAUJ,IACvB,CAACA,KAGJjC,EAAAA,EAAAA,YAAU,KAGR,IAAMkC,GAAmB,IAAVA,GAAgBA,EAAQ,EACrC,OAGF,MAAMZ,EAAKgB,aAAY,IAAMH,EAAcE,aAAaH,GAExD,MAAO,IAAMK,cAAcjB,KAC1B,CAACY,oBCLN,OArBuBM,EAAAA,EAAAA,aACrB,CAAC,EAAqB7B,KAAS,IAA9B,MAAE8B,KAAUzB,GAAOxB,EAClB,OACEkB,EAAAA,cAAAA,QAAAA,EAAAA,EAAAA,GAAAA,CACEC,IAAKA,EACL8B,MAAO,CACLC,KAAM,gBACNC,SAAU,aACVtB,OAAQ,MACRuB,SAAU,SACVC,SAAU,WACVC,WAAY,SACZ1B,MAAO,SACJqB,IAEDzB,OCnBZ,GAAgB,MAAQ,sBAAsB,WAAa,2BAA2B,SAAW,yBAAyB,YAAc,4BAA4B,WAAa,2BAA2B,cAAgB,8BAA8B,WAAa,2BAA2B,cAAgB,8BAA8B,QAAU,wBAAwB,WAAa,2BAA2B,aAAe,6BAA6B,UAAY,0BAA0B,YAAc,4BAA4B,WAAa,2BAA2B,cAAgB,8BAA8B,qBAAuB,qCAAqC,OAAS,uBAAuB,eAAiB,+BAA+B,UAAY,0BAA0B,OAAS,uBAAuB,QAAU,wBAAwB,aAAe,6BAA6B,QAAU,yBCc/4B,MAAM+B,EAAc,CACzBC,MAAO,QACPC,QAAS,UACTC,QAAS,UACTC,KAAM,QAgBFC,EAAc,IA6DdC,EAAa,CACjBC,MAAuB,SACvBC,KAAsB,WAgHxB,MAhGqB1E,IAYF,IAZG,SACpB2E,EADoB,UAEpBC,EAFoB,UAGpBC,EAAYX,EAAYC,MAHJ,YAIpBW,GAAc,EAJM,iBAKpBC,EAAmBR,EALC,gBAMpBS,EAAkB,OANE,gBAOpBC,GAAkB,EAPE,SAQpBC,GAAW,EARS,SASpBC,EAAW,GATS,QAUpBC,EAAUA,YACPC,GACQrF,EACX,MAAM,cAAEsF,EAAF,YAAiBC,EAAjB,WAA8BC,EAA9B,YAA0CC,GA1F1B9E,CAAAA,IAAAA,IAAC,KACvB+E,EADuB,SAEvBP,GAIDxE,EAAA,MAME,CACC,CAACuD,EAAYC,OAAQ,CACnBmB,cACEzD,EAAAA,cAAC8D,EAAS,CACR,eAAa,EACb,cAAY,aACZ3D,KAAMmD,IAGVI,YAAarB,EAAYC,MACzBqB,WAAY,WACZC,YAAa,eAEf,CAACvB,EAAYE,SAAU,CACrBkB,cACEzD,EAAAA,cAAC+D,EAAW,CACV,eAAa,EACb,cAAY,eACZ5D,KAAMmD,IAGVI,YAAarB,EAAYE,QACzBoB,WAAY,aACZC,YAAa,iBAEf,CAACvB,EAAYG,SAAU,CACrBiB,cACEzD,EAAAA,cAACgE,EAAW,CACV,eAAa,EACb,cAAY,eACZ7D,KAAMmD,IAGVI,YAAarB,EAAYG,QACzBmB,WAAY,aACZC,YAAa,iBAEf,CAACvB,EAAYI,MAAO,CAClBgB,cACEzD,EAAAA,cAACiE,EAAQ,CAAC,eAAa,EAAM,cAAY,YAAY9D,KAAMmD,IAE7DI,YAAarB,EAAYI,KACzBkB,WAAY,UACZC,YAAa,eAEfC,IAkCAK,CAAgB,CAAEL,KAAMb,EAAWM,SAAAA,KAC9Ba,EAAWC,IAAgBC,EAAAA,EAAAA,UAAS1B,EAAWC,OAEhD0B,EAAgBzF,UACpBuF,EAAazB,EAAWE,YAEJ,IAAI0B,SAASC,GAAYC,WAAWD,EAAS,KACjEjB,KAUF,OAPAjC,GACE,KACEgD,MAEFrB,EAAcC,EAAmB,MAIjClD,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACE+C,WAAW2B,EAAAA,EAAAA,GACT,eACAC,EAAOC,MACPD,EAAOhB,GACPZ,EACA,CACE,CAAC4B,EAAOE,QAAmBV,IAAcxB,EAAWC,MACpD,CAAC+B,EAAOG,SAAoBX,IAAcxB,EAAWE,OAGzD,cAAc,SAAQW,EAAQ5C,KAC9BmE,KAAK,QACL,YAAU,UACNvB,GAEJxD,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,EAAOK,aAEnB3B,GACArD,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,EAAOlB,eAAgBA,GAIzCzD,EAAAA,cAAAA,MAAAA,CACE+C,WAAW2B,EAAAA,EAAAA,GAAKC,EAAOM,aAAc,CACnC,CAACN,EAAOO,WAA0C,SAApB/B,EAC9B,CAACwB,EAAOQ,aAA4C,WAApBhC,EAChC,CAACwB,EAAOS,YAA2C,UAApBjC,KAGjCnD,EAAAA,cAACqF,EAAc,KAAE3B,EAAY,MAC7B1D,EAAAA,cAAAA,MAAAA,KAAM8C,KAINM,GACApD,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,EAAOW,sBACrBtF,EAAAA,cAAAA,SAAAA,CACEuF,QAASjB,EACT,aAAW,cACXvB,WAAW2B,EAAAA,EAAAA,GAAKC,EAAOa,OAAQb,EAAOf,KAEtC5D,EAAAA,cAACyF,EAAU,CAAC,eAAa,OAOhCxC,GACCjD,EAAAA,cAAAA,MAAAA,CACE+C,UAAW4B,EAAOe,eAClB,aAAW,SAEX3D,MAAO,CAAE,aAAcmB,GACvB,cAAY,sBAEZlD,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,EAAOhB,QC3L1B,MAAMgC,EAAW,YAEoB,IAFhB,cAC1BC,EAAgB,SACAC,IAAAA,EAAG,GAAEA,EACrB,MAAOC,EAAOC,IAAY1B,EAAAA,EAAAA,UAAcuB,GAKlCI,GAAUC,EAAAA,EAAAA,cAAY,WAAoB,IAAD,uBAAfC,EAAK,aAAAC,EAAAA,EAAAA,EAAAA,EAAAA,IAALD,EAAK,GAAAnI,UAAAA,GACnCgI,GAAUpE,GAAY,IAAIA,KAAYuE,OACrC,IAKGE,GAAUH,EAAAA,EAAAA,cAAY,KAE1BF,GAAUpE,GAAYA,EAAQ0E,MAAM,OACnC,IAOGC,GAAcL,EAAAA,EAAAA,cACjBM,GAA8BR,GAAUpE,GAAY4E,EAAG,IAAI5E,OAC5D,IAMI6E,GAAaP,EAAAA,EAAAA,cAAY,IAAMF,GAAS,IAAM,MAAK,IAKnDU,GAAOR,EAAAA,EAAAA,cAAY,KACvB,GAAIH,EAAM3J,OAAS,EACjB,OAAO2J,EAAM,KAId,CAACA,IAEJ,MAAO,CACLA,MAAAA,EACA3J,OAAQ2J,EAAM3J,OACd6J,QAAAA,EACAI,QAAAA,EACAE,YAAAA,EACAE,WAAAA,EACAC,KAAAA,ICjEkB/K,OAAOgL,OAAO,CAClCC,IAAK,MACLC,MAAO,QACPC,aAAc,iBACdC,UAAW,cARN,MAWMC,EAASrL,OAAOgL,OAAO,CAClCM,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,MAAO,SACPC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,UAIwBpM,OAAOgL,OAAO,CAC5CqB,GAAI,CAAChB,EAAOC,MAEZgB,GAAI,CAACjB,EAAOI,KAAMJ,EAAOK,OACzBa,GAAI,CAAClB,EAAOM,MACZa,GAAI,CAACnB,EAAOO,MACZa,GAAI,CAACpB,EAAOQ,MACZa,GAAI,CAACrB,EAAOS,MACZa,GAAI,CAACtB,EAAOU,MACZa,GAAI,CAACvB,EAAOY,KAAMZ,EAAOW,MACzBa,GAAI,CAACxB,EAAOa,MACZY,GAAI,CAACzB,EAAOc,KAAMd,EAAOe,QAGOpM,OAAOgL,OAAO,CAC9C+B,QAAS,UACTC,SAAU,YACVC,SAAU,cAGajN,OAAOgL,OAAO,CACrCkC,QAAS,UACTC,OAAQ,SACRC,KAAM,SAG0BpN,OAAOgL,OAAO,CAC9CqC,OAAQ,SACRC,QAAS,UACTC,OAAQ,WAsByBvN,OAAOgL,OAAO,CAC/CwC,SAAU,cCyML,MC1PDC,GAAeC,EAAAA,EAAAA,oBAAsCtM,GAC3DqM,EAAaE,YAAc,eAEpB,MAAMC,GAAkBA,KAC7B,MAAMC,GAAUC,EAAAA,EAAAA,YAAWL,GAG3B,IAAKI,EACH,MAAM,IAAIrK,MAAO,yDAGnB,OAAOqK,GAOIE,GAAgB3K,IAAuC,IAAtC,SAAEgE,GAA8BhE,EAC5D,MAAM,MAAEgH,EAAF,YAASQ,EAAT,WAAsBE,GAAeb,EAAsB,CAC/DC,cAAe,KAsBX8D,GAAYzD,EAAAA,EAAAA,cACf0D,IACC,MAAM/I,EAAK+I,EAAY/I,IDlESgJ,KAAKC,SAASlN,SAAS,IAAImN,UAAU,GCmE/DC,EAAcJ,EAAYI,aAAe,OAgB/C,OAdAzD,GAAa0D,GAETL,GAAa/I,IACboJ,EAAOC,MAAMrF,GAAUA,EAAMhE,KAAO+I,EAAY/I,KAKzCoJ,EAGF,IAAIA,EAAQ,IAAKL,EAAa/I,GAAAA,EAAImJ,YAAAA,MAGnC,GAAEnJ,MAEZ,CAAC0F,IAUG4D,GAAYjE,EAAAA,EAAAA,cACfrF,GACC0F,GAAa0D,GACXA,EAAOG,QAAQvF,GACTA,EAAMhE,KAAOA,IAEfgE,GAAOrB,aACA,QAMf,CAAC+C,IAYG8D,GAAcnE,EAAAA,EAAAA,cACjB8D,GAEKA,EACKzD,GAAa0D,GAClBA,EAAOG,QAAQvF,GACTA,EAAMmF,cAAgBA,IAExBnF,GAAOrB,aACA,OAQRiD,KAET,CAACF,EAAaE,IAGV6D,GAAgBC,EAAAA,EAAAA,UACpB,MACEN,OAAQlE,EACR4D,UAAAA,EACAQ,UAAAA,EACAE,YAAAA,KAEF,CAACtE,EAAO4D,EAAWQ,EAAWE,IAGhC,OACEpK,EAAAA,cAACmJ,EAAaoB,SAAQ,CAACxN,MAAOsN,GAC3BvH,ICpKP,OAA8C,oDAA9C,GAAuH,2CCIvH,MAAM0H,GAAgCA,CACpCC,EACAC,IACI,WAAUD,QAAuBC,WAS1BC,GAAiB7L,IAKF,IALG,YAC7BiL,EAAc,OADe,MAE7Ba,EAF6B,wBAG7BC,GAA0B,EAHG,uBAI7BC,EAAyBN,IACL1L,EACpB,MAAM,OAAEkL,EAAF,UAAUE,GAAcZ,KAQxByB,EAAcA,CAACC,EAAY9O,KAAmB0O,GAAS1O,EAAQ0O,EAC/DK,EAAmBrG,GACvBA,GAAOmF,cAAgBA,EAEnBW,EAAcV,EAAOG,OAAOc,GAAiB9O,OAC7CsO,EAAmBT,EACtBG,OAAOc,GACPd,OAAOY,GAAa5O,OAEvB,OACE6D,EAAAA,cAAAA,EAAAA,SAAAA,KACGgK,EACEG,OAAOc,GACPd,OAAOY,GACPG,KACC/M,IAAAA,IAAC,UACC6E,EADD,GAECpC,EAFD,QAGCuK,EACApB,YAAaqB,KACVC,GACJlN,EAAA,OACC6B,EAAAA,cAACsL,GAAKC,EAAAA,EAAAA,GAAAA,CACJvI,UAAWA,EACXwI,IAAK5K,EACLA,GAAIA,GACAyK,EAAI,CACR9H,QAASA,IAjCE3C,CAAAA,IACjBA,GACFsJ,EAAUtJ,IA+Ba0D,CAAc1D,KAE5BuK,MAIRN,GAA2BH,EAAcD,GACxCzK,EAAAA,cAAAA,MAAAA,CACE+C,UAAW4B,GACX,cAAY,cAEZ3E,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,IACbmG,EAAuBL,EAAkBC,OAQtD,gBC5EA,MAAMrJ,GAA8BrB,EAAAA,YAClC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,+IACFL,KAAK,SAKbY,GAA4BN,aAAe,CACzCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXuE,GAA4BL,UAAY,CACtCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,qfC5BE,kKAHa,OAASwK,GAGtB,GAH8B,WAAA1N,WAAA,SAMf2N,GAAA5M,GACf,mBAEA6M,OACE,IADcC,EACd,GAAAA,EAAK7I,EAAW,YAAe8I,EADjB,WAGT/I,OAAW+I,IAAAA,EAAAA,KAAAA,EAAeC,EAC5B,EAJL,UAODC,OAAAA,IAAAA,GAAAA,ECjBoBC,EDQnB,UCPA,+BACFjJ,UAAAA,GACA4I,IAAA,sBACE5I,UACE,GAGA4I,GAAA7I,GAIJ,kBACA,gCCDA,ODZuDmJ,EAAAA,UAAAA,SAAAA,EAAAA,GAAAA,OAAAA,GAAAA,ECO1C,cAAqBlN,EAAAmN,GAAA,OACrBA,GAIPC,EDAN,GC4BI,GAAM,CACNC,EAAAA,CA7B2DjB,QAAAA,EA+B7DvP,MAAM,EACJiI,KAAAA,KASFwI,QAAQ,CACNC,QAAS,WADH,mFAEN1Q,MAAM,GAER2Q,MAAO,CACLzJ,SAAS,SADF,WAAA0J,GA7CoD,CAiD7D3I,KAAK,EACH4I,MAAM,GADHC,KAjDwD,CAqD7DvB,QAAUwB,KAERnH,OAAM,CAvDqD2F,QAAAyB,EAyD7D/I,KAAO8I,KAELE,QAAM,CA3DqD1B,QAMpD,EAuDP2B,OAAE,WAEFC,IAAAA,CA/D2DD,OAAAA,CAAAA,YAiE3DL,MAAE,GAEFO,SAAM,CAnEqDlK,SAAAA,CAAAA,OAqE3DgK,OAAE,WAEFG,QAAO,CACPnK,SAAS,YAxEkDe,KAAAA,IA2E3DqJ,GAAAA,CACA/B,QAtEO,EANoD2B,OAAAA,CAAAA,OA+E3DK,GAAAA,CA/E2DrK,SAAAA,CAAAA,KAAAA,MAiF7De,KA3ES,GA2EDuJ,GAjFqD,CAoF3DjC,QA9EO,EA+EPmB,QAAM,UADJ,UAEFQ,OAAM,QAERO,WAAK,CACHlC,QAnFO,EANoD2B,OAAAA,CAAAA,WA4F3DQ,OAAAA,CACAhB,QAAS,UAAD,WAEViB,OAAM,CACJjB,QAAM,qBAERkB,GAAI,CACF3J,KA7FO,EA8FP4I,MAAM,GAERgB,IAAAA,CACEhB,MAAAA,GADOiB,GAtGoD,CA0G3DvC,QApGO,EAqGP2B,OAAQ,CAAC,KAAD,KAAS,SAEnBa,KAAI,CACF/R,MAAM,GAERgS,GAAI,CACF9K,SAAS,OACTe,KA5GO,GA8GTgK,QAAK,CACH/K,SAAS,iBACTe,KAAM8I,IAERmB,GAAI,CACFhB,OAAQ,QAAS,QAEnBiB,GAAAA,CACEjB,OAAQ,CAAC,OAAD,QADFkB,GA3HqD,CA+H7D7C,QA/H6DyB,EAgI3DE,OAAO,CAAE,eADFmB,IA/HoD,CAmI7D9C,QAnI6DyB,EAoI3DE,OAAQ,UADHoB,KAnIsD,CAuI7DpL,SAAO,wBAELqL,OAAAA,CAzI2DrB,OAAAA,CAAAA,QAAAA,QAAAA,WA2I3DL,MAAE,GAEF2B,QAAM,CA7IqDjD,QAAAyB,EA+I7DE,OAAO,aAELuB,MAAAA,CAjJ2DvL,SAAAA,CAAAA,UAAAA,WAAAA,QAAAA,QAAAA,QAAAA,MAmJ3De,KA7IO,GA+IPyK,MAAAA,CArJ2DxB,OAAAA,CAAAA,SAuJ7DhK,SAAO,QAELyL,GAAAA,CAzJ2DpD,QAMpD,EAqJP2B,OAAE,QAEF0B,MAAAA,CA7J2D1B,OAAAA,CAAAA,SA+J7DhK,SAAO,QAEL2L,GAAAA,CAjK2DtD,QAMpD,EA6JP2B,OAAE,QAEF4B,MAAI,CArKuD5B,OAAAA,CAAAA,SAuK7DhK,SAAO,QAAA6L,GAvKsD,CA0K7D7B,OAAK,kCACHhK,SAAM,MAAS,OADZ8L,MAAAA,CA1KP9B,OAAAA,CAAAA,QAAAA,SA0KO,SAOL+B,GAAAA,CACE/L,SAAU,CAAC,MAETe,KA9KK,GAgLRiL,MALD,CAMDhM,SAAAA,CAAAA,QAAAA,WAEAiM,IAAAA,CAEGlL,KAAO8I,EACPF,MAAM,IA6BN,SAAMuC,GAAYC,GAzBtB,mBA6BAC,GAAa,GACXC,GAAAA,GAAmBF,EAACC,GAAAA,KAMtB,CAAC,UAAK,OAAS,MAAQ,SAAc,WACnCE,QAAAJ,GAAoB,CAClB7D,QAhOO,EAiOPtH,KAAM8I,MAIV,CAAC,WAAW,MAAS,aAAU,OAAU,OAAO,MAAW,eAAc,OACvE,kBAAoB,uCAAAyC,QAAAJ,GAAAA,CAClB7D,QA7O2DyB,EA8O3D/I,KAAM8I,MAIV,CAAC,IAAD,OAAayC,QAAMJ,GAAkB,CAEjC7D,QApP2DyB,EAqP3D/I,KAAM8I,MAIV,CAAC,YAAS,OAAU,MAAU,OAAOyC,QAArC,GACE,CACEjE,QA3P2DyB,EAyP/D/I,KAAAA,KAAA,WAO4B,QAAU,SAAO,SAAd,kDA1PpB,EA0PoB,KAGlB,MAHkB,oDAhQgC+I,EA2RlD,KACA,MAAcyC,CAAAA,QAEd,kBAAmB,gCACnB,aAIA,OAAqB,OAASH,IAEzC,GAFiD,uIAGjD,GAHiDxT,OAAAA,KAAAA,IAAAA,QAAAA,SAAAA,GAIjD,MAAS,WAAFwB,GAJ0CA,WAAAA,KAcjD,GAAO,OAd0C,QAejDoS,IARS,EASTC,KATS,EAUTC,MAVS,EAWTC,QAlBiD,EAmBjDC,SAnBiD,EAoBjDC,SAbS,EAcTC,QArBiD,EAsBjDC,SAtBiD,EAuBjDC,IAhBS,EAiBTnP,OAjBS,EAkBToP,KAlBS,EAmBTnP,GAnBS,EAoBToP,KApBS,EAqBTC,MArBS,EAsBTC,KAtBS,EAuBTC,QAvBS,EAwBTC,KA/BiD,EAgCjDC,MAzBS,EA0BTC,MAjCiD,EAkCjDC,OA3BS,EAP0BxL,KAO1B,EAPwC,gBAOxC,EAgCTyL,MAhCS,EAiCTC,KAxCiD,EAyCjDC,MAzCiD,EA0CjD3O,MA1CiD,EA2CjDnD,IApCS,EAqCT+R,QArCS,EA+BmDC,OA/BnD,EAPwC,OAOxC,ECrTXxQ,MDqTW,ECnTIyD,KDmTJ,EClTTnD,MDkTS,IC5SH,GAAiBhF,OAAM,OAAM,CAC3B8T,MAAAA,YACAC,QAAAA,UACDE,SAAAA,WACFkB,QALD,UAMDF,QAAAA,UALgC,kBAQlC,8BAf6C,uBC0BhD,SAAMG,IACN,OAAMC,EAANC,MAAA,KAAAjT,YAAA,KAqBE,SDhD8C,+EC8BhC+S,EAAG,UAEV,mBAAiB/R,EAAAhC,GAUxB,MATA,aACIrB,OAAOuV,KAAAlU,GAAWqS,SAAA,SAAe5D,GAC5B0F,OAAAA,EAAP,IAAAC,MAAAC,oBAOKrU,GAMP,EDhD8C,CCkD9CoP,IAUA,GAAW,uCAMT,GAAa,mDACX,GAAU,iBAET,4EAMH,OAAK1N,SAAL,eAAA4S,mBAAA,cAGA,OAAsB,WACtB,SAAKC,EAAL,EAAehR,EAAciR,EAA7B,QACD,QAEDjR,EAAAA,SACF,mBAaG,QAEDkR,EAAAA,IACF,uCAEE,kBAAiB,EACf,sBACA,aAAY,GAOb,kBAED,qBACF,oBACA,qBAKY,aAAF,KAAYD,SAAlBA,EACA,KAAIC,QAAA,GAAaC,OAAGD,EAApB,UACA,KAAIE,UAAY,EAChB,KAAIC,UAAJ,4BAEA,KAAKC,QAAS,QAAStR,EAADuR,WAAaC,IACjC,YAAM,IAAUC,IAAAC,IAChB,aAAY,IAAGD,IAAKzR,EAAAA,WAWpB,MAAUgR,EAAAA,UCrIZ,ODuIGW,EAfgC,oJAkBjC,IAGgCA,EAAAA,iBAAxB,cAA6C,YAAGT,QAAAU,QAAA,cAAhD,OAAN,OAAoEC,GAApE,2BAAAhI,EAAAA,KAAAA,EAAAA,GAAAgI,IACAC,IAcEH,EAAAA,cAAgB,SAAhBjU,EAAAqU,GACA,WAEE,EAFoB,GAGpB,OACE/R,MACA,EAAG,EACH,EAAK,EAHA,OAuEjB,OA1E8B,cAAtB8O,SAAA,YASD,IAjBDkD,EAiBO,wBA1BuDrD,EAAAA,EAAAA,aAAAA,4CAoC5D,uBAOJ,aAAKsD,IAAgBC,EAAAA,EAAAA,MAAAA,KAAA,CACnB,MAAaA,EACdtW,EAAAA,EAAAA,MAjEHC,EAAAA,EAAAA,OAgEI,UAIAsW,EAAYC,EAAhB,MACEC,EAAAD,EAAAA,KACDE,EAAAA,GAAAA,EAAAA,CAAAA,QAAAA,SAAAA,QAAAA,QAAAA,SAEMC,EAAK,EAAc,SAAnBC,EAGT,MACFC,GAAAA,EAAAA,MAAAA,EAAAA,IACA,GACEA,GAAcJ,EAA2B,MAAkCE,EAAA,sCACpEG,EAAAA,UAAa,EAChBF,GAAAA,EAFuEG,EAAAA,GAAAA,CAAAA,SAAAA,EAAAA,QAAAA,EAMrE3S,MAAAA,GAAmB,QACdkL,IAAPwH,EAAAA,aAIED,GAAAG,EAKF,UAhBuEX,EAAAA,EAAAA,EAAAA,MAAAA,EAAAA,GAAAA,EAAAA,IAqBvEA,EAAmBA,EAAZlM,MAA4BnK,GAAaC,GAAhD+W,EAAAA,SArBuE,sBAiC3E,MACF,EAGA,yBAEUjB,EAAgC,eAAtC,0DAaA,EAAa,SAAW9V,OAAQ,EAEzBkW,EAAP,SAAAc,SAAAC,EAAAA,WAIJ,uEAIE,EAAe,OAA0CD,SAAAd,EAAAA,YAKlDA,EAAK,MAAAA,EAAAA,UAAAA,EAAAA,UAKJgB,QAAQ,GAAehB,EAAQ,QAAiBe,EAAW,UAjC3DnB,EAAAA,kBAAAA,SAAAA,GA2CN,iBACDqB,EAAAA,EAAAA,OAEDC,EAAAA,EAAAA,kBAEF,sDACA,SAEI,MAAM,wBAENC,OAAAA,GAFMA,EAA2B,EAAjC,6BAEAA,QAAAA,MAAAA,UAOQvB,EAAkBwB,gBAAxB,YACA,IACA,GADqB,qBAALhY,EAAAA,GAAhBA,EAAAA,EAAAA,yBAAAiY,MAIA,MAEC,iGAkBD,OAbE,EACI,MAAAC,MADJ,qEAaEC,IAYJ3B,EAAAA,kBAAW,SAAXG,GAIA,wCAGEzG,EAAa,GACf,EAAO,EAAP,OAhSI,IAgSJ,0BAONtP,MAAAA,KAAAA,EAAAA,YAAAA,SAAAA,SAAAA,GACA,yCACE,KAAiDwX,IAAAC,GAAAA,GAG/C,GAAM,EAAK,OAAX1B,KAAA,cAQO,GAAP,GF1DQ,IE0DR,KAAAyB,EAAAA,WAAAA,QAAA9W,EAAAA,QAAAA,uBAAAA,IAAAA,MAAAA,2CARA,gDF1D+C,IEyEzCoN,EACJ4J,GADa,EFzEgC,IEyEhC5J,EAGb4J,EAHaC,OAAAA,WAAAA,OAAAA,IFzEgC,IEyEhC7J,IAKb4J,EALa,WAQbpI,EAAM,UAAAsI,EAAAA,sBAAAA,EAAAA,GATgCC,GAAAA,MAnB5C7X,IAAAA,EAkCa,KAIL,GA1CG,MAkDX4V,EAAAA,sBAAAA,SAAAA,GACA,SASQ,OATR,0DAEI,2CACItN,EAAO6G,EAAAA,QAAAA,aAAsB,SAA7B2F,EAAgDgD,GAClD,OAAUA,EAAQC,kBAGlBrX,MAEE,GAcJkV,EAAAA,aAAAA,SAAAA,GACD,OAEDnP,SAAAA,GACFqI,QAAAA,EACAmB,QAAAA,GAJG,kBAKDgG,QAAa,GACXzO,KAAI,EACF4I,MAAAA,GAMJ,aACF,eACA6F,QAAAA,IAEA,GAOGL,EAAAA,OAAAA,SAAAA,GAGH,2EACA,qDAEE,OAAU,EAGN,QAFIoC,SAAAC,cAGJ,MAHI,MAGJ,GAHID,UAAAA,GAAAA,WAAAA,GAAAA,YAAAA,GAAAA,SAAAA,EAAA,OAMF,GAQApC,EAAAA,aAAe,SAAkBK,GAFC,kGAElCL,EAAAA,MAAAA,WAgBA,YAAIN,UAIF,KAAM4C,UAAM,KAAK5C,UAFwD,0DAF3E,IAcIM,EAAAA,UAAQ,SAAKuC,EAAMnC,GAA2D,WAE9E,aACDiB,EAfwE,SAcvE,2CAIFmB,EAAK,EAALA,UACDC,EAvCiC,yBAkC9B,UAuHL,OA/GCrY,MAAAA,KAAImY,EAAY,YAAcpF,SAAA,YAE7B,GArcC,IAyZgCgD,EAAAA,SAAA,CA+ClC,+BAEA,oBAEEuC,IAIAxJ,EAAK,KAALA,GAAAA,EAAAA,IAImC,IASjC,EATFgH,EAAAA,EAAAA,iBAAAA,EAAAA,GAIA,MACE,OAIA,+BAGFyC,EAAOlD,UAAPkD,EAGuB,MAAK,EAAK,SAMjC9R,EAAAA,EAAAA,UAAAA,EAAAA,GACA,eAEA,GAAkB,OAAlB,EAnFgC,OAmFhC,0BAYE,YA/FNqI,EAyFW,KAAkBnL,EAAAA,aAAW6U,EAAA,CAChCrJ,IAAIA,KASToJ,EAAAA,SAAAA,EAAAA,EAID,KAAJ,OAAgBE,IAAAxC,GACd,OAQN,kEAY4C,6CAZ5C,CACAsC,EAAAA,UAAAA,+BAES,EAAgB,CACnBtC,QAAO,GAGH,IACEyC,EAAG,WAAXpJ,GAIQsD,EAAO,OACP8F,EAAQ,UAAd9F,EAAAA,MACA,mCAGIzD,IAAJoJ,EAAa,WACN9R,GAAS,EAAd,UAA0BqP,EAAAlD,WAOrB,GAliBX,IAkiBYmD,EAAK,SADO,gEAKnB,+BAEOuC,GAAF,MArGJtY,GAyGF8O,EAAI,KAAQwJ,GAAZxJ,GAnHM8G,EAAAA,cAAAA,SAAAA,EAAAA,GAkIJ,MAAiBkB,SAAS,OAE1B,OAAKJ,MAMN,SAGD,EAAOA,EA3DwEiC,EAAAA,qBA+DjF,IAAIC,EAAK,EACPC,EAAW,EAAX,GAhE+ErC,EAAAA,EAAAA,GA+DjF,UAKIF,EAAM,EAAV,SAAwB,KAAxB,EAhmBwB,2BEvCbwC,EAAAA,EAAgB,MAAoBC,IAG/C,MAFI,KAGJtS,EAHIuS,EAAAA,SAIJC,EAJI,UAKJP,EALI,QAMJ,OANI,EAQF,KACEQ,EAAM,SACNC,EAAMC,KAAGH,EAAQ,cAAaxS,EAAaiS,QAC7C,2CAGF,EAMCQ,EAAAA,EAAAA,MAAAA,EAAAA,GAAAA,OACFC,EAAAA,KAAAA,EAAAA,cAAAA,KAAAA,cAAAA,EAAAA,MAAAA,EAAAA,OAAAA,EAAAA,OAAAA,GAAAA,IAIAL,EAAAA,EAAAA,MAAAA,GAQkC,OAJjC,YACDK,EAAAA,KAAAA,GAGC,IAAiC,EAAS,OAAsB,GADlE,IAEK,EAFL,+BAKD,KDvCOA,GAGJ,ED0EsB,GCrEtB,YAAWlV,GACX,IASF,EATE,EAAeA,EATX,WAUJyC,EAAazC,EAVTyC,UAWJ2S,EAXI,mBAYJvK,EAAS,EAZL,QAaJwK,EAAG,eACDC,EAdJ,gBAeAtD,EAAM,EAAcA,QACpB,EAAM,GAAa,GAAsB,OACzC,EAAqB,aAAf,GAAmChS,EAAAA,OAIzC,KACEuV,EAAYD,MACV,CACD,8BAEGE,EAAO3Z,OAAC,IACV0Z,EAAcC,GASd,OAJJ,IACED,EAAM,GAGJ,EAEC,mCAGH,oBATalK,WAUDA,EADZ,YAIF2G,QAAM,GAJJ,GEyBA,ICvEJ,GAA6B,uCAA7B,GAAkF,wCAAlF,GAAyI,yCAAzI,GAAgM,wCCChM,MAAMyD,GAAqB/V,EAAAA,YACzB,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNM,QAAQ,YACRD,MAAM,6BACNN,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,yjBACFL,KAAK,SAKbsV,GAAmBhV,aAAe,CAChCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXiZ,GAAmB/U,UAAY,CAC7Bd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,UChCA,MAAM+U,GAAwBhW,EAAAA,YAC5B,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNM,QAAQ,YACRD,MAAM,6BACNN,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,4RACFL,KAAK,SAKbuV,GAAsBjV,aAAe,CACnCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXkZ,GAAsBhV,UAAY,CAChCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,UChCA,MAAMgV,GAAsBjW,EAAAA,YAC1B,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNM,QAAQ,YACRD,MAAM,6BACNN,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,6IACFL,KAAK,YAEPT,EAAAA,cAAAA,OAAAA,CACEc,EAAE,yKACFL,KAAK,YAEPT,EAAAA,cAAAA,OAAAA,CACEc,EAAE,wGACFL,KAAK,YAEPT,EAAAA,cAAAA,OAAAA,CACEc,EAAE,mKACFL,KAAK,gBAKbwV,GAAoBlV,aAAe,CACjCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXmZ,GAAoBjV,UAAY,CAC9Bd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,UC5CA,MAAMiV,GAA6BlW,EAAAA,YACjC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNM,QAAQ,YACRD,MAAM,6BACNN,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEmW,SAAS,UACTrV,EAAE,qYACFL,KAAK,GACLI,SAAS,gBAKjBqV,GAA2BnV,aAAe,CACxCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXoZ,GAA2BlV,UAAY,CACrCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,UCoBA,OA/B0BnC,IAMK,IANJ,SACzBgE,EADyB,QAEzByC,EAFyB,QAGzB6Q,EAHyB,UAIzBrT,KACGS,GACoB1E,EACvB,OACEkB,EAAAA,cAACqW,GAAAA,GAAM9K,EAAAA,EAAAA,GAAAA,CACLxI,WAAW2B,EAAAA,EAAAA,GACTC,GACY,kBAAZyR,GAA+BzR,GACnB,iBAAZyR,GAA8BzR,GAC9B5B,GAEFc,KAAK,SACL0B,QAASA,GACL/B,GAEJxD,EAAAA,cAACA,EAAAA,SAAc,CAACsW,SAAUtW,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,MAC3B,UAAZyR,GAAuBpW,EAAAA,cAACuW,GAAS,MACrB,aAAZH,GAA0BpW,EAAAA,cAACwW,GAAY,CAAC/V,KAAK,YACjC,kBAAZ2V,GAA+BpW,EAAAA,cAACwW,GAAY,MAChC,WAAZJ,GAAwBpW,EAAAA,cAACyW,GAAU,MACvB,UAAZL,GAAuBpW,EAAAA,cAAC0W,GAAS,OAEnC5T,IClDP,IAAgB,UAAY,8BAA8B,GAAK,uBAAuB,MAAQ,0BAA0B,KAAO,0BCyB/H,OAdyBhE,IAIF,IAJG,KACxBqW,EADwB,MAExBwB,EAAQ,OAFgB,UAGxB5T,GACejE,EACf,OACEkB,EAAAA,cAAAA,MAAAA,CAAK+C,WAAW2B,EAAAA,EAAAA,GAAKC,GAAOiS,UAAW7T,IACrC/C,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,GAAOkS,OACvB7W,EAAAA,cAAAA,OAAAA,CAAM+C,WAAW2B,EAAAA,EAAAA,GAAKC,GAAOmS,GAAInS,GAAOgS,KAAUxB,GAClDnV,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,GAAOkS,qBCrBzBE,GAAY,CAAC,UAAW,WAAY,QAAS,OAAQ,WAAY,YAAa,YAAa,OAAQ,SAAU,aAAc,QAAS,KAAM,YAC9I,SAASxL,KAAiS,OAApRA,GAAW7P,OAAOsb,OAAStb,OAAOsb,OAAOC,OAAS,SAAUxL,GAAU,IAAK,IAAIyL,EAAI,EAAGA,EAAInZ,UAAU5B,OAAQ+a,IAAK,CAAE,IAAI/I,EAASpQ,UAAUmZ,GAAI,IAAK,IAAI1L,KAAO2C,EAAczS,OAAOc,UAAUC,eAAeQ,KAAKkR,EAAQ3C,KAAQC,EAAOD,GAAO2C,EAAO3C,IAAY,OAAOC,GAAkBF,GAASyF,MAAMmG,KAAMpZ,WAEtU,SAASqZ,GAAuBxb,GAAQ,QAAa,IAATA,EAAmB,MAAM,IAAIyb,eAAe,6DAAgE,OAAOzb,EAE/J,SAAS0b,GAAgBC,EAAGC,GAA6I,OAAxIF,GAAkB5b,OAAO+b,eAAiB/b,OAAO+b,eAAeR,OAAS,SAAyBM,EAAGC,GAAsB,OAAjBD,EAAEG,UAAYF,EAAUD,GAAaD,GAAgBC,EAAGC,GAGnM,IAAIG,GAAyB,SAAUC,GAJvC,IAAwBC,EAAUC,EAMhC,SAASH,IACP,IAAI3E,EAMJ,OALAA,EAAQ4E,EAAiB3a,KAAKka,OAASA,MACjCY,cAAgB/E,EAAM+E,cAAcd,KAAKG,GAAuBpE,IACtEA,EAAMgF,cAAgBhF,EAAMgF,cAAcf,KAAKG,GAAuBpE,IACtEA,EAAMiF,aAAejF,EAAMiF,aAAahB,KAAKG,GAAuBpE,IACpEA,EAAMkF,mBAAqBlF,EAAMkF,mBAAmBjB,KAAKG,GAAuBpE,IACzEA,EAbuB8E,EAKNF,GALJC,EAKPF,GALwCnb,UAAYd,OAAOyc,OAAOL,EAAWtb,WAAYqb,EAASrb,UAAU4b,YAAcP,EAAUP,GAAgBO,EAAUC,GAe7K,IAAI7L,EAAS0L,EAAUnb,UAuIvB,OAtIAyP,EAAOoM,mBAAqB,SAA4BC,GACtD,OAAInB,KAAK7W,MAAMiY,WACTpB,KAAK7W,MAAMiY,WAAWC,WACjBrB,KAAK7W,MAAMiY,WAAWC,WAAWF,GAEnCnB,KAAK7W,MAAMiY,WAAWD,GAExB,MAETrM,EAAOwM,SAAW,WAChB,IAAIC,EAAcvB,KAAKkB,mBAAmB,eAC1C,OAAIK,QAAkC5b,IAAnBqa,KAAKwB,UACfD,EAAYvB,KAAKwB,WAEnB,MAET1M,EAAO2M,YAAc,WACnB,OAAIzB,KAAK7W,MAAMiY,iBAAiCzb,IAAnBqa,KAAKwB,UACzBxB,KAAKwB,UAEP,MAET1M,EAAO4M,QAAU,WACf,IAAIA,EAAU1B,KAAKkB,mBAAmB,WACtC,GAAIQ,QAA8B/b,IAAnBqa,KAAKwB,UAClB,OAAOE,EAAQ1B,KAAKwB,WAEpBxB,KAAK2B,mBAAoB,GAG7B7M,EAAO8M,aAAe,WACpB,IAAI9E,EAASkD,KACb,OAAO,IAAI5S,SAAQ,SAAUC,EAASwU,GACpC/E,EAAOgF,iBAAmBzU,EAC1ByP,EAAOiF,gBAAkBF,EACzB/E,EAAO4E,cAGX5M,EAAOkN,MAAQ,WACb,IAAIC,EAAWjC,KAAKkB,mBAAmB,SACnCe,QAA+Btc,IAAnBqa,KAAKwB,WACnBS,EAASjC,KAAKwB,YAGlB1M,EAAOoN,WAAa,WAClB,IAAID,EAAWjC,KAAKkB,mBAAmB,SACnCe,GACFA,KAGJnN,EAAO8L,cAAgB,WACjBZ,KAAK7W,MAAMgZ,UACbnC,KAAK7W,MAAMgZ,YAEXnC,KAAKc,aAAa,OAGtBhM,EAAO+L,cAAgB,WACjBb,KAAK7W,MAAMiZ,WACbpC,KAAK7W,MAAMiZ,YAETpC,KAAK+B,kBACP/B,KAAK+B,yBACE/B,KAAK8B,wBACL9B,KAAK+B,kBAGhBjN,EAAOgM,aAAe,SAAsBuB,GACtCrC,KAAK7W,MAAMmZ,UACbtC,KAAK7W,MAAMmZ,SAASD,GAElBrC,KAAK8B,mBACP9B,KAAK8B,iBAAiBO,UACfrC,KAAK+B,uBACL/B,KAAK8B,mBAGhBhN,EAAOyN,eAAiB,WACtB,IAAIC,EAASxC,KAAKkB,mBAAmB,UACrC,GAAIsB,QAA6B7c,IAAnBqa,KAAKwB,UAAyB,CAC1C,IAAIiB,EAAUnb,SAASC,cAAc,OACrCyY,KAAKwB,UAAYgB,EAAOC,EAAS,CAC/BC,QAAS1C,KAAK7W,MAAMuZ,QACpBtY,SAAU4V,KAAKc,aACftB,MAAOQ,KAAK7W,MAAMqW,MAClB9S,KAAMsT,KAAK7W,MAAMuD,KACjBiW,SAAU3C,KAAK7W,MAAMwZ,SACrB,mBAAoB3C,KAAKY,cACzB,iBAAkBZ,KAAKa,cACvB7X,KAAMgX,KAAK7W,MAAMH,KACjB4Z,OAAQ5C,KAAK7W,MAAMyZ,OACnBC,GAAI7C,KAAK7W,MAAM0Z,GACfC,MAAO9C,KAAK7W,MAAM2Z,MAClBC,SAAU/C,KAAK7W,MAAM4Z,WAEvB/C,KAAKgD,QAAQlb,YAAY2a,GAEvBzC,KAAK2B,mBAAqB3B,KAAK7W,MAAMiY,iBAAiCzb,IAAnBqa,KAAKwB,YAC1DxB,KAAK2B,mBAAoB,EACzB3B,KAAK0B,YAGT5M,EAAOmO,kBAAoB,WACzBjD,KAAKuC,kBAEPzN,EAAOoO,mBAAqB,WAC1BlD,KAAKuC,kBAEPzN,EAAOiM,mBAAqB,SAA4BoC,GACtDnD,KAAKgD,QAAUG,GAEjBrO,EAAO0N,OAAS,WAGd,IAAIY,EAAcpD,KAAK7W,MAcrBka,GAbUD,EAAYV,QACXU,EAAYd,SACfc,EAAY5D,MACb4D,EAAY1W,KACR0W,EAAYT,SACXS,EAAYjB,UACZiB,EAAYhB,UACjBgB,EAAYpa,KACVoa,EAAYR,OACRQ,EAAYhC,WACjBgC,EAAYN,MACfM,EAAYP,GACNO,EAAYL,SAjJ7B,SAAuC/L,EAAQsM,GAAY,GAAc,MAAVtM,EAAgB,MAAO,GAAI,IAA2D3C,EAAK0L,EAA5DzL,EAAS,GAAQiP,EAAahf,OAAOuV,KAAK9C,GAAqB,IAAK+I,EAAI,EAAGA,EAAIwD,EAAWve,OAAQ+a,IAAO1L,EAAMkP,EAAWxD,GAAQuD,EAASE,QAAQnP,IAAQ,IAAaC,EAAOD,GAAO2C,EAAO3C,IAAQ,OAAOC,EAkJvRmP,CAA8BL,EAAaxD,KAE1D,OAAoB/W,EAAAA,cAAoB,MAAOuL,GAAS,GAAIiP,EAAY,CACtEva,IAAKkX,KAAKe,uBAGPP,EAlJoB,CAmJ3B3X,EAAAA,WAEF2X,GAAUtO,YAAc,YACxBsO,GAAU3W,UAAY,CACpB6Y,QAAS5Y,IAAAA,OAAiB4Z,WAC1BpB,SAAUxY,IAAAA,KACVsX,WAAYtX,IAAAA,OACZ0V,MAAO1V,IAAAA,MAAgB,CAAC,OAAQ,UAChC4C,KAAM5C,IAAAA,MAAgB,CAAC,QAAS,UAChC6Y,SAAU7Y,IAAAA,OACVqY,UAAWrY,IAAAA,KACXsY,UAAWtY,IAAAA,KACXd,KAAMc,IAAAA,MAAgB,CAAC,UAAW,SAAU,cAC5C8Y,OAAQ9Y,IAAAA,OACR+Y,GAAI/Y,IAAAA,OACJgZ,MAAOhZ,IAAAA,MAAgB,CAAC,cAAe,aAAc,WACrDiZ,SAAUjZ,IAAAA,MAEZ0W,GAAU5W,aAAe,CACvB0Y,SAAU,aACV9C,MAAO,QACP9S,KAAM,QACNiW,SAAU,EACV3Z,KAAM,SACN8Z,MAAO,+BCjLLa,GAAe,iBAEnB,SAASC,KACP,MAAyB,qBAAXzc,QAA0BA,OAAO0c,kBAAoB,GAUrE,ICbA,IDaeC,EAAAA,GAAAA,IARf,WACE,IAAIC,EAAiBH,KACjBI,EAAWD,EAAeE,gBAAkB,gBAAkB,iBAClE,OAAIF,EAAe1C,WACV,WAAa2C,EAAW,mCAAqCL,GAAe,mBAE9E,WAAaK,EAAW,4BAA8BL,GAAe,qBAEjC,CAC3CA,aAAcA,GACdO,WAde,aAef1P,WAAYoP,KAAaO,MAAQ,CAC/BA,MAAOP,KAAaO,OAClB,IALN,CAMG3D,IEGH,OAJA,SAAe5a,GACb,OAAgB,MAATA,2BCpBT,OAAwB,sBCgBxB,QAXqB+E,EAAAA,EAAAA,aACnB,CAAC,EAAyB7B,KAAG,IAA5B,UAAE8C,KAAczC,GAAOxB,EAAA,OACtBkB,EAAAA,cAAAA,SAAAA,EAAAA,EAAAA,GAAAA,CACE6D,KAAK,OACLd,WAAW2B,EAAAA,EAAAA,GAAKC,GAAc5B,GAC9B9C,IAAKA,GACDK,OCVV,MAAMib,GAAuCvb,EAAAA,YAC3C,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,qTACFL,KAAK,KAEPT,EAAAA,cAAAA,OAAAA,CACEc,EAAE,mTACFL,KAAK,SAKb8a,GAAqCxa,aAAe,CAClDb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXye,GAAqCva,UAAY,CAC/Cd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,UCpCA,MAAMua,GAA+Bxb,EAAAA,YACnC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,mLACFL,KAAK,KAEPT,EAAAA,cAAAA,OAAAA,CACEc,EAAE,wHACFL,KAAK,SAKb+a,GAA6Bza,aAAe,CAC1Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEX0e,GAA6Bxa,UAAY,CACvCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,UCrCA,GAAgC,8BAAhC,GAAmF,mCC8CnF,QAjCsBa,EAAAA,EAAAA,aACpB,CAAC,EAA6D7B,KAAS,IAAtE,iBAAEwb,EAAF,iBAAoBC,EAApB,UAAsC3Y,KAAczC,GAAOxB,EAC1D,MAAO6c,EAAmBC,IAAwBvX,EAAAA,EAAAA,WAAS,GAE3D,OACErE,EAAAA,cAAAA,MAAAA,CAAK+C,WAAW2B,EAAAA,EAAAA,GAAKC,GAAsB5B,IACzC/C,EAAAA,cAAC6b,IAAKtQ,EAAAA,EAAAA,GAAAA,CACJ1H,KAAM8X,EAAoB,OAAS,WACnC1b,IAAKA,GACDK,IAENN,EAAAA,cAAAA,SAAAA,CACEuF,QAASA,IAAMqW,GAAsBE,IAAUA,IAC/C/Y,UAAW4B,GACXd,KAAK,SACLkB,KAAK,SACL,eAAc4W,EACdvb,MAAOub,EAAoBD,EAAmBD,GAE7CE,EACC3b,EAAAA,cAAC+b,GAAyB,MAE1B/b,EAAAA,cAACgc,GAAiC,MAEpChc,EAAAA,cAACqF,EAAc,KACZsW,EAAoBD,EAAmBD,QCtCpD,IAAgB,MAAQ,kCAAkC,MAAQ,kCAAkC,MAAQ,kCAAkC,UAAY,sCAAsC,QAAU,oCAAoC,MAAQ,mCC+EtP,QArDiC3Z,EAAAA,EAAAA,aAI/B,CAAC,EAaC7B,KAAG,IAZH,MACEgQ,EADF,GAEErP,EAFF,KAGEiD,EAHF,aAIEoY,EAJF,aAKEC,EALF,mBAMEC,EANF,iBAOET,EAPF,iBAQED,EARF,MASE9E,EAAQ,UACLrW,GACJxB,EAAA,OAGDkB,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,GAAOyX,OACrBpc,EAAAA,cAAAA,QAAAA,CAAOqc,QAASzb,EAAImC,WAAW2B,EAAAA,EAAAA,GAAKC,GAAOsL,MAAOtL,GAAOgS,KACtD1G,GAEO,aAATpM,EACC7D,EAAAA,cAACsc,IAAa/Q,EAAAA,EAAAA,GAAAA,CACZxI,UAAW4B,GAAO4X,UAClBtc,IAAKA,EACLW,GAAIA,EACJ8a,iBAAkBA,EAClBD,iBAAkBA,GACdnb,IAGNN,EAAAA,cAAC6b,IAAKtQ,EAAAA,EAAAA,GAAAA,CACJxI,UAAW4B,GAAO4X,UAClBtc,IAAKA,EACLW,GAAIA,EACJiD,KAAMA,GACFvD,IAGP2b,IAAiBC,GAChBlc,EAAAA,cAAAA,IAAAA,CAAG+C,WAAW2B,EAAAA,EAAAA,GAAKC,GAAO6X,QAAS7X,GAAOgS,KAAUsF,GAErDC,GACClc,EAAAA,cAAAA,IAAAA,CAAG+C,UAAW4B,GAAO8X,MAAO,cAAaN,GACtCD,mBCxEX,OAA2F,6CCwB3F,MAAMQ,GAAa,4CAENC,GAAmC,gCA+YhD,OA1W8B7d,IAyBvB,IAzBwB,iBAC7B8d,EAD6B,iBAE7BC,EAF6B,SAG7BC,EAH6B,UAI7BC,EAJ6B,OAK7BC,EAL6B,KAM7BC,EAN6B,YAO7BC,EAP6B,kBAQ7BC,EAR6B,cAS7BC,EAT6B,MAU7BxO,EAV6B,UAW7B7L,EAX6B,MAY7B4T,EAAQ,OAZqB,SAa7B0G,EAb6B,YAc7B1T,EAd6B,SAe7B2T,GAAW,GAUZxe,EACC,MAAOye,EAAWC,IAAgBnZ,EAAAA,EAAAA,UAAyB,CACzDoZ,MAAO,GACPC,SAAU,GACVZ,SAAU,MAELa,EAAkBC,IAAqBvZ,EAAAA,EAAAA,UAAwB,OAC/DwZ,EAAsBC,IAC3BzZ,EAAAA,EAAAA,UAA2C,OACtC0Z,EAAcC,IAAmB3Z,EAAAA,EAAAA,WAAS,GAE3C4Z,GAAavc,EAAAA,EAAAA,QAAyB,MACtCwc,GAAgBxc,EAAAA,EAAAA,QAAyB,MACzCyc,GAAezc,EAAAA,EAAAA,QAAkB,MAEjC0c,IAAiBvB,GAAoBS,GAErC,SAAElf,IAAaigB,EAAAA,EAAAA,0BACf,EAAEC,IAAMC,EAAAA,EAAAA,0BACR,UAAE7U,EAAF,YAAaU,GAAgBd,KAE7BkV,EAAoBA,CAACrT,EAA0BvK,KAA3B4d,CACxBrT,QAAAA,EACAnI,UAAWX,EAAYC,MACvByH,YAAa4S,GACbvZ,iBAAiB,KACbuG,GAAe,IAAKA,GACxB/I,GAAAA,IAUI6d,EAAwB5f,UAC5B,MAAM6f,OARkB7f,UACpBuf,QACYD,GAAcxc,SAASoX,iBAAmB,GAEnD,GAIsB4F,GAEvBC,ECzH2BC,CAAAA,IACnC,OAAQA,GACN,KAAKC,GAAAA,GACH,MAAO,kBACT,KAAKC,GAAAA,GACH,MAAO,eACT,KAAKC,GAAAA,GACH,MAAO,eACT,KAAKC,GAAAA,GACH,MAAO,gBACT,QACE,MAAO,WD8GOC,CAAqBF,GAAAA,KAC/B,MAAEvB,EAAF,SAASC,EAAT,SAAmBZ,GAAaS,EAEhC4B,EAAW,IAAIC,SACrBD,EAASE,OAAO,wBAAyB,QACzCF,EAASE,OAAO,QAAS5B,GACzB0B,EAASE,OAAO,WAAY3B,GAC5ByB,EAASE,OAAO,uBAAwBX,GACxCS,EAASE,OAAO,2BAA4B,MAC5CF,EAASE,OAAOvC,EAAUA,GAC1BqC,EAASE,OAAO,OAAQnO,OAAO+L,IAC/BkC,EAASE,OAAO,qBAAsBnO,OAAOkM,IAEzCL,GACFoC,EAASE,OAAO,UAAW,QAExBC,GAAMtC,IACTmC,EAASE,OAAO,UAAWnO,OAAO8L,IAE/BsC,GAAMpC,IACTiC,EAASE,OAAO,eAAgBnO,OAAOgM,IAEpCoC,GAAMnC,IACTgC,EAASE,OAAO,sBAAuBnO,OAAOiM,IAGhD,IACE,MAAMoC,OE5IkB1gB,OAAAA,IAQc,IARP,SACnCsgB,EADmC,IAEnCK,EAFmC,SAGnCphB,GAKDU,EACC,OAAO,IAAIyF,SAAQ,CAACC,EAASwU,MAC3ByG,EAAAA,GAAAA,GAAU,CACRjc,QAAS,CACPkc,QAAS,CAAE,eAAgB,0BAG5BC,KAAKH,EAAKL,GACVS,MAAML,IACL/a,EAAQ+a,EAASM,SAElBC,OAAOrD,IACNre,EAASqe,GACTzD,EAAOyD,UFuHcsD,CAAe,CACpCZ,SAAAA,EACAK,IAAK5C,EACLxe,SAAAA,IAGF,GAAI,UAAWmhB,EAGb7V,EAAU8U,EAAkBe,EAAS9C,MAAO,yBAC5CuB,GAAgB,OACX,CACL,MAAM,SAAEgC,EAAF,KAAYC,GAASV,EAC3B3Q,EAAM,CACJsR,OAAQ,WACRtB,QAAAA,EACAuB,WAAY,CACVC,UAAWJ,EACXK,aAAcJ,KAKlB3hB,OAAOgiB,SAASvQ,KAAOkQ,GAEzB,MAAOxD,GACPre,EAASqe,GAGT/S,EACE8U,EACEF,EAAG,GAAE5B,oBACL,yBAGJsB,GAAgB,KAeduC,EAAgB1hB,UACpB,MAAM,MAAE4e,GAAUF,EAClB,GAAIM,EAGF,OAAOA,EACF,CACL,IAAI2C,GAAe,EACfC,GAAkB,EAClBjE,EAAU,KAEd,GAAMiB,GAASA,EAAMthB,OAAS,EAGvB,GAAKukB,GAAAA,EAAwBjD,GAIlC,IACE,MAAMkD,OEvLwB9hB,OAAAA,GAC/B,IAAI0F,SAAQ,CAACC,EAASwU,MAC3ByG,EAAAA,GAAAA,KACGmB,IAAI,yBAA0B,CAAEC,OAAQ,CAAEpD,MAAAA,KAC1CmC,MAAKzhB,IAAkC,IAAjC,KAAE0hB,GAAyB1hB,EAChCqG,EAAQqb,MAETC,OAAOrD,IACNzD,EAAOyD,SF+KuBqE,CAAyBrD,GAChDkD,IACHnE,EAAU8B,EAAG,GAAE5B,kBACf+D,GAAkB,GAEpB,MAAOhE,GACPre,EAASqe,GACT+D,GAAe,EAGf9W,EACE8U,EACEF,EAAG,GAAE5B,oBACL,wCAjBNF,EAAU8B,EAAG,GAAE5B,oBACf8D,GAAe,OAJfhE,EAAU8B,EAAG,GAAE5B,qBACf8D,GAAe,EAyBjB,OADA1C,EAAwB,CAAE2C,gBAAAA,EAAiBD,aAAAA,EAAchE,QAAAA,IAClD,CAAEA,QAAAA,EAASgE,aAAAA,EAAcC,gBAAAA,KAY9BM,EAAmBA,KACvB,MAAM,SAAErD,GAAaH,EAErB,IAAKI,EAAkB,CAErB,IAAIqD,GAAkB,EAClBC,EAAwB,KAY5B,OAXMvD,GAAYA,EAASvhB,OAAS,EAGzBuhB,EAASvhB,OAAS,IAC3B8kB,EAAwB3C,EAAG,GAAE5B,0BAC7BsE,GAAkB,GACTtD,EAASvhB,OAAS,IAC3B8kB,EAAwB3C,EAAG,GAAE5B,0BAC7BsE,GAAkB,IAPlBC,EAAwB3C,EAAG,GAAE5B,wBAC7BsE,GAAkB,GAQpBpD,EAAkBqD,GACXD,EAET,OAAO,GAqDHE,EAAqBC,IACzB,MAAM,OAAE1V,GAAW0V,GACb,KAAEpiB,GAAS0M,EAIjB+R,GAAc1B,IACL,IAAKA,EAAM,CAAC/c,IAAS+d,EAAW,WAAa/d,GAAO0M,EAAO1O,UAIvD,UAATgC,GAAoB8e,GAAsBrB,QAC5CsB,EAAwB,MACfH,GACTC,EAAkB,MAGpBxT,EAAYuS,KAGd,OACE3c,EAAAA,cAAAA,OAAAA,CACE+C,UAAWA,EACXqe,SA5DyBviB,MAAAA,IAG3BsiB,EAAME,iBACNrD,GAAgB,GAEhB,MAAM,aAAEwC,EAAF,gBAAgBQ,EAAhB,gBAAiCP,QAnBpB5hB,WACZ,UACK0hB,IACVS,gBAAiBD,MAiBXO,GAER1S,EAAM,CACJsR,OAAQ,QACRtB,QAAS,SACTuB,WAAY,CACVoB,eAAgBf,EAChBgB,kBAAmBR,EACnBS,kBAAmBhB,KAInBD,IAAiBC,GAAmBO,EACtCvC,KAEAT,GAAgB,GAEZG,EAAaxc,SACfwc,EAAaxc,QAAQwX,QAElB6H,GACH9C,GAAevc,SAAS+f,QAGrBlB,IAAgBC,GACnBxC,GAAYtc,SAAS+f,UA6BvBC,YAAY,GAEZ3hB,EAAAA,cAAC4hB,GAAiB,CAChB3R,MAAOqO,EAAG,GAAE5B,kBACZ9b,GAAK,GAAEyc,UACP,UAAQ,QACRte,KAAK,QACL8E,KAAK,QACL5D,IAAKge,EACL4D,YAAavD,EAAG,GAAE5B,wBAClBjD,SAAUyH,EACVY,OAAQvB,EACRrE,aAAc2B,GAAsBrB,QACpCL,mBAAmB,sBACnB4F,aAAa,WACbpL,MAAOA,IAGT3W,EAAAA,cAAC4hB,GAAiB,CAChB3R,MAAOqO,EAAG,GAAE5B,qBACZ9b,GAAK,GAAEyc,iBACP,UAAQ,WACRte,KAAK,WACL8E,KAAK,WACL5D,IAAKie,EACL2D,YAAavD,EAAG,GAAE5B,2BAClBjD,SAAUyH,EACVY,OAAQf,EACR9E,aAAcqC,EAAG,GAAE5B,kCACnBR,aAAcyB,EACdxB,mBAAmB,yBACnB4F,aAAa,eACbtG,iBAAkB6C,EAAG,GAAE5B,oBACvBhB,iBAAkB4C,EAAG,GAAE5B,oBACvB/F,MAAOA,IAOT3W,EAAAA,cAAAA,MAAAA,CAAK+B,MAAO,CAAEigB,QAAS,SACrBhiB,EAAAA,cAAAA,QAAAA,CAAOqc,QAAU,GAAEgB,KAAYP,KAAaA,GAC5C9c,EAAAA,cAAAA,QAAAA,CACEjB,KAAM+d,EACNlc,GAAK,GAAEyc,KAAYP,IACnBrD,SAAUyH,KAIb9C,GACCpe,EAAAA,cAAC2X,GAAS,CACR1X,IAAKke,EACLtE,QAASgD,EACT1c,KAAK,YACLS,GAAK,GAAEyc,gBAIXrd,EAAAA,cAACqW,GAAAA,EAAM,CACLxS,KAAK,SACLuS,QAAQ,UACRxV,GAAK,GAAEyc,kBACP,UAAQ,sBACRta,UAAW4B,GACXkL,SAAUkO,GAETA,EAAe/d,EAAAA,cAACiiB,GAAAA,EAAO,MAAM3D,EAAG,GAAE5B,iBGna3C,GAAiC,wCC+BjC,OArBuB5d,IAAyC,IAAxC,UAAEiE,GAAgCjE,EACxD,MAAM,EAAEwf,IAAMC,EAAAA,EAAAA,yBAER2D,EAAa5D,EACjB,yDACA,CAAE6D,WAAY,iBAGVC,EAAe9D,EACnB,6DACA,CAAE+D,aAAc,mBAGlB,OACEriB,EAAAA,cAAAA,IAAAA,CAAG+C,WAAW2B,EAAAA,EAAAA,GAAKC,GAAuB5B,IACxC/C,EAAAA,cAACsiB,GAAM,CAACC,QAAQ,EAAMpX,QAAS+W,IAAe,IAC9CliB,EAAAA,cAACsiB,GAAM,CAACC,QAAQ,EAAMpX,QAASiX,kBC1BrC,GAA8B,kCAA9B,GAA4E,gCAA5E,GAA4H,oCAA5H,GAA8K,kCAA9K,GAA8N,kCAA9N,GAAwQ,4BAAxQ,GAAiT,iCAAjT,GAAgW,kCAAhW,GAA8Y,gCAA9Y,GAA+b,qCC8B/b,MAAMI,GAAUC,EAAQ,OAclBC,GAAe,CAACzD,GAAAA,GAAQF,GAAAA,GAAOD,GAAAA,IAmKrC,OAjKoBhgB,IAMK,IANJ,UACnBiE,EADmB,kBAEnB4f,EAFmB,WAGnBC,EAHmB,SAInBC,KACGviB,GACcxB,EACjB,MAAQ8P,MAAOkU,IAAWC,EAAAA,EAAAA,uBACpB,EAAEzE,IAAMC,EAAAA,EAAAA,0BACR,SAAEngB,IAAaigB,EAAAA,EAAAA,0BACb9e,OAAQyjB,GAAgB5jB,EAASwjB,EAAYxkB,IAE/C,kBACJ6kB,EADI,mBAEJC,EAFI,QAGJ9M,EAHI,WAIJ+M,EAJI,cAKJC,EALI,mBAMJC,EANI,mBAOJC,IACEC,EAAAA,GAAAA,MAME3U,GAAQ3I,EAAAA,EAAAA,cACXud,IACCV,EAAO,CACLD,SAAAA,EACAY,KAAM,kBACHD,EACHrD,WAAY,CACVuD,aAActN,KACXoN,EAAOrD,gBAIhB,CAAC2C,EAAQD,EAAUzM,KAerB9W,EAAAA,EAAAA,YAAU,KACJ2jB,IAEFrU,EAAM,CAAEsR,OAAQ,iBAEsC,SAAlDyD,eAAeC,QAAQC,GAAAA,KAEzBF,eAAeG,QAAQD,GAAAA,GAAuB,WAGjD,CAACZ,EAAmBrU,IAEvB,MAAMmV,GAAYzZ,EAAAA,EAAAA,UAAQ,IACpB+Y,IAAuBC,EACjB,mBAAkBU,mBAAmBX,KAExC,UACN,CAACA,EAAoBC,IAExB,OACEtjB,EAAAA,cAACyJ,GAAa,KACZzJ,EAAAA,cAACikB,EAAAA,GAAK,CACJC,OAAQjB,EACRkB,UAAWjB,EACX,kBAAgB,uBAChBngB,UAAW4B,IAEX3E,EAAAA,cAACokB,EAAAA,GAAS,CAACrhB,WAAW2B,EAAAA,EAAAA,GAAKC,GAAkB5B,IAC3C/C,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,IACd3E,EAAAA,cAACqkB,GAAAA,EAAU,CACTtU,KAAMgU,EACN3N,QAAQ,OACRrT,UAAW4B,GACXY,QAASA,IAAMqJ,EAAM,CAAEsR,OAAQ,QAAStB,QAAS,WAEhDN,EAAG,yBAENte,EAAAA,cAACqW,GAAAA,EAAM,CACL9Q,QAASA,KACPqJ,EAAM,CAAEsR,OAAQ,QAAStB,QAAS,gBAClCsE,KAEFrf,KAAK,SACLuS,QAAQ,OACRrT,UAAW4B,GACXvE,MAAOke,EAAG,uBACV,UAAQ,8BAERte,EAAAA,cAACqF,EAAc,KAAEiZ,EAAG,wBACpBte,EAAAA,cAACskB,GAAwB,CAAC7jB,KAAMP,GAAAA,OAIpCF,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,IACD,mBAAZyR,EACCpW,EAAAA,cAACukB,EAAAA,EAAM,CAAC3lB,IAAKwkB,EAAevf,KAAK,YAEjC7D,EAAAA,cAAAA,MAAAA,CAAKpB,IAAK4jB,GAASlT,IAAI,GAAG5O,MAAM,OAAOC,OAAO,SAEhDX,EAAAA,cAAAA,KAAAA,CAAIY,GAAG,wBACLZ,EAAAA,cAACsiB,GAAM,CACLnX,QAASmT,EACN,iBAAgBlI,eACjB+M,EAAW/M,IAEbmM,QAAQ,KAGZviB,EAAAA,cAAAA,IAAAA,KAAIse,EAAG,iBAAgBlI,gBAGzBpW,EAAAA,cAAC2K,GAAc,CAACZ,YAAa4S,KAE7B3c,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,IACb+d,GAAaxX,KAAK2T,GACjB7e,EAAAA,cAACwkB,GAAiB,CAChBpO,QAASyI,EACTtZ,QAASA,IAxFrBsZ,CAAAA,IAEAjQ,EAAM,CAAEsR,OAAQ,QAAStB,QAAU,GAAEC,aAEjCA,IAAWE,GAAAA,GACbiE,IAEA1kB,OAAOgiB,SAAStJ,OAAO2L,EAAkB9D,KAiFhB4F,CAAsB5F,GACrC,cAAc,GAAEA,aAChBrT,IAAKqT,GAEJP,EAAG,6BAA4BO,aAKtC7e,EAAAA,cAAC0kB,GAAS,CACRvP,KAAMmJ,EAAG,uCACT3H,MAAM,QACN5T,UAAW4B,KAGb3E,EAAAA,cAAC2kB,IAAqBpZ,EAAAA,EAAAA,GAAAA,CACpBqR,iBAAkB+F,EAAkBlF,MACpC7O,MAAOA,EACPyO,SAAS,gBACT1G,MAAM,QACNhN,YAAa,CAAE5G,UAAW4B,GAAcxB,gBAAiB,WACrD7C,IAGNN,EAAAA,cAAC4kB,GAAc,CAAC7hB,UAAW4B,wGCrMfjJ,OAAOgL,OAAO,CAClCC,IAAK,MACLC,MAAO,QACPC,aAAc,iBACdC,UAAW,cARN,MAYMC,EAASrL,OAAOgL,OAAO,CAClCM,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,MAAO,SACPC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNE,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,UCdK+c,GDmBmBnpB,OAAOgL,OAAO,CAC5CqB,GAAI,CAAChB,EAAOC,MAEZgB,GAAI,CAACjB,EAAOI,KAAMJ,EAAOK,OACzBa,GAAI,CAAClB,EAAOM,MACZa,GAAI,CAACnB,EAAOO,MACZa,GAAI,CAACpB,EAAOQ,MACZc,GAAI,CAACtB,EAAOU,MACZa,GAAI,CAACvB,EAAOY,KAAMZ,EAAOW,MACzBa,GAAI,CAACxB,EAAOa,MACZY,GAAI,CAACzB,EAAOc,KAAMd,EAAOe,QAKOpM,OAAOgL,OAAO,CAC9Coe,IAAK,MACLlc,QAAS,UACTmc,QAAS,UACTC,OAAQ,SACRC,OAAQ,WAMwBvpB,OAAOgL,OAAO,CAC9C+B,QAAS,UACTC,SAAU,YACVC,SAAU,YACVuc,SAAU,cAKaxpB,OAAOgL,OAAO,CACrCkC,QAAS,UACTC,OAAQ,SACRC,KAAM,SAI0BpN,OAAOgL,OAAO,CAC9CqC,OAAQ,SACRC,QAAS,UACTC,OAAQ,WAwByBvN,OAAOgL,OAAO,CAC/CwC,SAAU,cCzFU,SAACsT,EAA0B2I,QAAI,IAAJA,IAAAA,GAAO,KCwSjD,MChQDC,GAAqBhc,EAAAA,EAAAA,oBACzBtM,GAEFsoB,EAAmB/b,YAAc,qBAE1B,MAAMka,EAAwBA,KACnC,MAAMha,GAAUC,EAAAA,EAAAA,YAAW4b,GAG3B,IAAK7b,EACH,MAAM,IAAIrK,MACR,6EAIJ,OAAOqK,GAGI8b,EAA+B,2BAmC/BC,EAA6BxmB,IAQF,IARG,SACzCgE,EADyC,4BAEzCyiB,EAFyC,cAGzCnC,EAHyC,aAIzCoC,EAAe,GACfnC,mBAAoBoC,EALqB,mBAMzCnC,GAAqB,EANoB,UAOzCa,EAAYA,UACoBrlB,EAChC,MAAOmkB,EAAmByC,IAAwBrhB,EAAAA,EAAAA,WAAS,IACpDgf,EAAoBsC,IAAyBthB,EAAAA,EAAAA,UAClDohB,GAAuB,KAElBrP,EAASwP,IAAcvhB,EAAAA,EAAAA,UAA8B,WAEtDwhB,GAA4Bvb,EAAAA,EAAAA,UAChC,ID2MqCwb,MACvC,MAAMC,EAAO,OACb,IAGE,OAFApC,eAAeG,QAAQiC,EAAMA,GAC7BpC,eAAeqC,WAAWD,IACnB,EACP,MAAO3oB,GACP,OAAO,IClND0oB,IACN,IAGIG,GAAqBhgB,EAAAA,EAAAA,cACxBigB,GD6WyCC,EAC5C3G,EACA4G,KAEA,IACE,MAAM,KAAEC,GAAS,IAAIC,IAAI9G,GAEzB,QAAI,gBAAgBuG,KAAKM,OAIrB,YAAYN,KAAKM,KAAS,SAASN,KAAKM,MACnC,YAAYN,KAAKK,IAAgB,SAASL,KAAKK,IAGxD,MAAO3J,GAEP,OADAoI,EAAO3T,OAAOuL,KACP,IC7XL0J,CACED,EACA,IAAII,IAAIhoB,QAAQgiB,UAAUvQ,MAAMsW,OAEpC,IAGIE,GAA+BtgB,EAAAA,EAAAA,cAClCigB,IACKL,IACEI,EAAmBC,IACrBvC,eAAeG,QAAQuB,EAA8Ba,GACrDrB,KAEAA,OAIN,CAACoB,EAAoBJ,KAMvBvmB,EAAAA,EAAAA,YAAU,KACR,IAAKgkB,EAAoB,CACvB,MAAM4C,EAAcD,EAAmB5C,GACnCA,EACA/kB,QAAQgiB,UAAUvQ,KACtBwW,EAA6BL,GAC7BP,EAAsBO,MAEvB,CACD7C,EACA4C,EACAM,EACAjD,IAGF,MAAMkD,GAAkBvgB,EAAAA,EAAAA,cACrBwgB,IACCf,GAAqB,GACrBE,EAAWa,GAGP/qB,OAAOuV,KAAKuU,GAAcrS,SAASsT,IACrCF,EAA6Bf,EAAaiB,MAG9C,CAACjB,EAAce,IAGXrD,GAAqBjd,EAAAA,EAAAA,cAAY,KACrCke,IACAuB,GAAqB,GAGjBhqB,OAAOuV,KAAKuU,GAAcrS,SAASiD,KACjCkN,EACFK,eAAeqC,WAAWX,GAE1BkB,EAA6BlD,MAGhC,CACDA,EACAc,EACAqB,EACAe,EACAjD,EACAlN,IAGI/L,GAAgBC,EAAAA,EAAAA,UACpB,MACEkc,gBAAAA,EACAtD,mBAAAA,EACAD,kBAAAA,EACA7M,QAAAA,EACA+M,WAAY,CACVuD,QAAS,GACTC,qBAAsB,GACtBC,eAAgB,CAAE7nB,KAAMwmB,GACxBsB,eAAgB,GAChBC,cAAe,GACfC,cAAe,IAEjB3D,cAAAA,EACAC,mBAAAA,EACAC,mBAAAA,KAEF,CACEkD,EACAtD,EACAD,EACA7M,EACAmP,EACAnC,EACAC,EACAC,IAIJ,OACEtjB,EAAAA,cAAColB,EAAmB7a,SAAQ,CAACxN,MAAOsN,GACjCvH,4JCvOA,MAAMic,EAAQ,QACRC,EAAQ,QACRF,EAAW,WACXG,EAAS,SAGT4E,EAAwB,oGCJrC,MAAMmD,EAAmChnB,EAAAA,YACvC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,qrBACFL,KAAK,SAKbumB,EAAiCjmB,aAAe,CAC9Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXkqB,EAAiChmB,UAAY,CAC3Cd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,wFChCA,MAAMgmB,EAA+BjnB,EAAAA,YACnC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,uGACFL,KAAK,KAEPT,EAAAA,cAAAA,OAAAA,CACEc,EAAE,oEACFL,KAAK,SAKbwmB,EAA6BlmB,aAAe,CAC1Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXmqB,EAA6BjmB,UAAY,CACvCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,wFCpCA,MAAMimB,EAA4BlnB,EAAAA,YAChC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,8pBACFL,KAAK,SAKbymB,EAA0BnmB,aAAe,CACvCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXoqB,EAA0BlmB,UAAY,CACpCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,wFChCA,MAAMkmB,EAAmCnnB,EAAAA,YACvC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CAAMc,EAAE,uBAAuBL,KAAK,KACpCT,EAAAA,cAAAA,OAAAA,CACEa,SAAS,UACTsV,SAAS,UACTrV,EAAE,yOACFL,KAAK,SAKb0mB,EAAiCpmB,aAAe,CAC9Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXqqB,EAAiCnmB,UAAY,CAC3Cd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,mECtCO,MACMmmB,EAAiB,8GCC9B,MAAMC,EAAwCrnB,EAAAA,YAC5C,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACES,KAAMP,EACNK,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLS,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,OAAAA,CACEc,EAAE,4NACFL,KAAK,SAKb4mB,EAAsCtmB,aAAe,CACnDb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXuqB,EAAsCrmB,UAAY,CAChDd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QChCA,MAAMqmB,EAAoCtnB,EAAAA,YACxC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACEO,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLQ,KAAMP,EACNQ,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,IAAAA,CAAGS,KAAK,OAAOI,SAAS,WACtBb,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,kKAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,gKAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,qJAMZwmB,EAAkCvmB,aAAe,CAC/Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXwqB,EAAkCtmB,UAAY,CAC5Cd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QC1CA,MAAMsmB,EAAiCvnB,EAAAA,YACrC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACEO,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLQ,KAAMP,EACNQ,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,IAAAA,CAAGS,KAAK,OAAOI,SAAS,WACtBb,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,kKAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,gGAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,qGAMZymB,EAA+BxmB,aAAe,CAC5Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEXyqB,EAA+BvmB,UAAY,CACzCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QC1CA,MAAMumB,EAA8BxnB,EAAAA,YAClC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACEO,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLQ,KAAMP,EACNQ,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,IAAAA,CAAGS,KAAK,OAAOI,SAAS,WACtBb,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,kKAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,uIAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,mJAMZ0mB,EAA4BzmB,aAAe,CACzCb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEX0qB,EAA4BxmB,UAAY,CACtCd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,QC1CA,MAAMwmB,EAAmCznB,EAAAA,YACvC,CAAC,EAA2CC,KAAG,IAA9C,MAAEC,EAAF,KAASC,EAAT,MAAeC,EAAf,QAAsBC,KAAYC,GAAOxB,EAAA,OACxCkB,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACEO,MAAM,6BACNC,QAAQ,YACRP,IAAKA,EACLQ,KAAMP,EACNQ,MAAOP,EACPQ,OAAQR,EACR,kBAAiBE,GACbC,GAEHF,EAAQJ,EAAAA,cAAAA,QAAAA,CAAOY,GAAIP,GAAUD,GAAiB,KAC/CJ,EAAAA,cAAAA,IAAAA,CAAGS,KAAK,OAAOI,SAAS,WACtBb,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,wZAEJd,EAAAA,cAAAA,OAAAA,CACES,KAAK,UACLK,EAAE,siBAMZ2mB,EAAiC1mB,aAAe,CAC9Cb,MAAO,eACPC,KAAM,GACNC,WAAOtD,EACPuD,aAASvD,GAEX2qB,EAAiCzmB,UAAY,CAC3Cd,MAAOe,IAAAA,OACPd,KAAMc,IAAAA,OACNb,MAAOa,IAAAA,OACPZ,QAASY,IAAAA,QAEX,mBCvCA,GAAgB,OAAS,wBAAwB,WAAa,4BAA4B,MAAQ,uBAAuB,QAAU,yBAAyB,OAAS,wBAAwB,MAAQ,uBAAuB,MAAQ,uBAAuB,OAAS,wBAAwB,KAAO,sBAAsB,QAAU,0BCiBnU,MAAMymB,EAAM5oB,IAAqD,IAApD,IAAEF,EAAF,IAAO0Q,EAAP,MAAYlP,EAAZ,SAAmBkW,EAAW,MAAgBxX,EACzD,MAAOgE,EAAU6kB,GCMjBC,CAAAA,IAEA,MAAMC,GAAanmB,EAAAA,EAAAA,SAAO,IACnBrC,EAAO0G,IAAY1B,EAAAA,EAAAA,UAASujB,GAenC,OAbAtoB,EAAAA,EAAAA,YAAU,KACRuoB,EAAWlmB,SAAU,EACd,KACLkmB,EAAWlmB,SAAU,KAEtB,IAQI,CAACtC,GANa4G,EAAAA,EAAAA,cAClBnI,GACC+pB,EAAWlmB,QAAUoE,EAASjI,GAAQ,QACxC,MDrB8BgqB,CAC9B9nB,EAAAA,cAAAA,MAAAA,CAAKpB,IAAKA,EAAK0Q,IAAKA,EAAKlP,MAAOA,KAiBlC,OAdAd,EAAAA,EAAAA,YAAU,KACR,IAAIyoB,EAAiC,IAAIC,MAQzC,OAPAD,EAAME,OAAS,KACbN,EAAY3nB,EAAAA,cAAAA,MAAAA,CAAKpB,IAAKA,EAAK0Q,IAAKA,EAAKlP,MAAOA,MAE9C2nB,EAAMG,QAAU,KACdP,EAAYrR,IAEdyR,EAAMnpB,IAAMA,EACL,KACLmpB,EAAQ,QAET,CAACnpB,EAAK0Q,EAAKlP,EAAOkW,IAEdtW,EAAAA,cAAAA,EAAAA,SAAAA,KAAG8C,IAsHZ,MA1De3E,IAUK,IAVJ,KACdY,EAAO,GADO,IAEduQ,EAAM,GAFQ,MAGdlP,EAHc,KAIdyD,EAJc,IAKdjF,EALc,KAMduB,EANc,MAOd8Z,EAPc,UAQdlX,KACGolB,GACShqB,EACZ,MAAMiqB,GAAa1jB,EAAAA,EAAAA,GAAK,CACtBC,EAAO0jB,OACP1jB,EAAOd,GACPd,EACA5C,GAAQwE,EAAOxE,KAUX2C,EACJ9C,EAAAA,cAAAA,EAAAA,SAAAA,KACGia,GAASja,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,EAAOsV,OApFvC,SAAkBA,GAChB,OAAQA,GACN,IAAK,aAOL,IAAK,MACH,OAAOja,EAAAA,cAACsoB,EAAQ,MANlB,IAAK,WACH,OAAOtoB,EAAAA,cAACuoB,EAAa,MACvB,IAAK,aACL,IAAK,UACH,OAAOvoB,EAAAA,cAACwoB,EAAe,MAGzB,IAAK,WACH,OAAOxoB,EAAAA,cAACyoB,EAAa,MACvB,QACE,OAAO,MAsEkCC,CAASzO,IAClDja,EAAAA,cAAAA,MAAAA,CAAK+C,UAAW4B,EAAOgkB,YACrB3oB,EAAAA,cAAC0nB,EAAG,CACF9oB,IAAKA,EACL0Q,IAAKA,EACLlP,MAAOA,GAASrB,EAChBuX,SAAmB,YAATzS,EAAqB7D,EAAAA,cAAC4oB,EAAc,MAAM,SAM5D,MA/CA,SA+CYT,EAERnoB,EAAAA,cAAAA,KAAAA,EAAAA,EAAAA,GAAAA,CAAG+C,UAAWqlB,EAAY,cAAY,kBAAqBD,GACxDrlB,GAML9C,EAAAA,cAAAA,OAAAA,EAAAA,EAAAA,GAAAA,CACE+C,UAAWqlB,EACX,cAAY,kBACPD,GAEJrlB,+JEhIP,EAJU,WACR,OAAO+lB,EAAAA,EAAKC,KAAKC,OClBfC,EAAe,KAiBnB,MAPA,SAAyBhrB,GAGvB,IAFA,IAAI9B,EAAQ8B,EAAO7B,OAEZD,KAAW8sB,EAAajD,KAAK/nB,EAAOirB,OAAO/sB,MAClD,OAAOA,GCZLgtB,EAAc,OAelB,MANA,SAAkBlrB,GAChB,OAAOA,EACHA,EAAOqI,MAAM,EAAG8iB,EAAgBnrB,GAAU,GAAGC,QAAQirB,EAAa,IAClElrB,yBCaN,MALA,SAAkBjB,GAChB,MAAuB,iBAATA,IACXQ,EAAAA,EAAAA,GAAaR,IArBF,oBAqBYS,EAAAA,EAAAA,GAAWT,ICjBnCqsB,EAAa,qBAGbC,EAAa,aAGbC,EAAY,cAGZC,EAAeC,SA8CnB,MArBA,SAAkBzsB,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,GAAIc,EAASd,GACX,OA1CM,IA4CR,IAAI0sB,EAAAA,EAAAA,GAAS1sB,GAAQ,CACnB,IAAI2sB,EAAgC,mBAAjB3sB,EAAM4sB,QAAwB5sB,EAAM4sB,UAAY5sB,EACnEA,GAAQ0sB,EAAAA,EAAAA,GAASC,GAAUA,EAAQ,GAAMA,EAE3C,GAAoB,iBAAT3sB,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQ6sB,EAAS7sB,GACjB,IAAI8sB,EAAWR,EAAWtD,KAAKhpB,GAC/B,OAAQ8sB,GAAYP,EAAUvD,KAAKhpB,GAC/BwsB,EAAaxsB,EAAMsJ,MAAM,GAAIwjB,EAAW,EAAI,GAC3CT,EAAWrD,KAAKhpB,GAvDb,KAuD6BA,GCpDnC+sB,EAAYlgB,KAAKmgB,IACjBC,EAAYpgB,KAAKqgB,IAqLrB,MA7HA,SAAkBC,EAAMC,EAAM3mB,GAC5B,IAAI4mB,EACAC,EACAC,EACAluB,EACAmuB,EACAC,EACAC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAEf,GAAmB,mBAARV,EACT,MAAM,IAAIW,UAzEQ,uBAmFpB,SAASC,EAAWC,GAClB,IAAIjtB,EAAOssB,EACPY,EAAUX,EAKd,OAHAD,EAAWC,OAAWvtB,EACtB2tB,EAAiBM,EACjB3uB,EAAS8tB,EAAKlZ,MAAMga,EAASltB,GAI/B,SAASmtB,EAAYF,GAMnB,OAJAN,EAAiBM,EAEjBR,EAAU9lB,WAAWymB,EAAcf,GAE5BO,EAAUI,EAAWC,GAAQ3uB,EAatC,SAAS+uB,EAAaJ,GACpB,IAAIK,EAAoBL,EAAOP,EAM/B,YAAyB1tB,IAAjB0tB,GAA+BY,GAAqBjB,GACzDiB,EAAoB,GAAOT,GANJI,EAAON,GAM8BH,EAGjE,SAASY,IACP,IAAIH,EAAOhC,IACX,GAAIoC,EAAaJ,GACf,OAAOM,EAAaN,GAGtBR,EAAU9lB,WAAWymB,EA3BvB,SAAuBH,GACrB,IAEIO,EAAcnB,GAFMY,EAAOP,GAI/B,OAAOG,EACHX,EAAUsB,EAAahB,GAJDS,EAAON,IAK7Ba,EAoB+BC,CAAcR,IAGnD,SAASM,EAAaN,GAKpB,OAJAR,OAAUztB,EAIN8tB,GAAYR,EACPU,EAAWC,IAEpBX,EAAWC,OAAWvtB,EACfV,GAeT,SAASovB,IACP,IAAIT,EAAOhC,IACP0C,EAAaN,EAAaJ,GAM9B,GAJAX,EAAWrsB,UACXssB,EAAWlT,KACXqT,EAAeO,EAEXU,EAAY,CACd,QAAgB3uB,IAAZytB,EACF,OAAOU,EAAYT,GAErB,GAAIG,EAIF,OAFAe,aAAanB,GACbA,EAAU9lB,WAAWymB,EAAcf,GAC5BW,EAAWN,GAMtB,YAHgB1tB,IAAZytB,IACFA,EAAU9lB,WAAWymB,EAAcf,IAE9B/tB,EAIT,OA3GA+tB,EAAOwB,EAASxB,IAAS,GACrBV,EAAAA,EAAAA,GAASjmB,KACXknB,IAAYlnB,EAAQknB,QAEpBJ,GADAK,EAAS,YAAannB,GACHsmB,EAAU6B,EAASnoB,EAAQ8mB,UAAY,EAAGH,GAAQG,EACrEM,EAAW,aAAcpnB,IAAYA,EAAQonB,SAAWA,GAoG1DY,EAAUI,OApCV,gBACkB9uB,IAAZytB,GACFmB,aAAanB,GAEfE,EAAiB,EACjBL,EAAWI,EAAeH,EAAWE,OAAUztB,GAgCjD0uB,EAAUK,MA7BV,WACE,YAAmB/uB,IAAZytB,EAAwBnuB,EAASivB,EAAatC,MA6BhDyC,GCvHT,MAlBA,SAAkBtB,EAAMC,EAAM3mB,GAC5B,IAAIknB,GAAU,EACVE,GAAW,EAEf,GAAmB,mBAARV,EACT,MAAM,IAAIW,UAnDQ,uBAyDpB,OAJIpB,EAAAA,EAAAA,GAASjmB,KACXknB,EAAU,YAAalnB,IAAYA,EAAQknB,QAAUA,EACrDE,EAAW,aAAcpnB,IAAYA,EAAQonB,SAAWA,GAEnDkB,EAAS5B,EAAMC,EAAM,CAC1B,QAAWO,EACX,QAAWP,EACX,SAAYS,2BC/DhB,EAAuB,8BCIvB,MAAMmB,EAAOjtB,IAAyD,IAAxD,OAAEktB,EAAF,OAAUC,EAAV,OAAkBC,EAAlB,OAA0BvrB,EAA1B,SAAkCsB,EAAlC,KAA4CxB,GAAM3B,EAC9D,MAAMqtB,EAAaH,EAAOI,mBAAmBlhB,KAAI,CAACmhB,EAAMnwB,KAAP,CAC/CmwB,KAAAA,EACAC,KAAMN,EAAOO,kBAAkBrwB,OAG3BswB,GAAWC,EAAAA,EAAAA,KACdC,GAAG5rB,GAAMmrB,EAAOnrB,EAAEwrB,QAClBK,IAAI7rB,GAAMorB,EAAOprB,EAAEurB,QACnBO,GAAGjsB,GAEN,OACEX,EAAAA,cAAAA,IAAAA,CAAG+C,UAAU,YAAYd,SAAUA,GACjCjC,EAAAA,cAAAA,OAAAA,CAAM+C,UAAW4B,EAAalE,KAAMA,EAAMK,EAAG0rB,EAASL,OAK5DJ,EAAK/qB,UAAY,CACfirB,OAAQhrB,IAAAA,KAAe4Z,WACvBqR,OAAQjrB,IAAAA,KAAe4Z,WACvBla,OAAQM,IAAAA,OAAiB4Z,WACzBmR,OAAQ/qB,IAAAA,QAAkB4Z,WAC1B5Y,SAAUhB,IAAAA,OACVR,KAAMQ,IAAAA,QAGR8qB,EAAKhrB,aAAe,CAClBkB,SAAU,KACVxB,KAAM,6BAGR,8BCpCA,EAAuB,8BAAvB,EAA6D,+BAA7D,EAAoG,+BCKpG,MAAMosB,UAAa7sB,EAAAA,UACjB8sB,UAAY9sB,EAAAA,YAEZ+sB,UAAY/sB,EAAAA,YAEZoa,oBACEjD,KAAK6V,WAGP3S,mBAAmB4S,GACjB,MAAM,QAAEC,EAAF,MAAWxsB,EAAX,OAAkBurB,EAAlB,OAA0BC,GAAW/U,KAAK7W,MAE1C6sB,EACJD,IACCD,EAAUC,QAAQ,KAAOA,EAAQ,IAChCD,EAAUC,QAAQ,KAAOA,EAAQ,IAE/BE,GACHjW,KAAKkW,eAAepB,EAAQgB,EAAUhB,UACtC9U,KAAKkW,eAAenB,EAAQe,EAAUf,QAEnCoB,EAAkBL,EAAUvsB,QAAUA,GAExCysB,GAAmBG,GAAmBF,IACxCjW,KAAK6V,WAITK,eAAiBA,CAACE,EAAQC,IACjBD,EACJE,SACAC,OAAOC,GAAkBH,EAAOC,SAASta,SAASwa,KAGvDX,WACE,MAAM,OAAEf,EAAF,OAAUC,EAAV,MAAkBxrB,EAAlB,WAAyBktB,GAAezW,KAAK7W,OAC7C,mBAAEutB,EAAF,kBAAsBC,GAAsBF,EAC5CG,GAAQC,EAAAA,EAAAA,IAAW/B,GACnBgC,GAAQC,EAAAA,EAAAA,IAAShC,GACjBiC,EAAaztB,EAAQ,IAAM,EAAI,EAErCutB,EACGG,MAAM,GACNC,UAAU3tB,GACV4tB,YAAYlxB,GAGXywB,EAAmBU,YAAYnxB,EAAIywB,EAAmBW,QAAQ,MAGlET,EAAMK,MAAMD,GAAYG,YAAYxtB,GAGlCgtB,EAAkBS,YAAYztB,EAAIgtB,EAAkBU,QAAQ,MAG9DP,GAAMQ,EAAAA,EAAAA,GAAOtX,KAAK4V,UAAUprB,UAC5BosB,GAAMU,EAAAA,EAAAA,GAAOtX,KAAK2V,UAAUnrB,UAG9BgY,SACE,MAAM,OAAEhZ,GAAWwW,KAAK7W,MAExB,OACEN,EAAAA,cAAAA,EAAAA,SAAAA,KACEA,EAAAA,cAAAA,IAAAA,CACEY,GAAG,QACHmC,UAAY,GAAE4B,KAAeA,IAC7B1E,IAAKkX,KAAK4V,YAEZ/sB,EAAAA,cAAAA,IAAAA,CACEY,GAAG,QACHmC,UAAY,GAAE4B,KAAeA,IAC7B1E,IAAKkX,KAAK2V,UACVrY,UAAY,gBAAe9T,SAOrC,QAEAksB,EAAK7rB,UAAY,CACfirB,OAAQhrB,IAAAA,KAAe4Z,WACvBqR,OAAQjrB,IAAAA,KAAe4Z,WACvBla,OAAQM,IAAAA,OAAiB4Z,WACzBna,MAAOO,IAAAA,OAAiB4Z,WACxB+S,WAAY3sB,IAAAA,QAAkB4Z,WAC9BqS,QAASjsB,IAAAA,QAAkBA,IAAAA,SAG7B4rB,EAAK9rB,aAAe,CAClBmsB,QAAS,MClGX,OAAgB,MAAQ,wBAAwB,QAAU,0BAA0B,MAAQ,yBCG5F,MAAMwB,EAAU5vB,IAA+D,IAA9D,QAAEqM,EAAF,SAAWhJ,EAAX,SAAqBF,EAArB,WAA+B0sB,EAA/B,YAA2CC,GAAa9vB,EACvE,MAAM+vB,GAAUntB,EAAAA,EAAAA,QAAO,KAChBotB,EAAUC,IAAe1qB,EAAAA,EAAAA,UAAS,KAInC2qB,EAAa7sB,EAAW2sB,EAAWG,GACnCC,EACJF,GAAcL,EAAaA,EAAaK,EAL1B,KAOhBG,EAAAA,EAAAA,kBAAgB,KACd,GAAIN,EAAQltB,SAA2C,IAAhCjG,OAAOuV,KAAK9F,GAAShP,OAAc,CACxD,MAAMizB,EAASP,EAAQltB,QAAQuJ,KAC5B0I,GAAOA,EAAGyb,wBAAwB3uB,QAE/B4uB,EAAW1lB,KAAKmgB,OAAOqF,GACvBG,EAAU3lB,KAAK4lB,MAAMF,EAAWL,IAClCH,IAAaS,GACfR,EAAYQ,MAGf,CAACpkB,EAAS2jB,IAEb,MAAMW,EAAUA,KACd,MAAMxe,EAAOvV,OAAOuV,KAAK9F,GAEnBukB,EAtBW,GAqBKze,EAAK9U,OAtBb,EAuB2C,EAEzD,OACE6D,EAAAA,cAAAA,IAAAA,CAAG+C,UAAW4B,EAAOgrB,QAASlb,UAAY,aAAYya,SACpDlvB,EAAAA,cAAAA,OAAAA,CAAM0sB,EAAG,EAAGkD,EAAG,EAAGjvB,OAAQ+uB,EAAWhvB,MAAOouB,IAC3C7d,EAAK/F,KAAI,CAAC2kB,EAAM3zB,KACf,MAAM4zB,EAAc3kB,EAAQ0kB,GAM5B,OACE7vB,EAAAA,cAAAA,OAAAA,CACEC,IANJ,SAAgB2T,GACdib,EAAQltB,QAAQzF,GAAS0X,GAMvBpI,IAAKqkB,EACLE,GAAG,MACHtb,UAAY,gBAxCR,EACG,GAwCkBvY,MAGzB8D,EAAAA,cAAAA,QAAAA,KAAQ8vB,EAAY7f,OACpBjQ,EAAAA,cAAAA,QAAAA,CAAO+C,UAAW4B,EAAO5H,MAAOizB,GAAI,GACjCF,EAAY/yB,aAS3B,OACEiD,EAAAA,cAAAA,IAAAA,CAAG+C,UAAW4B,EAAOsrB,MAAOxb,UAAY,aAAYtS,SAClDnC,EAAAA,cAAAA,OAAAA,CACE+C,UAAW4B,EAAOurB,OAClBvD,IAAKiC,EAAYuB,IACjBC,GAAG,OACHC,GAAI,EACJC,GAAI,EACJruB,SAAUA,IAEZjC,EAAAA,cAACyvB,EAAO,QAKd,QAEAf,EAAQ1tB,UAAY,CAClBmK,QAASlK,IAAAA,QAAkB4Z,WAC3B1Y,SAAUlB,IAAAA,OAAiB4Z,WAC3B5Y,SAAUhB,IAAAA,OAAiB4Z,WAC3B8T,WAAY1tB,IAAAA,OAAiB4Z,WAC7B+T,YAAa3tB,IAAAA,MAAgB,CAC3BkvB,IAAKlvB,IAAAA,OACLsvB,MAAOtvB,IAAAA,OACPuvB,OAAQvvB,IAAAA,OACRwvB,KAAMxvB,IAAAA,SACL4Z,2BCzFE,MA2FM6V,EACJ,EADIA,EAEF,EC5FWh1B,OAAOgL,OAAO,CAClCiqB,QAAS,UACTxgB,QAAS,UACTygB,OAAQ,SACRnU,MAAO,UCLgC/gB,OAAOgL,OAAO,CACrDmqB,SAAU,WACVC,UAAW,iBACXC,OAAQ,UACRC,MAAO,SACPC,QAAS,WACT/nB,SAAU,cCFUxN,OAAOgL,OAAO,CAClCC,IAAK,MACLC,MAAO,QACPC,aAAc,iBACdC,UAAW,cARN,MAYMC,EAASrL,OAAOgL,OAAO,CAClCM,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,MAAO,SACPC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNE,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,QACNC,KAAM,UAKwBpM,OAAOgL,OAAO,CAC5CqB,GAAI,CAAChB,EAAOC,MAEZgB,GAAI,CAACjB,EAAOI,KAAMJ,EAAOK,OACzBa,GAAI,CAAClB,EAAOM,MACZa,GAAI,CAACnB,EAAOO,MACZa,GAAI,CAACpB,EAAOQ,MACZc,GAAI,CAACtB,EAAOU,MACZa,GAAI,CAACvB,EAAOY,KAAMZ,EAAOW,MACzBa,GAAI,CAACxB,EAAOa,MACZY,GAAI,CAACzB,EAAOc,KAAMd,EAAOe,QAKOpM,OAAOgL,OAAO,CAC9Coe,IAAK,MACLlc,QAAS,UACTmc,QAAS,UACTC,OAAQ,SACRC,OAAQ,WAMwBvpB,OAAOgL,OAAO,CAC9C+B,QAAS,UACTC,SAAU,YACVC,SAAU,YACVuc,SAAU,cAKaxpB,OAAOgL,OAAO,CACrCkC,QAAS,UACTC,OAAQ,SACRC,KAAM,SAI0BpN,OAAOgL,OAAO,CAC9CqC,OAAQ,SACRC,QAAS,UACTC,OAAQ,WAwByBvN,OAAOgL,OAAO,CAC/CwC,SAAU,cCrG4BxN,OAAOgL,OAAO,CACpDwqB,OAAQ,SACRC,MAAO,QACPC,MAAO,QACPC,OAAQ,SACRC,QAAS,UACTC,MAAO,QACPC,KAAM,OACNC,MAAO,UCPT,MAA8B,qCCQ9B,MAAMC,EAAkB5yB,IAA2C,IAA1C,OAAEktB,EAAF,OAAUC,EAAV,OAAkBC,EAAlB,SAA0BjqB,GAAUnD,EAC3D,MAAM6yB,EAAa3F,EAAOI,mBAAmBlhB,KAAI,CAACmhB,EAAMnwB,KAAP,CAC/CwwB,EAAGV,EAAOO,kBAAkBrwB,GAC5B0zB,EAAGvD,MAGCuF,GAAO/a,EAAAA,EAAAA,KACV6V,GAAG5rB,GAAMmrB,EAAOnrB,EAAE4rB,KAClBkD,GAAG9uB,GAAMorB,EAAOprB,EAAE8uB,KAErB,IAAIiC,EAAS,EACb,MAAMC,EAAe9F,EAAO+F,QAAQ7f,QAAO,CAAC8f,EAAKC,EAAKC,EAAKC,KACzD,MAAMC,EAAOD,EAAID,EAAM,GAkBvB,OAhBKF,EAAIH,KACPG,EAAIH,GAAU,CACZhuB,KAAMouB,EACNpS,KAAM,KAIVmS,EAAIH,GAAQhS,KAAKpK,KAAK,CACpBiX,EAAGV,EAAOO,kBAAkB2F,GAC5BtC,EAAG5D,EAAOI,mBAAmB8F,KAG3BD,IAAQG,IACVP,GAAU,GAGLG,IACN,IAEH,OACEhyB,EAAAA,cAAAA,IAAAA,CAAG+C,UAAW4B,EAAoB1C,SAAUA,GAC1CjC,EAAAA,cAAAA,OAAAA,CACES,KAAK,OACL4xB,OAAQnyB,EAAAA,GACRoyB,YAAa,EACbxxB,EAAG8wB,EAAKD,KAGTG,EAAa5mB,KAAI,CAAC6mB,EAAS71B,IACtBw0B,IAAsBqB,EAAQluB,KAE9B7D,EAAAA,cAAAA,OAAAA,CACEwL,IAAM,GAAEumB,EAAQluB,QAAQ3H,EAAMS,aAC9B8D,KAAK,OACL4xB,OAAQnyB,EAAAA,GACRoyB,YAAa,EACbxxB,EAAG8wB,EAAKG,EAAQlS,QAKlB6Q,IAAwBqB,EAAQluB,KAEhC7D,EAAAA,cAAAA,OAAAA,CACEwL,IAAM,GAAEumB,EAAQluB,QAAQ3H,EAAMS,aAC9B8D,KAAK,OACL4xB,OAAQnyB,EAAAA,GACRoyB,YAAa,EACbC,gBAAiB,CAAC,EAAG,KACrBzxB,EAAG8wB,EAAKG,EAAQlS,QAMpB7f,EAAAA,cAAAA,OAAAA,CACEwL,IAAM,GAAEumB,EAAQluB,QAAQ3H,EAAMS,aAC9B8D,KAAK,OACL4xB,OAAQnyB,EAAAA,GACRoyB,YAAa,EACbxxB,EAAG8wB,EAAKG,EAAQlS,YAQ5B6R,EAAgB1wB,UAAY,CAC1BirB,OAAQhrB,IAAAA,KAAe4Z,WACvBqR,OAAQjrB,IAAAA,KAAe4Z,WACvBmR,OAAQ/qB,IAAAA,QAAkB4Z,WAC1B5Y,SAAUhB,IAAAA,QAGZywB,EAAgB3wB,aAAe,CAC7BkB,SAAU,MAGZ,MAAejC,EAAAA,KAAW0xB,GCrG1B,EAAyB,gCCYzB,MAAMc,UAAuBC,EAAAA,UAC3BpzB,MAAQ,CACN2sB,OAAQ,KACRC,OAAQ,KACRC,OAAQ,KACRvrB,OAAQ,EACRD,MAAO,EACPgyB,eAAgB,KAChBC,eAAgB,MAGlBhhB,UAAY3R,EAAAA,YAEZ4tB,WAAa,KAEbxb,KAAOpS,EAAAA,YAEP4yB,OAAS5yB,EAAAA,YAET6yB,aAAeC,GAAS,KACtB3b,KAAK4b,gBACJ,KAEH3Y,oBACE9b,OAAO00B,iBAAiB,SAAU7b,KAAK0b,cACvC1b,KAAK8b,mBACL9b,KAAK4b,cAGP1Y,mBAAmB,GAKf,IAJF6Y,UAAWC,EACXC,SAAUC,EACVC,MAAOC,EACPC,gBAAiBC,GAClB30B,EACC,MAAM,SAAEs0B,EAAF,UAAYF,EAAZ,MAAuBI,EAAvB,gBAA8BE,GAAoBrc,KAAK7W,MACvDozB,EAAmBP,EAAch3B,SAAW+2B,EAAU/2B,OACtDw3B,EAAkBN,EAAal3B,SAAWi3B,EAASj3B,OACnDy3B,EAAeL,IAAcD,EAUnC,GARIM,GACFzc,KAAK8b,oBAGHS,GAAoBC,GAAmBC,IACzCzc,KAAK4b,cAGHU,IAAwBD,EAC1B,GAAwB,OAApBA,EAEFrc,KAAKpR,SAAS,CAAE2sB,eAAgB,KAAMC,eAAgB,WACjD,CACL,MAAMkB,EAAc1c,KAAK2c,eAAeN,GACxCrc,KAAK4c,qBAAqBF,EAAaL,IAK7CQ,uBACE11B,OAAO21B,oBAAoB,SAAU9c,KAAK0b,cAG5CiB,eAAkBV,IAChB,MAAM,OAAEpH,GAAW7U,KAAK9X,MACxB,OAAOuK,KAAKqgB,KACViK,EAAAA,EAAAA,IAAWlI,EAAOoH,SAAUA,GAC5BpH,EAAOoH,SAASj3B,OAAS,IAK7Bg4B,aAAgB/2B,IACd,MAAM,eAAEg3B,GAAmBjd,KAAK7W,OAC1B,OAAE2rB,GAAW9U,KAAK9X,OAClB,kBAAEyuB,GAAsB3W,KAAKyW,WAC7ByG,EAASld,KAAKyb,OAAOjxB,QAAQ0tB,wBAC7BiF,EAAiBl3B,EAAEm3B,QAAUF,EAAO5D,KAIpC2C,EAHanH,EAAOuI,OAAOF,GAGHxG,EAAkBU,QAAQ,GAClDqF,EAAc1c,KAAK2c,eAAeV,IAEnB,IAAjBS,GAAsB7f,OAAOygB,MAAMrB,KAIvCgB,EAAeP,EAAa,CAAET,SAAAA,IAC9Bjc,KAAK4c,qBAAqBF,EAAaT,KAGzCW,qBAAuBA,CAACF,EAAaT,KACnC,MAAM,qBACJsB,EADI,sBAEJC,EAFI,kBAGJC,EAHI,oBAIJC,EAJI,oBAKJC,GACE3d,KAAK7W,OACH,OAAE0rB,EAAF,OAAUC,GAAW9U,KAAK9X,OAC1B,mBAAEwuB,EAAF,kBAAsBC,EAAtB,sBAAyCiH,GAC7C5d,KAAKyW,WAEDoH,EAAgBhJ,EAAOoH,SAASS,GAChCoB,EAAiBjJ,EAAOkH,UAAUW,GAClCqB,EAAa/d,KAAKge,aAAatB,GAC/BuB,EAAepJ,GAAQ+F,UAAU8B,IAAgB,KAEjDlB,EAAiB,CACrBS,SAAU,CACRnjB,MAAOykB,EACP33B,MAAO+wB,EAAkBS,YAAYyG,EAAe,IAEtD9B,UAAW,CACTjjB,MAAO0kB,EACP53B,MAAO8wB,EAAmBU,YAAY0G,IAExCI,MAAO,CACLplB,MAAO2kB,EACP73B,MAAOg4B,EAAsBxG,YAAY2G,KAI7C,GAAIE,EAAc,CAChB,IAAIE,EAEFA,EADmB,IAAjBF,EACiBN,EAAoBS,MACb,IAAjBH,EACUN,EAAoBU,QAEpBV,EAAoBW,QAGzC9C,EAAeZ,QAAU,CACvB9hB,MAAO4kB,EACP93B,MAAOu4B,GAIXne,KAAKpR,SAAS,CAGZ2sB,eAAgBzG,EAAOmH,EAAWtF,EAAkBU,QAAQ,IAC5DmE,eAAAA,KAIJ+C,iBAAoBt4B,IAClB,MAAM,eAAEg3B,EAAF,aAAkBuB,GAAiBxe,KAAK7W,MAC9C8zB,EAAe,KAAM,CAAEhB,SAAU,OACjCuC,EAAav4B,GACb+Z,KAAKpR,SAAS,CAAE2sB,eAAgB,KAAMC,eAAgB,QAGxDM,mBACE,MAAM,MAAEK,EAAF,WAAS1F,GAAezW,KAAK7W,MAEnC6W,KAAKyW,WAAa,CAChBC,mBAAoB,IAAID,EAAWgI,mBAAmBtC,GACtDxF,kBAAmB,IAAIF,EAAWiI,kBAAkBvC,GACpDyB,sBAAuB,IAAInH,EAAWkI,kBAI1C/C,cACE,MAAM,OACJgD,EACAp1B,OAAQq1B,EAFJ,UAGJ9C,EAHI,SAIJE,EAJI,QAKJrB,GACE5a,KAAK7W,OACH,mBAAEutB,EAAF,kBAAsBC,GAAsB3W,KAAKyW,WAEjDqI,EAA0C,IAArB/C,EAAU/2B,OAAe,CAAC,EAAG,KAAO+2B,EAEzD9G,EAAqB6J,EAAmB/qB,KAAKmhB,GACjDwB,EAAmBW,QAAQnC,KAEvBE,EAAoB6G,EAASloB,KAAKohB,GACtCwB,EAAkBU,QAAQlC,KAGtB5rB,EACJyW,KAAKxF,UAAUhQ,QAAQu0B,YAAcH,EAAOtF,KAAOsF,EAAOxF,MACtD5vB,EAASq1B,EAAaD,EAAO5F,IAAM4F,EAAOvF,OAC1C2F,GAAOpM,EAAAA,EAAAA,GAAIqC,GACXgK,GAAOnM,EAAAA,EAAAA,GAAImC,GACXH,GAASoK,EAAAA,EAAAA,KAAcC,MAAM,CAAC,EAAG51B,IACjCwrB,GAASmK,EAAAA,EAAAA,KAAcC,MAAM,CAAC31B,EAAQ,IAEtC41B,EAAoB,KADXJ,EAAOC,GAGtBnK,EAAOwB,OAAO,EAACxD,EAAAA,EAAAA,GAAIsC,IAAoBxC,EAAAA,EAAAA,GAAIwC,KAC3CL,EAAOuB,OAAO,CAAC2I,EAAOG,EAAUJ,EAAOI,IAEvCpf,KAAKpR,SAAS,CACZpF,OAAAA,EACAD,MAAAA,EACAurB,OAAAA,EACAC,OAAAA,EACAF,OAAQ,CACNkH,UAAW+C,EACX7J,mBAAAA,EACAgH,SAAAA,EACA7G,kBAAAA,EACAwF,QAAAA,KAKNoD,aAAaj5B,GAEX,MAAM,OAAE8vB,GAAW7U,KAAK9X,OAClB,UAAE6zB,EAAF,SAAaE,GAAapH,EAC1BwK,EAAWpD,EAASj3B,OAAS,EAGnC,IAAI03B,EAAc33B,EAEd23B,EAJc,IAKhBA,EALgB,GAOd2C,EAAW3C,EAPG,IAQhBA,EAAc2C,EARE,GAWlB,MAAMC,EACJrD,EAASS,EAZO,GAYoBT,EAASS,EAZ7B,GAiBlB,OAF+B,KAD7BX,EAAUW,EAdM,GAcqBX,EAAUW,EAd/B,IAeoB4C,EAKxCvJ,UACE,MAAM,QAAEA,GAAY/V,KAAK7W,OACnB,OAAE0rB,EAAF,OAAUC,EAAV,OAAkBC,GAAW/U,KAAK9X,MAExC,IAAK2sB,IAAWkB,EACd,OAGF,MAAMxc,EAAQwc,EAAQ,GAChBwJ,EAAMxJ,EAAQ,GAOd+B,EAAUzF,UAJFkN,EAAMhmB,GAIa,EAAG,IAC9BimB,EAAqBjmB,EAAQue,GAAW,EACxC2H,EAAmBF,EAAMzH,EAAUjD,EAAOoH,SAASj3B,OAAS,EAE5D06B,EAAcF,EAChBnN,SAAS9Y,EAAQ,EAAG,IACpBA,EAAQue,EAEN6H,EAAYF,EACdpN,SAASkN,GAAO1K,EAAOoH,SAASj3B,OAAS,EAAIu6B,GAAO,EAAG,IACvDA,EAAMzH,EAEVhD,EAAOwB,OAAO,CACZzB,EAAOO,kBAAkBsK,GACzB7K,EAAOO,kBAAkBuK,KAG3B,MAAMC,EAAyB/K,EAAOI,mBAAmB/lB,MACvDwwB,EACAC,EAAY,GAERX,GAAOpM,EAAAA,EAAAA,GAAIgN,GACXX,GAAOnM,EAAAA,EAAAA,GAAI8M,GAEXR,EAAoB,KADXJ,EAAOC,GAGtBlK,EAAOuB,OAAO,CAAC2I,EAAOG,EAAUJ,EAAOI,IAGzC5c,SACE,MAAM,OACJoc,EADI,QAEJ7I,EAFI,WAGJ8J,EAHI,UAIJC,EAJI,cAKJC,EALI,mBAMJC,GACEhgB,KAAK7W,OACH,OACJ0rB,EADI,OAEJC,EAFI,OAGJC,EAHI,MAIJxrB,EAJI,OAKJC,EALI,eAMJ+xB,EANI,eAOJC,GACExb,KAAK9X,MAIT,OAFI6tB,GAAS/V,KAAK+V,UAGhBltB,EAAAA,cAAAA,MAAAA,CAAKC,IAAKkX,KAAKxF,WACZhR,EAAS,GAAKD,EAAQ,GACrBV,EAAAA,cAAAA,MAAAA,CACEC,IAAKkX,KAAK/E,KACV1R,MAAOA,EAAQq1B,EAAOtF,KAAOsF,EAAOxF,MACpC5vB,OAAQA,EAASo1B,EAAO5F,IAAM4F,EAAOvF,QAErCxwB,EAAAA,cAAAA,IAAAA,CAAGyU,UAAY,aAAYshB,EAAOtF,SAASsF,EAAO5F,QAChDnwB,EAAAA,cAAC6sB,EAAI,CACHZ,OAAQA,EACRC,OAAQA,EACRvrB,OAAQA,EACRD,MAAOA,EACPktB,WAAYzW,KAAKyW,WACjBV,QAASA,IAGXltB,EAAAA,cAAC+rB,EAAI,CACHtrB,KAAMw2B,EACNhL,OAAQA,EACRC,OAAQA,EACRvrB,OAAQA,EACRqrB,OAAQA,EACR/pB,SAAS,mBAGV+pB,EAAO+F,SACN/xB,EAAAA,cAAC0xB,EAAe,CACdzF,OAAQA,EACRC,OAAQA,EACRF,OAAQA,EACR/pB,SAAS,mBAIZirB,GACCltB,EAAAA,cAAC+rB,EAAI,CACHtrB,KAAMu2B,EACN/K,OAAQA,EACRC,OAAQA,EACRvrB,OAAQA,EACRqrB,OAAQ,CACNI,mBAAoBJ,EAAOI,mBAAmB/lB,MAC5C6mB,EAAQ,GACRA,EAAQ,GAAK,GAEfX,kBAAmBP,EAAOO,kBAAkBlmB,MAC1C6mB,EAAQ,GACRA,EAAQ,GAAK,MAMpBgK,GACCl3B,EAAAA,cAAC+rB,EAAI,CACHtrB,KAAM02B,EACNlL,OAAQA,EACRC,OAAQA,EACRvrB,OAAQA,EACRqrB,OAAQ,CACNI,mBAAoBJ,EAAOI,mBAAmB/lB,MAC5C6wB,EAAc,GACdA,EAAc,IAEhB3K,kBAAmBP,EAAOO,kBAAkBlmB,MAC1C6wB,EAAc,GACdA,EAAc,OAMtBl3B,EAAAA,cAAAA,WAAAA,CAAUY,GAAG,YACXZ,EAAAA,cAAAA,OAAAA,CACE0sB,EAAG,EACHkD,GAAImG,EAAO5F,IACXxvB,OAAQA,EAASo1B,EAAO5F,IACxBzvB,MAAOA,KAIXV,EAAAA,cAAAA,IAAAA,KACEA,EAAAA,cAAAA,OAAAA,CACE+C,UAAW4B,EACX1E,IAAKkX,KAAKyb,OACVlG,EAAG,EACHkD,GAAImG,EAAO5F,IACXxvB,OAAQA,EAASo1B,EAAO5F,IACxBzvB,MAAOA,EACP02B,YAAajgB,KAAKgd,aAClBwB,aAAcxe,KAAKue,mBAEpB1J,EAAOoH,SAASj3B,OAAS,GACxBu2B,GACAC,GACE3yB,EAAAA,cAAC0uB,EAAO,CACNvsB,SAAUuwB,EACVvnB,QAASwnB,EACT1wB,SAAS,iBACT0sB,WAAYjuB,EACZkuB,YAAamH,SAYnCvD,EAAexxB,UAAY,CACzBL,OAAQM,IAAAA,OAAiB4Z,WACzBqY,UAAWjyB,IAAAA,QAAkBA,IAAAA,QAAkB4Z,WAC/CuY,SAAUnyB,IAAAA,QAAkBA,IAAAA,QAAkB4Z,WAC9CkX,QAAS9wB,IAAAA,QAAkBA,IAAAA,QAC3BqyB,MAAOryB,IAAAA,OAAiB4Z,WACxBkb,OAAQ90B,IAAAA,MAAgB,CACtBkvB,IAAKlvB,IAAAA,OAAiB4Z,WACtB0V,MAAOtvB,IAAAA,OAAiB4Z,WACxB2V,OAAQvvB,IAAAA,OAAiB4Z,WACzB4V,KAAMxvB,IAAAA,OAAiB4Z,aAEzBqS,QAASjsB,IAAAA,QAAkBA,IAAAA,QAC3B+1B,WAAY/1B,IAAAA,OACZg2B,UAAWh2B,IAAAA,OACXi2B,cAAej2B,IAAAA,QAAkBA,IAAAA,QACjCk2B,mBAAoBl2B,IAAAA,OACpBmzB,eAAgBnzB,IAAAA,KAChB00B,aAAc10B,IAAAA,KACduyB,gBAAiBvyB,IAAAA,OACjB2sB,WAAY3sB,IAAAA,QAAkB4Z,WAC9B6Z,qBAAsBzzB,IAAAA,OACtB0zB,sBAAuB1zB,IAAAA,OACvB2zB,kBAAmB3zB,IAAAA,OACnB4zB,oBAAqB5zB,IAAAA,OACrB6zB,oBAAqB7zB,IAAAA,MAAgB,CACnCs0B,MAAOt0B,IAAAA,OAAiB4Z,WACxB2a,QAASv0B,IAAAA,OAAiB4Z,WAC1B4a,QAASx0B,IAAAA,OAAiB4Z,cAI9B2X,EAAezxB,aAAe,CAC5Bg1B,OAAQ,CACN5F,IAAK,GACLI,MAAO,GACPC,OAAQ,GACRC,KAAM,IAERsB,QAAS,KACT7E,QAAS,KACT8J,WAAY,mBACZC,UAAW,4BACXC,cAAe,KACfC,mBAAoBj3B,EAAAA,GACpBk0B,eAAgBA,IAAM,KACtBuB,aAAcA,IAAM,KACpBnC,gBAAiB,KACjBkB,qBAAsB,WACtBC,sBAAuB,YACvBC,kBAAmB,QACnBC,oBAAqB,eACrBC,oBAAqB,CACnBS,MAAO,QACPC,QAAS,UACTC,QAAS,YAIb,8ECxeA,GAAgB,KAAO,oBAAoB,UAAY,yBAAyB,UAAY,yBAAyB,UAAU,uBAAuB,OAAS,uBAAuB,UAAU,uBAAuB,OAAS,uBAAuB,UAAU,uBAAuB,OAAS,uBAAuB,UAAU,uBAAuB,OAAS,mCCwClW,MAtBa32B,IAQK,IARJ,MACZ/B,EADY,MAEZkT,EAFY,KAGZpM,EAHY,iBAIZwzB,EAJY,eAKZC,EALY,eAMZC,EANY,gBAOZC,GAAkB,GACR14B,EACV,MAAM24B,EACJz3B,EAAAA,cAAAA,OAAAA,CAAM+C,WAAW2B,EAAAA,EAAAA,GAAKC,EAAO+yB,UAAWJ,IAAkBrnB,GAG5D,OACEjQ,EAAAA,cAAAA,MAAAA,CAAK+C,WAAW2B,EAAAA,EAAAA,GAAKC,EAAOkrB,KAAMhsB,GAAQc,EAAOd,GAAOwzB,KACpDG,GAAmBC,EACrBz3B,EAAAA,cAAAA,MAAAA,CAAK+C,WAAW2B,EAAAA,EAAAA,GAAKC,EAAOgzB,UAAWJ,IAAkBx6B,GACxDy6B,GAAmBC,8FCnC1B,EAA4B,0BCI5B,MAAMG,EAASt3B,IACb,MAAM,SAAEwC,EAAF,cAAY+0B,GAAkBv3B,EAEpC,OACEN,EAAAA,cAAAA,KAAAA,CAAI+C,UAAY,GAAE4B,KAAoBkzB,GAAiB,MACpD73B,EAAAA,SAAekL,IACdpI,GACCg1B,GAAWA,GAAS93B,EAAAA,cAAAA,KAAAA,CAAIwL,IAAKssB,EAAM7nB,OAAQ6nB,IAAgB,OAMpEF,EAAM52B,UAAY,CAChB8B,SAAU7B,IAAAA,KAAe4Z,WACzBgd,cAAe52B,IAAAA,QAGjB22B,EAAM72B,aAAe,CACnB82B,cAAe,MAGjB,6BCzBA,IAAIE,EAAS,iIAKbC,EAAQ,EAAW,SAASva,GAE3B,IAAKA,EACJ,OAAO,EAER,GAAGA,EAAMthB,OAAO,IACf,OAAO,EAGR,IADY47B,EAAOhS,KAAKtI,GAEvB,OAAO,EAGR,IAAIjL,EAAQiL,EAAMwa,MAAM,KACxB,QAAGzlB,EAAM,GAAGrW,OAAO,MAGDqW,EAAM,GAAGylB,MAAM,KAClBhuB,MAAK,SAASiuB,GAAQ,OAAOA,EAAK/7B,OAAO,oHCzBzD,SAASoP,IAA2Q,OAA9PA,EAAW7P,OAAOsb,QAAU,SAAUvL,GAAU,IAAK,IAAIyL,EAAI,EAAGA,EAAInZ,UAAU5B,OAAQ+a,IAAK,CAAE,IAAI/I,EAASpQ,UAAUmZ,GAAI,IAAK,IAAI1L,KAAO2C,EAAczS,OAAOc,UAAUC,eAAeQ,KAAKkR,EAAQ3C,KAAQC,EAAOD,GAAO2C,EAAO3C,IAAY,OAAOC,GAAkBF,EAASyF,MAAMmG,KAAMpZ,WAShT,IAAIo6B,EAAa,GAEbC,EAAU,EACC,SAASC,EAAgBC,EAAc90B,GAEpD,OADAA,EAAUA,GAAW,GACd,SAA6B+0B,GAClC,IAAIC,EAAuBD,EAAiBlvB,aAAekvB,EAAiBx5B,MAAQ,YAEhF05B,EAEJ,SAAUC,GAfd,IAAwB7gB,EAAUC,EAkB5B,SAAS2gB,EAAkBn4B,EAAOiJ,GAChC,IAAIyJ,EAKJ,OAHAA,EAAQ0lB,EAAWz7B,KAAKka,KAAM7W,EAAOiJ,IAAY4N,MAC3C9X,MAAQ,GACd2T,EAAM2lB,YAAc,GACb3lB,EAxBmB8E,EAgBM4gB,GAhBhB7gB,EAgBH4gB,GAhBoCj8B,UAAYd,OAAOyc,OAAOL,EAAWtb,WAAYqb,EAASrb,UAAU4b,YAAcP,EAAUA,EAASH,UAAYI,EA2BpK,IAAI7L,EAASwsB,EAAkBj8B,UAmM/B,OAjMAyP,EAAO2sB,mCAAqC,WAK1C,OAJKzhB,KAAK0hB,mBACR1hB,KAAK0hB,iBAAmB,uBAAyBT,KAG5CjhB,KAAK0hB,kBAGd5sB,EAAO6sB,eAAiB,WAEtB,OADA3hB,KAAKwhB,YAAsC,oBAAjBL,EAA8BA,IAAiBA,EAClEnhB,KAAKwhB,aAGd1sB,EAAO8sB,4BAA8B,SAAqC15B,GACxE,IAAI4U,EAASkD,KAGbA,KAAKpR,SAAS1G,GAAO,WACnB,OAAO4U,EAAO3T,MAAM04B,mBAAqB/kB,EAAO3T,MAAM04B,kBAAkB/kB,EAAO5U,WAInF4M,EAAOgtB,uCAAyC,WAC9C,IAAIC,EAAWf,EAAWhhB,KAAKwhB,aAE/B,IAAKO,IAAaA,EAAStI,OACzB,MAAM,IAAI1xB,MAAM,yBAGlB,IAAK,IAAIi6B,KAAUD,EAASE,UAC1BF,EAASE,UAAUD,GAAQD,UAGtB56B,OAAOkF,EAAQsX,eAGxB7O,EAAOmO,kBAAoB,WACzB,IAAIxF,EAASuC,KAETkiB,EAAYliB,KAAK2hB,iBACjBttB,EAAM2L,KAAKyhB,qCACXU,EAAW91B,EACX6X,EAAaie,EAASje,WACtBP,EAAewe,EAASxe,aACxBye,EAAWD,EAASC,SAUxB,GARIle,GAA4C,qBAAvB/c,OAAO+c,KAC9B8c,EAAWkB,GAAa,CACtBzI,QAAQ,EACRwI,UAAW,KAKXjB,EAAWkB,GAAY,CACzB,IAAIG,EAAQrB,EAAWkB,GAEvB,OAAIG,IAAUA,EAAM5I,QAAU4I,EAAMC,cAClCtiB,KAAK4hB,4BAA4BS,QAKnCA,EAAMJ,UAAU5tB,GAAO,SAAUguB,GAC/B,OAAO5kB,EAAOmkB,4BAA4BS,KAY9C,IAAIJ,EAAY,GAEhBA,EAAU5tB,GAAO,SAAUguB,GACzB,OAAO5kB,EAAOmkB,4BAA4BS,IAG5CrB,EAAWkB,GAAa,CACtBzI,QAAQ,EACRwI,UAAWA,GAEb,IAAI56B,EAASC,SAASC,cAAc,UAIpC,IAAK,IAAIg7B,KAHTl7B,EAAOI,IAAMy6B,EACb76B,EAAOK,OAAQ,EAEO2E,EAAQmI,WAC5BnN,EAAOm7B,aAAaD,EAAWl2B,EAAQmI,WAAW+tB,IAGhDH,IACF/6B,EAAOoC,GAAK24B,GAGd,IAAIK,EAAoC,SAA2C1P,GACjF,GAAIiO,EAAWkB,GAAY,CACzB,IACIQ,EADW1B,EAAWkB,GACED,UAE5B,IAAK,IAAID,KAAUU,EACb3P,EAAK2P,EAAaV,YACbU,EAAaV,KAMxBre,GAAkC,qBAAXxc,SACzBA,OAAOwc,GAAgB,WACrB,OAAOlG,EAAOqkB,2CAIlBz6B,EAAOypB,OAAS,WACd,IAAIiR,EAAWf,EAAWkB,GAEtBH,IACFA,EAAStI,QAAS,EAClBgJ,GAAkC,SAAUE,GAC1C,OAAIhf,IAIJgf,EAASZ,IACF,QAKb16B,EAAO0pB,QAAU,WACf,IAAIgR,EAAWf,EAAWkB,GAEtBH,IACFA,EAASO,SAAU,EACnBG,GAAkC,SAAUE,GAE1C,OADAA,EAASZ,IACF,OAKbz6B,SAASiO,KAAKzN,YAAYT,IAG5ByN,EAAO+nB,qBAAuB,WAE5B,IAAIqF,EAAYliB,KAAKwhB,YAErB,IAAgC,IAA5Bn1B,EAAQu2B,gBAGV,IAFA,IAAIC,EAAav7B,SAASw7B,qBAAqB,UAEtC/iB,EAAI,EAAGA,EAAI8iB,EAAW79B,OAAQ+a,GAAK,EACtC8iB,EAAW9iB,GAAGtY,IAAI+b,QAAQ0e,IAAc,GACtCW,EAAW9iB,GAAG1C,YAChBwlB,EAAW9iB,GAAG1C,WAAW0lB,YAAYF,EAAW9iB,IAOxD,IAAIgiB,EAAWf,EAAWkB,GAEtBH,WACKA,EAASE,UAAUjiB,KAAKyhB,uCAEC,IAA5Bp1B,EAAQu2B,wBACH5B,EAAWkB,KAKxBptB,EAAO0N,OAAS,WACd,IAAI0B,EAAa7X,EAAQ6X,WAErBd,EAAcpD,KAAK7W,MAEnB65B,GADoB5f,EAAYye,kBACjBze,EAAY4f,cAC3B3f,EArNZ,SAAuCrM,EAAQsM,GAAY,GAAc,MAAVtM,EAAgB,MAAO,GAAI,IAA2D3C,EAAK0L,EAA5DzL,EAAS,GAAQiP,EAAahf,OAAOuV,KAAK9C,GAAqB,IAAK+I,EAAI,EAAGA,EAAIwD,EAAWve,OAAQ+a,IAAO1L,EAAMkP,EAAWxD,GAAQuD,EAASE,QAAQnP,IAAQ,IAAaC,EAAOD,GAAO2C,EAAO3C,IAAQ,OAAOC,EAqNjRmP,CAA8BL,EAAa,CAAC,oBAAqB,iBAQlF,OALIc,GAAgC,qBAAX/c,SACvBkc,EAAWa,GAA4C,qBAAvB/c,OAAO+c,GAA8B/c,OAAO+c,QAAcve,GAG5F0d,EAAWva,IAAMk6B,GACV,IAAAz7B,eAAc65B,EAAkB/d,IAGlCie,EA/MT,CAgNE,EAAAhG,WAKE2H,GAAqB,IAAAt4B,aAAW,SAAUxB,EAAOL,GACnD,OAAO,IAAAvB,eAAc+5B,EAAmBltB,EAAS,GAAIjL,EAAO,CAC1D65B,aAAcl6B,QAOlB,OAJAm6B,EAAmB/wB,YAAc,qBAAuBmvB,EAAuB,IAC/E4B,EAAmBp5B,UAAY,CAC7Bg4B,kBAAmB,UAEd,IAAaoB,EAAoB7B","sources":["webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_freeGlobal.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_root.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_Symbol.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_arrayMap.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/isArray.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_getRawTag.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_objectToString.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_baseGetTag.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/isObjectLike.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/isSymbol.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/_baseToString.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/toString.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/replace.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/react-hooks/src/use-apple/useApple.hook.ts","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/ActionsCancelCircleHighlightedMedium.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/ActionsCheckCircleOnMedium.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/NavigationWarningHighlightedMedium.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/NavigationInformationNormalMedium.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/ActionsCancelNormalSmall.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/react-hooks/src/use-interval/useInterval.hook.ts","webpack://StravaModern/./node_modules/@strava/ui/VisuallyHidden/VisuallyHidden.tsx","webpack://StravaModern/./node_modules/@strava/ui/Alert/Alert.module.scss?7e0f","webpack://StravaModern/./node_modules/@strava/ui/Alert/Alert.tsx","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/react-hooks/src/use-queue/useQueue.hook.ts","webpack://StravaModern/./node_modules/@strava/utils/node_modules/@strava/constants/src/appConstants.js","webpack://StravaModern/./node_modules/@strava/utils/src/utils.ts","webpack://StravaModern/./node_modules/@strava/ui/Alert/AlertProvider/AlertContext.tsx","webpack://StravaModern/./node_modules/@strava/ui/Alert/AlertProvider/AlertContainer.module.scss?1a42","webpack://StravaModern/./node_modules/@strava/ui/Alert/AlertProvider/AlertContainer.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/icons/dist/ActionsCancelNormalSmall.js","webpack://StravaModern/../src/Element.tsx","webpack://StravaModern/../src/Filter.ts","webpack://StravaModern/../src/constants.ts","webpack://StravaModern/../src/StyleFilter.ts","webpack://StravaModern/../src/Parser.ts","webpack://StravaModern/../src/Interweave.tsx","webpack://StravaModern/../src/Markup.tsx","webpack://StravaModern/../src/Matcher.ts","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/AccountAuthButton/AccountAuthButton.module.scss?771e","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/icons/dist/LogosAppleSmall.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/icons/dist/LogosFacebookSmall.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/icons/dist/LogosGoogleSmall.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/icons/dist/ActionsEmailNormalSmall.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/AccountAuthButton/AccountAuthButton.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/OrDivider/OrDivider.module.scss?37b1","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/OrDivider/OrDivider.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/react-google-recaptcha/lib/esm/recaptcha.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/react-google-recaptcha/lib/esm/index.js","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/lodash-es/isNil.js","webpack://StravaModern/./node_modules/@strava/ui/Input/Input.module.scss?50e4","webpack://StravaModern/./node_modules/@strava/ui/Input/Input.tsx","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/ActionsVisibleDisabledNormalSmall.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/ActionsVisibleNormalSmall.js","webpack://StravaModern/./node_modules/@strava/ui/Input/PasswordInput.module.scss?7172","webpack://StravaModern/./node_modules/@strava/ui/Input/PasswordInput.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/RegistrationInput/RegistrationInput.module.scss?70f3","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/RegistrationInput/RegistrationInput.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/EmailRegistrationForm/EmailRegistrationForm.module.scss?ddf9","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/EmailRegistrationForm/EmailRegistrationForm.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/utils.ts","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/EmailRegistrationForm/email-registration-api.ts","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/DisclaimerText/DisclaimerText.module.scss?86ce","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/DisclaimerText/DisclaimerText.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/SignUpModal/SignUpModal.module.scss?c847","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/SignUpModal/SignUpModal.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/constants/src/appConstants.ts","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/utils/src/dev.utils.ts","webpack://StravaModern/./node_modules/@strava/authentication-ui/node_modules/@strava/utils/src/utils.ts","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/SignUpModal/SignUpModalContext/SignUpModalContext.tsx","webpack://StravaModern/./node_modules/@strava/authentication-ui/src/constants.ts","webpack://StravaModern/./node_modules/@strava/icons/dist/AchievementsTrophyNormalSmall.js","webpack://StravaModern/./node_modules/@strava/icons/dist/ActionsCommentNormalSmall.js","webpack://StravaModern/./node_modules/@strava/icons/dist/ActionsKudoNormalSmall.js","webpack://StravaModern/./node_modules/@strava/icons/dist/ActionsLockClosedNormalXsmall.js","webpack://StravaModern/./node_modules/@strava/ui-tokens/js/_typography.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/NavigationProfileHighlightedMedium.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/BadgesMulticolorSuperuserSmall.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/BadgesMulticolorSummitSmall.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/BadgesMulticolorProSmall.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/icons/dist/BadgesMulticolorVerifiedSmall.js","webpack://StravaModern/./node_modules/@strava/ui/Avatar/Avatar.module.scss?3ebc","webpack://StravaModern/./node_modules/@strava/ui/Avatar/Avatar.tsx","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/react-hooks/src/use-safe-state/useSafeState.hook.ts","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/now.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/_trimmedEndIndex.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/_baseTrim.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/isSymbol.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/toNumber.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/debounce.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/lodash-es/throttle.js","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/area.module.scss?1347","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/Area.js","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/axis.module.scss?8da9","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/Axis.js","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/Tooltip/Tooltip.module.scss?2585","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/Tooltip/index.js","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/constants/src/constants.ts","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/constants/src/statusConstants.ts","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/constants/src/athletesVisibilityConstants.ts","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/constants/src/appConstants.ts","webpack://StravaModern/./node_modules/@strava/ui/node_modules/@strava/constants/src/brandAndDeviceConstants.ts","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/SurfaceTypePath.module.scss?4de2","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/SurfaceTypePath.js","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/ElevationChart.module.scss?4583","webpack://StravaModern/./node_modules/@strava/ui/ElevationChart/index.js","webpack://StravaModern/./node_modules/@strava/ui/Stat/Stat.module.scss?3051","webpack://StravaModern/./node_modules/@strava/ui/Stat/Stat.tsx","webpack://StravaModern/./node_modules/@strava/ui/Stats/styles.module.scss?4754","webpack://StravaModern/./node_modules/@strava/ui/Stats/index.js","webpack://StravaModern/./node_modules/email-validator/index.js","webpack://StravaModern/./node_modules/react-async-script/lib/esm/async-script-loader.js"],"sourcesContent":["/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import toString from './toString.js';\n\n/**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\nfunction replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n}\n\nexport default replace;\n","import { replace } from 'lodash-es';\nimport { useEffect } from 'react';\n\ndeclare global {\n interface Window {\n AppleID: {\n stravaInit: boolean;\n auth: {\n init: (params: {\n clientId: string;\n scope: string;\n redirectURI: string;\n state: string;\n }) => void;\n signIn: () => void;\n };\n };\n }\n}\n\ntype LogError = (e: Error | string) => void;\n\nconst appendScriptToBody = ({\n script,\n name,\n logError\n}: {\n script: Node;\n name: string;\n logError: LogError;\n}) => {\n if (document.querySelector('body')) {\n document.querySelector('body')?.appendChild(script);\n } else {\n const e = new Error(`Failed to inject ${name} script`);\n logError(e);\n }\n};\n\nconst injectAppleScript = ({\n logError,\n locale = 'en_US'\n}: {\n logError: LogError;\n locale?: string;\n}) => {\n if (!window.AppleID) {\n const script = window.document.createElement('script');\n const formattedLocale = replace(locale, '-', '_');\n script.src = `https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/${formattedLocale}/appleid.auth.js`;\n script.async = true;\n appendScriptToBody({ script, name: 'apple', logError });\n }\n};\n\n/**\n *\n * @param {String} state https://developer.apple.com/documentation/sign_in_with_apple/clientconfigi/3230956-state\n */\nexport const useApple = (state: string, logError: LogError) => {\n useEffect(() => {\n injectAppleScript({ logError });\n }, [logError]);\n\n const signin = () => {\n if (!window.AppleID.stravaInit) {\n window.AppleID.auth.init({\n clientId: 'com.strava.app.sign.in',\n scope: 'name email',\n redirectURI: 'https://www.strava.com/o_auth/apple',\n state\n });\n window.AppleID.stravaInit = true;\n }\n window.AppleID.auth.signIn();\n };\n\n return { signin };\n};\n\nexport default useApple;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsCancelCircleHighlightedMedium = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsCancelCircleHighlightedMedium.defaultProps = {\n color: \"currentColor\",\n size: 32,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsCancelCircleHighlightedMedium.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsCancelCircleHighlightedMedium;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsCheckCircleOnMedium = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsCheckCircleOnMedium.defaultProps = {\n color: \"currentColor\",\n size: 32,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsCheckCircleOnMedium.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsCheckCircleOnMedium;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgNavigationWarningHighlightedMedium = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgNavigationWarningHighlightedMedium.defaultProps = {\n color: \"currentColor\",\n size: 32,\n title: undefined,\n titleId: undefined,\n};\nSvgNavigationWarningHighlightedMedium.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgNavigationWarningHighlightedMedium;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgNavigationInformationNormalMedium = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n )\n);\nSvgNavigationInformationNormalMedium.defaultProps = {\n color: \"currentColor\",\n size: 32,\n title: undefined,\n titleId: undefined,\n};\nSvgNavigationInformationNormalMedium.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgNavigationInformationNormalMedium;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsCancelNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsCancelNormalSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsCancelNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsCancelNormalSmall;\n","import { useRef, useEffect } from 'react';\n\n/**\n * Declarative setInterval React hook.\n *\n * `useInterval` uses the same API as setInterval, but the arguments of this hook is \"dynamic\".\n * Set your `callback` function as the first argument and the `delay` as the second argument.\n * When passing `null` or `undefined` to the `delay` arg then it will stop/pause the interval.\n *\n * For implementation details explanation, why to use useInterval hook, and an example see Dan Abramov's blog post\n * 👀: https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n * */\nexport const useInterval = (callback: Function, delay: number | null) => {\n const savedCallback = useRef(null);\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval.\n useEffect(() => {\n // If no delay then pause/stop the interval.\n // Delay of 0 is valid delay.\n if ((!delay && delay !== 0) || delay < 0) {\n return;\n }\n\n const id = setInterval(() => savedCallback.current?.(), delay);\n // eslint-disable-next-line consistent-return\n return () => clearInterval(id);\n }, [delay]);\n};\n\nexport default useInterval;\n","import React, { forwardRef } from 'react';\n\ntype VisuallyHiddenProps = React.ComponentPropsWithoutRef<'span'>;\n\n// visually hidden styling comes from https://www.a11yproject.com/posts/how-to-hide-content/\nconst VisuallyHidden = forwardRef(\n ({ style, ...props }, ref) => {\n return (\n \n );\n }\n);\n\nexport default VisuallyHidden;\n","// extracted by mini-css-extract-plugin\nexport default {\"alert\":\"Alert--alert--mHJG0\",\"alertInner\":\"Alert--alertInner--Cohht\",\"hasError\":\"Alert--hasError--6H8nL\",\"buttonError\":\"Alert--buttonError--JNCju\",\"hasWarning\":\"Alert--hasWarning--XMcB+\",\"buttonWarning\":\"Alert--buttonWarning--B8+01\",\"hasSuccess\":\"Alert--hasSuccess--HEVyx\",\"buttonSuccess\":\"Alert--buttonSuccess--8cDF1\",\"hasInfo\":\"Alert--hasInfo--cIXeI\",\"buttonInfo\":\"Alert--buttonInfo--3W2YL\",\"alertContent\":\"Alert--alertContent--Ady-v\",\"alignLeft\":\"Alert--alignLeft--TWc3-\",\"alignCenter\":\"Alert--alignCenter--Wjvd+\",\"alignRight\":\"Alert--alignRight--GltzN\",\"indicatorIcon\":\"Alert--indicatorIcon--mcHuS\",\"closeButtonContainer\":\"Alert--closeButtonContainer--0bGld\",\"button\":\"Alert--button--j9wSm\",\"autoDismissBar\":\"Alert--autoDismissBar--mBh+B\",\"countdown\":\"Alert--countdown--4hdDW\",\"fadeIn\":\"Alert--fadeIn--m0c6K\",\"fadeOut\":\"Alert--fadeOut--V2zHS\",\"enterFadeOut\":\"Alert--enterFadeOut--ZHCGw\",\"newKudo\":\"Alert--newKudo--xwJ9a\"};","import React, { ComponentPropsWithoutRef, ReactNode, useState } from 'react';\n// import ReachAlert from '@reach/alert';\nimport {\n ActionsCancelCircleHighlightedMedium as ErrorIcon,\n ActionsCheckCircleOnMedium as SuccessIcon,\n NavigationWarningHighlightedMedium as WarningIcon,\n NavigationInformationNormalMedium as InfoIcon,\n ActionsCancelNormalSmall as CancelIcon\n} from '@strava/icons';\nimport { useInterval } from '@strava/react-hooks';\nimport { isTest } from '@strava/utils/src/dev.utils';\nimport clsx from '../clsx';\nimport VisuallyHidden from '../VisuallyHidden';\nimport styles from './Alert.module.scss';\n\nexport const AlertStatus = {\n ERROR: 'error',\n SUCCESS: 'success',\n WARNING: 'warning',\n INFO: 'info'\n} as const;\n\nexport type AlertStatusType = (typeof AlertStatus)[keyof typeof AlertStatus];\n\nexport type AlertStyleType =\n | 'hasError'\n | 'hasSuccess'\n | 'hasWarning'\n | 'hasInfo';\nexport type AlertButtonStyleType =\n | 'buttonError'\n | 'buttonSuccess'\n | 'buttonWarning'\n | 'buttonInfo';\n\nconst ALERT_DELAY = 8000;\n\nconst getAlertDetails = ({\n type,\n iconSize\n}: {\n type: AlertStatusType;\n iconSize: number;\n}): {\n indicatorIcon: ReactNode;\n messageType: AlertStatusType;\n alertStyle: AlertStyleType;\n buttonStyle: AlertButtonStyleType;\n} =>\n ({\n [AlertStatus.ERROR]: {\n indicatorIcon: (\n \n ),\n messageType: AlertStatus.ERROR,\n alertStyle: 'hasError' as const,\n buttonStyle: 'buttonError' as const\n },\n [AlertStatus.SUCCESS]: {\n indicatorIcon: (\n \n ),\n messageType: AlertStatus.SUCCESS,\n alertStyle: 'hasSuccess' as const,\n buttonStyle: 'buttonSuccess' as const\n },\n [AlertStatus.WARNING]: {\n indicatorIcon: (\n \n ),\n messageType: AlertStatus.WARNING,\n alertStyle: 'hasWarning' as const,\n buttonStyle: 'buttonWarning' as const\n },\n [AlertStatus.INFO]: {\n indicatorIcon: (\n \n ),\n messageType: AlertStatus.INFO,\n alertStyle: 'hasInfo' as const,\n buttonStyle: 'buttonInfo' as const\n }\n }[type]);\n\nconst fadeStyles = {\n enter: isTest() ? '' : 'fadeIn',\n exit: isTest() ? '' : 'fadeOut'\n};\n\nexport interface AlertProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n alertType?: AlertStatusType;\n autoDismiss?: boolean;\n autoDismissDelay?: number;\n className?: string;\n contentPosition?: 'left' | 'center' | 'right';\n hideCloseButton?: boolean;\n hideIcon?: boolean;\n iconSize?: number;\n onClose?: () => void;\n}\n\nexport const Alert = ({\n children,\n className,\n alertType = AlertStatus.ERROR,\n autoDismiss = false,\n autoDismissDelay = ALERT_DELAY,\n contentPosition = 'left',\n hideCloseButton = false,\n hideIcon = true,\n iconSize = 32,\n onClose = () => {},\n ...options\n}: AlertProps) => {\n const { indicatorIcon, messageType, alertStyle, buttonStyle } =\n getAlertDetails({ type: alertType, iconSize });\n const [fadeStyle, setFadeStyle] = useState(fadeStyles.enter);\n\n const handleOnClose = async () => {\n setFadeStyle(fadeStyles.exit);\n // eslint-disable-next-line no-unused-expressions\n !isTest() && (await new Promise((resolve) => setTimeout(resolve, 0)));\n onClose();\n };\n\n useInterval(\n () => {\n handleOnClose();\n },\n autoDismiss ? autoDismissDelay : null\n );\n\n return (\n \n
\n {/* Icon */}\n {!hideIcon && (\n
{indicatorIcon}
\n )}\n\n {/* Content */}\n \n {messageType}: \n
{children}
\n
\n\n {/* Close Button */}\n {!hideCloseButton && (\n
\n \n \n \n
\n )}\n \n\n {/* Auto Dismiss Progress */}\n {autoDismiss && (\n \n
\n
\n )}\n \n );\n};\n\nexport default Alert;\n","import { useState, useCallback } from 'react';\n\ninterface QueueOptions {\n initialValues?: T[];\n}\n\nexport interface QueueState {\n queue: T[];\n length: number;\n enqueue: (...items: T[]) => void;\n dequeue: () => void;\n updateQueue: (fn: (current: T[]) => T[]) => void;\n clearQueue: () => void;\n peek: () => T | undefined;\n}\n\nexport const useQueue = ({\n initialValues = []\n}: QueueOptions = {}): QueueState => {\n const [queue, setState] = useState(initialValues);\n\n /**\n * Enqueue; Adds item to queue.\n */\n const enqueue = useCallback((...items: T[]) => {\n setState((current) => [...current, ...items]);\n }, []);\n\n /**\n * Dequeue; Removes first item in queue.\n */\n const dequeue = useCallback(() => {\n // Immutable solution to remove first element in array.\n setState((current) => current.slice(1));\n }, []);\n\n /**\n * Update function to allow for more granular control of updating the queue.\n * The `update` function accepts a callback fn where the first arg is the\n * current queue state that we can then manipulate. See tests for examples.\n * */\n const updateQueue = useCallback(\n (fn: (current: T[]) => T[]) => setState((current) => fn([...current])),\n []\n );\n\n /**\n * Remove all items from queue.\n */\n const clearQueue = useCallback(() => setState(() => []), []);\n\n /**\n * Returns the first item in the queue.\n */\n const peek = useCallback(() => {\n if (queue.length > 0) {\n return queue[0];\n }\n\n return undefined;\n }, [queue]);\n\n return {\n queue,\n length: queue.length,\n enqueue,\n dequeue,\n updateQueue,\n clearQueue,\n peek\n };\n};\n\nexport default useQueue;\n","export const YOUNGEST_AGE_ON_PLATFORM = 13;\n\nexport const YOUNGEST_AGE_FOR_HEALTH_AND_PROMO = 16;\n\nexport const GENDER = Object.freeze({\n man: 'man',\n woman: 'woman',\n preferNotSay: 'prefer_not_say',\n nonBinary: 'nonbinary'\n});\n\nexport const LOCALE = Object.freeze({\n deDE: 'de-DE',\n enUS: 'en-US',\n enGB: 'en-GB',\n esES: 'es-ES',\n es419: 'es-419',\n frFR: 'fr-FR',\n itIT: 'it-IT',\n jaJP: 'ja-JP',\n koKR: 'ko-KR',\n nlNL: 'nl-NL',\n ptBR: 'pt-BR',\n ptPT: 'pt-PT',\n ruRU: 'ru-RU',\n zhCN: 'zh-CN',\n zhTW: 'zh-TW'\n});\n\n// If a language has more than one locale, the first in the list is the default\nexport const LANGUAGE_LOCALES = Object.freeze({\n de: [LOCALE.deDE],\n // en is intentionally omitted here since English is the global default\n es: [LOCALE.esES, LOCALE.es419],\n fr: [LOCALE.frFR],\n it: [LOCALE.itIT],\n ja: [LOCALE.jaJP],\n ko: [LOCALE.koKR],\n nl: [LOCALE.nlNL],\n pt: [LOCALE.ptPT, LOCALE.ptBR],\n ru: [LOCALE.ruRU],\n zh: [LOCALE.zhCN, LOCALE.zhTW]\n});\n\nexport const EXPERIMENT_COHORTS = Object.freeze({\n control: 'control',\n variantA: 'variant-a',\n variantB: 'variant-b'\n});\n\nexport const MOBILE_OS = Object.freeze({\n android: 'android',\n iPhone: 'iphone',\n iPad: 'ipad'\n});\n\nexport const SUPPORTED_BROWSERS = Object.freeze({\n chrome: 'chrome',\n firefox: 'firefox',\n safari: 'safari'\n});\n\n// universal link paths from 'apple-app-site-association' file in active\nexport const APPLE_APP_LINK_PATHS = [\n '/dashboard',\n '/activities/*',\n '/athletes/*',\n '/segments/*',\n '/challenges/*',\n '/videos/*',\n '/routes/*',\n '/premium/*',\n '/settings/*',\n '/shop/*',\n '/athlete/*',\n '/clubs/*',\n '/summit/join',\n '/summit/perks',\n '/oauth/mobile/authorize'\n];\n\nexport const ATHLETES_VISIBILITY = Object.freeze({\n optedOut: 'opted_out' // Strava::Athletes::Visibility::OPTED_OUT\n});\n\nexport default {\n YOUNGEST_AGE_ON_PLATFORM,\n YOUNGEST_AGE_FOR_HEALTH_AND_PROMO,\n GENDER,\n LOCALE,\n EXPERIMENT_COHORTS,\n MOBILE_OS,\n SUPPORTED_BROWSERS,\n APPLE_APP_LINK_PATHS,\n ATHLETES_VISIBILITY\n};\n","import {\n MOBILE_OS,\n SUPPORTED_BROWSERS,\n APPLE_APP_LINK_PATHS\n} from '@strava/constants/src/appConstants';\nimport { isString } from 'lodash-es';\nimport camelCase from 'lodash-es/camelCase';\nimport snakeCase from 'lodash-es/snakeCase';\nimport isObject from 'lodash-es/isObject';\nimport { CamelCasedPropertiesDeep, SnakeCasedPropertiesDeep } from 'type-fest';\n\nexport const generateRandomId = () => Math.random().toString(36).substring(2);\n\n// Capitalizes all the words and replaces some characters in the string to create a nicer looking title.\n// eg. 'man from the boondocks' => 'Man From The Boondocks'\nexport const titleize = (sentence: string) => {\n return sentence\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n};\n\nexport const displayName = (\n { firstName = '', lastName = '' },\n options = { forceAnonymize: false, maxLength: 100 }\n) => {\n const { maxLength, forceAnonymize } = options;\n const fullName = `${firstName} ${lastName}`;\n\n if (forceAnonymize || fullName.length > maxLength) {\n if (firstName.length > maxLength - 3) {\n return `${titleize(firstName.substring(0, maxLength - 4))}... ${lastName\n .charAt(0)\n .toUpperCase()}.`;\n }\n return `${titleize(firstName)} ${lastName.charAt(0).toUpperCase()}.`;\n }\n return fullName.trim();\n};\n\n/**\n * Checks to see if device is mobile\n * @param {string} userAgent - user agent string for the current browser. For next-js apps (SSR),\n * this value can be retrieved from request.headers['user-agent']\n * @returns {boolean} - true if the device is mobile\n */\nexport const isMobile = (userAgent = window?.navigator?.userAgent) => {\n if (isString(userAgent)) {\n // ref - https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#mobile_tablet_or_desktop\n return userAgent.toLowerCase().includes('mobi');\n }\n return false;\n};\n\n/**\n * Determines the OS for mobile devices\n * @param {string} userAgent - user agent string for the current browser. For next-js apps (SSR),\n * this value can be retrieved from request.headers['user-agent']\n * @returns {(string|null)} - one of ['android', 'ipad', 'iphone'] or null for unknown\n */\nexport const getMobileOS = (userAgent = window?.navigator?.userAgent) => {\n if (isString(userAgent)) {\n if (userAgent.includes('Android')) {\n return MOBILE_OS.android;\n }\n if (userAgent.includes('iPad')) {\n return MOBILE_OS.iPad;\n }\n if (userAgent.includes('iPhone')) {\n return MOBILE_OS.iPhone;\n }\n }\n return null;\n};\n\n/**\n * Determines, in a limited fashion, the browser according to the user agent.\n * NOTE: UAs are notoriously difficult to parse. This is meant as a bare-bones, noncomprehensive parser,\n * based on https://www.whatismybrowser.com/guides/the-latest-user-agent/.\n *\n * The order of conditionals is important, bc some Chrome & Firefox UAs include 'Safari', too.\n * Some Edge UAs may be recognized as Chrome for now, since they can include 'Chrome'. We don't\n * officially support Edge (yet?).\n *\n * @param {string} userAgent - user agent string for the current browser. For next-js apps (SSR),\n * this value can be retrieved from request.headers['user-agent']\n * @returns {(string|null)} - one of ['chrome', 'firefox', 'safari'] or null for unknown/unsupported browser\n */\nexport const getBrowser = (userAgent = window?.navigator?.userAgent) => {\n if (isString(userAgent)) {\n if (userAgent.includes('Chrome') || userAgent.includes('CriOS')) {\n return SUPPORTED_BROWSERS.chrome;\n }\n if (userAgent.includes('Firefox') || userAgent.includes('FxiOS'))\n return SUPPORTED_BROWSERS.firefox;\n if (userAgent.includes('Safari')) {\n return SUPPORTED_BROWSERS.safari;\n }\n }\n\n return null;\n};\n\n/**\n * Universal links are determined by the paths described in `apple-app-site-association` in active.\n * @param {string} pathname - window.location.pathname or nextjs equivalent\n * @returns {boolean} - whether the pathname string matches\n */\nexport const isUniversalLinkPage = (pathname: string) => {\n if (isString(pathname)) {\n return APPLE_APP_LINK_PATHS.some((path: string) => {\n const pathWithoutAsterisk = path.replace('/*', '');\n return pathname.startsWith(pathWithoutAsterisk);\n });\n }\n return false;\n};\n\n// eg. given,\n// \"urls\": {\n// \"100\": \"https://photo_url_1\",\n// \"1800\": \"https://photo_url_2\"\n// }\n// returns https://photo_url_2\nexport const getPhotoWithMaxDimension = (\n photoUrlHash: Record\n) => {\n if (!isObject(photoUrlHash)) {\n return '';\n }\n const key = Object.keys(photoUrlHash).reduce((a, b) => (a > b ? a : b));\n return photoUrlHash[key];\n};\n\n/**\n * Immutably merges a payload into an item in an array of objects\n * @param {array} array - An array of objects\n * @param {string|number} id - The unique id of the item in the array to update\n * @param {object} payload - the value to merge into the matched item\n * @param {object} options\n * @param {string} [options.idName=id] - the key of the unique identifier\n * @param {bool} [options.upsert=false] - if true, will insert the payload into the array as a new item if no matching item is found\n * @return {array} - A copy of the original array with the matching item updated\n */\nexport function arrayUpdateItemById(\n array: T[],\n id: string | number,\n payload: Partial,\n { idName, upsert }: { idName?: keyof T; upsert?: boolean } = {}\n): T[] {\n let itemFound = false;\n const property = idName || ('id' as keyof T);\n const mappedArray = array.map((item) => {\n itemFound = itemFound || item[property] === id;\n return item[property] === id ? { ...item, ...payload } : item;\n });\n\n return itemFound || !upsert ? mappedArray : ([...array, payload] as T[]);\n}\n\n/**\n * Immutably removes an item from an array by index\n * @param {array} array\n * @param {number} index - the index of the item to remove\n * @return {array} - A copy of the original array with the matching item removed\n */\nexport function arrayRemoveByIndex(array: T[], index: number): T[] {\n return index === -1\n ? array\n : [...array.slice(0, index), ...array.slice(index + 1)];\n}\n\n/**\n * Immutably removes an item from an array of objects\n * @param {array} array - An array of objects\n * @param {string|number} id - The unique id of the item in the array to remove\n * @param {string} [idName=id] - the key of the unique identifier\n * @return {array} - A copy of the original array with the matching item removed\n */\n\nexport function arrayRemoveItemById(\n array: T[],\n propertyValue: string | number,\n idName = 'id'\n): T[] {\n const index = array.findIndex(\n (item) => item[idName as keyof T] === propertyValue\n );\n return arrayRemoveByIndex(array, index);\n}\n\nexport const capitalizeFirstLetter = (string: string) =>\n `${string.charAt(0).toUpperCase()}${string.slice(1)}`;\n\n/**\n * @description Converts Object keys from string of any case to camelCase.\n * Handles nested objects and arrays.\n * */\nexport function convertKeysToCamel(object: T): CamelCasedPropertiesDeep {\n if (Array.isArray(object)) {\n return (object as unknown[]).map((item) =>\n convertKeysToCamel(item)\n ) as CamelCasedPropertiesDeep;\n }\n\n if (isObject(object)) {\n return Object.keys(object).reduce((o, k) => {\n const key = camelCase(k);\n const value = object[\n k as keyof typeof object\n ] as CamelCasedPropertiesDeep;\n\n if (isObject(value)) {\n return {\n ...o,\n [key]: convertKeysToCamel(value)\n };\n }\n\n if (Array.isArray(value)) {\n return {\n ...o,\n [key]: (value as unknown[]).map((item) => convertKeysToCamel(item))\n };\n }\n\n return {\n ...o,\n [key]: value\n };\n }, {} as CamelCasedPropertiesDeep);\n }\n\n return object as CamelCasedPropertiesDeep;\n}\n\n/**\n * @description Converts Object keys from string of any case to snakeCase.\n * Handles nested objects and arrays.\n * */\nexport function convertKeysToSnake(object: T): SnakeCasedPropertiesDeep {\n if (Array.isArray(object)) {\n return (object as unknown[]).map((item) =>\n convertKeysToSnake(item)\n ) as SnakeCasedPropertiesDeep;\n }\n\n if (isObject(object)) {\n return Object.keys(object).reduce((o, k) => {\n const key = snakeCase(k);\n const value = object[\n k as keyof typeof object\n ] as SnakeCasedPropertiesDeep;\n\n if (isObject(value)) {\n return {\n ...o,\n [key]: convertKeysToSnake(value)\n };\n }\n\n if (Array.isArray(value)) {\n return {\n ...o,\n [key]: (value as unknown[]).map((item) => convertKeysToSnake(item))\n };\n }\n\n return {\n ...o,\n [key]: value\n };\n }, {} as SnakeCasedPropertiesDeep);\n }\n\n return object as SnakeCasedPropertiesDeep;\n}\n\n/**\n * Checks to see if localStorage is available\n *\n * @return {boolean} - true if localStorage can be used\n */\nexport const isLocalStorageAvailable = () => {\n const test = 'test';\n try {\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * Appends querystring params to a URL\n *\n * @param {string} originalUrl - The original URL to append params to\n * @param {object} params - An object of key value parameters to append to URL\n * @return {string} - URL with params appended\n */\nexport const addParamsToURL = (originalUrl: string, params: object) => {\n const url = new URL(originalUrl);\n\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n\n return url.toString();\n};\n\n/**\n * Some of our logged-out pages have a full-screen image background.\n * This util helps with setting the background image on the `` element, and\n * just requires passing in the image to be used.\n * @param {string} background\n */\nexport const setFullScreenBackgroundImage = (background: string) => {\n // apply background image directly to ``\n const body = document.querySelector('body');\n if (body) {\n body.style.setProperty('background-image', `url(${background})`);\n body.style.setProperty('background-size', 'cover');\n body.style.setProperty('background-position', 'center');\n }\n};\n\n/**\n * Uses the host to determine if a page is being loaded in staging or localhost.\n *\n * This util function is helpful for apps that run on nextJS which has node process\n * defined as production in both staging and production.\n *\n * @param host - host name\n * @returns {boolean} - true if app is running in staging or local\n */\nexport const isStagingOrLocal = (host: string) =>\n ['staging', 'localhost'].some((_host) => host.includes(_host));\n\n/**\n * Adds an id property to each object in an array. Uses the object's index as the value for the id\n * @param {array} objects - An array of objects\n * @return {array} - A copy of the original array with id property added to each object\n */\nexport const arrayAddIndexAsId = (objects: Array) =>\n objects.map((object, index) => ({ ...object, id: index }));\n","import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useMemo\n} from 'react';\nimport { useQueue } from '@strava/react-hooks';\nimport { generateRandomId } from '@strava/utils';\nimport { AlertStatusType } from '../Alert';\n\nexport interface AlertConfig {\n alertType: AlertStatusType;\n content: ReactNode;\n containerId?: string;\n id?: string;\n className?: string;\n autoDismiss?: boolean;\n autoDismissDelay?: number;\n contentPosition?: 'left' | 'center' | 'right';\n hideCloseButton?: boolean;\n hideIcon?: boolean;\n iconSize?: number;\n onClose?: () => void;\n}\n\nexport interface AlertState {\n alerts: AlertConfig[];\n showAlert: (config: AlertConfig) => string;\n hideAlert: (id: string) => void;\n clearAlerts: (containerId?: string) => void;\n}\n\nconst AlertContext = createContext(undefined);\nAlertContext.displayName = 'AlertContext';\n\nexport const useAlertContext = () => {\n const context = useContext(AlertContext);\n\n // Fail fast if useAlertContext hook is used outside the Provider.\n if (!context) {\n throw new Error(`useAlertContext must be used within the AlertProvider`);\n }\n\n return context;\n};\n\ninterface AlertProviderProps {\n children: ReactNode;\n}\n\nexport const AlertProvider = ({ children }: AlertProviderProps) => {\n const { queue, updateQueue, clearQueue } = useQueue({\n initialValues: []\n });\n\n /**\n * @description Display an alert.\n *\n * @param {Object} alertConfig\n * @param {'error' | 'warning' | 'info' | 'success'} alertConfig.alertType\n * @param {ReactNode} alertConfig.content - Message to display in the the content of the Alert Component.\n * @param {string} [alertConfig.containerId=\"base\"] - It's used to identify which `AlertContainer` the alert is associated to.\n * @param {string | number} [alertConfig.id] - Optional; by default id is randomly generated. Used to update or close alert.\n * @param {string} [alertConfig.className] - The className passed to Alert component.\n * @param {boolean} [alertConfig.autoDismiss=false] - Determine if alert will auto dismiss/close.\n * @param {number} [alertConfig.autoDismissDelay=8000] - Delay in ms that alert will auto dismiss.\n * @param {'left' | 'center' | 'right'} [alertConfig.contentPosition=\"left\"] - Position to align content inside of alert container.\n * @param {boolean} [alertConfig.hideCloseButton=false] - Hides the close button, alert can only be closed programmatically.\n * @param {boolean} [alertConfig.hideIcon=false] - Display or hide alert icon.\n * @param {number} [alertConfig.iconSize=32] - The Alert's SVG icon's width and height.\n * @param {Function} [alertConfig.onClose] - Callback fn; called when alert closes.\n *\n * @return {string} - Alert ID\n */\n const showAlert = useCallback(\n (alertConfig: AlertConfig) => {\n const id = alertConfig.id ?? generateRandomId();\n const containerId = alertConfig.containerId ?? 'base';\n\n updateQueue((alerts) => {\n const hasAlert =\n alertConfig?.id &&\n alerts.some((alert) => alert.id === alertConfig.id);\n // Check if alert exist in queue.\n // If true then return hasAlerts\n // Else add/append alert to queue.\n if (hasAlert) {\n return alerts;\n }\n\n return [...alerts, { ...alertConfig, id, containerId }];\n });\n\n return `${id}`;\n },\n [updateQueue]\n );\n\n /**\n * @description Hide an alert by id.\n *\n * @param {string} id - Unique id to hide/remove alert.\n *\n * @return {boolean}\n * */\n const hideAlert = useCallback(\n (id: string) =>\n updateQueue((alerts) =>\n alerts.filter((alert) => {\n if (alert.id === id) {\n // eslint-disable-next-line no-unused-expressions\n alert?.onClose?.();\n return false;\n }\n\n return true;\n })\n ),\n [updateQueue]\n );\n\n /**\n * @description Clears/remove all alerts.\n * If no `containerId` provided then removes ALL alerts. Else if `containerId`\n * provided then clears alerts for specific container when working with multiple containers.\n *\n * @param {string} [containerId] - Optional; Clear alerts for specific container when working with multiple containers.\n *\n * @return {boolean}\n * */\n const clearAlerts = useCallback(\n (containerId: string | undefined) => {\n // If containerId is passed then remove all alerts for specific container\n if (containerId) {\n return updateQueue((alerts) =>\n alerts.filter((alert) => {\n if (alert.containerId === containerId) {\n // eslint-disable-next-line no-unused-expressions\n alert?.onClose?.();\n return false;\n }\n\n return true;\n })\n );\n }\n // Else clear entire queue\n return clearQueue();\n },\n [updateQueue, clearQueue]\n );\n\n const providerState = useMemo(\n () => ({\n alerts: queue,\n showAlert,\n hideAlert,\n clearAlerts\n }),\n [queue, showAlert, hideAlert, clearAlerts]\n );\n\n return (\n \n {children}\n \n );\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"alertContainerInfoContainer\":\"AlertProvider--alertContainerInfoContainer--dxEXE\",\"alertContainerInfo\":\"AlertProvider--alertContainerInfo--RDrkO\"};","import React from 'react';\nimport { AlertConfig, useAlertContext } from './AlertContext';\nimport Alert from '../Alert';\nimport styles from './AlertContainer.module.scss';\n\nconst defaultTranslateAlertInfoText = (\n totalAlertsShown: number,\n totalAlerts: number\n) => `Showing ${totalAlertsShown} of ${totalAlerts} alerts`;\n\ninterface AlertContainerProps {\n containerId?: string;\n limit?: number;\n shouldShowAlertInfoText?: boolean;\n translateAlertInfoText?: typeof defaultTranslateAlertInfoText;\n}\n\nexport const AlertContainer = ({\n containerId = 'base',\n limit,\n shouldShowAlertInfoText = true,\n translateAlertInfoText = defaultTranslateAlertInfoText\n}: AlertContainerProps) => {\n const { alerts, hideAlert } = useAlertContext();\n\n const handleOnClose = (id?: string) => {\n if (id) {\n hideAlert(id);\n }\n };\n\n const filterLimit = (_: unknown, index: number) => !limit || index < limit;\n const filterContainer = (alert: AlertConfig) =>\n alert?.containerId === containerId;\n\n const totalAlerts = alerts.filter(filterContainer).length;\n const totalAlertsShown = alerts\n .filter(filterContainer)\n .filter(filterLimit).length;\n\n return (\n <>\n {alerts\n .filter(filterContainer)\n .filter(filterLimit)\n .map(\n ({\n alertType,\n id,\n content,\n containerId: containerIdProp,\n ...rest\n }) => (\n handleOnClose(id)}\n >\n {content}\n \n )\n )}\n {shouldShowAlertInfoText && totalAlerts > totalAlertsShown && (\n \n
\n {translateAlertInfoText(totalAlertsShown, totalAlerts)}\n
\n \n )}\n \n );\n};\n\nexport default AlertContainer;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsCancelNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsCancelNormalSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsCancelNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsCancelNormalSmall;\n",null,null,null,null,null,null,null,null,"// extracted by mini-css-extract-plugin\nexport default {\"authButton\":\"AccountAuthButton--authButton--yFnD+\",\"placeholder\":\"AccountAuthButton--placeholder--JAgxq\",\"facebookBlue\":\"AccountAuthButton--facebookBlue--eWNdO\",\"emailOrange\":\"AccountAuthButton--emailOrange--jGQsK\"};","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgLogosAppleSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgLogosAppleSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgLogosAppleSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgLogosAppleSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgLogosFacebookSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgLogosFacebookSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgLogosFacebookSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgLogosFacebookSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgLogosGoogleSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n \n \n )\n);\nSvgLogosGoogleSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgLogosGoogleSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgLogosGoogleSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsEmailNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsEmailNormalSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsEmailNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsEmailNormalSmall;\n","import React, { ReactNode } from 'react';\nimport clsx from '@strava/ui/clsx';\nimport Button from '@strava/ui/Button';\nimport styles from './AccountAuthButton.module.scss';\n\nimport AppleLogo from '@strava/icons/LogosAppleSmall';\nimport FacebookLogo from '@strava/icons/LogosFacebookSmall';\nimport GoogleLogo from '@strava/icons/LogosGoogleSmall';\nimport EmailLogo from '@strava/icons/ActionsEmailNormalSmall';\n\nexport type AuthButtonVariantTypes =\n | 'apple'\n | 'email'\n | 'email-orange'\n | 'facebook'\n | 'facebook-blue' // ironically corresponds to the lighter version of the icon\n | 'google';\n\ntype AccountAuthButtonProps = {\n children: ReactNode;\n className?: string;\n variant?: AuthButtonVariantTypes;\n onClick?: () => void;\n};\n\nconst AccountAuthButton = ({\n children,\n onClick,\n variant,\n className,\n ...options\n}: AccountAuthButtonProps) => {\n return (\n \n }>\n {variant === 'apple' && }\n {variant === 'facebook' && }\n {variant === 'facebook-blue' && }\n {variant === 'google' && }\n {variant === 'email' && }\n \n {children}\n \n );\n};\n\nexport default AccountAuthButton;\n","// extracted by mini-css-extract-plugin\nexport default {\"orDivider\":\"OrDivider--orDivider--X6SS0\",\"or\":\"OrDivider--or--rdcMJ\",\"light\":\"OrDivider--light--BPhFE\",\"line\":\"OrDivider--line--LX6dD\"};","import React from 'react';\nimport clsx from '@strava/ui/clsx';\n\nimport styles from './OrDivider.module.scss';\nimport { ThemeTypes } from '..';\n\ninterface OrDividerProps {\n text: string;\n theme?: ThemeTypes;\n className?: string;\n}\n\nexport const OrDivider = ({\n text,\n theme = 'dark',\n className\n}: OrDividerProps) => {\n return (\n
\n
\n {text}\n
\n
\n );\n};\n\nexport default OrDivider;\n","var _excluded = [\"sitekey\", \"onChange\", \"theme\", \"type\", \"tabindex\", \"onExpired\", \"onErrored\", \"size\", \"stoken\", \"grecaptcha\", \"badge\", \"hl\", \"isolated\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\nimport * as React from \"react\";\nimport PropTypes from \"prop-types\";\nvar ReCAPTCHA = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(ReCAPTCHA, _React$Component);\n function ReCAPTCHA() {\n var _this;\n _this = _React$Component.call(this) || this;\n _this.handleExpired = _this.handleExpired.bind(_assertThisInitialized(_this));\n _this.handleErrored = _this.handleErrored.bind(_assertThisInitialized(_this));\n _this.handleChange = _this.handleChange.bind(_assertThisInitialized(_this));\n _this.handleRecaptchaRef = _this.handleRecaptchaRef.bind(_assertThisInitialized(_this));\n return _this;\n }\n var _proto = ReCAPTCHA.prototype;\n _proto.getCaptchaFunction = function getCaptchaFunction(fnName) {\n if (this.props.grecaptcha) {\n if (this.props.grecaptcha.enterprise) {\n return this.props.grecaptcha.enterprise[fnName];\n }\n return this.props.grecaptcha[fnName];\n }\n return null;\n };\n _proto.getValue = function getValue() {\n var getResponse = this.getCaptchaFunction(\"getResponse\");\n if (getResponse && this._widgetId !== undefined) {\n return getResponse(this._widgetId);\n }\n return null;\n };\n _proto.getWidgetId = function getWidgetId() {\n if (this.props.grecaptcha && this._widgetId !== undefined) {\n return this._widgetId;\n }\n return null;\n };\n _proto.execute = function execute() {\n var execute = this.getCaptchaFunction(\"execute\");\n if (execute && this._widgetId !== undefined) {\n return execute(this._widgetId);\n } else {\n this._executeRequested = true;\n }\n };\n _proto.executeAsync = function executeAsync() {\n var _this2 = this;\n return new Promise(function (resolve, reject) {\n _this2.executionResolve = resolve;\n _this2.executionReject = reject;\n _this2.execute();\n });\n };\n _proto.reset = function reset() {\n var resetter = this.getCaptchaFunction(\"reset\");\n if (resetter && this._widgetId !== undefined) {\n resetter(this._widgetId);\n }\n };\n _proto.forceReset = function forceReset() {\n var resetter = this.getCaptchaFunction(\"reset\");\n if (resetter) {\n resetter();\n }\n };\n _proto.handleExpired = function handleExpired() {\n if (this.props.onExpired) {\n this.props.onExpired();\n } else {\n this.handleChange(null);\n }\n };\n _proto.handleErrored = function handleErrored() {\n if (this.props.onErrored) {\n this.props.onErrored();\n }\n if (this.executionReject) {\n this.executionReject();\n delete this.executionResolve;\n delete this.executionReject;\n }\n };\n _proto.handleChange = function handleChange(token) {\n if (this.props.onChange) {\n this.props.onChange(token);\n }\n if (this.executionResolve) {\n this.executionResolve(token);\n delete this.executionReject;\n delete this.executionResolve;\n }\n };\n _proto.explicitRender = function explicitRender() {\n var render = this.getCaptchaFunction(\"render\");\n if (render && this._widgetId === undefined) {\n var wrapper = document.createElement(\"div\");\n this._widgetId = render(wrapper, {\n sitekey: this.props.sitekey,\n callback: this.handleChange,\n theme: this.props.theme,\n type: this.props.type,\n tabindex: this.props.tabindex,\n \"expired-callback\": this.handleExpired,\n \"error-callback\": this.handleErrored,\n size: this.props.size,\n stoken: this.props.stoken,\n hl: this.props.hl,\n badge: this.props.badge,\n isolated: this.props.isolated\n });\n this.captcha.appendChild(wrapper);\n }\n if (this._executeRequested && this.props.grecaptcha && this._widgetId !== undefined) {\n this._executeRequested = false;\n this.execute();\n }\n };\n _proto.componentDidMount = function componentDidMount() {\n this.explicitRender();\n };\n _proto.componentDidUpdate = function componentDidUpdate() {\n this.explicitRender();\n };\n _proto.handleRecaptchaRef = function handleRecaptchaRef(elem) {\n this.captcha = elem;\n };\n _proto.render = function render() {\n // consume properties owned by the reCATPCHA, pass the rest to the div so the user can style it.\n /* eslint-disable no-unused-vars */\n var _this$props = this.props,\n sitekey = _this$props.sitekey,\n onChange = _this$props.onChange,\n theme = _this$props.theme,\n type = _this$props.type,\n tabindex = _this$props.tabindex,\n onExpired = _this$props.onExpired,\n onErrored = _this$props.onErrored,\n size = _this$props.size,\n stoken = _this$props.stoken,\n grecaptcha = _this$props.grecaptcha,\n badge = _this$props.badge,\n hl = _this$props.hl,\n isolated = _this$props.isolated,\n childProps = _objectWithoutPropertiesLoose(_this$props, _excluded);\n /* eslint-enable no-unused-vars */\n return /*#__PURE__*/React.createElement(\"div\", _extends({}, childProps, {\n ref: this.handleRecaptchaRef\n }));\n };\n return ReCAPTCHA;\n}(React.Component);\nexport { ReCAPTCHA as default };\nReCAPTCHA.displayName = \"ReCAPTCHA\";\nReCAPTCHA.propTypes = {\n sitekey: PropTypes.string.isRequired,\n onChange: PropTypes.func,\n grecaptcha: PropTypes.object,\n theme: PropTypes.oneOf([\"dark\", \"light\"]),\n type: PropTypes.oneOf([\"image\", \"audio\"]),\n tabindex: PropTypes.number,\n onExpired: PropTypes.func,\n onErrored: PropTypes.func,\n size: PropTypes.oneOf([\"compact\", \"normal\", \"invisible\"]),\n stoken: PropTypes.string,\n hl: PropTypes.string,\n badge: PropTypes.oneOf([\"bottomright\", \"bottomleft\", \"inline\"]),\n isolated: PropTypes.bool\n};\nReCAPTCHA.defaultProps = {\n onChange: function onChange() {},\n theme: \"light\",\n type: \"image\",\n tabindex: 0,\n size: \"normal\",\n badge: \"bottomright\"\n};","import ReCAPTCHA from \"./recaptcha\";\nimport makeAsyncScriptLoader from \"react-async-script\";\nvar callbackName = \"onloadcallback\";\nvar globalName = \"grecaptcha\";\nfunction getOptions() {\n return typeof window !== \"undefined\" && window.recaptchaOptions || {};\n}\nfunction getURL() {\n var dynamicOptions = getOptions();\n var hostname = dynamicOptions.useRecaptchaNet ? \"recaptcha.net\" : \"www.google.com\";\n if (dynamicOptions.enterprise) {\n return \"https://\" + hostname + \"/recaptcha/enterprise.js?onload=\" + callbackName + \"&render=explicit\";\n }\n return \"https://\" + hostname + \"/recaptcha/api.js?onload=\" + callbackName + \"&render=explicit\";\n}\nexport default makeAsyncScriptLoader(getURL, {\n callbackName: callbackName,\n globalName: globalName,\n attributes: getOptions().nonce ? {\n nonce: getOptions().nonce\n } : {}\n})(ReCAPTCHA);","import RecaptchaWrapper from \"./recaptcha-wrapper\";\nimport ReCAPTCHA from \"./recaptcha\";\nexport default RecaptchaWrapper;\nexport { ReCAPTCHA };","/**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\nfunction isNil(value) {\n return value == null;\n}\n\nexport default isNil;\n","// extracted by mini-css-extract-plugin\nexport default {\"input\":\"Input--input--myCs3\"};","import React, { forwardRef } from 'react';\nimport clsx from '@strava/ui/clsx';\nimport styles from './Input.module.scss';\n\ntype InputProps = React.ComponentPropsWithoutRef<'input'>;\n\nexport const Input = forwardRef(\n ({ className, ...props }, ref) => (\n \n )\n);\n\nexport default Input;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsVisibleDisabledNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n )\n);\nSvgActionsVisibleDisabledNormalSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsVisibleDisabledNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsVisibleDisabledNormalSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgActionsVisibleNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n )\n);\nSvgActionsVisibleNormalSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgActionsVisibleNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgActionsVisibleNormalSmall;\n","// extracted by mini-css-extract-plugin\nexport default {\"passwordInput\":\"Input--passwordInput--ARtRG\",\"showPasswordButton\":\"Input--showPasswordButton--9Ubgm\"};","import React, { forwardRef, useState } from 'react';\nimport clsx from '@strava/ui/clsx';\nimport ActionsVisibleDisabledNormalSmall from '@strava/icons/ActionsVisibleDisabledNormalSmall';\nimport ActionsVisibleNormalSmall from '@strava/icons/ActionsVisibleNormalSmall';\nimport VisuallyHidden from '../VisuallyHidden';\nimport Input from '.';\n\nimport styles from './PasswordInput.module.scss';\n\nexport type PasswordInputProps = React.ComponentPropsWithoutRef<'input'> & {\n showPasswordText: string; // translated text for accessibility. Should inform users that clicking show password button will display the password on the screen\n hidePasswordText: string;\n};\n\nconst PasswordInput = forwardRef(\n ({ showPasswordText, hidePasswordText, className, ...props }, ref) => {\n const [passwordIsVisible, setPasswordIsVisible] = useState(false);\n\n return (\n
\n \n setPasswordIsVisible((prev) => !prev)}\n className={styles.showPasswordButton}\n type=\"button\"\n role=\"switch\"\n aria-checked={passwordIsVisible}\n title={passwordIsVisible ? hidePasswordText : showPasswordText}\n >\n {passwordIsVisible ? (\n \n ) : (\n \n )}\n \n {passwordIsVisible ? hidePasswordText : showPasswordText}\n \n \n
\n );\n }\n);\n\nexport default PasswordInput;\n","// extracted by mini-css-extract-plugin\nexport default {\"input\":\"RegistrationInput--input--AQh-V\",\"label\":\"RegistrationInput--label--0tXB5\",\"light\":\"RegistrationInput--light--xymPQ\",\"textInput\":\"RegistrationInput--textInput--zLJDS\",\"message\":\"RegistrationInput--message--zQeRu\",\"error\":\"RegistrationInput--error--40No1\"};","import React, { forwardRef } from 'react';\nimport Input, { PasswordInput } from '@strava/ui/Input';\nimport { ThemeTypes } from '@strava/authentication-ui';\nimport clsx from '@strava/ui/clsx';\nimport styles from './RegistrationInput.module.scss';\n\ntype RegistrationInputProps = React.ComponentPropsWithoutRef<'input'> &\n (\n | {\n // type just has to not be 'password' or string for the conditional to work\n type: 'email' | 'text';\n hidePasswordText?: string;\n showPasswordText?: string;\n }\n | {\n type: 'password';\n hidePasswordText: string;\n showPasswordText: string;\n }\n ) & {\n label: string;\n inputMessage?: string | null;\n errorMessage?: string | null;\n errorMessageTestId?: string;\n theme?: ThemeTypes;\n };\n\nexport const RegistrationInput = forwardRef<\n HTMLInputElement,\n RegistrationInputProps\n>(\n (\n {\n label,\n id,\n type,\n inputMessage,\n errorMessage,\n errorMessageTestId,\n hidePasswordText,\n showPasswordText,\n theme = 'dark',\n ...props\n },\n ref\n ) => (\n
\n \n {type === 'password' ? (\n \n ) : (\n \n )}\n {inputMessage && !errorMessage && (\n

{inputMessage}

\n )}\n {errorMessage && (\n

\n {errorMessage}\n

\n )}\n
\n )\n);\n\nexport default RegistrationInput;\n","// extracted by mini-css-extract-plugin\nexport default {\"emailCaption\":\"EmailRegistrationForm--emailCaption--Ccjzm\",\"submitButton\":\"EmailRegistrationForm--submitButton--4ptar\"};","import React, { useState, useRef } from 'react';\nimport Button from '@strava/ui/Button';\nimport * as EmailValidator from 'email-validator';\nimport ReCAPTCHA from 'react-google-recaptcha';\nimport { isNil } from 'lodash-es';\nimport Spinner from '@strava/ui/Spinner';\nimport { AlertStatus, useAlertContext } from '@strava/ui/Alert';\nimport {\n elemAttrForAnalytics,\n EMAIL,\n ThemeTypes\n} from '@strava/authentication-ui';\nimport RegistrationInput from '../RegistrationInput';\nimport {\n submitFormData,\n isAlreadyRegisteredEmail\n} from './email-registration-api';\n\nimport {\n useStravaErrorLogging,\n useStravaTranslations\n} from '@strava/container-context';\n\nimport styles from './EmailRegistrationForm.module.scss';\n\nconst i18nPrefix = 'authentication_ui.email_registration_form';\n\nexport const EMAIL_REGISTRATION_FORM_ALERT_ID = 'email-registration-form-alert';\n\n// these props are passed into the parent component from the active\nexport interface EmailRegistrationFormProps {\n reCaptchaSiteKey: string;\n clubId?: number;\n isPremium: boolean;\n challengeId?: number;\n autoJoinChallenge?: boolean;\n honeyPot: string;\n plan?: string;\n formAuthToken?: string;\n}\n\ntype FormInputTypes = {\n email: string;\n password: string;\n honeyPot: string;\n};\n\ntype EmailValidationStateTypes = {\n message: string;\n isExistingEmail: boolean;\n isValidEmail: boolean;\n};\n\nexport type AnalyticsFieldsTypes = {\n action: string;\n element?: string;\n properties?: Record;\n};\n\nexport type AlertConfigTypes = {\n className?: string;\n contentPosition?: 'left' | 'center' | 'right';\n};\n\nconst EmailRegistrationForm = ({\n authorizationUrl,\n reCaptchaSiteKey,\n honeyPot,\n isPremium,\n clubId,\n plan,\n challengeId,\n autoJoinChallenge,\n formAuthToken,\n track,\n className,\n theme = 'dark',\n idPrefix,\n alertConfig,\n isInView = true\n}: EmailRegistrationFormProps & {\n // these props are passed in from the parent component\n authorizationUrl: string; // this url generally still comes from active\n track: (fields: AnalyticsFieldsTypes) => void;\n className?: string;\n idPrefix: string;\n theme?: ThemeTypes;\n alertConfig?: AlertConfigTypes;\n isInView?: boolean;\n}) => {\n const [formInput, setFormInput] = useState({\n email: '',\n password: '',\n honeyPot: '' // if this field gets filled out, user is probably a bot\n });\n const [passwordErrorMsg, setPasswordErrMsg] = useState(null);\n const [emailValidationState, setEmailValidationState] =\n useState(null);\n const [isProcessing, setIsProcessing] = useState(false);\n\n const emailInput = useRef(null);\n const passwordInput = useRef(null);\n const recaptchaRef = useRef(null);\n\n const useRecaptcha = !!reCaptchaSiteKey && isInView;\n\n const { logError } = useStravaErrorLogging();\n const { t } = useStravaTranslations();\n const { showAlert, clearAlerts } = useAlertContext();\n\n const emailRegFormAlert = (content: React.ReactNode, id: string) => ({\n content,\n alertType: AlertStatus.ERROR,\n containerId: EMAIL_REGISTRATION_FORM_ALERT_ID,\n hideCloseButton: true,\n ...(alertConfig && { ...alertConfig }),\n id // to prevent showing duplicate error messages\n });\n\n const getRecaptchaToken = async () => {\n if (useRecaptcha) {\n return (await recaptchaRef?.current?.executeAsync()) ?? '';\n }\n return '';\n };\n\n const handleEmailFormSubmit = async () => {\n const recaptchaToken = await getRecaptchaToken();\n\n const element = elemAttrForAnalytics(EMAIL);\n const { email, password, honeyPot } = formInput;\n\n const formData = new FormData();\n formData.append('web_registration_form', 'true');\n formData.append('email', email);\n formData.append('password', password);\n formData.append('g-recaptcha-response', recaptchaToken);\n formData.append('checkbox_agreed_to_terms', 'on');\n formData.append(honeyPot, honeyPot);\n formData.append('plan', String(plan));\n formData.append('authenticity_token', String(formAuthToken));\n\n if (isPremium) {\n formData.append('premium', 'true');\n }\n if (!isNil(clubId)) {\n formData.append('club_id', String(clubId));\n }\n if (!isNil(challengeId)) {\n formData.append('challenge_id', String(challengeId));\n }\n if (!isNil(autoJoinChallenge)) {\n formData.append('auto_join_challenge', String(autoJoinChallenge));\n }\n\n try {\n const response = await submitFormData({\n formData,\n url: authorizationUrl,\n logError\n });\n\n if ('error' in response) {\n // join request failed server-side validations,\n // flash message is populated and shown if an error occurred\n showAlert(emailRegFormAlert(response.error, 'submitFormData error'));\n setIsProcessing(false); // let user try again\n } else {\n const { pathType, load } = response;\n track({\n action: 'redirect',\n element,\n properties: {\n path_type: pathType,\n redirect_url: load\n }\n });\n\n // navigate to onboarding flow if no errors were encountered\n window.location.href = load;\n }\n } catch (error) {\n logError(error);\n\n // generic \"something went wrong\" alert\n showAlert(\n emailRegFormAlert(\n t(`${i18nPrefix}.error_message`),\n 'submitFormData catch'\n )\n );\n setIsProcessing(false); // let user try again\n }\n };\n\n /**\n * Validate athlete email -\n * 1 - value should be provided (required)\n * 2 - valid email address should be entered (eg. should have @)\n * 3 - email address should not be already registered on strava\n *\n * @returns {Object} result\n * @returns {boolean} result.isValidEmail - true when the email has passed all validation criteria\n * @returns {string} result.isExistingEmail - true when the email is already registered on strava\n * @returns {string} result.message - string message to display to athlete when an error occurs\n */\n const validateEmail = async () => {\n const { email } = formInput;\n if (emailValidationState) {\n // avoid validating email if there is already an error that is not addressed by the athlete yet\n // this prevents making an unnecessary api call to check if email is already registered (see #isAlreadyRegisteredEmail)\n return emailValidationState;\n } else {\n let isValidEmail = true;\n let isExistingEmail = false;\n let message = null;\n\n if (!(email && email.length > 0)) {\n message = t(`${i18nPrefix}.email_required`);\n isValidEmail = false;\n } else if (!EmailValidator.validate(email)) {\n message = t(`${i18nPrefix}.email_invalid`);\n isValidEmail = false;\n } else {\n try {\n const isUniqueEmail = await isAlreadyRegisteredEmail(email);\n if (!isUniqueEmail) {\n message = t(`${i18nPrefix}.email_taken`);\n isExistingEmail = true;\n }\n } catch (error) {\n logError(error);\n isValidEmail = false;\n\n // generic \"something went wrong\" alert\n showAlert(\n emailRegFormAlert(\n t(`${i18nPrefix}.error_message`),\n 'isAlreadyRegisteredEmail catch'\n )\n );\n }\n }\n setEmailValidationState({ isExistingEmail, isValidEmail, message });\n return { message, isValidEmail, isExistingEmail };\n }\n };\n\n /**\n * Validates athlete password\n * - value should be provided (required)\n * - max length of 40 chars\n * - min length of 8 chars\n *\n * @returns {boolean} result true when the password is valid\n */\n const validatePassword = () => {\n const { password } = formInput;\n\n if (!passwordErrorMsg) {\n // avoid validating email if there is already an error that is not addressed by the athlete yet\n let isValidPassword = true;\n let passwordValidationMsg = null;\n if (!(password && password.length > 0)) {\n passwordValidationMsg = t(`${i18nPrefix}.password_required`);\n isValidPassword = false;\n } else if (password.length > 40) {\n passwordValidationMsg = t(`${i18nPrefix}.password_max_length`);\n isValidPassword = false;\n } else if (password.length < 8) {\n passwordValidationMsg = t(`${i18nPrefix}.password_min_length`);\n isValidPassword = false;\n }\n setPasswordErrMsg(passwordValidationMsg);\n return isValidPassword;\n }\n return false;\n };\n\n const validateForm = async () => {\n return {\n ...(await validateEmail()),\n isValidPassword: validatePassword()\n };\n };\n\n /**\n * Actions to perform when a user hits the \"sign up\" button (account registration using email).\n * - validate user input (email and password)\n * - submit form if input is valid\n * - focus on invalid inputs if input is invalid\n */\n const handleFormSubmission = async (\n event: React.FormEvent\n ) => {\n event.preventDefault();\n setIsProcessing(true); // prevent impatient submit clicks\n\n const { isValidEmail, isValidPassword, isExistingEmail } =\n await validateForm();\n\n track({\n action: 'click',\n element: 'signup',\n properties: {\n is_valid_email: isValidEmail,\n is_valid_password: isValidPassword,\n is_existing_email: isExistingEmail\n }\n });\n\n if (isValidEmail && !isExistingEmail && isValidPassword) {\n handleEmailFormSubmit();\n } else {\n setIsProcessing(false); // let user try again\n\n if (recaptchaRef.current) {\n recaptchaRef.current.reset();\n }\n if (!isValidPassword) {\n passwordInput?.current?.focus();\n }\n // prioritize focus on email input if both password and email inputs are invalid\n if (!isValidEmail || isExistingEmail) {\n emailInput?.current?.focus();\n }\n }\n };\n\n const handleInputChange = (event: React.ChangeEvent) => {\n const { target } = event;\n const { name } = target;\n\n // save honeyPot input as 'honeyPot' instead of whatever the value of honeyPot is\n // (server determines honeyPot value)\n setFormInput((prev) => {\n return { ...prev, [name === honeyPot ? 'honeyPot' : name]: target.value };\n });\n\n // clear input specific errors\n if (name === 'email' && emailValidationState?.message) {\n setEmailValidationState(null);\n } else if (passwordErrorMsg) {\n setPasswordErrMsg(null);\n }\n // clear alerts on all input changes\n clearAlerts(EMAIL_REGISTRATION_FORM_ALERT_ID);\n };\n\n return (\n \n \n\n \n\n {/**\n * Honeypot input is hidden to real users but visible to bots.\n * It should be a value that seems legit to bots but one we don't actually use/care about.\n * If the input is populated, we know it's a bot. */}\n
\n \n \n
\n\n {useRecaptcha && (\n \n )}\n\n \n {isProcessing ? : t(`${i18nPrefix}.sign_up`)}\n \n \n );\n};\n\nexport default EmailRegistrationForm;\n","import { APPLE, EMAIL, FACEBOOK, GOOGLE } from './constants';\n\ntype ElementTypes =\n | typeof APPLE\n | typeof EMAIL\n | typeof FACEBOOK\n | typeof GOOGLE;\n\nexport const elemAttrForAnalytics = (option: ElementTypes) => {\n switch (option) {\n case FACEBOOK:\n return 'facebook_signup';\n case APPLE:\n return 'apple_signup';\n case EMAIL:\n return 'email_signup';\n case GOOGLE:\n return 'google_signup';\n default:\n return 'signup';\n }\n};\n","import apiClient from '@strava/api/lib/axios-client';\n\ntype SubmitFormDataSuccessResponse = {\n success: boolean;\n pathType: string;\n load: string;\n};\n\ntype SubmitFormDataErrorResponse = {\n error: string;\n};\n\ntype SubmitFormDataResponseType =\n | SubmitFormDataSuccessResponse\n | SubmitFormDataErrorResponse;\n\nexport const submitFormData = async ({\n formData,\n url,\n logError\n}: {\n formData: FormData;\n url: string;\n logError: (s: string | unknown) => void;\n}): Promise => {\n return new Promise((resolve, reject) => {\n apiClient({\n options: {\n headers: { 'Content-Type': 'multipart/form-data' }\n }\n })\n .post(url, formData)\n .then((response: { data: SubmitFormDataResponseType }) => {\n resolve(response.data);\n })\n .catch((error: unknown) => {\n logError(error);\n reject(error);\n });\n });\n};\n\nexport const isAlreadyRegisteredEmail = async (email: string) => {\n return new Promise((resolve, reject) => {\n apiClient()\n .get('/athletes/email_unique', { params: { email } })\n .then(({ data }: { data: boolean }) => {\n resolve(data);\n })\n .catch((error: unknown) => {\n reject(error);\n });\n });\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"disclaimerText\":\"DisclaimerText--disclaimerText--oXzH1\"};","import React from 'react';\nimport { Markup } from 'interweave';\nimport { useStravaTranslations } from '@strava/container-context';\nimport clsx from '@strava/ui/clsx/clsx';\n\nimport styles from './DisclaimerText.module.scss';\n\ntype DisclaimerTextProps = {\n className?: string;\n};\n\nconst DisclaimerText = ({ className }: DisclaimerTextProps) => {\n const { t } = useStravaTranslations();\n\n const legalTerms = t(\n 'authentication_ui.disclaimer_text.by_clicking_cta_html',\n { terms_path: '/legal/terms' }\n );\n\n const legalPrivacy = t(\n 'authentication_ui.disclaimer_text.view_privacy_policy_html',\n { privacy_path: '/legal/privacy' }\n );\n\n return (\n

\n {' '}\n \n

\n );\n};\n\nexport default DisclaimerText;\n","// extracted by mini-css-extract-plugin\nexport default {\"signUpModal\":\"SignUpModal--signUpModal--xO1Kx\",\"modalBody\":\"SignUpModal--modalBody--Gpmjz\",\"headerButtons\":\"SignUpModal--headerButtons--2U3lr\",\"loginButton\":\"SignUpModal--loginButton--Vs7UG\",\"closeButton\":\"SignUpModal--closeButton--47PoO\",\"alert\":\"SignUpModal--alert--Y+599\",\"headerText\":\"SignUpModal--headerText--G1lDl\",\"authButtons\":\"SignUpModal--authButtons--502Bu\",\"orDivider\":\"SignUpModal--orDivider--W38OK\",\"disclaimerText\":\"SignUpModal--disclaimerText--BQTmz\"};","import React, { useCallback, useEffect, useMemo } from 'react';\nimport Modal, { ModalBody } from '@strava/ui/Modal';\nimport Avatar from '@strava/ui/Avatar';\nimport {\n useStravaAnalytics,\n useStravaErrorLogging,\n useStravaTranslations\n} from '@strava/container-context';\nimport { useApple } from '@strava/react-hooks/src/use-apple';\nimport { AlertContainer, AlertProvider } from '@strava/ui/Alert';\nimport Button, { LinkButton } from '@strava/ui/Button';\nimport VisuallyHidden from '@strava/ui/VisuallyHidden';\nimport ActionsCancelNormalSmall from '@strava/icons/ActionsCancelNormalSmall';\nimport { color } from '@strava/ui-tokens/js';\nimport { Markup } from 'interweave';\nimport clsx from '@strava/ui/clsx';\nimport AccountAuthButton from '../AccountAuthButton';\nimport OrDivider from '../OrDivider';\nimport EmailRegistrationForm, {\n EmailRegistrationFormProps,\n EMAIL_REGISTRATION_FORM_ALERT_ID,\n AnalyticsFieldsTypes\n} from '../EmailRegistrationForm';\nimport DisclaimerText from '../DisclaimerText';\nimport { APPLE, FACEBOOK, GOOGLE, HIDE_TIME_DELAY_MODAL } from '../constants';\nimport { useSignUpModalContext } from './SignUpModalContext';\nimport styles from './SignUpModal.module.scss';\n\n// using `require` here instead of import to avoid adding `declare module '*.svg'`\n// everywhere the `@strava/authentication-ui` package is imported\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst echelon = require('./assets/strava-echelon.svg');\n\nexport type SignUpModalProps = {\n authorizationUrls: {\n email: string;\n facebook: string;\n google: string;\n };\n appleState: string;\n category: string;\n className?: string;\n} & EmailRegistrationFormProps;\n\nconst i18nPrefix = 'sign_up_modal';\nconst AUTH_BUTTONS = [GOOGLE, APPLE, FACEBOOK] as const;\n\nconst SignUpModal = ({\n className,\n authorizationUrls,\n appleState,\n category,\n ...props\n}: SignUpModalProps) => {\n const { track: _track } = useStravaAnalytics();\n const { t } = useStravaTranslations();\n const { logError } = useStravaErrorLogging();\n const { signin: appleSignin } = useApple(appleState, logError);\n\n const {\n isSignUpModalOpen,\n dismissSignUpModal,\n variant,\n copyParams,\n athleteAvatar,\n defaultRedirectUrl,\n useActiveAfterAuth\n } = useSignUpModalContext();\n\n // If we need to add `_v2` strings for the variants, we'd need to map them to the proper variant.\n // The variant is used for more than just copy, so we could end up with `follow_athlete` as a variant\n // but want to use `follow_athlete_v2` for the copy.\n\n const track = useCallback(\n (fields: AnalyticsFieldsTypes) => {\n _track({\n category,\n page: 'signup_modal',\n ...fields,\n properties: {\n copy_variant: variant,\n ...fields.properties\n }\n });\n },\n [_track, category, variant]\n );\n\n const handleExtAuthBtnClick = (\n option: typeof FACEBOOK | typeof GOOGLE | typeof APPLE\n ) => {\n track({ action: 'click', element: `${option}_signup` });\n\n if (option === APPLE) {\n appleSignin();\n } else {\n window.location.assign(authorizationUrls[option]);\n }\n };\n\n useEffect(() => {\n if (isSignUpModalOpen) {\n // register screen_enter event each time modal is opened\n track({ action: 'screen_enter' });\n\n if (sessionStorage.getItem(HIDE_TIME_DELAY_MODAL) !== 'true') {\n // repress time delayed modal since modal has now been seen\n sessionStorage.setItem(HIDE_TIME_DELAY_MODAL, 'true');\n }\n }\n }, [isSignUpModalOpen, track]);\n\n const loginLink = useMemo(() => {\n if (defaultRedirectUrl && !useActiveAfterAuth) {\n return `/login?redirect=${encodeURIComponent(defaultRedirectUrl)}`;\n }\n return '/login';\n }, [defaultRedirectUrl, useActiveAfterAuth]);\n\n return (\n \n \n \n
\n track({ action: 'click', element: 'login' })}\n >\n {t(`${i18nPrefix}.log_in`)}\n \n {\n track({ action: 'click', element: 'close_modal' });\n dismissSignUpModal();\n }}\n type=\"button\"\n variant=\"icon\"\n className={styles.closeButton}\n title={t(`${i18nPrefix}.close`)}\n data-cy=\"sign-up-modal-close-button\"\n >\n {t(`${i18nPrefix}.close`)}\n \n \n
\n\n
\n {variant === 'follow_athlete' ? (\n \n ) : (\n \"\"\n )}\n

\n \n

\n

{t(`${i18nPrefix}.${variant}.subtitle`)}

\n
\n\n \n\n
\n {AUTH_BUTTONS.map((option) => (\n handleExtAuthBtnClick(option)}\n data-testid={`${option}_auth_btn`}\n key={option}\n >\n {t(`${i18nPrefix}.signup_ctas.${option}_cta`)}\n \n ))}\n
\n\n \n\n \n\n \n
\n \n
\n );\n};\n\nexport default SignUpModal;\n","export const YOUNGEST_AGE_ON_PLATFORM = 13;\n\nexport const YOUNGEST_AGE_FOR_HEALTH_AND_PROMO = 16;\n\nexport const GENDER = Object.freeze({\n man: 'man',\n woman: 'woman',\n preferNotSay: 'prefer_not_say',\n nonBinary: 'nonbinary'\n});\nexport type GenderType = (typeof GENDER)[keyof typeof GENDER];\n\nexport const LOCALE = Object.freeze({\n deDE: 'de-DE',\n enUS: 'en-US',\n enGB: 'en-GB',\n esES: 'es-ES',\n es419: 'es-419',\n frFR: 'fr-FR',\n itIT: 'it-IT',\n jaJP: 'ja-JP',\n nlNL: 'nl-NL',\n ptBR: 'pt-BR',\n ptPT: 'pt-PT',\n ruRU: 'ru-RU',\n zhCN: 'zh-CN',\n zhTW: 'zh-TW'\n});\nexport type LocaleType = (typeof LOCALE)[keyof typeof LOCALE];\n\n// If a language has more than one locale, the first in the list is the default\nexport const LANGUAGE_LOCALES = Object.freeze({\n de: [LOCALE.deDE],\n // en is intentionally omitted here since English is the global default\n es: [LOCALE.esES, LOCALE.es419],\n fr: [LOCALE.frFR],\n it: [LOCALE.itIT],\n ja: [LOCALE.jaJP],\n nl: [LOCALE.nlNL],\n pt: [LOCALE.ptPT, LOCALE.ptBR],\n ru: [LOCALE.ruRU],\n zh: [LOCALE.zhCN, LOCALE.zhTW]\n});\nexport type LanguageLocaleType =\n (typeof LANGUAGE_LOCALES)[keyof typeof LANGUAGE_LOCALES];\n\nexport const EXPERIMENT_TARGETS = Object.freeze({\n all: 'all',\n android: 'android',\n desktop: 'desktop',\n iphone: 'iphone',\n mobile: 'mobile'\n});\n\nexport type ExperimentTargetType =\n (typeof EXPERIMENT_TARGETS)[keyof typeof EXPERIMENT_TARGETS];\n\nexport const EXPERIMENT_COHORTS = Object.freeze({\n control: 'control',\n variantA: 'variant-a',\n variantB: 'variant-b',\n variantC: 'variant-c'\n});\nexport type ExperimentCohortType =\n (typeof EXPERIMENT_COHORTS)[keyof typeof EXPERIMENT_COHORTS];\n\nexport const MOBILE_OS = Object.freeze({\n android: 'android',\n iPhone: 'iphone',\n iPad: 'ipad'\n});\nexport type MobileOSType = (typeof MOBILE_OS)[keyof typeof MOBILE_OS];\n\nexport const SUPPORTED_BROWSERS = Object.freeze({\n chrome: 'chrome',\n firefox: 'firefox',\n safari: 'safari'\n});\nexport type SupportedBrowserType =\n (typeof SUPPORTED_BROWSERS)[keyof typeof SUPPORTED_BROWSERS];\n\n// universal link paths from 'apple-app-site-association' file in active\nexport const APPLE_APP_LINK_PATHS = [\n '/dashboard',\n '/activities/*',\n '/athletes/*',\n '/segments/*',\n '/challenges/*',\n '/videos/*',\n '/routes/*',\n '/premium/*',\n '/settings/*',\n '/shop/*',\n '/athlete/*',\n '/clubs/*',\n '/summit/join',\n '/summit/perks',\n '/oauth/mobile/authorize'\n];\n\nexport const ATHLETES_VISIBILITY = Object.freeze({\n optedOut: 'opted_out' // Strava::Athletes::Visibility::OPTED_OUT\n});\nexport type AthletesVisibilityType =\n (typeof ATHLETES_VISIBILITY)[keyof typeof ATHLETES_VISIBILITY];\n","export const isTest = () => process.env.NODE_ENV === 'test';\n\nexport const isDev = () => process.env.NODE_ENV === 'development';\n\nexport const isProd = () => {\n const { hostname } = window?.location || {};\n return hostname === 'www.strava.com' || hostname === 'admin.strava.com';\n};\n\nexport const timeout = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\nexport const devLog = (message: string | object, warn = false) => {\n if (isDev()) {\n if (warn) {\n // eslint-disable-next-line no-console\n console.warn(message);\n } else {\n // eslint-disable-next-line no-console\n console.log(message);\n }\n }\n};\n","import {\n MOBILE_OS,\n SUPPORTED_BROWSERS,\n APPLE_APP_LINK_PATHS,\n ExperimentCohortType,\n EXPERIMENT_COHORTS\n} from '@strava/constants/src/appConstants';\nimport { isString } from 'lodash-es';\nimport camelCase from 'lodash-es/camelCase';\nimport snakeCase from 'lodash-es/snakeCase';\nimport isObject from 'lodash-es/isObject';\nimport {\n CamelCasedProperties,\n CamelCasedPropertiesDeep,\n SnakeCasedPropertiesDeep\n} from 'type-fest';\nimport { devLog } from './dev.utils';\n\nexport const generateRandomId = () => Math.random().toString(36).substring(2);\n\n// Capitalizes all the words and replaces some characters in the string to create a nicer looking title.\n// eg. 'man from the boondocks' => 'Man From The Boondocks'\nexport const titleize = (sentence: string) => {\n return sentence\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n};\n\nexport const displayName = (\n { firstName = '', lastName = '' },\n options = { forceAnonymize: false, maxLength: 100 }\n) => {\n const { maxLength, forceAnonymize } = options;\n const fullName = `${firstName} ${lastName}`;\n\n if (forceAnonymize || fullName.length > maxLength) {\n if (firstName.length > maxLength - 3) {\n return `${titleize(firstName.substring(0, maxLength - 4))}... ${lastName\n .charAt(0)\n .toUpperCase()}.`;\n }\n return `${titleize(firstName)} ${lastName.charAt(0).toUpperCase()}.`;\n }\n return fullName.trim();\n};\n\n/**\n * Checks to see if device is mobile\n * @param {string} userAgent - user agent string for the current browser. For next-js apps (SSR),\n * this value can be retrieved from request.headers['user-agent']\n * @returns {boolean} - true if the device is mobile\n */\nexport const isMobile = (\n userAgent = typeof window === 'undefined'\n ? null\n : window?.navigator?.userAgent\n) => {\n if (isString(userAgent)) {\n // ref - https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#mobile_tablet_or_desktop\n return userAgent.toLowerCase().includes('mobi');\n }\n return false;\n};\n\n/**\n * Determines the OS for mobile devices\n * @param {string} userAgent - user agent string for the current browser. For next-js apps (SSR),\n * this value can be retrieved from request.headers['user-agent']\n * @returns {(string|null)} - one of ['android', 'ipad', 'iphone'] or null for unknown\n */\nexport const getMobileOS = (\n userAgent = typeof window === 'undefined'\n ? null\n : window?.navigator?.userAgent\n) => {\n if (isString(userAgent)) {\n if (userAgent.includes('Android')) {\n return MOBILE_OS.android;\n }\n if (userAgent.includes('iPad')) {\n return MOBILE_OS.iPad;\n }\n if (userAgent.includes('iPhone')) {\n return MOBILE_OS.iPhone;\n }\n }\n return null;\n};\n\n/**\n * Determines, in a limited fashion, the browser according to the user agent.\n * NOTE: UAs are notoriously difficult to parse. This is meant as a bare-bones, noncomprehensive parser,\n * based on https://www.whatismybrowser.com/guides/the-latest-user-agent/.\n *\n * The order of conditionals is important, bc some Chrome & Firefox UAs include 'Safari', too.\n * Some Edge UAs may be recognized as Chrome for now, since they can include 'Chrome'. We don't\n * officially support Edge (yet?).\n *\n * @param {string} userAgent - user agent string for the current browser. For next-js apps (SSR),\n * this value can be retrieved from request.headers['user-agent']\n * @returns {(string|null)} - one of ['chrome', 'firefox', 'safari'] or null for unknown/unsupported browser\n */\nexport const getBrowser = (userAgent = window?.navigator?.userAgent) => {\n if (isString(userAgent)) {\n if (userAgent.includes('Chrome') || userAgent.includes('CriOS')) {\n return SUPPORTED_BROWSERS.chrome;\n }\n if (userAgent.includes('Firefox') || userAgent.includes('FxiOS'))\n return SUPPORTED_BROWSERS.firefox;\n if (userAgent.includes('Safari')) {\n return SUPPORTED_BROWSERS.safari;\n }\n }\n\n return null;\n};\n\n/**\n * Universal links are determined by the paths described in `apple-app-site-association` in active.\n * @param {string} pathname - window.location.pathname or nextjs equivalent\n * @returns {boolean} - whether the pathname string matches\n */\nexport const isUniversalLinkPage = (pathname: string) => {\n if (isString(pathname)) {\n return APPLE_APP_LINK_PATHS.some((path: string) => {\n const pathWithoutAsterisk = path.replace('/*', '');\n return pathname.startsWith(pathWithoutAsterisk);\n });\n }\n return false;\n};\n\n// eg. given,\n// \"urls\": {\n// \"100\": \"https://photo_url_1\",\n// \"1800\": \"https://photo_url_2\"\n// }\n// returns https://photo_url_2\nexport const getPhotoWithMaxDimension = (\n photoUrlHash: Record\n) => {\n if (!isObject(photoUrlHash)) {\n return '';\n }\n const key = Object.keys(photoUrlHash).reduce((a, b) => (a > b ? a : b));\n return photoUrlHash[key];\n};\n\n/**\n * Immutably merges a payload into an item in an array of objects\n * @param {array} array - An array of objects\n * @param {string|number} id - The unique id of the item in the array to update\n * @param {object} payload - the value to merge into the matched item\n * @param {object} options\n * @param {string} [options.idName=id] - the key of the unique identifier\n * @param {bool} [options.upsert=false] - if true, will insert the payload into the array as a new item if no matching item is found\n * @return {array} - A copy of the original array with the matching item updated\n */\nexport function arrayUpdateItemById(\n array: T[],\n id: string | number,\n payload: Partial,\n { idName, upsert }: { idName?: keyof T; upsert?: boolean } = {}\n): T[] {\n let itemFound = false;\n const property = idName || ('id' as keyof T);\n const mappedArray = array.map((item) => {\n itemFound = itemFound || item[property] === id;\n return item[property] === id ? { ...item, ...payload } : item;\n });\n\n return itemFound || !upsert ? mappedArray : ([...array, payload] as T[]);\n}\n\n/**\n * Immutably removes an item from an array by index\n * @param {array} array\n * @param {number} index - the index of the item to remove\n * @return {array} - A copy of the original array with the matching item removed\n */\nexport function arrayRemoveByIndex(array: T[], index: number): T[] {\n return index === -1\n ? array\n : [...array.slice(0, index), ...array.slice(index + 1)];\n}\n\n/**\n * Immutably removes an item from an array of objects\n * @param {array} array - An array of objects\n * @param {string|number} id - The unique id of the item in the array to remove\n * @param {string} [idName=id] - the key of the unique identifier\n * @return {array} - A copy of the original array with the matching item removed\n */\n\nexport function arrayRemoveItemById(\n array: T[],\n propertyValue: string | number,\n idName = 'id'\n): T[] {\n const index = array.findIndex(\n (item) => item[idName as keyof T] === propertyValue\n );\n return arrayRemoveByIndex(array, index);\n}\n\nexport const capitalizeFirstLetter = (string: string) =>\n `${string.charAt(0).toUpperCase()}${string.slice(1)}`;\n\n/**\n * @description Converts Object keys from string of any case to camelCase.\n * Handles nested objects and arrays.\n * */\nexport function convertKeysToCamel(\n object: T,\n isShallow: true\n): CamelCasedProperties;\nexport function convertKeysToCamel(\n object: T,\n isShallow?: false\n): CamelCasedPropertiesDeep;\nexport function convertKeysToCamel(object: T, isShallow?: boolean) {\n if (Array.isArray(object)) {\n return (object as unknown[]).map((item) =>\n convertKeysToCamel(item)\n ) as typeof isShallow extends true\n ? CamelCasedProperties\n : CamelCasedPropertiesDeep;\n }\n\n if (isObject(object)) {\n return Object.keys(object).reduce((o, k) => {\n const key = camelCase(k);\n const value = object[k as keyof typeof object] as CamelCasedProperties;\n\n if (!isShallow && isObject(value)) {\n return {\n ...o,\n [key]: convertKeysToCamel(value)\n };\n }\n\n if (!isShallow && Array.isArray(value)) {\n return {\n ...o,\n [key]: (value as unknown[]).map((item) => convertKeysToCamel(item))\n };\n }\n\n return {\n ...o,\n [key]: value\n };\n }, {} as CamelCasedProperties);\n }\n\n return object as typeof isShallow extends true\n ? CamelCasedProperties\n : CamelCasedPropertiesDeep;\n}\n\n/**\n * @description Converts Object keys from string of any case to snakeCase.\n * Handles nested objects and arrays.\n * */\nexport function convertKeysToSnake(object: T): SnakeCasedPropertiesDeep {\n if (Array.isArray(object)) {\n return (object as unknown[]).map((item) =>\n convertKeysToSnake(item)\n ) as SnakeCasedPropertiesDeep;\n }\n\n if (isObject(object)) {\n return Object.keys(object).reduce((o, k) => {\n const key = snakeCase(k);\n const value = object[\n k as keyof typeof object\n ] as SnakeCasedPropertiesDeep;\n\n if (isObject(value)) {\n return {\n ...o,\n [key]: convertKeysToSnake(value)\n };\n }\n\n if (Array.isArray(value)) {\n return {\n ...o,\n [key]: (value as unknown[]).map((item) => convertKeysToSnake(item))\n };\n }\n\n return {\n ...o,\n [key]: value\n };\n }, {} as SnakeCasedPropertiesDeep);\n }\n\n return object as SnakeCasedPropertiesDeep;\n}\n\n/**\n * Checks to see if localStorage is available\n *\n * @return {boolean} - true if localStorage can be used\n */\nexport const isLocalStorageAvailable = () => {\n const test = 'test';\n try {\n localStorage.setItem(test, test);\n localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * Checks to see if sessionStorage is available\n *\n * @return {boolean} - true if sessionStorage can be used\n */\nexport const isSessionStorageAvailable = () => {\n const test = 'test';\n try {\n sessionStorage.setItem(test, test);\n sessionStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * Appends querystring params to a URL\n *\n * @param {string} originalUrl - The original URL to append params to\n * @param {object} params - An object of key value parameters to append to URL\n * @return {string} - URL with params appended\n */\nexport const addParamsToURL = (originalUrl: string, params: object) => {\n const url = new URL(originalUrl);\n\n Object.entries(params).forEach(([key, value]) => {\n url.searchParams.append(key, value);\n });\n\n return url.toString();\n};\n\n/**\n * Get querystring param from URL\n *\n * @param {string} url - The full url\n * @param {string} param - A param to get value for\n * @return {string} - Param value\n */\nexport const getParamFromURL = (url: string, param: string) => {\n const [, queryParams] = url?.split('?') || [];\n const params = new URLSearchParams(queryParams);\n return params.get(param);\n};\n\n/**\n * Some of our logged-out pages have a full-screen image background.\n * This util helps with setting the background image on the `` element, and\n * just requires passing in the image to be used.\n * @param {string} background\n */\nexport const setFullScreenBackgroundImage = (background: string) => {\n // apply background image directly to ``\n const body = document.querySelector('body');\n if (body) {\n body.style.setProperty('background-image', `url(${background})`);\n body.style.setProperty('background-size', 'cover');\n body.style.setProperty('background-position', 'center');\n }\n};\n\n/**\n * Uses the host to determine if a page is being loaded in staging or localhost.\n *\n * This util function is helpful for apps that run on nextJS which has node process\n * defined as production in both staging and production.\n *\n * @param host - host name\n * @returns {boolean} - true if app is running in staging or local or webapp\n */\nexport const isStagingOrLocal = (host: string) =>\n ['staging', 'localhost', 'webapp'].some((_host) => host.includes(_host));\n\n/**\n * Adds an id property to each object in an array. Uses the object's index as the value for the id\n * @param {array} objects - An array of objects\n * @return {array} - A copy of the original array with id property added to each object\n */\nexport const arrayAddIndexAsId = (objects: Array) =>\n objects.map((object, index) => ({ ...object, id: index }));\n\n/**\n * Uses the host to determine if the protocol should be http or https\n *\n * @param host - host name\n * @returns {string} - Protocol (http / https)\n */\nexport const getProtocolForHost = (host: string) => {\n return host.includes('localhost') ? 'http' : 'https';\n};\n\n/**\n * Constructs the site root URL\n *\n * @param host - host name\n * @returns {string} - Root URL with protocol\n */\nexport const getRootUrl = (host: string) => {\n return `${getProtocolForHost(host)}://${host}`;\n};\n\n/**\n * Constructs the athlete URL for pro and non-pro athletes, i.e.\n * https://www.strava.com/athletes/[athlete_id] or\n * https://www.strava.com/pros/[athlete_id]\n *\n * @param isPro - boolean indicating if the athlete is a pro or not\n * @param athleteId - athlete unique identifier\n * @param host - host name\n * @returns {string} - Root URL with protocol\n */\nexport const getAthleteUrl = (\n isPro: boolean,\n athleteId: number,\n host: string\n) => {\n return `${getProtocolForHost(host)}://${host}/${\n isPro ? 'pros' : 'athletes'\n }/${athleteId.toString()}`;\n};\n\n/**\n * Creates a mock experiment object.\n * @param {string} url - The URL to extract the variant from.\n * @param {string} name - The name of the experiment.\n * @param {ExperimentCohortType} [cohort=EXPERIMENT_COHORTS.control] - The cohort of the experiment.\n * @returns {Object} The mock experiment object.\n */\nexport const mockExperiment = (\n url: string,\n name: string,\n cohort: ExperimentCohortType = EXPERIMENT_COHORTS.control\n) => {\n const queryVariant = getParamFromURL(url, 'variant');\n let _cohort = cohort;\n\n switch (queryVariant) {\n case 'control':\n _cohort = EXPERIMENT_COHORTS.control;\n break;\n case 'a':\n _cohort = EXPERIMENT_COHORTS.variantA;\n break;\n case 'b':\n _cohort = EXPERIMENT_COHORTS.variantB;\n break;\n case 'c':\n _cohort = EXPERIMENT_COHORTS.variantC;\n break;\n case 'd':\n _cohort = EXPERIMENT_COHORTS.variantD;\n break;\n default:\n break;\n }\n return {\n name,\n cohort: _cohort,\n forced: true\n };\n};\n\n/**\n * Checks whether url goes to strava or a strava subdomain on prod, or\n * localhost or webapp on localhost/testing.\n * See `application_controller#valid_redirect_param` in active.\n * @param {string} url - the URL to check (must be an absolute URL)\n * @param {string} currentHost - the current host to check against\n * @returns {boolean} - true if url has a valid host for a strava redirect,\n * false otherwise\n */\nexport const isValidStravaUrlForCurrentHost = (\n url: string,\n currentHost: string\n) => {\n try {\n const { host } = new URL(url);\n // always accept .strava.com\n if (/\\.strava\\.com/.test(host)) {\n return true;\n }\n // only accept localhost & webapp on localhost or webapp\n if (/localhost/.test(host) || /webapp/.test(host)) {\n return /localhost/.test(currentHost) || /webapp/.test(currentHost);\n }\n return false;\n } catch (error) {\n devLog(String(error));\n return false;\n }\n};\n","import React, {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport {\n devLog,\n isSessionStorageAvailable,\n isValidStravaUrlForCurrentHost\n} from '@strava/utils';\n\nexport type SignUpModalVariants =\n | 'generic'\n | 'generic_time_delayed'\n | 'follow_athlete'\n | 'join_challenge'\n | 'kudos_comment'\n | 'running_tools';\n\nexport type SignUpModalContextState = {\n /**\n * used by the logged-out page to trigger opening the modal with a particular variant\n * (also sets the variant in state and handles sessionStorage if the variant\n * is one of the special redirect variants)\n */\n openSignUpModal: (variant: SignUpModalVariants) => void;\n /** used by the modal */\n isSignUpModalOpen: boolean;\n /**\n * used by the modal, also handles sessionStorage to restore the redirect if the\n * variant was one of the special redirect variants\n */\n dismissSignUpModal: () => void;\n /** used by the modal */\n variant: SignUpModalVariants;\n /**\n * used by the modal, should include any params for the variants' different\n * header and subtitle copy\n */\n copyParams: Record>;\n /** used by the modal, src url for the athlete avatar */\n athleteAvatar: string;\n /** used by the modal to build the login link with the redirect param */\n defaultRedirectUrl?: string;\n /** used by the modal to prevent building the login link with the redirect param */\n useActiveAfterAuth?: boolean;\n};\n\nconst SignUpModalContext = createContext(\n undefined\n);\nSignUpModalContext.displayName = 'SignUpModalContext';\n\nexport const useSignUpModalContext = () => {\n const context = useContext(SignUpModalContext);\n\n // Fail fast if hook is used outside the provider\n if (!context) {\n throw new Error(\n 'useSignUpModalContext must be used within the SignUpModalContext provider'\n );\n }\n\n return context;\n};\n\nexport const SESSION_STORAGE_REDIRECT_KEY = 'redirect_to_after_signup';\n\ntype SignUpModalContextProviderProps = {\n /**\n * whatever children the context provider is wrapping\n * (ideally the parent container for whatever CTAs trigger the modal)\n */\n children: ReactNode;\n /** athlete's first name, used by the `follow_athlete` variant's copy (\"Follow {Firstname}\") */\n nameForFollowAthleteVariant: string;\n /** src url for the athlete avatar, used by the `follow_athlete` variant */\n athleteAvatar: string;\n /**\n * default url the user should be directed to after authentication.\n * when not provided, defaults to the current page url.\n */\n defaultRedirectUrl?: string;\n /**\n * redirect urls supercede `useActiveAfterAuth` (so a user who signs up from a\n * variant that has a redirect url will be redirected there). the url itself\n * must be an absolute url with a strava (or localhost, during dev) host.\n * @example\n * { follow_athlete: 'https://www.strava.com/athletes/123' }\n */\n redirectUrls?: Record;\n /**\n * when true, does not use the default redirect url (if provided) or set\n * the current page as the default redirect url (if default redirect url is\n * not provided). defaults to false.\n */\n useActiveAfterAuth?: boolean;\n /** called when the sign up modal is dismissed */\n onDismiss?: () => void;\n};\n\nexport const SignUpModalContextProvider = ({\n children,\n nameForFollowAthleteVariant,\n athleteAvatar,\n redirectUrls = {}, // redirect urls supercede `useActiveAfterAuth`\n defaultRedirectUrl: _defaultRedirectUrl,\n useActiveAfterAuth = false,\n onDismiss = () => {}\n}: SignUpModalContextProviderProps) => {\n const [isSignUpModalOpen, setIsSignUpModalOpen] = useState(false);\n const [defaultRedirectUrl, setDefaultRedirectUrl] = useState(\n _defaultRedirectUrl || ''\n );\n const [variant, setVariant] = useState('generic');\n\n const sessionStorageIsAvailable = useMemo(\n () => isSessionStorageAvailable(),\n []\n );\n\n const redirectUrlIsValid = useCallback(\n (redirectUrl) =>\n isValidStravaUrlForCurrentHost(\n redirectUrl,\n new URL(window?.location?.href).host\n ),\n []\n );\n\n const setSessionStorageRedirectUrl = useCallback(\n (redirectUrl) => {\n if (sessionStorageIsAvailable) {\n if (redirectUrlIsValid(redirectUrl)) {\n sessionStorage.setItem(SESSION_STORAGE_REDIRECT_KEY, redirectUrl);\n devLog(`SUM :: setting sessionStorage with ${redirectUrl}`);\n } else {\n devLog(`SUM :: ${redirectUrl} is an invalid redirect url`);\n }\n }\n },\n [redirectUrlIsValid, sessionStorageIsAvailable]\n );\n\n // on load, use the default redirect url if it's provided and valid,\n // otherwise use the current page; do nothing if we're using active's after\n // auth handling\n useEffect(() => {\n if (!useActiveAfterAuth) {\n const redirectUrl = redirectUrlIsValid(defaultRedirectUrl)\n ? defaultRedirectUrl\n : window?.location?.href;\n setSessionStorageRedirectUrl(redirectUrl);\n setDefaultRedirectUrl(redirectUrl);\n }\n }, [\n defaultRedirectUrl,\n redirectUrlIsValid,\n setSessionStorageRedirectUrl,\n useActiveAfterAuth\n ]);\n\n const openSignUpModal = useCallback(\n (_variant: SignUpModalVariants) => {\n setIsSignUpModalOpen(true);\n setVariant(_variant);\n\n // if variant has a special redirect, set it in session storage\n if (Object.keys(redirectUrls).includes(_variant)) {\n setSessionStorageRedirectUrl(redirectUrls[_variant]);\n }\n },\n [redirectUrls, setSessionStorageRedirectUrl]\n );\n\n const dismissSignUpModal = useCallback(() => {\n onDismiss();\n setIsSignUpModalOpen(false);\n\n // restore default redirect url unless we're using not using an after auth redirect\n if (Object.keys(redirectUrls).includes(variant)) {\n if (useActiveAfterAuth) {\n sessionStorage.removeItem(SESSION_STORAGE_REDIRECT_KEY);\n } else {\n setSessionStorageRedirectUrl(defaultRedirectUrl);\n }\n }\n }, [\n defaultRedirectUrl,\n onDismiss,\n redirectUrls,\n setSessionStorageRedirectUrl,\n useActiveAfterAuth,\n variant\n ]);\n\n const providerState = useMemo(\n () => ({\n openSignUpModal,\n dismissSignUpModal,\n isSignUpModalOpen,\n variant,\n copyParams: {\n generic: {},\n generic_time_delayed: {},\n follow_athlete: { name: nameForFollowAthleteVariant },\n join_challenge: {},\n kudos_comment: {},\n running_tools: {}\n },\n athleteAvatar,\n defaultRedirectUrl,\n useActiveAfterAuth\n }),\n [\n openSignUpModal,\n dismissSignUpModal,\n isSignUpModalOpen,\n variant,\n nameForFollowAthleteVariant,\n athleteAvatar,\n defaultRedirectUrl,\n useActiveAfterAuth\n ]\n );\n\n return (\n \n {children}\n \n );\n};\n","// authentication options\nexport const APPLE = 'apple';\nexport const EMAIL = 'email';\nexport const FACEBOOK = 'facebook';\nexport const GOOGLE = 'google';\n\n// session storage key(s)\nexport const HIDE_TIME_DELAY_MODAL = 'hide-time-delay-modal';\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SvgAchievementsTrophyNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgAchievementsTrophyNormalSmall.defaultProps = {\n color: 'currentColor',\n size: 24,\n title: undefined,\n titleId: undefined\n};\nSvgAchievementsTrophyNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string\n};\nexport default SvgAchievementsTrophyNormalSmall;\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SvgActionsCommentNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n )\n);\nSvgActionsCommentNormalSmall.defaultProps = {\n color: 'currentColor',\n size: 24,\n title: undefined,\n titleId: undefined\n};\nSvgActionsCommentNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string\n};\nexport default SvgActionsCommentNormalSmall;\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SvgActionsKudoNormalSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgActionsKudoNormalSmall.defaultProps = {\n color: 'currentColor',\n size: 24,\n title: undefined,\n titleId: undefined\n};\nSvgActionsKudoNormalSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string\n};\nexport default SvgActionsKudoNormalSmall;\n","import * as React from 'react';\nimport PropTypes from 'prop-types';\n\nconst SvgActionsLockClosedNormalXsmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n )\n);\nSvgActionsLockClosedNormalXsmall.defaultProps = {\n color: 'currentColor',\n size: 16,\n title: undefined,\n titleId: undefined\n};\nSvgActionsLockClosedNormalXsmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string\n};\nexport default SvgActionsLockClosedNormalXsmall;\n","export const fontFamilyMaisonNeue = \"\\\"MaisonNeue\\\", \\\"Segoe UI\\\", \\\"Helvetica Neue\\\", -apple-system, system-ui, BlinkMacSystemFont, Roboto, Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\"\";\nexport const fontWeightDemi = \"600\";\nexport const fontWeightMedium = \"500\";\nexport const fontWeightBook = \"400\";\nexport const lineHeightSm = \"100%\";\nexport const lineHeightMd = \"110%\";\nexport const lineHeightLg = \"130%\";\nexport const lineHeightXl = \"150%\";\nexport const lineHeight2xl = \"170%\";\nexport const fontSizeScale = \"1.125\"; // scale token used to create our typescale ramp - we use Major third scale\nexport const fontSizeBase = \"1rem\"; // 1rem // base units for typescaling\nexport const fontSize3xs = \".625rem\"; // 10px\nexport const fontSize2xs = \".75rem\"; // 12px\nexport const fontSizeXs = \".875rem \"; // 14px\nexport const fontSizeSm = \"1rem\"; // 16px\nexport const fontSizeMd = \"1.25rem\"; // 20px\nexport const fontSizeLg = \"1.5rem\"; // 24px\nexport const fontSizeXl = \"2rem\"; // 32px\nexport const fontSize2xl = \"3rem\"; // 48px\nexport const fontSize3xl = \"4rem\"; // 64px\nexport const fontSize4xl = \"5rem\"; // 80px\nexport const fontSize5xl = \"6rem\"; // 96px\nexport const letterSpacingNone = \"0\";\nexport const letterSpacingSm = \"-0.02em\";\nexport const letterSpacingMd = \"0.01em\";\nexport const letterSpacingLg = \"0.02em\";\nexport const letterSpacingXl = \"0.04em\";\nexport const letterSpacing2xl = \"0.08em\";\nexport const letterSpacing3xl = \"0.16em\";\nexport const letterSpacing4xl = \"0.24em\";\nexport const typeCasingNormal = \"none\";\nexport const typeCasingAllCaps = \"uppercase\";\nexport const typeCasingTitle = \"capitalize\";\nexport const textDecorationNone = \"none\";\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgNavigationProfileHighlightedMedium = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n )\n);\nSvgNavigationProfileHighlightedMedium.defaultProps = {\n color: \"currentColor\",\n size: 32,\n title: undefined,\n titleId: undefined,\n};\nSvgNavigationProfileHighlightedMedium.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgNavigationProfileHighlightedMedium;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgBadgesMulticolorSuperuserSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n \n \n \n )\n);\nSvgBadgesMulticolorSuperuserSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgBadgesMulticolorSuperuserSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgBadgesMulticolorSuperuserSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgBadgesMulticolorSummitSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n \n \n \n )\n);\nSvgBadgesMulticolorSummitSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgBadgesMulticolorSummitSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgBadgesMulticolorSummitSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgBadgesMulticolorProSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n \n \n \n )\n);\nSvgBadgesMulticolorProSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgBadgesMulticolorProSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgBadgesMulticolorProSmall;\n","import * as React from \"react\";\nimport PropTypes from \"prop-types\";\nconst SvgBadgesMulticolorVerifiedSmall = React.forwardRef(\n ({ color, size, title, titleId, ...props }, ref) => (\n \n {title ? {title} : null}\n \n \n \n \n \n )\n);\nSvgBadgesMulticolorVerifiedSmall.defaultProps = {\n color: \"currentColor\",\n size: 24,\n title: undefined,\n titleId: undefined,\n};\nSvgBadgesMulticolorVerifiedSmall.propTypes = {\n color: PropTypes.string,\n size: PropTypes.number,\n title: PropTypes.string,\n titleId: PropTypes.string,\n};\nexport default SvgBadgesMulticolorVerifiedSmall;\n","// extracted by mini-css-extract-plugin\nexport default {\"avatar\":\"Avatar--avatar--EjA+i\",\"imgWrapper\":\"Avatar--imgWrapper--no4rK\",\"badge\":\"Avatar--badge--AGhgx\",\"athlete\":\"Avatar--athlete--swByo\",\"xsmall\":\"Avatar--xsmall--ooxrp\",\"small\":\"Avatar--small--d-InS\",\"large\":\"Avatar--large--yUfy1\",\"xlarge\":\"Avatar--xlarge--Yt5UL\",\"club\":\"Avatar--club--HMeLa\",\"default\":\"Avatar--default--cRgUh\"};","import React, { useEffect } from 'react';\nimport { useSafeState } from '@strava/react-hooks/src/use-safe-state';\nimport AvatarFallback from '@strava/icons/NavigationProfileHighlightedMedium';\nimport EmployeeBadge from '@strava/icons/BadgesMulticolorSuperuserSmall';\nimport SubscriberBadge from '@strava/icons/BadgesMulticolorSummitSmall';\nimport ProBadge from '@strava/icons/BadgesMulticolorProSmall';\nimport VerifiedBadge from '@strava/icons/BadgesMulticolorVerifiedSmall';\nimport clsx from '../clsx';\n\nimport styles from './Avatar.module.scss';\n\ninterface ImgProps {\n src: string;\n alt: string;\n title: string;\n fallback?: React.ReactNode;\n}\n\nconst Img = ({ src, alt, title, fallback = null }: ImgProps) => {\n const [children, setChildren] = useSafeState(\n {alt}\n );\n\n useEffect(() => {\n let image: HTMLImageElement | null = new Image();\n image.onload = () => {\n setChildren({alt});\n };\n image.onerror = () => {\n setChildren(fallback);\n };\n image.src = src;\n return () => {\n image = null;\n };\n }, [src, alt, title, fallback]);\n\n return <>{children};\n};\n\nfunction getBadge(badge: string) {\n switch (badge) {\n case 'ambassador':\n return ;\n case 'employee':\n return ;\n case 'subscriber':\n case 'premium':\n return ;\n case 'pro':\n return ;\n case 'verified':\n return ;\n default:\n return null;\n }\n}\n\nexport type AvatarType = 'athlete' | 'club';\nexport type AvatarSize = 'xsmall' | 'small' | 'default' | 'large' | 'xlarge';\nexport type AvatarBadge =\n | '' // in some cases active has member_type as empty string for default users\n | 'ambassador'\n | 'employee'\n | 'subscriber'\n | 'premium' // legacy name referring to 'subscriber', used in active\n | 'pro'\n | 'verified';\n\ninterface BaseAvatarProps {\n src: string;\n type: AvatarType;\n name?: string;\n alt?: string;\n title?: string;\n size?: AvatarSize;\n badge?: AvatarBadge;\n className?: string;\n}\n\ntype AnchorProps = React.ComponentPropsWithoutRef<'a'> & {\n href?: string;\n};\ntype DivProps = React.ComponentPropsWithoutRef<'div'> & {\n href?: never;\n};\n\n// Guard to check if href exists in props\nconst hasHref = (props: AnchorProps | DivProps): props is AnchorProps =>\n 'href' in props;\n\ntype AvatarProps = BaseAvatarProps & (AnchorProps | DivProps);\n\n/**\n * Prop Deprecation Warning: We are slowly deprecating the `name` prop in favor of the `title` prop\n * so that the React props match up to the element's attribute.\n * */\nconst Avatar = ({\n name = '',\n alt = '',\n title,\n type,\n src,\n size,\n badge,\n className,\n ...otherProps\n}: AvatarProps) => {\n const classNames = clsx([\n styles.avatar,\n styles[type],\n className,\n size && styles[size]\n ]);\n\n // TODO: uncomment when existing Avatar usage is refactored. Otherwise, there will be a lot of warning in the console.\n // if (name || process.env.NODE_ENV !== 'production') {\n // console.warn(\n // '[Prop Deprecation Warning] Deprecating the `name` prop in favor of the `title`.'\n // );\n // }\n\n const children = (\n <>\n {badge &&
{getBadge(badge)}
}\n
\n : null}\n />\n
\n \n );\n\n if (hasHref(otherProps)) {\n return (\n \n {children}\n \n );\n }\n\n return (\n \n {children}\n \n );\n};\n\nexport default Avatar;\n","import {\n Dispatch,\n SetStateAction,\n useRef,\n useCallback,\n useEffect,\n useState\n} from 'react';\n\n/**\n * The `useSafeState` hook acts the same as React's `useState`,\n * where we can set the initial state, and it returns (1) the current state,\n * and (2) the state setter.\n *\n * But with `useSafeState`, it will only set the state when the component is mounted\n * in order to prevent memory leaks and avoid this warning:\n * \"Warning: Can’t perform a React state update on an unmounted component.\"\n * When a component is unmounted, we don't want to set the state.\n *\n * This helps when we have async behavior where we call an async API call,\n * then based on the async response, we set the state. But if the component\n * unmounts before the API call resolves, we don't want to set the state.\n * */\n// eslint-disable-next-line import/prefer-default-export\nexport const useSafeState = (\n initialState: S | (() => S)\n): [S, Dispatch>] => {\n const mountedRef = useRef(false);\n const [state, setState] = useState(initialState);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const setSafeState = useCallback(\n (args: SetStateAction) =>\n mountedRef.current ? setState(args) : () => {},\n []\n );\n\n return [state, setSafeState];\n};\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n","// extracted by mini-css-extract-plugin\nexport default {\"area\":\"ElevationChart--area--rQlaC\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { area } from 'd3-shape';\nimport styles from './area.module.scss';\n\nconst Area = ({ stream, xScale, yScale, height, clipPath, fill }) => {\n const formatData = stream.convertedElevation.map((elev, index) => ({\n elev,\n dist: stream.convertedDistance[index]\n }));\n\n const drawArea = area()\n .x((d) => xScale(d.dist))\n .y1((d) => yScale(d.elev))\n .y0(height);\n\n return (\n \n \n \n );\n};\n\nArea.propTypes = {\n xScale: PropTypes.func.isRequired,\n yScale: PropTypes.func.isRequired,\n height: PropTypes.number.isRequired,\n stream: PropTypes.shape().isRequired,\n clipPath: PropTypes.string,\n fill: PropTypes.string\n};\n\nArea.defaultProps = {\n clipPath: null,\n fill: 'rgba(100, 100, 100, 0.66)'\n};\n\nexport default Area;\n","// extracted by mini-css-extract-plugin\nexport default {\"axis\":\"ElevationChart--axis--kmMnQ\",\"yAxis\":\"ElevationChart--yAxis--ZTl9K\",\"xAxis\":\"ElevationChart--xAxis--Md58V\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { axisBottom, axisLeft } from 'd3-axis';\nimport { select } from 'd3-selection';\nimport styles from './axis.module.scss';\n\nclass Axis extends React.Component {\n xAxisNode = React.createRef();\n\n yAxisNode = React.createRef();\n\n componentDidMount() {\n this.drawAxes();\n }\n\n componentDidUpdate(prevProps) {\n const { scopeTo, width, xScale, yScale } = this.props;\n\n const hasScopeChanged =\n scopeTo &&\n (prevProps.scopeTo[0] !== scopeTo[0] ||\n prevProps.scopeTo[1] !== scopeTo[1]);\n\n const hasScaleChanged =\n !this.scalesAreEqual(xScale, prevProps.xScale) ||\n !this.scalesAreEqual(yScale, prevProps.yScale);\n\n const hasWidthChanged = prevProps.width !== width;\n\n if (hasScopeChanged || hasWidthChanged || hasScaleChanged) {\n this.drawAxes();\n }\n }\n\n scalesAreEqual = (scaleA, scaleB) => {\n return scaleA\n .domain()\n .every((domainElement) => scaleB.domain().includes(domainElement));\n };\n\n drawAxes() {\n const { xScale, yScale, width, formatters } = this.props;\n const { elevationFormatter, distanceFormatter } = formatters;\n const xAxis = axisBottom(xScale);\n const yAxis = axisLeft(yScale);\n const xTickCount = width > 480 ? 8 : 4;\n\n yAxis\n .ticks(4)\n .tickSize(-width)\n .tickFormat((e) =>\n // As e here is converted/formatted value we need to unconver it\n // so that the value does not get converted twice.\n elevationFormatter.formatShort(e / elevationFormatter.convert(1.0))\n );\n\n xAxis.ticks(xTickCount).tickFormat((d) =>\n // As d here is converted/formatted value we need to unconver it\n // so that the value does not get converted twice.\n distanceFormatter.formatShort(d / distanceFormatter.convert(1.0))\n );\n\n yAxis(select(this.yAxisNode.current));\n xAxis(select(this.xAxisNode.current));\n }\n\n render() {\n const { height } = this.props;\n\n return (\n <>\n \n \n \n );\n }\n}\n\nexport default Axis;\n\nAxis.propTypes = {\n xScale: PropTypes.func.isRequired,\n yScale: PropTypes.func.isRequired,\n height: PropTypes.number.isRequired,\n width: PropTypes.number.isRequired,\n formatters: PropTypes.shape().isRequired,\n scopeTo: PropTypes.arrayOf(PropTypes.number)\n};\n\nAxis.defaultProps = {\n scopeTo: null\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"group\":\"Tooltip--group--n8WWI\",\"infoBox\":\"Tooltip--infoBox--ZM+mo\",\"value\":\"Tooltip--value--BYKCH\"};","import React, { useLayoutEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styles from './Tooltip.module.scss';\n\nconst Tooltip = ({ content, position, clipPath, chartWidth, chartMargin }) => {\n const textRef = useRef([]);\n const [boxWidth, setBoxWidth] = useState(120);\n const padding = 6;\n const lineHeight = 16;\n\n const rightBound = position + boxWidth + padding * 2;\n const currBoxAlign =\n rightBound >= chartWidth ? chartWidth - rightBound + padding : padding;\n\n useLayoutEffect(() => {\n if (textRef.current && Object.keys(content).length !== 0) {\n const widths = textRef.current.map(\n (el) => el.getBoundingClientRect().width\n );\n const maxWidth = Math.max(...widths);\n const newSize = Math.round(maxWidth + padding * 2);\n if (boxWidth !== newSize) {\n setBoxWidth(newSize);\n }\n }\n }, [content, boxWidth]);\n\n const InfoBox = () => {\n const keys = Object.keys(content);\n const contentLength = keys.length;\n const boxHeight = contentLength * lineHeight + padding + 2;\n\n return (\n \n \n {keys.map((stat, index) => {\n const contentItem = content[stat];\n\n function setRef(el) {\n textRef.current[index] = el;\n }\n\n return (\n \n {contentItem.label}\n \n {contentItem.value}\n \n \n );\n })}\n \n );\n };\n\n return (\n \n \n \n \n );\n};\n\nexport default Tooltip;\n\nTooltip.propTypes = {\n content: PropTypes.shape().isRequired,\n position: PropTypes.number.isRequired,\n clipPath: PropTypes.string.isRequired,\n chartWidth: PropTypes.number.isRequired,\n chartMargin: PropTypes.shape({\n top: PropTypes.number,\n right: PropTypes.number,\n bottom: PropTypes.number,\n left: PropTypes.number\n }).isRequired\n};\n","export const measurementUnitTypes = {\n METRIC: 'metric',\n IMPERIAL: 'imperial'\n} as const;\n\n// see active/lib/activities/types.rb for a full list\nexport const activityTypes = {\n RIDE: 1,\n HIKE: 4,\n RUN: 9,\n WALK: 10,\n VIRTUAL_RIDE: 17,\n VIRTUAL_RUN: 53\n} as const;\n\nexport const ridelikeTypes = [\n 'ride',\n 'virtual_ride',\n 'e_bike_ride',\n 'velomobile',\n 'handcycle'\n];\n\nexport const runlikeTypes = ['run', 'virtual_run', 'wheelchair'];\n\n// see active/lib/activities/workouts.rb for a full list\nexport const workoutTypes = {\n RUN_DEFAULT: 0,\n RUN_RACE: 1,\n RUN_LONG: 2,\n RUN_INTERVAL: 3,\n RIDE_DEFAULT: 10,\n RIDE_RACE: 11,\n RIDE_INTERVAL: 12\n} as const;\n\nexport const athleteTypes = {\n CYCLIST: 0,\n RUNNER: 1\n} as const;\n\n// These are the route types as specified in Active\n//\n// Based on routing thrift definition\n// https://github.com/strava/routing/blob/c2e86db37bb703234c0c18637cd626dc8263a5ec/routing-interface/src/main/thrift/routing.thrift#L9\nexport const routeTypes = {\n RIDE: 1,\n RUN: 2,\n WALK: 3,\n HIKE: 4,\n TRAIL_RUN: 5,\n GRAVEL_RIDE: 6,\n MOUNTAIN_BIKE_RIDE: 7\n} as const;\n\n// Based on routing thrift definition\n// https://github.com/strava/routing/blob/9e5e302c7c2490fa32a1499f7485964aeac0179a/routing-interface/src/main/thrift/routing.thrift#L9-L16\nexport const savedRouteSources = {\n EPHEMERAL: 1,\n CANONICAL: 2,\n MOBILE_SKETCH_A_ROUTE: 3,\n MOBILE_ROUTE_FROM_ACTIVITY: 4,\n WEB_ROUTE_FROM_ACTIVITY: 5,\n WEB_ROUTE_BUILDER: 6\n} as const;\n\n// Based on routing thrift definition\n// https://github.com/strava/routing/blob/c2e86db37bb703234c0c18637cd626dc8263a5ec/routing-interface/src/main/thrift/routing.thrift#L16\nexport const routeSubtypes = {\n ROAD: 1,\n MTB: 2,\n CX: 3,\n TRAIL: 4,\n MIXED: 5\n} as const;\n\nexport const routeLegTypes = {\n // user-specified fixed path\n FIXED: 1,\n // we figured out the leg from the basemap\n SEARCH: 2,\n // came from a Google lookup\n GOOGLE: 3,\n // user-specified segment\n SEGMENT: 4,\n // generated from an activity\n ACTIVITY: 5\n} as const;\n\n// Based on routing thrift definition\n// https://github.com/strava/routing/blob/4476c6235a2c9ee4ba9804d95fb92195e05c18d3/routing-interface/src/main/thrift/routing.thrift#L65-L69\nexport const surfaceType = {\n PAVED: 1,\n UNPAVED: 2,\n UNKNOWN: 3\n} as const;\n","// eslint-disable-next-line import/prefer-default-export\nexport const Status = Object.freeze({\n initial: 'INITIAL',\n loading: 'LOADING',\n loaded: 'LOADED',\n error: 'ERROR'\n});\n","export const ATHLETES_VISIBILITY_TYPES = Object.freeze({\n everyone: 'everyone',\n followers: 'followers_only',\n onlyMe: 'only_me',\n noOne: 'no_one',\n optedIn: 'opted_in',\n optedOut: 'opted_out'\n});\n\nexport default { ATHLETES_VISIBILITY_TYPES };\n","export const YOUNGEST_AGE_ON_PLATFORM = 13;\n\nexport const YOUNGEST_AGE_FOR_HEALTH_AND_PROMO = 16;\n\nexport const GENDER = Object.freeze({\n man: 'man',\n woman: 'woman',\n preferNotSay: 'prefer_not_say',\n nonBinary: 'nonbinary'\n});\nexport type GenderType = (typeof GENDER)[keyof typeof GENDER];\n\nexport const LOCALE = Object.freeze({\n deDE: 'de-DE',\n enUS: 'en-US',\n enGB: 'en-GB',\n esES: 'es-ES',\n es419: 'es-419',\n frFR: 'fr-FR',\n itIT: 'it-IT',\n jaJP: 'ja-JP',\n nlNL: 'nl-NL',\n ptBR: 'pt-BR',\n ptPT: 'pt-PT',\n ruRU: 'ru-RU',\n zhCN: 'zh-CN',\n zhTW: 'zh-TW'\n});\nexport type LocaleType = (typeof LOCALE)[keyof typeof LOCALE];\n\n// If a language has more than one locale, the first in the list is the default\nexport const LANGUAGE_LOCALES = Object.freeze({\n de: [LOCALE.deDE],\n // en is intentionally omitted here since English is the global default\n es: [LOCALE.esES, LOCALE.es419],\n fr: [LOCALE.frFR],\n it: [LOCALE.itIT],\n ja: [LOCALE.jaJP],\n nl: [LOCALE.nlNL],\n pt: [LOCALE.ptPT, LOCALE.ptBR],\n ru: [LOCALE.ruRU],\n zh: [LOCALE.zhCN, LOCALE.zhTW]\n});\nexport type LanguageLocaleType =\n (typeof LANGUAGE_LOCALES)[keyof typeof LANGUAGE_LOCALES];\n\nexport const EXPERIMENT_TARGETS = Object.freeze({\n all: 'all',\n android: 'android',\n desktop: 'desktop',\n iphone: 'iphone',\n mobile: 'mobile'\n});\n\nexport type ExperimentTargetType =\n (typeof EXPERIMENT_TARGETS)[keyof typeof EXPERIMENT_TARGETS];\n\nexport const EXPERIMENT_COHORTS = Object.freeze({\n control: 'control',\n variantA: 'variant-a',\n variantB: 'variant-b',\n variantC: 'variant-c'\n});\nexport type ExperimentCohortType =\n (typeof EXPERIMENT_COHORTS)[keyof typeof EXPERIMENT_COHORTS];\n\nexport const MOBILE_OS = Object.freeze({\n android: 'android',\n iPhone: 'iphone',\n iPad: 'ipad'\n});\nexport type MobileOSType = (typeof MOBILE_OS)[keyof typeof MOBILE_OS];\n\nexport const SUPPORTED_BROWSERS = Object.freeze({\n chrome: 'chrome',\n firefox: 'firefox',\n safari: 'safari'\n});\nexport type SupportedBrowserType =\n (typeof SUPPORTED_BROWSERS)[keyof typeof SUPPORTED_BROWSERS];\n\n// universal link paths from 'apple-app-site-association' file in active\nexport const APPLE_APP_LINK_PATHS = [\n '/dashboard',\n '/activities/*',\n '/athletes/*',\n '/segments/*',\n '/challenges/*',\n '/videos/*',\n '/routes/*',\n '/premium/*',\n '/settings/*',\n '/shop/*',\n '/athlete/*',\n '/clubs/*',\n '/summit/join',\n '/summit/perks',\n '/oauth/mobile/authorize'\n];\n\nexport const ATHLETES_VISIBILITY = Object.freeze({\n optedOut: 'opted_out' // Strava::Athletes::Visibility::OPTED_OUT\n});\nexport type AthletesVisibilityType =\n (typeof ATHLETES_VISIBILITY)[keyof typeof ATHLETES_VISIBILITY];\n","export const BrandAndDevicePartnerIds = Object.freeze({\n GARMIN: 'garmin',\n ZWIFT: 'zwift',\n WAHOO: 'wahoo',\n FITBIT: 'fitbit',\n SAMSUNG: 'samsung',\n WHOOP: 'whoop',\n OURA: 'oura',\n ROUVY: 'rouvy'\n});\n\nexport type BrandAndDevicePartnerIdsType =\n (typeof BrandAndDevicePartnerIds)[keyof typeof BrandAndDevicePartnerIds];\n","// extracted by mini-css-extract-plugin\nexport default {\"surfaceType\":\"ElevationChart--surfaceType--LCq6P\"};","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { line } from 'd3-shape';\n\nimport { surfaceType } from '@strava/constants';\nimport { color } from '@strava/ui-tokens/js';\n\nimport styles from './SurfaceTypePath.module.scss';\n\nconst SurfaceTypePath = ({ stream, xScale, yScale, clipPath }) => {\n const bgLineData = stream.convertedElevation.map((elev, index) => ({\n x: stream.convertedDistance[index],\n y: elev\n }));\n\n const draw = line()\n .x((d) => xScale(d.x))\n .y((d) => yScale(d.y));\n\n let tmpIdx = 0;\n const surfacesData = stream.surface.reduce((acc, val, idx, arr) => {\n const next = arr[idx + 1];\n\n if (!acc[tmpIdx]) {\n acc[tmpIdx] = {\n type: val,\n data: []\n };\n }\n\n acc[tmpIdx].data.push({\n x: stream.convertedDistance[idx],\n y: stream.convertedElevation[idx]\n });\n\n if (val !== next) {\n tmpIdx += 1;\n }\n\n return acc;\n }, []);\n\n return (\n \n \n\n {surfacesData.map((surface, index) => {\n if (surfaceType.PAVED === surface.type) {\n return (\n \n );\n }\n\n if (surfaceType.UNPAVED === surface.type) {\n return (\n \n );\n }\n\n return (\n \n );\n })}\n \n );\n};\n\nSurfaceTypePath.propTypes = {\n xScale: PropTypes.func.isRequired,\n yScale: PropTypes.func.isRequired,\n stream: PropTypes.shape().isRequired,\n clipPath: PropTypes.string\n};\n\nSurfaceTypePath.defaultProps = {\n clipPath: null\n};\n\nexport default React.memo(SurfaceTypePath);\n","// extracted by mini-css-extract-plugin\nexport default {\"hitbox\":\"ElevationChart--hitbox--1JDU3\"};","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { scaleLinear } from 'd3-scale';\nimport { max, min, bisectLeft } from 'd3-array';\nimport { throttle } from 'lodash-es';\nimport { color } from '@strava/ui-tokens/js';\n\nimport Area from './Area';\nimport Axis from './Axis';\nimport Tooltip from './Tooltip';\nimport SurfaceTypePath from './SurfaceTypePath';\nimport styles from './ElevationChart.module.scss';\n\nclass ElevationChart extends Component {\n state = {\n stream: null,\n xScale: null,\n yScale: null,\n height: 0,\n width: 0,\n markerPosition: null,\n tooltipContent: null\n };\n\n container = React.createRef();\n\n formatters = null;\n\n node = React.createRef();\n\n hitbox = React.createRef();\n\n handleResize = throttle(() => {\n this.buildScales();\n }, 250);\n\n componentDidMount() {\n window.addEventListener('resize', this.handleResize);\n this.updateFormatters();\n this.buildScales();\n }\n\n componentDidUpdate({\n elevation: prevElevation,\n distance: prevDistance,\n units: prevUnits,\n hoveredDistance: prevHoveredDistance\n }) {\n const { distance, elevation, units, hoveredDistance } = this.props;\n const elevationChanged = prevElevation.length !== elevation.length;\n const distanceChanged = prevDistance.length !== distance.length;\n const unitsChanged = prevUnits !== units;\n\n if (unitsChanged) {\n this.updateFormatters();\n }\n\n if (elevationChanged || distanceChanged || unitsChanged) {\n this.buildScales();\n }\n\n if (prevHoveredDistance !== hoveredDistance) {\n if (hoveredDistance === null) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({ markerPosition: null, tooltipContent: null });\n } else {\n const streamIndex = this.getStreamIndex(hoveredDistance);\n this.updateTooltipContent(streamIndex, hoveredDistance);\n }\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener('resize', this.handleResize);\n }\n\n getStreamIndex = (distance) => {\n const { stream } = this.state;\n return Math.min(\n bisectLeft(stream.distance, distance),\n stream.distance.length - 1\n );\n };\n\n // TODO: hover got really slow on long streams\n updateMarker = (e) => {\n const { onUpdateMarker } = this.props;\n const { xScale } = this.state;\n const { distanceFormatter } = this.formatters;\n const bounds = this.hitbox.current.getBoundingClientRect();\n const cursorPosition = e.clientX - bounds.left;\n const distCursor = xScale.invert(cursorPosition);\n // distCursor at this point will be in kilometers or miles so convert distance back to meters\n // as stream.distance is in meters so we want to be consistent\n const distance = distCursor / distanceFormatter.convert(1);\n const streamIndex = this.getStreamIndex(distance);\n\n if (streamIndex === -1 || Number.isNaN(distance)) {\n return;\n }\n\n onUpdateMarker(streamIndex, { distance });\n this.updateTooltipContent(streamIndex, distance);\n };\n\n updateTooltipContent = (streamIndex, distance) => {\n const {\n tooltipDistanceLabel,\n tooltipElevationLabel,\n tooltipGradeLabel,\n tooltipSurfaceLabel,\n tooltipSurfaceTypes\n } = this.props;\n const { stream, xScale } = this.state;\n const { elevationFormatter, distanceFormatter, gradePercentFormatter } =\n this.formatters;\n\n const distanceValue = stream.distance[streamIndex];\n const elevationValue = stream.elevation[streamIndex];\n const gradeValue = this.gradeAtIndex(streamIndex);\n const surfaceValue = stream?.surface?.[streamIndex] ?? null;\n\n const tooltipContent = {\n distance: {\n label: tooltipDistanceLabel,\n value: distanceFormatter.formatShort(distanceValue, 2)\n },\n elevation: {\n label: tooltipElevationLabel,\n value: elevationFormatter.formatShort(elevationValue)\n },\n grade: {\n label: tooltipGradeLabel,\n value: gradePercentFormatter.formatShort(gradeValue)\n }\n };\n\n if (surfaceValue) {\n let surfaceTypeValue;\n if (surfaceValue === 1) {\n surfaceTypeValue = tooltipSurfaceTypes.paved;\n } else if (surfaceValue === 2) {\n surfaceTypeValue = tooltipSurfaceTypes.unpaved;\n } else {\n surfaceTypeValue = tooltipSurfaceTypes.unknown;\n }\n\n tooltipContent.surface = {\n label: tooltipSurfaceLabel,\n value: surfaceTypeValue\n };\n }\n\n this.setState({\n // distance at this point will be in meeters or feet and we need to convert it to\n // kilometers or miles so that we can get the x position of the marker\n markerPosition: xScale(distance * distanceFormatter.convert(1)),\n tooltipContent\n });\n };\n\n handleMouseLeave = (e) => {\n const { onUpdateMarker, onMouseLeave } = this.props;\n onUpdateMarker(null, { distance: null });\n onMouseLeave(e);\n this.setState({ markerPosition: null, tooltipContent: null });\n };\n\n updateFormatters() {\n const { units, formatters } = this.props;\n\n this.formatters = {\n elevationFormatter: new formatters.ElevationFormatter(units),\n distanceFormatter: new formatters.DistanceFormatter(units),\n gradePercentFormatter: new formatters.PercentFormatter()\n };\n }\n\n buildScales() {\n const {\n margin,\n height: heightProp,\n elevation,\n distance,\n surface\n } = this.props;\n const { elevationFormatter, distanceFormatter } = this.formatters;\n\n const elevationOrDefault = elevation.length === 0 ? [0, 100] : elevation;\n\n const convertedElevation = elevationOrDefault.map((elev) =>\n elevationFormatter.convert(elev)\n );\n const convertedDistance = distance.map((dist) =>\n distanceFormatter.convert(dist)\n );\n\n const width =\n this.container.current.offsetWidth - margin.left - margin.right;\n const height = heightProp - margin.top - margin.bottom;\n const yMax = max(convertedElevation);\n const yMin = min(convertedElevation);\n const xScale = scaleLinear().range([0, width]);\n const yScale = scaleLinear().range([height, 0]);\n const yRange = yMax - yMin;\n const yPadding = yRange * 0.02;\n\n xScale.domain([min(convertedDistance), max(convertedDistance)]);\n yScale.domain([yMin - yPadding, yMax + yPadding]);\n\n this.setState({\n height,\n width,\n xScale,\n yScale,\n stream: {\n elevation: elevationOrDefault,\n convertedElevation,\n distance,\n convertedDistance,\n surface\n }\n });\n }\n\n gradeAtIndex(index) {\n // Taken from charts.js: 1689 but extending the window to 5 data points\n const { stream } = this.state;\n const { elevation, distance } = stream;\n const maxIndex = distance.length - 1;\n const threshold = 2;\n\n let streamIndex = index;\n\n if (streamIndex < threshold) {\n streamIndex = threshold;\n }\n if (maxIndex - streamIndex < threshold) {\n streamIndex = maxIndex - threshold;\n }\n\n const distanceDiff =\n distance[streamIndex + threshold] - distance[streamIndex - threshold];\n const elevationDiff =\n elevation[streamIndex + threshold] - elevation[streamIndex - threshold];\n const grade = (elevationDiff * 100) / distanceDiff;\n\n return grade;\n }\n\n scopeTo() {\n const { scopeTo } = this.props;\n const { stream, xScale, yScale } = this.state;\n\n if (!stream || !scopeTo) {\n return;\n }\n\n const start = scopeTo[0];\n const end = scopeTo[1];\n\n // Taken from directory/ElevationChart.js.coffee: 263\n const range = end - start;\n // the padding on each side of the selected area should ideally be\n // 1/3 of the area itself, but this can't be the case if the start\n // or the end are too close to the edges\n const padding = parseInt(range / 3, 10);\n const enoughSpaceAtStart = start - padding <= 0;\n const enoughSpaceAtEnd = end + padding > stream.distance.length - 1;\n\n const paddedStart = enoughSpaceAtStart\n ? parseInt(start / 3, 10)\n : start - padding;\n\n const paddedEnd = enoughSpaceAtEnd\n ? parseInt(end + (stream.distance.length - 1 - end) / 3, 10)\n : end + padding;\n\n xScale.domain([\n stream.convertedDistance[paddedStart],\n stream.convertedDistance[paddedEnd]\n ]);\n\n const croppedElevationStream = stream.convertedElevation.slice(\n paddedStart,\n paddedEnd + 1\n );\n const yMax = max(croppedElevationStream);\n const yMin = min(croppedElevationStream);\n const yRange = yMax - yMin;\n const yPadding = yRange * 0.02;\n\n yScale.domain([yMin - yPadding, yMax + yPadding]);\n }\n\n render() {\n const {\n margin,\n scopeTo,\n scopeColor,\n areaColor,\n highlightArea,\n highlightAreaColor\n } = this.props;\n const {\n stream,\n xScale,\n yScale,\n width,\n height,\n markerPosition,\n tooltipContent\n } = this.state;\n\n if (scopeTo) this.scopeTo();\n\n return (\n
\n {height > 0 && width > 0 && (\n \n \n \n\n \n\n {stream.surface && (\n \n )}\n\n {scopeTo && (\n \n )}\n\n {highlightArea && (\n \n )}\n\n \n \n \n\n \n \n {stream.distance.length > 0 &&\n markerPosition &&\n tooltipContent && (\n \n )}\n \n \n \n )}\n
\n );\n }\n}\n\nElevationChart.propTypes = {\n height: PropTypes.number.isRequired,\n elevation: PropTypes.arrayOf(PropTypes.number).isRequired,\n distance: PropTypes.arrayOf(PropTypes.number).isRequired,\n surface: PropTypes.arrayOf(PropTypes.number),\n units: PropTypes.string.isRequired,\n margin: PropTypes.shape({\n top: PropTypes.number.isRequired,\n right: PropTypes.number.isRequired,\n bottom: PropTypes.number.isRequired,\n left: PropTypes.number.isRequired\n }),\n scopeTo: PropTypes.arrayOf(PropTypes.number),\n scopeColor: PropTypes.string,\n areaColor: PropTypes.string,\n highlightArea: PropTypes.arrayOf(PropTypes.number),\n highlightAreaColor: PropTypes.string,\n onUpdateMarker: PropTypes.func,\n onMouseLeave: PropTypes.func,\n hoveredDistance: PropTypes.number,\n formatters: PropTypes.shape().isRequired,\n tooltipDistanceLabel: PropTypes.string,\n tooltipElevationLabel: PropTypes.string,\n tooltipGradeLabel: PropTypes.string,\n tooltipSurfaceLabel: PropTypes.string,\n tooltipSurfaceTypes: PropTypes.shape({\n paved: PropTypes.string.isRequired,\n unpaved: PropTypes.string.isRequired,\n unknown: PropTypes.string.isRequired\n })\n};\n\nElevationChart.defaultProps = {\n margin: {\n top: 10,\n right: 24,\n bottom: 20,\n left: 45\n },\n surface: null,\n scopeTo: null,\n scopeColor: 'rgb(23, 90, 189)',\n areaColor: 'rgba(100, 100, 100, 0.66)',\n highlightArea: null,\n highlightAreaColor: color.colorCoreO3,\n onUpdateMarker: () => null,\n onMouseLeave: () => null,\n hoveredDistance: null,\n tooltipDistanceLabel: 'Distance',\n tooltipElevationLabel: 'Elevation',\n tooltipGradeLabel: 'Grade',\n tooltipSurfaceLabel: 'Surface Type',\n tooltipSurfaceTypes: {\n paved: 'Paved',\n unpaved: 'Unpaved',\n unknown: 'Unknown'\n }\n};\n\nexport default ElevationChart;\n","// extracted by mini-css-extract-plugin\nexport default {\"stat\":\"Stat--stat--7Qurd\",\"statLabel\":\"Stat--statLabel--qWLL-\",\"statValue\":\"Stat--statValue--7eWuL\",\"stat-xs\":\"Stat--stat-xs--svVNE\",\"statXs\":\"Stat--stat-xs--svVNE\",\"stat-sm\":\"Stat--stat-sm--7BLLi\",\"statSm\":\"Stat--stat-sm--7BLLi\",\"stat-lg\":\"Stat--stat-lg--bYBGt\",\"statLg\":\"Stat--stat-lg--bYBGt\",\"stat-xl\":\"Stat--stat-xl--GtHFn\",\"statXl\":\"Stat--stat-xl--GtHFn\"};","import React, { ReactNode } from 'react';\n\nimport styles from './Stat.module.scss';\n\nimport clsx from '../clsx';\n\nexport const StatTypes = ['stat-xs', 'stat-sm', 'stat-lg', 'stat-xl'] as const;\ntype StatTypesType = (typeof StatTypes)[number];\n\ninterface StatProps {\n value: string | number | ReactNode;\n label: string;\n type?: StatTypesType;\n wrapperClassName?: string;\n labelClassName?: string;\n valueClassName?: string;\n labelAfterValue?: boolean;\n}\n\nconst Stat = ({\n value,\n label,\n type,\n wrapperClassName,\n labelClassName,\n valueClassName,\n labelAfterValue = false\n}: StatProps) => {\n const labelElement = (\n {label}\n );\n\n return (\n
\n {!labelAfterValue && labelElement}\n
{value}
\n {labelAfterValue && labelElement}\n
\n );\n};\n\nexport default Stat;\n","// extracted by mini-css-extract-plugin\nexport default {\"listStats\":\"Stats--listStats--hRQeq\"};","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport styles from './styles.module.scss';\n\nconst Stats = (props) => {\n const { children, listClassName } = props;\n\n return (\n
    \n {React.Children.map(\n children,\n (child) => (child &&
  • {child}
  • ) || ''\n )}\n
\n );\n};\n\nStats.propTypes = {\n children: PropTypes.node.isRequired,\n listClassName: PropTypes.string\n};\n\nStats.defaultProps = {\n listClassName: null\n};\n\nexport default Stats;\n","\"use strict\";\r\n\r\nvar tester = /^[-!#$%&'*+\\/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+\\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\\.?[a-zA-Z0-9])*\\.[a-zA-Z](-?[a-zA-Z0-9])+$/;\r\n// Thanks to:\r\n// http://fightingforalostcause.net/misc/2006/compare-email-regex.php\r\n// http://thedailywtf.com/Articles/Validating_Email_Addresses.aspx\r\n// http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/201378#201378\r\nexports.validate = function(email)\r\n{\r\n\tif (!email)\r\n\t\treturn false;\r\n\t\t\r\n\tif(email.length>254)\r\n\t\treturn false;\r\n\r\n\tvar valid = tester.test(email);\r\n\tif(!valid)\r\n\t\treturn false;\r\n\r\n\t// Further checking of some things regex can't handle\r\n\tvar parts = email.split(\"@\");\r\n\tif(parts[0].length>64)\r\n\t\treturn false;\r\n\r\n\tvar domainParts = parts[1].split(\".\");\r\n\tif(domainParts.some(function(part) { return part.length>63; }))\r\n\t\treturn false;\r\n\r\n\treturn true;\r\n}","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nimport { Component, createElement, forwardRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport hoistStatics from \"hoist-non-react-statics\";\nvar SCRIPT_MAP = {}; // A counter used to generate a unique id for each component that uses the function\n\nvar idCount = 0;\nexport default function makeAsyncScript(getScriptURL, options) {\n options = options || {};\n return function wrapWithAsyncScript(WrappedComponent) {\n var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || \"Component\";\n\n var AsyncScriptLoader =\n /*#__PURE__*/\n function (_Component) {\n _inheritsLoose(AsyncScriptLoader, _Component);\n\n function AsyncScriptLoader(props, context) {\n var _this;\n\n _this = _Component.call(this, props, context) || this;\n _this.state = {};\n _this.__scriptURL = \"\";\n return _this;\n }\n\n var _proto = AsyncScriptLoader.prototype;\n\n _proto.asyncScriptLoaderGetScriptLoaderID = function asyncScriptLoaderGetScriptLoaderID() {\n if (!this.__scriptLoaderID) {\n this.__scriptLoaderID = \"async-script-loader-\" + idCount++;\n }\n\n return this.__scriptLoaderID;\n };\n\n _proto.setupScriptURL = function setupScriptURL() {\n this.__scriptURL = typeof getScriptURL === \"function\" ? getScriptURL() : getScriptURL;\n return this.__scriptURL;\n };\n\n _proto.asyncScriptLoaderHandleLoad = function asyncScriptLoaderHandleLoad(state) {\n var _this2 = this;\n\n // use reacts setState callback to fire props.asyncScriptOnLoad with new state/entry\n this.setState(state, function () {\n return _this2.props.asyncScriptOnLoad && _this2.props.asyncScriptOnLoad(_this2.state);\n });\n };\n\n _proto.asyncScriptLoaderTriggerOnScriptLoaded = function asyncScriptLoaderTriggerOnScriptLoaded() {\n var mapEntry = SCRIPT_MAP[this.__scriptURL];\n\n if (!mapEntry || !mapEntry.loaded) {\n throw new Error(\"Script is not loaded.\");\n }\n\n for (var obsKey in mapEntry.observers) {\n mapEntry.observers[obsKey](mapEntry);\n }\n\n delete window[options.callbackName];\n };\n\n _proto.componentDidMount = function componentDidMount() {\n var _this3 = this;\n\n var scriptURL = this.setupScriptURL();\n var key = this.asyncScriptLoaderGetScriptLoaderID();\n var _options = options,\n globalName = _options.globalName,\n callbackName = _options.callbackName,\n scriptId = _options.scriptId; // check if global object already attached to window\n\n if (globalName && typeof window[globalName] !== \"undefined\") {\n SCRIPT_MAP[scriptURL] = {\n loaded: true,\n observers: {}\n };\n } // check if script loading already\n\n\n if (SCRIPT_MAP[scriptURL]) {\n var entry = SCRIPT_MAP[scriptURL]; // if loaded or errored then \"finish\"\n\n if (entry && (entry.loaded || entry.errored)) {\n this.asyncScriptLoaderHandleLoad(entry);\n return;\n } // if still loading then callback to observer queue\n\n\n entry.observers[key] = function (entry) {\n return _this3.asyncScriptLoaderHandleLoad(entry);\n };\n\n return;\n }\n /*\n * hasn't started loading\n * start the \"magic\"\n * setup script to load and observers\n */\n\n\n var observers = {};\n\n observers[key] = function (entry) {\n return _this3.asyncScriptLoaderHandleLoad(entry);\n };\n\n SCRIPT_MAP[scriptURL] = {\n loaded: false,\n observers: observers\n };\n var script = document.createElement(\"script\");\n script.src = scriptURL;\n script.async = true;\n\n for (var attribute in options.attributes) {\n script.setAttribute(attribute, options.attributes[attribute]);\n }\n\n if (scriptId) {\n script.id = scriptId;\n }\n\n var callObserverFuncAndRemoveObserver = function callObserverFuncAndRemoveObserver(func) {\n if (SCRIPT_MAP[scriptURL]) {\n var mapEntry = SCRIPT_MAP[scriptURL];\n var observersMap = mapEntry.observers;\n\n for (var obsKey in observersMap) {\n if (func(observersMap[obsKey])) {\n delete observersMap[obsKey];\n }\n }\n }\n };\n\n if (callbackName && typeof window !== \"undefined\") {\n window[callbackName] = function () {\n return _this3.asyncScriptLoaderTriggerOnScriptLoaded();\n };\n }\n\n script.onload = function () {\n var mapEntry = SCRIPT_MAP[scriptURL];\n\n if (mapEntry) {\n mapEntry.loaded = true;\n callObserverFuncAndRemoveObserver(function (observer) {\n if (callbackName) {\n return false;\n }\n\n observer(mapEntry);\n return true;\n });\n }\n };\n\n script.onerror = function () {\n var mapEntry = SCRIPT_MAP[scriptURL];\n\n if (mapEntry) {\n mapEntry.errored = true;\n callObserverFuncAndRemoveObserver(function (observer) {\n observer(mapEntry);\n return true;\n });\n }\n };\n\n document.body.appendChild(script);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n // Remove tag script\n var scriptURL = this.__scriptURL;\n\n if (options.removeOnUnmount === true) {\n var allScripts = document.getElementsByTagName(\"script\");\n\n for (var i = 0; i < allScripts.length; i += 1) {\n if (allScripts[i].src.indexOf(scriptURL) > -1) {\n if (allScripts[i].parentNode) {\n allScripts[i].parentNode.removeChild(allScripts[i]);\n }\n }\n }\n } // Clean the observer entry\n\n\n var mapEntry = SCRIPT_MAP[scriptURL];\n\n if (mapEntry) {\n delete mapEntry.observers[this.asyncScriptLoaderGetScriptLoaderID()];\n\n if (options.removeOnUnmount === true) {\n delete SCRIPT_MAP[scriptURL];\n }\n }\n };\n\n _proto.render = function render() {\n var globalName = options.globalName; // remove asyncScriptOnLoad from childProps\n\n var _this$props = this.props,\n asyncScriptOnLoad = _this$props.asyncScriptOnLoad,\n forwardedRef = _this$props.forwardedRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"asyncScriptOnLoad\", \"forwardedRef\"]); // eslint-disable-line no-unused-vars\n\n\n if (globalName && typeof window !== \"undefined\") {\n childProps[globalName] = typeof window[globalName] !== \"undefined\" ? window[globalName] : undefined;\n }\n\n childProps.ref = forwardedRef;\n return createElement(WrappedComponent, childProps);\n };\n\n return AsyncScriptLoader;\n }(Component); // Note the second param \"ref\" provided by React.forwardRef.\n // We can pass it along to AsyncScriptLoader as a regular prop, e.g. \"forwardedRef\"\n // And it can then be attached to the Component.\n\n\n var ForwardedComponent = forwardRef(function (props, ref) {\n return createElement(AsyncScriptLoader, _extends({}, props, {\n forwardedRef: ref\n }));\n });\n ForwardedComponent.displayName = \"AsyncScriptLoader(\" + wrappedComponentName + \")\";\n ForwardedComponent.propTypes = {\n asyncScriptOnLoad: PropTypes.func\n };\n return hoistStatics(ForwardedComponent, WrappedComponent);\n };\n}"],"names":["global","Object","freeSelf","self","freeGlobal","Function","Symbol","array","iteratee","index","length","result","Array","isArray","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","value","isOwn","call","tag","unmasked","e","getRawTag","objectToString","isObjectLike","baseGetTag","symbolProto","symbolToString","baseToString","arrayMap","isSymbol","args","arguments","string","replace","injectAppleScript","_ref2","logError","locale","window","AppleID","script","document","createElement","formattedLocale","src","async","_ref","name","querySelector","appendChild","Error","appendScriptToBody","useApple","state","useEffect","signin","stravaInit","auth","init","clientId","scope","redirectURI","signIn","SvgActionsCancelCircleHighlightedMedium","React","ref","color","size","title","titleId","props","xmlns","viewBox","fill","width","height","id","fillRule","d","defaultProps","propTypes","PropTypes","SvgActionsCheckCircleOnMedium","SvgNavigationWarningHighlightedMedium","SvgNavigationInformationNormalMedium","SvgActionsCancelNormalSmall","useInterval","callback","delay","savedCallback","useRef","current","setInterval","clearInterval","forwardRef","style","clip","clipPath","overflow","position","whiteSpace","AlertStatus","ERROR","SUCCESS","WARNING","INFO","ALERT_DELAY","fadeStyles","enter","exit","children","className","alertType","autoDismiss","autoDismissDelay","contentPosition","hideCloseButton","hideIcon","iconSize","onClose","options","indicatorIcon","messageType","alertStyle","buttonStyle","type","ErrorIcon","SuccessIcon","WarningIcon","InfoIcon","getAlertDetails","fadeStyle","setFadeStyle","useState","handleOnClose","Promise","resolve","setTimeout","clsx","styles","alert","fadeIn","fadeOut","role","alertInner","alertContent","alignLeft","alignCenter","alignRight","VisuallyHidden","closeButtonContainer","onClick","button","CancelIcon","autoDismissBar","useQueue","initialValues","_temp","queue","setState","enqueue","useCallback","items","_key","dequeue","slice","updateQueue","fn","clearQueue","peek","freeze","man","woman","preferNotSay","nonBinary","LOCALE","deDE","enUS","enGB","esES","es419","frFR","itIT","jaJP","koKR","nlNL","ptBR","ptPT","ruRU","zhCN","zhTW","de","es","fr","it","ja","ko","nl","pt","ru","zh","control","variantA","variantB","android","iPhone","iPad","chrome","firefox","safari","optedOut","AlertContext","createContext","displayName","useAlertContext","context","useContext","AlertProvider","showAlert","alertConfig","Math","random","substring","containerId","alerts","some","hideAlert","filter","clearAlerts","providerState","useMemo","Provider","defaultTranslateAlertInfoText","totalAlertsShown","totalAlerts","AlertContainer","limit","shouldShowAlertInfoText","translateAlertInfoText","filterLimit","_","filterContainer","map","content","containerIdProp","rest","Alert","_extends","key","target","Element","attributes","_ref$attributes","_ref$children","_ref$selfClose","selfClose","Tag","_proto","_node","Filter","a","address","invalid","audio","br","void","body","TYPE_FLOW","TYPE_PHRASING","caption","parent","col","colgroup","details","dd","dl","dt","figcaption","footer","header","hr","img","li","main","ol","picture","rb","rp","rt","rtc","ruby","source","summary","table","tbody","td","tfoot","th","thead","tr","track","ul","video","wbr","createConfigBuilder","config","tagConfigs","_extends2","forEach","TYPE_PALPABLE","alt","cite","class","colspan","controls","datetime","default","disabled","dir","href","kind","label","lang","loading","loop","media","muted","poster","sizes","span","start","srclang","srcset","rowspan","StyleFilter","_Filter","apply","keys","String","match","INVALID_STYLES","createHTMLDocument","Parser","matchers","filters","concat","keyIndex","container","allowed","allowList","ALLOWED_TAG_LIST","Set","BANNED_TAG_LIST","_proto3","reduce","nextNode","node","parentConfig","tagName","matchedString","parts","valid","_parts","isVoid","partProps","tokenName","elementIndex","tokenizedString","_this","elements","_match","includes","childConfig","Boolean","noHtml","disableLineBreaks","nextMarkup","createContainer","createDocument","INVALID_ROOTS","el","newName","ATTRIBUTES","newValue","Number","_this2","count","letter","toUpperCase","protocol","toLowerCase","parseNode","parentNode","transform","transformOnlyAllowList","mergedText","_this3","transformed","has","elementProps","open","_open","_match2","text","startIndex","_elements$tokenName","matcher","endIndex","nodes","push","containerTagName","emptyContent","parsedContent","mainContent","markup","SvgLogosAppleSmall","SvgLogosFacebookSmall","SvgLogosGoogleSmall","SvgActionsEmailNormalSmall","clipRule","variant","Button","fallback","AppleLogo","FacebookLogo","GoogleLogo","EmailLogo","theme","orDivider","line","or","_excluded","assign","bind","i","this","_assertThisInitialized","ReferenceError","_setPrototypeOf","o","p","setPrototypeOf","__proto__","ReCAPTCHA","_React$Component","subClass","superClass","handleExpired","handleErrored","handleChange","handleRecaptchaRef","create","constructor","getCaptchaFunction","fnName","grecaptcha","enterprise","getValue","getResponse","_widgetId","getWidgetId","execute","_executeRequested","executeAsync","reject","executionResolve","executionReject","reset","resetter","forceReset","onExpired","onErrored","token","onChange","explicitRender","render","wrapper","sitekey","tabindex","stoken","hl","badge","isolated","captcha","componentDidMount","componentDidUpdate","elem","_this$props","childProps","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","isRequired","callbackName","getOptions","recaptchaOptions","makeAsyncScriptLoader","dynamicOptions","hostname","useRecaptchaNet","globalName","nonce","SvgActionsVisibleDisabledNormalSmall","SvgActionsVisibleNormalSmall","showPasswordText","hidePasswordText","passwordIsVisible","setPasswordIsVisible","Input","prev","ActionsVisibleNormalSmall","ActionsVisibleDisabledNormalSmall","inputMessage","errorMessage","errorMessageTestId","input","htmlFor","PasswordInput","textInput","message","error","i18nPrefix","EMAIL_REGISTRATION_FORM_ALERT_ID","authorizationUrl","reCaptchaSiteKey","honeyPot","isPremium","clubId","plan","challengeId","autoJoinChallenge","formAuthToken","idPrefix","isInView","formInput","setFormInput","email","password","passwordErrorMsg","setPasswordErrMsg","emailValidationState","setEmailValidationState","isProcessing","setIsProcessing","emailInput","passwordInput","recaptchaRef","useRecaptcha","useStravaErrorLogging","t","useStravaTranslations","emailRegFormAlert","handleEmailFormSubmit","recaptchaToken","getRecaptchaToken","element","option","FACEBOOK","APPLE","EMAIL","GOOGLE","elemAttrForAnalytics","formData","FormData","append","isNil","response","url","apiClient","headers","post","then","data","catch","submitFormData","pathType","load","action","properties","path_type","redirect_url","location","validateEmail","isValidEmail","isExistingEmail","EmailValidator","isUniqueEmail","get","params","isAlreadyRegisteredEmail","validatePassword","isValidPassword","passwordValidationMsg","handleInputChange","event","onSubmit","preventDefault","validateForm","is_valid_email","is_valid_password","is_existing_email","focus","noValidate","RegistrationInput","placeholder","onBlur","autoComplete","display","Spinner","legalTerms","terms_path","legalPrivacy","privacy_path","Markup","noWrap","echelon","require","AUTH_BUTTONS","authorizationUrls","appleState","category","_track","useStravaAnalytics","appleSignin","isSignUpModalOpen","dismissSignUpModal","copyParams","athleteAvatar","defaultRedirectUrl","useActiveAfterAuth","useSignUpModalContext","fields","page","copy_variant","sessionStorage","getItem","HIDE_TIME_DELAY_MODAL","setItem","loginLink","encodeURIComponent","Modal","isOpen","onDismiss","ModalBody","LinkButton","ActionsCancelNormalSmall","Avatar","AccountAuthButton","handleExtAuthBtnClick","OrDivider","EmailRegistrationForm","DisclaimerText","devLog","all","desktop","iphone","mobile","variantC","warn","SignUpModalContext","SESSION_STORAGE_REDIRECT_KEY","SignUpModalContextProvider","nameForFollowAthleteVariant","redirectUrls","_defaultRedirectUrl","setIsSignUpModalOpen","setDefaultRedirectUrl","setVariant","sessionStorageIsAvailable","isSessionStorageAvailable","test","removeItem","redirectUrlIsValid","redirectUrl","isValidStravaUrlForCurrentHost","currentHost","host","URL","setSessionStorageRedirectUrl","openSignUpModal","_variant","generic","generic_time_delayed","follow_athlete","join_challenge","kudos_comment","running_tools","SvgAchievementsTrophyNormalSmall","SvgActionsCommentNormalSmall","SvgActionsKudoNormalSmall","SvgActionsLockClosedNormalXsmall","fontWeightDemi","SvgNavigationProfileHighlightedMedium","SvgBadgesMulticolorSuperuserSmall","SvgBadgesMulticolorSummitSmall","SvgBadgesMulticolorProSmall","SvgBadgesMulticolorVerifiedSmall","Img","setChildren","initialState","mountedRef","useSafeState","image","Image","onload","onerror","otherProps","classNames","avatar","ProBadge","EmployeeBadge","SubscriberBadge","VerifiedBadge","getBadge","imgWrapper","AvatarFallback","root","Date","now","reWhitespace","charAt","reTrimStart","trimmedEndIndex","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","isObject","other","valueOf","baseTrim","isBinary","nativeMax","max","nativeMin","min","func","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","thisArg","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","clearTimeout","toNumber","cancel","flush","debounce","Area","stream","xScale","yScale","formatData","convertedElevation","elev","dist","convertedDistance","drawArea","area","x","y1","y0","Axis","xAxisNode","yAxisNode","drawAxes","prevProps","scopeTo","hasScopeChanged","hasScaleChanged","scalesAreEqual","hasWidthChanged","scaleA","scaleB","domain","every","domainElement","formatters","elevationFormatter","distanceFormatter","xAxis","axisBottom","yAxis","axisLeft","xTickCount","ticks","tickSize","tickFormat","formatShort","convert","select","Tooltip","chartWidth","chartMargin","textRef","boxWidth","setBoxWidth","rightBound","padding","currBoxAlign","useLayoutEffect","widths","getBoundingClientRect","maxWidth","newSize","round","InfoBox","boxHeight","infoBox","y","stat","contentItem","dy","dx","group","marker","top","y2","x1","x2","right","bottom","left","surfaceType","initial","loaded","everyone","followers","onlyMe","noOne","optedIn","GARMIN","ZWIFT","WAHOO","FITBIT","SAMSUNG","WHOOP","OURA","ROUVY","SurfaceTypePath","bgLineData","draw","tmpIdx","surfacesData","surface","acc","val","idx","arr","next","stroke","strokeWidth","strokeDasharray","ElevationChart","Component","markerPosition","tooltipContent","hitbox","handleResize","throttle","buildScales","addEventListener","updateFormatters","elevation","prevElevation","distance","prevDistance","units","prevUnits","hoveredDistance","prevHoveredDistance","elevationChanged","distanceChanged","unitsChanged","streamIndex","getStreamIndex","updateTooltipContent","componentWillUnmount","removeEventListener","bisectLeft","updateMarker","onUpdateMarker","bounds","cursorPosition","clientX","invert","isNaN","tooltipDistanceLabel","tooltipElevationLabel","tooltipGradeLabel","tooltipSurfaceLabel","tooltipSurfaceTypes","gradePercentFormatter","distanceValue","elevationValue","gradeValue","gradeAtIndex","surfaceValue","grade","surfaceTypeValue","paved","unpaved","unknown","handleMouseLeave","onMouseLeave","ElevationFormatter","DistanceFormatter","PercentFormatter","margin","heightProp","elevationOrDefault","offsetWidth","yMax","yMin","scaleLinear","range","yPadding","maxIndex","distanceDiff","end","enoughSpaceAtStart","enoughSpaceAtEnd","paddedStart","paddedEnd","croppedElevationStream","scopeColor","areaColor","highlightArea","highlightAreaColor","onMouseMove","wrapperClassName","labelClassName","valueClassName","labelAfterValue","labelElement","statLabel","statValue","Stats","listClassName","child","tester","exports","split","part","SCRIPT_MAP","idCount","makeAsyncScript","getScriptURL","WrappedComponent","wrappedComponentName","AsyncScriptLoader","_Component","__scriptURL","asyncScriptLoaderGetScriptLoaderID","__scriptLoaderID","setupScriptURL","asyncScriptLoaderHandleLoad","asyncScriptOnLoad","asyncScriptLoaderTriggerOnScriptLoaded","mapEntry","obsKey","observers","scriptURL","_options","scriptId","entry","errored","attribute","setAttribute","callObserverFuncAndRemoveObserver","observersMap","observer","removeOnUnmount","allScripts","getElementsByTagName","removeChild","forwardedRef","ForwardedComponent"],"sourceRoot":""}