{"version":3,"file":"static/js/47ebda18da18f73618f9.bundle.js","mappings":"kLACO,MAAMA,EAAcC,GAEC,mIAEDC,KAAKD,GAUnBE,EAAqBA,CAACC,EAAaC,KAA6B,IAAAC,EACzE,OAAID,GAAsB,QAAnBC,EAAID,EAAIE,QAAQC,WAAG,IAAAF,GAAfA,EAAiBG,OAAOC,sBACxBN,MAAAA,OAAG,EAAHA,EAAKO,QAAQ,kBAAmB,IAEpCP,GAWEQ,EAAgCA,CAACR,EAAaC,KAA6B,IAAAQ,EACpF,GAAIR,GAAsB,QAAnBQ,EAAIR,EAAIE,QAAQC,WAAG,IAAAK,GAAfA,EAAiBJ,OAAOC,sBAAuB,KAAAI,EAEtD,MAAO,GAD+C,QAAzCA,EAAGC,mBAAmBX,EAAIY,MAAM,MAAM,WAAG,IAAAF,OAAA,EAAtCA,EAAwCH,QAAQ,mBAAoB,QAGxF,OAAOP,GAIEa,EAAyB,gFAOzBC,EAAgB,CACzBC,UAAW,24RACXC,kBAAmB,0BACnBC,gBAAiBJ,GAIRK,EAAuB,kD,oICpC7B,MAAMC,EAAmBC,GACxBA,GAA6D,aAAtCA,EAAoBC,cACpC,OAEPD,GAA6D,WAAtCA,EAAoBC,cACpC,eAEPD,GAA6D,cAAtCA,EAAoBC,cACpC,YAEJ,GAGEC,EAAmBA,CAC5BC,EACAC,EACAC,KAEA,GAAIF,MAAAA,GAAAA,EAASG,gBAAiB,CAC1B,GAAIF,GAAyC,IAArBA,EACpB,OAAOA,EAAiBG,WAE5B,GAAIF,GAA6D,KAA/BA,EAC9B,OAAOA,EAGf,OAAOF,MAAAA,OAAO,EAAPA,EAASK,SAASD,YAmE7B,EAhEoDE,IAM/C,IAAAC,EAAAC,EAAA,IANgD,QACjDR,EAAO,QACPS,EAAO,gBACPC,EAAe,oBACfC,EAAmB,2BACnBT,GACHI,EACOM,EAAyB,GAC7B,MAAM,IAAE/B,GAAQ4B,EACVI,EAA2BH,IAEhC,QAF+CH,EAAIG,EAAgBI,MAC/DC,IAAoB,IAAAC,EAAA,OAAc,QAATA,EAAAD,EAAKE,YAAI,IAAAD,OAAA,EAATA,EAAWE,UAAWrC,EAAIC,OAAOqC,kCAC9D,IAAAZ,GAAW,QAAXA,EAFmDA,EAEjDa,iBAAS,IAAAb,OAAA,EAFwCA,EAEtCT,eAERuB,EAAoCV,IAEzC,QAF4DH,EAAIG,EAAoBG,MAChFQ,GAAiD,6CAAlBA,MAAAA,OAAQ,EAARA,EAAUC,cAC7C,IAAAf,GAAO,QAAPA,EAFgEA,EAE9DgB,aAAK,IAAAhB,OAAA,EAFyDA,EAEvDiB,aAEuF,IAAAC,EAAjG,GAAyF,SAApF9B,EAAgByB,GAAqCR,GACtDD,EAAmD,QAA7Bc,EAAG1B,MAAAA,OAAO,EAAPA,EAAS2B,yBAAiB,IAAAD,EAAAA,EAAI,QACpD,GACkF,iBAApF9B,EAAgByB,GAAqCR,IAC+B,cAApFjB,EAAgByB,GAAqCR,GACvD,KAAAe,EACC,IAAIC,EACAnB,IAA0F,QAA3EkB,EAAIlB,EAAgBI,MAAKC,IAAI,IAAAe,EAAA,OAAa,QAATA,EAAAf,EAAKE,YAAI,IAAAa,OAAA,EAATA,EAAWZ,UAAWrC,EAAIC,OAAOiD,mBAAS,IAAAH,OAAA,EAAvEA,EAAyER,WAChG,IACsB,KAAjBS,GAAD,MAAwBA,IACxBhD,EAAIC,OAAOkD,WACXnD,EAAIC,OAAOkD,UAAUC,OAAS,EAChC,KAAAC,EACE,MAAMC,EACFzB,IAKC,QALcwB,EACfxB,EAAgBI,MACZC,IAAI,IAAAqB,EAAA,OACAvD,EAAIC,OAAOuD,8BACF,QAATD,EAAArB,EAAKE,YAAI,IAAAmB,OAAA,EAATA,EAAWlB,UAAWrC,EAAIC,OAAOuD,sCACxC,IAAAH,GAAW,QAAXA,EAJDA,EAIGd,iBAAS,IAAAc,OAAA,EAJZA,EAIcpC,eAEdqC,MAAAA,GAAmD,KAAVA,GACzCtD,EAAIC,OAAOkD,UAAUM,KAAKC,IAClBA,EAAYC,UAAU1C,gBAAkBqC,IACxCN,OACkCY,IAA9BF,EAAYG,eACsB,KAA9BH,EAAYG,eACkB,OAA9BH,EAAYG,cACVH,EAAYG,cACZ,OAItBb,EAAehD,EAAIC,OAAOkD,UAAU,GAAGU,cAEvCb,GAA2C,KAA3BjB,IAChBA,GAAyB+B,EAAAA,EAAAA,IAAqBd,IAItD,OAAOjB,EACHgC,IAAAA,cAAA,OAAKC,UAAU,iCACVjC,GAELgC,IAAAA,cAACE,EAAAA,EAAc,CAACC,KAAK,OAAOF,UAAU,oC,4eCmT9C,SAASG,EAAYC,GACjB,MAAMC,IAAUD,GAAiB,GACjC,OAAOE,KAAKC,MAAc,GAARF,GAAc,GAGpC,SAASG,EAAYC,EAAeC,EAAgBC,EAAiBC,GAGjE,MAAO,GAFPH,EAAOA,GAAQ,MACfC,EAAQA,GAAS,MACUG,EAAmBF,EAAQC,KAqB1D,SAASC,EAAmBF,EAAiBC,GACzC,GAAID,GAAUC,EAAiB,CAC3B,MAAME,EAAgBH,EAAOI,QAAQ,GACrC,OAAOC,EAAAA,EAAAA,QAAOJ,GAAmB,GAAIE,EAAe,KAExD,MAAO,GAgBX,SAASG,EACLrD,EACAsD,EACAC,EACAC,EACAC,EACAC,GAEA,GAAIF,GAA2B,IAAdA,EAAiB,CAC9B,MAAMG,EAAcF,GAAgBA,EAAa9D,YAAe,IAC1DqD,EAAkBC,EAAmBO,EAAWE,GAEtD,OACIvB,IAAAA,cAACyB,EAAAA,gBAAe,CACZ5D,QAASA,EACTuD,GAAIA,EACJD,SAAUA,EACVE,UAAWA,EACXK,YAAaF,EACbG,UAAQ,EACRJ,UAAWV,EACXe,KAAM,KAId,OAAO,KAIf,SAASC,EACLhE,EACAsD,EACAC,EACAU,EACAC,EACAC,EACAC,EACAC,EACAC,GAEA,MAAMxB,EAAsB,CACxByB,UAAWN,EACXO,cAAeN,EACfO,wBAAyBP,GAE7B,OAAOD,EACH9B,IAAAA,cAACuC,EAAAA,eAAc,CACX1E,QAASA,EACTuD,GAAIA,EACJD,SAAUA,EACVS,KAAM,CAAEjB,MAAAA,GACRqB,YAAaA,EACbC,cAAeA,EACfC,kBAAmBA,IAEvB,KAcR,SAASM,EACLC,EAA2CC,EAC3CC,EAAmBC,EAA2BC,EAAkBC,EAAkCC,GAElG,IAAKJ,IAAaD,IAAiBD,EAC/B,OAAO,KAGX,MAAMO,EAAwBD,GAAiB,GAC/C,IAAIE,EAAsBL,EACtBI,GAAyBJ,IACzBK,EAAsB,GAAGL,KAAoBI,KAEjD,MAAME,EAAoB,CACtBC,IAAKR,EACLE,QAASA,GAAoB,GAC7BO,YAAaH,GAEXI,EAA0B,CAAEX,aAAAA,GAKlC,OAHAW,EAAWX,aAAeA,EAC1BW,EAAWC,cAAgBb,EAC3BY,EAAWC,cAAcC,iBAAkB,EAEvCvD,IAAAA,cAACwD,EAAAA,GAAKC,OAAAC,OAAA,GACER,EAAWG,EAAU,CAAEM,oBAAoB,QAC/Cb,eAAgBA,EAChBc,qBAAmB,KAM/B,SAASC,EACLC,EACAC,EACAjB,GAA+B,IAAAkB,EAE/B,MAAMC,EACFH,IACAC,MAAAA,GAEC,QAFSC,EAAVD,EAAY7F,MACRgG,GAAiBA,EAAc7F,MAAQ6F,EAAc7F,KAAKnB,cAAcoB,SAAWwF,EAAc5G,cAAcoB,gBAClH,IAAA0F,OAAA,EAFDA,EAEGxF,WACP,IAAKyF,EACD,OAIJ,MAKME,EALSF,EAAUxH,MAAM,KAGHiD,KAAI0E,IAASC,EAAAA,EAAAA,IAAeD,EAAOtB,KAE1BpD,KAAI4E,GAAeA,IAAeC,EAAAA,EAAAA,IAAkBD,EAAaxB,KAEtG,OAAOqB,GAAmBnE,IAAAA,cAAAA,IAAAA,SAAA,KAAGmE,GAM1B,MAAMK,EAAoEC,EAAAA,GAAiBC,wBAEhG,U,qWAASC,CAAA,CAAIC,UArgBuClH,IAqBjD,IAAAmH,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IArBkD,KACnDrD,EAAI,QACJ/D,EAAO,cACPyF,EAAa,YACbtB,EAAW,cACXC,EAAa,kBACbC,EAAiB,iBACjBC,EAAgB,gBAChBtB,EAAe,UACfqE,EAAS,SACT/D,EAAQ,GACRC,EAAE,iBACF+D,EAAgB,gBAChBC,EAAe,eACfC,EAAc,eACdC,EAAc,gBACdC,EAAe,kBACfC,EAAiB,eACjBC,EAAc,eACdC,EAAc,cACdC,GACHjI,EAEG,MACIzB,KACIC,QAAQ,4BAAEuD,EAA2B,2BAAEmG,KAE3C/H,EACEgI,EAAuB7F,IAAAA,OAA6B,MACpD8F,EAA6C,QAA/BjB,EAAGgB,EAAqBE,eAAO,IAAAlB,OAAA,EAA5BA,EAA8BmB,cAAc,8BAC5DC,EAAaC,GAAgBlG,IAAAA,SAA0C,CAC1EmG,OAAQL,MAAAA,OAAc,EAAdA,EAAgBM,aACxBC,cAAeP,MAAAA,OAAc,EAAdA,EAAgBQ,eAG7BC,EAAsB1I,EAAQ5B,IAAIC,OAAOsK,sBAEzCpJ,EAAUwE,EAAKxE,QACrB,IAAKA,EACD,OAAO,KAOX,MAAM,gBAAEqJ,EAAe,oBAAEC,GAAwBtJ,EACjD,IAAIuJ,IAAc,EACdF,GAAAA,MAAmBA,GAAAA,EAAiBvI,MAAKC,IAAI,IAAAC,EAAA,MAA0B,4BAAb,QAATA,EAAAD,EAAKE,YAAI,IAAAD,OAAA,EAATA,EAAWE,aAC5DqI,IAAc,GAElB,MAAMC,GAAgBhB,GAA8Ba,GAAmBE,IAAcE,EAAAA,EAAAA,GAAqBJ,EAAiB,0BAA4BrG,EAAYhD,MAAAA,OAAO,EAAPA,EAAS0J,eACtKxF,GAAesE,GAA8Ba,GAAmBE,IAAcE,EAAAA,EAAAA,GAAqBJ,EAAiB,sBAAwBrG,EAAYhD,MAAAA,OAAO,EAAPA,EAAS2J,cACvK/G,IAAAA,WAAgB,KACZ,SAASgH,IACLd,EAAa,CACTC,OAAQL,MAAAA,OAAc,EAAdA,EAAgBM,aACxBC,cAAeP,MAAAA,OAAc,EAAdA,EAAgBQ,eAIvC,OADAU,IACIC,EAAAA,GAASC,WACTC,OAAOC,iBAAiB,SAAUJ,GAC3B,IAAMG,OAAOE,oBAAoB,SAAUL,IAE3C,IAAM,OAElB,CAAClB,MAAAA,OAAc,EAAdA,EAAgBM,aAAcN,MAAAA,OAAc,EAAdA,EAAgBQ,eAElD,MAAMhJ,GAA6BmJ,MAAAA,GAElC,QAFiD3B,EAAf2B,EAAiBvI,MAChDC,IAAI,IAAAe,EAAA,OAAa,QAATA,EAAAf,EAAKE,YAAI,IAAAa,OAAA,EAATA,EAAWZ,UAAWT,EAAQ5B,IAAIC,OAAOoL,yCACpD,IAAAxC,OAAA,EAFkCA,EAEhCtG,UACG+I,GAAsBnK,IAAsC,QAA/B2H,EAAI3H,EAAQsJ,2BAAmB,IAAA3B,GAAkF,QAAlFA,EAA3BA,EAA6B7G,MAAMQ,GAAiD,4BAAlBA,MAAAA,OAAQ,EAARA,EAAUC,cAAiC,IAAAoG,GAAO,QAAPA,EAA7GA,EAA+GnG,aAAK,IAAAmG,OAAA,EAApHA,EAAsHyC,WACvJC,GAAsB5J,EAAQ5B,IAAIC,OAAOwL,2BACzC3E,GAAgBlF,EAAQ5B,IAAIC,OAAOyL,qBACnCC,GAAiCL,GAAuB,EAAIA,GAAsBnK,EAAQK,SAChG,IAAIoK,IAAaC,EAAAA,EAAAA,wBAAsBlM,EAAAA,EAAAA,IAAmBwB,MAAAA,OAAO,EAAPA,EAASiB,KAAOR,IAAY,GAAI4J,IAAsBrK,EAAQ2K,iBAAsC3K,EAAQK,SAAUI,GAAWA,EAAQmK,mBAAenI,GAKlN,GAHIqF,IACA2C,GAqSR,SAA0BA,EAAoBhK,GAC1C,MAAMoK,EAAS,IAAIC,IAAIL,EAAYhK,EAAQ7B,QAAQmM,YAAYC,SACzDC,EAAc,YAChBJ,EAAOK,OACPL,EAAOK,QAAU,IAAID,IAErBJ,EAAOK,QAAUD,EAIrB,OADmB,IAAIH,IAAID,EAAOM,MAChBC,SAAWP,EAAOK,OA/SnBG,CAAiBZ,GAAYhK,IAE1C4J,GAAqB,CACrB,MAAMiB,EAAuBb,GAAWc,SAAS,KAAO,cAAcf,KAAmC,cAAcA,KACvHC,IAAca,EAGlB,MAAME,IAAUC,EAAAA,EAAAA,kBAAiB,QAAS1D,EAAmB,GAAIyC,GAAgCpK,YAC3FsL,IAAYC,EAAAA,EAAAA,wBAAuB5D,EAAmByD,IAG5D,IAAII,GACA5L,IAAYA,MAAAA,IAAAA,EAASG,kBAArBH,MAAwCA,GAAAA,EAASsJ,sBAAuBtJ,MAAAA,GAA4B,QAArB4H,EAAP5H,EAASsJ,2BAAmB,IAAA1B,OAAA,EAA5BA,EAA8B3F,QAAS,EACzGjC,MAAAA,GAAwD,QAAjD6H,EAAP7H,EAASsJ,oBAAoBxI,MAAK+K,GAAe,SAAVA,EAAEtK,aAAe,IAAAsG,GAAO,QAAPA,EAAxDA,EAA0DrG,aAAK,IAAAqG,OAAA,EAA/DA,EAAiEpG,YACjE,GC5KoBqK,IAACC,GAAsBC,GD6KrDJ,GAAYA,KC7KmBG,GD6KaH,GC3KrCI,GACDD,GACAA,MAAAA,QAAW,EAAXA,GAAa/M,QAAQ,UAAUiN,GACpBA,EAAIC,OAAO,GAAGC,cAAgBF,EAAIG,OAAO,GAAGtM,iBD2K7D,MAAMuM,GAAqBhE,EAE3B,GAAiB,uBAAbtE,EAAmC,CAEnC,MAAMvB,GAAY8J,EAAAA,EAAAA,IAAejD,EAAiBhH,GAC5CkK,EAA4B/J,EAAY,GAAGA,KAAaxC,EAAQiB,OAASjB,EAAQiB,KAGvF,OACI2B,IAAAA,cAAC4J,EAAAA,EAAa,CAACC,UAAWhM,EAAQgM,WAC9B7J,IAAAA,cAAA,OAAKC,UAAU,eACXD,IAAAA,cAAA,IAAAyD,OAAAC,OAAA,CACI6E,KAAMV,GACNiC,SAASC,EAAAA,EAAAA,kBAAiB5E,EAAmByD,GAASxL,EAAQiB,MAAM,aACxDoC,EACRrD,EAAQiB,KACRR,EAAQmM,iBAAiBC,eAAe7M,EAAQ8M,OAChD9M,EAAQ0J,cACRjG,IAEAiI,IAEH9I,IAAAA,cAAA,OAAKC,UAAU,sBAAsB4D,EAAmB0C,EAAqBE,EAAiB5I,EAAQ7B,UACvGgE,IAAAA,cAAA,OAAKC,UAAU,sBACVuC,EACGc,EAAezF,EAAQ7B,QAAQ0G,aAActF,EAAQ+M,gBACrD/M,EAAQ+M,gBAAiB/M,EAAQiB,KAAMR,EAAQmK,cAAclF,eAAgBC,MAGzF/C,IAAAA,cAAA,OAAKC,UAAU,wBAGXD,IAAAA,cAAA,IAAAyD,OAAAC,OAAA,CACIzD,UACI7C,EAAQgF,WACFhF,EAAQgF,UAAYhF,EAAQ8M,MACxB,yBAEJ,cAEV3B,KAAMV,GACNiC,SAASC,EAAAA,EAAAA,kBAAiB5E,EAAmByD,GAASxL,EAAQiB,MAAM,aACxDoC,EACRrD,EAAQiB,KACRR,EAAQmM,iBAAiBC,eAAe7M,EAAQ8M,OAChD9M,EAAQ0J,cACRjG,IAEAiI,IAAS,KAGXW,IACEzJ,IAAAA,cAAAA,IAAAA,SAAA,KACKgJ,KAA0C,IAAlB5L,EAAQ8M,MAAc,eAAiB,IAC/DrI,EACGhE,EACAsD,EACAC,EACAhE,EAAQgF,UACRhF,EAAQ8M,MACRlI,EACAC,EACAC,EACAC,KAIVsH,IACEzJ,IAAAA,cAAA,QAAMC,UAAU,qBAAqBmK,MAAOT,GACvCA,GAA6BA,EAA0BtK,OAAS,GAC3D,GAAGsK,EAA0BU,MAAM,EAAG,SACtCV,GAGbF,IACGzJ,IAAAA,cAAA,QAAMC,UAAU,qBAAqBmK,MAAOT,GACvCA,GAGRF,IACGzJ,IAAAA,cAAA,WACK6B,EACGhE,EACAsD,EACAC,EACAhE,EAAQgF,UACRhF,EAAQ8M,MACRlI,EACAC,EACAC,EACAC,KAKVtE,EAAQ5B,IAAIC,OAAOoO,YACjBpJ,EAAarD,EAASsD,EAAUC,EAAIwF,GAAetF,GAAcT,GACpE4I,IACGzJ,IAAAA,cAACuK,EAAAA,OAAM,CAACC,MAAM,UAAUrK,KAAK,SAASoI,KAAMV,IACvCnC,OAW1B,CACH,MAAM+E,EAAiB5I,EACnBhE,EACAsD,EACAC,EACAhE,EAAQgF,UACRhF,EAAQ8M,MACRlI,EACAC,EACAC,EACAC,GAEEuI,EAAuC,4BAAbvJ,GAAuD,iCAAbA,EACpEvB,GAAY8J,EAAAA,EAAAA,IAAejD,EAAiBhH,GAClD,OAEIO,IAAAA,cAAC4J,EAAAA,EAAa,CAACC,UAAWhM,EAAQgM,WAC9B7J,IAAAA,cAAA,OAAKC,UAAU,cAAc0K,KAAK,SAASb,QAASA,IA0HpE,SAAuBjC,GACfZ,EAAAA,GAASC,YACTC,OAAOyD,SAASrC,KAAOV,GA5H2CgD,CAAchD,KACpE7H,IAAAA,cAAA,IAAAyD,OAAAC,OAAA,CACI6E,KAAMV,GACNiC,SAASC,EAAAA,EAAAA,kBAAiB5E,EAAmByD,GAASxL,EAAQiB,MAAM,aACxDoC,EACRrD,EAAQiB,KACRR,EAAQmM,iBAAiBC,eAAe7M,EAAQ8M,OAChD9M,EAAQ0J,cACRjG,IAEAiI,IAEH4B,GACG1K,IAAAA,cAAA,OAAKC,UAAU,sBACV4D,EAAmB0C,EAAqBE,EAAiB5I,EAAQ7B,UAG1EgE,IAAAA,cAAA,OAAKC,UAAU,sBACVuC,EACGc,EAAezF,EAAQ7B,QAAQ0G,aAActF,EAAQ+M,gBACrD/M,EAAQ+M,gBAAiB/M,EAAQiB,KAAMR,EAAQmK,cAAclF,eAAgBC,MAIzF/C,IAAAA,cAAA,OAAKC,UAAU,wBAEXD,IAAAA,cAAA,OAAKC,UAAU,8BAEVyK,GAA2BrF,GACxBrF,IAAAA,cAAA,OAAKC,UAAU,uCACXD,IAAAA,cAAA,OAAKC,UAAU,uBAAuB6K,IAAKjF,GACvC7F,IAAAA,cAAC+K,EAAAA,GAAiB,CAACC,KAAM3F,EAAgBpF,UAAU,6BAClDgG,EAAYE,OAASF,EAAYI,eAC9BrG,IAAAA,cAAC+K,EAAAA,GAAiB,CAACC,KAAM3F,EAAgBpF,UAAU,kCAOlEyK,IAA4BrF,GAA6C,KAA3BA,MAAAA,OAAc,EAAdA,EAAgBhG,UAAiBsG,GAC5E3F,IAAAA,cAACE,EAAAA,EAAc,CAACC,KAAK,OAAOF,UAAU,iCAEzCyK,GAAsD,KAA3BrF,MAAAA,OAAc,EAAdA,EAAgBhG,UAAiBsG,GACzD3F,IAAAA,cAAA,OAAKC,UAAU,uCACXD,IAAAA,cAAA,kBAGNnC,EAAQ5B,IAAIC,OAAOoO,YAAe1I,EAAKxE,SAAWuI,EAAiB3F,IAAAA,cAACiL,EAAAA,EAAe,CAACC,OAAQtJ,EAAKxE,QAAQ+N,OAAQC,UAAWxJ,EAAKxE,QAAQK,WACtIyD,EAAarD,EAASsD,EAAUC,EAAIwF,GAAetF,GAAcT,GAAmBK,EAAarD,EAASsD,EAAUC,EAAIwF,GAAetF,GAAcT,GAClJb,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,kBAMhBA,IAAAA,cAAA,IAAAyD,OAAAC,OAAA,CACI6E,KAAMV,GACNiC,SAASC,EAAAA,EAAAA,kBAAiB5E,EAAmByD,GAASxL,EAAQiB,MAAM,aACxDoC,EACRrD,EAAQiB,KACRR,EAAQmM,iBAAiBC,eAAe7M,EAAQ8M,OAChD9M,EAAQ0J,cACRjG,IAEAiI,IAEJ9I,IAAAA,cAAA,QAAMC,UAAU,qBAAqBmK,MAAOhN,EAAQiB,MAC/CuB,EAAY,GAAGA,KAAaxC,EAAQiB,OAASjB,EAAQiB,OAIxDqM,GAA2BD,GAuD9BY,GAtDoBjO,EAAQkO,YAuD5CtL,IAAAA,cAAA,KAAGC,UAAU,qBAAqBoL,MApDrBrL,IAAAA,cAACuL,EAAAA,QAAe,CACZnO,QAASwE,EAAKxE,QACdS,QAASA,EACTC,gBAAiB2I,EACjB1I,oBAAqB2I,EACrBpJ,2BAA4BA,MAInCoN,EACKtN,EAAQ8M,MACJO,GACEzK,IAAAA,cAACwL,EAAAA,EAA0B,CACvBC,SAAS,MACTzC,UAAWA,GACX0C,aAActO,EAAQ8M,MACtBrM,QAASA,EACT4M,eAAgBA,EAChBkB,qBAAiB9L,EACjB+L,eAAW/L,EACXgM,0BAAsBhM,IAG5B4K,EACJ,OA2B1B,IAA2BY,KAnWG,KA0gB9B","sources":["webpack://mattressfirm/./src/Utilities/allRegex.ts?9889","webpack://mattressfirm/./src/themes/mattressfirm/views/components/delivery-message/deliverymessage.component.tsx?e440","webpack://mattressfirm/./src/themes/mattressfirm/views/components/product.component.tsx?8ce2","webpack://mattressfirm/./src/Utilities/convert-to-titlecase.ts?8d6f"],"sourcesContent":["import { ICoreContext } from '@msdyn365-commerce/core';\r\nexport const emailRegex = (emailValue: string) => {\r\n // eslint-disable-next-line security/detect-unsafe-regex\r\n const validationEmail = /^[-a-z0-9!#$%&'*+/=?^_`{|}~]+(?:\\.[-a-z0-9!#$%&'*+/=?^_`{|}~]+)*@(?:[a-z0-9]+(?:-+[a-z0-9]+)*\\.)+(?:xn--[a-z0-9]+|[a-z]{2,16})$/i;\r\n\r\n return validationEmail.test(emailValue);\r\n};\r\n\r\n/**\r\n * Method to remove special characters for product name from product URL\r\n * @param str string\r\n * @param ctx ICoreContext\r\n * @returns string\r\n */\r\n\r\nexport const removeSpecialChars = (str: string, ctx: ICoreContext): string => {\r\n if (ctx && ctx.request.app?.config.removeSpecialCharsPDP) {\r\n return str?.replace(/[^a-zA-Z0-9- ]/g, '');\r\n }\r\n return str;\r\n};\r\n\r\n\r\n/**\r\n * Method to remove special characters for product URL's path\r\n * @param str string\r\n * @param ctx ICoreContext\r\n * @returns string\r\n */\r\n\r\nexport const removeSpecialCharsFromURLPath = (str: string, ctx: ICoreContext): string => {\r\n if (ctx && ctx.request.app?.config.removeSpecialCharsPDP) {\r\n const urlPath = decodeURIComponent(str.split('.p')[0])?.replace(/[^a-zA-Z0-9-/ ]/g, '');\r\n return `${urlPath}.p`;\r\n }\r\n return str;\r\n};\r\n\r\n// Following phone format is used on customer info section at checkout page\r\nexport const customerInfoPhoneRegex = /^\\(?([2-9][0-8][0-9])\\)?[ . ]?([2-9][0-9]{2})[\\-\\. ]?([0-9]{4})(\\s*x[0-9]+)?$/; // Valid USA number in format (xxx) xxx-xxxx\r\n\r\n/*\r\nThis regex object has 2 patterns:\r\n'nameRegex' matches names with letters, spaces, apostrophes, periods, and dashes.\r\n'addressInputRegex' matches alphanumeric characters and printable ASCII symbols.\r\n*/\r\nexport const inputRegexObj = {\r\n nameRegex: /^[\\p{L}\\s.'-]+$/u,\r\n addressInputRegex: /^[a-zA-Z0-9\\x20-\\x7E]*$/,\r\n phoneNumerRegex: customerInfoPhoneRegex\r\n};\r\n\r\n// This regex allows us to effectively validate and extract delivery messages\r\nexport const cartDeliveryMsgRegex = /[A-Za-z]{3} \\d{1,2}(?: - [A-Za-z]{3} \\d{1,2})?/;","import { ICoreContext, IGeneric, IAny } from '@msdyn365-commerce/core';\r\nimport { AttributeValue, CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\nimport { IBrandListData } from '../../../../../modules/mfrm-buybox/mfrm-buybox.view';\r\nimport { _getSoonestDeliveryDate, _makeDeliveryMessage } from '../../../../../Utilities/product-search-result-utils';\r\nimport { ProductSearchResultExtended } from '../../../custom-components/product-search-result-items';\r\nimport CustomSkeleton from '../../../custom-components/CustomSkeleton';\r\ninterface IDeliveryMessage {\r\n product?: ProductSearchResultExtended;\r\n context: ICoreContext>;\r\n isMasterProduct?: boolean;\r\n attributeValues?: AttributeValue[];\r\n extensionProperties?: CommerceProperty[];\r\n lowestPriceVariantRecordId?: string;\r\n}\r\n\r\n//TODO: common method; move to general utility file. AND change return type to an Enumeration\r\nexport const _getProductType = (shippingInformation: string | undefined): string => {\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'delivery') {\r\n return 'Core';\r\n }\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'parcel') {\r\n return 'Small Parcel';\r\n }\r\n if (shippingInformation && shippingInformation.toLowerCase() === 'drop ship') {\r\n return 'Drop Ship';\r\n }\r\n return '';\r\n};\r\n\r\nexport const computeItemLines = (\r\n product: IDeliveryMessage['product'],\r\n defaultVariantId: number | undefined,\r\n lowestPriceVariantRecordId: string | undefined\r\n) => {\r\n if (product?.IsMasterProduct) {\r\n if (defaultVariantId && defaultVariantId !== 0) {\r\n return defaultVariantId.toString();\r\n }\r\n if (lowestPriceVariantRecordId && lowestPriceVariantRecordId !== '') {\r\n return lowestPriceVariantRecordId;\r\n }\r\n }\r\n return product?.RecordId.toString();\r\n};\r\n\r\nconst DeliveryMessage: React.FC = ({\r\n product,\r\n context,\r\n attributeValues,\r\n extensionProperties,\r\n lowestPriceVariantRecordId\r\n}) => {\r\n let productDeliveryMessage = '';\r\n const { app } = context;\r\n const shippingInformationSmall = attributeValues && attributeValues.find(\r\n (attr: AttributeValue) => attr.Name?.trim() === app.config.smallParcelAttributeKey\r\n )?.TextValue?.toLowerCase();\r\n\r\n const defaultVariantShippingInformation = extensionProperties && extensionProperties.find(\r\n (property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantShippingInformation\"\r\n )?.Value?.StringValue;\r\n\r\n if ((_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Core') {\r\n productDeliveryMessage = product?.deliveryByMessage ?? '';\r\n } else if ((\r\n (_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Small Parcel' ||\r\n (_getProductType(defaultVariantShippingInformation || shippingInformationSmall)) === 'Drop Ship'\r\n )) {\r\n let deliveryDays =\r\n attributeValues && attributeValues.find(attr => attr.Name?.trim() === app.config.leadTime)?.TextValue;\r\n if (\r\n (deliveryDays === '' || deliveryDays === undefined || deliveryDays === null) &&\r\n app.config.brandList &&\r\n app.config.brandList.length > 0\r\n ) {\r\n const brand =\r\n attributeValues &&\r\n attributeValues.find(\r\n attr =>\r\n app.config.brandBackofficeAttributePlp &&\r\n attr.Name?.trim() === app.config.brandBackofficeAttributePlp\r\n )?.TextValue?.toLowerCase();\r\n\r\n if (brand !== undefined && brand !== null && brand !== '') {\r\n app.config.brandList.map((singleBrand: IBrandListData) => {\r\n if (singleBrand.brandName.toLowerCase() === brand) {\r\n deliveryDays =\r\n singleBrand.brandLeadtime !== undefined &&\r\n singleBrand.brandLeadtime !== '' &&\r\n singleBrand.brandLeadtime !== null\r\n ? singleBrand.brandLeadtime\r\n : '';\r\n }\r\n });\r\n }\r\n deliveryDays = app.config.brandList[0].brandLeadtime;\r\n }\r\n if (deliveryDays && productDeliveryMessage === '') {\r\n productDeliveryMessage = _makeDeliveryMessage(deliveryDays);\r\n }\r\n }\r\n\r\n return productDeliveryMessage ? (\r\n
\r\n {productDeliveryMessage}\r\n
\r\n ) : ;\r\n};\r\n\r\nexport default DeliveryMessage;","import { getProductPageUrlSync } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n Button,\r\n format,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n ITelemetryContent,\r\n onTelemetryClick\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport { PriceComponent, RatingComponent, IPriceComponentResources } from '@msdyn365-commerce/components';\r\nimport { CommerceProperty } from '@msdyn365-commerce/retail-proxy';\r\nimport MsDyn365, {\r\n IComponent,\r\n IComponentProps,\r\n ICoreContext,\r\n IGridSettings,\r\n IImageData,\r\n IImageSettings,\r\n IImageProps,\r\n Image,\r\n IRequestContext,\r\n msdyn365Commerce,\r\n RichTextComponent\r\n} from '@msdyn365-commerce/core';\r\nimport { AttributeValue, ProductPrice, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport React from 'react';\r\n// VSI Customization - starts\r\nimport { convertToTitlecase } from '../../../../Utilities/convert-to-titlecase';\r\nimport { getBVAttributeValues } from '../../../../Utilities/get-bv-attributes';\r\nimport { buildProductBadge, parseBadgeData } from '../../../../Utilities/get-product-badge';\r\nimport { parseBrandName } from '../../../../Utilities/get-product-brand';\r\nimport {\r\n _coreProductATPCall,\r\n _getEyebrowMessage,\r\n _getSoonestDeliveryDate,\r\n _makeDeliveryMessage\r\n} from '../../../../Utilities/product-search-result-utils';\r\nimport { FinancingPerMonthComponent } from '../../custom-components/financing-per-month-component';\r\nimport DeliveryMessage from './delivery-message';\r\nimport { BVRatingSummary } from '../../../../Utilities/components/BVRatingSummary';\r\nimport { removeSpecialChars } from '../../../../Utilities/allRegex';\r\nimport CustomSkeleton from '../../custom-components/CustomSkeleton';\r\nimport { ErrorBoundary } from '../../../../common/components/error-boundary';\r\n// VSI Customization - ends\r\nexport interface IProductComponentProps extends IComponentProps<{ product?: ProductSearchResult }> {\r\n className?: string;\r\n imageSettings?: IImageSettings;\r\n savingsText?: string;\r\n freePriceText?: string;\r\n originalPriceText?: string;\r\n currentPriceText?: string;\r\n ratingAriaLabel?: string;\r\n allowBack?: boolean;\r\n telemetryContent?: ITelemetryContent;\r\n quickViewButton?: React.ReactNode;\r\n eyebrowMessage?: string | undefined;\r\n badgeAttribute?: string;\r\n deliveryMessage?: string;\r\n isRefinersEnabled?: boolean;\r\n // VSI Customization - Copied following 3 props from OOTB product.component to be used in product recommendations for Cart\r\n ratingCountAriaLabel?: string;\r\n isPriceMinMaxEnabled?: boolean;\r\n priceResources?: IPriceComponentResources;\r\n // Customized props for product recommendation on Cart page\r\n displayShopNow?: boolean;\r\n showBvRatings?: boolean;\r\n shopNowBtnText?: string;\r\n}\r\n\r\nexport interface IEyebrowMessageDimensions {\r\n height: number;\r\n visibleHeight: number;\r\n}\r\n\r\nexport interface IProductComponent extends IComponent { }\r\n\r\nconst PriceComponentActions = {};\r\n\r\n// tslint:disable-next-line: max-func-body-length cyclomatic-complexity\r\nconst ProductCard: React.FC = ({\r\n data,\r\n context,\r\n imageSettings,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText,\r\n ratingAriaLabel,\r\n allowBack,\r\n typeName,\r\n id,\r\n telemetryContent,\r\n quickViewButton,\r\n eyebrowMessage,\r\n badgeAttribute,\r\n deliveryMessage,\r\n isRefinersEnabled,\r\n displayShopNow,\r\n shopNowBtnText,\r\n showBvRatings\r\n}) => {\r\n // VSI Customization - starts\r\n const {\r\n app: {\r\n config: { brandBackofficeAttributePlp, enableAttributeBasedRating }\r\n }\r\n } = context;\r\n const getEyebrowElementRef = React.useRef(null);\r\n const eyebrowElement = getEyebrowElementRef.current?.querySelector('.mfrm-eyebrow__button-plp') as Element;\r\n const [isTruncated, setTruncated] = React.useState({\r\n height: eyebrowElement?.scrollHeight,\r\n visibleHeight: eyebrowElement?.clientHeight\r\n });\r\n\r\n const badgeAttributeToUse = context.app.config.productBadgeAttribute;\r\n // VSI Customization - ends\r\n const product = data.product;\r\n if (!product) {\r\n return null;\r\n }\r\n // VSI Customization - starts\r\n /** When enabled rating values will be picked from BazaarVoice attributes created on product.\r\n * If disabled rating will be shown from OOTB properties on a product.\r\n * This will be used for PLP and product-collection/product recommendations\r\n */\r\n const { AttributeValues, ExtensionProperties } = product;\r\n let isBVratings = false;\r\n if (AttributeValues && AttributeValues?.find(attr => attr.Name?.trim() === \"BVAverageOverallRating\")) {\r\n isBVratings = true;\r\n }\r\n const averageRating = enableAttributeBasedRating && AttributeValues && isBVratings ? getBVAttributeValues(AttributeValues, 'BVAverageOverallRating') : _parseValue(product?.AverageRating);\r\n const totalRatings = enableAttributeBasedRating && AttributeValues && isBVratings ? getBVAttributeValues(AttributeValues, 'BVTotalReviewCount') : _parseValue(product?.TotalRatings);\r\n React.useEffect(() => {\r\n function handleResize(): void {\r\n setTruncated({\r\n height: eyebrowElement?.scrollHeight,\r\n visibleHeight: eyebrowElement?.clientHeight\r\n });\r\n }\r\n handleResize();\r\n if (MsDyn365.isBrowser) {\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n } else {\r\n return () => null;\r\n }\r\n }, [eyebrowElement?.scrollHeight, eyebrowElement?.clientHeight]);\r\n // VSI Customization - ends\r\n const lowestPriceVariantRecordId = AttributeValues?.find(\r\n attr => attr.Name?.trim() === context.app.config.EcomLowestPriceVariantRecIdKey\r\n )?.TextValue;\r\n const unbxdDefaultVariant = product && product.ExtensionProperties?.find((property: CommerceProperty) => property?.Key === \"Unbxd_DefaultVariantID\")?.Value?.LongValue;\r\n const queryBasedSelection = context.app.config.queryBasedVariantSelection;\r\n const fallBackImage = context.app.config.placeholderImageName;\r\n const defaultOrLowestVariantRecordId = unbxdDefaultVariant! > 0 ? unbxdDefaultVariant : product.RecordId;\r\n let productUrl = getProductPageUrlSync(removeSpecialChars(product?.Name!, context) || '', queryBasedSelection ? product.MasterProductId || product.RecordId : product.RecordId, context && context.actionContext, undefined);\r\n\r\n if (allowBack) {\r\n productUrl = updateProductUrl(productUrl, context);\r\n }\r\n if (queryBasedSelection) {\r\n const variantIdQueryParams = productUrl.includes('?') ? `&variantid=${defaultOrLowestVariantRecordId}` : `?variantid=${defaultOrLowestVariantRecordId}`;\r\n productUrl += variantIdQueryParams;\r\n }\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', telemetryContent!, '', defaultOrLowestVariantRecordId!.toString());\r\n const attribute = getTelemetryAttributes(telemetryContent!, payLoad);\r\n // VSI Customization -starts\r\n // #17772: Check the master product, if false then add size Refinement property otherwise show Starting at\r\n let sizeValue =\r\n product && !product?.IsMasterProduct && product?.ExtensionProperties && product?.ExtensionProperties?.length > 0\r\n ? product?.ExtensionProperties.find(i => i.Key === \"Size\")?.Value?.StringValue\r\n : '';\r\n sizeValue = sizeValue && convertToTitlecase(sizeValue);\r\n\r\n // Flag used on cart page to display ratings & shop now button\r\n const isCustomizedDesign = displayShopNow;\r\n\r\n if (typeName === 'product-collection') {\r\n // VSI Customization -starts\r\n const brandName = parseBrandName(AttributeValues, brandBackofficeAttributePlp);\r\n const productTitleWithBrandname = brandName ? `${brandName} ${product.Name}` : product.Name;\r\n // VSI Customization -end\r\n // tslint:disable:max-line-length\r\n return (\r\n \r\n
\r\n \r\n {
{renderProductBadge(badgeAttributeToUse, AttributeValues, context.request)}
}\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext, fallBackImage)}\r\n
\r\n \r\n
\r\n {/* VSI Customization - START */}\r\n {/* (ADO:23447) Added only class name conditionally as discounted price based on product.component if BasePrice > Price then it will be discounted else not */}\r\n product.Price\r\n ? 'msc-product discounted'\r\n : 'msc-product'\r\n : 'msc-product'\r\n }\r\n href={productUrl}\r\n onClick={onTelemetryClick(telemetryContent!, payLoad, product.Name!)}\r\n aria-label={renderLabel(\r\n product.Name,\r\n context.cultureFormatter.formatCurrency(product.Price),\r\n product.AverageRating,\r\n ratingAriaLabel\r\n )}\r\n {...attribute}\r\n >\r\n {/* Todo: 'Starting at' string will be replaced with relevant resources */} {/* For cart page, price will be shown after name */}\r\n {!isCustomizedDesign &&\r\n <>\r\n {sizeValue ? sizeValue : product.Price !== 0 ? 'Starting at ' : ''}\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n \r\n }\r\n {!isCustomizedDesign &&\r\n \r\n {productTitleWithBrandname && productTitleWithBrandname.length > 40\r\n ? `${productTitleWithBrandname.slice(0, 40)}...`\r\n : productTitleWithBrandname}\r\n \r\n }\r\n {isCustomizedDesign &&\r\n \r\n {productTitleWithBrandname}\r\n \r\n }\r\n {isCustomizedDesign &&\r\n
\r\n {renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n )}\r\n
\r\n }\r\n {/* todo : will be added when required in next sprints */}\r\n {!context.app.config.hideRating &&\r\n renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel)}\r\n {isCustomizedDesign &&\r\n \r\n }\r\n {/* VSI Customization - END */}\r\n \r\n
\r\n {/* OOB Quick View */}\r\n {/* {quickViewButton && renderQuickView(quickViewButton, product.RecordId)} */}\r\n
\r\n
\r\n );\r\n } else {\r\n const priceComponent = renderPrice(\r\n context,\r\n typeName,\r\n id,\r\n product.BasePrice,\r\n product.Price,\r\n savingsText,\r\n freePriceText,\r\n originalPriceText,\r\n currentPriceText\r\n );\r\n const isSearchResultContainer = typeName === 'search-result-container' || typeName === 'mfrm-search-result-container';\r\n const brandName = parseBrandName(AttributeValues, brandBackofficeAttributePlp);\r\n return (\r\n // tslint:disable-next-line: react-this-binding-issue jsx-no-lambda\r\n \r\n
setProductUrl(productUrl)}>\r\n \r\n {isSearchResultContainer && (\r\n
\r\n {renderProductBadge(badgeAttributeToUse, AttributeValues, context.request)}\r\n
\r\n )}\r\n
\r\n {renderProductPlacementImage(\r\n imageSettings, context.request.gridSettings, product.PrimaryImageUrl,\r\n product.PrimaryImageUrl, product.Name, context.actionContext.requestContext, fallBackImage)}\r\n
\r\n \r\n\r\n
\r\n {/* VSI Customization - START */}\r\n
\r\n {/* VSI Customization - END */}\r\n {isSearchResultContainer && eyebrowMessage && (\r\n
\r\n
\r\n \r\n {isTruncated.height > isTruncated.visibleHeight ? (\r\n \r\n ) : (\r\n false\r\n )}\r\n
\r\n
\r\n )}\r\n {isSearchResultContainer && !eyebrowMessage && eyebrowMessage?.length !== 0 && !showBvRatings && (\r\n \r\n )}\r\n {isSearchResultContainer && eyebrowMessage?.length === 0 && !showBvRatings && (\r\n
\r\n
 
\r\n
\r\n )}\r\n {!context.app.config.hideRating && (data.product && showBvRatings) ? :\r\n (renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel) ? renderRating(context, typeName, id, averageRating, totalRatings, ratingAriaLabel) :\r\n
\r\n
 
\r\n
\r\n )}\r\n {/* VSI Customization - START */}\r\n
\r\n {/* VSI Customization - END */}\r\n \r\n \r\n {brandName ? `${brandName} ${product.Name}` : product.Name}\r\n \r\n\r\n {/* original price */}\r\n {!isSearchResultContainer && priceComponent}\r\n {renderDescription(product.Description)}\r\n \r\n {/* {deliveryMessage && <>{deliveryMessage}} */}\r\n \r\n
\r\n {/* new price */}\r\n {isSearchResultContainer\r\n ? product.Price\r\n ? priceComponent && (\r\n \r\n )\r\n : priceComponent\r\n : null}\r\n {/* OOB Quick View */}\r\n {/* {quickViewButton && renderQuickView(quickViewButton, product.RecordId)} */}\r\n
\r\n
\r\n );\r\n }\r\n // VSI Customization - Ends here\r\n};\r\n// VSI Customization - Starts here\r\nfunction _parseValue(productRating?: string | number): number {\r\n const value = +(productRating || 0);\r\n return Math.round(value * 10) / 10;\r\n}\r\n// VSI Customization - Ends here\r\nfunction renderLabel(name?: string, price?: string, rating?: number, ratingAriaLabel?: string): string {\r\n name = name || '';\r\n price = price || '';\r\n return `${name} ${price} ${getRatingAriaLabel(rating, ratingAriaLabel)}`;\r\n}\r\n\r\nfunction setProductUrl(productUrl: string): void {\r\n if (MsDyn365.isBrowser) {\r\n window.location.href = productUrl;\r\n }\r\n}\r\n\r\nfunction renderDescription(description?: string): JSX.Element | null {\r\n return

{description}

;\r\n}\r\n\r\n// Render Quick View\r\n// function renderQuickView(quickview: React.ReactNode, item?: number): JSX.Element | undefined {\r\n// if (quickview === null) {\r\n// return undefined;\r\n// }\r\n// return React.cloneElement(quickview as React.ReactElement, { selectedProductId: item });\r\n// }\r\n\r\nfunction getRatingAriaLabel(rating?: number, ratingAriaLabel?: string): string {\r\n if (rating && ratingAriaLabel) {\r\n const roundedRating = rating.toFixed(2);\r\n return format(ratingAriaLabel || '', roundedRating, '5');\r\n }\r\n return '';\r\n}\r\n\r\nfunction updateProductUrl(productUrl: string, context: ICoreContext): string {\r\n const srcUrl = new URL(productUrl, context.request.apiSettings.baseUrl);\r\n const queryString = 'back=true';\r\n if (srcUrl.search) {\r\n srcUrl.search += `&${queryString}`;\r\n } else {\r\n srcUrl.search += queryString;\r\n }\r\n\r\n const updatedUrl = new URL(srcUrl.href);\r\n return updatedUrl.pathname + srcUrl.search;\r\n}\r\n\r\nfunction renderRating(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n avgRating?: number,\r\n totalRatings?: number,\r\n ariaLabel?: string\r\n): JSX.Element | null {\r\n if (avgRating && avgRating !== 0) {\r\n const numRatings = (totalRatings && totalRatings.toString()) || '0';\r\n const ratingAriaLabel = getRatingAriaLabel(avgRating, ariaLabel);\r\n\r\n return (\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nfunction renderPrice(\r\n context: ICoreContext,\r\n typeName: string,\r\n id: string,\r\n basePrice?: number,\r\n adjustedPrice?: number,\r\n savingsText?: string,\r\n freePriceText?: string,\r\n originalPriceText?: string,\r\n currentPriceText?: string\r\n): JSX.Element | null {\r\n const price: ProductPrice = {\r\n BasePrice: basePrice,\r\n AdjustedPrice: adjustedPrice,\r\n CustomerContextualPrice: adjustedPrice\r\n };\r\n return basePrice ? (\r\n \r\n ) : null;\r\n}\r\n\r\n/**\r\n * Gets the react component for product rating.\r\n * @param productCardimageSettings - Module image settings for product card.\r\n * @param gridSettings - Grid settings defined in theme.\r\n * @param imageUrl - Image url.\r\n * @param fallbackImageUrl - Fallback url for imge.\r\n * @param altText - Image Alt text.\r\n * @param requestContext - Request context using the component.\r\n * @param fallBackImage - Placeholder Image from App settings\r\n * @returns React component for product image.\r\n */\r\nfunction renderProductPlacementImage(\r\n productCardimageSettings?: IImageSettings, gridSettings?: IGridSettings,\r\n imageUrl?: string, fallbackImageUrl?: string, altText?: string, requestContext?: IRequestContext, fallBackImage?: string): JSX.Element | null {\r\n\r\n if (!imageUrl || !gridSettings || !productCardimageSettings) {\r\n return null;\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Site level config can be of any type.\r\n const emptyPlaceHolderImage = fallBackImage || '';\r\n let fallbackImageSource = fallbackImageUrl;\r\n if (emptyPlaceHolderImage && fallbackImageUrl) {\r\n fallbackImageSource = `${fallbackImageUrl},${emptyPlaceHolderImage}`;\r\n }\r\n const image: IImageData = {\r\n src: imageUrl,\r\n altText: altText ? altText : '',\r\n fallBackSrc: fallbackImageSource\r\n };\r\n const imageProps: IImageProps = { gridSettings };\r\n\r\n imageProps.gridSettings = gridSettings;\r\n imageProps.imageSettings = productCardimageSettings;\r\n imageProps.imageSettings.cropFocalRegion = true;\r\n return (\r\n \r\n );\r\n}\r\n// VSI Customization - starts\r\n\r\nfunction renderProductBadge(\r\n attributeName: string | undefined,\r\n attributes: AttributeValue[] | undefined,\r\n requestContext: IRequestContext\r\n): JSX.Element | undefined {\r\n const badgeData =\r\n attributeName &&\r\n attributes?.find(\r\n currAttribute => currAttribute.Name && currAttribute.Name.toLowerCase().trim() === attributeName.toLowerCase().trim()\r\n )?.TextValue;\r\n if (!badgeData) {\r\n return;\r\n }\r\n\r\n // split badge data into its separate badges\r\n const badges = badgeData.split(',');\r\n\r\n // parse badge data to get its schedule and image src\r\n const parsedBadges = badges.map(badge => parseBadgeData(badge, requestContext));\r\n // build product badge image components\r\n const finalizedBadges = parsedBadges.map(parsedBadge => parsedBadge && buildProductBadge(parsedBadge, requestContext));\r\n\r\n return finalizedBadges && <>{finalizedBadges};\r\n}\r\n\r\n// VSI Customization - ends\r\n\r\n// @ts-ignore\r\nexport const ProductComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride<\r\n IProductComponent\r\n>('Product', { component: ProductCard, ...PriceComponentActions });\r\n\r\nexport default ProductComponent;","export const convertToTitlecase = (stringValue?: string, stopConvert?: boolean) => {\r\n // this stopConvert flag will use to stop conversion in specific scenario\r\n return stopConvert\r\n ? stringValue\r\n : stringValue?.replace(/\\w\\S*/g, txt => {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n};\r\n"],"names":["emailRegex","emailValue","test","removeSpecialChars","str","ctx","_ctx$request$app","request","app","config","removeSpecialCharsPDP","replace","removeSpecialCharsFromURLPath","_ctx$request$app2","_decodeURIComponent","decodeURIComponent","split","customerInfoPhoneRegex","inputRegexObj","nameRegex","addressInputRegex","phoneNumerRegex","cartDeliveryMsgRegex","_getProductType","shippingInformation","toLowerCase","computeItemLines","product","defaultVariantId","lowestPriceVariantRecordId","IsMasterProduct","toString","RecordId","_ref","_attributeValues$find","_extensionProperties$","context","attributeValues","extensionProperties","productDeliveryMessage","shippingInformationSmall","find","attr","_attr$Name","Name","trim","smallParcelAttributeKey","TextValue","defaultVariantShippingInformation","property","Key","Value","StringValue","_product$deliveryByMe","deliveryByMessage","_attributeValues$find2","deliveryDays","_attr$Name2","leadTime","brandList","length","_attributeValues$find3","brand","_attr$Name3","brandBackofficeAttributePlp","map","singleBrand","brandName","undefined","brandLeadtime","_makeDeliveryMessage","React","className","CustomSkeleton","type","_parseValue","productRating","value","Math","round","renderLabel","name","price","rating","ratingAriaLabel","getRatingAriaLabel","roundedRating","toFixed","format","renderRating","typeName","id","avgRating","totalRatings","ariaLabel","numRatings","RatingComponent","ratingCount","readOnly","data","renderPrice","basePrice","adjustedPrice","savingsText","freePriceText","originalPriceText","currentPriceText","BasePrice","AdjustedPrice","CustomerContextualPrice","PriceComponent","renderProductPlacementImage","productCardimageSettings","gridSettings","imageUrl","fallbackImageUrl","altText","requestContext","fallBackImage","emptyPlaceHolderImage","fallbackImageSource","image","src","fallBackSrc","imageProps","imageSettings","cropFocalRegion","Image","Object","assign","loadFailureBehavior","bypassHideOnFailure","renderProductBadge","attributeName","attributes","_attributes$find","badgeData","currAttribute","finalizedBadges","badge","parseBadgeData","parsedBadge","buildProductBadge","ProductComponent","msdyn365Commerce","createComponentOverride","_objectSpread","component","_getEyebrowElementRef","_AttributeValues$find","_product$ExtensionPro","_product$ExtensionPro2","_product$ExtensionPro3","allowBack","telemetryContent","quickViewButton","eyebrowMessage","badgeAttribute","deliveryMessage","isRefinersEnabled","displayShopNow","shopNowBtnText","showBvRatings","enableAttributeBasedRating","getEyebrowElementRef","eyebrowElement","current","querySelector","isTruncated","setTruncated","height","scrollHeight","visibleHeight","clientHeight","badgeAttributeToUse","productBadgeAttribute","AttributeValues","ExtensionProperties","isBVratings","averageRating","getBVAttributeValues","AverageRating","TotalRatings","handleResize","MsDyn365","isBrowser","window","addEventListener","removeEventListener","EcomLowestPriceVariantRecIdKey","unbxdDefaultVariant","LongValue","queryBasedSelection","queryBasedVariantSelection","placeholderImageName","defaultOrLowestVariantRecordId","productUrl","getProductPageUrlSync","MasterProductId","actionContext","srcUrl","URL","apiSettings","baseUrl","queryString","search","href","pathname","updateProductUrl","variantIdQueryParams","includes","payLoad","getPayloadObject","attribute","getTelemetryAttributes","sizeValue","i","convertToTitlecase","stringValue","stopConvert","txt","charAt","toUpperCase","substr","isCustomizedDesign","parseBrandName","productTitleWithBrandname","ErrorBoundary","telemetry","onClick","onTelemetryClick","cultureFormatter","formatCurrency","Price","PrimaryImageUrl","title","slice","hideRating","Button","color","priceComponent","isSearchResultContainer","role","location","setProductUrl","ref","RichTextComponent","text","BVRatingSummary","itemId","ItemId","variantId","description","Description","DeliveryMessage","FinancingPerMonthComponent","pageType","sellingPrice","activeVariantId","productId","activeColorVariantId"],"sourceRoot":""}