{"version":3,"file":"js/featuressection.js","mappings":"UAAIA,E,sDCYJ,QAZc,SAACC,EAAKC,GAClB,IAAK,IAAIC,KAAKF,EACZ,GAAIA,EAAIG,eAAeD,GACrB,IAAK,IAAIE,EAAI,EAAGA,EAAIH,EAAYI,SAAUD,GACD,GAAnCH,EAAYG,GAAGE,KAAKC,QAAQL,KAC9BD,EAAYG,GAAGI,OAAON,GAAKF,EAAIE,GAKzC,E,eCLMO,EAAiB,CAAC,EAElBC,EAAuB,SAACC,GAE5B,IAAMC,EAAcD,EAAQE,QAAQD,aAAeE,KAAKC,SAASC,SAAS,IAAIC,MAAM,GAChFC,EAAOT,EAAeG,IAAgB,KAW1C,OATa,OAATM,IAEFP,EAAQE,QAAQD,YAAcA,EAC9BM,GAAOC,EAAAA,EAAAA,GAAWR,IAIpBF,EAAeG,GAAeM,EAEvB,CAACN,YAAAA,EAAcM,KAAAA,EACxB,EA0BA,QAxBuB,SAACE,GAAiC,OAAK,SAACT,EAAsBU,GACnF,IAAKV,EACH,OAAO,KAGT,IAAAW,EAA4BZ,EAAqBC,GAA1CC,EAAWU,EAAXV,YAAaM,EAAII,EAAJJ,KAGpB,OAFAA,EAAKE,OAAOA,EAAOC,IAEZ,WACLH,EAAKK,iBACEd,EAAeG,EACxB,CACF,CAAC,E,m1BCsBM,IC1DHY,EAAOC,ED2hCKC,EAjDkBC,EAAG,CACnC,GAAM,UACN,GAAM,UACN,GAAM,WACN,GAAM,UACN,GAAM,SACN,GAAM,iBACN,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,SACN,GAAM,UACN,GAAM,SACN,GAAM,UACN,GAAM,UACN,GAAM,QACN,GAAM,SACN,GAAM,YACN,GAAM,aACN,GAAM,QACN,GAAM,cACN,GAAM,SACN,GAAM,WACN,GAAM,UACN,GAAM,WACN,GAAM,WACN,GAAM,QACN,GAAM,SACN,GAAM,cACN,GAAM,iBACN,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,UACN,GAAM,yBACN,GAAM,gBACN,GAAM,UACN,GAAM,YACN,GAAM,UACN,GAAM,cACN,GAAM,SACN,GAAM,gBACN,GAAM,YACN,GAAM,UACN,GAAM,SACN,GAAM,aACN,GAAM,SACN,GAAM,qBACN,GAAM,aACN,GAAM,UAAQ,KACR,eAAaD,EAAAC,EACnB,KAAM,UAAQD,EAAAC,EACd,KAAM,WAASD,EAAAC,EAAA,KACT,kBAAgBD,EAAAC,EACtB,KAAM,sBC/hCR,SAASC,IAAiS,OAApRA,EAAWC,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAAE,IAAIE,EAASD,UAAUD,GAAI,IAAK,IAAIG,KAAOD,EAAcN,OAAOQ,UAAUlC,eAAemC,KAAKH,EAAQC,KAAQJ,EAAOI,GAAOD,EAAOC,GAAU,CAAE,OAAOJ,CAAQ,EAAUJ,EAASW,MAAMC,KAAMN,UAAY,CA2BlV,QAzBA,SAA0Bb,GACxB,OAAoB,gBAAoB,MAAOO,EAAS,CACtDa,MAAO,6BACPC,MAAO,GACPC,OAAQ,QACPtB,GAAQG,IAAUA,EAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,iBAAkB,CAC7HoB,GAAI,uBACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,cAAe,qBACD,gBAAoB,OAAQ,CAC1CC,OAAQ,EACRC,UAAW,YACI,gBAAoB,OAAQ,CAC3CD,OAAQ,EACRC,UAAW,eACN1B,IAAUA,EAAqB,gBAAoB,OAAQ,CAChE,YAAa,8CACb2B,EAAG,ohBACHC,UAAW,qBACXC,KAAM,gCAEV,EC3BA,IAAI,EAAO,EACX,SAAS,IAAiS,OAApR,EAAWzB,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAAE,IAAIE,EAASD,UAAUD,GAAI,IAAK,IAAIG,KAAOD,EAAcN,OAAOQ,UAAUlC,eAAemC,KAAKH,EAAQC,KAAQJ,EAAOI,GAAOD,EAAOC,GAAU,CAAE,OAAOJ,CAAQ,EAAU,EAASO,MAAMC,KAAMN,UAAY,CA2BlV,QAzBA,SAAqBb,GACnB,OAAoB,gBAAoB,MAAO,EAAS,CACtDoB,MAAO,6BACPC,MAAO,GACPC,OAAQ,QACPtB,GAAQ,IAAU,EAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,iBAAkB,CAC7HuB,GAAI,kBACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,cAAe,qBACD,gBAAoB,OAAQ,CAC1CC,OAAQ,EACRC,UAAW,YACI,gBAAoB,OAAQ,CAC3CD,OAAQ,EACRC,UAAW,eACN,IAAU,EAAqB,gBAAoB,OAAQ,CAChE,YAAa,WACbC,EAAG,6NACHC,UAAW,kBACXC,KAAM,2BAEV,EC3BA,IAAI,EAAO,EACX,SAAS,IAAiS,OAApR,EAAWzB,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAAE,IAAIE,EAASD,UAAUD,GAAI,IAAK,IAAIG,KAAOD,EAAcN,OAAOQ,UAAUlC,eAAemC,KAAKH,EAAQC,KAAQJ,EAAOI,GAAOD,EAAOC,GAAU,CAAE,OAAOJ,CAAQ,EAAU,EAASO,MAAMC,KAAMN,UAAY,CA0BlV,QAxBA,SAAmBb,GACjB,OAAoB,gBAAoB,MAAO,EAAS,CACtDoB,MAAO,6BACPC,MAAO,GACPC,OAAQ,IACPtB,GAAQ,IAAU,EAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,iBAAkB,CAC7HuB,GAAI,gBACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,cAAe,qBACD,gBAAoB,OAAQ,CAC1CC,OAAQ,EACRC,UAAW,YACI,gBAAoB,OAAQ,CAC3CD,OAAQ,EACRC,UAAW,eACN,IAAU,EAAqB,gBAAoB,OAAQ,CAChEC,EAAG,yuCACHC,UAAW,mBACXC,KAAM,yBAEV,EC1BA,IAAI,EAAO,EACX,SAAS,IAAiS,OAApR,EAAWzB,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAAE,IAAIE,EAASD,UAAUD,GAAI,IAAK,IAAIG,KAAOD,EAAcN,OAAOQ,UAAUlC,eAAemC,KAAKH,EAAQC,KAAQJ,EAAOI,GAAOD,EAAOC,GAAU,CAAE,OAAOJ,CAAQ,EAAU,EAASO,MAAMC,KAAMN,UAAY,CA0BlV,QAxBA,SAAkBb,GAChB,OAAoB,gBAAoB,MAAO,EAAS,CACtDoB,MAAO,6BACPC,MAAO,OACPC,OAAQ,QACPtB,GAAQ,IAAU,EAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,iBAAkB,CAC7HuB,GAAI,eACJC,GAAI,KACJE,GAAI,KACJC,GAAI,KACJC,cAAe,qBACD,gBAAoB,OAAQ,CAC1CC,OAAQ,EACRC,UAAW,YACI,gBAAoB,OAAQ,CAC3CD,OAAQ,EACRC,UAAW,eACN,IAAU,EAAqB,gBAAoB,OAAQ,CAChE,YAAa,WACbC,EAAG,yWACHC,UAAW,kBACXC,KAAM,wBAEV,EC1BA,IAAI,EAAO,EACX,SAAS,IAAiS,OAApR,EAAWzB,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAAE,IAAIE,EAASD,UAAUD,GAAI,IAAK,IAAIG,KAAOD,EAAcN,OAAOQ,UAAUlC,eAAemC,KAAKH,EAAQC,KAAQJ,EAAOI,GAAOD,EAAOC,GAAU,CAAE,OAAOJ,CAAQ,EAAU,EAASO,MAAMC,KAAMN,UAAY,CA0BlV,QAxBA,SAAiBb,GACf,OAAoB,gBAAoB,MAAO,EAAS,CACtDoB,MAAO,6BACPC,MAAO,GACPC,OAAQ,IACPtB,GAAQ,IAAU,EAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,iBAAkB,CAC7HuB,GAAI,cACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,IACJC,cAAe,qBACD,gBAAoB,OAAQ,CAC1CC,OAAQ,EACRC,UAAW,YACI,gBAAoB,OAAQ,CAC3CD,OAAQ,EACRC,UAAW,eACN,IAAU,EAAqB,gBAAoB,OAAQ,CAChEC,EAAG,u/BACHC,UAAW,mBACXC,KAAM,uBAEV,EC1BA,IAAI,EAAO,EACX,SAAS,IAAiS,OAApR,EAAWzB,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAAE,IAAIE,EAASD,UAAUD,GAAI,IAAK,IAAIG,KAAOD,EAAcN,OAAOQ,UAAUlC,eAAemC,KAAKH,EAAQC,KAAQJ,EAAOI,GAAOD,EAAOC,GAAU,CAAE,OAAOJ,CAAQ,EAAU,EAASO,MAAMC,KAAMN,UAAY,CA2BlV,QAzBA,SAAmBb,GACjB,OAAoB,gBAAoB,MAAO,EAAS,CACtDoB,MAAO,6BACPC,MAAO,GACPC,OAAQ,QACPtB,GAAQ,IAAU,EAAqB,gBAAoB,OAAQ,KAAmB,gBAAoB,iBAAkB,CAC7HuB,GAAI,gBACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,IACJC,cAAe,qBACD,gBAAoB,OAAQ,CAC1CC,OAAQ,EACRC,UAAW,YACI,gBAAoB,OAAQ,CAC3CD,OAAQ,EACRC,UAAW,eACN,IAAU,EAAqB,gBAAoB,OAAQ,CAChE,YAAa,YACbC,EAAG,yOACHC,UAAW,kBACXC,KAAM,yBAEV,ECsIA,QAnJwB,WACtB,OACEC,EAAAA,cAACC,EAAS,KACRD,EAAAA,cAACE,EAAAA,EAAY,CAACb,GAAG,UAAUc,MAAM,QACjCH,EAAAA,cAACI,EAAQ,CAACC,UAAU,yBAAwBC,EAAAA,EAAAA,IAAG,qCAC/CN,EAAAA,cAACO,EAAc,CAACF,UAAU,wBACxBL,EAAAA,cAACQ,EAAc,CAACH,UAAU,mBACxBL,EAAAA,cAACS,GAAW,KACVT,EAAAA,cAACU,EAAa,OAEhBV,EAAAA,cAACW,EAAK,CAACN,UAAU,kBAAiBC,EAAAA,EAAAA,IAAG,mBAEvCN,EAAAA,cAACY,EAAW,CAACP,UAAU,uBACrBL,EAAAA,cAAA,UACEA,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,mCACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,6BACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,+BACRN,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,wBACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,6BAO9FN,EAAAA,cAACO,EAAc,CAACF,UAAU,wBACxBL,EAAAA,cAACQ,EAAc,CAACH,UAAU,mBACxBL,EAAAA,cAACS,GAAW,KACVT,EAAAA,cAACa,EAAQ,OAEXb,EAAAA,cAACW,EAAK,CAACN,UAAU,kBAAiBC,EAAAA,EAAAA,IAAG,mBAEvCN,EAAAA,cAACY,EAAW,CAACP,UAAU,uBACrBL,EAAAA,cAAA,UACEA,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,uBACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,wBACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,yBACRN,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,qCACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,oCAO9FN,EAAAA,cAACO,EAAc,CAACF,UAAU,wBACxBL,EAAAA,cAACQ,EAAc,CAACH,UAAU,mBACxBL,EAAAA,cAACS,GAAW,KACVT,EAAAA,cAACc,EAAM,OAETd,EAAAA,cAACW,EAAK,CAACN,UAAU,kBAAiBC,EAAAA,EAAAA,IAAG,qBAEvCN,EAAAA,cAACY,EAAW,CAACP,UAAU,uBACrBL,EAAAA,cAAA,UACEA,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,yBACRN,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,wBACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,8BAGxFN,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,4BACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,4CAGxFN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,gCAKdN,EAAAA,cAACO,EAAc,CAACF,UAAU,wBACxBL,EAAAA,cAACQ,EAAc,CAACH,UAAU,mBACxBL,EAAAA,cAACS,GAAW,KACVT,EAAAA,cAACe,EAAK,OAERf,EAAAA,cAACW,EAAK,CAACN,UAAU,kBAAiBC,EAAAA,EAAAA,IAAG,yBAEvCN,EAAAA,cAACY,EAAW,CAACP,UAAU,uBACrBL,EAAAA,cAAA,UACEA,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,0BACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,oBACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,oCACRN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,qCAKdN,EAAAA,cAACO,EAAc,CAACF,UAAU,wBACxBL,EAAAA,cAACQ,EAAc,CAACH,UAAU,mBACxBL,EAAAA,cAACS,GAAW,KACVT,EAAAA,cAACgB,EAAI,OAEPhB,EAAAA,cAACW,EAAK,CAACN,UAAU,kBAAiBC,EAAAA,EAAAA,IAAG,0BAEvCN,EAAAA,cAACY,EAAW,CAACP,UAAU,uBACrBL,EAAAA,cAAA,UACEA,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,wBACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,yCAGxFN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,kBACRN,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,qBACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,6BAGxFN,EAAAA,cAAA,WAAKM,EAAAA,EAAAA,IAAG,gBACRN,EAAAA,cAAA,UACEA,EAAAA,cAAA,aACGM,EAAAA,EAAAA,IAAG,kBACJN,EAAAA,cAAA,KAAGK,UAAU,oBAAoB,kBAAgB,UAAU,wBAAsBC,EAAAA,EAAAA,IAAG,4CAO9FN,EAAAA,cAACO,EAAc,CAACF,UAAU,wBACxBL,EAAAA,cAACQ,EAAc,CAACH,UAAU,mBACxBL,EAAAA,cAACS,GAAW,KACVT,EAAAA,cAACiB,EAAM,OAETjB,EAAAA,cAACW,EAAK,CAACN,UAAU,kBAAiBC,EAAAA,EAAAA,IAAG,kBAEvCN,EAAAA,cAACY,EAAW,CAACP,UAAU,uBACrBL,EAAAA,cAAA,UACEA,EAAAA,cAAA,UAAI,WACJA,EAAAA,cAAA,UAAI,YACJA,EAAAA,cAAA,UAAI,YACJA,EAAAA,cAAA,UAAI,gBACJA,EAAAA,cAAA,UAAI,oBAMhB,EAIA,IAAMC,EAAYiB,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,6BAAAC,YAAA,eAAVJ,CAAU,6hBAoCtBd,EAAWc,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,4BAAAC,YAAA,eAAVJ,CAAU,2NAerBX,EAAiBW,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,kCAAAC,YAAA,eAAVJ,CAAU,0xBAkE3BV,EAAiBU,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,kCAAAC,YAAA,eAAVJ,CAAU,wIAU3BP,EAAQO,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,yBAAAC,YAAA,eAAVJ,CAAU,4JAYlBN,EAAcM,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,+BAAAC,YAAA,eAAVJ,CAAU,2RAyCxBT,IAXQS,EAAAA,QAAOK,KAAIH,WAAA,CAAAC,YAAA,yBAAAC,YAAA,eAAXJ,CAAW,mLAWLA,EAAAA,QAAOC,IAAGC,WAAA,CAAAC,YAAA,+BAAAC,YAAA,eAAVJ,CAAU,6HCjVxBxE,GAAc,CAClB,CACEO,OAAQuE,KACRzE,KAAM,CAEJ,qBASN0E,EAJuB,CACrBC,gBAAiBC,GAAe,SAAA7D,GAAK,OAAIkC,EAAAA,cAAC0B,EAAoB5D,EAAS,KAGnDpB,G,8BCpBtB,SAASkF,EAAEC,GAAG,IAAIC,EAAEC,EAAEpF,EAAE,GAAG,GAAG,iBAAiBkF,GAAG,iBAAiBA,EAAElF,GAAGkF,OAAO,GAAG,iBAAiBA,EAAE,GAAGG,MAAMC,QAAQJ,GAAG,IAAIC,EAAE,EAAEA,EAAED,EAAE/E,OAAOgF,IAAID,EAAEC,KAAKC,EAAEH,EAAEC,EAAEC,OAAOnF,IAAIA,GAAG,KAAKA,GAAGoF,QAAQ,IAAID,KAAKD,EAAEA,EAAEC,KAAKnF,IAAIA,GAAG,KAAKA,GAAGmF,GAAG,OAAOnF,CAAC,CAAQ,SAASuF,IAAO,IAAI,IAAIL,EAAEC,EAAEC,EAAE,EAAEpF,EAAE,GAAGoF,EAAEpD,UAAU7B,SAAS+E,EAAElD,UAAUoD,QAAQD,EAAEF,EAAEC,MAAMlF,IAAIA,GAAG,KAAKA,GAAGmF,GAAG,OAAOnF,CAAC,C,yCAAC,S,YCElWwF,EAAOC,QAAU,SAAsBC,EAAMC,EAAMC,EAASC,GAC1D,IAAIC,EAAMF,EAAUA,EAAQxD,KAAKyD,EAAgBH,EAAMC,QAAQ,EAE/D,QAAY,IAARG,EACF,QAASA,EAGX,GAAIJ,IAASC,EACX,OAAO,EAGT,GAAoB,iBAATD,IAAsBA,GAAwB,iBAATC,IAAsBA,EACpE,OAAO,EAGT,IAAII,EAAQpE,OAAOqE,KAAKN,GACpBO,EAAQtE,OAAOqE,KAAKL,GAExB,GAAII,EAAM5F,SAAW8F,EAAM9F,OACzB,OAAO,EAMT,IAHA,IAAI+F,EAAkBvE,OAAOQ,UAAUlC,eAAe4B,KAAK8D,GAGlDQ,EAAM,EAAGA,EAAMJ,EAAM5F,OAAQgG,IAAO,CAC3C,IAAIjE,EAAM6D,EAAMI,GAEhB,IAAKD,EAAgBhE,GACnB,OAAO,EAGT,IAAIkE,EAASV,EAAKxD,GACdmE,EAASV,EAAKzD,GAIlB,IAAY,KAFZ4D,EAAMF,EAAUA,EAAQxD,KAAKyD,EAAgBO,EAAQC,EAAQnE,QAAO,SAEtC,IAAR4D,GAAkBM,IAAWC,EACjD,OAAO,CAEX,CAEA,OAAO,CACT,C,yBC7CAb,EAAOC,QAAUa,OAAe,M,kBCAhCd,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,iBCAAD,EAAOC,QAAU,EAAjB,M,iBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,M,kBCAAD,EAAOC,QAAU,EAAjB,K,kBCAAD,EAAOC,QAAU,EAAjB,M,gBCAA,OAOC,WACA,aAEA,IAAIc,EAAS,CAAC,EAAEtG,eAEhB,SAASuG,IAGR,IAFA,IAAIC,EAAU,GAEL1E,EAAI,EAAGA,EAAIC,UAAU7B,OAAQ4B,IAAK,CAC1C,IAAI2E,EAAM1E,UAAUD,GAChB2E,IACHD,EAAUE,EAAYF,EAASG,EAAWF,IAE5C,CAEA,OAAOD,CACR,CAEA,SAASG,EAAYF,GACpB,GAAmB,iBAARA,GAAmC,iBAARA,EACrC,OAAOA,EAGR,GAAmB,iBAARA,EACV,MAAO,GAGR,GAAIrB,MAAMC,QAAQoB,GACjB,OAAOF,EAAWnE,MAAM,KAAMqE,GAG/B,GAAIA,EAAI5F,WAAaa,OAAOQ,UAAUrB,WAAa4F,EAAI5F,SAASA,WAAW+F,SAAS,iBACnF,OAAOH,EAAI5F,WAGZ,IAAI2F,EAAU,GAEd,IAAK,IAAIvE,KAAOwE,EACXH,EAAOnE,KAAKsE,EAAKxE,IAAQwE,EAAIxE,KAChCuE,EAAUE,EAAYF,EAASvE,IAIjC,OAAOuE,CACR,CAEA,SAASE,EAAaG,EAAOC,GAC5B,OAAKA,EAIDD,EACIA,EAAQ,IAAMC,EAGfD,EAAQC,EAPPD,CAQT,CAEqCtB,EAAOC,SAC3Ce,EAAWQ,QAAUR,EACrBhB,EAAOC,QAAUe,QAKhB,KAFwB,EAAF,WACtB,OAAOA,CACP,UAFoB,OAEpB,YAIH,CArEA,E,0JCJA,SAASS,EAA2BC,EAAMC,EAAWC,GACnD,IAAI,UACFC,EAAS,SACTC,GACEJ,EACJ,MAAMK,GAAW,QAAYJ,GACvBK,GAAgB,QAAiBL,GACjCM,GAAc,QAAcD,GAC5BE,GAAO,QAAQP,GACfQ,EAA0B,MAAbJ,EACbK,EAAUP,EAAUQ,EAAIR,EAAU7E,MAAQ,EAAI8E,EAAS9E,MAAQ,EAC/DsF,EAAUT,EAAUU,EAAIV,EAAU5E,OAAS,EAAI6E,EAAS7E,OAAS,EACjEuF,EAAcX,EAAUI,GAAe,EAAIH,EAASG,GAAe,EACzE,IAAIQ,EACJ,OAAQP,GACN,IAAK,MACHO,EAAS,CACPJ,EAAGD,EACHG,EAAGV,EAAUU,EAAIT,EAAS7E,QAE5B,MACF,IAAK,SACHwF,EAAS,CACPJ,EAAGD,EACHG,EAAGV,EAAUU,EAAIV,EAAU5E,QAE7B,MACF,IAAK,QACHwF,EAAS,CACPJ,EAAGR,EAAUQ,EAAIR,EAAU7E,MAC3BuF,EAAGD,GAEL,MACF,IAAK,OACHG,EAAS,CACPJ,EAAGR,EAAUQ,EAAIP,EAAS9E,MAC1BuF,EAAGD,GAEL,MACF,QACEG,EAAS,CACPJ,EAAGR,EAAUQ,EACbE,EAAGV,EAAUU,GAGnB,QAAQ,QAAaZ,IACnB,IAAK,QACHc,EAAOT,IAAkBQ,GAAeZ,GAAOO,GAAc,EAAI,GACjE,MACF,IAAK,MACHM,EAAOT,IAAkBQ,GAAeZ,GAAOO,GAAc,EAAI,GAGrE,OAAOM,CACT,CASA,MAAMC,EAAkBC,MAAOd,EAAWC,EAAUc,KAClD,MAAM,UACJjB,EAAY,SAAQ,SACpBkB,EAAW,WAAU,WACrBC,EAAa,GAAE,SACfC,GACEH,EACEI,EAAkBF,EAAWG,OAAOC,SACpCtB,QAA+B,MAAlBmB,EAASI,WAAgB,EAASJ,EAASI,MAAMrB,IACpE,IAAIsB,QAAcL,EAASM,gBAAgB,CACzCxB,YACAC,WACAe,cAEE,EACFR,EAAC,EACDE,GACEd,EAA2B2B,EAAOzB,EAAWC,GAC7C0B,EAAoB3B,EACpB4B,EAAiB,CAAC,EAClBC,EAAa,EACjB,IAAK,IAAIjH,EAAI,EAAGA,EAAIyG,EAAgBrI,OAAQ4B,IAAK,CAC/C,MAAM,KACJkH,EAAI,GACJC,GACEV,EAAgBzG,IAElB8F,EAAGsB,EACHpB,EAAGqB,EAAK,KACRC,EAAI,MACJC,SACQJ,EAAG,CACXrB,IACAE,IACAwB,iBAAkBpC,EAClBA,UAAW2B,EACXT,WACAU,iBACAH,QACAL,WACAiB,SAAU,CACRnC,YACAC,cAGJO,EAAa,MAATsB,EAAgBA,EAAQtB,EAC5BE,EAAa,MAATqB,EAAgBA,EAAQrB,EAC5BgB,EAAiB,IACZA,EACH,CAACE,GAAO,IACHF,EAAeE,MACfI,IAGHC,GAASN,GAAc,KACzBA,IACqB,iBAAVM,IACLA,EAAMnC,YACR2B,EAAoBQ,EAAMnC,WAExBmC,EAAMV,QACRA,GAAwB,IAAhBU,EAAMV,YAAuBL,EAASM,gBAAgB,CAC5DxB,YACAC,WACAe,aACGiB,EAAMV,SAGXf,IACAE,KACEd,EAA2B2B,EAAOE,EAAmB1B,KAE3DrF,GAAK,EAET,CACA,MAAO,CACL8F,IACAE,IACAZ,UAAW2B,EACXT,WACAU,iBACD,EAWHZ,eAAesB,EAAeC,EAAOC,GACnC,IAAIC,OACY,IAAZD,IACFA,EAAU,CAAC,GAEb,MAAM,EACJ9B,EAAC,EACDE,EAAC,SACDQ,EAAQ,MACRK,EAAK,SACLY,EAAQ,SACRnB,GACEqB,GACE,SACJG,EAAW,oBAAmB,aAC9BC,EAAe,WAAU,eACzBC,EAAiB,WAAU,YAC3BC,GAAc,EAAK,QACnBC,EAAU,IACR,QAASN,EAASD,GAChBQ,GAAgB,QAAiBD,GAEjCxJ,EAAU+I,EAASQ,EADa,aAAnBD,EAAgC,YAAc,WACbA,GAC9CI,GAAqB,cAAuB5B,EAAS6B,gBAAgB,CACzE3J,QAAiH,OAAtGmJ,QAAqD,MAAtBrB,EAAS8B,eAAoB,EAAS9B,EAAS8B,UAAU5J,MAAqBmJ,EAAgCnJ,EAAUA,EAAQ6J,sBAAyD,MAA/B/B,EAASgC,wBAA6B,EAAShC,EAASgC,mBAAmBf,EAASlC,WACxRuC,WACAC,eACAzB,cAEImC,EAA0B,aAAnBT,EAAgC,CAC3ClC,IACAE,IACAvF,MAAOoG,EAAMtB,SAAS9E,MACtBC,OAAQmG,EAAMtB,SAAS7E,QACrBmG,EAAMvB,UACJoD,QAAkD,MAA5BlC,EAASmC,qBAA0B,EAASnC,EAASmC,gBAAgBlB,EAASlC,WACpGqD,QAA4C,MAAtBpC,EAAS8B,eAAoB,EAAS9B,EAAS8B,UAAUI,WAA+C,MAArBlC,EAASqC,cAAmB,EAASrC,EAASqC,SAASH,KAGlK,CACF5C,EAAG,EACHE,EAAG,GAEC8C,GAAoB,QAAiBtC,EAASuC,4DAA8DvC,EAASuC,sDAAsD,CAC/KtB,WACAgB,OACAC,eACApC,aACGmC,GACL,MAAO,CACLO,KAAMZ,EAAmBY,IAAMF,EAAkBE,IAAMb,EAAca,KAAOJ,EAAY5C,EACxFiD,QAASH,EAAkBG,OAASb,EAAmBa,OAASd,EAAcc,QAAUL,EAAY5C,EACpGkD,MAAOd,EAAmBc,KAAOJ,EAAkBI,KAAOf,EAAce,MAAQN,EAAY9C,EAC5FqD,OAAQL,EAAkBK,MAAQf,EAAmBe,MAAQhB,EAAcgB,OAASP,EAAY9C,EAEpG,CAOA,MAAMsD,EAAQxB,IAAW,CACvBV,KAAM,QACNU,UACA,QAAMT,CAAGQ,GACP,MAAM,EACJ7B,EAAC,EACDE,EAAC,UACDZ,EAAS,MACTyB,EAAK,SACLL,EAAQ,SACRiB,EAAQ,eACRT,GACEW,GAEE,QACJjJ,EAAO,QACPwJ,EAAU,IACR,QAASN,EAASD,IAAU,CAAC,EACjC,GAAe,MAAXjJ,EACF,MAAO,CAAC,EAEV,MAAMyJ,GAAgB,QAAiBD,GACjChC,EAAS,CACbJ,IACAE,KAEIqD,GAAO,QAAiBjE,GACxBhH,GAAS,QAAciL,GACvBC,QAAwB9C,EAAS+C,cAAc7K,GAC/C8K,EAAmB,MAATH,EACVI,EAAUD,EAAU,MAAQ,OAC5BE,EAAUF,EAAU,SAAW,QAC/BG,EAAaH,EAAU,eAAiB,cACxCI,EAAU/C,EAAMvB,UAAUlH,GAAUyI,EAAMvB,UAAU+D,GAAQnD,EAAOmD,GAAQxC,EAAMtB,SAASnH,GAC1FyL,EAAY3D,EAAOmD,GAAQxC,EAAMvB,UAAU+D,GAC3CS,QAAuD,MAA5BtD,EAASmC,qBAA0B,EAASnC,EAASmC,gBAAgBjK,IACtG,IAAIqL,EAAaD,EAAoBA,EAAkBH,GAAc,EAGhEI,SAA6C,MAAtBvD,EAAS8B,eAAoB,EAAS9B,EAAS8B,UAAUwB,MACnFC,EAAatC,EAASlC,SAASoE,IAAe9C,EAAMtB,SAASnH,IAE/D,MAAM4L,EAAoBJ,EAAU,EAAIC,EAAY,EAI9CI,EAAyBF,EAAa,EAAIT,EAAgBlL,GAAU,EAAI,EACxE8L,GAAa,QAAI/B,EAAcsB,GAAUQ,GACzCE,GAAa,QAAIhC,EAAcuB,GAAUO,GAIzCG,EAAQF,EACRG,EAAMN,EAAaT,EAAgBlL,GAAU+L,EAC7CG,EAASP,EAAa,EAAIT,EAAgBlL,GAAU,EAAI4L,EACxD/I,GAAS,QAAMmJ,EAAOE,EAAQD,GAM9BE,GAAmBvD,EAAeoC,OAAoC,OAA3B,QAAahE,IAAsBkF,IAAWrJ,GAAU4F,EAAMvB,UAAUlH,GAAU,GAAKkM,EAASF,EAAQF,EAAaC,GAAcb,EAAgBlL,GAAU,EAAI,EAC5MoM,EAAkBD,EAAkBD,EAASF,EAAQE,EAASF,EAAQE,EAASD,EAAM,EAC3F,MAAO,CACL,CAAChB,GAAOnD,EAAOmD,GAAQmB,EACvBlD,KAAM,CACJ,CAAC+B,GAAOpI,EACRwJ,aAAcH,EAASrJ,EAASuJ,KAC5BD,GAAmB,CACrBC,oBAGJjD,MAAOgD,EAEX,IAkBF,MAAMG,EAAgB,SAAU9C,GAI9B,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLV,KAAM,gBACNU,UACA,QAAMT,CAAGQ,GACP,IAAIgD,EAAuBC,EAAwBC,EACnD,MAAM,MACJhE,EAAK,eACLG,EAAc,UACd5B,EAAS,SACToB,EAAQ,SACRiB,GACEE,GACE,UACJmD,GAAY,EAAK,UACjBC,EAAS,kBACTC,EAAoB,KAAU,cAC9BC,GAAgB,KACbC,IACD,QAAStD,EAASD,GAChBwD,OAA6BC,IAAdL,GAA2BC,IAAsB,KAtC5E,SAA0BD,EAAWE,EAAeD,GAElD,OAD2CD,EAAY,IAAIC,EAAkBtE,QAAOtB,IAAa,QAAaA,KAAe2F,OAAeC,EAAkBtE,QAAOtB,IAAa,QAAaA,KAAe2F,KAAcC,EAAkBtE,QAAOtB,IAAa,QAAQA,KAAeA,KAC/OsB,QAAOtB,IAC3C2F,IACK,QAAa3F,KAAe2F,KAAcE,IAAgB,QAA8B7F,KAAeA,GAIpH,CA8ByFiG,CAAiBN,GAAa,KAAME,EAAeD,GAAqBA,EACrJM,QAAiB5D,EAAeC,EAAOuD,GACvCK,GAA0E,OAAzDZ,EAAwB3D,EAAe0D,oBAAyB,EAASC,EAAsBa,QAAU,EAC1HC,EAAmBN,EAAaI,GACtC,GAAwB,MAApBE,EACF,MAAO,CAAC,EAEV,MAAMC,GAAiB,QAAkBD,EAAkB5E,QAAgC,MAAlBL,EAASI,WAAgB,EAASJ,EAASI,MAAMa,EAASlC,YAGnI,GAAIH,IAAcqG,EAChB,MAAO,CACLlE,MAAO,CACLnC,UAAW+F,EAAa,KAI9B,MAAMQ,EAAmB,CAACL,GAAS,QAAQG,IAAoBH,EAASI,EAAe,IAAKJ,EAASI,EAAe,KAC9GE,EAAe,KAAiE,OAA1DhB,EAAyB5D,EAAe0D,oBAAyB,EAASE,EAAuBiB,YAAc,GAAK,CAC9IzG,UAAWqG,EACXI,UAAWF,IAEPG,EAAgBX,EAAaI,EAAe,GAGlD,GAAIO,EACF,MAAO,CACLxE,KAAM,CACJkE,MAAOD,EAAe,EACtBM,UAAWD,GAEbrE,MAAO,CACLnC,UAAW0G,IAIjB,MAAMC,EAA8BH,EAAaI,KAAI7K,IACnD,MAAM4J,GAAY,QAAa5J,EAAEiE,WACjC,MAAO,CAACjE,EAAEiE,UAAW2F,GAAaD,EAElC3J,EAAE0K,UAAU7M,MAAM,EAAG,GAAGiN,QAAO,CAACC,EAAKC,IAAMD,EAAMC,GAAG,GAEpDhL,EAAE0K,UAAU,GAAI1K,EAAE0K,UAAU,IAC3BO,MAAK,CAACC,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KAKrBC,GAA8E,OAA3D1B,EAJWkB,EAA4BrF,QAAOvF,GAAKA,EAAE,GAAGnC,MAAM,GAGvF,QAAamC,EAAE,IAAM,EAAI,GAAGqL,OAAML,GAAKA,GAAK,MACiC,SAAc,EAAStB,EAAsB,KAAOkB,EAA4B,GAAG,GAChK,OAAIQ,IAAmBnH,EACd,CACLkC,KAAM,CACJkE,MAAOD,EAAe,EACtBM,UAAWD,GAEbrE,MAAO,CACLnC,UAAWmH,IAIV,CAAC,CACV,EAEJ,EAQME,EAAO,SAAU7E,GAIrB,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLV,KAAM,OACNU,UACA,QAAMT,CAAGQ,GACP,IAAI+E,EAAuBC,EAC3B,MAAM,UACJvH,EAAS,eACT4B,EAAc,MACdH,EAAK,iBACLW,EAAgB,SAChBhB,EAAQ,SACRiB,GACEE,GAEFiF,SAAUC,GAAgB,EAC1B/B,UAAWgC,GAAiB,EAC5BC,mBAAoBC,EAA2B,iBAC/CC,EAAmB,UAAS,0BAC5BC,EAA4B,OAAM,cAClCC,GAAgB,KACbjC,IACD,QAAStD,EAASD,GAMtB,GAAsD,OAAjD+E,EAAwB1F,EAAeoC,QAAkBsD,EAAsBlC,gBAClF,MAAO,CAAC,EAEV,MAAM7E,GAAO,QAAQP,GACfgI,GAAkB,QAAY5F,GAC9B6F,GAAkB,QAAQ7F,KAAsBA,EAChDnC,QAA+B,MAAlBmB,EAASI,WAAgB,EAASJ,EAASI,MAAMa,EAASlC,WACvEwH,EAAqBC,IAAgCK,IAAoBF,EAAgB,EAAC,QAAqB3F,KAAqB,QAAsBA,IAC1J8F,EAA6D,SAA9BJ,GAChCF,GAA+BM,GAClCP,EAAmBQ,SAAQ,QAA0B/F,EAAkB2F,EAAeD,EAA2B7H,IAEnH,MAAMmI,EAAa,CAAChG,KAAqBuF,GACnCzB,QAAiB5D,EAAeC,EAAOuD,GACvCW,EAAY,GAClB,IAAI4B,GAAiE,OAA/Cd,EAAuB3F,EAAeyF,WAAgB,EAASE,EAAqBd,YAAc,GAIxH,GAHIgB,GACFhB,EAAU0B,KAAKjC,EAAS3F,IAEtBmH,EAAgB,CAClB,MAAMY,GAAQ,QAAkBtI,EAAWyB,EAAOxB,GAClDwG,EAAU0B,KAAKjC,EAASoC,EAAM,IAAKpC,EAASoC,EAAM,IACpD,CAOA,GANAD,EAAgB,IAAIA,EAAe,CACjCrI,YACAyG,eAIGA,EAAUW,OAAM7G,GAAQA,GAAQ,IAAI,CACvC,IAAIgI,EAAuBC,EAC3B,MAAMC,IAA+D,OAAhDF,EAAwB3G,EAAeyF,WAAgB,EAASkB,EAAsBnC,QAAU,GAAK,EACpHM,EAAgB0B,EAAWK,GACjC,GAAI/B,EAEF,MAAO,CACLxE,KAAM,CACJkE,MAAOqC,EACPhC,UAAW4B,GAEblG,MAAO,CACLnC,UAAW0G,IAOjB,IAAIS,EAAgJ,OAA9HqB,EAAwBH,EAAc/G,QAAOvF,GAAKA,EAAE0K,UAAU,IAAM,IAAGO,MAAK,CAACC,EAAGC,IAAMD,EAAER,UAAU,GAAKS,EAAET,UAAU,KAAI,SAAc,EAAS+B,EAAsBxI,UAG1L,IAAKmH,EACH,OAAQU,GACN,IAAK,UACH,CACE,IAAIa,EACJ,MAAM1I,EASmJ,OATtI0I,EAAyBL,EAAc/G,QAAOvF,IAC/D,GAAImM,EAA8B,CAChC,MAAMS,GAAkB,QAAY5M,EAAEiE,WACtC,OAAO2I,IAAoBX,GAGP,MAApBW,CACF,CACA,OAAO,CAAI,IACV/B,KAAI7K,GAAK,CAACA,EAAEiE,UAAWjE,EAAE0K,UAAUnF,QAAO4E,GAAYA,EAAW,IAAGW,QAAO,CAACC,EAAKZ,IAAaY,EAAMZ,GAAU,MAAKc,MAAK,CAACC,EAAGC,IAAMD,EAAE,GAAKC,EAAE,KAAI,SAAc,EAASwB,EAAuB,GAC5L1I,IACFmH,EAAiBnH,GAEnB,KACF,CACF,IAAK,mBACHmH,EAAiB/E,EAIvB,GAAIpC,IAAcmH,EAChB,MAAO,CACLhF,MAAO,CACLnC,UAAWmH,GAInB,CACA,MAAO,CAAC,CACV,EAEJ,EAEA,SAASyB,EAAe1C,EAAU7C,GAChC,MAAO,CACLO,IAAKsC,EAAStC,IAAMP,EAAK/H,OACzByI,MAAOmC,EAASnC,MAAQV,EAAKhI,MAC7BwI,OAAQqC,EAASrC,OAASR,EAAK/H,OAC/BwI,KAAMoC,EAASpC,KAAOT,EAAKhI,MAE/B,CACA,SAASwN,EAAsB3C,GAC7B,OAAO,KAAM4C,MAAKvI,GAAQ2F,EAAS3F,IAAS,GAC9C,CAMA,MAAMwI,EAAO,SAAUvG,GAIrB,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLV,KAAM,OACNU,UACA,QAAMT,CAAGQ,GACP,MAAM,MACJd,GACEc,GACE,SACJrB,EAAW,qBACR4E,IACD,QAAStD,EAASD,GACtB,OAAQrB,GACN,IAAK,kBACH,CACE,MAIM8H,EAAUJ,QAJOtG,EAAeC,EAAO,IACxCuD,EACHlD,eAAgB,cAEuBnB,EAAMvB,WAC/C,MAAO,CACLgC,KAAM,CACJ+G,uBAAwBD,EACxBE,gBAAiBL,EAAsBG,IAG7C,CACF,IAAK,UACH,CACE,MAIMA,EAAUJ,QAJOtG,EAAeC,EAAO,IACxCuD,EACHjD,aAAa,IAE0BpB,EAAMtB,UAC/C,MAAO,CACL+B,KAAM,CACJiH,eAAgBH,EAChBI,QAASP,EAAsBG,IAGrC,CACF,QAEI,MAAO,CAAC,EAGhB,EAEJ,EAEA,SAASK,EAAgB5H,GACvB,MAAM6H,GAAO,WAAO7H,EAAMmF,KAAIvD,GAAQA,EAAKS,QACrCyF,GAAO,WAAO9H,EAAMmF,KAAIvD,GAAQA,EAAKO,OAG3C,MAAO,CACLlD,EAAG4I,EACH1I,EAAG2I,EACHlO,OALW,WAAOoG,EAAMmF,KAAIvD,GAAQA,EAAKU,SAK3BuF,EACdhO,QALW,WAAOmG,EAAMmF,KAAIvD,GAAQA,EAAKQ,UAK1B0F,EAEnB,CAqBA,MAAMC,EAAS,SAAUhH,GAIvB,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLV,KAAM,SACNU,UACA,QAAMT,CAAGQ,GACP,MAAM,UACJvC,EAAS,SACTqC,EAAQ,MACRZ,EAAK,SACLL,EAAQ,SACRF,GACEqB,GAIE,QACJO,EAAU,EAAC,EACXpC,EAAC,EACDE,IACE,QAAS4B,EAASD,GAChBkH,EAAoBvL,MAAMwL,WAAwC,MAA3BtI,EAASuI,oBAAyB,EAASvI,EAASuI,eAAetH,EAASnC,aAAgB,IACnI0J,EA5CZ,SAAwBnI,GACtB,MAAMoI,EAAcpI,EAAM7H,QAAQoN,MAAK,CAACC,EAAGC,IAAMD,EAAErG,EAAIsG,EAAEtG,IACnDkJ,EAAS,GACf,IAAIC,EAAW,KACf,IAAK,IAAInP,EAAI,EAAGA,EAAIiP,EAAY7Q,OAAQ4B,IAAK,CAC3C,MAAMyI,EAAOwG,EAAYjP,IACpBmP,GAAY1G,EAAKzC,EAAImJ,EAASnJ,EAAImJ,EAASzO,OAAS,EACvDwO,EAAO3B,KAAK,CAAC9E,IAEbyG,EAAOA,EAAO9Q,OAAS,GAAGmP,KAAK9E,GAEjC0G,EAAW1G,CACb,CACA,OAAOyG,EAAOlD,KAAIvD,IAAQ,QAAiBgG,EAAgBhG,KAC7D,CA8B0B2G,CAAeP,GAC7BQ,GAAW,QAAiBZ,EAAgBI,IAC5C1G,GAAgB,QAAiBD,GAsDvC,MAAMoH,QAAmB9I,EAASM,gBAAgB,CAChDxB,UAAW,CACTiK,sBAvDJ,WAEE,GAA2B,IAAvBP,EAAY5Q,QAAgB4Q,EAAY,GAAG9F,KAAO8F,EAAY,GAAG7F,OAAc,MAALrD,GAAkB,MAALE,EAEzF,OAAOgJ,EAAYQ,MAAK/G,GAAQ3C,EAAI2C,EAAKS,KAAOf,EAAce,MAAQpD,EAAI2C,EAAKU,MAAQhB,EAAcgB,OAASnD,EAAIyC,EAAKO,IAAMb,EAAca,KAAOhD,EAAIyC,EAAKQ,OAASd,EAAcc,UAAWoG,EAI/L,GAAIL,EAAY5Q,QAAU,EAAG,CAC3B,GAA+B,OAA3B,QAAYgH,GAAoB,CAClC,MAAMqK,EAAYT,EAAY,GACxBU,EAAWV,EAAYA,EAAY5Q,OAAS,GAC5CuR,EAA+B,SAAvB,QAAQvK,GAChB4D,EAAMyG,EAAUzG,IAChBC,EAASyG,EAASzG,OAClBC,EAAOyG,EAAQF,EAAUvG,KAAOwG,EAASxG,KACzCC,EAAQwG,EAAQF,EAAUtG,MAAQuG,EAASvG,MAGjD,MAAO,CACLH,MACAC,SACAC,OACAC,QACA1I,MAPY0I,EAAQD,EAQpBxI,OAPauI,EAASD,EAQtBlD,EAAGoD,EACHlD,EAAGgD,EAEP,CACA,MAAM4G,EAAoC,UAAvB,QAAQxK,GACrByK,GAAW,WAAOb,EAAYhD,KAAIvD,GAAQA,EAAKU,SAC/C2G,GAAU,WAAOd,EAAYhD,KAAIvD,GAAQA,EAAKS,QAC9C6G,EAAef,EAAYtI,QAAO+B,GAAQmH,EAAanH,EAAKS,OAAS4G,EAAUrH,EAAKU,QAAU0G,IAC9F7G,EAAM+G,EAAa,GAAG/G,IACtBC,EAAS8G,EAAaA,EAAa3R,OAAS,GAAG6K,OAKrD,MAAO,CACLD,MACAC,SACAC,KAPW4G,EAQX3G,MAPY0G,EAQZpP,MARYoP,EADDC,EAUXpP,OAPauI,EAASD,EAQtBlD,EAXWgK,EAYX9J,EAAGgD,EAEP,CACA,OAAOqG,CACT,GAKE9J,SAAUkC,EAASlC,SACnBe,aAEF,OAAIO,EAAMvB,UAAUQ,IAAMwJ,EAAWhK,UAAUQ,GAAKe,EAAMvB,UAAUU,IAAMsJ,EAAWhK,UAAUU,GAAKa,EAAMvB,UAAU7E,QAAU6O,EAAWhK,UAAU7E,OAASoG,EAAMvB,UAAU5E,SAAW4O,EAAWhK,UAAU5E,OACnM,CACL6G,MAAO,CACLV,MAAOyI,IAIN,CAAC,CACV,EAEJ,EAoDA,MAAMrO,EAAS,SAAU2G,GAIvB,YAHgB,IAAZA,IACFA,EAAU,GAEL,CACLV,KAAM,SACNU,UACA,QAAMT,CAAGQ,GACP,IAAIqI,EAAuBtD,EAC3B,MAAM,EACJ5G,EAAC,EACDE,EAAC,UACDZ,EAAS,eACT4B,GACEW,EACEsI,QA9DZ7J,eAAoCuB,EAAOC,GACzC,MAAM,UACJxC,EAAS,SACToB,EAAQ,SACRiB,GACEE,EACEtC,QAA+B,MAAlBmB,EAASI,WAAgB,EAASJ,EAASI,MAAMa,EAASlC,WACvEI,GAAO,QAAQP,GACf2F,GAAY,QAAa3F,GACzBQ,EAAwC,OAA3B,QAAYR,GACzB8K,EAAgB,CAAC,OAAQ,OAAOpL,SAASa,IAAS,EAAI,EACtDwK,EAAiB9K,GAAOO,GAAc,EAAI,EAC1CwK,GAAW,QAASxI,EAASD,GAGnC,IAAI,SACFiF,EAAQ,UACR9B,EAAS,cACTrF,GACsB,iBAAb2K,EAAwB,CACjCxD,SAAUwD,EACVtF,UAAW,EACXrF,cAAe,MACb,CACFmH,SAAUwD,EAASxD,UAAY,EAC/B9B,UAAWsF,EAAStF,WAAa,EACjCrF,cAAe2K,EAAS3K,eAK1B,OAHIsF,GAAsC,iBAAlBtF,IACtBqF,EAA0B,QAAdC,GAAuC,EAAjBtF,EAAqBA,GAElDG,EAAa,CAClBE,EAAGgF,EAAYqF,EACfnK,EAAG4G,EAAWsD,GACZ,CACFpK,EAAG8G,EAAWsD,EACdlK,EAAG8E,EAAYqF,EAEnB,CAwB+BE,CAAqB1I,EAAOC,GAIrD,OAAIxC,KAAkE,OAAlD4K,EAAwBhJ,EAAe/F,aAAkB,EAAS+O,EAAsB5K,YAAgE,OAAjDsH,EAAwB1F,EAAeoC,QAAkBsD,EAAsBlC,gBACjM,CAAC,EAEH,CACL1E,EAAGA,EAAImK,EAAWnK,EAClBE,EAAGA,EAAIiK,EAAWjK,EAClBsB,KAAM,IACD2I,EACH7K,aAGN,EAEJ,EAOMkL,EAAQ,SAAU1I,GAItB,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLV,KAAM,QACNU,UACA,QAAMT,CAAGQ,GACP,MAAM,EACJ7B,EAAC,EACDE,EAAC,UACDZ,GACEuC,GAEFiF,SAAUC,GAAgB,EAC1B/B,UAAWgC,GAAiB,EAAK,QACjCyD,EAAU,CACRpJ,GAAIhC,IACF,IAAI,EACFW,EAAC,EACDE,GACEb,EACJ,MAAO,CACLW,IACAE,IACD,MAGFkF,IACD,QAAStD,EAASD,GAChBzB,EAAS,CACbJ,IACAE,KAEIsF,QAAiB5D,EAAeC,EAAOuD,GACvCJ,GAAY,SAAY,QAAQ1F,IAChCwH,GAAW,QAAgB9B,GACjC,IAAI0F,EAAgBtK,EAAO0G,GACvB6D,EAAiBvK,EAAO4E,GAC5B,GAAI+B,EAAe,CACjB,MACM6D,EAAuB,MAAb9D,EAAmB,SAAW,QACxC+D,EAAMH,EAAgBlF,EAFC,MAAbsB,EAAmB,MAAQ,QAGrCvC,EAAMmG,EAAgBlF,EAASoF,GACrCF,GAAgB,QAAMG,EAAKH,EAAenG,EAC5C,CACA,GAAIyC,EAAgB,CAClB,MACM4D,EAAwB,MAAd5F,EAAoB,SAAW,QACzC6F,EAAMF,EAAiBnF,EAFC,MAAdR,EAAoB,MAAQ,QAGtCT,EAAMoG,EAAiBnF,EAASoF,GACtCD,GAAiB,QAAME,EAAKF,EAAgBpG,EAC9C,CACA,MAAMuG,EAAgBL,EAAQpJ,GAAG,IAC5BQ,EACH,CAACiF,GAAW4D,EACZ,CAAC1F,GAAY2F,IAEf,MAAO,IACFG,EACHtJ,KAAM,CACJxB,EAAG8K,EAAc9K,EAAIA,EACrBE,EAAG4K,EAAc5K,EAAIA,EACrB6K,QAAS,CACP,CAACjE,GAAWC,EACZ,CAAC/B,GAAYgC,IAIrB,EAEJ,EAIMgE,EAAa,SAAUlJ,GAI3B,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLA,UACA,EAAAT,CAAGQ,GACD,MAAM,EACJ7B,EAAC,EACDE,EAAC,UACDZ,EAAS,MACTyB,EAAK,eACLG,GACEW,GACE,OACJ1G,EAAS,EACT2L,SAAUC,GAAgB,EAC1B/B,UAAWgC,GAAiB,IAC1B,QAASlF,EAASD,GAChBzB,EAAS,CACbJ,IACAE,KAEI8E,GAAY,QAAY1F,GACxBwH,GAAW,QAAgB9B,GACjC,IAAI0F,EAAgBtK,EAAO0G,GACvB6D,EAAiBvK,EAAO4E,GAC5B,MAAMiG,GAAY,QAAS9P,EAAQ0G,GAC7BqJ,EAAsC,iBAAdD,EAAyB,CACrDnE,SAAUmE,EACVjG,UAAW,GACT,CACF8B,SAAU,EACV9B,UAAW,KACRiG,GAEL,GAAIlE,EAAe,CACjB,MAAMoE,EAAmB,MAAbrE,EAAmB,SAAW,QACpCsE,EAAWrK,EAAMvB,UAAUsH,GAAY/F,EAAMtB,SAAS0L,GAAOD,EAAepE,SAC5EuE,EAAWtK,EAAMvB,UAAUsH,GAAY/F,EAAMvB,UAAU2L,GAAOD,EAAepE,SAC/E4D,EAAgBU,EAClBV,EAAgBU,EACPV,EAAgBW,IACzBX,EAAgBW,EAEpB,CACA,GAAIrE,EAAgB,CAClB,IAAIkD,EAAuBoB,EAC3B,MAAMH,EAAmB,MAAbrE,EAAmB,QAAU,SACnCyE,EAAe,CAAC,MAAO,QAAQvM,UAAS,QAAQM,IAChD8L,EAAWrK,EAAMvB,UAAUwF,GAAajE,EAAMtB,SAAS0L,IAAQI,IAAmE,OAAlDrB,EAAwBhJ,EAAe/F,aAAkB,EAAS+O,EAAsBlF,KAAmB,IAAMuG,EAAe,EAAIL,EAAelG,WACnOqG,EAAWtK,EAAMvB,UAAUwF,GAAajE,EAAMvB,UAAU2L,IAAQI,EAAe,GAAyD,OAAnDD,EAAyBpK,EAAe/F,aAAkB,EAASmQ,EAAuBtG,KAAe,IAAMuG,EAAeL,EAAelG,UAAY,GAChP2F,EAAiBS,EACnBT,EAAiBS,EACRT,EAAiBU,IAC1BV,EAAiBU,EAErB,CACA,MAAO,CACL,CAACvE,GAAW4D,EACZ,CAAC1F,GAAY2F,EAEjB,EAEJ,EAQMa,EAAO,SAAU1J,GAIrB,YAHgB,IAAZA,IACFA,EAAU,CAAC,GAEN,CACLV,KAAM,OACNU,UACA,QAAMT,CAAGQ,GACP,IAAI4J,EAAuBC,EAC3B,MAAM,UACJpM,EAAS,MACTyB,EAAK,SACLL,EAAQ,SACRiB,GACEE,GACE,MACJrH,EAAQ,YACL4K,IACD,QAAStD,EAASD,GAChB2D,QAAiB5D,EAAeC,EAAOuD,GACvCvF,GAAO,QAAQP,GACf2F,GAAY,QAAa3F,GACzBoE,EAAqC,OAA3B,QAAYpE,IACtB,MACJ3E,EAAK,OACLC,GACEmG,EAAMtB,SACV,IAAIkM,EACAC,EACS,QAAT/L,GAA2B,WAATA,GACpB8L,EAAa9L,EACb+L,EAAY3G,WAAyC,MAAlBvE,EAASI,WAAgB,EAASJ,EAASI,MAAMa,EAASlC,WAAc,QAAU,OAAS,OAAS,UAEvImM,EAAY/L,EACZ8L,EAA2B,QAAd1G,EAAsB,MAAQ,UAE7C,MAAM4G,EAAwBjR,EAAS4K,EAAStC,IAAMsC,EAASrC,OACzD2I,EAAuBnR,EAAQ6K,EAASpC,KAAOoC,EAASnC,MACxD0I,GAA0B,QAAInR,EAAS4K,EAASmG,GAAaE,GAC7DG,GAAyB,QAAIrR,EAAQ6K,EAASoG,GAAYE,GAC1DG,GAAWpK,EAAMX,eAAesJ,MACtC,IAAI0B,EAAkBH,EAClBI,EAAiBH,EAOrB,GAN4D,OAAvDP,EAAwB5J,EAAMX,eAAesJ,QAAkBiB,EAAsBV,QAAQ/K,IAChGmM,EAAiBL,GAE0C,OAAxDJ,EAAyB7J,EAAMX,eAAesJ,QAAkBkB,EAAuBX,QAAQ7K,IAClGgM,EAAkBL,GAEhBI,IAAYhH,EAAW,CACzB,MAAMmH,GAAO,QAAI5G,EAASpC,KAAM,GAC1BiJ,GAAO,QAAI7G,EAASnC,MAAO,GAC3BiJ,GAAO,QAAI9G,EAAStC,IAAK,GACzBqJ,GAAO,QAAI/G,EAASrC,OAAQ,GAC9BO,EACFyI,EAAiBxR,EAAQ,GAAc,IAATyR,GAAuB,IAATC,EAAaD,EAAOC,GAAO,QAAI7G,EAASpC,KAAMoC,EAASnC,QAEnG6I,EAAkBtR,EAAS,GAAc,IAAT0R,GAAuB,IAATC,EAAaD,EAAOC,GAAO,QAAI/G,EAAStC,IAAKsC,EAASrC,QAExG,OACM3I,EAAM,IACPqH,EACHsK,iBACAD,oBAEF,MAAMM,QAAuB9L,EAAS+C,cAAc9B,EAASlC,UAC7D,OAAI9E,IAAU6R,EAAe7R,OAASC,IAAW4R,EAAe5R,OACvD,CACL6G,MAAO,CACLV,OAAO,IAIN,CAAC,CACV,EAEJ,C,mICzgCA,SAAS0L,EAAiB7T,GACxB,MAAM8T,GAAM,QAAiB9T,GAG7B,IAAI+B,EAAQgS,WAAWD,EAAI/R,QAAU,EACjCC,EAAS+R,WAAWD,EAAI9R,SAAW,EACvC,MAAMgS,GAAY,QAAchU,GAC1BiU,EAAcD,EAAYhU,EAAQiU,YAAclS,EAChDmS,EAAeF,EAAYhU,EAAQkU,aAAelS,EAClDmS,GAAiB,QAAMpS,KAAWkS,IAAe,QAAMjS,KAAYkS,EAKzE,OAJIC,IACFpS,EAAQkS,EACRjS,EAASkS,GAEJ,CACLnS,QACAC,SACAoS,EAAGD,EAEP,CAEA,SAASE,EAAcrU,GACrB,OAAQ,QAAUA,GAAoCA,EAAzBA,EAAQ6J,cACvC,CAEA,SAASM,EAASnK,GAChB,MAAMsU,EAAaD,EAAcrU,GACjC,KAAK,QAAcsU,GACjB,OAAO,QAAa,GAEtB,MAAMvK,EAAOuK,EAAWzD,yBAClB,MACJ9O,EAAK,OACLC,EAAM,EACNoS,GACEP,EAAiBS,GACrB,IAAIlN,GAAKgN,GAAI,QAAMrK,EAAKhI,OAASgI,EAAKhI,OAASA,EAC3CuF,GAAK8M,GAAI,QAAMrK,EAAK/H,QAAU+H,EAAK/H,QAAUA,EAUjD,OANKoF,GAAMmN,OAAOC,SAASpN,KACzBA,EAAI,GAEDE,GAAMiN,OAAOC,SAASlN,KACzBA,EAAI,GAEC,CACLF,IACAE,IAEJ,CAEA,MAAMmN,GAAyB,QAAa,GAC5C,SAASC,EAAiB1U,GACxB,MAAM2U,GAAM,QAAU3U,GACtB,OAAK,WAAe2U,EAAIC,eAGjB,CACLxN,EAAGuN,EAAIC,eAAeC,WACtBvN,EAAGqN,EAAIC,eAAeE,WAJfL,CAMX,CAWA,SAAS5D,EAAsB7Q,EAAS+U,EAAcC,EAAiBhL,QAChD,IAAjB+K,IACFA,GAAe,QAEO,IAApBC,IACFA,GAAkB,GAEpB,MAAMC,EAAajV,EAAQ6Q,wBACrByD,EAAaD,EAAcrU,GACjC,IAAIkV,GAAQ,QAAa,GACrBH,IACE/K,GACE,QAAUA,KACZkL,EAAQ/K,EAASH,IAGnBkL,EAAQ/K,EAASnK,IAGrB,MAAMmV,EA7BR,SAAgCnV,EAASoV,EAASC,GAIhD,YAHgB,IAAZD,IACFA,GAAU,MAEPC,GAAwBD,GAAWC,KAAyB,QAAUrV,KAGpEoV,CACT,CAqBwBE,CAAuBhB,EAAYU,EAAiBhL,GAAgB0K,EAAiBJ,IAAc,QAAa,GACtI,IAAIlN,GAAK6N,EAAWzK,KAAO2K,EAAc/N,GAAK8N,EAAM9N,EAChDE,GAAK2N,EAAW3K,IAAM6K,EAAc7N,GAAK4N,EAAM5N,EAC/CvF,EAAQkT,EAAWlT,MAAQmT,EAAM9N,EACjCpF,EAASiT,EAAWjT,OAASkT,EAAM5N,EACvC,GAAIgN,EAAY,CACd,MAAMK,GAAM,QAAUL,GAChBiB,EAAYvL,IAAgB,QAAUA,IAAgB,QAAUA,GAAgBA,EACtF,IAAIwL,EAAab,EACbc,GAAgB,QAAgBD,GACpC,KAAOC,GAAiBzL,GAAgBuL,IAAcC,GAAY,CAChE,MAAME,EAAcvL,EAASsL,GACvBE,EAAaF,EAAc5E,wBAC3BiD,GAAM,QAAiB2B,GACvBjL,EAAOmL,EAAWnL,MAAQiL,EAAcG,WAAa7B,WAAWD,EAAI+B,cAAgBH,EAAYtO,EAChGkD,EAAMqL,EAAWrL,KAAOmL,EAAcK,UAAY/B,WAAWD,EAAIiC,aAAeL,EAAYpO,EAClGF,GAAKsO,EAAYtO,EACjBE,GAAKoO,EAAYpO,EACjBvF,GAAS2T,EAAYtO,EACrBpF,GAAU0T,EAAYpO,EACtBF,GAAKoD,EACLlD,GAAKgD,EACLkL,GAAa,QAAUC,GACvBA,GAAgB,QAAgBD,EAClC,CACF,CACA,OAAO,QAAiB,CACtBzT,QACAC,SACAoF,IACAE,KAEJ,CAIA,SAAS0O,EAAoBhW,EAAS+J,GACpC,MAAMkM,GAAa,QAAcjW,GAASkW,WAC1C,OAAKnM,EAGEA,EAAKS,KAAOyL,EAFVpF,GAAsB,QAAmB7Q,IAAUwK,KAAOyL,CAGrE,CAEA,SAASE,EAAcC,EAAiBC,EAAQC,QACrB,IAArBA,IACFA,GAAmB,GAErB,MAAMC,EAAWH,EAAgBvF,wBAKjC,MAAO,CACLzJ,EALQmP,EAAS/L,KAAO6L,EAAOH,YAAcI,EAAmB,EAElEN,EAAoBI,EAAiBG,IAInCjP,EAHQiP,EAASjM,IAAM+L,EAAOG,UAKlC,CA6GA,SAASC,EAAkCzW,EAAS0W,EAAkB9O,GACpE,IAAImC,EACJ,GAAyB,aAArB2M,EACF3M,EA7CJ,SAAyB/J,EAAS4H,GAChC,MAAM+M,GAAM,QAAU3U,GAChB2W,GAAO,QAAmB3W,GAC1B4U,EAAiBD,EAAIC,eAC3B,IAAI7S,EAAQ4U,EAAKC,YACb5U,EAAS2U,EAAKE,aACdzP,EAAI,EACJE,EAAI,EACR,GAAIsN,EAAgB,CAClB7S,EAAQ6S,EAAe7S,MACvBC,EAAS4S,EAAe5S,OACxB,MAAM8U,GAAsB,YACvBA,GAAuBA,GAAoC,UAAblP,KACjDR,EAAIwN,EAAeC,WACnBvN,EAAIsN,EAAeE,UAEvB,CACA,MAAO,CACL/S,QACAC,SACAoF,IACAE,IAEJ,CAsBWyP,CAAgB/W,EAAS4H,QAC3B,GAAyB,aAArB8O,EACT3M,EAlEJ,SAAyB/J,GACvB,MAAM2W,GAAO,QAAmB3W,GAC1BqW,GAAS,QAAcrW,GACvBgX,EAAOhX,EAAQiX,cAAcD,KAC7BjV,GAAQ,QAAI4U,EAAKO,YAAaP,EAAKC,YAAaI,EAAKE,YAAaF,EAAKJ,aACvE5U,GAAS,QAAI2U,EAAKQ,aAAcR,EAAKE,aAAcG,EAAKG,aAAcH,EAAKH,cACjF,IAAIzP,GAAKiP,EAAOH,WAAaF,EAAoBhW,GACjD,MAAMsH,GAAK+O,EAAOG,UAIlB,MAHyC,SAArC,QAAiBQ,GAAMI,YACzBhQ,IAAK,QAAIuP,EAAKC,YAAaI,EAAKJ,aAAe7U,GAE1C,CACLA,QACAC,SACAoF,IACAE,IAEJ,CAiDW+P,EAAgB,QAAmBrX,SACrC,IAAI,QAAU0W,GACnB3M,EAvBJ,SAAoC/J,EAAS4H,GAC3C,MAAMqN,EAAapE,EAAsB7Q,GAAS,EAAmB,UAAb4H,GAClD0C,EAAM2K,EAAW3K,IAAMtK,EAAQ8V,UAC/BtL,EAAOyK,EAAWzK,KAAOxK,EAAQ4V,WACjCV,GAAQ,QAAclV,GAAWmK,EAASnK,IAAW,QAAa,GAKxE,MAAO,CACL+B,MALY/B,EAAQ4W,YAAc1B,EAAM9N,EAMxCpF,OALahC,EAAQ6W,aAAe3B,EAAM5N,EAM1CF,EALQoD,EAAO0K,EAAM9N,EAMrBE,EALQgD,EAAM4K,EAAM5N,EAOxB,CAQWgQ,CAA2BZ,EAAkB9O,OAC/C,CACL,MAAMuN,EAAgBT,EAAiB1U,GACvC+J,EAAO,CACL3C,EAAGsP,EAAiBtP,EAAI+N,EAAc/N,EACtCE,EAAGoP,EAAiBpP,EAAI6N,EAAc7N,EACtCvF,MAAO2U,EAAiB3U,MACxBC,OAAQ0U,EAAiB1U,OAE7B,CACA,OAAO,QAAiB+H,EAC1B,CACA,SAASwN,EAAyBvX,EAASwX,GACzC,MAAMC,GAAa,QAAczX,GACjC,QAAIyX,IAAeD,KAAa,QAAUC,KAAe,QAAsBA,MAG9B,WAA1C,QAAiBA,GAAYC,UAAwBH,EAAyBE,EAAYD,GACnG,CA2EA,SAASG,EAA8B3X,EAASgK,EAAcpC,GAC5D,MAAMgQ,GAA0B,QAAc5N,GACxCoM,GAAkB,QAAmBpM,GACrCoL,EAAuB,UAAbxN,EACVmC,EAAO8G,EAAsB7Q,GAAS,EAAMoV,EAASpL,GAC3D,IAAIqM,EAAS,CACXH,WAAY,EACZM,UAAW,GAEb,MAAM9G,GAAU,QAAa,GAC7B,GAAIkI,IAA4BA,IAA4BxC,EAI1D,IAHkC,UAA9B,QAAYpL,KAA4B,QAAkBoM,MAC5DC,GAAS,QAAcrM,IAErB4N,EAAyB,CAC3B,MAAMC,EAAahH,EAAsB7G,GAAc,EAAMoL,EAASpL,GACtE0F,EAAQtI,EAAIyQ,EAAWzQ,EAAI4C,EAAa4L,WACxClG,EAAQpI,EAAIuQ,EAAWvQ,EAAI0C,EAAa8L,SAC1C,MAAWM,IAGT1G,EAAQtI,EAAI4O,EAAoBI,IAGpC,MAAM0B,GAAa1B,GAAoBwB,GAA4BxC,GAAmD,QAAa,GAAtDe,EAAcC,EAAiBC,GAG5G,MAAO,CACLjP,EAHQ2C,EAAKS,KAAO6L,EAAOH,WAAaxG,EAAQtI,EAAI0Q,EAAW1Q,EAI/DE,EAHQyC,EAAKO,IAAM+L,EAAOG,UAAY9G,EAAQpI,EAAIwQ,EAAWxQ,EAI7DvF,MAAOgI,EAAKhI,MACZC,OAAQ+H,EAAK/H,OAEjB,CAEA,SAAS+V,EAAmB/X,GAC1B,MAA8C,YAAvC,QAAiBA,GAAS0X,QACnC,CAEA,SAASM,EAAoBhY,EAASiY,GACpC,KAAK,QAAcjY,IAAmD,WAAvC,QAAiBA,GAAS0X,SACvD,OAAO,KAET,GAAIO,EACF,OAAOA,EAASjY,GAElB,IAAIkY,EAAkBlY,EAAQgK,aAS9B,OAHI,QAAmBhK,KAAakY,IAClCA,EAAkBA,EAAgBjB,cAAcD,MAE3CkB,CACT,CAIA,SAASjO,EAAgBjK,EAASiY,GAChC,MAAMtD,GAAM,QAAU3U,GACtB,IAAI,QAAWA,GACb,OAAO2U,EAET,KAAK,QAAc3U,GAAU,CAC3B,IAAImY,GAAkB,QAAcnY,GACpC,KAAOmY,KAAoB,QAAsBA,IAAkB,CACjE,IAAI,QAAUA,KAAqBJ,EAAmBI,GACpD,OAAOA,EAETA,GAAkB,QAAcA,EAClC,CACA,OAAOxD,CACT,CACA,IAAI3K,EAAegO,EAAoBhY,EAASiY,GAChD,KAAOjO,IAAgB,QAAeA,IAAiB+N,EAAmB/N,IACxEA,EAAegO,EAAoBhO,EAAciO,GAEnD,OAAIjO,IAAgB,QAAsBA,IAAiB+N,EAAmB/N,MAAkB,QAAkBA,GACzG2K,EAEF3K,IAAgB,QAAmBhK,IAAY2U,CACxD,CAqBA,MAAM7M,EAAW,CACfuC,sDAxTF,SAA+D5D,GAC7D,IAAI,SACFsC,EAAQ,KACRgB,EAAI,aACJC,EAAY,SACZpC,GACEnB,EACJ,MAAM2O,EAAuB,UAAbxN,EACVwO,GAAkB,QAAmBpM,GACrCoO,IAAWrP,IAAW,QAAWA,EAASlC,UAChD,GAAImD,IAAiBoM,GAAmBgC,GAAYhD,EAClD,OAAOrL,EAET,IAAIsM,EAAS,CACXH,WAAY,EACZM,UAAW,GAETtB,GAAQ,QAAa,GACzB,MAAMxF,GAAU,QAAa,GACvBkI,GAA0B,QAAc5N,GAC9C,IAAI4N,IAA4BA,IAA4BxC,MACxB,UAA9B,QAAYpL,KAA4B,QAAkBoM,MAC5DC,GAAS,QAAcrM,KAErB,QAAcA,IAAe,CAC/B,MAAM6N,EAAahH,EAAsB7G,GACzCkL,EAAQ/K,EAASH,GACjB0F,EAAQtI,EAAIyQ,EAAWzQ,EAAI4C,EAAa4L,WACxClG,EAAQpI,EAAIuQ,EAAWvQ,EAAI0C,EAAa8L,SAC1C,CAEF,MAAMgC,GAAa1B,GAAoBwB,GAA4BxC,GAAyD,QAAa,GAA5De,EAAcC,EAAiBC,GAAQ,GACpH,MAAO,CACLtU,MAAOgI,EAAKhI,MAAQmT,EAAM9N,EAC1BpF,OAAQ+H,EAAK/H,OAASkT,EAAM5N,EAC5BF,EAAG2C,EAAK3C,EAAI8N,EAAM9N,EAAIiP,EAAOH,WAAahB,EAAM9N,EAAIsI,EAAQtI,EAAI0Q,EAAW1Q,EAC3EE,EAAGyC,EAAKzC,EAAI4N,EAAM5N,EAAI+O,EAAOG,UAAYtB,EAAM5N,EAAIoI,EAAQpI,EAAIwQ,EAAWxQ,EAE9E,EAmREwC,mBAAkB,KAClBH,gBAhJF,SAAyBlD,GACvB,IAAI,QACFzG,EAAO,SACPoJ,EAAQ,aACRC,EAAY,SACZzB,GACEnB,EACJ,MACM4R,EAAoB,IADoB,sBAAbjP,GAAmC,QAAWpJ,GAAW,GAxC5F,SAAqCA,EAASsY,GAC5C,MAAMC,EAAeD,EAAME,IAAIxY,GAC/B,GAAIuY,EACF,OAAOA,EAET,IAAIE,GAAS,QAAqBzY,EAAS,IAAI,GAAOgI,QAAO0Q,IAAM,QAAUA,IAA2B,UAApB,QAAYA,KAC5FC,EAAsC,KAC1C,MAAMC,EAAwD,WAAvC,QAAiB5Y,GAAS0X,SACjD,IAAImB,EAAcD,GAAiB,QAAc5Y,GAAWA,EAG5D,MAAO,QAAU6Y,MAAiB,QAAsBA,IAAc,CACpE,MAAMC,GAAgB,QAAiBD,GACjCE,GAA0B,QAAkBF,GAC7CE,GAAsD,UAA3BD,EAAcpB,WAC5CiB,EAAsC,OAEVC,GAAkBG,IAA4BJ,GAAuCI,GAAsD,WAA3BD,EAAcpB,UAA2BiB,GAAuC,CAAC,WAAY,SAASvS,SAASuS,EAAoCjB,YAAa,QAAkBmB,KAAiBE,GAA2BxB,EAAyBvX,EAAS6Y,IAG5YJ,EAASA,EAAOzQ,QAAOgR,GAAYA,IAAaH,IAGhDF,EAAsCG,EAExCD,GAAc,QAAcA,EAC9B,CAEA,OADAP,EAAMW,IAAIjZ,EAASyY,GACZA,CACT,CAWiGS,CAA4BlZ,EAAS6B,KAAKsX,IAAM,GAAGC,OAAOhQ,GACjGC,GAClDgQ,EAAwBhB,EAAkB,GAC1CiB,EAAejB,EAAkB9K,QAAO,CAACgM,EAAS7C,KACtD,MAAM3M,EAAO0M,EAAkCzW,EAAS0W,EAAkB9O,GAK1E,OAJA2R,EAAQjP,KAAM,QAAIP,EAAKO,IAAKiP,EAAQjP,KACpCiP,EAAQ9O,OAAQ,QAAIV,EAAKU,MAAO8O,EAAQ9O,OACxC8O,EAAQhP,QAAS,QAAIR,EAAKQ,OAAQgP,EAAQhP,QAC1CgP,EAAQ/O,MAAO,QAAIT,EAAKS,KAAM+O,EAAQ/O,MAC/B+O,CAAO,GACb9C,EAAkCzW,EAASqZ,EAAuBzR,IACrE,MAAO,CACL7F,MAAOuX,EAAa7O,MAAQ6O,EAAa9O,KACzCxI,OAAQsX,EAAa/O,OAAS+O,EAAahP,IAC3ClD,EAAGkS,EAAa9O,KAChBlD,EAAGgS,EAAahP,IAEpB,EAyHEL,kBACA7B,gBAxBsBV,eAAgBkB,GACtC,MAAM4Q,EAAoB3X,KAAKoI,iBAAmBA,EAC5CwP,EAAkB5X,KAAKgJ,cACvB6O,QAA2BD,EAAgB7Q,EAAK/B,UACtD,MAAO,CACLD,UAAW+Q,EAA8B/O,EAAKhC,gBAAiB4S,EAAkB5Q,EAAK/B,UAAW+B,EAAKhB,UACtGf,SAAU,CACRO,EAAG,EACHE,EAAG,EACHvF,MAAO2X,EAAmB3X,MAC1BC,OAAQ0X,EAAmB1X,QAGjC,EAYEqO,eArRF,SAAwBrQ,GACtB,OAAO4E,MAAMwL,KAAKpQ,EAAQqQ,iBAC5B,EAoRExF,cA1HF,SAAuB7K,GACrB,MAAM,MACJ+B,EAAK,OACLC,GACE6R,EAAiB7T,GACrB,MAAO,CACL+B,QACAC,SAEJ,EAkHEmI,WACAP,UAAS,KACT1B,MAdF,SAAelI,GACb,MAA+C,SAAxC,QAAiBA,GAASoX,SACnC,GAeA,SAASuC,EAAchM,EAAGC,GACxB,OAAOD,EAAEvG,IAAMwG,EAAExG,GAAKuG,EAAErG,IAAMsG,EAAEtG,GAAKqG,EAAE5L,QAAU6L,EAAE7L,OAAS4L,EAAE3L,SAAW4L,EAAE5L,MAC7E,CAkGA,SAAS4X,EAAWhT,EAAWC,EAAUgT,EAAQ3Q,QAC/B,IAAZA,IACFA,EAAU,CAAC,GAEb,MAAM,eACJ4Q,GAAiB,EAAI,eACrBC,GAAiB,EAAI,cACrBC,EAA0C,mBAAnBC,eAA6B,YACpDC,EAA8C,mBAAzBC,qBAAmC,eACxDC,GAAiB,GACflR,EACEmR,EAAchG,EAAczN,GAC5B0T,EAAYR,GAAkBC,EAAiB,IAAKM,GAAc,QAAqBA,GAAe,OAAQ,QAAqBxT,IAAa,GACtJyT,EAAUC,SAAQvB,IAChBc,GAAkBd,EAASwB,iBAAiB,SAAUX,EAAQ,CAC5DY,SAAS,IAEXV,GAAkBf,EAASwB,iBAAiB,SAAUX,EAAO,IAE/D,MAAMa,EAAYL,GAAeH,EAlHnC,SAAqBla,EAAS2a,GAC5B,IACIC,EADAC,EAAK,KAET,MAAMta,GAAO,QAAmBP,GAChC,SAAS8a,IACP,IAAIC,EACJC,aAAaJ,GACC,OAAbG,EAAMF,IAAeE,EAAIE,aAC1BJ,EAAK,IACP,CA2EA,OA1EA,SAASK,EAAQC,EAAMC,QACR,IAATD,IACFA,GAAO,QAES,IAAdC,IACFA,EAAY,GAEdN,IACA,MAAMO,EAA2Brb,EAAQ6Q,yBACnC,KACJrG,EAAI,IACJF,EAAG,MACHvI,EAAK,OACLC,GACEqZ,EAIJ,GAHKF,GACHR,KAEG5Y,IAAUC,EACb,OAEF,MAKMkH,EAAU,CACdoS,aANe,QAAMhR,GAIQ,QAHZ,QAAM/J,EAAKqW,aAAepM,EAAOzI,IAGC,QAFjC,QAAMxB,EAAKsW,cAAgBvM,EAAMtI,IAEuB,QAD1D,QAAMwI,GACyE,KAG/F4Q,WAAW,QAAI,GAAG,QAAI,EAAGA,KAAe,GAE1C,IAAIG,GAAgB,EACpB,SAASC,EAAcC,GACrB,MAAMC,EAAQD,EAAQ,GAAGE,kBACzB,GAAID,IAAUN,EAAW,CACvB,IAAKG,EACH,OAAOL,IAEJQ,EAOHR,GAAQ,EAAOQ,GAJfd,EAAYgB,YAAW,KACrBV,GAAQ,EAAO,KAAK,GACnB,IAIP,CACc,IAAVQ,GAAgB/B,EAAc0B,EAA0Brb,EAAQ6Q,0BAQlEqK,IAEFK,GAAgB,CAClB,CAIA,IACEV,EAAK,IAAIV,qBAAqBqB,EAAe,IACxCtS,EAEH3I,KAAMA,EAAK0W,eAEf,CAAE,MAAOxS,GACPoW,EAAK,IAAIV,qBAAqBqB,EAAetS,EAC/C,CACA2R,EAAGgB,QAAQ7b,EACb,CACAkb,EAAQ,GACDJ,CACT,CA6BiDgB,CAAYzB,EAAaR,GAAU,KAClF,IAsBIkC,EAtBAC,GAAkB,EAClBC,EAAiB,KACjBjC,IACFiC,EAAiB,IAAIhC,gBAAexT,IAClC,IAAKyV,GAAczV,EACfyV,GAAcA,EAAW7a,SAAWgZ,GAAe4B,IAGrDA,EAAeE,UAAUtV,GACzBuV,qBAAqBJ,GACrBA,EAAiBK,uBAAsB,KACrC,IAAIC,EACkC,OAArCA,EAAkBL,IAA2BK,EAAgBT,QAAQhV,EAAS,KAGnFgT,GAAQ,IAENQ,IAAgBD,GAClB6B,EAAeJ,QAAQxB,GAEzB4B,EAAeJ,QAAQhV,IAGzB,IAAI0V,EAAcnC,EAAiBvJ,EAAsBjK,GAAa,KAatE,OAZIwT,GAGJ,SAASoC,IACP,MAAMC,EAAc5L,EAAsBjK,GACtC2V,IAAgB5C,EAAc4C,EAAaE,IAC7C5C,IAEF0C,EAAcE,EACdV,EAAUM,sBAAsBG,EAClC,CATEA,GAUF3C,IACO,KACL,IAAI6C,EACJpC,EAAUC,SAAQvB,IAChBc,GAAkBd,EAAS2D,oBAAoB,SAAU9C,GACzDE,GAAkBf,EAAS2D,oBAAoB,SAAU9C,EAAO,IAErD,MAAba,GAAqBA,IACkB,OAAtCgC,EAAmBT,IAA2BS,EAAiBzB,aAChEgB,EAAiB,KACb7B,GACFgC,qBAAqBL,EACvB,CAEJ,CAUA,MASMxZ,EAAS,KAeTqP,EAAQ,KAQR7D,EAAO,KAsBPrD,EAAQ,KAkBRjD,EAAkB,CAACb,EAAWC,EAAUqC,KAI5C,MAAMoP,EAAQ,IAAIsE,IACZC,EAAgB,CACpB/U,cACGoB,GAEC4T,EAAoB,IACrBD,EAAc/U,SACjBqR,GAAIb,GAEN,OAAO,QAAkB1R,EAAWC,EAAU,IACzCgW,EACH/U,SAAUgV,GACV,C,+BC5uBJ,SAASC,IACP,MAAyB,oBAAXlX,MAChB,CACA,SAASmX,EAAYC,GACnB,OAAIC,EAAOD,IACDA,EAAKE,UAAY,IAAIC,cAKxB,WACT,CACA,SAASC,EAAUJ,GACjB,IAAIK,EACJ,OAAgB,MAARL,GAA8D,OAA7CK,EAAsBL,EAAKhG,oBAAyB,EAASqG,EAAoBC,cAAgB1X,MAC5H,CACA,SAASiE,EAAmBmT,GAC1B,IAAIxW,EACJ,OAA0F,OAAlFA,GAAQyW,EAAOD,GAAQA,EAAKhG,cAAgBgG,EAAKO,WAAa3X,OAAO2X,eAAoB,EAAS/W,EAAK2P,eACjH,CACA,SAAS8G,EAAO7W,GACd,QAAK0W,MAGE1W,aAAiBoX,MAAQpX,aAAiBgX,EAAUhX,GAAOoX,KACpE,CACA,SAAS7T,EAAUvD,GACjB,QAAK0W,MAGE1W,aAAiBqX,SAAWrX,aAAiBgX,EAAUhX,GAAOqX,QACvE,CACA,SAASC,EAActX,GACrB,QAAK0W,MAGE1W,aAAiBuX,aAAevX,aAAiBgX,EAAUhX,GAAOuX,YAC3E,CACA,SAASC,EAAaxX,GACpB,SAAK0W,KAAqC,oBAAfe,cAGpBzX,aAAiByX,YAAczX,aAAiBgX,EAAUhX,GAAOyX,WAC1E,CACA,SAASC,EAAkB/d,GACzB,MAAM,SACJ4M,EAAQ,UACRoR,EAAS,UACTC,EAAS,QACTC,GACEC,EAAiBne,GACrB,MAAO,kCAAkCoe,KAAKxR,EAAWqR,EAAYD,KAAe,CAAC,SAAU,YAAY5X,SAAS8X,EACtH,CACA,SAASG,EAAere,GACtB,MAAO,CAAC,QAAS,KAAM,MAAMoG,SAAS4W,EAAYhd,GACpD,CACA,SAASse,EAAWte,GAClB,MAAO,CAAC,gBAAiB,UAAUwP,MAAK+O,IACtC,IACE,OAAOve,EAAQwe,QAAQD,EACzB,CAAE,MAAO9Z,GACP,OAAO,CACT,IAEJ,CACA,SAASga,EAAkBC,GACzB,MAAMC,EAASC,IACT9K,EAAMlK,EAAU8U,GAAgBP,EAAiBO,GAAgBA,EAIvE,MAAO,CAAC,YAAa,YAAa,QAAS,SAAU,eAAelP,MAAKnJ,KAASyN,EAAIzN,IAAwB,SAAfyN,EAAIzN,QAA+ByN,EAAI+K,eAAsC,WAAtB/K,EAAI+K,gBAAwCF,KAAW7K,EAAIgL,gBAAwC,SAAvBhL,EAAIgL,iBAAuCH,KAAW7K,EAAI9L,QAAwB,SAAf8L,EAAI9L,QAA8B,CAAC,YAAa,YAAa,QAAS,SAAU,cAAe,UAAUwH,MAAKnJ,IAAUyN,EAAIiL,YAAc,IAAI3Y,SAASC,MAAW,CAAC,QAAS,SAAU,SAAU,WAAWmJ,MAAKnJ,IAAUyN,EAAIkL,SAAW,IAAI5Y,SAASC,IAC7hB,CACA,SAAS4Y,EAAmBjf,GAC1B,IAAI6Y,EAAcqG,EAAclf,GAChC,KAAO2d,EAAc9E,KAAiBsG,EAAsBtG,IAAc,CACxE,GAAI4F,EAAkB5F,GACpB,OAAOA,EACF,GAAIyF,EAAWzF,GACpB,OAAO,KAETA,EAAcqG,EAAcrG,EAC9B,CACA,OAAO,IACT,CACA,SAAS+F,IACP,QAAmB,oBAARQ,MAAwBA,IAAIC,WAChCD,IAAIC,SAAS,0BAA2B,OACjD,CACA,SAASF,EAAsBlC,GAC7B,MAAO,CAAC,OAAQ,OAAQ,aAAa7W,SAAS4W,EAAYC,GAC5D,CACA,SAASkB,EAAiBne,GACxB,OAAOqd,EAAUrd,GAASme,iBAAiBne,EAC7C,CACA,SAASsf,EAActf,GACrB,OAAI4J,EAAU5J,GACL,CACLkW,WAAYlW,EAAQkW,WACpBM,UAAWxW,EAAQwW,WAGhB,CACLN,WAAYlW,EAAQuf,QACpB/I,UAAWxW,EAAQwf,QAEvB,CACA,SAASN,EAAcjC,GACrB,GAA0B,SAAtBD,EAAYC,GACd,OAAOA,EAET,MAAMxE,EAENwE,EAAKwC,cAELxC,EAAKxF,YAELoG,EAAaZ,IAASA,EAAKyC,MAE3B5V,EAAmBmT,GACnB,OAAOY,EAAapF,GAAUA,EAAOiH,KAAOjH,CAC9C,CACA,SAASkH,EAA2B1C,GAClC,MAAMxF,EAAayH,EAAcjC,GACjC,OAAIkC,EAAsB1H,GACjBwF,EAAKhG,cAAgBgG,EAAKhG,cAAcD,KAAOiG,EAAKjG,KAEzD2G,EAAclG,IAAesG,EAAkBtG,GAC1CA,EAEFkI,EAA2BlI,EACpC,CACA,SAASmI,EAAqB3C,EAAMtd,EAAMkgB,GACxC,IAAIC,OACS,IAATngB,IACFA,EAAO,SAEe,IAApBkgB,IACFA,GAAkB,GAEpB,MAAME,EAAqBJ,EAA2B1C,GAChD+C,EAASD,KAAuE,OAA9CD,EAAuB7C,EAAKhG,oBAAyB,EAAS6I,EAAqB9I,MACrHrC,EAAM0I,EAAU0C,GACtB,GAAIC,EAAQ,CACV,MAAMC,EAAeC,EAAgBvL,GACrC,OAAOhV,EAAKyZ,OAAOzE,EAAKA,EAAIC,gBAAkB,GAAImJ,EAAkBgC,GAAsBA,EAAqB,GAAIE,GAAgBJ,EAAkBD,EAAqBK,GAAgB,GAC5L,CACA,OAAOtgB,EAAKyZ,OAAO2G,EAAoBH,EAAqBG,EAAoB,GAAIF,GACtF,CACA,SAASK,EAAgBvL,GACvB,OAAOA,EAAIwL,QAAUjf,OAAOkf,eAAezL,EAAIwL,QAAUxL,EAAIsL,aAAe,IAC9E,C,+YClJA,MAAMjR,EAAQ,CAAC,MAAO,QAAS,SAAU,QACnCqR,EAAa,CAAC,QAAS,OACvBvR,EAA0BE,EAAMzB,QAAO,CAACC,EAAKvG,IAASuG,EAAI4L,OAAOnS,EAAMA,EAAO,IAAMoZ,EAAW,GAAIpZ,EAAO,IAAMoZ,EAAW,KAAK,IAChIpO,EAAM9R,KAAK8R,IACXtG,EAAMxL,KAAKwL,IACX2U,EAAQngB,KAAKmgB,MACbC,EAAQpgB,KAAKogB,MACbC,EAAe/S,IAAK,CACxBrG,EAAGqG,EACHnG,EAAGmG,IAECgT,EAAkB,CACtBjW,KAAM,QACNC,MAAO,OACPF,OAAQ,MACRD,IAAK,UAEDoW,EAAuB,CAC3BC,MAAO,MACPC,IAAK,SAEP,SAASC,EAAMF,EAAOta,EAAOua,GAC3B,OAAOjV,EAAIgV,EAAO1O,EAAI5L,EAAOua,GAC/B,CACA,SAASE,EAASza,EAAO0a,GACvB,MAAwB,mBAAV1a,EAAuBA,EAAM0a,GAAS1a,CACtD,CACA,SAAS2a,EAAQta,GACf,OAAOA,EAAUua,MAAM,KAAK,EAC9B,CACA,SAASC,EAAaxa,GACpB,OAAOA,EAAUua,MAAM,KAAK,EAC9B,CACA,SAASE,EAAgBxW,GACvB,MAAgB,MAATA,EAAe,IAAM,GAC9B,CACA,SAASyW,EAAczW,GACrB,MAAgB,MAATA,EAAe,SAAW,OACnC,CACA,SAAS0W,EAAY3a,GACnB,MAAO,CAAC,MAAO,UAAUN,SAAS4a,EAAQta,IAAc,IAAM,GAChE,CACA,SAAS4a,EAAiB5a,GACxB,OAAOya,EAAgBE,EAAY3a,GACrC,CACA,SAAS6a,EAAkB7a,EAAWyB,EAAOxB,QAC/B,IAARA,IACFA,GAAM,GAER,MAAM0F,EAAY6U,EAAaxa,GACzBK,EAAgBua,EAAiB5a,GACjChH,EAAS0hB,EAAcra,GAC7B,IAAIya,EAAsC,MAAlBza,EAAwBsF,KAAe1F,EAAM,MAAQ,SAAW,QAAU,OAAuB,UAAd0F,EAAwB,SAAW,MAI9I,OAHIlE,EAAMvB,UAAUlH,GAAUyI,EAAMtB,SAASnH,KAC3C8hB,EAAoBC,EAAqBD,IAEpC,CAACA,EAAmBC,EAAqBD,GAClD,CACA,SAASE,EAAsBhb,GAC7B,MAAMib,EAAoBF,EAAqB/a,GAC/C,MAAO,CAACkb,EAA8Blb,GAAYib,EAAmBC,EAA8BD,GACrG,CACA,SAASC,EAA8Blb,GACrC,OAAOA,EAAUmb,QAAQ,cAAcxV,GAAaqU,EAAqBrU,IAC3E,CAkBA,SAASyV,EAA0Bpb,EAAW+H,EAAe2I,EAAWzQ,GACtE,MAAM0F,EAAY6U,EAAaxa,GAC/B,IAAI/G,EAnBN,SAAqBsH,EAAM8a,EAASpb,GAClC,MAAMqb,EAAK,CAAC,OAAQ,SACdC,EAAK,CAAC,QAAS,QACfC,EAAK,CAAC,MAAO,UACbC,EAAK,CAAC,SAAU,OACtB,OAAQlb,GACN,IAAK,MACL,IAAK,SACH,OAAIN,EAAYob,EAAUE,EAAKD,EACxBD,EAAUC,EAAKC,EACxB,IAAK,OACL,IAAK,QACH,OAAOF,EAAUG,EAAKC,EACxB,QACE,MAAO,GAEb,CAGaC,CAAYpB,EAAQta,GAA0B,UAAd0Q,EAAuBzQ,GAOlE,OANI0F,IACF1M,EAAOA,EAAK2N,KAAIrG,GAAQA,EAAO,IAAMoF,IACjCoC,IACF9O,EAAOA,EAAKyZ,OAAOzZ,EAAK2N,IAAIsU,MAGzBjiB,CACT,CACA,SAAS8hB,EAAqB/a,GAC5B,OAAOA,EAAUmb,QAAQ,0BAA0B5a,GAAQwZ,EAAgBxZ,IAC7E,CAUA,SAASob,EAAiB7Y,GACxB,MAA0B,iBAAZA,EAVhB,SAA6BA,GAC3B,MAAO,CACLc,IAAK,EACLG,MAAO,EACPF,OAAQ,EACRC,KAAM,KACHhB,EAEP,CAEuC8Y,CAAoB9Y,GAAW,CAClEc,IAAKd,EACLiB,MAAOjB,EACPe,OAAQf,EACRgB,KAAMhB,EAEV,CACA,SAAS+Y,EAAiBxY,GACxB,MAAM,EACJ3C,EAAC,EACDE,EAAC,MACDvF,EAAK,OACLC,GACE+H,EACJ,MAAO,CACLhI,QACAC,SACAsI,IAAKhD,EACLkD,KAAMpD,EACNqD,MAAOrD,EAAIrF,EACXwI,OAAQjD,EAAItF,EACZoF,IACAE,IAEJ,C,0DCxGO,IAAIkb,EAAW,WAQpB,OAPAA,EAAWthB,OAAOC,QAAU,SAAkBuD,GAC1C,IAAK,IAAI+d,EAAGnhB,EAAI,EAAG/B,EAAIgC,UAAU7B,OAAQ4B,EAAI/B,EAAG+B,IAE5C,IAAK,IAAIohB,KADTD,EAAIlhB,UAAUD,GACOJ,OAAOQ,UAAUlC,eAAemC,KAAK8gB,EAAGC,KAAIhe,EAAEge,GAAKD,EAAEC,IAE9E,OAAOhe,CACX,EACO8d,EAAS5gB,MAAMC,KAAMN,UAC9B,EAgH6BL,OAAOyhB,OA6D7B,SAASC,EAAcC,EAAIzS,EAAM0S,GACtC,GAAIA,GAA6B,IAArBvhB,UAAU7B,OAAc,IAAK,IAA4BqjB,EAAxBzhB,EAAI,EAAG0hB,EAAI5S,EAAK1Q,OAAY4B,EAAI0hB,EAAG1hB,KACxEyhB,GAAQzhB,KAAK8O,IACR2S,IAAIA,EAAKne,MAAMlD,UAAUpB,MAAMqB,KAAKyO,EAAM,EAAG9O,IAClDyhB,EAAGzhB,GAAK8O,EAAK9O,IAGrB,OAAOuhB,EAAGzJ,OAAO2J,GAAMne,MAAMlD,UAAUpB,MAAMqB,KAAKyO,GACpD,CAqCyBlP,OAAOyhB,OAyDkB,mBAApBM,iBAAiCA,e,GC1T3DC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB1W,IAAjB2W,EACH,OAAOA,EAAare,QAGrB,IAAID,EAASme,EAAyBE,GAAY,CAGjDpe,QAAS,CAAC,GAOX,OAHAse,EAAoBF,GAAUzhB,KAAKoD,EAAOC,QAASD,EAAQA,EAAOC,QAASme,GAGpEpe,EAAOC,OACf,CAGAme,EAAoBI,EAAID,ECzBxBH,EAAoBK,KAAO,CAAC,EnCAxBpkB,EAAW,GACf+jB,EAAoBM,EAAI,CAAChL,EAAQiL,EAAUjb,EAAIkb,KAC9C,IAAGD,EAAH,CAMA,IAAIE,EAAeC,IACnB,IAASviB,EAAI,EAAGA,EAAIlC,EAASM,OAAQ4B,IAAK,CAGzC,IAFA,IAAKoiB,EAAUjb,EAAIkb,GAAYvkB,EAASkC,GACpCwiB,GAAY,EACPC,EAAI,EAAGA,EAAIL,EAAShkB,OAAQqkB,MACpB,EAAXJ,GAAsBC,GAAgBD,IAAaziB,OAAOqE,KAAK4d,EAAoBM,GAAG3V,OAAOrM,GAAS0hB,EAAoBM,EAAEhiB,GAAKiiB,EAASK,MAC9IL,EAASM,OAAOD,IAAK,IAErBD,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACb1kB,EAAS4kB,OAAO1iB,IAAK,GACrB,IAAIkD,EAAIiE,SACEiE,IAANlI,IAAiBiU,EAASjU,EAC/B,CACD,CACA,OAAOiU,CAnBP,CAJCkL,EAAWA,GAAY,EACvB,IAAI,IAAIriB,EAAIlC,EAASM,OAAQ4B,EAAI,GAAKlC,EAASkC,EAAI,GAAG,GAAKqiB,EAAUriB,IAAKlC,EAASkC,GAAKlC,EAASkC,EAAI,GACrGlC,EAASkC,GAAK,CAACoiB,EAAUjb,EAAIkb,EAqBjB,EoCzBdR,EAAoB5jB,EAAKwF,IACxB,IAAIkf,EAASlf,GAAUA,EAAOmf,WAC7B,IAAOnf,EAAiB,QACxB,IAAM,EAEP,OADAoe,EAAoB1gB,EAAEwhB,EAAQ,CAAEtW,EAAGsW,IAC5BA,CAAM,ECLdd,EAAoB1gB,EAAI,CAACuC,EAASmf,KACjC,IAAI,IAAI1iB,KAAO0iB,EACXhB,EAAoBiB,EAAED,EAAY1iB,KAAS0hB,EAAoBiB,EAAEpf,EAASvD,IAC5EP,OAAOmjB,eAAerf,EAASvD,EAAK,CAAE6iB,YAAY,EAAM9L,IAAK2L,EAAW1iB,IAE1E,ECND0hB,EAAoBoB,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAO3iB,MAAQ,IAAI4iB,SAAS,cAAb,EAChB,CAAE,MAAOhgB,GACR,GAAsB,iBAAXoB,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBsd,EAAoBiB,EAAI,CAAC/kB,EAAKqlB,IAAUxjB,OAAOQ,UAAUlC,eAAemC,KAAKtC,EAAKqlB,GCClFvB,EAAoB3e,EAAKQ,IACH,oBAAX2f,QAA0BA,OAAOC,aAC1C1jB,OAAOmjB,eAAerf,EAAS2f,OAAOC,YAAa,CAAEve,MAAO,WAE7DnF,OAAOmjB,eAAerf,EAAS,aAAc,CAAEqB,OAAO,GAAO,E,MCA9D,IAAIwe,EAAkB,CACrB,GAAI,GAaL1B,EAAoBM,EAAEM,EAAKe,GAA0C,IAA7BD,EAAgBC,GAGxD,IAAIC,EAAuB,CAACC,EAA4Bpc,KACvD,IAGIwa,EAAU0B,GAHTpB,EAAUuB,EAAaC,GAAWtc,EAGhBtH,EAAI,EAC3B,GAAGoiB,EAASlU,MAAMvN,GAAgC,IAAxB4iB,EAAgB5iB,KAAa,CACtD,IAAImhB,KAAY6B,EACZ9B,EAAoBiB,EAAEa,EAAa7B,KACrCD,EAAoBI,EAAEH,GAAY6B,EAAY7B,IAGhD,GAAG8B,EAAS,IAAIzM,EAASyM,EAAQ/B,EAClC,CAEA,IADG6B,GAA4BA,EAA2Bpc,GACrDtH,EAAIoiB,EAAShkB,OAAQ4B,IACzBwjB,EAAUpB,EAASpiB,GAChB6hB,EAAoBiB,EAAES,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAO3B,EAAoBM,EAAEhL,EAAO,EAGjC0M,EAAqB/gB,KAA8B,wBAAIA,KAA8B,yBAAK,GAC9F+gB,EAAmB5K,QAAQwK,EAAqB3jB,KAAK,KAAM,IAC3D+jB,EAAmBtW,KAAOkW,EAAqB3jB,KAAK,KAAM+jB,EAAmBtW,KAAKzN,KAAK+jB,G,KChDvFhC,EAAoBiC,QAAK1Y,ECGzB,IAAI2Y,EAAsBlC,EAAoBM,OAAE/W,EAAW,CAAC,IAAI,IAAOyW,EAAoB,SAC3FkC,EAAsBlC,EAAoBM,EAAE4B,G","sources":["webpack://pcloud-site/webpack/runtime/chunk loaded","webpack://pcloud-site/./src/lib/move.js","webpack://pcloud-site/./src/lib/componentMount.js","webpack://pcloud-site/./src/lib/utils.js","webpack://pcloud-site/./new_site/images/features-section/collaboration.svg","webpack://pcloud-site/./new_site/images/features-section/security.svg","webpack://pcloud-site/./new_site/images/features-section/access.svg","webpack://pcloud-site/./new_site/images/features-section/media.svg","webpack://pcloud-site/./new_site/images/features-section/file.svg","webpack://pcloud-site/./new_site/images/features-section/backup.svg","webpack://pcloud-site/./src/components/FeaturesSection.js","webpack://pcloud-site/./src/exports/featuressection.js","webpack://pcloud-site/./node_modules/clsx/dist/clsx.m.js","webpack://pcloud-site/./node_modules/shallowequal/index.js","webpack://pcloud-site/external window \"jQuery\"","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/assign.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/define-properties.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/define-property.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptor.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-descriptors.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/get-own-property-symbols.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/object/keys.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/parse-float.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/parse-int.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/symbol.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/symbol/iterator.js","webpack://pcloud-site/./node_modules/@babel/runtime-corejs2/core-js/symbol/to-primitive.js","webpack://pcloud-site/./node_modules/classnames/index.js","webpack://pcloud-site/./node_modules/@floating-ui/core/dist/floating-ui.core.mjs","webpack://pcloud-site/./node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","webpack://pcloud-site/./node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","webpack://pcloud-site/./node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","webpack://pcloud-site/./node_modules/tslib/tslib.es6.mjs","webpack://pcloud-site/webpack/bootstrap","webpack://pcloud-site/webpack/runtime/amd options","webpack://pcloud-site/webpack/runtime/compat get default export","webpack://pcloud-site/webpack/runtime/define property getters","webpack://pcloud-site/webpack/runtime/global","webpack://pcloud-site/webpack/runtime/hasOwnProperty shorthand","webpack://pcloud-site/webpack/runtime/make namespace object","webpack://pcloud-site/webpack/runtime/jsonp chunk loading","webpack://pcloud-site/webpack/runtime/nonce","webpack://pcloud-site/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","const _move = (obj, _attachList) => {\n for (var n in obj) {\n if (obj.hasOwnProperty(n)) {\n for (var k = 0; k < _attachList.length; ++k) {\n if (_attachList[k].list.indexOf(n) != -1) {\n _attachList[k].attach[n] = obj[n];\n }\n }\n }\n }\n}\n\nexport default _move;","// @flow\n\nimport * as React from \"react\";\nimport { createRoot } from 'react-dom/client';\n\nconst usedReactRoots = {};\n\nconst getExistingOrNewRoot = (element: HTMLElement) => {\n // Existing ID or create new unique ID.\n const reactRootId = element.dataset.reactRootId || Math.random().toString(16).slice(2);\n let root = usedReactRoots[reactRootId] || null;\n\n if (root === null) {\n // Save the generated new ID to the element to be reused if we change the props and call this again.\n element.dataset.reactRootId = reactRootId;\n root = createRoot(element);\n }\n\n // Cache the root.\n usedReactRoots[reactRootId] = root;\n\n return {reactRootId , root};\n}\n\nconst componentMount = (render: (props: {}) => React.Node) => (element: HTMLElement, props: {}) => {\n if (!element) {\n return null;\n }\n\n const {reactRootId, root} = getExistingOrNewRoot(element);\n root.render(render(props));\n\n return () => {\n root.unmount();\n delete usedReactRoots[reactRootId];\n };\n};\n\nexport function componentRender(element: HTMLElement, render: React.Element) {\n const {reactRootId, root} = getExistingOrNewRoot(element);\n root.render(render);\n\n return () => {\n root.unmount();\n delete usedReactRoots[reactRootId];\n };\n}\n\nexport default componentMount;\n","//@flow\n\nimport {\n DiscountType,\n Userinfo,\n PlanIDType,\n Subscription\n} from \"../lib/types/dataTypes.components\";\n\n// import {\n// ADD_STORAGE_1COUNT_PLAN_ID, \n// ADD_STORAGE_4COUNT_PLAN_ID,\n// MB_PER_STORAGE_COUNT\n// } from \"./plansInfo\";\n\nimport {\n rcookie,\n setcookie,\n hrefSearch\n} from \"@pcloud/web-utilities/dist/lib/utils\";\nimport { __ } from \"@pcloud/web-utilities/dist/lib/langManager\";\nimport { renderQuota } from \"@pcloud/web-utilities/dist/plans/utils.plans\";\n\nimport {\n PREMIUM_PLAN_ID,\n PREMIUM_PLUS_PLAN_ID,\n CUSTOM4TB_PLAN_ID,\n FAMILY2TB_PLAN_ID,\n FAMILY_CUSTOM_PLAN_ID,\n FAMILY_CUSTOM_2COUNT_PLAN_ID,\n FAMILY_CUSTOM_5COUNT_PLAN_ID,\n FAMILY_ADD_1COUNT_PLAN_ID,\n FAMILY_ADD_2COUNT_PLAN_ID,\n FAMILY_ADD_5COUNT_PLAN_ID,\n CUSTOM_PLAN_ID,\n ADD_STORAGE_1COUNT_PLAN_ID,\n ADD_STORAGE_4COUNT_PLAN_ID,\n ADD_STORAGE_8COUNT_PLAN_ID,\n ADD_STORAGE_12COUNT_PLAN_ID,\n ADD_STORAGE_20COUNT_PLAN_ID,\n CUSTOM_20COUNT_PLAN_ID,\n CRYPTO_PLAN_ID,\n EFH_PLAN_ID,\n ADDITIONAL_TRAFFIC_ID,\n MAX_CUSTOM_STORAGE_COUNT,\n MAX_FAMILY_STORAGE_COUNT,\n PASS_PREMIUM_PLAN_ID,\n PASS_FAMILY_PLAN_ID,\n} from \"@pcloud/web-utilities/dist/plans/constants.plans\";\n\nexport {\n rcookie,\n setcookie,\n hrefSearch,\n __,\n renderQuota\n};\n\nexport const removeHrefSearch = (params: Array, forceRefresh?: boolean) => {\n if (params && typeof params == 'string') {\n params = [params];\n }\n\n if (params && params.length && location.search.length) {\n var currentQueriesArr = location.search.substring(1).split('&');\n var currentQueriesMap = {};\n var finalQueriesArr = [];\n var finalURL;\n\n // Create object map with all current search queries\n for (var i in currentQueriesArr) {\n currentQueriesMap[currentQueriesArr[i].split('=').shift()] = currentQueriesArr[i].split('=').pop();\n }\n\n // Delete requested queries\n for (var i in params) {\n if (params[i].split('=').shift() in currentQueriesMap) {\n delete currentQueriesMap[params[i].split('=').shift()];\n }\n }\n\n if (Object.keys(currentQueriesMap).length) {\n for (var i in currentQueriesMap) {\n finalQueriesArr.push(i + '=' + currentQueriesMap[i]);\n }\n\n finalURL = location.origin + location.pathname + '?' + finalQueriesArr.join('&');\n } else {\n finalURL = location.origin + location.pathname;\n }\n\n if (forceRefresh) {\n location = finalURL;\n } else {\n window.history.pushState({}, null, finalURL);\n }\n }\n};\n\nexport const addHrefSearch = (params: Array | string, forceRefresh: boolean, newLocationUrl?: string) => {\n if (!params) {\n return;\n }\n\n let finalURL;\n\n if (typeof params == 'string') {\n params = [params];\n }\n\n if (location.search.length) {\n let oldQueriesArr = location.search.substring(1).split('&');\n let oldQueriesMap = {};\n let givenQueriesMap = {};\n let finalQueriesMap = {};\n let finalQueriesArr = [];\n\n // Create object map with all current search queries\n for (let i in oldQueriesArr) {\n oldQueriesMap[oldQueriesArr[i].split('=').shift()] = oldQueriesArr[i].split('=').pop();\n }\n\n for (let i in params) {\n givenQueriesMap[params[i].split('=').shift()] = params[i].split('=').pop();\n\n // Delete queries which will be duplicated in the end and remove them\n if (params[i].split('=').shift() in oldQueriesMap) {\n delete oldQueriesMap[params[i].split('=').shift()];\n }\n }\n\n finalQueriesMap = Object.assign(oldQueriesMap, givenQueriesMap);\n\n for (let i in finalQueriesMap) {\n finalQueriesArr.push(i + '=' + finalQueriesMap[i]);\n }\n\n finalURL = (newLocationUrl ? newLocationUrl : (location.origin + location.pathname)) + '?' + finalQueriesArr.join('&');\n\n } else {\n // Directly append newly provided params\n finalURL = (newLocationUrl ? newLocationUrl : location.href) + '?' + params.join('&');\n }\n\n if (forceRefresh) {\n location = finalURL;\n } else {\n if (!window.history.state || window.history.state.page != finalURL) {\n window.history.pushState({ \"page\": finalURL }, null, finalURL);\n }\n }\n};\n\nexport const saveToSessionstorage = (label: string, value: any) => {\n if (\n typeof Storage === \"undefined\" ||\n typeof sessionStorage === \"undefined\" ||\n sessionStorage === null\n ) {\n setcookie(label, value, 0);\n } else {\n sessionStorage.setItem(label, value);\n }\n};\n\nexport const signToCurrency = {\n \"$\": \"USD\",\n \"€\": \"EUR\",\n \"₤\": \"GBP\",\n \"BGN\": \"BGN\"\n};\n\nexport const currencyMap = {\n 'USD': '$',\n 'EUR': '€',\n 'GBP': '₤',\n // Used for Vivacom plans only\n 'BGN': 'BGN'\n};\n\nconst _repl = (str: string, repl: {} = {}) => {\n str = _properSpaces(str);\n\n if (!obLength(repl)) {\n return str;\n }\n\n for (var n in repl) {\n str = str.replace(new RegExp(\"%\" + n + \"%\", \"g\"), repl[n]);\n }\n\n return str;\n};\n\nconst _properSpaces = str => {\n return str.split(String.fromCharCode(160)).join(\" \");\n};\n\nexport const obLength = (obj: {}) => {\n var size = 0,\n key;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n size++;\n }\n }\n return size;\n};\n\ntype getDisabledPlanReasonParams = {\n user: Userinfo,\n forPlan: PlanIDType,\n forPeriod: \"trial\" | \"month\" | \"year\" | \"lifetime\",\n downgradeAllowed?: boolean,\n add500GBAllowed?: boolean,\n trafficCount?: number,\n maxCustomStorageCount?: number\n};\n\nexport const getDisabledPlanReason = ({\n user = {},\n forPlan,\n forPeriod,\n downgradeAllowed,\n add500GBAllowed,\n trafficCount,\n canAddStorage,\n maxCustomStorageCount = MAX_CUSTOM_STORAGE_COUNT,\n maxFamilyStorageCount = MAX_FAMILY_STORAGE_COUNT\n}: getDisabledPlanReasonParams) => {\n if (!user || !forPlan || !forPeriod) {\n return \"\";\n }\n\n const {\n business,\n lastsubscription,\n cryptolifetime,\n plan,\n premium,\n premiumlifetime,\n premiumexpires,\n cryptosubscription,\n efh,\n planparams,\n additionaltraffic,\n additionaltrafficlifetime,\n family,\n passmanagerdata,\n usepassmanagertrial: isfreetrialused\n } = user;\n\n const hasUserInfo = Object.keys(user).length > 0\n let islifetime;\n let isfreetrialactive;\n let passplan;\n let passpremiumexpire;\n let passFamily;\n\n if (passmanagerdata) {\n islifetime = passmanagerdata.islifetime\n isfreetrialactive = passmanagerdata.isfreetrialactive;\n passplan = passmanagerdata.plan;\n passpremiumexpire = passmanagerdata.premiumexpires;\n passFamily = passmanagerdata.family;\n }\n\n if (hasUserInfo) {\n // const {\n // islifetime,\n // istrial: isfreetrialactive,\n // plan: passplan,\n // planexpires: passpremiumexpire\n // } = passmanagerdata\n\n if (business) {\n return (\"business\");\n } else {\n let hasStorageSubscription = premium && !premiumlifetime;\n let hasCryptoSubscription = cryptosubscription;\n let hasSubscriptionPeriod = false;\n let isCanceled = lastsubscription && lastsubscription.status === \"canceled\";\n let incStorage = 0;\n if (!isCanceled && lastsubscription) {\n hasSubscriptionPeriod = lastsubscription.period;\n }\n\n const isCustomPlanId = forPlan === ADD_STORAGE_1COUNT_PLAN_ID || forPlan === ADD_STORAGE_4COUNT_PLAN_ID || forPlan === ADD_STORAGE_8COUNT_PLAN_ID || forPlan === ADD_STORAGE_12COUNT_PLAN_ID || forPlan === ADD_STORAGE_20COUNT_PLAN_ID || forPlan === CUSTOM_20COUNT_PLAN_ID;\n const isFamilyPlanId = forPlan === FAMILY_ADD_1COUNT_PLAN_ID || forPlan === FAMILY_ADD_2COUNT_PLAN_ID || forPlan === FAMILY_ADD_5COUNT_PLAN_ID || forPlan === FAMILY_CUSTOM_2COUNT_PLAN_ID || forPlan === FAMILY_CUSTOM_5COUNT_PLAN_ID;\n\n if (isCustomPlanId || isFamilyPlanId) {\n const parts = forPlan.split(\"_\");\n incStorage = Number(parts[1]);\n forPlan = Number(parts[0]);\n }\n\n if ((!lastsubscription || (hasSubscriptionPeriod && lastsubscription.products.indexOf(forPlan) === -1) && !downgradeAllowed) && forPeriod != \"lifetime\") {\n if (hasStorageSubscription && plan) {\n if (plan == forPlan && hasStorageSubscription == forPeriod) {\n return (\"current_plan\");\n } else if (plan > forPlan) {\n return (\"lower_plan\");\n }\n } else if (efh && forPlan === EFH_PLAN_ID) {\n return (\"current_plan\");\n } else if (additionaltraffic && forPlan == ADDITIONAL_TRAFFIC_ID) {\n if (!additionaltrafficlifetime && planparams.additionaltraffic == trafficCount) {\n return (\"current_plan\");\n } else if (planparams.additionaltraffic > trafficCount) {\n return (\"traffic_downgrade_restriction\");\n }\n }\n } else if (!lastsubscription && forPeriod === \"lifetime\" && hasStorageSubscription && plan && plan > forPlan) {\n return (\"lower_plan\");\n } else if (plan && hasStorageSubscription && hasSubscriptionPeriod && lastsubscription.products.indexOf(plan) === -1 && forPeriod != \"lifetime\" && !downgradeAllowed) {\n if (forPlan == plan) {\n return (\"current_plan\");\n } else if (plan > forPlan) {\n return (\"lower_plan\");\n }\n }\n\n // Buying Crypto\n if (forPlan == CRYPTO_PLAN_ID) {\n if (cryptolifetime) {\n return (\"crypto_lifetime\");\n } else if (hasSubscriptionPeriod && !hasCryptoSubscription) {\n if (hasCryptoSubscription == \"month\" && forPeriod == \"month\") {\n return (\"current_plan\");\n } else if (hasSubscriptionPeriod == \"year\" && forPeriod == \"month\") {\n return (\"lower_period\");\n }\n } else if (\n hasCryptoSubscription &&\n hasSubscriptionPeriod &&\n isCanceled == false\n ) {\n if (hasSubscriptionPeriod == \"month\" && forPeriod == \"month\") {\n return (\"current_plan\");\n } else if (hasSubscriptionPeriod == \"year\") {\n if (forPeriod == \"month\") {\n return (\"lower_period\");\n } else if (forPeriod == \"year\") {\n return (\"current_plan\");\n }\n }\n }\n } else if (forPlan == EFH_PLAN_ID) {\n if (efh) {\n if (hasSubscriptionPeriod == forPeriod) {\n return (\"current_plan\");\n } else if (hasSubscriptionPeriod == \"year\") {\n if (forPeriod == \"month\") {\n return (\"lower_period\");\n }\n }\n }\n // Buying Traffic\n } else if (forPlan == ADDITIONAL_TRAFFIC_ID) {\n if (plan === CUSTOM4TB_PLAN_ID) {\n return (\"custom_subscription\");\n } else if (forPeriod === \"lifetime\" && !premiumlifetime) {\n return \"traffic_lifetime_restriction\";\n } else if (plan == FAMILY2TB_PLAN_ID || plan == FAMILY_CUSTOM_PLAN_ID) {\n return \"custom_subscription\";\n } else if (forPeriod !== \"lifetime\" && additionaltrafficlifetime) {\n return \"traffic_lifetime_restriction_subs\";\n } else if (forPeriod === \"month\" && hasSubscriptionPeriod == \"year\" && (!downgradeAllowed || lastsubscription.billingprovider === 11)) {\n return (\"traffic_downgrade_restriction\");\n } else if (additionaltraffic && !additionaltrafficlifetime && (forPeriod === \"month\" || forPeriod === \"year\") && planparams.additionaltraffic == trafficCount && forPeriod === hasSubscriptionPeriod) {\n return (\"current_plan\");\n } else if (additionaltrafficlifetime && forPeriod === \"lifetime\" && planparams.additionaltraffic == trafficCount) {\n return (\"current_plan\");\n } else if (additionaltraffic && planparams.additionaltraffic > trafficCount && ((forPeriod === hasSubscriptionPeriod && !downgradeAllowed) || (forPeriod === \"lifetime\" && additionaltrafficlifetime))) {\n return (\"traffic_lifetime_restriction_subs\");\n }\n // Buying Pass\n } else if (forPlan == PASS_PREMIUM_PLAN_ID) {\n if ((isfreetrialactive && forPeriod === \"trial\") || (islifetime && forPeriod === \"lifetime\" && passplan === 1)) {\n return (\"current_plan\");\n } else if (passmanagerdata && forPeriod === \"free\") {\n return (\"current_active_plan\");\n } else if (isfreetrialused && forPeriod === 'trial') {\n return \"plan_upgrade_restrictions\";\n } else if ((islifetime && forPeriod != \"lifetime\") || passplan === 2) {\n return (\"custom_subscription\");\n // } else if (!emailverified) {\n // return (\"verify_email\")\n } else if (lastsubscription && !isCanceled) {\n if (lastsubscription.planid) {\n let activePlanId = lastsubscription.planid;\n let activePlanPeriod = lastsubscription.period;\n if (activePlanId === forPlan) {\n if (activePlanPeriod === forPeriod) {\n return \"current_plan\";\n } else if (activePlanPeriod === 'month' && (forPeriod === 'trial' || forPeriod === 'free')) {\n return \"plan_upgrade_restrictions\";\n } else if (activePlanPeriod === 'year' && (forPeriod === 'trial' || forPeriod === 'free' || forPeriod === 'month')) {\n return \"plan_upgrade_restrictions\";\n }\n }\n\n } else if (lastsubscription.products) {\n let products = lastsubscription.products;\n let activePlanPeriod = lastsubscription.period;\n if (products.indexOf(PASS_PREMIUM_PLAN_ID) !== -1) {\n if (activePlanPeriod === forPeriod) {\n return \"current_plan\";\n } else if (activePlanPeriod === 'month' && (forPeriod === 'trial' || forPeriod === 'free')) {\n return \"plan_upgrade_restrictions\";\n } else if (activePlanPeriod === 'year' && (forPeriod === 'trial' || forPeriod === 'free' || forPeriod === 'month')) {\n return \"plan_upgrade_restrictions\";\n }\n }\n }\n } else if ((!lastsubscription || (lastsubscription && isCanceled)) && passplan == 1 && !isfreetrialactive) {\n if (islifetime || (!islifetime && forPeriod != \"lifetime\")) {\n return \"plan_upgrade_restrictions\";\n }\n }\n\n // Active Pass Lifetime plan = disable any other Pass Plans.\n if (!isfreetrialactive && (passplan === 1 || passplan === 2) && islifetime) {\n return \"plan_upgrade_restrictions\";\n }\n } else if (forPlan == PASS_FAMILY_PLAN_ID) {\n if (passplan === 2 && passFamily && !passFamily.owner) {\n return \"custom_subscription\";\n };\n\n if ((isfreetrialactive && forPeriod === \"trial\") || (islifetime && forPeriod === \"lifetime\" && passplan === 2)) {\n return \"current_plan\";\n }\n\n if (lastsubscription && !isCanceled) {\n let activePlanPeriod = lastsubscription.period;\n\n if (activePlanPeriod === 'year' && forPeriod === 'month') {\n return \"plan_upgrade_restrictions\";\n }\n\n if (lastsubscription.planid) {\n let activePlanId = lastsubscription.planid;\n\n if (activePlanId === forPlan && activePlanPeriod === forPeriod) {\n return \"current_plan\";\n }\n } else if (lastsubscription.products) {\n let products = lastsubscription.products;\n\n if (products.indexOf(forPlan) !== -1 && activePlanPeriod === forPeriod) {\n return \"current_plan\";\n }\n }\n }\n\n // Active Pass Lifetime plan = disable any other Pass Plans.\n if (!isfreetrialactive && (passplan === 1 || passplan === 2) && islifetime) {\n return \"plan_upgrade_restrictions\";\n }\n\n // Buying Storage\n } else {\n if (plan == PREMIUM_PLAN_ID || plan == PREMIUM_PLUS_PLAN_ID || plan == CUSTOM4TB_PLAN_ID) {\n if (premiumlifetime) {\n if (plan == CUSTOM4TB_PLAN_ID && typeof planparams != 'undefined' && planparams.storage > 1 && canAddStorage) {\n return (\"custom_plan_upgrade_exceeded\");\n } else if (forPlan == CUSTOM_PLAN_ID && canAddStorage) {\n if ((incStorage == maxCustomStorageCount && (plan == PREMIUM_PLAN_ID || plan == CUSTOM4TB_PLAN_ID)) || (incStorage > maxCustomStorageCount && plan == PREMIUM_PLAN_ID)) {\n return (\"plan_upgrade_restrictions\");\n } else if (incStorage == 1 && !add500GBAllowed) {\n return ((plan == PREMIUM_PLUS_PLAN_ID || plan == CUSTOM4TB_PLAN_ID) ? \"plan_upgrade_restrictions\" : \"custom_plan_upgrade_restrictions\");\n }\n } else if (forPlan <= plan || forPlan == FAMILY2TB_PLAN_ID || forPlan == FAMILY_CUSTOM_PLAN_ID || (forPlan == CUSTOM_PLAN_ID && !canAddStorage)) {\n return (\"storage_lifetime\");\n }\n } else if (hasSubscriptionPeriod && isCanceled == false) {\n if (forPeriod == \"lifetime\") {\n if (forPlan < plan) {\n return (\"lower_plan\");\n }\n } else if (hasSubscriptionPeriod == \"month\") {\n if (forPeriod == \"month\") {\n if (forPlan < plan && !downgradeAllowed) {\n return (\"lower_plan\");\n } else if (forPlan == plan) {\n return (\"current_plan\");\n }\n } else if (\n (forPeriod == \"year\" && forPlan < plan) ||\n (forPlan < plan && premiumexpires)\n ) {\n return (\"lower_plan\");\n }\n } else if (hasSubscriptionPeriod == \"year\") {\n if (forPeriod == \"month\" && !downgradeAllowed) {\n return (\"lower_period\");\n } else {\n if (forPlan < plan && !downgradeAllowed) {\n return (\"lower_plan\");\n } else if (forPlan == plan) {\n if (!downgradeAllowed || hasSubscriptionPeriod == forPeriod) {\n return (\"current_plan\");\n }\n }\n }\n }\n } else if (isCanceled == false) {\n if (forPlan < plan) {\n return (\"lower_plan\");\n } else if (forPlan <= plan && premiumexpires) {\n let now = new Date();\n let expires = new Date(premiumexpires);\n //Get 1 day in milliseconds\n let oneDay = 1000 * 60 * 60 * 24;\n let daysLeft = Number(expires) - Number(now) / oneDay;\n\n let monthlyTabisActive = forPeriod === \"month\";\n let annualTabisActive = forPeriod === \"year\";\n\n if (daysLeft > 10 && (annualTabisActive || monthlyTabisActive)) {\n return (\"lower_period\");\n }\n }\n }\n } else if (plan == CUSTOM_PLAN_ID) {\n if (typeof planparams != 'undefined' && planparams.storage >= maxCustomStorageCount && forPlan == CUSTOM_PLAN_ID && canAddStorage) {\n return (\"custom_plan_upgrade_exceeded\");\n } else if (typeof planparams != 'undefined' && ((planparams.storage + incStorage) > maxCustomStorageCount) && forPlan == CUSTOM_PLAN_ID && canAddStorage) {\n return (\"plan_upgrade_restrictions\");\n } else if (forPlan == CUSTOM_PLAN_ID && incStorage == 1 && !add500GBAllowed) {\n if (typeof planparams != 'undefined' && planparams.storage <= 3) {\n return (\"custom_plan_upgrade_restrictions\");\n } else {\n return (\"plan_upgrade_restrictions\");\n }\n } else if (forPlan < plan || (!canAddStorage && forPlan == CUSTOM_PLAN_ID)) {\n return (\"storage_lifetime\");\n } else if (forPeriod === \"year\" || forPeriod === \"month\") {\n return (\"storage_lifetime\");\n }\n } else if ((plan == FAMILY2TB_PLAN_ID || plan == FAMILY_CUSTOM_PLAN_ID) && forPlan !== FAMILY_CUSTOM_PLAN_ID) {\n return (\"family\");\n } else if (forPlan == FAMILY_CUSTOM_PLAN_ID || forPlan == FAMILY2TB_PLAN_ID) {\n if ((plan == FAMILY_CUSTOM_PLAN_ID || plan == FAMILY2TB_PLAN_ID) && family && !family.owner) {\n return \"family\";\n } else if (plan == FAMILY_CUSTOM_PLAN_ID && typeof planparams != 'undefined') {\n if (planparams.storage >= maxFamilyStorageCount && canAddStorage) {\n return (\"custom_plan_upgrade_exceeded\");\n } else if (((planparams.storage + incStorage) > maxFamilyStorageCount) && canAddStorage) {\n return (\"plan_upgrade_restrictions\");\n }\n }\n } else {\n if (forPlan == CUSTOM_PLAN_ID && incStorage > maxCustomStorageCount) {\n return (\"plan_upgrade_restrictions\");\n }\n }\n }\n }\n }\n};\n\nexport const preventEnteringNumbers = (event) => {\n const key = event.which || event.keyCode || event.charCode;\n const pressedCharacter = String.fromCharCode(key);\n\n if (!(/[a-zA-Z '-]/).test(pressedCharacter)) {\n event.preventDefault();\n }\n}\n\ntype creditCardValidation = {\n name: string,\n range: string,\n valid_length: Array\n}\n\nexport const findCardType = (cardNumber: string): creditCardValidation => {\n const creditCardValidations = [\n {\n name: \"amex\",\n range: \"34, 37\",\n valid_length: [\"15\"]\n },\n {\n name: \"diners\",\n range: \"301, 302, 303, 304, 305, 36\",\n valid_length: [\"16\"]\n },\n {\n name: \"jcb\",\n range: \"352, 353, 354, 355, 356, 357, 358\",\n valid_length: [\"16\"]\n },\n {\n name: \"visa\",\n range: \"4\",\n valid_length: [\"19\", \"18\", \"17\", \"16\", \"15\", \"14\", \"13\"]\n },\n {\n name: \"mastercard\",\n range: \"50, 51, 52, 53, 54, 55, 222\",\n valid_length: [\"16\"]\n },\n {\n name: \"discover\",\n range: \"6011, 622, 644, 645, 646, 647, 648, 649\",\n valid_length: [\"16\"]\n }\n ];\n\n return creditCardValidations.find((cardTemplate: creditCardValidation): (creditCardValidation | false) => {\n let isThereAMatch = cardTemplate.range.split(\", \").some((range: string) => {\n const rangeLength = range.length;\n return range === cardNumber.slice(0, rangeLength);\n });\n return isThereAMatch;\n });\n}\n\nexport const getExpiryDatePeriod = (expiryDate: string, period: string): string => {\n const periods = {\n month: Number(expiryDate.split(\"/\")[0]),\n year: Number(expiryDate.split(\"/\")[1])\n }\n\n if (periods.year > 2000 && periods.year < 2100) {\n periods.year -= 2000;\n }\n\n return periods[period];\n}\n\nexport const validateExpiryDate = (expiryDate: string): boolean => {\n const month = getExpiryDatePeriod(expiryDate, \"month\");\n const year = getExpiryDatePeriod(expiryDate, \"year\");\n const currentYear = new Date().getFullYear() - 2000;\n const currentMonth = new Date().getMonth() + 1;\n\n const validateExpression =\n month <= 12 &&\n ((month > 0 && year > currentYear) || (month >= currentMonth && year == currentYear)) &&\n year <= 40;\n\n return validateExpression;\n};\n\n\nexport const getDeviceID = () => {\n if (!window.localStorage.getItem(\"deviceid\") && !rcookie(\"deviceid\")) {\n return rcookie(\"deviceid\");\n } else if (rcookie(\"deviceid\")) {\n if (window.localStorage.getItem(\"deviceid\")) {\n window.localStorage.removeItem(\"deviceid\");\n }\n return rcookie(\"deviceid\");\n } else if (window.localStorage.getItem(\"deviceid\")) {\n setcookie(\"deviceid\", window.localStorage.getItem(\"deviceid\"), 365);\n window.localStorage.removeItem(\"deviceid\");\n return rcookie(\"deviceid\");\n }\n};\n\nexport const getCurrency = ({ auth, callback = () => { } }: { auth: string, callback: () => void }) => {\n const params = {};\n let getCurrencyTries = 0;\n\n if (getCurrencyTries >= 5) {\n onSuccess(\"$\");\n return;\n }\n\n if (auth) {\n params[\"auth\"] = $.cookie(\"pcauth\");\n }\n\n if (rcookie(\"forcecurrency\")) {\n params[\"currency\"] = $.cookie(\"forcecurrency\");\n }\n\n if (rcookie(\"forcecountry\")) {\n params[\"country\"] = $.cookie(\"forcecountry\");\n }\n\n const onSuccess = (currency) => {\n if (typeof Storage !== \"undefined\" && currencyMap[currency]) {\n sessionStorage.setItem(\"pclCurrency\", currencyMap[currency]);\n }\n\n callback(currency);\n };\n\n const getCurrencyApiCall = () => {\n getCurrencyTries++;\n const onError = () => {\n setTimeout(() => {\n getCurrencyApiCall();\n }, 300);\n };\n\n pCloudGlobals.apiMethod && pCloudGlobals.apiMethod(\n \"getcurrency\",\n params,\n (data) => {\n if (data.currency) {\n onSuccess(data.currency);\n } else {\n onError();\n }\n },\n {\n errorCallback: onError\n }\n );\n };\n\n getCurrencyApiCall();\n};\n\nexport const areArraysEqual = (array1: Array, array2: Array): boolean => {\n if (!array1 || !array2) {\n return false;\n }\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n for (let index1 = 0; index1 < array1.length; index1++) {\n const e1 = array1[index1];\n const e2 = array2[index1];\n\n if (Array.isArray(e1) && Array.isArray(e2)) {\n compareArrays(e1, e2);\n } else if (e1 !== e2) {\n return false;\n }\n }\n\n return true;\n}\n\nexport const formatMS = (milliseconds: number, type: \"day\" | \"hour\" | \"minute\" | \"second\"): number => {\n const typeMap = {\n \"day\": { \"divider\": 86400000, \"modulo\": milliseconds + 1 },\n \"hour\": { \"divider\": 3600000, \"modulo\": 24 },\n \"minute\": { \"divider\": 60000, \"modulo\": 60 },\n \"second\": { \"divider\": 1000, \"modulo\": 60 }\n };\n\n if (!(type in typeMap)) {\n console.error(\"Invalid duration type: \" + type);\n\n return 0;\n }\n\n return parseInt((milliseconds / typeMap[type].divider) % typeMap[type].modulo);\n};\n\nexport const msToTime = (duration: number, showHours = true): string => {\n let seconds = parseInt((duration / 1000) % 60);\n let minutes = parseInt((duration / 60000) % 60);\n let hours = parseInt((duration / 3600000) % 24);\n\n hours = hours < 10 ? '0' + hours : hours;\n minutes = minutes < 10 ? '0' + minutes : minutes;\n seconds = seconds < 10 ? '0' + seconds : seconds;\n\n return (showHours ? hours + ':' : '') + minutes + ':' + seconds;\n};\n\nexport const cleanFloat = (number: number): number => {\n let value = Number(number);\n let decimal = value % 1 == 0 ? 0 : 2;\n let result = Number(value.toFixed(decimal));\n\n if (result % 1 == 0) {\n decimal = 0;\n }\n\n return Number(value.toFixed(decimal));\n};\n\nexport const browserVersion = (userAgent, regex) => {\n return userAgent.match(regex) ? userAgent.match(regex)[2] : null;\n}\n\nexport const detectBrowser = (version) => {\n const userAgent = navigator.userAgent;\n let browser = \"unkown\";\n // Detect browser name\n browser = (/ucbrowser/i).test(userAgent) ? 'UCBrowser' : browser;\n browser = (/edg/i).test(userAgent) ? 'Edge' : browser;\n browser = (/googlebot/i).test(userAgent) ? 'GoogleBot' : browser;\n browser = (/chromium/i).test(userAgent) ? 'Chromium' : browser;\n browser = (/firefox|fxios/i).test(userAgent) && !(/seamonkey/i).test(userAgent) ? 'Firefox' : browser;\n browser = (/; msie|trident/i).test(userAgent) && !(/ucbrowser/i).test(userAgent) ? 'IE' : browser;\n browser = (/chrome|crios/i).test(userAgent) && !(/opr|opera|chromium|edg|ucbrowser|googlebot/i).test(userAgent) ? 'Chrome' : browser;;\n browser = (/safari/i).test(userAgent) && !(/chromium|edg|ucbrowser|chrome|crios|opr|opera|fxios|firefox/i).test(userAgent) ? 'Safari' : browser;\n browser = (/opr|opera/i).test(userAgent) ? 'Opera' : browser;\n browser = navigator.brave ? \"Brave\" : browser;\n\n if (version) {\n switch (browser) {\n case 'UCBrowser': return `${browser}/${browserVersion(userAgent, /(ucbrowser)\\/([\\d\\.]+)/i)}`;\n case 'Edge': return `${browser}/${browserVersion(userAgent, /(edge|edga|edgios|edg)\\/([\\d\\.]+)/i)}`;\n case 'GoogleBot': return `${browser}/${browserVersion(userAgent, /(googlebot)\\/([\\d\\.]+)/i)}`;\n case 'Chromium': return `${browser}/${browserVersion(userAgent, /(chromium)\\/([\\d\\.]+)/i)}`;\n case 'Firefox': return `${browser}/${browserVersion(userAgent, /(firefox|fxios)\\/([\\d\\.]+)/i)}`;\n case 'Chrome': return `${browser}/${browserVersion(userAgent, /(chrome|crios)\\/([\\d\\.]+)/i)}`;\n case 'Safari': return `${browser}/${browserVersion(userAgent, /(safari)\\/([\\d\\.]+)/i)}`;\n case 'Opera': return `${browser}/${browserVersion(userAgent, /(opera|opr)\\/([\\d\\.]+)/i)}`;\n case 'IE': const version = browserVersion(userAgent, /(trident)\\/([\\d\\.]+)/i);\n // IE version is mapped using trident version \n // IE/8.0 = Trident/4.0, IE/9.0 = Trident/5.0\n return version ? `${browser}/${parseFloat(version) + 4.0}` : `${browser}/7.0`;\n default: return `unknown/0.0.0.0`;\n }\n }\n\n return browser;\n}\n\nexport const isValidEmailAddress = (email: string): boolean => {\n const pattern = new RegExp(/^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\t\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/);\n return pattern.test(email);\n};\n\nexport const apiCall = (method, params, onSuccess, onError, opts) => {\n const dfd = jQuery.Deferred();\n opts = {\n errorCallback: (data) => {\n dfd.reject(data);\n if (typeof onError === 'function') {\n onError(data);\n }\n },\n ...opts\n }\n\n pCloudGlobals.apiMethod(\n method,\n params,\n (data) => {\n if (typeof onSuccess === 'function') {\n onSuccess(data);\n }\n dfd.resolve(data);\n },\n opts\n );\n\n return dfd.promise();\n};\n\nexport const apiCallPost = (method, params, onSuccess, onError, opts) => {\n const dfd = jQuery.Deferred();\n opts = {\n type: \"POST\",\n errorCallback: (data) => {\n dfd.reject(data);\n if (typeof onError === 'function') {\n onError(data);\n }\n },\n ...opts\n }\n\n pCloudGlobals.apiMethod(\n method,\n params,\n (data) => {\n dfd.resolve(data);\n if (typeof onSuccess === 'function') {\n onSuccess(data);\n }\n },\n opts\n );\n\n return dfd.promise();\n};\n\nexport const detectIsMobile = () => {\n return /Mobile|mini|Fennec|Android|iP(od|hone)/.test(navigator.appVersion);\n};\n\nexport const onMouseOut = (event, callback) => {\n const e = event ? event : window.event;\n // If this is an autocomplete element.\n if (e.target && e.target.tagName && e.target.tagName.toLowerCase() == \"input\") {\n return;\n }\n\n // Get the current viewport width.\n const vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n\n // If the current mouse X position is within 50px of the right edge of the viewport, return.\n if (e.clientX >= (vpWidth - 50)) {\n return;\n }\n\n // If the current mouse Y position is not within 50px of the top edge of the viewport, return.\n if (e.clientY >= 50) {\n return;\n }\n\n // Fixes mozila problem where event is getting triggered on rigth click. -83 seems to be a constant value for clientY in that case.\n if (e.clientY === -83) {\n return;\n }\n\n // Reliable, works on mouse exiting window and user switching active program\n const from = e.relatedTarget || e.toElement;\n\n // User is exiting window\n if (!from && callback) {\n callback();\n }\n}\n\nexport const isInternetExplorer = () => {\n return !!document.documentMode;\n}\n\nexport const scrollToTop = () => {\n window.scrollTo(0);\n};\n\nexport const bytesToSize = (bytes) => {\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n if (bytes == 0) return null;\n const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));\n if (i == 0) return bytes + ' ' + sizes[i];\n return (bytes / Math.pow(1024, i)).toFixed(0) + ' ' + sizes[i];\n};\n\nexport const setTitleByCodeUrl = (codeUrl, setTitle, setRegisterTitle, setLoginTitle) => {\n if (codeUrl) {\n if (codeUrl == 'DROPBOX2PCLOUD') {\n setTitle('Special for Dropbox users - press submit and enjoy 3 months of Premium 500 GB for Free');\n } else if (codeUrl == 'HUBIC2PCLOUD') {\n setTitle('Special for hubiC users - press submit and enjoy 3 months of Premium 500 GB for Free');\n } else if (codeUrl == 'APPO') {\n setTitle('Special for\"APPO\" members - register now and enjoy 3 months of Premium 500 GB for Free');\n } else if (codeUrl == 'BIRTHDAY4U') {\n setTitle(__(\"PromoPage_birthday_text\"));\n } else if (codeUrl == 'PCLOUDMUSIC') {\n setTitle(__(\"pCloud_Music_coupon_submit\").replace(\"%url_promo%\", codeUrl));\n setRegisterTitle(__(\"pCloud_Music_coupon_register\").replace(\"%url_promo%\", codeUrl));\n setLoginTitle(__(\"pCloud_Music_coupon_login\").replace(\"%url_promo%\", codeUrl));\n } else if (codeUrl == 'BDAY3MONTHS') {\n setTitle(__(\"pm_coupon_submit\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 3));\n setRegisterTitle(__(\"pm_coupon_register\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 3));\n setLoginTitle(__(\"pm_coupon_login\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 3));\n } else if (codeUrl == 'PM6MONTHS' || codeUrl == \"INT6MONTHS\"|| codeUrl == \"LFS6MONTHS\") {\n setTitle(__(\"pm_coupon_submit\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 6));\n setRegisterTitle(__(\"pm_coupon_register\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 6));\n setLoginTitle(__(\"pm_coupon_login\").replace(\"%url_promo%\", codeUrl).replace(\"%months%\", 6));\n } else {\n setTitle(__(\"promo_submit_with_url\").replace(\"%url_promo%\", codeUrl));\n setRegisterTitle(__(\"Register for Free and enter your promo code. It will become effective immediately!\"));\n setLoginTitle(__(\"Enter your promo code upon Login and it will become effective immediately.\"));\n }\n }\n else {\n setTitle(__('Have a promo code? Enter it below.'));\n setRegisterTitle(__(\"Register for Free and enter your promo code. It will become effective immediately!\"));\n setLoginTitle(__(\"Enter your promo code upon Login and it will become effective immediately.\"));\n }\n};\n\nexport const getMonthsFromCode = (code) => {\n if (!code) {\n return \"\"\n };\n\n const indexPosition = code.indexOf(\"MONTHS\");\n let monthsCountIndex;\n\n if (indexPosition === -1) {\n return \"\";\n }\n\n if (indexPosition > 0) {\n monthsCountIndex = indexPosition - 1;\n } else {\n monthsCountIndex = indexPosition + 7;\n }\n\n if (!isNaN(code[monthsCountIndex])) {\n return code[monthsCountIndex]\n }\n\n return \"\";\n};\n\nexport const getLanguage = () => {\n return currentLang || $.cookie('set_lang') || $.cookie('lang') || 'en'\n}\n\nexport const countriesInEuropeList = {\n \"AT\": \"Austria\",\n \"BE\": \"Belgium\",\n \"BG\": \"Bulgaria\",\n \"HR\": \"Croatia\",\n \"CY\": \"Cyprus\",\n \"CZ\": \"Czech Republic\",\n \"DK\": \"Denmark\",\n \"EE\": \"Estonia\",\n \"FI\": \"Finland\",\n \"FR\": \"France\",\n \"DE\": \"Germany\",\n \"GR\": \"Greece\",\n \"HU\": \"Hungary\",\n \"IE\": \"Ireland\",\n \"IT\": \"Italy\",\n \"LV\": \"Latvia\",\n \"LT\": \"Lithuania\",\n \"LU\": \"Luxembourg\",\n \"MT\": \"Malta\",\n \"NL\": \"Netherlands\",\n \"PL\": \"Poland\",\n \"PT\": \"Portugal\",\n \"RO\": \"Romania\",\n \"SK\": \"Slovakia\",\n \"SI\": \"Slovenia\",\n \"ES\": \"Spain\",\n \"SE\": \"Sweden\",\n \"CH\": \"Switzerland\",\n \"GB\": \"United Kingdom\",\n \"AL\": \"Albania\",\n \"AD\": \"Andorra\",\n \"AM\": \"Armenia\",\n \"BY\": \"Belarus\",\n \"BA\": \"Bosnia and Herzegovina\",\n \"FO\": \"Faroe Islands\",\n \"GE\": \"Georgia\",\n \"GI\": \"Gibraltar\",\n \"IS\": \"Iceland\",\n \"IM\": \"Isle of Man\",\n \"XK\": \"Kosovo\",\n \"LI\": \"Liechtenstein\",\n \"MK\": \"Macedonia\",\n \"MD\": \"Moldova\",\n \"MC\": \"Monaco\",\n \"ME\": \"Montenegro\",\n \"NO\": \"Norway\",\n \"RU\": \"Russian Federation\",\n \"SM\": \"San Marino\",\n \"RS\": \"Serbia\",\n \"CH\": \"Switzerland\",\n \"TR\": \"Turkey\",\n \"UA\": \"Ukraine\",\n \"GB\": \"United Kingdom\",\n \"VA\": \"Vatican City State\"\n};\n\nexport const isCountryInEurope = (countryCodeToNameMap, country) => {\n return countryCodeToNameMap[country];\n};\n\nexport const encodeQueryData = (data) => {\n const ret = [];\n\n for (let d in data) {\n ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));\n }\n\n return ret.join('&');\n};\n\nexport const calculateDiscountPercent = (price, oldPrice) => Math.floor((1 - (price/oldPrice)) * 100);\n\nexport const convertDateToDDMMMYY = (date: string, shortMonthName = true, dayMonthSeparator = \" \", monthYearSeparator = \" \") => {\n const monthNames = [\n \"jan\",\n \"feb\",\n \"mar\",\n \"apr\",\n \"may\",\n \"jun\",\n \"jul\",\n \"aug\",\n \"sep\",\n \"oct\",\n \"nov\",\n \"dec\"\n ];\n const dateObj = new Date(date);\n const day = dateObj.getDate();\n const month = monthNames[dateObj.getMonth()];\n const monthKey = \"month_\" + (!shortMonthName ? \"full_\" : \"\") + month;\n const year = dateObj.getFullYear();\n\n return day + dayMonthSeparator + __(monthKey) + monthYearSeparator + year;\n};\n\nexport const daysDiff = (dateTo: string, dateFrom: string = null) => {\n const dateFromObj = dateFrom !== null && dateFrom !== \"\" ? new Date(dateFrom) : new Date();\n const dateToObj = new Date(dateTo);\n\n // Change hours and minutes to be from the start of the day.\n dateFromObj.setHours(0,0,0,0);\n dateToObj.setHours(0,0,0,0);\n return (dateToObj.getTime() - dateFromObj.getTime() + ((dateFromObj.getTimezoneOffset() - dateToObj.getTimezoneOffset()) * 60 * 1000)) / (1000 * 3600 * 24);\n};","var _defs, _path;\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); }\nimport * as React from \"react\";\nfunction SvgCollaboration(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 34,\n height: 27.268\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"collaboration_svg__a\",\n x1: 0.037,\n y1: 0.031,\n x2: 0.968,\n y2: 0.955,\n gradientUnits: \"objectBoundingBox\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0,\n stopColor: \"#fdcb51\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#fb838b\"\n })))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"folder_shared_FILL1_wght400_GRAD0_opsz48(1)\",\n d: \"M26.17 22.742a3.133 3.133 0 002.216-5.368 3.589 3.589 0 00-2.216-.852 3.133 3.133 0 00-2.216 5.368 3.407 3.407 0 002.216.852zm-6.817 7.414h13.634V29.3a2.922 2.922 0 00-1.787-2.724 10.376 10.376 0 00-5.028-.937 11.482 11.482 0 00-5.028.937 3.008 3.008 0 00-1.791 2.724zm-12.7 5.113a2.453 2.453 0 01-1.786-.769 2.453 2.453 0 01-.767-1.788V10.556a2.453 2.453 0 01.767-1.789A2.321 2.321 0 016.656 8h10.822a4.277 4.277 0 011.023.17 1.948 1.948 0 01.852.6l1.7 1.789h14.491a2.621 2.621 0 012.556 2.554v19.6a2.621 2.621 0 01-2.556 2.556z\",\n transform: \"translate(-4.1 -8)\",\n fill: \"url(#collaboration_svg__a)\"\n })));\n}\nexport default SvgCollaboration;","var _defs, _path;\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); }\nimport * as React from \"react\";\nfunction SvgSecurity(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 26,\n height: 33.999\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"security_svg__a\",\n x1: 0.017,\n y1: 0.082,\n x2: 0.932,\n y2: 0.961,\n gradientUnits: \"objectBoundingBox\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0,\n stopColor: \"#dae23f\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#84c400\"\n })))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Union 59\",\n d: \"M-7986 34a4 4 0 01-4-4V16a4 4 0 014-4h1V8a8.01 8.01 0 018-8 8.008 8.008 0 018 8v4h1a4 4 0 014 4v14a4 4 0 01-4 4zm6-11a3 3 0 003 3 3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3zm9-11V8a6.009 6.009 0 00-6-6 6.01 6.01 0 00-6 6v4z\",\n transform: \"translate(7990)\",\n fill: \"url(#security_svg__a)\"\n })));\n}\nexport default SvgSecurity;","var _defs, _path;\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); }\nimport * as React from \"react\";\nfunction SvgAccess(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 34,\n height: 34\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"access_svg__a\",\n x1: 0.085,\n y1: 0.214,\n x2: 0.899,\n y2: 0.811,\n gradientUnits: \"objectBoundingBox\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0,\n stopColor: \"#bc75ca\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#8a7bef\"\n })))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M30.1 27.7a1.417 1.417 0 001.1.1c.4-.1.6-.4.8-.8a10.261 10.261 0 00.4-1.4 7.084 7.084 0 00.1-1.4 9.058 9.058 0 00-.6-3.2 7.835 7.835 0 00-4.6-4.6 8.662 8.662 0 00-3.2-.6l.8-.8a1.273 1.273 0 10-1.8-1.8l-3.5 3.4a.764.764 0 00-.2.5c0 .2.1.3.2.5l3.5 3.4a3.552 3.552 0 00.9.4 1.273 1.273 0 00.9-2.2l-1-1a6.2 6.2 0 012.3.4 4.644 4.644 0 012 1.3 5.328 5.328 0 011.3 2 5.7 5.7 0 01.4 2.2 4.1 4.1 0 01-.1 1.1c-.1.3-.2.7-.3 1a1.412 1.412 0 00-.1.9 4.35 4.35 0 00.7.6zM23.2 35a1.212 1.212 0 001.8 0l3.5-3.4a.764.764 0 00.2-.5c0-.2-.1-.3-.2-.5L25 27.2a3.552 3.552 0 00-.9-.4 1.273 1.273 0 00-.9 2.2l.9.9a5.867 5.867 0 01-2.3-.4 5.748 5.748 0 01-3.3-3.3A5.45 5.45 0 0118 24a3.4 3.4 0 01.1-1 1.689 1.689 0 01.3-1 1.729 1.729 0 00.1-1 1.344 1.344 0 00-.6-.7 1.417 1.417 0 00-1.1-.1 1.2 1.2 0 00-.7.7 8.331 8.331 0 00-.4 1.5 7.569 7.569 0 00-.1 1.5 9.058 9.058 0 00.6 3.2 7.35 7.35 0 001.9 2.8 7.5 7.5 0 002.8 1.8 11.557 11.557 0 003.1.7l-.7.7a1.222 1.222 0 00-.4.9c0 .3 0 .8.3 1zm.8 6a16.68 16.68 0 01-6.7-1.3 16.546 16.546 0 01-9-9A16.679 16.679 0 017 24a16.679 16.679 0 011.3-6.7 16.546 16.546 0 019-9A16.679 16.679 0 0124 7a16.679 16.679 0 016.7 1.3 16.546 16.546 0 019 9A16.679 16.679 0 0141 24a16.68 16.68 0 01-1.3 6.7 16.546 16.546 0 01-9 9A16.68 16.68 0 0124 41z\",\n transform: \"translate(-7 -7)\",\n fill: \"url(#access_svg__a)\"\n })));\n}\nexport default SvgAccess;","var _defs, _path;\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); }\nimport * as React from \"react\";\nfunction SvgMedia(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 32.001,\n height: 32.001\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"media_svg__a\",\n x1: 0.034,\n x2: 0.945,\n y2: 0.951,\n gradientUnits: \"objectBoundingBox\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0,\n stopColor: \"#f182d3\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#e2334c\"\n })))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Union 73\",\n d: \"M-7987 32a3 3 0 01-3-3V11a3 3 0 013-3h26a3 3 0 013 3v18a3.006 3.006 0 01-3 3zm9-16.234v8.468a1 1 0 001 1 .981.981 0 00.513-.144l7.056-4.233a1 1 0 00.485-.86.985.985 0 00-.485-.854l-7.056-4.235a.991.991 0 00-.511-.144 1 1 0 00-1.002 1.003zM-7986 6a1 1 0 01-1-1 1 1 0 011-1h24a1 1 0 011 1 1 1 0 01-1 1zm5-4a1 1 0 01-1-1 1 1 0 011-1h14a1 1 0 011 1 1 1 0 01-1 1z\",\n transform: \"translate(7990)\",\n fill: \"url(#media_svg__a)\"\n })));\n}\nexport default SvgMedia;","var _defs, _path;\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); }\nimport * as React from \"react\";\nfunction SvgFile(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 26,\n height: 32\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"file_svg__a\",\n x1: 0.021,\n y1: 0.018,\n x2: 0.963,\n y2: 0.98,\n gradientUnits: \"objectBoundingBox\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0,\n stopColor: \"#74edfe\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#46b5fe\"\n })))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M31.563 36H10.438a2.356 2.356 0 01-1.706-.72A2.286 2.286 0 018 33.6V6.4a2.286 2.286 0 01.731-1.68A2.356 2.356 0 0110.438 4h12.837a4.136 4.136 0 01.975.16 2.919 2.919 0 01.813.56l8.206 8.08a2.873 2.873 0 01.569.8 3.959 3.959 0 01.163.96V33.6a2.286 2.286 0 01-.731 1.68 2.356 2.356 0 01-1.707.72zm-10.482-6.88a7.353 7.353 0 005.362-2.16 7.126 7.126 0 002.194-5.28 7.126 7.126 0 00-2.194-5.28 7.353 7.353 0 00-5.362-2.16 7.528 7.528 0 00-3.331.72 9.46 9.46 0 00-2.438 1.76v-1.84a.9.9 0 00-.244-.64 1 1 0 00-1.3 0 .9.9 0 00-.244.64v4a1.192 1.192 0 00.325.88 1.12 1.12 0 00.894.32h4.144a.931.931 0 00.65-.24.962.962 0 000-1.28.931.931 0 00-.65-.24h-2.112a4.443 4.443 0 011.869-1.52 5.753 5.753 0 012.519-.56 5.371 5.371 0 013.981 1.52 5.2 5.2 0 011.544 3.92 5.2 5.2 0 01-1.544 3.92 5.371 5.371 0 01-3.981 1.52 6.292 6.292 0 01-3.169-.88A5.608 5.608 0 0115.881 24a2.129 2.129 0 00-.406-.48 1.188 1.188 0 00-.569-.16 1.172 1.172 0 00-.894.4 1.086 1.086 0 00-.081.88 7.282 7.282 0 002.844 3.2 6.832 6.832 0 004.306 1.28z\",\n transform: \"translate(-8 -4)\",\n fill: \"url(#file_svg__a)\"\n })));\n}\nexport default SvgFile;","var _defs, _path;\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); }\nimport * as React from \"react\";\nfunction SvgBackup(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 40,\n height: 26.667\n }, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"backup_svg__a\",\n x1: 0.047,\n y1: 0.058,\n x2: 0.977,\n y2: 0.95,\n gradientUnits: \"objectBoundingBox\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0,\n stopColor: \"#33cede\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#827be7\"\n })))), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n \"data-name\": \"Path 7090\",\n d: \"M32.25 14.067a12.487 12.487 0 00-23.333-3.334A10 10 0 0010 30.667h21.667a8.309 8.309 0 00.583-16.6zm-14.4 10.416a1.66 1.66 0 01-2.35 0L12 21a1.662 1.662 0 012.35-2.35l2.317 2.317 7.466-7.467a1.662 1.662 0 112.35 2.35l-8.633 8.633z\",\n transform: \"translate(0 -4)\",\n fill: \"url(#backup_svg__a)\"\n })));\n}\nexport default SvgBackup;","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Tooltip as ReactTooltip } from \"react-tooltip\";\n\nimport { __ } from \"../lib/utils\";\n\nimport Collaboration from \"../../new_site/images/features-section/collaboration.svg\";\nimport Security from \"../../new_site/images/features-section/security.svg\";\nimport Access from \"../../new_site/images/features-section/access.svg\";\nimport Media from \"../../new_site/images/features-section/media.svg\";\nimport File from \"../../new_site/images/features-section/file.svg\";\nimport Backup from \"../../new_site/images/features-section/backup.svg\";\n\n\nconst FeaturesSection = () => {\n return (\n \n \n {__(\"pcloud_features_included_for_all\")}\n \n \n \n \n \n {__(\"collaboration\")}\n \n \n \n - {__(\"feature_share_dl_and_upl_links\")}
\n - {__(\"invite_to_shared_folders\")}
\n - {__(\"feature_get_detailed_stats\")}
\n - \n \n {__(\"brand_download_links\")}\n \n \n
\n
\n \n \n\n \n \n \n \n \n {__(\"PAGE_SECURITY\")}\n \n \n \n - {__(\"tsl_ssl_protection\")}
\n - {__(\"aes_encrypted_files\")}
\n - {__(\"five_copies_of_files\")}
\n - \n \n {__(\"option_for_encryption_with_crypto\")}\n \n \n
\n
\n \n \n\n \n \n \n \n \n {__(\"access_and_sync\")}\n \n \n \n - {__(\"auto_upl_camera_roll\")}
\n - \n \n {__(\"extend_through_drive\")}\n \n \n
\n - \n \n {__(\"selective_offline_access\")}\n \n \n
\n - {__(\"auto_sync_across_devices\")}
\n
\n \n \n\n \n \n \n \n \n {__(\"media_and_usability\")}\n \n \n \n - {__(\"built_in_video_player\")}
\n - {__(\"video_streaming\")}
\n - {__(\"built_in_audio_player_playlists\")}
\n - {__(\"unlimited_file_size_and_speed\")}
\n
\n \n \n\n \n \n \n \n \n {__(\"PAGE_FILE_MANAGEMENT\")}\n \n \n \n - \n \n {__(\"PAGE_FILE_VERSIONING\")}\n \n \n
\n - {__(\"data_recovery\")}
\n - \n \n {__(\"lbl_remote_upload\")}\n \n \n
\n - {__(\"doc_preview\")}
\n - \n \n {__(\"rewind_account\")}\n \n \n
\n
\n \n \n\n \n \n \n \n \n {__(\"backups_from\")}\n \n \n \n - Dropbox
\n - Facebook
\n - OneDrive
\n - Google Drive
\n - Google Photos
\n
\n \n \n \n );\n};\n\nexport default FeaturesSection;\n\nconst Container = styled.div`\n display: grid; \n display: -ms-grid;\n grid-template-columns: 1fr 1fr 1fr; \n -ms-grid-columns: 1fr 1fr 1fr;\n grid-template-rows: 40px 1fr 1fr; \n -ms-grid-rows: 60px 1fr 1fr;\n max-width: 1180px;\n padding-bottom: 50px;\n margin: 10px auto;\n \n #tooltip {\n font-size: 13px;\n line-height: 1.15;\n color: #fff;\n padding: 16px;\n box-shadow: 0 2px 1px 0 rgba(0, 0, 0, 0.05);\n border-radius: 6px;\n max-width: 300px;\n text-align: center;\n }\n\n @supports (grid-gap: 20px) {\n grid-gap: 20px;\n padding-bottom: 0px;\n }\n\n @media (max-width: 768px) {\n display: flex;\n flex-direction: column;\n max-width: 350px;\n margin: 0 auto;\n padding-bottom: 50px;\n }\n`;\n\nconst Headline = styled.div`\n grid-column: 1 / 4;\n grid-row: 1 / 2;\n -ms-grid-column: 1;\n -ms-grid-column-span: 3;\n -ms-grid-row: 1;\n font-size: 28px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n letter-spacing: normal;\n text-align: center;\n color: #2d231c;\n`;\n\nconst FeatureWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: start;\n box-sizing: border-box;\n padding: 20px;\n margin: 10px;\n\n @supports (grid-gap: 20px) {\n margin: 0px;\n }\n\n &.r2c1 {\n -ms-grid-column: 1;\n -ms-grid-column-span: 1;\n -ms-grid-row: 2;\n grid-column: 1 / 2;\n grid-row: 2 / 3;\n }\n\n &.r2c2 {\n -ms-grid-column: 2;\n -ms-grid-column-span: 1;\n -ms-grid-row: 2;\n grid-column: 2 / 3;\n grid-row: 2 / 3;\n }\n\n &.r2c3 {\n -ms-grid-column: 3;\n -ms-grid-column-span: 1;\n -ms-grid-row: 2;\n grid-column: 3 / 4;\n grid-row: 2;\n }\n\n &.r3c1 {\n -ms-grid-column: 1;\n -ms-grid-column-span: 1;\n -ms-grid-row: 3;\n grid-column: 1 / 2;\n grid-row: 3 / 4;\n }\n\n &.r3c2 {\n -ms-grid-column: 2;\n -ms-grid-column-span: 1;\n -ms-grid-row: 3;\n grid-column: 2 / 3;\n grid-row: 3 / 4;\n }\n\n &.r3c3 {\n -ms-grid-column: 3;\n -ms-grid-column-span: 1;\n -ms-grid-row: 3;\n grid-column: 3 / 4;\n grid-row: 3 / 4;\n }\n\n @media (max-width: 768px) {\n padding-right: 15px;\n }\n`;\n\nconst TitleContainer = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: end;\n width: 100%;\n min-height: 120px;\n word-break: break-word;\n -ms-word-break: break-all;\n`;\n\nconst Title = styled.div`\n font-size: 23px;\n font-weight: bold;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.16;\n letter-spacing: normal;\n text-align: left;\n margin: 20px 0;\n color: #000;\n`;\n\nconst Description = styled.div`\n width: 100%;\n font-size: 15px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.4;\n letter-spacing: normal;\n text-align: left;\n color: #777777;\n\n ul {\n li {\n margin: 8px 0px 0px 13px;\n\n &:first-of-type {\n margin-top: 0px;\n }\n\n &:last-of-type {\n margin-bottom: 0px;\n }\n\n .info_ico {\n margin-left: 10px;\n }\n }\n }\n`;\n\nconst Check = styled.span`\n display: inline-block;\n min-height: 5px;\n min-width: 9px;\n border-bottom: 2px solid #999999;\n border-left: 2px solid #999999;\n transform: rotate(-45deg);\n margin-right: 14px;\n margin-bottom: 4px;\n`;\n\nconst IconWrapper = styled.div`\n display: flex;\n width: 64px;\n height: 64px;\n justify-content: center;\n align-items: center;\n background-color: #fff;\n border-radius: 50%;\n`;","import React from \"react\";\n\nimport _move from \"../lib/move\";\nimport componentMount from \"../lib/componentMount\"\nimport FeaturesSection from \"../components/FeaturesSection\";\n\nconst _attachList = [\n {\n attach: self,\n list: [\n //components\n \"FeaturesSection\"\n ]\n }\n]\n\nconst prepComponents = {\n FeaturesSection: componentMount(props => )\n};\n\n_move(prepComponents, _attachList);","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL scrollbar.\n getWindowScrollBarX(documentElement, htmlRect));\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the element as the offsetParent if it's non-static,\n // while Chrome and Safari return the element. The element must\n // be used to perform the correct calculations even if the element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle